Developers

Validate your payments with a single request.

Sync or async. Make a single call and get the verdict instantly or via webhooks.

POST /v1/validate
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"
  }'
200 OK "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.

POST /v1/validate-ocr
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" }'
Response
200 OK "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"
        }
    }
}

Complete, precise documentation.

Everything you need to integrate Veriko, with examples and explanations.

Read the docs

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

pip install veriko
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'

https://github.com/veriko-mx-labs/veriko-python

JavaScript

npm install @veriko-mx/sdk
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'

https://github.com/veriko-mx-labs/veriko-js

Tools

Resources for integrators.

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.

Up next

Start validating your payments for FREE.

A free plan with validations. Pay when you need more.

Pricing

Also: Security

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.