https://api.veriko.mx/v1/validations/{id}Get a single validation
How-to guide →Returns the full detail of a validation, and is also the point where an asynchronous validation's verdict is collected. While the validation has not reached a terminal state — queued or processing — the response carries the Retry-After header and meta.next_poll_after_seconds, which mark when asking again is worth it. Sending back the received ETag in If-None-Match returns 304 when the state has not changed, so polling does not download the same thing twice; the full mechanism is covered in conditional caching.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id* | path | string (uuid) | required | Validation UUID. |
If-None-Match | header | string | optional | ETag received in previous requests. If the data has not changed and W/"3-processing" |
curl -X GET 'https://api.veriko.mx/v1/validations/{id}' \
-H 'Authorization: Bearer veriko_••••'Python example — coming soon.
JavaScript example — coming soon.
PHP example — coming soon.
| Field | Type | Description |
|---|---|---|
type* | string | JSON:API resource type. Always validation |
id* | string (uuid) | Unique identifier of the validation (UUID v4). e.g.3fa85f64-5717-4562-b3fc-2c963f66afa6 |
attributes* | object | Canonical validation data. |
validation_type | string |
direct |
is_playground | boolean | Whether the validation ran in playground mode. Playground executions still query Banxico but do not consume quota, emit webhooks, or fire notifications. e.g.false |
status | string | Lifecycle state: valid |
banxico_status | string | nullnullable | Banxico-reported status after query. valid |
processing_time_ms | integer | nullnullable | Milliseconds from enqueue to terminal resolution. e.g.1320 |
request_data | object | Literal snapshot of the original request fields. |
created_at | string (date-time) | UTC timestamp of enqueue. e.g.2025-03-15T14:22:10Z |
completed_at | string | nullnullable | UTC timestamp of terminal resolution. 2025-03-15T14:22:11Z |
enqueued_at | string | nullnullable | Timestamp of bus enqueue. e.g.2026-04-30T10:15:00Z |
processing_started_at | string | nullnullable | Timestamp of the first worker XCLAIM. e.g.2026-04-30T10:15:00Z |
expires_at | string | nullnullable | Expiration timestamp for queued validations. After this, the job moves to 2026-04-30T10:15:00Z |
etag_version | integer | nullnullable | Incremental version used for 1 |
image_path | string | nullnullable | Relative path of the receipt image. OCR only. e.g.ocr/2026/04/a1b2c3d4.jpg |
ocr_result | object | nullnullable | Raw OCR result. OCR only. |
ocr_confidence | number | nullnullable | OCR confidence 0–1. OCR only; 0.94 |
normalized_data | object | nullnullable | Normalized post-OCR fields used to query Banxico. |
normalization_warnings | array | nullnullable | Warnings emitted by the normalization pipeline. |
is_masked | boolean | nullnullable | Whether the receipt has a masked PAN. |
banxico_result | object | nullnullable | Literal payload returned by Banxico CEP. |
error_message | string | nullnullable | Human-readable error message when terminal. e.g.Banxico no respondió tras tres intentos. |
error_code | ValidationErrorCode | null | Machine-readable error code when terminal. |
batch_id | integer | nullnullable | Bulk import batch identifier if applicable. e.g.318 |
batch_position | integer | nullnullable | Position within the batch (1-indexed). e.g.12 |
retry_state | object | Full retry cycle state. Always present; if retries are not active, |
enabled | boolean | Whether the retry cycle is active for this validation. e.g.true |
max_retries | integer | nullnullable | Configured maximum number of retries. The upper bound depends on the plan ( 3 |
interval_seconds | integer | nullnullable | Interval between retries in seconds (300–86400). 600 |
outcomes | array | nullnullable | Validation outcomes that trigger a retry ( ["not_found","cep_unavailable","error"] |
attempts_completed | integer | Number of retries completed so far. e.g.1 |
next_attempt_at | TimestampUTC | null | Timestamp of the next scheduled retry. |
resolved_at | TimestampUTC | null | Timestamp when a retry resolved the validation to |
exhausted_at | TimestampUTC | null | Timestamp when retries were exhausted without resolution. |
cancelled_at | TimestampUTC | null | Timestamp when the cycle was explicitly cancelled. |
terminal_state | string | nullnullable | Terminal state of the cycle: pending |
links | object | Related links (JSON:API |
self | string | URL of the validation. e.g./v1/validations/3fa85f64-5717-4562-b3fc-2c963f66afa6 |
cep_xml | string | nullnullable | URL of the CEP in XML format. /v1/validations/a1b2c3d4-e5f6-7890-abcd-ef0123456789/cep.xml |
cep_pdf | string | nullnullable | URL of the CEP in PDF format. /v1/validations/a1b2c3d4-e5f6-7890-abcd-ef0123456789/cep.pdf |
| Status | Class | Description | Body |
|---|---|---|---|
| 200 | 2xx | Full validation details. In pre-terminal states (queued, processing) includes Retry-After and meta.next_poll_after_seconds. | No body |
| 304 | 3xx | The etag_version and status have not changed since the If-None-Match sent. No body. The client must wait Retry-After seconds before the next poll.
| No body |
| 401 | 4xx | Authentication is required or the provided credentials are invalid. | ErrorResponse |
| 403 | 4xx | Insufficient permissions. | ErrorResponse |
| 404 | 4xx | Validation not found or does not belong to the authenticated user (not_found). | ErrorResponse |
| 422 | 4xx | Invalid UUID in path (invalid_uuid). | ErrorResponse |
| Header | Type | Description |
|---|---|---|
ETag | string | Weak ETag that increments on each state transition. Format: W/"{etag_version}-{status}". Send it in If-None-Match to receive 304 if nothing changed. |
Retry-After | integer | Seconds to wait before the next poll. Only present in queued and processing states. |
| Status | Code | Example |
|---|---|---|
| 401 | unauthorized | Invalid or missing authentication credentials. Envelope
|
| 403 | forbidden | You do not have permission to access this resource. Envelope
|