https://api.veriko.mx/v1/validations/{id}/recheckQuery the payment status of a validation again
How-to guide →Queries Banxico again for the payment status of a valid validation and, if it reports the payment as returned, moves it to returned.
A valid verdict is a snapshot of the moment of the query: the CEP proves that the transfer settled, not that the money stayed in the beneficiary's account, and the receiving institution can return it hours or days later. This operation makes only that query, with the data the validation already stored:
- It uses no AI and does not download another CEP.
- It consumes no quota and does not count as a new validation.
- It stores Banxico's answer in
banxico_result._payment_status. - With the status
devueltooren_proceso_devolucion, it changesstatusandbanxico_statustoreturned, keeps the CEP, and emits thevalidation.returnedwebhook.
What it accepts:
validcreated at most 72 hours ago: it is queried. Past that period it responds with an HTTP status422(withrecheck_window_expiredin the body).returned: it responds with its current state without querying Banxico, withmeta.recheck.checked_atset tonull.- Any other status: it responds with an HTTP status
422(withrecheck_not_eligiblein the body).
Each validation accepts one query every 10 minutes. If it is repeated sooner, it responds with an HTTP status 429 (with recheck_rate_limited in the body) and the Retry-After header gives the seconds left. That cap adds to the API key ones.
The response is the same validation that GET /v1/validations/{id} returns, with the result of the check in meta.recheck:
checked_at: Date and time of the query to Banxico, in ISO 8601 UTC.nullwhen nothing was queried because the validation was alreadyreturned.changed:truewhen this query moved the validation fromvalidtoreturned.previous_status: Banxico verdict before the query,validorreturned.
The meaning of valid and returned is in the CEP and its verdicts, and event delivery in the webhooks architecture.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
id* | path | string (uuid) | required | Validation UUID. |
curl -X POST 'https://api.veriko.mx/v1/validations/{id}/recheck' \
-H 'Authorization: Bearer veriko_••••' \
-H 'Content-Type: application/json'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 | Validation mode — direct |
is_playground | boolean |
false |
status | string | Lifecycle state — valid |
banxico_status | string | nullnullable | Verdict reported by Banxico. It can be valid |
processing_time_ms | integer | nullnullable | Milliseconds spent processing the validation. e.g.1320 |
request_data | object | Copy of the original request fields. |
client_ref | string | Reference of your own sent in the request ( orden-4812 |
created_at | string (date-time) | Validation creation timestamp in ISO 8601 UTC. e.g.2025-03-15T14:22:10Z |
completed_at | string | nullnullable | Date and time of completion, in ISO 8601 UTC. 2025-03-15T14:22:11Z |
enqueued_at | string | nullnullable | Queue-entry timestamp in ISO 8601 UTC. e.g.2026-04-30T10:15:00Z |
processing_started_at | string | nullnullable | Processing start timestamp in ISO 8601 UTC. e.g.2026-04-30T10:15:00Z |
expires_at | string | nullnullable | Expiration timestamp for queued validations in ISO 8601 UTC. After this, the validation moves to 2026-04-30T10:15:00Z |
etag_version | integer | nullnullable | Incremental version used with 1 |
image_path | string | nullnullable | Relative reference to the receipt, image or PDF, only when comprobantes/3fa85f64-5717-4562-b3fc-2c963f66afa6.jpg |
image_retained | boolean |
true |
purged_at | string (date-time) | Date and time, in ISO 8601 UTC, when the validation was purged with 2026-10-02T09:30:00Z |
ocr_result | object | nullnullable | Fields extracted from the receipt, only when |
ocr_confidence | number | nullnullable | OCR score from 0 to 1, only when 0.94 |
normalized_data | object | nullnullable | Fields normalized after OCR (when |
normalization_warnings | array | nullnullable | Normalization warnings present. They can explain an unexpected |
duplicate_of | object | Earlier validation that had already confirmed this same transfer in the same account. It only appears when a |
id* | string (uuid) | Identifier of the earlier validation. e.g.3fa85f64-5717-4562-b3fc-2c963f66afa6 |
created_at* | string (date-time) | Creation date and time of the earlier validation, in ISO 8601 UTC. e.g.2026-10-01T15:04:05Z |
account_conflict | object | Conflict between the account sent and the one shown in the image. It only appears on |
sent_last4* | string | Last 4 digits of the account sent in 5678 |
read_last4* | string | Last 4 digits of the account shown in the image (the visible ones, 3 or 4, if it is masked). e.g.9012 |
candidate_match | object | Which of the |
index* | integer | Position (from 0) of the winning account in the 1 |
account_last4* | string | Last 4 digits of the winning account. e.g.7771 |
is_masked | boolean | nullnullable | Whether the beneficiary account is masked in the receipt, be it a CLABE, a card or a phone number. It is included only when it is |
banxico_result | object | nullnullable | Data returned by the Banxico CEP. The typed properties below are the 20 declared by the official SPEI complement schema.
|
operationDate | string | SPEI business day that Banxico assigned to the operation, as reported by the CEP ( 2025-03-15 |
processingTime | string | Operation time as reported by the CEP ( 14:22:10 |
speiKey | string | Operation key within the SPEI system (the CEP's |
trackingKey | string | SPEI tracking key of the operation — the same one sent in the validation request. e.g.MBAN01002503151422ABCDEF |
digitalSignature | string | Digital seal of the CEP ( |
certificateNumber | string | Serial number of the digital certificate Banxico used to seal the CEP. |
cadenaCda | string | Original data string of the operation ( |
senderBank | string | Sending bank of the operation, as identified by the CEP. e.g.BBVA |
senderName | string | Name of the operation's sender, as reported by the CEP. |
senderAccountType | string | Sender's account type (e.g. CLABE or card), as reported by the CEP. |
senderAccount | string | Sender's account number, as reported by the CEP — unmasked in this resource (a private lookup, owned by the validation's account). |
senderRfc | string | Sender's RFC (Mexican tax ID), as reported by the CEP. |
receiverBank | string | Receiving bank of the operation, as identified by the CEP. e.g.STP |
beneficiaryName | string | Name of the operation's beneficiary, as reported by the CEP. |
beneficiaryAccountType | string | Beneficiary's account type (e.g. CLABE or card), as reported by the CEP. |
beneficiaryAccount | string | Beneficiary's account number, as reported by the CEP. Unmasked in this resource (a private lookup, owned by the validation's account). Outgoing webhooks DO mask it to the last 4 digits in |
beneficiaryRfc | string | Beneficiary's RFC (Mexican tax ID), as reported by the CEP. |
amount | number (float) | Operation amount Banxico confirmed via the CEP, in pesos. e.g.1500 |
iva | number (float) | VAT (IVA) of the operation reported by the CEP, in pesos. |
paymentConcept | string | Payment concept of the operation, as reported by the CEP. |
error_message | string | nullnullable | Human-readable error message when terminal. e.g.Banxico no respondió tras tres intentos. |
error_code | ValidationErrorCode | null | Stable code of the terminal error, when there is one.
After |
batch_id | integer | nullnullable | Bulk import job identifier, when applicable. e.g.318 |
batch_position | integer | nullnullable | Position within the job, starting at 1. e.g.12 |
retry_state | object | Full retry cycle state. Always present; if retries are not active, |
enabled | boolean |
true |
max_retries | integer | nullnullable | Configured maximum number of retries; 3 |
interval_seconds | integer | nullnullable | Interval between retries in seconds, from 600 |
outcomes | array | nullnullable | 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 | Date of the next retry; |
resolved_at | TimestampUTC | null | Date when a retry produced |
exhausted_at | TimestampUTC | null | Date when attempts were exhausted; |
cancelled_at | TimestampUTC | null | Cycle cancellation date; |
terminal_state | string | nullnullable | Cycle state: pending |
links | object | Related links (JSON:API |
self | string | Canonical link to the validation details. e.g./v1/validations/3fa85f64-5717-4562-b3fc-2c963f66afa6 |
cep_xml | string | nullnullable | URL of the CEP in XML format. It only appears when /v1/validations/a1b2c3d4-e5f6-4890-abcd-ef0123456789/cep?format=xml |
cep_pdf | string | nullnullable | URL of the CEP in PDF format. It only appears when /v1/validations/a1b2c3d4-e5f6-4890-abcd-ef0123456789/cep?format=pdf |
| Status | Class | Description | Body |
|---|---|---|---|
| 200 | 2xx | Payment status queried. Returns the validation and, in meta.recheck, when it was queried, whether it changed to returned, and what verdict it had before. | Validation |
| 401 | 4xx | Authentication is required or the provided credentials are invalid. | ErrorResponse |
| 403 | 4xx | Insufficient permissions. | ErrorResponse |
| 404 | 4xx | Validation not found, withdrawn, or not owned by the account (not_found). | ErrorResponse |
| 410 | 4xx | The validation was purged and this resource no longer exists (validation_purged). | ErrorResponse |
| 422 | 4xx | The validation cannot be queried: its status is neither valid nor returned (code recheck_not_eligible, with the status in meta.status) or it is older than the window (code recheck_window_expired, with the window in meta.window_hours). Invalid UUID (invalid_uuid). | ErrorResponse |
| 429 | 4xx | The validation was queried less than 10 minutes ago (code recheck_rate_limited). Retry-After and meta.retry_after give the seconds left. The API key request limit (rate_limit_exceeded) responds the same way. | ErrorResponse |
| 503 | 5xx | Banxico did not return a readable status, or the status query is switched off (code recheck_unavailable). The validation does not change and keeps its interval. Retry-After and meta.retry_after suggest waiting 60 seconds. | ErrorResponse |
| Header | Type | Description |
|---|---|---|
ETag | string | Weak ETag of the validation after the query. It follows the W/"{etag_version}-{status}" format and rises on every query, even when the verdict does not change. |
| Status | Code | Example |
|---|---|---|
| 401 | unauthorized | Invalid or missing authentication credentials. Envelope
|
| 403 | permission_denied | You do not have permission to access this resource. Envelope
|
| 410 | validation_purged | The validation was purged and this resource no longer exists. Envelope
|