Skip to main content

Monitoring Codes

{/ AUTOGENERATED โ€” do not edit by hand. Source: erp-integration-api packages/erp-utils/src/monitoring/snapshots/monitoring-codes.json Regenerate: npm run update-monitoring-codes /}

Monitoring Codes

Every monitoring event carries a code and a level. The code says what happened; the level says how much you should care. Both are filterable in the Integration Hub's Monitoring tab and through the events API.

There are 99 codes. You are most likely here because you saw one in a failed event โ€” find it below.

tip

A code's level is fixed. That is what makes alert rules scoped to _error_ or _warning_ predictable โ€” see Alerting.

The interactive lane codes (INTERACTIVE_* and CORRELATION_*) are explained in context, with when each is raised, in Interactive Registration.

Errorโ€‹

Something failed and the event did not do what it was meant to do. These are what the default alert rules watch.

CodeWhat it means
ATTACHMENT_NOT_FOUNDThe file no longer exists โ€” it was removed between the event and the delivery
ATTRIBUTE_TYPE_MISMATCHAn attribute value did not match the type declared in the entity schema
CONDITIONAL_VARIANT_WRITE_FAILEDConditional pricing refused one variant write. The item is dropped and not retried; the rest of the batch and the run continue. details.code names the reason where pricing gave one โ€” UNKNOWN_ERROR means it did not
CORRELATION_ID_MISSINGA request asked for something that only makes sense for a correlation, but did not say which correlation
CORRELATION_REQUIREMENT_FAILEDSomething a caller was waiting for can no longer arrive: every event that would have satisfied the requirement ended in an error. Reported once per correlation
DEPRECATED_ENDPOINTThis endpoint version is deprecated
DIRECT_ENTITY_NOT_ALLOWEDThe entity is not permitted by the use case entity allowlist
DIRECT_PAYLOAD_INVALIDThe direct mode payload failed validation against the versioned payload schema
DIRECT_VERSION_UNSUPPORTEDThe direct mode payload version is not supported by the platform
ENTITY_REFERENCE_NOT_FOUNDA direct-by-id entity reference points at an entity that does not exist or has a different schema
EVENT_NOT_CONFIGUREDNo mapping configuration found for this event type
EXTERNAL_API_ERRORAn external API returned an error
EXTERNAL_ERRORAn error span pushed by an external system (e.g. your integration middleware) via the external monitoring events endpoint. epilot assigns the code from the span's level; the middleware never sends one.
FAN_OUT_INVALID_RESULTThe split expression returned something other than a list, so no deliveries could be created โ€” see split_expression_result_type
FILE_EXTRACTION_FAILEDFailed to extract file from the request
FILE_FETCH_FAILEDThe file could not be fetched from epilot before it could be uploaded
FILE_PROXY_UPLOAD_FAILEDA file upload failed terminally, or every delivery attempt was exhausted
FILE_TOO_LARGEThe file exceeds the maximum size configured on the upload use case
INTEGRATION_NOT_FOUNDThe inbound event referenced an integration_id that does not exist in the calling token's organization. Check the integration id and that the token belongs to the same org.
INVALID_METER_READING_ATTRIBUTESMeter reading has invalid attributes
MALFORMED_PAYLOADThe event payload could not be parsed (malformed JSON)
MAPPING_EXPRESSION_FAILEDA mapping expression failed to evaluate
METERING_API_ERRORThe metering API returned an error
METER_READING_GROUP_FAILEDA batch write of meter readings failed permanently after all retries โ€” summary event alongside the per-reading errors
METER_READING_GROUP_RETRYINGA batch write of meter readings failed and will be retried automatically โ€” one event per attempt covering the whole group (reading_count and external_ids in details)
MISSING_REQUIRED_PARAMA required parameter is missing from the request
MISSING_UNIQUE_IDENTIFIERSThe event is missing the unique identifier field(s) required to match an entity
MSG_DEAD_LETTEREDOutbound message moved to the dead-letter queue after exhausting delivery attempts, or via an operator skip
MSG_EXPIRED_UNPOLLEDOutbound message expired before being consumed โ€” retention elapsed without a successful poll
MSG_HEAD_BLOCKEDOutbound stream halted by a poison head message (block policy) โ€” requires operator unblock or consumer acknowledgement
OAUTH2_TOKEN_FAILUREFailed to obtain an OAuth2 access token
PAYLOAD_TOO_LARGEThe payload exceeded the maximum size accepted by the receiving system
PROCESSING_STATE_LIMITThe processing record of an interactive event could not be written, because it or its correlation reached the size the store allows, so the event was ended as an error instead of being left processing: its correlation still completes, and anyone waiting on it is answered. The event's data may have been written all the same. Usually a payload with unusually many entities or very long unique ids
PRUNE_SCOPE_PARTIAL_FAILUREScope pruning completed with some failures
RECURSION_DEPTH_EXCEEDEDMaximum recursion depth was exceeded during processing
RELATION_REF_ITEM_NOT_FOUNDThe relation_ref value could not be matched on the target entity (invalid mapped value, or still no match after writing it to the target) โ€” skipped as non-retryable. Check the mapping configuration and the entity data.
RELATION_REF_VALUE_UNDEFINEDA relation_ref mapping value resolved to undefined โ€” check the mapping expression
REQUIRED_PARAM_MISSINGA param the use case marks as required resolved to nothing, so the delivery was stopped before anything was sent โ€” see param_name
SECURE_PROXY_DISABLEDThe secure proxy use case is disabled
SECURE_PROXY_DOMAIN_BLOCKEDThe target domain is blocked
SECURE_PROXY_DOMAIN_NOT_ALLOWEDThe target domain is not in the allowlist
SECURE_PROXY_ERRORAn error occurred in the secure proxy
SECURE_PROXY_INVALID_CONFIGThe secure proxy configuration is invalid
SECURE_PROXY_INVALID_TYPEThe secure proxy type is invalid
SECURE_PROXY_INVALID_URLThe target URL is invalid
SECURE_PROXY_IP_BLOCKEDThe target IP address is blocked
SECURE_PROXY_IP_NOT_ALLOWEDThe target IP address is not in the allowlist
SECURE_PROXY_NOT_FOUNDThe secure proxy use case was not found
SECURE_PROXY_UNAVAILABLESecure proxy service is unavailable
SIGNATURE_VERIFICATION_FAILEDRequest signature could not be verified
SIGNATURE_VERIFICATION_UNAVAILABLEThe file service could not be reached to verify the request signature
STEP_DISABLEDA request step's "run this step when" expression returned false, so this step and every step after it were skipped. This is the configuration working as written, not a fault.
TIMEOUTThe operation timed out
UNIQUE_ID_LOOKUP_UNRESOLVABLEA related entity created for this event still could not be found by its unique ID, so the relation was skipped instead of creating a duplicate. Check that the unique ID value type matches the entity schema.
UNIQUE_ID_MULTIPLE_MATCHESMultiple entities matched the unique ID
UNIQUE_ID_NOT_IN_SCHEMAThe unique ID attribute is not defined in the entity schema
UNKNOWN_ERRORAn unexpected error occurred during processing
USE_CASE_DISABLEDThe use case is currently disabled
USE_CASE_INVALID_TYPEThe use case type is invalid or unsupported
USE_CASE_MISSING_CONFIGThe use case is missing required configuration
USE_CASE_NOT_FOUNDThe use case could not be found

