Saltar al contenido principal
Inicio / Sobre OpenMercantil / Metodología
Pipeline en producción Auditable · reproducible Open source-spirit
Versión 39 · 2026

Cómo procesamos los datos

Metodología de extracción

OpenMercantil convierte el Boletín Oficial del Registro Mercantil —publicado en PDF y XML por la Agencia Estatal BOE— en un dataset estructurado, versionado y consultable. Todo el pipeline es automático, reproducible y auditable: cualquier acto publicado puede trazarse hasta el PDF oficial del día en que se publicó. Ejecutamos el pipeline completo cada día hábil tras la publicación matinal del BORME.

Lenguaje principal
Python 3.12 + PHP 8.3
Frecuencia
Diaria · D+1 del BORME
Precisión CIF
>98%
Precisión nombre
>96%
Precisión tipo acto
>92%
Auditoría
Semanal manual

Etapa 01 · Ingesta diaria

Descarga automatizada desde el BOE.

Cada mañana, tras la publicación oficial (~08:00 CET), el pipeline se conecta a la API de datos abiertos del BOE y descarga tres artefactos clave:

A · Sumario XML

Sumario diario BORME

Índice de todos los actos publicados del día, con identificadores BORME-A-YYYY-NNN-NN y metadata estructural.

B · Documentos

PDFs + XMLs individuales

Documentos completos de las Secciones I (actos inscribibles) y II (anuncios legales), uno por acto.

C · Metadata

Metadatos estructurales

Provincia, sección, fecha oficial publicación. Conservados con SHA-256 para garantizar integridad e permitir reprocesamiento.

Etapa 02 · Parsing dual

Dos motores especializados trabajando en paralelo.

Cada documento del día pasa por dos parsers complementarios. Cuando el mismo acto aparece en ambas secciones, el validador cruzado concilia campos eligiendo el de mayor fiabilidad (XML > PDF).

Motor PDF (Sección I). Extrae texto plano con pdfplumber y aplica una batería de reglas regex + heurísticas tipadas para identificar: CIF (con validación de letra de control oficial AEAT), razón social, tipo de acto (constituciones, nombramientos, ceses, ampliaciones, fusiones, concursales, disoluciones, escisiones) y personas involucradas con su cargo normalizado.

Motor XML (Sección II). Procesa los anuncios legales estructurados directamente desde el XML oficial, donde los campos ya están etiquetados con schemas del BOE. Mucho más fiable que el PDF cuando está disponible.

Validador cruzado. Cuando un acto aparece en ambas fuentes, se comparan los campos extraídos. Discrepancias se loguean para auditoría manual semanal. Precisión actual medida en muestra estadística: >98% CIF, >96% razón social, >92% tipo de acto.

Etapa 03 · Normalización + enriquecimiento

Datos crudos → dataset consultable.

Tras el parsing, cada campo pasa por una pipeline de normalización determinista que garantiza consistencia + permite cruces multi-fuente.

CIFs Validados con algoritmo oficial AEAT letra de control · malformados descartados
Nombres empresa Mayúsculas / acentos / puntuación normalizados · slug SEO-friendly · alias históricos detectados
Personas Unificadas por nombre canónico + empresa + cargo · detección same-person across companies
Fechas Normalizadas a ISO-8601 · usamos fecha publicación BORME (no fecha acto interno)
Provincias Inferidas del Registro Mercantil competente que publicó el acto
CNAE Adscrito a empresa desde inscripción inicial o última reclasificación BORME

Etapa 04 · Generación de artefactos

Dataset estático particionado data-as-code.

En lugar de una base relacional clásica, producimos un dataset estático versionado que se sirve directamente desde disco/CDN. Filosofía data-as-code: cada release versionado, diffable, replicable.

Etapa 05 · Publicación y cache

Frontend PHP + cache multinivel.

El frontend lee directamente los JSON estáticos y pre-renderiza HTML cacheado en varios niveles. Sin base de datos relacional en producción → alta disponibilidad, coste marginal próximo a cero, latencia mínima.

Latencia objetivo: <100 ms para búsqueda, <200 ms para ficha de empresa, <300 ms para grafos persona. Medidas reales mejores en la mayoría de los casos por cache hit ratio CF + LiteSpeed > 90%.

Stack productivo: PHP 8.3 + SQLite (lectura-only para datos derivados pesados como facts BORME) + JSON estáticos para hot path + Cloudflare CDN + LiteSpeed cache + OPcache. Cero MySQL/Postgres.

