---
title: "Firmografía de empresas constituidas por código CNAE (BORME)"
method: GET
path: "/empresas/{cnae}"
tags: ["Fiscal"]
---

# Firmografía de empresas constituidas por código CNAE (BORME)

`GET /empresas/{cnae}`

Devuelve estadísticas de constitución de empresas (BORME) para un código CNAE 2025: recuento total, capital medio/mediano, tendencia mensual y provincias — datos agregados a nivel de empresa (Ley 37/2007), sin datos personales. El parámetro de ruta `cnae` es obligatorio. Con clave gratuita los agregados se devuelven íntegros, pero la lista de constituciones recientes se limita a 3 con campos básicos (`denominacion`, `provincia`) — `provincia`/`desde`/`hasta` se ignoran silenciosamente en este plan. Con plan Profesional o superior se honran `limit` (máx. 100), `offset` y los filtros `provincia`/`desde`/`hasta`, y cada empresa incluye `capital_eur`, `published_at`, `cnae_primary`, `anuncio` (enlace directo al PDF oficial del BORME en boe.es, más año/número de boletín/código de provincia INE) y `datos_registrales` (tomo/folio/sección/hoja/inscripción/fecha registrales de la empresa); `_meta.filters` confirma los filtros aplicados. `stats` NUNCA se filtra ni se pagina — siempre refleja el CNAE completo. La paginación de `recent` es siempre nativa de base de datos (`.range()`), con o sin filtros activos.

## Path parameters

- `cnae` string, required

## Query parameters

- `limit` integer
- `offset` integer
- `provincia` string
- `desde` string, date
- `hasta` string, date

## Response `200`

Firmografía de empresas para el código CNAE

