1. Crea una Fuente
Una Fuente es por donde entran cosas a Brein. Créala en Ajustes → Integraciones. Solo el dueño o un admin del espacio puede hacerlo. Al crearla ves dos cosas:- La dirección a la que envías:
https://api.trybrein.com/api/v1/door/<id de la Fuente>. - El secreto,
whsec_seguido de base64. Se muestra una sola vez. Guárdalo en tu gestor de secretos; nunca en un navegador ni en un repositorio.
2. Arma el evento
El cuerpo es un CloudEvent 1.0 en JSON, de hasta 256 KiB.data sí lleva correo y teléfono: es lo que identifica a la persona. Lo que Brein escribe después en sus propios eventos nunca los lleva.
3. Fírmalo y envíalo
Se firmawebhook-id, webhook-timestamp y el cuerpo, byte por byte como lo envías, con HMAC-SHA256. La llave es el secreto sin whsec_, decodificado de base64.
webhook-id: Brein lo reconoce y no duplica nada.
4. Lee la respuesta
Un
401 nunca dice si la Fuente existe. Durante 24 horas después de rotar el secreto, Brein acepta firmas con el secreto nuevo y con el anterior: puedes cambiarlo sin cortar el envío.
5. Qué pasa después
Cada envío es una Llegada con su recorrido. Las ves en la página de su Integración, en Ajustes → Integraciones, o con la herramientaarrival_read desde tu agente.
Nada se pierde sin dejar rastro: todo envío termina en uno de esos estados, y cada paso queda en el libro de eventos.
Fuentes de tipo webhook
Además del contrato firmado de arriba, una Fuente puede ser de tipo webhook: recibe el aviso de cualquier herramienta tal como lo manda, sin CloudEvent, y un mapeo que la persona confirma dice qué campo es cada cosa. Es lo que usan las Integraciones. Se crean con POST https://api.trybrein.com/api/v1/workspaces/<slug>/door/sources, con type: "webhook" y, si quieres, una template (calcom, calendly, stripe, tally, typeform, jotform, webflow, shopify, hotmart, clerk o posthog).
Cómo se verifica depende de la Fuente:
El cuerpo puede ser JSON,
application/x-www-form-urlencoded o multipart/form-data, hasta 256 KiB. Una firma o un token que no corresponden dan 401, igual que una Fuente que no existe. Las respuestas son las de la tabla de arriba, con estas diferencias:
202o200con{ "arrival": "<id>", "status": "unmapped" }cuando la Fuente aún no tiene mapeo: el aviso se guarda como ejemplo.200con{ "ignored": true, "reason": "unsupported_event" }cuando el tipo del aviso no es de los que el mapeo acepta. No se crea Llegada.- Un aviso con una lista de personas (un lote) responde
{ "arrivals": [ { "arrival", "status", "duplicate" } ], "ignored": <número> }, con una Llegada por elemento. - Un duplicado se reconoce por el id del aviso que el mapeo señala, o por una huella de su contenido.
El aviso crudo y el ejemplo se borran a los 30 días; sin ellos no hay de dónde reprocesar (
expired).
Prueba sin riesgo
Un espacio de prueba copia la estructura de tu espacio (Pipelines, Formularios y Fuentes) sin tus datos ni tus miembros. Ahí no se gastan créditos, no se envía correo, no se llama a proveedores y no se entrega nada a un Destino. Lo crea el dueño o un admin conPOST https://api.trybrein.com/api/v1/workspaces/<slug>/sandboxes; hay hasta cinco por espacio. La respuesta trae los secretos nuevos de sus Fuentes, una sola vez.
Dentro de un espacio de prueba puedes mandar una Llegada de ejemplo a cualquier Fuente sin firmar nada, con la herramienta arrival_send_test o con POST …/workspaces/<slug>/door/sources/<id>/test-arrivals y { "type": "contact.created" }.