https://api.veriko.mx/v1/validate-ocrValidar una transferencia SPEI (OCR)
Guía de uso →Valida una transferencia SPEI a partir de su comprobante, en imagen o en PDF. Extrae mediante reconocimiento óptico (OCR) los datos del comprobante y los valida en Banxico para obtener el CEP de la transacción.
El comprobante se envía como image o image_url. Si es enviado mediante una URL, el host destino deberá contar con protocolo seguro (SSL/HTTPS).
El veredicto final es el mismo que en la validación manual:
valid: El CEP de la transacción fue encontrado y validado.not_found: El CEP de la transacción NO fue encontrado.cep_unavailable: Banxico reconoció la transacción pero el CEP no está disponible por el momento.returned: la transacción se liquidó y la institución beneficiaria la devolvió después. El CEP, si existe, se sigue entregando.error: Error interno del servicio.
| Parámetro | Ubicación | Tipo | Obligatorio | Descripción |
|---|---|---|---|---|
async | query | string | opcional | Cuando es Predeterminado: |
Idempotency-Key | header | string | opcional | Llave opcional que garantiza que la petición se procese exactamente una vez dentro de un TTL de 24 horas. Los reintentos con la misma llave y el mismo cuerpo devuelven la respuesta cacheada con la cabecera 11111111-2222-3333-4444-555555555555 |
| Parámetro | Tipo | Obligatorio | Descripción |
|---|---|---|---|
image | string (byte) | Obligatorio si no se envía image_url | Comprobante codificado en base64, en imagen o en PDF. Si también se proporciona iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8BQDwAEhQGAhKmMIQAAAABJRU5ErkJggg== |
image_url | string (uri) | Obligatorio si no se envía image | URL pública (HTTPS) del comprobante. Sigue los mismos límites de formato y tamaño que https://storage.example.com/receipts/comprobante-2025-03.jpg |
cuenta_beneficiaria | string (patrón) | opcional | Cuenta receptora de la transferencia (útil cuando falta o está incompleta en la imagen). Requerida para celular DiMo; opcional si la imagen muestra la cuenta completa o sus últimos dígitos, que se completan con los beneficiarios guardados (estos no sustituyen a este campo). Acepta CLABE (18 dígitos), tarjeta (16 dígitos) o celular DiMo (10 dígitos). No puede enviarse junto con 012180004412345678 |
cuentas_candidatas | array<string> (elementos: 2–10, elementos únicos) | opcional | Cuentas entre las que está la receptora de la transferencia, para cuando la imagen no la muestra y no se sabe cuál fue. Va en lugar de ["012180004412345678","002010077777777771"] |
banco_emisor | string | opcional | Código SPEI del banco emisor (4 o 5 dígitos, p. ej. 40012 |
banco_receptor | string | opcional | Código SPEI del banco receptor (4 o 5 dígitos, p. ej. 40002 |
retry_policy | object | opcional | Política de reintentos automáticos para esta validación. Si se omite, se aplica la política general del usuario, configurada en |
enabled | boolean | opcional |
true |
max_retries | integer (≥ 1) | opcional | Número máximo de reintentos automáticos. Una vez alcanzado, el ciclo pasa al estado terminal 3 |
interval_seconds | integer (≥ 300, ≤ 86400) | opcional | Segundos de espera entre cada reintento. Valores válidos: 300–86400 (5 min a 24h). p. ej.600 |
outcomes | array<string> (elementos: 1–?, elementos únicos) | opcional | Resultados que originan un reintento. De forma predeterminada son ["not_found","cep_unavailable","error"] |
client_ref | string (patrón, 1–64) | opcional | Referencia propia que se devuelve tal cual en la validación, en los webhooks de validación y como filtro exacto de orden-4812 |
retain_image | boolean | opcional |
Predeterminado: false |
curl -X POST 'https://api.veriko.mx/v1/validate-ocr' \
-H 'Authorization: Bearer veriko_••••' \
-H 'Content-Type: application/json' \
-d '{
"image": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="
}'Ejemplo en Python — próximamente.
Ejemplo en JavaScript — próximamente.
Ejemplo en PHP — próximamente.
Política de reintentos
POST /v1/validate-ocr
Política de reintentos de una validación: activación, límite, intervalo y resultados elegibles.
- Intentos
- —
- Intervalo
- 5 min – 1 h × 24
- Resultados elegibles
not_found,cep_unavailable,error
Esta operación admite una política de reintentos opcional.
| Campo | Tipo | Descripción |
|---|---|---|
type* | string | Tipo de recurso JSON:API. Siempre validation |
id* | string (uuid) | Identificador único de la validación (UUID v4). p. ej.3fa85f64-5717-4562-b3fc-2c963f66afa6 |
attributes* | object | Datos canónicos de la validación. |
validation_type | string | Modalidad de validación — direct |
is_playground | boolean |
false |
status | string | Estado del ciclo de vida — valid |
banxico_status | string | nullanulable | Veredicto reportado por Banxico. Puede ser: valid |
processing_time_ms | integer | nullanulable | Tiempo (en milisegundos) empleados en procesar la validación. p. ej.1320 |
request_data | object | Copia de los campos de la petición original. |
client_ref | string | Referencia propia que se envió en la petición ( orden-4812 |
created_at | string (date-time) | Fecha y hora, en ISO 8601 UTC, de creación de la validación. p. ej.2025-03-15T14:22:10Z |
completed_at | string | nullanulable | Fecha y hora de la finalización, en ISO 8601 UTC. 2025-03-15T14:22:11Z |
enqueued_at | string | nullanulable | Fecha y hora, en ISO 8601 UTC, de entrada a la cola. p. ej.2026-04-30T10:15:00Z |
processing_started_at | string | nullanulable | Fecha y hora, en ISO 8601 UTC, de inicio del procesamiento. p. ej.2026-04-30T10:15:00Z |
expires_at | string | nullanulable | Fecha y hora, en ISO 8601 UTC, de expiración para validaciones en cola. Tras esta marca, la validación pasa a 2026-04-30T10:15:00Z |
etag_version | integer | nullanulable | Versión incremental (usada con 1 |
image_path | string | nullanulable | Referencia relativa del comprobante, imagen o PDF (solo si comprobantes/3fa85f64-5717-4562-b3fc-2c963f66afa6.jpg |
image_retained | boolean |
true |
purged_at | string (date-time) | Fecha y hora, en ISO 8601 UTC, en que la validación se purgó con 2026-10-02T09:30:00Z |
ocr_result | object | nullanulable | Campos extraídos del comprobante (solo si |
ocr_confidence | number | nullanulable | Puntaje de la extracción OCR 0–1 (solo si 0.94 |
normalized_data | object | nullanulable | Campos normalizados después de la extracción OCR (si |
normalization_warnings | array | nullanulable | Advertencias de normalización presentes. Permiten explicar un resultado |
duplicate_of | object | Validación previa que ya había confirmado esta misma transferencia en la misma cuenta. Solo aparece cuando existe una validación |
id* | string (uuid) | Identificador de la validación previa. p. ej.3fa85f64-5717-4562-b3fc-2c963f66afa6 |
created_at* | string (date-time) | Fecha y hora, en ISO 8601 UTC, de creación de la validación previa. p. ej.2026-10-01T15:04:05Z |
account_conflict | object | Conflicto entre la cuenta enviada y la que muestra la imagen. Solo aparece en validaciones de tipo |
sent_last4* | string | Últimos 4 dígitos de la cuenta enviada en 5678 |
read_last4* | string | Últimos 4 dígitos de la cuenta que muestra la imagen (los visibles, 3 o 4, si está enmascarada). p. ej.9012 |
candidate_match | object | Cuál de las |
index* | integer | Posición (desde 0) de la cuenta ganadora en el arreglo 1 |
account_last4* | string | Últimos 4 dígitos de la cuenta ganadora. p. ej.7771 |
is_masked | boolean | nullanulable | Indica si la cuenta beneficiaria viene enmascarada en el comprobante cargado, sea una CLABE, una tarjeta o un celular. Solo se incluye cuando vale |
banxico_result | object | nullanulable | Datos devueltos por Banxico. Las propiedades tipadas abajo son las 20 que declara el esquema oficial del complemento SPEI.
|
operationDate | string | Día hábil SPEI que Banxico asignó a la operación, tal como lo reporta el CEP ( 2025-03-15 |
processingTime | string | Hora de la operación tal como la reporta el CEP ( 14:22:10 |
speiKey | string | Clave de la operación dentro del sistema SPEI ( |
trackingKey | string | Clave de rastreo de la operación SPEI — la misma que se envía en la petición de validación. p. ej.MBAN01002503151422ABCDEF |
digitalSignature | string | Sello digital del CEP ( |
certificateNumber | string | Número del certificado digital que Banxico usó para sellar el CEP. |
cadenaCda | string | Cadena original de la operación ( |
senderBank | string | Banco emisor de la operación, tal como lo identifica el CEP. p. ej.BBVA |
senderName | string | Nombre del ordenante de la operación, tal como lo reporta el CEP. |
senderAccountType | string | Tipo de cuenta del ordenante (por ejemplo, CLABE o tarjeta), tal como lo reporta el CEP. |
senderAccount | string | Cuenta del ordenante, tal como la reporta el CEP, sin enmascarar en este recurso (consulta privada, propia del dueño de la validación). |
senderRfc | string | RFC del ordenante, tal como lo reporta el CEP. |
receiverBank | string | Banco receptor de la operación, tal como lo identifica el CEP. p. ej.STP |
beneficiaryName | string | Nombre del beneficiario de la operación, tal como lo reporta el CEP. |
beneficiaryAccountType | string | Tipo de cuenta del beneficiario (por ejemplo, CLABE o tarjeta), tal como lo reporta el CEP. |
beneficiaryAccount | string | Cuenta del beneficiario, tal como la reporta el CEP, sin enmascarar en este recurso (consulta privada, propia del dueño de la validación). Los webhooks salientes sí la enmascaran a los últimos 4 dígitos en |
beneficiaryRfc | string | RFC del beneficiario, tal como lo reporta el CEP. |
amount | number (float) | Monto de la operación que Banxico confirmó por el CEP, en pesos. p. ej.1500 |
iva | number (float) | IVA de la operación reportado por el CEP, en pesos. |
paymentConcept | string | Concepto de pago de la operación, tal como lo reporta el CEP. |
error_message | string | nullanulable | Mensaje legible del error terminal (si aplica). p. ej.Banxico no respondió tras tres intentos. |
error_code | ValidationErrorCode | null | Código estable del error terminal (si aplica).
Tras |
batch_id | integer | nullanulable | Identificador del trabajo de importación masiva (si aplica). p. ej.318 |
batch_position | integer | nullanulable | Posición dentro del trabajo (comenzando en 1). p. ej.12 |
retry_state | object | Estado completo del ciclo de reintentos (siempre presente). Si la validación no tiene reintentos activos, |
enabled | boolean |
true |
max_retries | integer | nullanulable | Número máximo de reintentos configurado; 3 |
interval_seconds | integer | nullanulable | Intervalo en segundos entre reintentos, de 600 |
outcomes | array | nullanulable | Resultados que originan un reintento: ["not_found","cep_unavailable","error"] |
attempts_completed | integer | Cantidad de reintentos completados hasta el momento. p. ej.1 |
next_attempt_at | TimestampUTC | null | Fecha del próximo reintento; |
resolved_at | TimestampUTC | null | Fecha en que un reintento obtuvo |
exhausted_at | TimestampUTC | null | Fecha en que se agotaron los intentos; |
cancelled_at | TimestampUTC | null | Fecha de cancelación del ciclo; |
terminal_state | string | nullanulable | Situación del ciclo: pending |
links | object | Enlaces relacionados (JSON:API |
self | string | Enlace canónico al detalle de la validación. p. ej./v1/validations/3fa85f64-5717-4562-b3fc-2c963f66afa6 |
cep_xml | string | nullanulable | URL del CEP en formato XML. Solo aparece cuando /v1/validations/a1b2c3d4-e5f6-4890-abcd-ef0123456789/cep?format=xml |
cep_pdf | string | nullanulable | URL del CEP en formato PDF. Solo aparece cuando /v1/validations/a1b2c3d4-e5f6-4890-abcd-ef0123456789/cep?format=pdf |
| Código | Clase | Descripción | Cuerpo |
|---|---|---|---|
| 200 | 2xx | Validación resuelta con los datos extraídos del comprobante y su veredicto. | Validation |
| 202 | 2xx | Validación asíncrona aceptada. Se debe sondear GET /v1/validations/{id} hasta uno de los estados terminales (valid, not_found, cep_unavailable, invalid, returned, failed, error). meta.next_poll_after_seconds indica el intervalo recomendado para el primer sondeo. | ValidationQueued |
| 400 | 4xx | El valor de la cabecera Idempotency-Key no cumple el formato permitido (alfanumérico + _ + -, 1–255 caracteres).
| ErrorResponse |
| 401 | 4xx | Se requiere autenticación o las credenciales son inválidas | ErrorResponse |
| 409 | 4xx | Una petición con la misma Idempotency-Key aún se está procesando. Se debe reintentar después de los segundos que indica la cabecera Retry-After. | ErrorResponse |
| 413 | 4xx | El cuerpo de la petición supera el tamaño máximo admitido (body_too_large). | ErrorResponse |
| 422 | 4xx | La imagen o los datos de la petición no son válidos. Códigos posibles: image_or_image_url_required, invalid_image, invalid_image_format, image_too_large, invalid_url, invalid_url_scheme, url_ssrf_blocked, invalid_clabe_checksum. También puede devolver: image_too_small, image_mime_mismatch, image_dimensions_too_large, image_decompression_bomb, image_polyglot_detected, image_url_unreachable, image_url_too_large, image_url_too_many_redirects. Con un PDF: pdf_invalid_structure, pdf_encrypted, pdf_active_content, pdf_hidden_content, pdf_modified_after_issue, pdf_too_many_pages, pdf_unsupported_image, pdf_text_layer_too_large y pdf_multiple_receipts. Con retain_image que no es booleano: invalid_retain_image. Con cuentas_candidatas: cuenta_y_candidatas_excluyentes, cuentas_candidatas_invalidas y, si ninguna candidata coincide, cuenta_unresolvable_after_probes. En modo asíncrono, un fallo genérico de la imagen se reporta como image_invalid. Reutilizar Idempotency-Key con un cuerpo distinto produce idempotency_key_reused. | ErrorResponse |
| 429 | 4xx | Límite de tasa excedido | ErrorResponse |
| 503 | 5xx | El OCR no está disponible, no pudo completarse la solicitud a Banxico (banxico_rate_limit_exhausted) o no fue posible iniciar la validación asíncrona (dispatch_failed). | ErrorResponse |
| Cabecera | Tipo | Descripción |
|---|---|---|
Idempotent-Replayed | string | Presente solo cuando la petición incluyó Idempotency-Key. false identifica una respuesta nueva; true, una respuesta reutilizada desde el caché. |
| Código | Clave | Ejemplo |
|---|---|---|
| 400 | invalid_idempotency_key | Formato de Idempotency-Key inválido. Se admiten A-Z a-z 0-9 _ - (de 1 a 255 caracteres). Envelope
|
| 401 | unauthorized | Credenciales de autenticación ausentes o inválidas. Envelope
|
| 409 | idempotency_key_in_progress | Una petición con esta Idempotency-Key sigue en proceso. Envelope
Cabeceras de respuesta
|
| 413 | body_too_large | El cuerpo de la petición es demasiado grande. Envelope
|
| 429 | rate_limit_exceeded | Límite de peticiones excedido. Inténtalo de nuevo en 45 segundos. Envelope
Cabeceras de respuesta
|