- EmpresasResponse — Firmografía BORME por CNAE. Los agregados (recuento, capital, tendencia, provincias) son libres; la forma de cada elemento de `firmographics.recent` depende del plan — ver BormeRecentTeaser (Free) y BormeRecentFull (Profesional+).
  - `cnae` string — Código CNAE consultado, tal y como se envió.
  - `firmographics` EmpresasFirmographics
    - `code` string
    - `total_count` integer
    - `capital_avg` number, nullable
    - `capital_median` number, nullable
    - `first_published` string, nullable
    - `last_published` string, nullable
    - `monthly` object[]
      - `month` string
      - `count` integer
    - `top_provincias` object[]
      - `provincia` string
      - `count` integer
    - `recent` union[]
      - union
        - BormeRecentTeaser — Proyección básica de una constitución reciente (plan Free) — máx. 3 filas.
          - `denominacion` string
          - `provincia` string, nullable
        - BormeRecentFull — Proyección completa de una constitución reciente (plan Profesional o superior).
          - `denominacion` string
          - `provincia` string, nullable
          - `capital_eur` number, nullable
          - `published_at` string, nullable
          - `cnae_primary` string, nullable
          - `anuncio` EmpresasAnuncio, nullable — Enlace directo al anuncio BORME oficial en boe.es, más el identificador BORME descompuesto. `null` cuando el identificador de origen no tiene el formato esperado.
            - `identificador_borme` string — Identificador de publicación BORME tal cual, formato BORME-A-{año}-{nº boletín}-{cód. provincia INE}.
            - `anio` integer
            - `numero_boletin` integer — Número del boletín BORME-A de ese día.
            - `codigo_provincia` integer — Código de provincia del INE (01–52) que identifica la sección provincial del BORME-A de ese día en la que se publicó el anuncio de esta empresa (12 = Castellón/Castelló). No es un número de página: `pdf_url` apunta al PDF de esa sección provincial. El valor 99 corresponde al índice alfabético de sociedades del día.
            - `pdf_url` string, nullable — URL directa al PDF oficial en boe.es. `null` cuando `published_at` falta o no es una fecha ISO válida, aunque el resto del objeto `anuncio` sí exista porque el identificador se pudo parsear.
          - `datos_registrales` EmpresasDatosRegistrales, nullable — Datos registrales de la empresa (tomo/folio/sección/hoja/inscripción/fecha) — identidad registral de la empresa, no datos personales. Cualquiera de los seis campos puede ser `null` cuando esa clave no está presente en el registro de origen (o su valor no es una cadena en el jsonb original de BORME) — tomo/folio lo son con frecuencia en inscripciones recientes según la fuente. Además, el objeto completo solo se rellena para los anuncios publicados a partir de la fecha de despliegue (2026-08-24): no hay carga retroactiva, así que las empresas históricas devuelven `datos_registrales: null` de forma permanente y al paginar hacia atrás en `recent` (ordenado por `published_at` descendente) verás páginas enteras a `null` — es el comportamiento esperado, no un fallo.
            - `tomo` string, nullable
            - `folio` string, nullable
            - `seccion` string, nullable
            - `hoja` string, nullable
            - `inscripcion` string, nullable
            - `fecha` string, nullable
  - `_meta` EmpresasMeta — Metadatos del envelope para endpoints con clave: plan actual, cuota restante y nudge de upgrade (solo plan Free al ≥80% de cuota).
    - `plan` string, required — Plan de la clave (free, profesional, empresa, enterprise).
    - `remaining` integer, required — Peticiones restantes de la cuota diaria.
    - `upgrade_hint` string — Mensaje legible de upgrade. Presente solo en plan Free al consumir ≥80% de la cuota.
    - `upgrade` UpgradeMeta — Forma estructurada del nudge de upgrade para renderizar UI nativa. Presente solo en plan Free al ≥80% de cuota.
      - `hint` string
      - `url` string, uri
      - `current_plan` string
      - `recommended_plan` object
        - `id` string
        - `label` string
        - `daily_limit` integer
        - `monthly_price_eur` integer
      - `daily_limit_after` integer
      - `price_eur_monthly` integer
    - `count` integer — Número de constituciones recientes devueltas en esta página.
    - `note` string, nullable — Presente solo en plan Free — explica el tope de 3 filas y los campos básicos.
    - `offset` integer, nullable — Presente solo en plan Profesional o superior — el offset efectivamente aplicado.
    - `filters` EmpresasAppliedFilters, nullable — Presente solo en plan Profesional o superior y solo cuando se aplicó al menos un filtro — confirma los filtros de provincia/fecha efectivamente aplicados (provincia normalizada, no el slug enviado).
      - `provincia` string, nullable
      - `desde` string, nullable
      - `hasta` string, nullable

## Other responses

- `400` — Petición inválida (parámetro o cuerpo mal formado).
- `401` — Falta la cabecera `X-API-Key` o la clave es inválida/desactivada.
- `429` — Límite de cuota diaria o de ráfaga superado. La cabecera `Retry-After` indica los segundos hasta poder reintentar.
- `500` — Error interno del servidor.

## Changes

- **2026-08-25** `2f9842f5e11b` — 2 info
  - added the optional property `firmographics/recent/items/oneOf[#/components/schemas/BormeRecentFull]/anuncio` to the response with the `200` status
  - added the optional property `firmographics/recent/items/oneOf[#/components/schemas/BormeRecentFull]/datos_registrales` to the response with the `200` status
- **2026-08-24** `711fcb628273` — 4 info
  - added the new optional `query` request parameter `desde`
  - added the new optional `query` request parameter `hasta`
  - added the new optional `query` request parameter `provincia`
  - added the optional property `_meta/allOf[subschema #2]/filters` to the response with the `200` status

[Change history](https://skmtc.dev/conversoriaecnae/apis/conversor-iae-cnae-api/changes/empresas/:cnae/get.md)

---

[API](https://skmtc.dev/conversoriaecnae/apis/conversor-iae-cnae-api.md) · [All operations](https://skmtc.dev/conversoriaecnae/apis/conversor-iae-cnae-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/conversoriaecnae/conversor-iae-cnae-api/revisions/2f9842f5e11b/schema)