Deploy atómico: nuevas versiones del dataset se suben con nombre temporal, se renombran atómicamente en producción tras smoke tests pasados → cero downtime, rollback en segundos si algo falla post-flight.

Garantía de origen

Trazabilidad al PDF oficial.

Cada acto listado en OpenMercantil conserva el identificador oficial BORME-A-YYYY-NNN-NN que enlaza al PDF original publicado por la Agencia Estatal BOE. Si detectas un error de extracción, puedes compararlo siempre con la fuente autoritativa.

Canal de rectificación: usa el canal oficial de rectificación · respondemos en <48h hábiles. Para ejercer derechos RGPD (rectificación, oposición, supresión) sobre datos personales, aquí.

Ver también: indicadores de calidad ↗ · trazabilidad por fuente ↗ · condiciones reutilización ↗.

Reconciliación entre fuentes

Matching cross-fuente: cómo cruzamos 90+ fuentes.

Cuando una empresa aparece en varias fuentes (por ejemplo BORME + CNMV + OEPM), OpenMercantil intenta reconciliar todas las menciones en una sola ficha. Esto se hace mediante tres estrategias en orden de fiabilidad.

Tres estrategias de matching

  1. Matching por identificador único (CIF / LEI) — fiabilidad alta. Cuando la fuente publica el CIF o el código LEI (Legal Entity Identifier), la asociación es directa y verificable.
  2. Matching por slug canónico — fiabilidad media-alta. El slug se construye por normalización de la razón social. Funciona bien para empresas con denominaciones distintivas.
  3. Matching por nombre fuzzy — fiabilidad media. Como último recurso, comparación textual normalizada. Resultados se filtran por volumen mínimo de actos (≥5 actos BORME) para descartar coincidencias falsas con empresas inactivas.

Limitaciones conocidas del matching

Reconocemos abiertamente las siguientes limitaciones técnicas:

  • Homonimia parcial: dos empresas con denominaciones similares en distintas provincias pueden generar ambigüedad. Mitigación: priorizamos la entidad con mayor volumen de actos publicados.
  • Empresas extranjeras sin CIF español: cobertura más débil porque sólo aparecen si tienen LEI o relación matriz/filial documentada con entidad española.
  • Empresas extintas o disueltas: pueden seguir apareciendo en menciones históricas. Se reflejan tal como están publicadas en la fuente original. Recomendamos verificar el estado actual en el Registro Mercantil competente.
  • Cambios de denominación social: si una empresa se ha renombrado, las menciones anteriores pueden quedar en una ficha distinta hasta que el match cruzado se actualice.
  • Matching binario, no probabilístico: una relación cross-fuente actualmente se establece como match = sí / no, sin scoring de confianza por relación. En el roadmap está la migración a un modelo de confianza por claim / evidencia (ver sección Roadmap técnico).

Cómo corregir un matching erróneo

Si detecta que una mención está mal asociada a su empresa (o a otra empresa), puede notificarlo en el canal de rectificación. Plazo de respuesta: 48-72 horas hábiles. Indique en el correo el slug afectado y la mención concreta.

Señal documental orientativa

Indicador documental — qué es y qué NO es.

OpenMercantil publica un Indicador documental (anteriormente denominado "Trust Score") en algunas fichas de empresa. Es una estimación algorítmica orientativa basada exclusivamente en señales documentales públicas:

  • Antigüedad registral y continuidad de actos BORME
  • Depósito de cuentas anuales
  • Capital social declarado y evolución
  • Propiedad industrial (marcas, patentes registradas)
  • Presencia en registros sectoriales oficiales (CNMV, AESA, etc.)
  • Sanciones administrativas publicadas (sentido negativo)
  • Concursos de acreedores publicados (sentido negativo)

⚠️ Importante: El Indicador documental NO es una calificación crediticia oficial, ni una recomendación financiera, ni sustituye un informe profesional de solvencia. Es una herramienta orientativa basada únicamente en señales documentales públicas. Para decisiones financieras o de crédito, consultar profesionales acreditados.

Coincidencias en listas internacionales

Cuando una empresa coincide con una entrada en listas internacionales (OpenSanctions, ICIJ Offshore Leaks, etc.), OpenMercantil lo refleja pero con disclaimers explícitos en la ficha:

  • Una coincidencia puede deberse a homonimia (mismo nombre, distinta entidad).
  • Una coincidencia puede deberse a coincidencia parcial de denominación.
  • Una coincidencia no implica per se infracción: hay que verificar la naturaleza del registro y el contexto en la fuente original.
  • Para validez jurídica, consultar la fuente oficial enlazada en cada hallazgo.

