Resumen de Webhooks
- Los webhooks notifican a las organizaciones en tiempo casi real sobre cambios en entidades relacionadas (órdenes, contactos, merchants, invitaciones).
- Puedes configurar múltiples endpoints por organización; todos los endpoints activos reciben todos los eventos.
- El estado de los eventos se puede inspeccionar a través de la API.
Primeros Pasos
- Crea un endpoint con una URL y un secreto.
- Almacena tu secreto de forma segura; se usa para firmar cada webhook.
- Verifica las firmas en cada solicitud (ver Seguridad más abajo).
- Usa Ping para probar tu integración antes de ir a producción.
Gestión de endpoints (ámbito de organización)
- Crear: POST /organizations/:organizationId/webhooks
- Listar/obtener: GET /organizations/:organizationId/webhooks[/ :webhookId]
- Rotar secreto: POST /organizations/:organizationId/webhooks/:webhookId/rotate-secret
- Pausar/reanudar: POST /organizations/:organizationId/webhooks/:webhookId/(pause|resume)
- Eliminar: DELETE /organizations/:organizationId/webhooks/:webhookId (eliminación suave)
- Ping: POST /organizations/:organizationId/webhooks/:webhookId/ping
Los secretos son de solo escritura y nunca se devuelven después de la creación/rotación.
Eventos (APIs de lectura)
- Listar: GET /organizations/:organizationId/webhook-events
- Filtros: type, from, to, merchantId, resourceType, resourceId, page, limit
- Obtener: GET /organizations/:organizationId/webhook-events/:eventId
- Entregas (estado resumido): GET /organizations/:organizationId/webhook-events/:eventId/deliveries
- Devuelve entregas por endpoint con deliveryStatus, retryCount, lastRetryAt, lastStatusCode, lastRespondedAt
Replay (ámbito de organización, uso interno por ops o vía permisos):
- Reenviar un evento: POST /organizations/:organizationId/webhook-events/:eventId/replay
- Re-encola a todos los endpoints activos (o a un solo endpoint internamente)
Tipos de eventos
Agrupados por familia de recurso. Consulta Webhooks en Profundidad → Tipos de Eventos para la descripción de cada evento y cuándo se dispara.
- Órdenes:
order.created,order.approved,order.processing,order.paid,order.completed,order.failed,order.expired,order.canceled,order.refunded,order.updated - Merchants:
merchant.created - KYB:
merchant.kyb.in_progress,merchant.kyb.approved,merchant.kyb.rejected - Invitaciones (se emiten para ambos
resourceType:invitationyorganization_invitation):invitation.created,invitation.accepted,invitation.expired,invitation.failed,invitation.assigned - Aprobaciones de políticas:
policy.approval.requested,policy.approval.received,policy.approval.approved,policy.approval.rejected - Ejecución de políticas (dinámica por tipo de recurso):
policy.order.executed,policy.account.executed,policy.deal.executed,policy.user_invite.executed,policy.passkey_enrollment.executed,policy.wallet_access_policy.executed,policy.policy.executed,policy.policy_rule.executed - Ingresos bancarios:
bank_income.received - Sistema:
webhook.ping
Sujeto a expansión; los cambios incompatibles se despliegan a través del campo version del payload.
Payload y headers
- Content type: application/json
- Estructura del body
{
"id": "evt_...",
"type": "order.paid",
"version": "v1",
"occurred_at": "2025-08-16T21:52:14.292Z",
"source": "koywe.api",
"environment": "production",
"organization_id": "org_...",
"merchant_id": "mrc_...",
"data": { /* específico por tipo */ },
"relationships": { "self": { "type": "order", "id": "ord_..." } }
}- Headers (enviados por Koywe):
- Koywe-Event-Id, Koywe-Event-Type, Koywe-Event-Version
- Koywe-Organization-Id, Koywe-Merchant-Id (si aplica)
- Koywe-Environment
- Koywe-Webhook-Id
- Koywe-Signature: HMAC-SHA256 (hex) sobre el body crudo de la solicitud usando el secreto de tu endpoint
- Koywe-Integrity-Signature: agregado por el servicio de entrega para proteger la integridad en tránsito
Environment es uno de: local | qa | sandbox | production.
Seguridad (verificación de firma)
- Calcula HMAC-SHA256 del body exacto de la solicitud usando tu secreto de endpoint guardado.
- Compara tu digest (hex) con Koywe-Signature. Si no coinciden, rechaza el webhook.
- Seguro contra replays: usa idempotencia por id de evento (el id es estable entre replays).
Pseudo-verificación mínima:
expected = hex(hmac_sha256(secret, raw_body))
if header["Koywe-Signature"] != expected: rejectComportamiento de entrega y reintentos
- Al crear un evento, Koywe persiste el evento y encola una entrega por cada endpoint activo.
- Cada entrega recibe un task id único; puedes consultar el estado resumido a través del endpoint de entregas.
- Si un endpoint falla, los demás endpoints aún reciben sus entregas.
- Puedes solicitar un replay para reenviar un evento.
Reglas de reintento:
- El timeout de la solicitud es de 30 segundos.
5xx,429, y errores de red / timeouts se reintentan con backoff. Al agotarse el presupuesto de reintentos, la entrega queda marcada comoFAILED.- Cualquier otro
4xx(400,401,403,404,422, …) es terminal: la entrega queda marcada comoFAILEDtras un único intento, sin reintento. Arregla el endpoint y usa el endpoint de replay para reenviar. - Devuelve
5xxsi quieres reintentos automáticos ante problemas transitorios aguas abajo. Devuelve429para señalar throttling — se trata como los demás errores transitorios (se reintenta con backoff) y puede igualmente quedar marcada comoFAILEDuna vez agotado el presupuesto de reintentos.
Mejores prácticas
- Responde 2xx rápidamente (< 5s); procesa asincrónicamente de tu lado.
- Valida Koywe-Signature en cada solicitud.
- Trata los webhooks como entrega al-menos-una-vez; deduplica usando el id del evento.
- Usa el endpoint de ping para verificar la conectividad después de configurar o rotar el secreto.
Permisos (ámbito de organización)
- organization_webhooks.manage: crear/actualizar/pausar/reanudar/eliminar/rotar
- organization_webhooks.view: listar/obtener endpoints
- organization_webhook_events.view: listar/obtener eventos, ver entregas
- organization_webhook_events.replay: reenviar eventos
Este resumen complementa la documentación OpenAPI con guía de uso, expectativas de seguridad y taxonomía de eventos.
Last updated on