Saltar al contenido
OpenMoney

API · versión 1.0

API de OpenMoney

Los mismos datos que enseña esta web, en JSON: contratos adjudicados, licitaciones en plazo, subvenciones concedidas y presupuestos liquidados por empresa, órgano de contratación, municipio y administración. Con una clave gratuita que se crea en tu cuenta.

EmpezarReferencia de rutasOpenAPI (JSON)

Empezar en tres pasos

  1. Crea una cuenta en openmoney.es/cuenta con tu correo: sin contraseña ni tarjeta, entras con el enlace que te enviamos.
  2. Crea una clave en la misma página («Claves de la API»). Empieza por om_ y se enseña una sola vez: cópiala. Puedes tener hasta tres activas y revocarlas cuando quieras.
  3. Llama a la API con la clave en la cabecera X-API-Key:
curl -H "X-API-Key: om_…" "https://api.openmoney.es/search?q=indra"
[
  {"tipo": "empresa", "id": "A28599033", "nombre": "INDRA SISTEMAS SA", "peso": 1843201377.6, "score": 0.98},
  {"tipo": "empresa", "id": "B84138296", "nombre": "INDRA BPO SLU", "peso": 3296999.98, "score": 0.77},
  {"tipo": "organo", "id": "E04973401", "nombre": "Subdirección General de Adquisiciones de Armamento y Material", "peso": 912004112.3, "score": 0.41}
]

La base es https://api.openmoney.es. Todo es GET, responde JSON en UTF-8 y va comprimido si mandas Accept-Encoding: gzip. No hay estado entre llamadas: cada petición se basta con su clave.

La clave

Toda ruta de datos pide la cabecera X-API-Key. Sin ella la respuesta es 401 con el motivo. Las únicas rutas libres son / (qué es esta API), /health (si está sana) y /openapi.json (esta misma referencia en formato OpenAPI 3, para importarla en Postman, Insomnia o un generador de clientes).

Límites y cuota

Dos barreras, y las dos responden 429 con Retry-After (segundos) cuando se alcanzan:

¿Necesitas más? La cuota se ajusta por clave para integraciones con volumen (socios, alertas diarias para muchas empresas): escríbenos desde la dirección del aviso legal contando qué vas a hacer con los datos. Mientras tanto, pide páginas grandes (limite=100 en las listas, hasta 500 en las novedades) y guarda lo que ya tienes: los datos cambian una vez al día.

Errores

Todo error devuelve JSON con la clave detail y el motivo en castellano:

{"detail": "hace falta una clave de la API en la cabecera X-API-Key; se crea gratis con una cuenta en https://openmoney.es/cuenta (documentación: https://openmoney.es/api)"}
CódigoCuándo
401Sin clave, o clave con forma incorrecta o desconocida. En las rutas con cuenta (licitaciones en plazo), también si la sesión de la web no vale.
403Clave revocada.
404No existe: una empresa sin adjudicaciones ni concesiones desde 2022, un municipio con un código INE que no es, una historia que no hay.
422Un parámetro mal: detail es una frase («cpv: hasta 10 valores separados por comas, cada uno de 2 a 8 dígitos») o, si lo rechaza la validación de tipos, una lista con la ruta del campo (loc) y el mensaje.
429Límite por IP o cuota de la clave agotada; espera lo que diga Retry-After.
503La base de datos ha tardado demasiado o está saturada; reintenta pasados los segundos de Retry-After. Es raro y dura poco.

Para un cliente robusto: reintenta los 429 y 503 respetando Retry-After, no reintentes los 4xx restantes, y trata cualquier campo nuevo en una respuesta como algo que puedes ignorar (añadimos campos; no quitamos ni renombramos sin avisar en Cambios).

Convenciones: importes, fechas, identificadores y códigos

Paginación y novedades desde una marca

Las listas se paginan con desde (posición, empieza en 0) y limite, y devuelven total sobre lo filtrado. Una página más allá del final vuelve vacía con el total real.

/licitaciones/novedades es la ruta para mantenerte al día sin repetir descargas: pides los expedientes cuya última versión en PLACSP (actualizado) es igual o posterior a una marca, en orden, y la respuesta trae en siguiente la marca de la página siguiente (desde y tras, el último expediente de ese instante) mientras mas sea true; cuando ya no hay más, siguiente es la marca que debes guardar para la próxima consulta. Aparte vienen las bajas: expedientes que PLACSP retiró desde la marca. Cada expediente dice si sigue abierta.

