Payment validation at Banxico
Confirm the payment cleared.
Know for certain whether a transfer is valid and reached its destination — get the official receipt (CEP) from Banxico.
Results straight from the Bank of Mexico.
Try it
This is what a validated payment looks like.
A real payment, read by OCR and confirmed at Banxico. Press validate and see the answer the way you would see it in your dashboard or your API.
Validated with Banxico · Sep 8 2026, 13:10
- Operation date
- 2026-09-08
- Tracking key
- MBAN01002609080051771699
- Sender
- JORGE A. · BBVA MEXICO
- Beneficiary
- JESUS M. · BANORTE
- Type
- OCR confidence 0.90
- Official receipt
- CEP as PDF · XML
- Receipt received
- Data read (OCR)
- Checked with Banxico
- Confirmed
curl -X POST https://api.veriko.mx/v1/validate-ocr \
-H "Authorization: Bearer veriko_TU_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "image_url": "https://tu-sistema.com/comprobante.jpg" }'
const res = await fetch("https://api.veriko.mx/v1/validate-ocr", {
method: "POST",
headers: {
"Authorization": "Bearer veriko_TU_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
image_url: "https://tu-sistema.com/comprobante.jpg",
}),
});
const { data } = await res.json();
console.log(data.attributes.status); // "valid"
import requests
res = requests.post(
"https://api.veriko.mx/v1/validate-ocr",
headers={"Authorization": "Bearer veriko_TU_API_KEY"},
json={"image_url": "https://tu-sistema.com/comprobante.jpg"},
)
print(res.json()["data"]["attributes"]["status"]) # "valid"
$ch = curl_init("https://api.veriko.mx/v1/validate-ocr");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer veriko_TU_API_KEY",
"Content-Type: application/json",
],
CURLOPT_POSTFIELDS => json_encode([
"image_url" => "https://tu-sistema.com/comprobante.jpg",
]),
]);
$data = json_decode(curl_exec($ch), true)["data"];
echo $data["attributes"]["status"]; // "valid"
body, _ := json.Marshal(map[string]any{
"image_url": "https://tu-sistema.com/comprobante.jpg",
})
req, _ := http.NewRequest("POST", "https://api.veriko.mx/v1/validate-ocr", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer veriko_TU_API_KEY")
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
// res → { "data": { "attributes": { "status": "valid" } } }
"status": "valid"
Confirmed
{
"data": {
"type": "validation",
"id": "c3d4e5f6-a7b8-4012-8def-123456789012",
"attributes": {
"validation_type": "ocr",
"is_playground": false,
"status": "valid",
"banxico_status": "valid",
"processing_time_ms": 11700,
"created_at": "2026-09-08T19:28:06Z",
"completed_at": "2026-09-08T19:28:18Z",
"request_data": {
"image_url": "https://tu-sistema.com/comprobante.jpg"
},
"image_path": "ocr/2026/09/c3d4e5f6-a7b8-4012-8def-123456789012.jpg",
"ocr_result": {
"tipo_comprobante": "spei",
"clave_rastreo": "MBAN01002609080051771699",
"referencia_numerica": "0509260",
"fecha": "2026-09-08",
"hora": "13:10:00",
"monto": 250.0,
"banco_emisor": "BBVA",
"banco_receptor": "Banorte",
"nombre_ordenante": null,
"nombre_beneficiario": "Jesus M.",
"cuenta_beneficiaria": "•6546",
"cuenta_beneficiaria_es_parcial": true,
"cuenta_beneficiaria_is_masked": true,
"cuenta_beneficiaria_visible_last": "6546",
"concepto": "Pago de producto",
"confianza": 0.9,
"confianza_por_campo": {
"banco_emisor": 0.8,
"banco_receptor": 1,
"cuenta_beneficiaria": 0.8,
"monto": 1,
"clave_rastreo": 1,
"fecha": 1
}
},
"ocr_confidence": 0.9,
"normalized_data": {
"tipo_comprobante": "spei",
"clave_rastreo": "MBAN01002609080051771699",
"referencia_numerica": "0509260",
"fecha": "2026-09-08",
"hora": "13:10:00",
"monto": 250.0,
"emisor_code": "40012",
"emisor_name": "BBVA MEXICO",
"receptor_code": "40072",
"receptor_name": "BANORTE",
"cuenta_beneficiaria": "072580012706676546",
"cuenta_beneficiaria_type": "clabe",
"nombre_beneficiario": "Jesus M.",
"concepto": "Pago de producto",
"confianza": 0.9
},
"banxico_result": {
"operationDate": "2026-09-08",
"processingTime": "13:10:57",
"speiKey": "40072",
"trackingKey": "MBAN01002609080051771699",
"certificateNumber": "00001000000710905384",
"senderBank": "BBVA MEXICO",
"senderName": "JORGE A.",
"senderAccountType": "40",
"senderAccount": "012180••••••••4195",
"senderRfc": "XAXX010101000",
"receiverBank": "BANORTE",
"beneficiaryName": "JESUS M.",
"beneficiaryAccountType": "40",
"beneficiaryAccount": "072580012706676546",
"beneficiaryRfc": "XAXX010101000",
"amount": 250.0,
"iva": 0.0,
"paymentConcept": "Pago de producto"
},
"retry_state": {
"enabled": false,
"max_retries": null,
"interval_seconds": null,
"outcomes": null,
"attempts_completed": 0,
"next_attempt_at": null,
"resolved_at": null,
"exhausted_at": null,
"cancelled_at": null,
"terminal_state": null
}
},
"links": {
"self": "/v1/validations/c3d4e5f6-a7b8-4012-8def-123456789012",
"cep_xml": "/v1/validations/c3d4e5f6-a7b8-4012-8def-123456789012/cep?format=xml",
"cep_pdf": "/v1/validations/c3d4e5f6-a7b8-4012-8def-123456789012/cep?format=pdf"
}
},
"meta": {
"version": "1.59.1",
"api_version": "v1",
"request_id": "e6f7a8b9c0d1",
"datetime": {
"timezone": "UTC",
"format": "ISO 8601"
}
}
}
How it works
Three steps, no hassle.
Upload an image
Or enter the payment details manually.
Validation at Banxico
We check the payment's validity in the banking system.
You get the receipt (CEP)
If the payment was credited, you get the official receipt. If not, we tell you right away.
Trust
The authority rules.
The Electronic Payment Receipt (CEP) is issued by the Bank of Mexico and backs SPEI transfers.
- Source: Bank of Mexico (Banxico).
- Official document in PDF / XML.
- Receipt with the details: amounts, dates, names, RFC, and more.
Capabilities
A complete product, at your scale.
SPEI validation
By image or manually.
Multiple accounts and sellers
Register multiple accounts that receive payments. Review their finances and validations.
Bulk upload
Bulk payment validation (CSV, XLSX or images).
Webhooks and async mode
Fire events in your system when a payment is validated; validate payments in the background.
Card payments
Your subscription renews on its own, so the service keeps running.
Dashboard, reports and alerts
Detailed records, exports and real-time notifications.
Two ways
Use it however you like.
From the web or app
Nothing to install — upload your payments and manage your finances and operations from one place.
Open the dashboardVia API
REST API with JSON responses. Complete documentation and an API ready to integrate into your system.
Read the documentationQuestions
Frequently asked questions.
Start validating your payments today.
Create your account and confirm your first payment in minutes.
Start free