Warningโ€‹

Processing continued, but something needs a human eye โ€” often a retry in flight or a value nobody has mapped yet.

CodeWhat it means
ACK_TIMEOUTAcknowledgement timed out waiting for the ERP system
CONDITIONAL_VARIANT_WRITE_WARNINGOne variant write succeeded with a warning. The variant is stored and the rest of the batch and the run continue. details.code names the warning
CORRELATION_CLOSED_INCOMPLETEThe partner declared a correlation complete and everything it sent was processed, but what the caller was waiting for was not in it โ€” see missing_entities and missing_use_cases. Reported once per correlation
CORRELATION_CLOSE_IGNOREDThe partner declared a correlation complete, but the close was not applied: the same request has to be retried, the queue refused one of its events, the correlation does not exist and the request recorded nothing under it (its events carried their own correlation ids, were duplicates, matched no use case, or were not processed as interactive), a close without events found the organization over its interactive rate and could not create the correlation, or the correlation belongs to another integration (the one whose event or close created it). The reason names the cause. Retry with correlation_complete, send the close under the correlation the events were recorded under, or use a correlation id of your own
CORRELATION_EVENT_LIMIT_EXCEEDEDThis correlation already holds as many events as one correlation may, so further events sent under it were processed normally and cannot be waited on. A correlation is meant to cover one registration or one change; this usually means the partner sends the same correlation id with every push. Each request that should be waited on needs its own id
CORRELATION_LATE_EVENTAn event arrived under a correlation the partner had already declared complete. It was processed, but anyone waiting on that correlation had already been answered, and once the correlation is complete the event cannot change that answer โ€” the partner is sending correlation_complete too early
CORRELATION_WAIT_REJECTEDA caller tried to wait on a correlation while too many waits were already open, so it was asked to retry. Its data is unaffected โ€” only the answer it was waiting for is slower
CORRELATION_WAIT_TIMEOUTA caller waited on a correlation until its time ran out without getting what it asked for โ€” see missing_entities and missing_use_cases for what had not arrived. Reported once per correlation. When nothing at all was sent under the correlation, it carries no integration: none is known before the first event
EXTERNAL_WARNINGA warning span pushed by an external system via the external monitoring events endpoint.
FILE_PROXY_UPLOAD_RETRYINGA file upload failed with a retryable error and will be retried automatically โ€” one event per attempt
INTERACTIVE_CROSS_LANE_WRITEThe same entity was updated from two different processing lanes within seconds of each other, one of them the interactive lane. Both updates were applied; this reports that they overlapped, so the order they landed in was decided by timing
INTERACTIVE_RATE_LIMITEDThe organization asked for interactive processing more often than its agreed rate, so these events were processed on its normal lane instead. Nothing was lost and the correlation can still be waited on โ€” it will simply take as long as a bulk event does
LOOKUP_UNMAPPEDA value was not listed in a lookup table and its fallback was used โ€” see lookup_name and lookup_key for the gap
MSG_LATE_ARRIVALAn event arrived after the poll consumer had already received later events, so it was placed at the end of the stream instead of at its event time โ€” it is delivered, but out of event-time order
SOFT_DELETED_ENTITY_MATCHEDA soft-deleted entity matched the unique ID โ€” it will be resurrected on upsert, or referenced as-is by a relation. Investigate why the ERP source is sending events for a deleted entity.