{
  "desde": "2026-09-09T05:00:00+00:00", "mas": true,
  "siguiente": {"desde": "2026-09-09T11:42:10+00:00", "tras": "https://contrataciondelestado.es/…/idEvl=abc"},
  "expedientes": [ { "id": 27414823, "estado": "PUB", "estado_nombre": "Publicada", "abierta": true, "baja": null, "…": "los campos de la lista y los tres presupuestos" } ],
  "bajas": [ {"id": 27301111, "id_url": "https://…", "expediente": "2026/SER/0102", "baja": "2026-09-09T06:10:00+00:00"} ],
  "bajas_mas": false
}

Los datos se cargan una vez al día, poco después de las 05:00 UTC, con seis horas de solape sobre el feed de PLACSP. Consulta las novedades a partir de las 08:00 UTC y quédate con la marca que devuelve la respuesta, no con tu hora local: así no pierdes ni repites expedientes aunque el feed llegue con retraso.

Ejemplos

Licitaciones en plazo, con filtros

curl -H "X-API-Key: om_…" "https://api.openmoney.es/licitaciones/abiertas?cpv=45&nuts=ES51&dias=30&orden=presupuesto&limite=100"
{
  "total": 388, "desde": 0, "limite": 25, "orden": "plazo",
  "resultados": [
    {
      "id": 27414823,
      "expediente": "2026/OBR/0041",
      "titulo": "Renovación de la red de abastecimiento en la calle Mayor",
      "objeto": "Obras de renovación de la red de abastecimiento de agua…",
      "organo": "L01280796", "organo_nombre": "Ayuntamiento de Madrid",
      "tipo": "3", "tipo_nombre": "Obras",
      "procedimiento": "9", "procedimiento_nombre": "Abierto simplificado",
      "presupuesto": 412300.5, "presupuesto_origen": "sin_iva",
      "cpv": [{"codigo": "45231300", "nombre": "Trabajos de construcción de tuberías para agua y aguas residuales"}],
      "lugar": "Madrid", "nuts": "ES300", "nuts_nombre": "Madrid",
      "fecha_anuncio": "2026-09-02", "fin_plazo_ofertas": "2026-09-23", "dias_restantes": 13, "n_lotes": 0,
      "link": "https://contrataciondelestado.es/wps/poc?uri=deeplink:detalle_licitacion&idEvl=…",
      "actualizado": "2026-09-02T10:14:52+00:00"
    }
  ]
}

Python (httpx)

import httpx

api = httpx.Client(base_url="https://api.openmoney.es", headers={"X-API-Key": "om_…"}, timeout=30)

# licitaciones de obras en Cataluña que cierran en 15 días, por presupuesto
r = api.get("/licitaciones/abiertas", params={"tipo": "3", "nuts": "ES51", "dias": 15, "orden": "presupuesto", "limite": 100})
r.raise_for_status()
print(r.headers["X-RateLimit-Remaining"], "peticiones restantes hoy")
for x in r.json()["resultados"]:
    print(x["fin_plazo_ofertas"], x["organo_nombre"], x["presupuesto"], x["link"])

# novedades desde la última marca (guárdala: la siguiente consulta empieza en `siguiente`)
marca = {"desde": "2026-09-09T05:00:00Z", "tras": ""}
while True:
    n = api.get("/licitaciones/novedades", params={**marca, "limite": 500}).json()
    for x in n["expedientes"]:
        ...
    marca = n["siguiente"]
    if not n["mas"]:
        break

JavaScript (fetch)

const r = await fetch("https://api.openmoney.es/empresa/A28599033", { headers: { "X-API-Key": "om_…" } });
if (r.status === 429) throw new Error(`espera ${r.headers.get("Retry-After")} s`);
const empresa = await r.json();
console.log(empresa.nombre_canonico, empresa.por_anio.at(-1));

Ficha de una empresa, de un órgano o de un municipio

curl -H "X-API-Key: om_…" "https://api.openmoney.es/empresa/A28599033"
curl -H "X-API-Key: om_…" "https://api.openmoney.es/organo/L01280796"
curl -H "X-API-Key: om_…" "https://api.openmoney.es/municipio/28079"

Las fichas son documentos grandes (20-40 KB comprimidos) con todo lo que enseña la web: por año, mayores contrapartes, expedientes recientes, señales. Cambian una vez al día: cachéalas.

Referencia de rutas

Generada del OpenAPI de la API (versión 1.0). Salvo que se diga lo contrario, cada ruta pide la clave y consume una petición de la cuota.

Búsqueda

