Developers
Validate your payments with a single request.
Sync or async. Make a single call and get the verdict instantly or via webhooks.
curl -X POST https://api.veriko.mx/v1/validate \
-H "Authorization: Bearer veriko_TU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"fecha": "2025-03-15",
"monto": 15000.50,
"clave_rastreo": "MXBA20250315001234",
"cuenta_beneficiaria": "012180004412345678"
}'
const res = await fetch("https://api.veriko.mx/v1/validate", {
method: "POST",
headers: {
"Authorization": "Bearer veriko_TU_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
fecha: "2025-03-15",
monto: 15000.50,
clave_rastreo: "MXBA20250315001234",
cuenta_beneficiaria: "012180004412345678",
}),
});
const { data } = await res.json();
console.log(data.attributes.status); // "valid"
import requests
res = requests.post(
"https://api.veriko.mx/v1/validate",
headers={"Authorization": "Bearer veriko_TU_API_KEY"},
json={
"fecha": "2025-03-15",
"monto": 15000.50,
"clave_rastreo": "MXBA20250315001234",
"cuenta_beneficiaria": "012180004412345678",
},
)
print(res.json()["data"]["attributes"]["status"]) # "valid"
$ch = curl_init("https://api.veriko.mx/v1/validate");
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([
"fecha" => "2025-03-15",
"monto" => 15000.50,
"clave_rastreo" => "MXBA20250315001234",
"cuenta_beneficiaria" => "012180004412345678",
]),
]);
$data = json_decode(curl_exec($ch), true)["data"];
echo $data["attributes"]["status"]; // "valid"
body, _ := json.Marshal(map[string]any{
"fecha": "2025-03-15",
"monto": 15000.50,
"clave_rastreo": "MXBA20250315001234",
"cuenta_beneficiaria": "012180004412345678",
})
req, _ := http.NewRequest("POST", "https://api.veriko.mx/v1/validate", 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
Try it
From the image to the verdict.
A real payment. We extract the details from the image and confirm it with Banxico. See the response the API returns, field by field.
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.118.1",
"api_version": "v1",
"request_id": "e6f7a8b9c0d1",
"datetime": {
"timezone": "UTC",
"format": "ISO 8601"
}
}
}
Built for production
Everything you expect from an API.
Async and bulk uploads
Don't wait on the process. We notify you when results are ready. Plus you can validate payments in bulk.
Idempotency
Use idempotency and retry without fear of duplicating data.
Automatic retries
Retry the validation if the payment wasn't found. Useful when there are delays in the banking system.
Signed webhooks
Each verdict reaches you as an event signed with HMAC-SHA256.
Integration
Official SDKs in Python and JavaScript.
Install and validate in a few lines.
Python
from veriko import Veriko
client = Veriko() # reads VERIKO_API_KEY from the environment
validation = client.validate_transfer(
fecha="2025-03-15",
monto=15000.50,
clave_rastreo="MXBA20250315001234",
cuenta_beneficiaria="012180004412345678",
)
print(validation.status) # 'valid'
JavaScript
import { Veriko } from '@veriko-mx/sdk';
const client = new Veriko(); // reads VERIKO_API_KEY from the environment
const validation = await client.validateTransfer({
fecha: '2025-03-15',
monto: 15000.5,
claveRastreo: 'MXBA20250315001234',
cuentaBeneficiaria: '012180004412345678',
});
console.log(validation.attributes.status); // 'valid'
Tools
Resources for integrators.
-
Postman collection
Try the API before writing code.
-
OpenAPI spec
The downloadable API definition.
-
Examples
Runnable examples in cURL, Node.js, Python and PHP.
-
MCP server
To use the API from your editor or agent.
Quickstart
Your first validation, in three steps.
Create your API key
From the dashboard, in the API section. It's sent with every request.
Call the API
Send the receipt as an image or PDF, or the transfer details.
Get the result
In the same response, or via a secure webhook.
Compare before you integrate.
Before you decide, review the Comparison of Banxico CEP APIs.
Build with certainty.
Create your account and run your first validation today.