Developers
Validate your payments with our powerful API.
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
This is what a validated payment looks like.
A real payment, read by OCR and confirmed in the Banxico CEP. Run the validation and review 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.59.1",
"api_version": "v1",
"request_id": "e6f7a8b9c0d1",
"datetime": {
"timezone": "UTC",
"format": "ISO 8601"
}
}
}
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 a receipt image or the transfer details.
Get the result
In the same response, or via a secure webhook.
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.
Build with certainty.
Create your account and run your first validation today.