Empresas, órganos, municipios y administraciones por nombre o identificador.

Empresas

Ficha de una empresa: contratos adjudicados por año, órganos, CPV, competidores, subvenciones y señales.

GET/empresa/{nif}con clave

Ficha de una empresa

Todo lo que OpenMoney sabe de una empresa por su NIF (con o sin separadores; las UTE, por su id «UTE-…»): nombre canónico y alias, importe adjudicado por año (por_anio, con menores y órganos distintos), subvenciones recibidas por año (subvenciones_por_anio, BDNS), órganos que más le adjudican (top_organos), reparto por nivel de administración (reparto_nivel), CPV más frecuentes (top_cpv), últimos expedientes con enlace a PLACSP (expedientes), competidores en los mismos órganos y CPV (competidores) y señales aritméticas con su regla (senales). 404 si no hay adjudicaciones ni concesiones desde 2022.

ParámetroDóndeTipoPor defectoDescripción
nif *rutatexto, 1-64 caracteres

Respuestas: 200 · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la clave agotada; `Retry-After` dice cuánto esperar

Órganos

Ficha de un órgano de contratación: adjudicado por año, proveedores, procedimientos y expedientes.

GET/organo/{organo}con clave

Ficha de un órgano de contratación

Un órgano por su clave: código DIR3 («L01280796») o, cuando PLACSP no lo trae, «NIF:S1911001D» o «PLAT:…». Trae nombre y padres, municipio si es local, adjudicado por año (por_anio), mayores proveedores por año con su cuota (top_proveedores), personas físicas agregadas, reparto por procedimiento, últimos expedientes y cuántas licitaciones tiene en plazo (n_abiertas).

ParámetroDóndeTipoPor defectoDescripción
organo *rutatexto, 1-64 caracteres

Respuestas: 200 · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la clave agotada; `Retry-After` dice cuánto esperar

Municipios

Ficha de un municipio: liquidación del ayuntamiento por capítulo y por habitante, órganos y proveedores.

GET/municipio/{ine}con clave

Ficha de un municipio

Un municipio por su código INE de cinco cifras: padrón por año (poblacion), liquidación del ayuntamiento por capítulo de gasto e ingreso y por área de gasto (gasto_por_capitulo, ingresos_por_capitulo, areas_gasto, con obligaciones reconocidas y euros por habitante), órganos de contratación del ayuntamiento (organos), mayores proveedores y adjudicado por año.

ParámetroDóndeTipoPor defectoDescripción
ine *rutatexto, 1-64 caracteres

Respuestas: 200 · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la clave agotada; `Retry-After` dice cuánto esperar

Administraciones

Estado, Seguridad Social y comunidades autónomas: liquidaciones, contratos y subvenciones.

GET/administracionescon clave

Estado, Seguridad Social y comunidades autónomas

Las 21 administraciones con ficha (administraciones, con su slug), las cuatro capas del gasto sin sumar entre sí (cuatro_capas), las comunidades para el mapa por habitante (ccaa_mapa), la evolución por año y los órganos que no se asignan a ninguna capa (sin_asignar).

Respuestas: 200 · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la clave agotada; `Retry-After` dice cuánto esperar

GET/administracion/{slug}con clave

Ficha de una administración

Una administración por su slug (estado, seguridad-social, canarias, madrid…): liquidación por año, capítulo, política de gasto y programa; transferencias a otras capas; contratos adjudicados por año con sus mayores órganos y proveedores; subvenciones concedidas por año y mayores convocatorias. Las cifras son obligaciones reconocidas netas del último ejercicio liquidado.

ParámetroDóndeTipoPor defectoDescripción
slug *rutatexto, 2-40 caracteres

Respuestas: 200 · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la clave agotada; `Retry-After` dice cuánto esperar

Licitaciones

Expedientes de PLACSP en plazo de presentación de ofertas, con filtros, ficha con antecedentes y novedades desde una marca.

GET/licitaciones/resumencon clave

Cuántas licitaciones hay en plazo y cómo se reparten

Expedientes en plazo hoy (n), su presupuesto sin IVA, órganos distintos, cuántos cierran en siete días y cuántos se anunciaron esta semana, y el reparto por tipo de contrato, procedimiento, comunidad y provincia (código, nombre, n y presupuesto): los valores que admiten los filtros de /licitaciones/abiertas. Cambia una vez al día.

Respuestas: 200 · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la clave agotada; `Retry-After` dice cuánto esperar

GET/licitaciones/abiertascon clave· con cuenta