Algoritmo completo y ponderaciones del Indicador documental disponibles en /trust-score.

Transparencia técnica

Roadmap técnico: deudas que estamos resolviendo.

OpenMercantil reconoce abiertamente las siguientes deudas técnicas y trabaja activamente en resolverlas. Este apartado se actualiza trimestralmente.

  1. Modelo claim / evidence unificado: migrar de tablas-por-fuente a un modelo unificado con tupla (entity, predicate, value, source, source_date, observed_at, confidence, parser_version) para auditoría completa de cada dato.
  2. Confidence scoring por relación cross-fuente: hoy el matching es binario. El roadmap incluye un score de confianza por cada relación con evidencia documental específica.
  3. Identificadores múltiples como clave secundaria: LEI, MFI code, ISIN, EORI, GIIN para mejorar cobertura internacional y reconciliación con datasets externos.
  4. Versionado de parsers en base de datos: registrar la versión exacta del extractor en cada registro para permitir reproceso auditable y comparar resultados entre versiones.
  5. Tests automatizados: ampliación de cobertura de tests PHPUnit + pytest sobre parsers y helpers críticos, con datasets de regresión para cada fuente.

Si tiene preguntas técnicas, sugerencias o detecta una limitación no documentada, contacto en [email protected]. Las propuestas de mejora se valoran semanalmente.

Modelo unificado de trazabilidad

Modelo claim/evidence: cada dato responde a su evidencia.

Estructura adoptada en OpenMercantil para que cada afirmación tenga fuente, fecha, nivel de confianza y trazabilidad completa.

Por qué este modelo

Inicialmente, OpenMercantil indexaba los datos en tablas-por-fuente (sanctions_aepd_companies, cnmc_sanctions, sanciones_aepd, etc.). Esto funcionaba pero limitaba la auditoría: no había un identificador único por afirmación ni un historial de versiones.

Migramos progresivamente a un modelo unificado donde cada afirmación se representa como una tupla auditable.

Esquema del modelo

claims_evidence (
  id                       PK
  entity_type              'company' | 'person' | 'org'
  entity_slug              FK a /empresa/{slug} o /persona/{slug}
  entity_name              denormalized para display
  claim_id                 UUID único
  predicate                e.g. 'sanctioned_by_aepd', 'awarded_contract'
  value                    string normalizado
  value_extra              JSON adicional opcional
  source_name              'AEPD', 'BORME', 'CNMV', ...
  source_url               URL oficial
  source_publication_date  YYYY-MM-DD
  observed_at              cuándo lo observó OpenMercantil
  confidence               'high' | 'medium' | 'low' | 'experimental'
  raw_text_hash            sha256 del texto fuente
  parser_version           ej. 'aepd-v2.1'
  normalized_value         post-normalización OpenMercantil
  interpretation           'official' | 'derived' | 'inferred'
  status                   'active' | 'superseded' | 'corrected' | 'disputed'
)

Beneficios

  • Trazabilidad completa: cada dato responde a "qué fuente lo respalda, cuándo se publicó, cuándo lo observamos, qué confianza tiene".
  • Versionado: las correcciones generan un nuevo claim con status=superseded en el viejo.
  • Confidence scoring real: matching fuzzy con score < 0.85 se marca confidence='low' explícito.
  • Auditabilidad: el raw_text_hash permite detectar cambios en la fuente original.
  • Reproceso: cambios en el parser quedan trazados con parser_version.

Estado actual

Tabla claims_evidence creada en BD standalone artifacts/claims_evidence.sqlite con seeding inicial de 3 ejemplos AEPD para validar el esquema. Helpers PHP disponibles:

  • openmercantil_get_company_claims($slug, $predicate, $limit)
  • openmercantil_get_claims_stats()

Roadmap de migración (incremental, sin breaking):

  1. Fase 1 — POC con sanciones AEPD (3 ejemplos seeded).
  2. Fase 2 — Migración completa AEPD (todas las sanciones).
  3. Fase 3 — Sanciones CNMC + ESMA + AEAT morosos.
  4. Fase 4 — Contratación pública PLACSP + TED EU.
  5. Fase 5 — Subvenciones BDNS + CORDIS.
  6. Fase 6 — Marcas/Patentes OEPM + EUIPO + EPO/WIPO.
  7. Fase 7+ — Resto fuentes (gradualmente).

Durante el período migratorio, los datos legacy seguirán visibles desde sus tablas originales. El frontend mostrará indicadores cuando un dato proceda del modelo nuevo vs legacy.

