Nacional IGAE — Ministerio de Hacienda

INVENTE — Inventario de Entes del Sector Público

Inventario oficial de las entidades del sector público institucional estatal, autonómico y local que mantiene la IGAE. API REST pública sin autenticación, con NIF, código DIR3 y forma jurídica de cada ente.

Ficha técnica

Formato
REST API (JSON) / SOAP (WSDL)
Registros
~4.800 entes vivos
Cobertura
Sector público institucional estatal, autonómico y local (entes vivos a fecha de consulta)
Actualización
Continua
Licencia
Reutilización libre (aviso legal del Ministerio de Hacienda)
Entidad
IGAE — Ministerio de Hacienda

Descripción

El Inventario de Entes del Sector Público (INVENTE) es el registro público que integra el Inventario del Sector Público Estatal, Autonómico y Local. La Ley 40/2015, de Régimen Jurídico del Sector Público, encarga su gestión y publicación a la Intervención General de la Administración del Estado (IGAE) en su artículo 82, y su funcionamiento se regula en el Real Decreto 749/2019. Recoge las entidades del sector público institucional: organismos autónomos, entidades públicas empresariales, consorcios, fundaciones, sociedades mercantiles, universidades públicas, agencias y autoridades administrativas independientes, entre otras formas jurídicas.

La IGAE ofrece una API REST pública, sin registro, que devuelve el inventario completo de entes vivos y permite buscar por NIF, código DIR3 o denominación. Cada ente tiene un código INVENTE estable (INV seguido de ocho dígitos), su NIF, su código DIR3 cuando lo tiene y su forma jurídica. La API incluye además una tabla maestra de formas jurídicas y otra de causas de alta, y sigue disponible el servicio SOAP anterior.

En contratación pública su utilidad principal es la normalización: permite cruzar el NIF o el DIR3 de un órgano de contratación que publica en PLACSP o en una plataforma autonómica con una entidad jurídica concreta, conocer su forma jurídica y agrupar las licitaciones de sociedades, consorcios y fundaciones públicas que aparecen con nombres distintos según la fuente. Hay que tener en cuenta que no incluye las administraciones territoriales (ministerios, consejerías o ayuntamientos), sino los entes dependientes o vinculados a ellas, y que algo más de 2.000 registros no tienen código DIR3. Para las unidades de las administraciones territoriales, el complemento es el directorio DIR3.

Estructura de datos

  • codigoInvente — Código único del ente en el inventario (INVxxxxxxxx)
  • nombre — Denominación oficial del ente
  • nif — NIF de la entidad
  • codigoDir3 — Código DIR3 (vacío en muchos entes)
  • tipoEnte — Código de forma jurídica (literal en /FormasJuridicas)
  • fechaAlta — Fecha de alta en el inventario
  • causaAlta — Causa del alta: nueva creación o incorporación (en la ficha individual)
  • DatosPostales — Vía y número del domicilio social (en la ficha individual)
  • FormaJuridica_Descripcion — Literal de la forma jurídica (en búsquedas con filtros)
  • codigoOrigen — Código del ente en el sistema de origen (en búsquedas con filtros)

Ejemplos de código

Buscar un ente por NIF o por código DIR3 curl
# Búsqueda por NIF
curl -s "https://www.pap.hacienda.gob.es/Invente2/api/EntidadesSPI_ConFiltros?nif=P4500036A" \
  -H "Accept: application/json" | python3 -m json.tool

# Búsqueda por código DIR3
curl -s "https://www.pap.hacienda.gob.es/Invente2/api/EntidadesSPI_ConFiltros?codDir3=EA0023191" \
  -H "Accept: application/json"

# Ficha completa a partir del código INVENTE
curl -s "https://www.pap.hacienda.gob.es/Invente2/api/EntidadesSPI/INV00000004" \
  -H "Accept: application/json"
Descargar el inventario completo a CSV python
import csv
import requests

BASE = 'https://www.pap.hacienda.gob.es/Invente2/api'
s = requests.Session()
s.headers.update({'Accept': 'application/json', 'User-Agent': 'Mozilla/5.0'})

# Tabla de formas jurídicas (tipoEnte -> literal)
formas = {f['id']: f['Descripcion'].strip()
          for f in s.get(f'{BASE}/FormasJuridicas', timeout=60).json()['FormasJuridicas']}

# Inventario completo del sector público institucional (entes vivos)
entes = s.get(f'{BASE}/EntidadesSPI', timeout=120).json()['EntidadesSPI']
print(len(entes), 'entes')

with open('invente.csv', 'w', newline='', encoding='utf-8') as fh:
    w = csv.writer(fh)
    w.writerow(['codigoInvente', 'nif', 'codigoDir3', 'nombre', 'formaJuridica', 'fechaAlta'])
    for e in entes:
        w.writerow([e['codigoInvente'], e['nif'], e['codigoDir3'], e['nombre'],
                    formas.get(e['tipoEnte'], e['tipoEnte']), e['fechaAlta']])