Licitaciones en plazo, con filtros

Expedientes que admiten ofertas hoy, filtrados y paginados: total (sobre lo filtrado), desde, limite, orden y resultados. Cada expediente trae id (su número en PLACSP, el de /licitaciones/{id}), expediente, título, objeto, órgano (clave y nombre), tipo y procedimiento con sus nombres, presupuesto sin IVA (o el valor estimado, según presupuesto_origen), cpv (códigos con nombre), lugar y nuts con nombre, fecha_anuncio, fin_plazo_ofertas, dias_restantes, n_lotes, link a la plataforma de origen y actualizado (última versión en PLACSP). Los filtros se combinan con Y; los de códigos admiten varios valores separados por comas.

ParámetroDóndeTipoPor defectoDescripción
cpvconsultatexto, hasta 100 caracteresprefijos CPV de 2 a 8 dígitos separados por comas: «45» o «45233,71»
nutsconsultatexto, hasta 5 caracteresprefijo NUTS: ES51 (Cataluña), ES511 (Barcelona)
tipoconsultatexto, hasta 40 caracterescódigos de tipo de contrato separados por comas (1 suministros, 2 servicios, 3 obras…)
procedimientoconsultatexto, hasta 40 caracterescódigos de procedimiento separados por comas (1 abierto, 9 abierto simplificado…)
presupuesto_minconsultanúmero, de 0 a 1000000000000
presupuesto_maxconsultanúmero, de 0 a 1000000000000
diasconsultaentero, de 0 a 730solo las que cierran en estos días o menos
plazo_desdeconsultafecha (AAAA-MM-DD)
plazo_hastaconsultafecha (AAAA-MM-DD)
organoconsultatexto, hasta 64 caracteresclave del órgano (la de /organo/{id})
qconsultatexto, 2-80 caracterestexto libre sobre objeto, título, expediente y órgano
ordenconsultatexto, patrón ^(plazo|presupuesto|reciente)$plazo
desdeconsultaentero, de 0 a 100000
limiteconsultaentero, de 1 a 10025expedientes por página

Respuestas: 200 · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la clave agotada; `Retry-After` dice cuánto esperar

GET/licitaciones/{id}con clave· con cuenta

Ficha de un expediente, con adjudicaciones y antecedentes

Todo el expediente: los campos de la lista más estado, abierta (si sigue en plazo), baja (si PLACSP lo retiró), padres del órgano y su municipio, subtipo, urgencia, sistema de contratación, sara, financiación, los tres presupuestos publicados, lugar, ciudad y código postal, número de resultados y versiones. adjudicaciones lista los resultados publicados (lote, adjudicatario con NIF, importe, licitadores, ofertas). antecedentes resume lo que el mismo órgano adjudicó en los mismos CPV a tres dígitos en los últimos tres años (a quién, importe medio, baja media y las 20 adjudicaciones más recientes); es null sin órgano con clave o sin CPV.

ParámetroDóndeTipoPor defectoDescripción
id *rutaentero, de 1 a 1000000000000número del expediente en PLACSP (`id` en la lista y en las novedades)

Respuestas: 200 · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la clave agotada; `Retry-After` dice cuánto esperar

GET/licitaciones/novedadescon clave· con cuenta

Expedientes nuevos o modificados desde una marca

Expedientes cuya última versión en PLACSP (updated) es posterior a desde, en orden de updated, con abierta según la vista; y aparte los retirados del feed desde entonces (bajas). Para seguir: siguiente trae el desde y el tras de la página siguiente (cuando mas es true) o, si no hay más, la marca para la próxima consulta. El incremental diario carga las entradas con seis horas de solape, así que conviene consultar tras el cron (08:00 UTC) y quedarse con la marca que devuelve la respuesta, no con la hora local.

ParámetroDóndeTipoPor defectoDescripción
desde *consultafecha y hora (ISO 8601)marca de la última consulta (ISO 8601); vuelven los expedientes con updated igual o posterior
trasconsultatexto, hasta 300 caracteresid_url del último expediente recibido con ese mismo updated, para seguir la página
limiteconsultaentero, de 1 a 500200

Respuestas: 200 · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la clave agotada; `Retry-After` dice cuánto esperar

Historias

Lecturas de los datos con cifras comprobables, las mismas que https://openmoney.es/historias.

GET/historiascon clave

Las historias, con titular y cifra

Titular y cifra de cada historia para la portada (todas las historias, cacheadas una hora).

Respuestas: 200 · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la clave agotada; `Retry-After` dice cuánto esperar

