Como se encola
- Usa la cola `webhooks-queue` en `us-central1`.
- La task se nombra `webhook-{expedientId}-{integrationId}`.
- Si la task ya existe, se trata como exito por deduplicacion.
- El body base64 incluye `integrationId`, `payload` y `attempt`.
Modelo tecnico
Esta pagina describe como el backend decide emitir eventos, como compone payloads y que diferencias existen entre la ruta publica org-level y la via legacy por usuario.
Salida
| Canal | Eventos | Trigger | Transporte | Configuracion |
|---|---|---|---|---|
| Webhook org-level | `record.created`, `expedient.completed` | Firestore triggers | POST directo con `WebhookDispatcher` | organizations/{orgId} |
| Legacy user integrations | `expedient.completed` | `onExpedientWrite` + Cloud Tasks | Queue `webhooks-queue` + worker HTTP | users/{userId}/integrations/{integrationId} |
Evento 1
Este evento sale por el trigger `onRecordCreated` cuando se crea un documento de `records` dentro de una captura.
El trigger de `record.created` declara `failurePolicy: true` en el repositorio, por lo que el developer receptor debe tratar el evento como potencialmente reintentable.
Evento 2
Este evento se produce cuando un expediente pasa de estar procesando a quedar terminado sin error.
Compatibilidad
Esta ruta no es la superficie publica recomendada, pero sigue activa en el repositorio y hay que conocerla para no confundirse al leer logs o soporte historico.
Operacion
`Content-Type: application/json`, `User-Agent: Kapture-Webhooks/1.0`, `X-Kapture-Signature`, `X-Kapture-Event` y `X-Kapture-Timestamp`.
El worker usa `User-Agent: Kapture-Webhook-Bot/1.0` y permite `customHeaders` por integracion.
`WebhookDispatcher` usa 5 segundos. Si el destino tarda mas, el handoff se considera fallido.
En este repositorio solo `onRecordCreated` declara explicitamente `failurePolicy`. El trigger `onExpedientWrite` no expone una opcion de retry junto a su declaracion, asi que conviene verificar esa postura al nivel de despliegue antes de asumir simetria.
Codigo
backend/functions/src/services/WebhookDispatcher.ts
Soporte de eventos, resolucion de compatibilidad, firma y POST directo.
backend/functions/src/triggers/webhooks.ts
Trigger v1 que produce `record.created`.
backend/functions/src/triggers/expedients/onExpedientWrite.ts
Transicion de expediente terminado, sanitizacion y fanout.
backend/functions/src/services/TaskQueueService.ts
Encolado de la via legacy con nombre determinista de task.
backend/functions/src/workers/dispatchWebhook.ts
Worker HTTP de Cloud Tasks, envelope y clasificacion 4xx/5xx.
backend/functions/src/types/organization.ts
Contrato del webhook org-level dentro de la organizacion.