Una venta pagada por transferencia suele cerrarse con una imagen. Llega la captura de la app bancaria o el PDF del comprobante, y con eso se libera el pedido, se entrega el auto o se activa el crédito. La imagen trae lo que parece importar: la clave de rastreo, el monto, el banco de origen, la cuenta de destino y la hora.

Ninguno de esos datos está protegido. Una captura se edita en minutos con cualquier editor de imágenes, y un PDF con un editor de PDF. El resultado se ve idéntico al original. Las formas en que un comprobante falla se repiten:

  • Inventado. La clave de rastreo no corresponde a ningún pago.
  • Alterado. Un pago real con el monto o la cuenta de destino cambiados.
  • Ajeno. Un comprobante verdadero, pero de un pago que fue a otra persona.
  • Revertido. El pago salió, pero el banco que lo recibía lo devolvió o lo rechazó.

Revisar el estado de cuenta a mano funciona, pero tarda. La conciliación suele correr por lotes, y cuando confirma, el pedido muchas veces ya salió.

Por qué el comprobante no basta

SPEI es el sistema de pagos que opera Banxico. Toda transferencia entre dos instituciones distintas pasa por él, y el banco que la envía le asigna una clave de rastreo. El comprobante que se comparte lo genera el banco emisor en el momento de enviar. Dice lo que ese banco ordenó, no lo que pasó después.

Lo que pasó después vive en Banxico. Un pago puede quedar en proceso, liquidarse, devolverse porque la cuenta de destino no existe o está cerrada, o rechazarse. La captura de la app no cambia cuando el pago se devuelve. El registro de Banxico sí.

Cuando un pago se liquida y el banco receptor confirma el abono, Banxico emite el Comprobante Electrónico de Pago (CEP), con su sello digital. El CEP trae lo que ninguna captura prueba: el nombre y el RFC o la CURP de quien envió y de quien recibió, las dos cuentas, los dos bancos, el monto y la hora del abono. El banco receptor tiene unos minutos para confirmar, así que un pago recién liquidado puede no tener CEP todavía.

Antes de usar el registro conviene saber dos cosas.

  • Banxico encuentra un pago sólo cuando coinciden la fecha, la clave de rastreo o la referencia, los dos bancos, la cuenta del beneficiario y el monto. Un dato mal capturado da el mismo resultado que un comprobante inventado.
  • Un traspaso entre dos cuentas del mismo banco no pasa por SPEI. No tiene registro en Banxico ni CEP.

Cómo se confirma un pago

Confirmar un pago es preguntarle a Banxico por él con los datos del comprobante, y decidir con su respuesta en vez de con la imagen. Cada estado lleva a una decisión distinta.

  1. Liquidado, con CEP. El dinero llegó. Antes de liberar, compara el beneficiario del CEP con quien esperabas. Un comprobante ajeno se delata aquí, porque el pago existe a nombre de otra persona.
  2. Liquidado, sin CEP todavía. El banco receptor aún no confirma. Vuelve a consultar en unos minutos.
  3. En proceso. Banxico tiene el pago, pero no se ha abonado. Espera.
  4. Devuelto, rechazado o cancelado. El dinero no se quedó en la cuenta del beneficiario. No liberes.
  5. No encontrado. Ningún pago coincide con esos datos. Antes de concluir que el comprobante es falso, descarta un error de captura.

El primer filtro contra ese error es la CLABE. Sus 18 dígitos traen el banco en los tres primeros y un dígito verificador al final, calculado con los otros 17. Un dígito mal tecleado se detecta sin consultar a nadie, y el banco de la cuenta sale de su prefijo.

El CEP en XML o PDF queda como evidencia en el expediente del pago. Si una operación termina en disputa, ése es el documento que cuenta, no la captura.

Ejemplo

Singula hace la consulta a Banxico en una sola llamada. Mandas los datos del comprobante y, si quieres, a quién esperas como beneficiario.

curl -X POST https://api.singula.mx/app/spei \
  -H "Authorization: Bearer $SINGULA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "fecha": "2026-10-15",
    "criterio_tipo": "clave_rastreo",
    "criterio": "SINGULA202610150001",
    "emisor": "40012",
    "cuenta": "014180000123456780",
    "monto": "1500.00",
    "expected": { "beneficiario_nombre": "GRUPO SINGULA, S.A. DE C.V." }
  }'

La respuesta, abreviada, trae el estado en Banxico, el beneficiario del comprobante y cómo se compara con lo que mandaste:

{
  "data": {
    "found": true,
    "status": "liquidado",
    "verdict": "confirmed",
    "cep_available": true,
    "beneficiary": {
      "name": "GRUPO SINGULA, S.A. DE C.V.",
      "account": "014180000123456780",
      "bank": "SANTANDER"
    },
    "matches": {
      "beneficiary_name": "match",
      "amount": "match",
      "account": "match"
    }
  },
  "status": "success"
}

La CLABE se revisa aparte con el Validador CLABE, que no tiene cargo. Con un dígito mal tecleado contesta valid: false, el motivo check_digit_mismatch y el dígito que correspondía:

curl -X POST https://api.singula.mx/app/clabe/validate \
  -H "Authorization: Bearer $SINGULA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "account": "012180001234567895" }'

Qué hacer ahora

Crea una cuenta y usa tu llave de prueba (sk_test_). El ambiente de pruebas responde con la misma forma que producción y no consume saldo, así que la consulta queda conectada a tu flujo de pedidos antes del primer pago real. La referencia completa, campo por campo, está en la documentación.