Skip to main content
Este endpoint lo implementas tú, en tu backend. TapiPay lo llama cada vez que un pago cambia de estado, para que actualices la deuda en tu sistema sin tener que consultar la API en loop.
Es la única fuente confiable del estado de un pago. El evento paymentSubmitted del SDK indica que el usuario envió el formulario, no que el pago se acreditó. Marca una deuda como pagada solo cuando llega esta notificación con status: "confirmed".
Esta notificación no la emite la Facade API, que no implementa webhooks. La envía la plataforma de pago referenciado, y se configura a nivel de plataforma durante el onboarding con el equipo de TapiPay: no hay endpoint para dar de alta ni cambiar la URL. Las peticiones salen de las IPs de esa plataforma, no del host de la Facade API, y te las entregan en el onboarding.

Configuración

Tú defines la URL completa (host y path) a la que TapiPay va a enviar las notificaciones. Entregas dos: TapiPay no impone una ruta. Cualquier path accesible sirve: /api/webhooks/confirm-payment, /tapi/callback, /notifications, /payment/status.

Requisitos de tu endpoint

requerido
Alcanzable desde las IPs de origen de TapiPay que te entregan en el onboarding.
requerido
Devuelve cualquier código HTTP 2xx para confirmar la recepción. TapiPay no lee el body de tu respuesta, solo el código de estado, así que puedes responder vacío.
requerido
Si tardas más, la petición se considera fallida y entra en reintentos. Si necesitas procesamiento pesado, encola y responde antes.

El payload

POST con Content-Type: application/json al endpoint que definiste.

additionalData es dinámico

additionalData reenvía exactamente los campos opcionales que se cargaron al crear la deuda, así que sus claves varían entre clientes y entre servicios. No hay un conjunto de campos garantizado. Valida la existencia de cada campo antes de usarlo: no asumas que alguno va a estar presente.

Ejemplo

Los campos dentro de additionalData son ilustrativos: muestran lo que un cliente podría enviar, no un contrato.

Validar que la petición viene de TapiPay

Tu endpoint es público, así que cualquiera puede llamarlo. TapiPay ofrece cinco mecanismos que se configuran en el onboarding. Puedes activar uno o combinar varios.
Combina al menos dos, por ejemplo API Key más whitelist de IPs, o Bearer token más mTLS. Un solo mecanismo basado en header es vulnerable si la clave se filtra.

Reintentos e idempotencia

TapiPay reintenta si tu endpoint falla. Eso significa que puedes recibir la misma notificación más de una vez. Implementa idempotencia por operationId o vas a procesar el mismo pago dos veces.
El orden correcto en tu handler es: validar el origen, responder 2xx rápido, y recién después procesar.
yaProcesada y marcarProcesada tienen que apoyarse en almacenamiento persistente (una tabla con operationId único, o Redis), no en memoria del proceso: si reinicias el servidor entre el intento original y el reintento, una marca en memoria se pierde y el pago se procesa de nuevo.

Cómo probarlo

TapiPay no puede alcanzar tu localhost, así que necesitas una URL pública. Dos formas, según qué quieras verificar.
Para ver el payload real sin escribir código, usa un receptor público como webhook.site y entrega esa URL como tu endpoint de homologación. Cada notificación queda registrada con sus headers y su body.Sirve para confirmar qué llega en additionalData en tu caso concreto, que es la parte que no se puede documentar de antemano.
Solo para homologación con datos de prueba. Un receptor público expone el payload a cualquiera que tenga la URL: nunca apuntes producción ahí.
Mientras esperas que TapiPay dispare una notificación real, puedes ejercitar tu handler con el payload de ejemplo de esta página:
Llámalo dos veces con el mismo operationId: es la forma más rápida de comprobar que tu idempotencia funciona antes de salir a producción.