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
# 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" 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']])