SCCS · DG SANTE · Safety Gate (RAPEX) · EUR-Lex

Vigilancia regulatoria UE multi-fuente, enriquecida con IA y entregada con webhooks firmados

Cada fuente regulatoria UE que afecta el compliance cosmético — monitoreada en paralelo, deduplicada, clasificada por analizadores IA específicos por fuente, y entregada a tu sistema el día que se publica. Sin PDFs, sin perseguir XLS, sin feeds RSS de SCCS que nadie lee.

Fuentes oficiales

Cuatro fuentes oficiales UE, monitoreadas continuamente

BD-API corre un motor de detección independiente por fuente. Cada motor consulta con su propio schedule, persiste cada evento por identificador estable y alimenta el pipeline downstream. Si una fuente está caída, las otras siguen funcionando — un circuit breaker aísla el fallo.

SCCS

Comité Científico de Seguridad de los Consumidores

https://health.ec.europa.eu/scientific-committees/scientific-committee-consumer-safety-sccs_en
Qué captura
Dictámenes científicos sobre sustancias cosméticas — preliminares, finales y adendas. Estos dictámenes son la señal upstream de cada futura restricción en los Anexos II–VI.
Frecuencia
Irregular pero crítica

Ejemplo: un dictamen SCCS final que reduce la concentración segura de un filtro UV — el disparador de un eventual reglamento modificativo.

DG SANTE

Dirección General de Salud y Seguridad Alimentaria

https://health.ec.europa.eu/cosmetics_en
Qué captura
Guías, position papers y comunicaciones del servicio de la Comisión UE responsable de la política cosmética. Instrucciones operativas, no actos legales.
Frecuencia
Regular

Ejemplo: una guía actualizada de envío a CPNP que afecta cómo declaran nanomateriales las Personas Responsables.

Safety Gate

Safety Gate (antiguamente RAPEX)

https://ec.europa.eu/safety-gate-alerts/screen/webReport
Qué captura
Alertas a nivel UE sobre productos no alimentarios peligrosos — incluidos cosméticos — retirados o recuperados por una autoridad de un Estado miembro. Marca, lote y sustancia son públicos.
Frecuencia
Semanal

Ejemplo: una crema leave-on retirada en España por una sustancia no declarada restringida por el Anexo II.

EUR-Lex

EUR-Lex — Diario Oficial de la UE

https://eur-lex.europa.eu/
Qué captura
Actos legales: reglamentos modificativos, decisiones de aplicación, reglamentos de la Comisión que mueven ingredientes entre Anexos. Capturados mediante consultas SPARQL al portal oficial.
Frecuencia
Variable — urgente cuando se publica

Ejemplo: un reglamento de la Comisión que modifica el Anexo III para añadir una nueva concentración máxima a un conservante.

Cada fuente alimenta el mismo pipeline downstream — ver la arquitectura debajo para cómo la detección se vuelve un webhook firmado.

Arquitectura

Cómo funciona la vigilancia

Detrás de cada alerta corre un pipeline de cinco etapas. Cada etapa es independiente, observable y reentrante — las re-ejecuciones no generan duplicados, los fallos se aíslan a una sola fuente y el registro de dispatch deja constancia de cada paso.

  1. 01

    Detectar

    Cuatro motores dedicados — uno por fuente — consultan en schedules CRON configurables. La concurrencia se garantiza con un advisory lock de PostgreSQL para que dos instancias del servicio sobre la misma base nunca compitan.

  2. 02

    Deduplicar

    Cada evento se persiste por un identificador estable (node_id para feeds Drupal, URI ELI/CELEX para EUR-Lex). Las re-ejecuciones sobre la misma ventana nunca crean duplicados; se actualiza, no se duplica.

  3. 03

    Analizar

    Un analizador IA específico por fuente lee la publicación cruda y extrae sustancias, números CAS, códigos EINECS, Anexos afectados y fechas críticas en JSON estructurado. El texto original se conserva al lado.

  4. 04

    Clasificar

    La criticidad y el tipo de evento se asignan por fuente — retiros Safety Gate, dictámenes SCCS finales y reglamentos modificativos EUR-Lex se enrutan distinto. Las reglas de suscripción filtran lo que recibe cada cliente.

  5. 05

    Entregar

    Dispatches por cliente y por canal: webhooks firmados HMAC-SHA256 y email transaccional. Los fallos se reintentan con exponential backoff; los fallos persistentes quedan en el log de dispatch para revisión.

Envoltura de resiliencia

Dos ticks CRON corren en paralelo — el schedule principal y un tick de retry cada 5 minutos que recoge los dispatches fallidos. Un circuit breaker se abre por fuente tras fallos transitorios consecutivos y prueba luego con un cooldown adaptativo que se duplica en cada prueba fallida. Las corridas huérfanas de una instancia caída se recuperan en el arranque antes de que los schedulers vuelvan a operar.

Enriquecimiento con IA

Qué hace en realidad el analizador IA

Para cada evento capturado, un analizador específico por fuente extrae campos estructurados — sustancias, números CAS, Anexos afectados, fechas críticas — y produce un resumen ejecutivo breve. La publicación cruda siempre se conserva junto al payload enriquecido. El analizador no interpreta regulación; esa decisión queda en tu equipo cualificado.