GET/historias/{slug}con clave

Una historia con sus tablas y fuentes

Los datos de una historia por su slug (los de la lista): tablas con las cifras, enlaces a las fichas y a la fuente que sustenta cada una. Las historias son las de https://openmoney.es/historias.

ParámetroDóndeTipoPor defectoDescripción
slug *rutatexto

Respuestas: 200 · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la clave agotada; `Retry-After` dice cuánto esperar

Mapas

Los datos de los mapas: municipios de España en la portada y burbujas de las fichas.

GET/mapacon clave

Mapa de la portada: los municipios de España

Para cada municipio (m, por código INE) cuatro cifras: gasto del ayuntamiento, contratos y subvenciones por habitante, y población; anios dice de qué año es cada una. Unos 300 KB (100 comprimidos); cambia una vez al día.

Respuestas: 200 · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la clave agotada; `Retry-After` dice cuánto esperar

GET/mapas/empresa/{nif}con clave

Dónde le adjudican a una empresa

ParámetroDóndeTipoPor defectoDescripción
nif *rutatexto, 1-64 caracteres

Respuestas: 200 · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la clave agotada; `Retry-After` dice cuánto esperar

GET/mapas/organo/{organo}con clave

De dónde son los proveedores de un órgano

ParámetroDóndeTipoPor defectoDescripción
organo *rutatexto, 1-64 caracteres

Respuestas: 200 · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la clave agotada; `Retry-After` dice cuánto esperar

Portada

Cifras de la portada y las claves del sitemap.

GET/portadacon clave

Cifras de la portada

Adjudicado en los últimos 30 días, mayores empresas y órganos del año, cuántas empresas y municipios hay y la versión de los datos (version_datos, el día de la última carga).

Respuestas: 200 · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la clave agotada; `Retry-After` dice cuánto esperar

GET/sitemapcon clave

Claves del sitemap

Los identificadores con ficha: las 1.000 mayores empresas, todos los municipios, los órganos con más expedientes y los slugs de las administraciones. Es lo que la web publica en su sitemap.

Respuestas: 200 · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la clave agotada; `Retry-After` dice cuánto esperar

Estado

Qué es esta API y si está sana.

GET/sin clave

Qué es esta API

Nombre, versión y dónde está la documentación. No necesita clave.

Respuestas: 200

GET/healthsin clave

Estado de la API

Sin clave. ok y db dicen si la base responde; version_datos es el día de la última carga; ip es la dirección con la que el límite por IP cuenta a quien llama; clave_servicio dice si la API tiene configurada la clave con la que la llama la web. 503 si la base no responde.

Respuestas: 200

Rutas que no están aquí: /cuenta/* y /lista-espera/* son las que usa la propia web con la sesión del navegador (entrar, salir, crear claves, la lista de espera de «¿Dónde abro?»); no forman parte del contrato de la API y pueden cambiar sin aviso. Para crear o revocar claves está tu cuenta.

Condiciones de uso y atribución

Al crear una clave aceptas las condiciones de uso del aviso legal, en particular su apartado API. En corto:

Los datos de origen son públicos y siguen en sus fuentes (PLACSP, BDNS, Hacienda, INE); lo que aporta OpenMoney es la reconciliación, la limpieza y la estructura. Quien necesite un volcado completo debe obtenerlo de las fuentes oficiales.

Cambios

La versión va en / y en /health (api). Añadimos campos y rutas sin cambiar de versión; un cambio que quite o renombre algo se anuncia aquí con antelación y sube la versión.

Lo siguiente, por orden: pliegos, historial de anuncios y lotes en la ficha del expediente; convocatorias de subvenciones abiertas con su plazo; novedades por empresa (adjudicaciones y concesiones nuevas para una lista de NIF desde una marca).

Próximamente · lista de espera

¿Dónde abro?

Lo siguiente que queremos construir: un motor que responde a «¿dónde abro un gimnasio en Tenerife?» con un ranking de zonas, el porqué de cada una y un nivel de confianza, y a «¿este local que he visto es bueno?» con la puntuación de un punto concreto. Con datos oficiales de población, renta, movilidad, locales y competencia, para toda España.

Solo lo haremos si hay gente suficiente esperándolo. Deja tu correo y te avisaremos cuando abra; nada más, ni boletines ni terceros.

Guardamos el correo al momento y te enviamos un enlace para confirmar que es tuyo; entras sin contraseña. Solo lo usaremos para avisarte. Aviso legal y privacidad.