apiCEP
    Volver al blog

    Cómo integrar la API de apiCEP en Node.js para validar transferencias SPEI (Guía 2026)

    Validar una transferencia SPEI contra Banxico normalmente implica capturar a mano fecha, monto, clave de rastreo, banco emisor y CLABE — un proceso repetitivo que no escala.
    apiCEP elimina esa fricción con un enfoque diferente: le envías la imagen del comprobante bancario, su motor de OCR extrae los datos automáticamente y los verifica en tiempo real contra la base de datos de Banxico, devolviendo el resultado en JSON.
    En esta guía verás cómo integrarlo en Node.js, desde la primera llamada hasta los patrones listos para producción.

    Qué hace apiCEP diferente

    La mayoría de las soluciones de validación SPEI te piden que captures manualmente todos los campos de la transferencia para consultar el CEP de Banxico.
    apiCEP invierte el flujo:

    1. Tu sistema sube la imagen (o URL) del comprobante que envió el cliente.
    2. El OCR de apiCEP lee todos los datos del comprobante — banco, monto, CLABE, referencia — sin que escribas nada.
    3. apiCEP valida esos datos directamente contra Banxico.
    4. Recibes un JSON con el estatus de validación, el monto extraído y el PDF oficial del CEP para descargar.

    Esto es especialmente valioso en fintechs, marketplaces y sistemas de cobranza donde los clientes suben una captura de pantalla o foto del comprobante y necesitas confirmar el pago sin intervención humana.

    Requisitos previos

    Antes de empezar necesitas:

    • Node.js 18+ (para usar fetch nativo; en versiones anteriores instala node-fetch)
    • API key de apiCEP — obtenla registrándote en apicep.cloud
    • Un archivo .env para guardar tus credenciales de forma segura
    • La URL pública (o un servicio de almacenamiento como S3/GCS) donde alojes las imágenes de los comprobantes

    Paso 1: configurar el proyecto

    mkdir apicep-nodejs-guide
    cd apicep-nodejs-guide
    npm init -y
    npm install dotenv
    

    Crea un archivo .env en la raíz:

    APICEP_API_KEY=tu_api_key_aqui
    

    ⚠️ Nunca subas este archivo a un repositorio público. Agrégalo a .gitignore desde el inicio.

    Paso 2: llamada básica a la API de apiCEP

    El endpoint principal de apiCEP es:

    POST https://api.apicep.cloud/validate-transfer
    

    Le envías la URL de la imagen del comprobante y los datos del beneficiario esperado. El OCR hace el resto.

    // validar-cep.mjs
    import "dotenv/config";
    
    const API_KEY = process.env.APICEP_API_KEY;
    
    async function validarTransferencia({ imageUrl, beneficiary }) {
      const response = await fetch("https://api.apicep.cloud/validate-transfer", {
        method: "POST",
        headers: {
          "Content-Type": "application/json",
          Authorization: `Bearer ${API_KEY}`,
        },
        body: JSON.stringify({
          imageUrl,      // URL pública de la imagen del comprobante bancario
          beneficiary,   // datos del beneficiario esperado para validar
        }),
      });
    
      if (!response.ok) {
        const errBody = await response.text();
        throw new Error(`Error HTTP ${response.status}: ${errBody}`);
      }
    
      return response.json();
    }
    
    export { validarTransferencia };
    

    Paso 3: usar la función en tu flujo de negocio

    // main.mjs
    import { validarTransferencia } from "./validar-cep.mjs";
    
    async function main() {
      const resultado = await validarTransferencia({
        imageUrl: "https://storage.tuempresa.com/comprobantes/pago-001.jpg",
        beneficiary: {
          clabe: "012180015469165113",   // CLABE de tu cuenta
          bank: "BBVA MEXICO",
          name: "Acme SA de CV",
        },
      });
    
      if (resultado.status === "valid" && resultado.validation.banxicoConfirmed) {
        console.log("✅ Transferencia verificada por Banxico");
        console.log("Monto extraído por OCR:", resultado.extracted.amount);
        console.log("PDF del CEP disponible en:", resultado.downloads.cepPdf);
      } else {
        console.log("❌ No se pudo verificar la transferencia");
        console.log("Razón:", resultado.error);
      }
    }
    
    main().catch(console.error);
    

    Ejecuta con:

    node main.mjs
    

    Paso 4: entender la respuesta de apiCEP

    Cuando la validación es exitosa, apiCEP devuelve un JSON como este:

    {
      "status": "valid",
      "validation": {
        "banxicoConfirmed": true
      },
      "extracted": {
        "amount": 1500.75,
        "date": "2026-03-10",
        "reference": "1234567",
        "sender": {
          "bank": "BANAMEX",
          "account": "002180012345678901"
        }
      },
      "downloads": {
        "cepPdf": "https://api.apicep.cloud/downloads/cep-abc123.pdf"
      }
    }
    

    Los campos clave que debes revisar en tu lógica de negocio son:

    | Campo | Qué significa |
    |---|---|
    | status | "valid" = comprobante reconocido y validado |
    | validation.banxicoConfirmed | true = Banxico confirma la operación |
    | extracted.amount | Monto leído del comprobante por OCR |
    | downloads.cepPdf | URL directa al PDF oficial del CEP de Banxico |
    | error | Descripción del problema si status !== "valid" |

    Paso 5: lógica de negocio robusta

    En producción, no basta con verificar que banxicoConfirmed === true. También debes cruzar el monto extraído por OCR con el que esperas recibir y manejar bien los errores:

    // validacion-robusta.mjs
    import { validarTransferencia } from "./validar-cep.mjs";
    
    async function confirmarPago({ imageUrl, beneficiary, montoEsperado }) {
      let resultado;
    
      try {
        resultado = await validarTransferencia({ imageUrl, beneficiary });
      } catch (err) {
        // Error de red o HTTP — registra y reintenta si aplica
        console.error("Error al llamar a apiCEP:", err.message);
        return { confirmado: false, motivo: "error_api" };
      }
    
      if (resultado.status !== "valid") {
        return { confirmado: false, motivo: resultado.error || "status_invalido" };
      }
    
      if (!resultado.validation.banxicoConfirmed) {
        return { confirmado: false, motivo: "banxico_no_confirma" };
      }
    
      const montoRecibido = Number(resultado.extracted.amount);
      if (Math.abs(montoRecibido - montoEsperado) > 0.01) {
        return {
          confirmado: false,
          motivo: `monto_incorrecto: esperado ${montoEsperado}, recibido ${montoRecibido}`,
        };
      }
    
      return {
        confirmado: true,
        monto: montoRecibido,
        cepPdf: resultado.downloads.cepPdf,
      };
    }
    
    export { confirmarPago };
    

    Integra confirmarPago en tus webhooks de pago, flujos de alta de clientes o sistemas de conciliación diaria.

    Paso 6: descarga y almacena el CEP en PDF

    Una vez validado el pago, probablemente quieras guardar el PDF del CEP como evidencia oficial para auditorías o para enviárselo al cliente:

    // descargar-cep.mjs
    import fs from "node:fs";
    import path from "node:path";
    import "dotenv/config";
    
    const API_KEY = process.env.APICEP_API_KEY;
    
    async function descargarCEPPdf(urlCepPdf, carpetaDestino = "./ceps") {
      const response = await fetch(urlCepPdf, {
        headers: { Authorization: `Bearer ${API_KEY}` },
      });
    
      if (!response.ok) {
        throw new Error(`Error al descargar CEP: HTTP ${response.status}`);
      }
    
      const buffer = Buffer.from(await response.arrayBuffer());
    
      if (!fs.existsSync(carpetaDestino)) {
        fs.mkdirSync(carpetaDestino, { recursive: true });
      }
    
      const nombreArchivo = path.join(carpetaDestino, `cep-${Date.now()}.pdf`);
      fs.writeFileSync(nombreArchivo, buffer);
    
      console.log("CEP guardado en:", nombreArchivo);
      return nombreArchivo;
    }
    
    export { descargarCEPPdf };
    

    Usa este PDF para:

    • Adjuntarlo automáticamente al correo de confirmación de pago al cliente.
    • Archivarlo en tu sistema de gestión documental.
    • Conservarlo como evidencia en auditorías fiscales o reclamaciones.

    Paso 7: descarga masiva de CEP en XML

    apiCEP también permite la descarga masiva de CEP en formato XML.
    Esto es ideal para procesos de conciliación contable al cierre de mes o para alimentar sistemas ERP con los datos oficiales de cada transferencia en un formato estructurado.
    Consulta la documentación de apiCEP para el endpoint específico de descarga masiva y sus parámetros de filtrado por rango de fechas o referencias.

    Buenas prácticas al usar apiCEP en producción

    • Variables de entorno: la API key siempre en .env, nunca en código fuente ni frontend.
    • Validar el monto: no te bases únicamente en banxicoConfirmed; cruza el monto del OCR con el monto esperado en tu sistema.
    • Logs sin datos sensibles: registra el estatus y el ID de la operación, no las CLABEs ni los nombres completos en texto plano.
    • Reintentos controlados: ante errores de red, reintenta con backoff exponencial y un máximo de 3 intentos.
    • Imágenes legibles: el OCR funciona mejor con imágenes bien iluminadas y sin rotación; considera agregar una validación de tamaño mínimo antes de enviar.
    • Separar sandbox y producción: prueba con comprobantes de ejemplo antes de activar en producción.

    Checklist antes de subir a producción

    • [ ] APICEP_API_KEY configurado solo en variables de entorno del servidor.
    • [ ] Se valida que status === "valid" Y validation.banxicoConfirmed === true.
    • [ ] Se verifica el monto extraído contra el monto esperado en tu base de datos.
    • [ ] Se manejan errores HTTP y de red con reintentos limitados.
    • [ ] Los PDF del CEP se guardan o archivan automáticamente.
    • [ ] Se probaron casos negativos: imagen borrosa, monto incorrecto, cuenta equivocada.
    • [ ] Los logs no contienen CLABEs ni API keys completos.

    Casos de uso ideales para apiCEP

    • Fintechs y wallets: acreditar saldo automáticamente cuando un cliente envía la foto del comprobante de su transferencia SPEI.
    • Marketplaces: liberar el pedido solo tras confirmar con Banxico que el pago llegó a la cuenta correcta.
    • SaaS de cobranza B2B: validar pagos de clientes corporativos sin intervención del equipo de finanzas.
    • ERPs y sistemas contables: conciliación automática al cierre del día, descargando los CEP en XML para cruzarlos contra facturas.
    • Plataformas de renta o servicios: confirmar depósitos de garantía o mensualidades vía comprobante SPEI en segundos.

    Conclusión

    Con apiCEP, integrar la validación de CEP de Banxico en Node.js se reduce a una sola llamada API: envías la imagen del comprobante, el OCR extrae los datos y Banxico los confirma — todo sin captura manual.
    Eso significa menos errores humanos, menos fraude y flujos de cobro completamente automatizados para cualquier empresa que opere con transferencias SPEI en México.

    Regístrate en apicep.cloud y ten tu primera validación funcionando en minutos.