Input crudo — dictamen SCCS (extracto)

SCCS/1657/23
Dictamen Final sobre Sustancia X (CAS 12345-67-8 / EINECS 234-567-8) en productos cosméticos.

El SCCS considera que el uso de Sustancia X como filtro UV es seguro hasta una
concentración máxima de 2,0% en productos leave-on y 0,5% en productos
rinse-off, con la excepción de aplicaciones en spray donde no puede excluirse
la exposición por inhalación.

Se invita a los Estados miembro a considerar estas conclusiones al revisar las
restricciones del Anexo VI del Reglamento (CE) n.º 1223/2009. El Dictamen
queda disponible para adopción desde el 14 de marzo de 2026.

Output enriquecido — JSON estructurado

{
  "source": "SCCS",
  "event_type": "final_opinion",
  "reference": "SCCS/1657/23",
  "substances": [
    {
      "name": "Sustancia X",
      "cas": "12345-67-8",
      "einecs": "234-567-8"
    }
  ],
  "affected_annexes": ["VI"],
  "restrictions": {
    "leave_on_max_concentration": "2.0%",
    "rinse_off_max_concentration": "0.5%",
    "excluded_applications": ["spray"]
  },
  "critical_dates": {
    "opinion_adopted": "2026-03-14"
  },
  "executive_summary": "Dictamen SCCS final: Sustancia X segura como filtro UV hasta 2,0% leave-on y 0,5% rinse-off, salvo aplicaciones en spray. Estados miembro invitados a revisar restricciones del Anexo VI.",
  "raw_url": "https://health.ec.europa.eu/.../sccs_o_..."
}

Qué extrae

  • Nombres de sustancias, números CAS, códigos EINECS
  • Anexos afectados (II, III, IV, V, VI del Reglamento (CE) 1223/2009)
  • Fechas críticas: adopción, entrada en vigor, períodos transitorios
  • Tipo de evento por fuente (dictamen final / preliminar, retiro, acto modificativo)
  • Resumen ejecutivo en lenguaje claro

Qué no hace

  • Interpretación regulatoria ni asesoramiento legal
  • Veredictos de compliance sobre tus formulaciones específicas
  • Evaluación de seguridad — la persona cualificada se mantiene en el loop
  • Aplicación automática de cambios a tu baseline CosIng

Fallback a formato crudo

Si la IA no está disponible o expira el timeout, la alerta llega en formato crudo — tu equipo nunca se pierde un evento. El log de dispatch registra el enriquecimiento ausente para poder re-analizar después si hace falta.

Entrega

Webhooks firmados, reintentos, evidencia

La entrega es la parte que casi todos los feeds regulatorios saltean. BD-API trata cada dispatch como un artefacto auditable — firmado, reintentado, persistido con estado y latencia. Si un regulador pregunta qué sabías y cuándo, el log de dispatch responde.

01

Firma

Cada webhook se firma con HMAC-SHA256 usando un secreto compartido que configurás por instalación. La firma viaja en el header X-BDAPI-Signature. Tu endpoint recalcula el HMAC sobre el body crudo y compara — si no matchea, se rechaza.

POST /webhooks/bdapi
Content-Type: application/json
X-BDAPI-Signature: sha256=8f4b9d...e2

{ "event": "sccs.final_opinion", ... }
02

Política de reintentos

Tres intentos con exponential backoff — 1s, 2s, 4s. Si los tres fallan, el dispatch queda marcado como failed pero reentrant: el próximo tick CRON lo vuelve a tomar mientras retry_count < 3. Después de eso, queda loggeado para review manual.

intento 1 → fail (timeout)
+1s
intento 2 → fail (5xx)
+2s
intento 3 → fail (5xx)
status = failed, retriable = true
03

Resiliencia

Un circuit breaker se aplica por fuente. Tras un umbral de fallos transitorios consecutivos el breaker se abre y omite esa fuente en los próximos ticks. Una prueba corre tras un cooldown adaptativo que se duplica en cada prueba fallida, con tope configurable. Las otras fuentes siguen funcionando mientras tanto.

state: CLOSED   (normal)
state: OPEN     (omite ticks)
state: HALF_OPEN (prueba, cooldown × 2 si falla)
04

Evidencia

Cada dispatch se persiste como (publication_id, client_id, channel) con estado, latencia, error y timestamps. Trazabilidad de auditoría de cada alerta despachada — legible desde el panel de admin o consultable vía API.

bdapi_publication_dispatches
  publication_id, client_id, channel
  status, retry_count, last_error
  sent_at, latency_ms

Guía de implementación

verificar firmas de webhook en Node y Python — ejemplos completos con comparación HMAC y checks timing-safe.

Modelo de suscripción

Suscribite solo a las fuentes que importan a tu portfolio