Sprint Integración 2026 Q2

Metodología por fuente nueva integrada

Las siguientes fuentes se incorporan progresivamente durante 2026 (mayo-junio). Cada una sigue el modelo de trazabilidad: tabla SQLite dedicada, migration aditiva (sin breaking), match key explícito (CIF/NIF), cobertura progresiva con disclaimer cuando no hay datos para una empresa concreta.

RGSEAA — Registro General Sanitario de Empresas Alimentarias

  • Fuente: AESAN (Agencia Española de Seguridad Alimentaria y Nutrición)
  • Formato: bulk XLSX descarga directa
  • Frecuencia: refresh mensual
  • Match: CIF nativo cruzado con companies.cif
  • Volumen: ~600-800k inscripciones · yield estimado 400-500k CIFs nuevos
  • Base legal: RD 191/2011

INVENTE — Inventario Sector Público

  • Fuente: IGAE (Intervención General Administración Estado)
  • Formato: REST API pública (desde abril 2024)
  • Match: NIF + código DIR3
  • Volumen: ~4.787 entes (AGE + CCAA + EELL + universidades + empresas públicas)
  • Base legal: Ley 40/2015, art. 81

AICA Contratos LCA — Cadena Alimentaria

  • Fuente: AICA (MAPA)
  • Frecuencia: D+1 (declaración obligatoria mes desde firma)
  • Match: NIF de comprador + NIF de proveedor (ambos extremos)
  • Volumen: ~200k+ relaciones B2B verificadas
  • Base legal: Ley 16/2021 (obligatorio desde 30/06/2023)
  • Único en mercado: capa grafo B2B verificada sin alternativa pública equivalente

DataInvex — Inversión Extranjera Directa (FDI)

  • Fuente: DGCOMINVER (Min. Industria, Comercio y Turismo)
  • Frecuencia: anual con desglose trimestral
  • Match: CIF nativo
  • Volumen: ~15k operaciones con país inversor identificado
  • Base legal: Reg. UE 2019/452 + Ley 19/2003

PLACSP — Plataforma Contratación Sector Público

  • Fuente: Ministerio de Hacienda
  • Formato: feed ATOM oficial sindicacion_643 en CODICE 2.07
  • Frecuencia: D+1 (publicación diaria)
  • Match: NIF de adjudicatario + NIF de organismo licitador
  • Volumen: ~50k licitaciones/año (~750k histórico desde 2009)
  • Base legal: LCSP 9/2017, art. 347

OEPM Open Data — Propiedad Industrial

  • Fuente: OEPM (sede.oepm.gob.es/eSede/datos)
  • Formato: CSV + XML WIPO ST.96 — sin reCAPTCHA
  • Match: NIF/CIF titular
  • Volumen: ~3M registros históricos (marcas + patentes + modelos + diseños)

AEPD — Backfill resoluciones

  • Fuente: Agencia Española de Protección de Datos
  • Formato: PDFs públicos URLs predecibles (aepd.es/documento/PS-XXXXX-YYYY.pdf)
  • Match: CIF/NIF extraído del texto PDF (regex + validador Luhn)
  • Volumen: 46.636 resoluciones backfill histórico (€350M sanciones)
  • Modelo: claim/evidence en claims_evidence.sqlite
  • Lenguaje: "resolución sancionadora publicada" (no "sancionado")

FROB — Rescates banca + Sareb

  • Fuente: FROB
  • Frecuencia: histórico estable (2009-2017) + Sareb continuada
  • Match: CIF
  • Volumen: ~11 entidades históricas, €58.6B agregado
  • Base legal: Ley 11/2015 (transposición BRRD UE 2014/59)

AEAT — Lista deudores tributarios

  • Fuente: AEAT
  • Formato: PDF oficial anual publicado en junio
  • Match: CIF/NIF — sólo personas jurídicas tienen ficha pública
  • Volumen 2024: 5.997 deudores publicados, €16.138B
  • Base legal: art. 95.bis LGT 58/2003 + Ley 34/2015
  • Disclaimer: la inclusión no equivale a sentencia firme; la deuda puede haber sido satisfecha, aplazada o recurrida tras la publicación

Patrón común: todas las nuevas integraciones siguen el modelo additive (CREATE TABLE IF NOT EXISTS · ALTER TABLE · INSERT OR IGNORE) garantizando cero breaking changes en producción. Las fichas sin coincidencia documental muestran un bloque elegante "Datos aún no disponibles en fuentes procesadas" en lugar de filas vacías, reflejando limitación documental y no ficha incompleta.