API Errors and Latency
Alloy surfaces error and service status data in its API responses in several ways depending on the type of failure. When building your integration, it is strongly recommended to ingest this data programmatically into your internal observability and monitoring systems to maximize visibility.
HTTP Status Errors
Alloy's HTTP status codes are the first layer of error validation and indicate the outcome of each API request. These should be handled in all API call paths and logged to your observability system.
| Status Class | Meaning | Action |
|---|---|---|
| 2xx | Success — the request was received and processed as expected. | No action needed. |
| 4xx | Client errors — the request was malformed, unauthorized, or referenced a resource that doesn't exist. | Not retryable without addressing the underlying cause. See Data Validation for troubleshooting common data format issues. |
| 5xx | Server errors — Alloy encountered an internal error. | Typically transient and safe to retry with exponential backoff. See Request Handling and Retries for more guidance on retries. |
206 Partial Content
206 status codes are used on underlying Evaluations to signify when Alloy was unable to reach a decision due to vendor failures or missing data. When an Evaluation is in a 206 status, the warnings section in the Evaluation API response and dashboard gives additional information about what data was missing:
"warnings": {
"blocked_actions": [
{
"blocked": {
"action_name": "tmx_pass",
"action_type": "tag"
},
"blocking": {
"action_name": "Threatmetrix",
"attribute_name": "Review Status"
}
}
]
}Note: For more information, see Policy Design for Service Failures for guidance on managing partial data at the policy level.
Data Service Errors
Beyond top-level HTTP status codes, Alloy provides service-level execution data for each third-party vendor service that runs within a single Evaluation. This is the most granular and actionable source of third-party integration health information available via Alloy's API.
There are two ways to access this data for a Journey Application:
- Using the
hrefobject populated oncompleted_evaluationevents and webhooks to make a Get Evaluations request for all relevant Evaluations in the Journey Application. - Using the Get Journey Application endpoint with the
?fullData=truequery parameter, which expands the Evaluation response object in a nestedevaluation_resultobject oncompleted_evaluationevents within the Journey Application_embedded.events[]section.
The Evaluation response includes a services object that shows the execution status of every vendor service in the workflow:
{
...
"services": {
"Ekata": "failed",
"List": "executed",
"Threatmetrix": "executed",
"Equifax Canada": "cached",
"ComplyAdvantage": "not_executed"
}
}Each key corresponds to a service name in the Evaluation Workflow and will have one of the following values:
| Value | Definition |
|---|---|
executed | The service ran and returned a response successfully. |
cached | The service returned a previously cached response (within the 30-day cache window). |
failed | The service was attempted but returned an error or no data. Logging this status is especially critical for identifying vendor-level issues. |
not_executed | The service was not reached, due to conditional policy logic or an earlier failure. |
Monitoring Failed Services: Alloy strongly encourages ingesting data from the
servicesobject programmatically to build vendor service monitoring that meets your specific business needs. Alloy also maintains internal service monitoring for early detection and proactive updates to its status page.
Caching Service Responses
If you initiate multiple Journey Application or Evaluation requests with the same Entity data within 30 days, Alloy will automatically use a cached response from most third-party vendor services to prevent duplicate requests and additional charges. Note the following exceptions:
- Alloy will not store a cache for errors or failure messages returned by third-party vendors. Credit bureau frozen file responses are also not cached.
- You can override caching behavior at the Workflow level using the Override Cache config option on Service nodes.
Journey Application State Errors
Journey Applications can also surface errors through their application-level status. The two most important states to instrument are:
Error Status
In the rare event of an unexpected downstream error, a Journey Application will have a status of error and Alloy will send an associated error webhook event. This is a terminal state that typically requires manual resolution. After the root cause is addressed, the application can be resubmitted via the Rerun Journey Application endpoint or through the Alloy dashboard.
Data Request Status
If a request is submitted with missing or incorrectly formatted required fields, the Journey Application will enter a data_request_evaluation status. Resolving this requires submitting corrected data via the Update Journey Application endpoint. This status is generally avoidable by enforcing data validation before sending to Alloy. See Data Validation for more details.
Latency
Alloy's Journey Application API endpoints and webhooks return information about the full status lifecycle of a Journey Application in the _embedded.events[] array. Each event includes a timestamp field indicating when the event occurred in Unix time:
{
"request_token": ":request_token",
"timestamp": 1654814723339,
"type": "update:journeyapplications:sandbox",
"description": "Notify on sandbox journey application status change",
"data": {
"journey_application_token": ":journey_application_token",
"type": "started_evaluation",
"external_partner_id": ":external_partner_id",
"external_group_id": ":external_group_id",
"external_application_id": ":external_application_id",
"timestamp": 1654814725250,
"evaluation_token": ":evaluation_token",
"entity_token": ":entity_token",
"entity_application_token": ":entity_application_token",
"_embedded": {
"node": {
"id": ":node_id",
"name": null,
"position": null,
"type": "workflow",
"config": {
"application_token": ":application_token",
"workflow_token": ":workflow_token",
"application_version_id": 1,
"workflow_version_id": 1,
"workflow_type": null
}
}
},
"_links": {
"evaluation": {
"href": "/v1/evaluations/:evaluation_token"
},
"journey_application": {
"href": "/v1/journeys/:journey_token/applications/:journey_application_token"
}
},
"journey_token": ":journey_token",
"journey_name": ":journey_name",
"external_entity_id": ":external_entity_id"
}
}Note: The above is an example webhook. Events under
_embedded.events[]are structured differently from webhooks and only include what's nested within thedataobject shown above.
You can use these timestamp values to understand how much time was spent at each step of the Journey. For example, the difference between the timestamp on a started_evaluation event and its corresponding completed_evaluation event gives you the total time the Journey Application spent in that Evaluation.
Keep in mind that some Journey events — like pending_step_up, pending_review, pending_action, and pending_workflow_service — are dependent on an end-user or agent taking action before the Journey can progress. Time between events of these types reflects time Alloy spends waiting rather than processing.
Coming Soon: Alloy will soon offer a dedicated latency API for easily retrieving data-vendor processing times and overall Evaluation processing time for a given Journey Application. For more information, reach out to [email protected] or your dedicated Alloy contact.
Updated about 20 hours ago