Successโ€‹

The event did what it was meant to do. Useful for confirming a sync actually landed.

CodeWhat it means
ACK_CONFIRMEDAcknowledgement was confirmed by the ERP system
CONDITIONAL_VARIANTS_WRITTENConditional price variants were written for one imported entity: emitted once per chunk, with a per-outcome count and the variant ids in details
ENTITY_CREATEDA new entity was created in epilot
ENTITY_DELETEDAn entity was deleted from epilot
ENTITY_NO_OPNo changes were needed for the entity
ENTITY_UPDATEDAn existing entity was updated in epilot
EXTERNAL_SUCCESSA success span pushed by an external system via the external monitoring events endpoint.
FILE_PROXY_OKFile proxy request completed successfully
FILE_PROXY_UPLOADEDThe external system accepted the file
METER_READING_DELETEDOne or more meter readings were deleted โ€” emitted once per batch, not per reading (reading_count and external_ids in details)
METER_READING_UPSERTEDOne or more meter readings were created or updated โ€” emitted once per batch, not per reading (reading_count and external_ids in details)
MSG_ACKEDOutbound message delivered: the polling consumer acknowledged it and it was removed from the queue
PRUNE_SCOPE_COMPLETEDScope pruning completed successfully
WEBHOOK_DELIVEREDWebhook was delivered successfully

Infoโ€‹

Lifecycle markers rather than outcomes: a message was queued, a duplicate was ignored, a step was skipped by configuration. Counted in total events, but excluded from the success rate.

CodeWhat it means
ACK_PENDINGAcknowledgement is pending from the ERP system
CORRELATION_CLOSED_EMPTYThe partner declared a correlation complete without sending any event for it. That is the partner reporting "I found nothing", and anyone waiting is told so at once instead of waiting it out
CORRELATION_COMPLETEDEvery event the partner sent under this correlation has finished processing and the partner declared the correlation complete
DUPLICATE_EVENTThis event was already processed (duplicate)
EXTERNAL_INFOAn informational span pushed by an external system via the external monitoring events endpoint.
FAN_OUT_EMPTYThe split expression returned an empty list, so nothing was sent โ€” expected for events that carry no relevant items
FILE_PROXY_UPLOAD_ENQUEUEDA per-file upload was accepted for delivery during fan-out
INTERACTIVE_NOT_ALLOWEDInteractive processing was requested for a use case that is not configured for it, so the events were processed normally. Set interactive to on_request or always on the use case if the caller is meant to be able to wait for these events
MSG_ENQUEUEDOutbound message enqueued to the poll queue, awaiting consumption by the ERP. When the use case maps the payload, the detail carries the mapped payload as delivered and its mapping_version (or payload_omitted when it exceeds 48 KiB)

Status-code familiesโ€‹

Some codes are generated from an upstream response rather than drawn from the fixed list above.

PatternLevelWhat it means
HTTP_{status}warningThe upstream system answered the proxied request with this HTTP status. The proxy itself worked โ€” it reached the target and returned its answer โ€” so the refusal is recorded against the use case that owns the request.