Cada cliente elige qué motores escuchar. Las suscripciones se actualizan en vivo vía /api/settings/* — sin reiniciar el servicio, sin redeploy. Arrancá con una fuente y sumá las otras a medida que tu portfolio crezca.

Configuraciones de suscripción

ConfiguraciónSCCSDG SANTESafety GateEUR-LexTier
Solo SCCSPremium
Solo Safety GatePremium
Solo EUR-LexPremium
Las cuatro (default)Premium

Tres perfiles de suscripción, sacados de portfolios reales

Formulador de hair care

Safety Gate + EUR-Lex Anexo III/V

Las marcas de hair care sienten primero los cambios de restricción sobre conservantes e intermedios de tintura. Safety Gate marca retiros en el segmento; EUR-Lex sigue las enmiendas a Anexo III y Anexo V. El ruido SCCS sobre sustancias no relacionadas queda afuera.

Marca de protectores solares

SCCS filtros UV + EUR-Lex Anexo VI

Los filtros UV viven en el Anexo VI y se mueven solo tras un dictamen SCCS. Una suscripción enfocada cubre esos dos canales y atrapa futuras restricciones mucho antes de que aparezcan en el escritorio del formulador.

Portfolio de cobertura total

Las cuatro fuentes

Los portfolios multi-segmento — masstige, prestige, dermo — necesitan cada señal. La configuración Premium por defecto entrega las cuatro con criticidad por fuente para que el triage siga siendo manejable.

Los cambios de suscripción los recoge el próximo tick CRON vía la re-lectura de bdapi_settings — no hace falta reiniciar.

Preguntas frecuentes

Preguntas sobre vigilancia regulatoria multi-fuente

¿Qué fuentes monitorea BD-API en la vigilancia regulatoria?+

Cuatro fuentes oficiales UE: dictámenes SCCS (Comité Científico de Seguridad de los Consumidores), comunicaciones DG SANTE, retiros de productos cosméticos de Safety Gate (antiguamente RAPEX) y actos legales EUR-Lex capturados vía SPARQL. Las cuatro corren con schedules independientes y circuit breakers — si una fuente está caída, las otras siguen. Playbook práctico para monitorizar cada fuente UE →

¿Qué hace el analizador IA, y la alerta queda demorada esperándolo?+

El analizador IA específico por fuente extrae sustancias, CAS, Anexos afectados y fechas críticas de la publicación cruda, produciendo un JSON estructurado junto al texto original. Si la IA no está disponible o expira el timeout, la alerta llega en formato crudo — tu equipo recibe la notificación igual, solo sin enriquecimiento.

¿Cómo se firma el webhook?+

Cada webhook se firma con HMAC-SHA256 usando un secreto compartido que configurás por instalación. La firma viaja en el header X-BDAPI-Signature. Tu endpoint receptor computa el mismo HMAC sobre el payload y compara — si no matchea, rechazás la request. Guía de verificación HMAC de 5 minutos para Node, Python y PHP →

¿Cuál es la política de retry si mi endpoint está caído?+

Tres intentos con exponential backoff: 1s, 2s, 4s. Si los tres fallan, el dispatch queda marcado como failed pero reintentable en el próximo tick CRON siempre que retry_count < 3. Después de eso, el dispatch queda loggeado para review manual.

¿Puedo suscribirme a una sola fuente sin las otras?+

Sí — es el modelo de suscripción granular. Cada cliente elige qué motores escuchar. Podés arrancar solo con Safety Gate, sumar SCCS después, y combinar fuentes como te convenga. Los cambios de suscripción vía /api/settings/* re-leen la config sin reiniciar el servicio. Por qué importa la suscripción fuente por fuente →

¿La vigilancia regulatoria reemplaza al evaluador de seguridad o la Persona Responsable?+

No. BD-API entrega datos regulatorios estructurados — sustancias, CAS, fechas, fuentes, pruebas de integridad. La interpretación regulatoria final, la evaluación de seguridad y la decisión legal de la Persona Responsable quedan en tu equipo cualificado. Dónde empieza y dónde termina el rol de Persona Responsable →

¿Cada cuánto debería revisar Safety Gate para alertas cosméticas?+

Safety Gate (antes RAPEX) publica boletines semanales, pero las retiradas se cargan de forma asíncrona a lo largo de la semana. Una revisión manual semanal capta el boletín; las consultas diarias captan las retiradas antes, lo que importa cuando un producto competidor de tu categoría es retirado — vuestra cadena de aprovisionamiento puede solaparse. BD-API consulta Safety Gate a diario por defecto y empuja solo las entradas relevantes para cosmética a tu webhook, así nunca gastas tiempo filtrando el feed. Qué es Safety Gate y por qué los equipos cosméticos deben mirarlo →

¿Puedo suscribirme solo a Safety Gate, sin SCCS ni EUR-Lex?+

Sí. La suscripción granular funciona a nivel por fuente: cada license key declara qué motores escucha, y la configuración se re-lee sin reiniciar el servicio. Activar solo Safety Gate tiene sentido para equipos que ya tienen flujos separados para dictámenes SCCS y actos EUR-Lex, o que solo necesitan inteligencia de retiradas — por ejemplo, marketplaces validando listings de terceros contra retiradas activas. Por qué Safety Gate es el punto de partida correcto para muchos equipos →

¿Listo para dejar de perseguir actualizaciones regulatorias?

Solicitar acceso