Payload del webhook
Qué llega a tu endpoint
Cada evento es un POST JSON con headers de atestación. EC Publications y el subsistema Regulatory Watch (SCCS, Safety Gate, EUR-Lex — mostrado abajo) comparten el mismo namespace de headers X-BDAPI-*; se distinguen por el valor de X-BDAPI-Event (por ejemplo `ec.publication.detected` vs `watch.safety_gate.alert.analyzed`). El body es el documento canónico del evento, incluyendo análisis enriquecido con IA cuando esté disponible. Las fallas de tu lado (5xx, timeout) disparan la política de reintentos automáticamente.
Payload de ejemplo — alerta Safety Gate (subsistema Watch)
{
"event": "watch.safety_gate.alert.analyzed",
"event_id": "01HQZK9YBV-7M8K-3R2N-0P4S-5T6U7V8W9X0Y",
"source_engine": "safety_gate",
"source_id": 12345,
"tier": "premium",
"timestamp": "2026-05-15T08:32:11.000Z",
"item": {
"alert_number": "A12/01234/26",
"report_id": "12345",
"product_name": "Cosmetic moisturiser, brand X",
"brand": "Brand X",
"risk_type": "Chemical",
"risk_level": "serious",
"notifying_country": "DE",
"country_of_origin": "CN",
"source_url": "https://ec.europa.eu/safety-gate-alerts/screen/webReport/alertDetail/12345",
"published_at": "2026-05-15T00:00:00Z",
"detected_at": "2026-05-15T08:00:00Z"
},
"analysis": {
"criticality": "CRITICAL",
"summary_es": "Notificación A12/01234/26: producto leave-on excede el límite Annex V de MIT (0.0015 %). Estado miembro notificante: Alemania. Sin período de transición — retirada recomendada para SKUs afectados.",
"risk_assessment": "Concentración de MIT detectada por encima del límite regulatorio en formulación de aplicación prolongada.",
"regulatory_implications": "Annex V entry 57 — MIT prohibido en leave-on desde el Reglamento (UE) 2017/1224.",
"cross_market_relevance": "Relevante para los 27 EM. Producto en e-commerce paneuropeo.",
"recommended_action_for_brand_owners": "Auditar fórmulas, retirar lotes afectados, notificar PCPC nacional.",
"needs_human_review": false,
"confidence": 0.92,
"model": "claude-sonnet-4-5"
}
}
Payload de ejemplo — acto EUR-Lex (subsistema Watch)
{
"event": "watch.eurlex.act.analyzed",
"event_id": "01HQZM4P7R-2K9D-4N8T-1B6S-7C0V9W2X3Y4Z",
"source_engine": "eurlex",
"source_id": 4821,
"tier": "premium",
"timestamp": "2026-05-20T06:15:42.000Z",
"item": {
"id": 4821,
"celex_number": "32026R0712",
"title": "Commission Regulation (EU) 2026/712 amending Annex V to Regulation (EC) No 1223/2009 as regards the maximum concentration of a preservative",
"act_type": "regulation",
"date_document": "2026-05-18",
"eli_uri": null,
"source_url": "https://eur-lex.europa.eu/legal-content/EN/TXT/?uri=CELEX:32026R0712",
"detected_at": "2026-05-20T06:00:00Z"
},
"analysis": {
"criticality": "HIGH",
"summary_es": "Reglamento (UE) 2026/712: modifica el Anexo V para reducir la concentración máxima de benzoato de sodio en productos leave-on. Período de transición hasta el 01/12/2026. Revisar fórmulas con conservantes del Anexo V.",
"substances": [
{
"name": "Sodium benzoate",
"cas": "532-32-1",
"max_concentration": "2.5% (leave-on)",
"proposed_action": "restricted"
}
],
"key_dates": [
{ "type": "entry_into_force", "date": "2026-06-07" },
{ "type": "application_deadline", "date": "2026-12-01" }
],
"needs_human_review": false,
"confidence": 0.90,
"model": "claude-sonnet-4-5"
}
}
Ejemplo ilustrativo. El CELEX es el identificador estable usado para deduplicación y enlace a la fuente; eli_uri está reservado y hoy es null. Más allá de date_document, las sustancias afectadas, los números CAS y las fechas críticas (entrada en vigor, fecha de aplicación) se extraen del texto del acto y se entregan en el bloque analysis — key_dates y substances.
Request HTTP completo (headers + extracto del body)
POST /webhooks/bdapi HTTP/1.1
Host: your-app.example
Content-Type: application/json
X-BDAPI-Event: watch.safety_gate.alert.analyzed
X-BDAPI-Timestamp: 1747297931
X-BDAPI-Signature: sha256=9f2c4d1e8a7b3f6c2e8d1a5b4c7e9f0a2b3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f
X-BDAPI-Delivery: 00000000-0000-0000-0000-000000000000
User-Agent: BDAPI-Watch/1.0 (+https://bdapi.app)
{ "event": "watch.safety_gate.alert.analyzed", "source_engine": "safety_gate", ... }
Headers de atestación — namespace unificado X-BDAPI-*
- X-BDAPI-Event
- Nombre completo del evento y el campo por el que ruteás. Formato: `watch.{engine}.{noun}.{type}` para Watch (ej. `watch.safety_gate.alert.analyzed`) o `ec.publication.detected` para EC Publications. El receiver debe ignorar tipos desconocidos y devolver 200.
- X-BDAPI-Timestamp
- Unix epoch en SEGUNDOS (no milisegundos, no ISO 8601). Usado para construir la firma. Rechazá requests más viejos que 5 minutos para defenderte de replay.
- X-BDAPI-Signature
- Digest hex HMAC-SHA256 de `timestamp + "." + body_crudo`, firmado con tu webhook secret. Formato: `sha256=<hex>`. ATENCIÓN: el string firmado es la concatenación, no el body solo.
- X-BDAPI-Delivery
- UUID v4 único por intento de delivery, enviado en los dispatches de Watch (no en EC Publications). Usalo como unique constraint en tu tabla inbound para que los reintentos sean no-ops. Replicado en `payload.event_id`.
Footgun
Nota: BD-API firma `timestamp + "." + body_crudo`, NO el body solo. Y firma los bytes crudos del body — si tu framework parsea JSON antes de exponer el body, capturá el payload crudo antes de parsear. Re-serializar y después hashear no va a matchear la firma. EC Publications y Watch usan los mismos headers X-BDAPI-Event / X-BDAPI-Timestamp / X-BDAPI-Signature y el mismo algoritmo — solo los dispatches de Watch agregan X-BDAPI-Delivery, y branchés según el valor de X-BDAPI-Event.