Saltar al contenido
OpenMoney
En esta página: Qué es y para quién

API · versión 1.0

API de OpenMoney

Los datos de OpenMoney en JSON, listos para tu programa: contratos adjudicados, licitaciones en plazo, subvenciones y presupuestos por empresa, órgano, municipio y administración. La clave va incluida en los planes Pro y Despacho y en los acuerdos de plataforma, y se crea en un minuto.

Crear mi clavePlanesPrimera llamadaReferencia de rutasOpenAPI (JSON)

Rutas
34
32 con clave, 2 libres
Cuota
200
peticiones al día por cuenta con el plan Pro; 500 con el Despacho y a medida con un acuerdo de plataforma
Datos
Diarios
PLACSP y BDNS cada mañana
Formato
JSON
OpenAPI 3 para Postman

Qué es y para quién

En llano

Una API es una puerta para programas. En vez de abrir la web y leer una ficha, tu programa pide la misma información a una dirección de Internet y recibe JSON: texto ordenado en campos que cualquier lenguaje entiende (Python, JavaScript, una hoja de cálculo con Power Query…). Cada petición es una URL; cada respuesta, un documento con campos y valores.

La API de OpenMoney devuelve lo mismo que ves en la web, sin recortes: las fichas de empresa, órgano, municipio y administración, las licitaciones que admiten ofertas hoy, las convocatorias de subvenciones que admiten solicitudes hoy, las historias y los mapas. Sirve, sobre todo, para tres cosas:

Avisos y seguimiento

Cada mañana, las licitaciones nuevas que encajan con tu actividad y tu territorio, sin repetir lo que ya viste.

En tu programa o en tu plataforma

Fichas de empresas y órganos, antecedentes de un expediente o licitaciones en plazo en tu CRM o tu herramienta; dentro de un producto para terceros, con un acuerdo de plataforma.

Analizar

Descargar a Python, R o una hoja de cálculo lo que quieras cruzar: adjudicaciones por año, proveedores de un órgano, gasto por habitante.

Qué datos hay

DatoRutaQué trae
Buscar/searchEmpresas, órganos, municipios y administraciones por nombre o identificador. Devuelve el id que aceptan las fichas.
Empresa/empresa/{nif}Adjudicado por año, órganos que le contratan, CPV, competidores, subvenciones y señales.
Novedades por empresa/empresas/novedadesPara una lista de NIF, los contratos ganados y las subvenciones recibidas que las fuentes han publicado desde una marca: lo que hace falta para avisar «tu cliente ha resultado adjudicatario».
Órgano de contratación/organo/{id}Adjudicado por año, mayores proveedores, procedimientos, expedientes recientes y licitaciones en plazo.
Municipio/municipio/{ine}Padrón, liquidación del ayuntamiento por capítulo y por habitante, órganos y proveedores.
Administraciones/administracionesEstado, Seguridad Social y comunidades: liquidaciones, contratos y subvenciones.
Licitaciones en plazo/licitaciones/…Expedientes que admiten ofertas hoy, con filtros (también como={nif}: las que le encajan a una empresa, de más a menos y con el motivo, por su historial o, sin contratos, por su sector y dónde está; y sector= con provincia= o municipio= para un perfil sin NIF); la ficha de cada uno con antecedentes; y las novedades desde una marca.
Radar por lotesPOST /licitaciones/encajePara una cartera de hasta 500 clientes por llamada (50 con el plan Pro; por NIF o por sector, lugar y tamaño), las licitaciones en plazo que mejor le encajan a cada uno, con sus motivos: lo que una plataforma o una asesoría pide cada mañana en una sola llamada.
Subvenciones abiertas/convocatorias/…Convocatorias de la BDNS que admiten solicitudes hoy (por defecto las que se pueden pedir: concurrencia competitiva y concesión directa con bases; tipo para quedarse con una), con filtros por comunidad, sector, tipo de beneficiario y plazo; la ficha de cada una con sus bases, documentos, anuncios y las concesiones ya publicadas; y las novedades desde una marca, ampliaciones de plazo incluidas.
Categorías CPV/cpv, /cpv/{codigo}Qué se contrata en cada categoría del CPV: cuánto por año, quién compra, quién gana y qué está en plazo. El índice, con las 45 divisiones y las 317 categorías.
Historias, mapas y portada/historias, /mapa, /portadaLas lecturas con cifras comprobables, los datos de los mapas y las cifras de la portada.

Todo son importes adjudicados o concedidos, sin IVA, desde 2022, reconciliados y limpios a partir de las fuentes oficiales. Lo que no está en la web tampoco está en la API: lo cuenta la metodología.

Empezar en cinco minutos

  1. Paso 1

    Crea una cuenta

    En openmoney.es/cuenta, con tu correo. Sin contraseña ni tarjeta: entras con el enlace que te enviamos.

  2. Paso 2

    Crea una clave y cópiala

    En la misma página, «Nueva clave». Empieza por om_ y se enseña una sola vez. Guárdala donde guardes tus contraseñas.

  3. Paso 3

    Haz tu primera llamada

    Manda la clave en la cabecera X-API-Key de cada petición. Abajo tienes el ejemplo en tres lenguajes.

Tu primera llamada

Buscamos «indra» y la API contesta con las empresas y órganos que encajan. Sustituye om_… por tu clave.

curl
curl -H "X-API-Key: om_…" "https://api.openmoney.es/search?q=indra"
Respuesta
[
  {"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}
]

Anatomía de la llamada

ParteQué es
https://api.openmoney.esLa base: todas las rutas cuelgan de aquí. Siempre por HTTPS.
/searchLa ruta: qué pides. Cada ruta está en la referencia.
?q=indraLos parámetros: cómo lo filtras. Van tras ?, separados por & (?cpv=45&dias=30). Las fichas llevan el identificador en la propia ruta (/empresa/A28599033).
X-API-KeyLa cabecera con tu clave. Viaja junto a la petición, no en la URL, así no queda en historiales ni en registros.
RespuestaJSON en UTF-8, comprimido si mandas Accept-Encoding: gzip (httpx y fetch lo hacen solos; en curl, añade --compressed). Cada petición se basta por sí misma: no hay que «abrir sesión».

Todas las rutas son GET: solo leen. Si prefieres una herramienta con botones, importa https://api.openmoney.es/openapi.json en Postman, Insomnia o Bruno: verás cada ruta con sus parámetros y podrás probarla pegando tu clave.

La clave

La clave es una contraseña larga para programas. Identifica tu cuenta en cada petición: con ella contamos la cuota de tu cuenta y te enseñamos tu uso. Se crea en tu cuenta con un plan con API (Pro, Despacho o un acuerdo de plataforma), se enseña una sola vez y viaja en la cabecera X-API-Key:

Petición
GET /empresa/A28599033 HTTP/1.1
Host: api.openmoney.es
X-API-Key: om_…

Personal e intransferible

Una cuenta, una persona. No la compartas ni la publiques: quien la tenga gasta tu cuota y actúa en tu nombre.

Nunca en el navegador ni en un repositorio

Guárdala en una variable de entorno o en el gestor de secretos de tu plataforma. Si la llamas desde una web, hazlo desde tu servidor.

Hasta tres activas, con nombre

Una por integración («pruebas», «producción») para saber cuál usa qué y revocar una sin tocar las demás. Todas comparten la cuota de la cuenta.

Si la pierdes, revócala

Solo guardamos una huella (SHA-256) de la clave: no podemos enseñártela otra vez. Revocar deja de valer al instante (a lo sumo, en quince segundos).

Sin clave, o con una clave que no existe, la respuesta es 401 y un mensaje que lo explica. Solo tres rutas son libres: / (qué es esta API), /health (si está sana) y /openapi.json (esta referencia en formato OpenAPI 3).

Desde un asistente de IA (MCP)

Si en vez de un programa lo que tienes es Claude, ChatGPT o Claude Code, no hace falta clave: OpenMoney tiene un conector MCP (el estándar para que un asistente use un servicio como herramienta) en https://mcp.openmoney.es/mcp. Se añade como conector, se pulsa «Conectar», se entra con el correo y se da el permiso en una pantalla de openmoney.es; el asistente recibe un pase que solo vale para el conector y se refresca solo. Con una cuenta gratis son 15 consultas al día; con un plan con API, las de la API. La guía paso a paso, con preguntas de ejemplo, está en Conecta OpenMoney con Claude y ChatGPT.

Para un programa o una plataforma que ya tiene clave, el mismo conector acepta la clave en vez del pase: en la cabecera Authorization: Bearer om_… o en X-API-Key, que es lo que cada cliente MCP sabe mandar. Las consultas gastan la cuota de la cuenta como cualquier petición y en el panel salen con el prefijo mcp. Las once herramientas (buscar licitaciones, ver una por dentro, buscar una entidad, fichas de empresa y de órgano, novedades por NIF, lo que encaja con una empresa, con un perfil o con una cartera entera, el catálogo de filtros y la búsqueda de códigos CPV) devuelven lo mismo que estas rutas, recortado a lo que un asistente necesita, y cada dato lleva su enlace a la ficha.

Límites y cuota

Hay dos barreras. Las dos responden 429 con la cabecera Retry-After (cuántos segundos esperar) cuando se alcanzan.

BarreraCuántoPara qué
Por dirección IP60 peticiones seguidas y, a partir de ahí, 1 por segundoFrenar a quien dispara sin clave o en bucle. Vale para toda la API.
Por cuenta200 peticiones al día con el plan Pro, 500 con el Despacho y las de su acuerdo con una plataforma, entre todas tus claves; se renueva a las 00:00 UTCRepartir el uso con justicia. Es la cuota de tu cuenta, no de cada clave, y se ve en cada respuesta.
Por petición50 NIF o clientes con el plan Pro; 500 con el Despacho y con un acuerdo de plataformaEn /empresas/novedades y en el radar por lotes. El Pro es para tu propio uso; una cartera entera cabe en una llamada con el Despacho. Más, en varias llamadas.

Cada respuesta con clave lleva tres cabeceras con el estado de tu cuota:

Cabeceras de la respuesta
HTTP/1.1 200 OK
Content-Type: application/json
X-RateLimit-Limit: 200
X-RateLimit-Remaining: 187
X-RateLimit-Reset: 1789084800
CabeceraQué dice
X-RateLimit-LimitLa cuota diaria de tu cuenta.
X-RateLimit-RemainingLas peticiones que te quedan hoy, descontando las de todas tus claves.
X-RateLimit-ResetCuándo se renueva, en segundos desde 1970 (la próxima medianoche UTC).

Cómo llegar lejos con 200 al día

  • Pide páginas grandes: limite=100 en las listas y hasta 500 en las novedades. Una página cuenta como una petición.
  • Guarda lo que ya tienes. Los datos cambian una vez al día: una ficha bajada por la mañana vale todo el día.
  • Para seguir las licitaciones, usa las novedades desde una marca: solo te llega lo que cambió.

¿Necesitas más? El plan Despacho sube la cuota y los NIF por petición, y con un acuerdo de plataforma la cuota va a la medida de tu volumen: cuéntanos qué vas a hacer con los datos y cuántas peticiones necesitas.

Errores

Cuando algo falla, la respuesta es JSON con la clave detail y el motivo, en castellano:

Respuesta 401
{"detail": "hace falta una clave de la API en la cabecera X-API-Key; va incluida en los planes Pro y Despacho y en los acuerdos de plataforma (https://openmoney.es/precios) y se crea en https://openmoney.es/cuenta (documentación: https://openmoney.es/api)"}
CódigoQué ha pasadoQué hacer
401Sin clave, o clave con forma incorrecta o desconocida.Revisa la cabecera X-API-Key y que la clave sea la que copiaste al crearla.
403La clave está revocada, o el plan de tu cuenta ya no incluye la API (volvió al gratis o terminó la prueba del Pro).Si está revocada, crea otra en tu cuenta. Las demás no se borran: vuelven a funcionar tal cual con un plan con API.
404No existe: una empresa sin adjudicaciones ni concesiones desde 2022, un código INE que no es, una historia que no hay.No reintentes. Busca el identificador con /search.
422Un parámetro mal escrito o fuera de rango. detail es una frase («cpv: hasta 10 valores separados por comas…») o una lista con la ruta del campo (loc) y el mensaje.Corrige el parámetro; la referencia dice qué admite cada uno.
429Límite por IP o cuota diaria agotada.Espera los segundos de Retry-After y repite.
503La base de datos ha tardado demasiado o está saturada. Es raro y dura poco.Espera lo que diga Retry-After y repite.

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

Importes, fechas, identificadores y códigos

Importes

En euros, sin IVA, y son importes adjudicados o concedidos, nunca pagos. Los acuerdos marco y los importes repetidos no se suman (se marcan como sospechoso donde aparecen). Las liquidaciones son obligaciones reconocidas netas. Nada anterior a 2022. Lo explica la metodología.

Fechas

En ISO 8601: los días como 2026-09-23; las marcas de tiempo con zona, en UTC (2026-09-09T05:00:00+00:00). Un parámetro de fecha y hora sin zona se toma como UTC.

Identificadores

Cada ficha se pide por su identificador oficial. /search devuelve el tipo y el id exactos que acepta cada una.

QuéIdentificadorEjemploDe dónde sale
EmpresaNIF (con o sin separadores, mayúsculas o minúsculas). Las uniones temporales, por su id UTE-… tal cual.A28599033Registro Mercantil; lo publica PLACSP en cada adjudicación.
Órgano de contrataciónCódigo DIR3 o, si PLACSP no lo trae, la clave NIF:… o PLAT:… que devuelven las fichas.L01280796Directorio Común de unidades del Estado (DIR3).
MunicipioCódigo INE de cinco cifras.28079Instituto Nacional de Estadística.
AdministraciónSu slug (nombre corto en la URL).estado, seguridad-social, canariasLos publica /administraciones.
LicitaciónSu número en PLACSP.20379296Lo trae cada expediente de las listas (id).

Códigos

CódigoQué clasificaCómo se filtra
CPVEl objeto del contrato (nomenclatura europea, 8 dígitos).Por prefijo: 45 son todas las obras, 45233 las de carreteras. Varios, separados por comas.
NUTSEl territorio (código europeo de regiones).Por prefijo: ES51 Cataluña, ES511 Barcelona, ES toda España.
Tipo de contratoSuministros, servicios, obras… (códigos de PLACSP).1 suministros, 2 servicios, 3 obras. Varios, separados por comas.
ProcedimientoCómo se adjudica (códigos de PLACSP).1 abierto, 9 abierto simplificado… Varios, separados por comas.

/licitaciones/resumen devuelve cada código con su nombre y cuántos expedientes tiene hoy: es la lista completa y viva de valores para los filtros. Y las respuestas llevan siempre el nombre junto al código (tipo_nombre, nuts_nombre…), así no necesitas tablas aparte.

Personas físicas y enlaces

  • Personas físicas: nunca hay DNI ni NIE. Sus importes aparecen agregados como «personas físicas», y un DNI en una lista de NIF se ignora.
  • Enlaces: link es la página del expediente en la plataforma de origen (PLACSP o la autonómica). Las fichas de la web están en https://openmoney.es/empresa/{nif}, /organo/{id}, /municipio/{ine} y /licitaciones.

Listas, páginas y novedades

Páginas

Las listas se piden por trozos con dos parámetros: desde (en qué posición empieza la página; la primera es 0) y limite (cuántos elementos trae). La respuesta incluye total, el número de elementos que cumplen el filtro, para que sepas cuántas páginas quedan. Una página más allá del final vuelve vacía, con el total real.

Las dos primeras páginas de 100
curl -H "X-API-Key: om_…" "https://api.openmoney.es/licitaciones/abiertas?cpv=45&limite=100&desde=0"
curl -H "X-API-Key: om_…" "https://api.openmoney.es/licitaciones/abiertas?cpv=45&limite=100&desde=100"

Novedades desde una marca

/licitaciones/novedades sirve para mantenerte al día sin repetir descargas. La idea: guardas una marca (un instante) y cada vez pides «lo que ha cambiado desde la marca». La API te devuelve los expedientes nuevos o modificados desde entonces, los retirados, y la marca nueva para la próxima vez.

  1. La primera vez, pide con desde igual a una fecha reciente (2026-09-09T05:00:00Z).
  2. Lee expedientes (nuevos o modificados; cada uno dice si sigue abierta) y bajas (los que PLACSP retiró).
  3. Si mas es true, quedan páginas: repite con el desde y el tras que vienen en siguiente.
  4. Cuando mas es false, guarda siguiente: es la marca de tu próxima consulta.
Respuesta
{
  "desde": "2026-09-09T05:00:00Z", "mas": true,
  "siguiente": {"desde": "2026-09-09T10:05:07.693000Z", "tras": "https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/20371637"},
  "expedientes": [
    {"id": 20384205, "expediente": "201/2026", "titulo": "Adquisición de material de mantenimiento.", "organo": "L01342257", "organo_nombre": "Alcaldía del Ayuntamiento de Villamuriel de Cerrato",
     "estado": "RES", "estado_nombre": "Resuelta", "abierta": false, "baja": null, "tipo": "1", "tipo_nombre": "Suministros", "procedimiento": "6", "procedimiento_nombre": "Contrato menor",
     "presupuesto": 165.29, "presupuesto_origen": "sin_iva", "presupuesto_sin_iva": 165.29, "presupuesto_estimado": 165.29, "actualizado": "2026-09-09T05:41:32.468000Z", "…": "los demás campos de la lista"},
    {"…": "hasta 500"}
  ],
  "bajas": [{"id_num": 19922421, "id_url": "https://contrataciondelestado.es/sindicacion/datosAbiertosMenores/19922421", "expediente": "24675", "baja": "2026-09-09T06:00:03.874000Z"}],
  "bajas_mas": false
}

Novedades por empresa

POST /licitaciones/encaje es el radar de una cartera: le pasas hasta 500 clientes (50 con el plan Pro; por nif, o por sector con provincia, municipio o comunidad y tamano cuando no tienen contratos) y devuelve, para cada uno y en el mismo orden, sus limite licitaciones en plazo con más encaje y el porqué de cada una (encaje: nivel, motivos y avisos), más estado (historial, ayudas, declarado o sin_perfil con el motivo). Con nuevas_desde (ayer, en el radar de cada mañana) las anunciadas desde entonces llevan el aviso «nueva». Una empresa sin contratos encaja por su sector, traducido a grupos CPV con lo que ganan de verdad las empresas de ese sector (medido en 67.773 empresas), y nunca pasa de «medio». Cuenta como una petición; una cartera de 500 pymes tarda unos segundos. Hasta 50 clientes por llamada con el plan Pro (uso propio) y 500 con un acuerdo de plataforma.

/empresas/novedades sigue el mismo esquema para una lista de empresas: le pasas hasta 500 NIF (50 con el plan Pro; nif=A1,B2,…) y una marca, y devuelve los contratos que han ganado (adjudicaciones, según PLACSP) y las subvenciones que han recibido (concesiones, según la BDNS) desde entonces, cada fila con su nif. Nuevo es lo que la fuente publicó después de la marca, no lo firmado después: una adjudicación de hace meses que PLACSP publica hoy cuenta hoy, así no se te escapa aunque consultes cada semana. Los DNI y NIE de la lista se ignoran y se dicen en ignorados; las UTE van por su propio id («UTE-…»).

Las dos listas salen de una sola secuencia ordenada por instante (versión del expediente, o día de alta en la BDNS), y mas y siguiente funcionan igual que arriba. Dos cosas a tener en cuenta: un expediente que cambia de versión después de adjudicado (formalización, rectificación) vuelve a aparecer con su actualizado nuevo, y la marca que devuelve la respuesta puede repetir el último día de concesiones (la BDNS publica un día que cargamos en dos rondas). Antes repetir que perder: si vas a avisar a alguien, recuerda lo ya visto por id (concesión) o por id, lote y nif (adjudicación).

Respuesta
{
  "desde": "2026-09-10T00:00:00Z", "nif": ["B15123177", "B16553232"],
  "ignorados": [{"nif": "12345678Z", "motivo": "persona física (DNI o NIE): solo personas jurídicas"}],
  "mas": false, "siguiente": {"desde": "2026-09-11T00:00:00Z", "tras": ""},
  "adjudicaciones": [
    {"nif": "B15123177", "adjudicatario": "ELECTRONICA NOROESTE SERVICIOS GENERALES, S.L.", "id": 20353340, "expediente": "PcPG/2026/828991",
     "titulo": "RET-ME-2026-0175: Suministro, instalación y adecuación eléctrica del centro de telecomunicaciones de Santa Cecía…", "objeto": "…",
     "organo": "A12009486", "organo_nombre": "RETEGAL S.A.", "lote": "0", "resultado": "9", "resultado_nombre": "Formalizado",
     "fecha_adjudicacion": null, "contrato_fecha": "2026-09-10", "importe_sin_iva": 12826.0, "presupuesto_sin_iva": 15125.0, "n_licitadores": 3,
     "es_menor": false, "sospechoso": null, "estado": "RES", "estado_nombre": "Resuelta", "n_versiones": null,
     "link": "https://www.contratosdegalicia.gal/licitacion?N=828991", "actualizado": "2026-09-10T18:10:59.151000Z"}
  ],
  "concesiones": [
    {"nif": "B16553232", "beneficiario": "LAVANDERIAS MUVI, S.L.", "id": 156984283, "cod_concesion": "GR156984283",
     "convocatoria": "Reafianzamiento CAIB avales concedidos por ISBA,SGR, en ejercicio 2026 sujetos a minimis", "id_convocatoria": 1096692, "numero_convocatoria": "895131",
     "nivel1": "AUTONOMICA", "nivel2": "ILLES BALEARS", "nivel3": "DIRECCIÓN GENERAL DEL TESORO, POLÍTICA FINANCIERA Y PATRIMONIO", "instrumento": "GARANTÍA",
     "importe": 11250.0, "ayuda_equivalente": 875.0, "fecha_concesion": "2026-08-12", "fecha_alta": "2026-09-11", "url_br": "https://www.caib.es/eboibfront/pdf/es/2023/163/1150418"}
  ]
}

Cuándo consultar

Los datos se cargan una vez al día, poco después de las 03:00 UTC, con seis horas de solape sobre el feed de PLACSP (y las licitaciones, otra vez a las 21:00 UTC); las convocatorias de subvenciones, en la misma ronda de las 03:00 UTC (la BDNS publica de lunes a viernes). Consulta a partir de las 08:00 UTC y guarda siempre la marca que devuelve la respuesta, no tu hora local: así no pierdes ni repites expedientes aunque el feed llegue con retraso.

Recetas

Programas completos para copiar. En todos, sustituye om_… (o la variable OM_CLAVE) por tu clave.

Licitaciones que encajan conmigo, ordenadas por presupuesto

Obras en Cataluña que cierran en quince días o menos. Python con httpx (pip install httpx).

Python
import httpx

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

# obras (tipo 3) en Cataluña (ES51) que cierran en 15 días o menos, las de mayor presupuesto primero
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"])

Seguir las novedades cada mañana

Guarda la marca en un fichero y, en cada ejecución, procesa solo lo que cambió. Pensado para un cron a las 08:00 UTC.

Python
import json, httpx

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

# la marca de la última consulta se guarda en un fichero; la primera vez, una fecha reciente
try:
    marca = json.load(open("marca.json"))
except FileNotFoundError:
    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"]:
        if x["abierta"]:
            print("nuevo o modificado:", x["id"], x["titulo"])
    for b in n["bajas"]:
        print("retirado:", b["id"], b["expediente"])
    marca = n["siguiente"]           # siempre la marca que devuelve la API, no la hora local
    if not n["mas"]:
        break

json.dump(marca, open("marca.json", "w"))

Vigilar una lista de empresas

Cada mañana, qué han ganado o recibido tus clientes. Guarda la marca en un fichero y, si vas a avisar a alguien, lo ya avisado: la marca puede repetir el último día de concesiones.

Python
import json, httpx

api = httpx.Client(base_url="https://api.openmoney.es", headers={"X-API-Key": "om_…"}, timeout=60)
clientes = ["B15123177", "B16553232", "A28599033"]      # hasta 50 por llamada con el Pro y 500 con el Despacho; más, en varias

# la marca y lo ya avisado se guardan juntos: la marca puede repetir un día de concesiones, y así no se avisa dos veces
try:
    estado = json.load(open("empresas.json"))
except FileNotFoundError:
    estado = {"marca": {"desde": "2026-09-10T00:00:00Z", "tras": ""}, "vistas": []}
vistas = set(estado["vistas"])

while True:
    n = api.get("/empresas/novedades", params={"nif": ",".join(clientes), **estado["marca"], "limite": 500}).json()
    for a in n["adjudicaciones"]:
        clave = f"a:{a['id']}:{a['lote']}:{a['nif']}"
        if clave not in vistas:
            vistas.add(clave)
            print(a["nif"], "ha ganado", a["expediente"], a["importe_sin_iva"], "€ de", a["organo_nombre"], a["link"])
    for c in n["concesiones"]:
        if f"c:{c['id']}" not in vistas:
            vistas.add(f"c:{c['id']}")
            print(c["nif"], "ha recibido", c["importe"], "€:", c["convocatoria"], c["url_br"])
    for i in n["ignorados"]:
        print("ignorado", i["nif"], "porque", i["motivo"])
    estado["marca"] = n["siguiente"]                      # la marca que devuelve la API, no la hora local
    if not n["mas"]:
        break

estado["vistas"] = sorted(vistas)[-5000:]                 # con las últimas basta: la marca solo repite el último día
json.dump(estado, open("empresas.json", "w"))

Subvenciones que puede pedir una empresa

Convocatorias en plazo para empresas de la industria en Cataluña. El plazo en texto se imprime tal cual: la API nunca lo convierte en fecha.

Python
import httpx

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

# ayudas para empresas (pymes o grandes) de la industria (sección C de la CNAE) en Cataluña que cierran en 30 días o menos;
# las de plazo solo en texto van al final, con la frase literal y el enlace a las bases
r = api.get("/convocatorias/abiertas", params={"beneficiario": "empresas", "sector": "C", "comunidad": "cataluna", "dias": 30, "limite": 100})
r.raise_for_status()
for x in r.json()["resultados"]:
    plazo = x["fecha_fin"] or f"plazo en texto: {x['texto_fin']}"
    print(plazo, x["organo"], x["presupuesto"], x["titulo"], x["bases_url"])

Ficha de una empresa en JavaScript

Node 18 o superior (con fetch de serie). Trata el 404 como «no la conocemos» y el 429 como «espera».

JavaScript
const api = "https://api.openmoney.es";
const cabeceras = { "X-API-Key": process.env.OM_CLAVE };   // la clave, en una variable de entorno

async function ficha(nif) {
  const r = await fetch(`${api}/empresa/${encodeURIComponent(nif)}`, { headers: cabeceras });
  if (r.status === 404) return null;                        // sin adjudicaciones ni concesiones desde 2022
  if (r.status === 429) throw new Error(`espera ${r.headers.get("Retry-After")} s`);
  if (!r.ok) throw new Error(`la API respondió ${r.status}`);
  return r.json();
}

const e = await ficha("A28599033");
const ultimo = e.por_anio.at(-1);
console.log(e.nombre_canonico, ultimo?.anio, ultimo?.importe, "€ adjudicados sin IVA");

Descargar una lista entera desde la terminal

Con curl y jq, todas las licitaciones en plazo de obras a un fichero separado por tabuladores que abre cualquier hoja de cálculo.

curl
# todas las licitaciones en plazo de obras (CPV 45), de 100 en 100, a un fichero de texto separado por tabuladores
for desde in 0 100 200 300 400; do
  curl -s -H "X-API-Key: $OM_CLAVE" \
    "https://api.openmoney.es/licitaciones/abiertas?cpv=45&desde=$desde&limite=100" \
    | jq -r '.resultados[] | [.fin_plazo_ofertas, .presupuesto, .organo_nombre, .titulo, .link] | @tsv'
done > obras.tsv

Las fichas de empresa, órgano y municipio son documentos grandes (20-40 KB comprimidos) con todo lo que enseña la web. Cambian una vez al día: guárdalas en vez de pedirlas en cada uso.

Preguntas frecuentes

¿Cuánto cuesta?

La cuenta, el buscador, las fichas y el panel son gratis. La clave de la API va incluida en los planes Pro (200 peticiones al día por cuenta) y Despacho (500), los dos para tu propio uso, y en los acuerdos de plataforma, con la cuota a la medida del volumen. El Pro se prueba 14 días gratis desde tu cuenta, sin tarjeta. La API va con el plan: si la cuenta vuelve al gratis (o termina la prueba), sus claves dejan de funcionar y vuelven a valer, las mismas, con un plan con API. Los planes de pago se piden desde la página de planes y se activan a mano.

¿Puedo llamar a la API desde una página web, con JavaScript en el navegador?

No debes: la clave quedaría a la vista de cualquiera que abra el código de la página. Llama desde tu servidor y sirve a tu web lo que necesite.

¿Cada cuánto cambian los datos?

Las licitaciones, dos veces al día (por la mañana y a última hora de la tarde); las subvenciones, una vez por la mañana. /health dice en version_datos el día de la última carga, en datos_al_dia si la actualización diaria va bien y en feeds_al_dia si la Plataforma de Contratación sigue publicando en sus feeds (cuando se para, la web enseña lo último recibido). No hace falta pedir lo mismo cada hora.

¿Qué pasa si pierdo la clave o la publico sin querer?

Entra en tu cuenta, revócala y crea otra. La revocada deja de funcionar al momento; el uso que hizo queda registrado en tu cuenta.

¿Por qué una empresa me da 404 si existe?

Porque no tiene adjudicaciones ni concesiones publicadas desde 2022 en las fuentes que cubrimos, o porque su NIF está escrito de otra forma. Búscala con /search: si no sale, no la tenemos.

¿Puedo pedir las ayudas que le encajan a un NIF?

Sí: /convocatorias/encaje?nif=B12345678 devuelve las convocatorias en plazo que le encajan a esa empresa, ordenadas de más a menos y cada una con el motivo en llano («de tu provincia», «para autónomos», «de tu sector»); el perfil se deduce de las ayudas que ha recibido y de su sede, y municipio lo afina. Sin NIF se pide a mano: una empresa (clase=empresa&municipio=38038&sector=F), una asociación (clase=entidad) o una persona con lo que busca (clase=particular&municipio=28079&tema=estudios,vivienda). Quita las ayudas de otro ayuntamiento, de otra isla o provincia y las que ya tienen destinatario, y junta en una fila las líneas de una misma orden. Es un encaje automático, sin revisión humana, sobre la ficha de la BDNS: no lee los requisitos de las bases, así que sirve para ordenar y descartar, no para decidir que algo se puede pedir.

¿Tenéis las licitaciones de Cataluña, País Vasco o Navarra?

Sí: llegan a PLACSP por su feed de plataformas agregadas, igual que las de Madrid, Andalucía, Galicia y La Rioja, y salen en /licitaciones/abiertas con el enlace a su plataforma. Sus contratos menores no pasan por PLACSP: los de Cataluña, el País Vasco y Andalucía se leen de sus portales de datos abiertos y salen en las fichas de empresa y de órgano con dataset «cat», «eus» o «and» (nunca dos veces el mismo contrato: si ya estaba en PLACSP, se funde). El identificador del órgano de cada plataforma se traduce a su DIR3 o NIF cuando el portal lo publica; /licitaciones/cobertura mide cuántos cuentan ya en /organo y en las administraciones. Cuando el feed principal de PLACSP se para más de un día, /licitaciones/abiertas añade los anuncios del DOUE (TED) de esos días con origen «ted» y sin id; /licitaciones/resumen lo avisa en fuentes. Lo detalla la metodología.

¿Puedo importar la API en Postman o generar un cliente?

Sí: https://api.openmoney.es/openapi.json es la descripción OpenAPI 3 de todas las rutas. Vale para Postman, Insomnia, Bruno y para generadores de clientes en cualquier lenguaje.

Referencia de rutas

Generada del OpenAPI de la API (versión 1.0), así siempre coincide con lo que responde. Cada ruta pide la clave y consume una petición de la cuota, salvo las tres marcadas como libres. Los parámetros marcados con * son obligatorios; los demás pueden omitirse.

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) y novedades para una lista de NIF desde una marca.

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), últimas subvenciones concedidas (concesiones), competidores en los mismos órganos y CPV (competidores) y señales aritméticas con su regla (senales). Tiene ficha toda persona jurídica con alguna adjudicación o alguna concesión desde 2022 (origen: placsp o adjudicaciones si contrata, bdns si solo la conocemos por sus subvenciones; n_concesiones, importe_concesiones). 404 si no hay ninguna de las dos: el detail distingue el NIF bien formado del que no lo es.

Parámetros

NombreTipoPor defectoQué es
nif *en la rutatexto, 1-64 caracteres—

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/empresa/A28599033"
Respuesta (recortada)
{
  "nif": "A28599033",
  "nombre_canonico": "INDRA SISTEMAS SA",
  "por_anio": [
    {"anio": 2025, "n_adjudicaciones": 412, "n_menores": 37, "importe": 486120334.2, "importe_menores": 402118.5,
     "n_organos": 168, "licitadores_medio": 3.4, "n_unico_licitador": 51, "n_abiertos": 290}
  ],
  "subvenciones_por_anio": [{"anio": 2025, "n": 3, "importe": 1250000.0, "ayuda_equivalente": 1250000.0}],
  "top_organos": [
    {"organo": "E04973401", "nombre": "Subdirección General de Adquisiciones de Armamento y Material", "tipo": "…",
     "importe": 312004112.3, "n": 21, "desde": 2022, "hasta": 2026, "cuota_max": 0.31}
  ],
  "reparto_nivel": [{"nivel": "estatal", "importe": 1201033112.0, "n": 980}, {"nivel": "…", "importe": 0, "n": 0}],
  "top_cpv": [{"cpv3": "722", "nombre": "Servicios de programación de software y de consultoría", "importe": 512003001.7, "n": 380}],
  "expedientes": [
    {"id_url": "…", "link": "https://contrataciondelestado.es/…", "expediente": "2025/0421", "objeto": "…",
     "organo": "E04973401", "organo_nombre": "…", "fecha_adjudicacion": "2026-08-28", "importe_sin_iva": 1830000.0,
     "presupuesto_sin_iva": 1900000.0, "n_licitadores": 3, "procedimiento": "1", "es_menor": false, "estado": "ADJ", "sospechoso": false}
  ],
  "competidores": [{"nif": "…", "nombre_canonico": "…", "importe": 220310004.1}],
  "senales": [{"…": "…"}]
}

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

GET/empresas/novedadescon clave#

Adjudicaciones y concesiones nuevas para una lista de empresas desde una marca

Para una lista de NIF, lo que las fuentes han publicado desde desde: adjudicaciones (contratos ganados según PLACSP: expediente id, lote, objeto, órgano, importe_sin_iva (con importe_estimado a true cuando la fuente solo publica el importe con IVA y el sin IVA es ese entre 1,21: contratos menores del País Vasco), fecha_adjudicacion, contrato_fecha, resultado, link y actualizado, la versión del expediente que trae la adjudicación) y concesiones (subvenciones según la BDNS: id, convocatoria, quién concede en nivel1 (ESTADO, AUTONOMICA, LOCAL u OTROS), nivel2 (ministerio, comunidad o entidad local) y nivel3 (órgano), importe, fecha_concesion, fecha_alta y url_br). Cada fila lleva su nif y el nombre con el que la fuente escribió a la empresa. Nuevo es lo que la fuente publicó después de la marca, no lo firmado después: una adjudicación de hace meses que PLACSP publica hoy cuenta hoy. Las dos listas salen de una sola secuencia ordenada por instante (versión del expediente o día de alta), así que una página puede traer de las dos; con mas a true repite con el desde y el tras de siguiente, y cuando mas es false guarda siguiente como marca de la próxima consulta. nif devuelve los identificadores aceptados tal como se han buscado e ignorados los que no (DNI, NIE, vacíos), con el motivo. Un expediente que cambia de versión después de adjudicado (formalización, rectificación) vuelve a aparecer, y la marca puede repetir el último día de concesiones: para no avisar dos veces, recuerda lo ya visto por id (concesión) o por id, lote y nif (adjudicación). Hasta 50 NIF por petición con el plan Pro y 500 con el Despacho o con un acuerdo de plataforma; más, en varias llamadas. Las UTE solo por su propio id, no por el NIF de sus miembros. Con solo=adjudicaciones o solo=concesiones (desde el 2026-10-06) la secuencia es de una sola lista: es lo que usa quien solo enseña contratos, para que una página no se le vaya en ayudas.

Parámetros

NombreTipoPor defectoQué es
nif *en la consultalista de texto—NIF de las empresas, separados por comas (o repitiendo el parámetro); hasta 500 distintos (50 con el plan Pro). Un DNI o NIE se ignora y se dice en `ignorados`; una UTE, por su id «UTE-…»
desde *en la consultafecha y hora (ISO 8601)—marca de la última consulta (ISO 8601, UTC si no lleva zona): vuelven las adjudicaciones cuya versión del expediente es igual o posterior y las concesiones dadas de alta ese día o después
trasen la consultatexto, hasta 80 caracteres—cursor de la página anterior (`siguiente.tras`); vacío en la primera página de una marca
limiteen la consultaentero, de 1 a 500200filas por página, entre adjudicaciones y concesiones
soloen la consultatexto, uno de adjudicaciones, concesiones—«adjudicaciones» o «concesiones»: solo esa lista (la página entera es de ella y la otra va vacía); sin él, las dos en una sola secuencia

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/empresas/novedades?nif=B15123177,B16553232,12345678Z&desde=2026-09-10T00:00:00Z"
Respuesta
{
  "desde": "2026-09-10T00:00:00Z", "nif": ["B15123177", "B16553232"],
  "ignorados": [{"nif": "12345678Z", "motivo": "persona física (DNI o NIE): solo personas jurídicas"}],
  "mas": false, "siguiente": {"desde": "2026-09-11T00:00:00Z", "tras": ""},
  "adjudicaciones": [
    {"nif": "B15123177", "adjudicatario": "ELECTRONICA NOROESTE SERVICIOS GENERALES, S.L.", "id": 20353340, "expediente": "PcPG/2026/828991",
     "titulo": "RET-ME-2026-0175: Suministro, instalación y adecuación eléctrica del centro de telecomunicaciones de Santa Cecía…", "objeto": "…",
     "organo": "A12009486", "organo_nombre": "RETEGAL S.A.", "lote": "0", "resultado": "9", "resultado_nombre": "Formalizado",
     "fecha_adjudicacion": null, "contrato_fecha": "2026-09-10", "importe_sin_iva": 12826.0, "presupuesto_sin_iva": 15125.0, "n_licitadores": 3,
     "es_menor": false, "sospechoso": null, "estado": "RES", "estado_nombre": "Resuelta", "n_versiones": null,
     "link": "https://www.contratosdegalicia.gal/licitacion?N=828991", "actualizado": "2026-09-10T18:10:59.151000Z"}
  ],
  "concesiones": [
    {"nif": "B16553232", "beneficiario": "LAVANDERIAS MUVI, S.L.", "id": 156984283, "cod_concesion": "GR156984283",
     "convocatoria": "Reafianzamiento CAIB avales concedidos por ISBA,SGR, en ejercicio 2026 sujetos a minimis", "id_convocatoria": 1096692, "numero_convocatoria": "895131",
     "nivel1": "AUTONOMICA", "nivel2": "ILLES BALEARS", "nivel3": "DIRECCIÓN GENERAL DEL TESORO, POLÍTICA FINANCIERA Y PATRIMONIO", "instrumento": "GARANTÍA",
     "importe": 11250.0, "ayuda_equivalente": 875.0, "fecha_concesion": "2026-08-12", "fecha_alta": "2026-09-11", "url_br": "https://www.caib.es/eboibfront/pdf/es/2023/163/1150418"}
  ]
}

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta 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ámetros

NombreTipoPor defectoQué es
organo *en la rutatexto, 1-64 caracteres—

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/organo/L01280796"
Respuesta (recortada)
{
  "organo": "L01280796",
  "nombre": "Ayuntamiento de Madrid",
  "n_abiertas": 143,
  "por_anio": [{"anio": 2025, "…": "…"}],
  "top_proveedores": [{"anio": 2025, "puesto": 1, "nif": "…", "nombre_canonico": "…", "importe": 98120334.2, "n": 12, "cuota": 0.06}],
  "por_procedimiento": [{"…": "…"}],
  "personas_fisicas": {"…": "…"},
  "expedientes": [{"…": "…"}]
}

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta 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ámetros

NombreTipoPor defectoQué es
ine *en la rutatexto, 1-64 caracteres—

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/municipio/28079"

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta 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).

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/administraciones"

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta 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ámetros

NombreTipoPor defectoQué es
slug *en la rutatexto, 2-40 caracteres—

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/administracion/canarias"

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta 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. Además top_organos (los diez con más abiertas: clave, nombre, n, presupuesto), cpv (las diez categorías de tres dígitos con más abiertas) y por_dataset (de qué feed de PLACSP vienen). Con nuts o administracion, todo acotado a ese territorio o administración (nuts y administracion en la respuesta dicen cuál); con administracion=estado, también por_ministerio. Cambia una vez al día.

Parámetros

NombreTipoPor defectoQué es
nutsen la consultatexto, hasta 5 caracteres—prefijo NUTS del territorio: el lugar de ejecución o, si el expediente no lo concreta, el del órgano. ES70 (Canarias), ES709 (Tenerife)
administracionen la consultatexto, hasta 40 caracteres—slug de /administracion/{slug} («canarias») o «estado»: expedientes de los órganos de esa administración; «estado» añade los de ámbito estatal sin territorio

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/licitaciones/resumen"
Respuesta (recortada)
{
  "n": 388, "presupuesto": 1234567890.5, "organos": 812,
  "cierran_7_dias": 96, "nuevas_7_dias": 140, "sin_territorio": 12, "sin_presupuesto": 30,
  "por_tipo": [{"codigo": "3", "nombre": "Obras", "n": 150, "presupuesto": 612300400.0}, {"codigo": "2", "nombre": "Servicios", "n": 140, "presupuesto": 402118500.5}],
  "por_procedimiento": [{"codigo": "9", "nombre": "Abierto simplificado", "n": 120}, {"codigo": "1", "nombre": "Abierto", "n": 110}],
  "por_comunidad": [{"codigo": "ES51", "nombre": "Cataluña", "n": 60}, {"codigo": "ES30", "nombre": "Comunidad de Madrid", "n": 55}],
  "por_provincia": [{"codigo": "ES511", "nombre": "Barcelona", "n": 35}],
  "version_datos": "2026-09-10"
}

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

GET/licitaciones/abiertascon clave#

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, titulo_leido (desde el 5 de octubre de 2026: el título en llano que la IA escribe al leer el anuncio, en castellano aunque el anuncio vaya en catalán, gallego o euskera: qué se contrata y, si el anuncio lo dice, dónde o para qué, solo con lo que el anuncio dice; null mientras el anuncio no se ha leído y cuando no añade nada al enunciado), órgano (organo, la clave de /organo/{id}; organo_nombre, el órgano de contratación tal como lo publica PLACSP; y organo_entidad, el nombre de la clave, que es la entidad cuando un DIR3 agrupa varios órganos: «Cabildo Insular de Gran Canaria» para su Consejo Insular de Aguas), 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 (lo que publica el anuncio), territorio con territorio_nombre (el territorio efectivo: el lugar de ejecución o, si no lo concreta, el del órgano; en Canarias e Illes Balears la isla del municipio o del cabildo del órgano cuando el anuncio se queda en la comunidad), 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. El territorio se puede decir por su código (nuts) o, desde el 2026-10-06, por su nombre (lugar: una comunidad, una provincia o una isla); la respuesta dice en lugar cómo se ha entendido (nombre y nuts: «Valencia» es la provincia; la comunidad, «Comunitat Valenciana»).

Con como=<nif> la lista son las licitaciones que le encajan a esa empresa, de más a menos (orden=encaje, el orden por defecto con como), y cada fila lleva encaje: puntos, nivel (alto, medio o bajo; se devuelven alto y medio salvo que nivel diga otra cosa), hasta tres motivos en llano y avisos. Es un encaje automático sobre su historial de adjudicaciones (todas, las recientes con más peso): la coincidencia más fina entre los CPV del expediente y los de sus contratos (categoría de cinco dígitos, clase de cuatro, grupo de tres) según lo habitual que sea esa línea en la empresa; el lugar (una provincia o comunidad donde ya ha ganado, o la de su sede; lo de otro sitio resta a quien solo ha ganado cerca de casa); que el órgano ya le haya adjudicado algo; y el presupuesto frente a lo que suele ganar. Sin ningún CPV en común no hay encaje, y el lugar, el órgano y el tamaño no levantan solos un expediente. como en la respuesta dice de quién es el perfil: la empresa, sus grupos CPV principales (cpv3), cuántos expedientes ha ganado (contratos), cuántas en plazo hay de cada nivel (por_nivel), si sus grupos CPV se dedujeron del texto de sus contratos porque ninguno lo lleva (cpv_deducido; entonces el encaje no pasa de «medio») y sus competidores en esos grupos, que hasta el 2026-09-21 ensanchaban el filtro y ya no entran en él. Un presupuesto de una entidad local que no se cree (más de 300 M€ por lote) lleva el aviso «presupuesto por comprobar», no cuenta en el tamaño y con orden=presupuesto va al final.

Sin historial (desde el 2026-09-28). Una empresa sin contratos también encaja: por su sector (sección CNAE) traducido a grupos CPV con un mapa medido en 67.773 empresas que tienen sector e historial (qué grupos gana cada sector más de lo normal), su lugar (municipio, provincia o comunidad) y su tamaño. como.origen dice de dónde sale el perfil: «historial», «declarado» (sector= con provincia=, municipio= o comunidad= y tamano=, que también valen sin como, o su alta a mano en tu cuenta) o «ayudas» (el sector deducido de sus ayudas en la BDNS y su sede, cuando nadie ha dicho el sector; completa el lugar y el tamaño que falten en lo declarado). Con historial, provincia=, municipio= o comunidad= solo completan la sede si sus contratos no la dicen. Ese encaje puntúa por grupo, no pasa de «medio», y sus motivos lo dicen («por tu actividad: construcción», «en tu isla»). Una empresa conocida sin contratos ni sector responde con la lista vacía y como.origen nulo: dale de alta en tu cuenta con su sector, o pásalo en sector=. como.falta dice qué le falta al perfil para encajar: «sector» (sin líneas CPV), «lugar» (un perfil sin historial que no dice dónde está no llega a «medio» con nada: di provincia=, municipio= o comunidad=) o «actividad» (desde el 2026-09-29).

El nombre y la actividad (desde el 2026-09-29). Una letra de sector junta oficios que no se parecen: «industria» es una panadería y una fábrica de tornillos. Desde ese día el mapa de sectores solo da por buena una línea cuando la tiene una de cada cuatro empresas del sector (o una de cada doce, si es muy suya); las demás se quedan en «bajo». Y de una empresa sin contratos se mira también su nombre, con un diccionario medido en 206.000 empresas que sí tienen contratos (qué ganan las que llevan cada palabra en el nombre: «autocares», «limpiezas», «forn»): cuando el nombre dice el oficio, como.origen es «nombre», como.actividad trae las palabras que lo dicen y el motivo de cada fila también («por tu actividad: panadería»). Lo mismo se puede decir a mano con actividad= («panadería y pastelería»), sola o con sector=. Cuando ni el sector ni el nombre dan una línea propia, como.falta dice «actividad» y la lista sale vacía en «alto» y «medio»: es preferible a recomendar lo que gana cualquiera. A igualdad de nivel y de puntos, lo que cierra en dos días o menos va detrás de lo demás.

La actividad manda sobre la letra (desde el 2026-09-30). Con actividad=, lo que solo trae la letra de sector= se queda en «bajo» (la letra es mucho más ancha que el oficio), y cuando el título del expediente dice una palabra de la actividad la fila suma puntos, va delante y lleva el motivo «lo dice el título». Las palabras que el diccionario de nombres no entiende se buscan en otro, medido en los títulos de 2,7 millones de expedientes («peluquería»): lo que sale de ahí solo llega a «medio» cuando el título dice esa palabra. Y una palabra concreta que no entiende ninguno («audiovisual») se busca tal cual en el título, dentro de las líneas de la letra de sector=. Si nada de eso da algo, como.actividad va vacía y como.falta dice «actividad»: prueba con otras palabras. Las letras de sector= son las de la CNAE 2025. Con municipio= en Canarias o en Illes Balears, lo de otra isla no cuenta como «tu comunidad»; y a un autónomo (tamano=autonomo) con provincia o municipio, lo de otra provincia tampoco. De una letra deducida de las ayudas solo cuentan las líneas que ganan cuatro de cada diez empresas del sector; el resto queda en «bajo» y como.falta pide la actividad. Con historial, un título que no comparte ninguna palabra con los de sus contratos se queda en «bajo» (si de la empresa se conocen diez palabras o más, el órgano no le ha adjudicado nunca y no es una comunidad donde se publica también en otra lengua). A los contratos sin código CPV se les deduce el grupo con el mismo diccionario de títulos (antes, solo con las palabras de lo abierto ese día).

origen (desde el 2026-09-14): «placsp» en todas las filas salvo durante una parada del feed principal de PLACSP (más de 30 horas sin publicar; fuentes.parada_desde en /licitaciones/resumen), cuando la lista añade los anuncios del Diario Oficial de la Unión Europea (TED) publicados desde entonces que PLACSP aún no ha publicado: origen «ted», id nulo (no tienen ficha), link al anuncio en TED y presupuesto_origen «estimado». En cuanto PLACSP publica el expediente, la fila provisional desaparece y sale la de PLACSP con su id. El parámetro origen filtra por fuente.

Parámetros

NombreTipoPor defectoQué es
cpven la consultatexto, hasta 100 caracteres—prefijos CPV de 2 a 8 dígitos separados por comas: «45» o «45233,71»
nutsen la consultatexto, hasta 5 caracteres—prefijo NUTS del territorio (el lugar de ejecución o, si no lo concreta, el del órgano): ES51 (Cataluña), ES511 (Barcelona)
lugaren la consultatexto, 2-60 caracteres—el territorio por su nombre, cuando no se tiene el código NUTS: una comunidad, una provincia o una isla («Canarias», «Girona», «Tenerife», «Valencia/València»); filtra como `nuts`, que manda si llegan los dos. Los municipios no valen. 422 si no se reconoce
administracionen la consultatexto, hasta 40 caracteres—slug de /administracion/{slug} («canarias») o «estado»: solo los expedientes de los órganos de esa administración; «estado» añade los de ámbito estatal sin territorio
tipoen la consultatexto, hasta 40 caracteres—códigos de tipo de contrato separados por comas (1 suministros, 2 servicios, 3 obras…)
procedimientoen la consultatexto, hasta 40 caracteres—códigos de procedimiento separados por comas (1 abierto, 9 abierto simplificado…)
presupuesto_minen la consultanúmero, de 0 a 1000000000000—
presupuesto_maxen la consultanúmero, de 0 a 1000000000000—
diasen la consultaentero, de 0 a 730—solo las que cierran en estos días o menos
plazo_desdeen la consultafecha (AAAA-MM-DD)—
plazo_hastaen la consultafecha (AAAA-MM-DD)—
organoen la consultatexto, hasta 64 caracteres—clave del órgano (la de /organo/{id})
comoen la consultatexto, 1-64 caracteres—NIF de una empresa: solo las licitaciones que le encajan, cada una con su `encaje`: por su historial si tiene contratos (sus categorías CPV, dónde gana, el tamaño de sus contratos y los órganos que ya le han adjudicado); si no, por su actividad, su sector y su lugar (lo que digas en `actividad=`, `sector=`, `provincia=`…, lo de su alta a mano en tu cuenta y, para lo que falte, lo que dice su nombre y lo deducido de sus ayudas en la BDNS). 404 solo si no la conocemos y no dices su sector ni su actividad
sectoren la consultatexto, hasta 30 caracteres—perfil sin historial: el sector de la empresa en la CNAE 2025 (la que usa la BDNS: K es informática, N servicios profesionales, O servicios auxiliares, Q educación y R sanidad; no son las letras de la CNAE 2009): la letra de su sección («F») o, mejor, su código de dos, tres o cuatro cifras («43», «43.2», «4322»: el grupo dice el oficio y la letra no; un código de cuatro cifras vale como su grupo), separados por comas hasta cinco («F,N», «43.2»); con `como`, completa a una empresa sin contratos; sin `como`, el perfil es solo esto. Con `provincia`, `municipio` o `comunidad`: sin lugar nada llega a «medio» (`como.falta` lo dice)
provinciaen la consultatexto, hasta 2 caracteres—con `sector`: provincia INE de dos dígitos («38»); en una provincia con islas, todas sus islas
municipioen la consultatexto, hasta 5 caracteres—con `sector`: municipio INE de cinco dígitos («38038»); da su isla o su provincia y manda sobre `provincia`
comunidaden la consultatexto, hasta 40 caracteres—con `sector`: slug de comunidad («canarias») cuando no se sabe más
tamanoen la consultatexto, hasta 10 caracteres—con `sector`: «autonomo», «pymes» o «grandes»; solo resta cuando el presupuesto es desproporcionado
actividaden la consultatexto, 3-200 caracteres—perfil sin historial: a qué se dedica la empresa, con sus palabras («panadería y pastelería», «mantenimiento de ascensores»); se traduce a categorías CPV con un diccionario medido en las empresas que sí tienen contratos, y sus palabras se buscan en el título de cada expediente. Vale sola o con `sector` (con ella, lo que solo trae la letra se queda en «bajo»), y es lo que pide `como.falta` cuando dice «actividad»
nivelen la consultatexto, patrón ^(alto|medio|bajo)(,(alto|medio|bajo)){0,2}$—solo con `como` o `sector`: niveles de encaje que se devuelven (por defecto «alto,medio»)
nuevas_desdeen la consultafecha (AAAA-MM-DD)—solo las anunciadas ese día o después (lo nuevo desde una fecha)
qen la consultatexto, 2-80 caracteres—texto libre sobre objeto, título, expediente y órgano. Busca de cinco maneras a la vez y ordena por lo que mejor casa (`orden=relevancia`, el orden por defecto con `q`): el texto completo (cada palabra por su raíz, sin tildes), las palabras tal como se escriben (cada una por el comienzo de una palabra, en singular o plural; una sigla vale por lo que significa y al revés, «PRL» y «riesgos laborales»; las palabras más frecuentes, por sus equivalentes en catalán, gallego y euskera, «limpieza» encuentra «neteja»; y el nombre del código CPV principal cuenta como texto), el oficio que pide cada anuncio, leído por la IA al publicarse («asfaltado» trae lo que pide «asfalto» o «pavimentación de calles» aunque no lo diga con esas palabras, también en catalán o gallego; `busqueda.oficios` en la respuesta dice con qué oficios casa lo escrito), lo parecido cuando nada de eso trae algo («mantenimento» encuentra «mantenimiento») y lo cercano en significado («ascensores» trae «aparatos elevadores»), que va detrás de todo lo demás; ni el oficio ni el significado se consultan con un número de expediente ni con un órgano por su nombre. Cada fila dice en `busqueda.por` qué la trajo. Las palabras vacías («de», «para») no se exigen. Un lugar escrito en la caja (una comunidad, una provincia o una isla: «limpieza colegios tenerife») filtra como `nuts=` y se busca el resto; `busqueda.lugar` en la respuesta lo dice. Con una palabra de órgano («cabildo de tenerife») el lugar se queda en el texto. El mismo expediente anunciado dos veces sale una vez
significadoen la consultabooleanotruecon `q`: 0 para no traer lo cercano en significado, solo lo que lleva las palabras (tal cual, por su raíz o con una errata); es lo que hace el correo diario con las búsquedas guardadas
ordenen la consultatexto, uno de encaje, plazo, presupuesto, reciente, relevancia—por defecto «plazo»; con `q`, «relevancia» (lo que mejor casa con el texto, y a igualdad el plazo), que solo vale con `q`; con `como`, `sector` o `actividad`, «encaje» (de más a menos encaje), que solo vale con ellos
desdeen la consultaentero, de 0 a 100000
limiteen la consultaentero, de 1 a 10025expedientes por página
origenen la consultatexto, uno de todos, placsp, tedtodos«placsp» solo lo publicado en PLACSP; «ted» solo los anuncios provisionales del DOUE (los hay solo mientras el feed 643 está parado); «todos», ambos

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/licitaciones/abiertas?cpv=45&nuts=ES51&dias=30&orden=presupuesto&limite=100"
Respuesta
{
  "total": 377, "desde": 0, "limite": 100, "orden": "presupuesto", "como": null,
  "resultados": [
    {
      "id": 20194230,
      "expediente": "OP. NG-02083",
      "titulo": "Ejecución de las obras del proyecto constructivo. Variante de las Presas y de Ol…",
      "objeto": "Ejecución de las obras del proyecto constructivo. Variante de las Presas y de Ol…",
      "organo": null, "organo_nombre": "Infraestructures de la Generalitat de Catalunya, SAU",
      "tipo": "3", "tipo_nombre": "Obras",
      "procedimiento": "1", "procedimiento_nombre": "Abierto",
      "presupuesto": 369605174.52, "presupuesto_origen": "sin_iva",
      "cpv": [{"codigo": "45233120", "nombre": "Trabajos de construcción de carreteras."}],
      "lugar": null, "nuts": "ES512", "nuts_nombre": "Girona",
      "fecha_anuncio": "2026-07-31", "fin_plazo_ofertas": "2026-09-28", "dias_restantes": 18, "n_lotes": 5,
      "link": "https://contractaciopublica.cat/ca/detall-publicacio/38380596-bf71-4ee…",
      "actualizado": "2026-09-02T14:04:25.940000Z"
    },
    {"…": "los otros 99 de esta página"}
  ]
}

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

GET/licitaciones/{id}con clave#

Ficha de un expediente: lotes, pliegos, anuncios, condiciones, 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 con su nombre (la lista depende del tipo: obras, servicios, suministros o patrimonial), urgencia, sistema de contratación, sara, financiación, los tres presupuestos publicados, lugar, ciudad y código postal, número de resultados y versiones, y titulo_leido como en la lista (el título en llano escrito por la IA al leer el anuncio; null sin lectura). 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.

Lo que el anuncio publica sobre cómo se licita (según PLACSP; los pliegos mandan): hora límite de ofertas (fin_plazo_ofertas_hora, fin_plazo_ofertas_nota), fin de solicitudes de participación y de obtención de documentación, subasta electrónica, presentación por lotes (presentacion_lotes con nombre, máximos de lotes por oferta y por adjudicatario), candidatos en restringidos, contrato mixto, prórroga, variantes, revisión de precios, recursos recibidos, todos los programas de financiación (financiacion_codigos), id del TED, legislación y declaraciones exigidas (códigos con nombre). Desde el 2026-09-20, la duración prevista del contrato (duracion, entera, en duracion_unidad: DAY, MON o ANN), su inicio y su fin previstos (plazo_inicio, plazo_fin; casi siempre viene o la duración o las fechas) y la forma de presentación de las ofertas (forma_presentacion con nombre: electrónica, manual o las dos); solo en los expedientes cargados desde ese día y en los que estaban en plazo, null en el resto y en los contratos menores, que no publican la forma. Y las listas: lotes (número, nombre, presupuestos y CPV), documentos (pliegos administrativo y técnico, anexos, documentos del expediente como actas y memorias, y los de los anuncios como la resolución de adjudicación: origen, tipo con nombre, nombre, URL, hash SHA-1 en base64 cuando lo hay), anuncios (tipo con nombre, medio, fecha y fecha de envío; varias fechas del mismo tipo y medio son rectificaciones), criterios de adjudicación (por lote, nulo = todo el expediente; tipo OBJ cuantificable o SUBJ juicio de valor, subtipo, descripción, peso en % cuando suman 100 y en puntos si no, nota), requisitos (por lote y clase: solvencia_economica, solvencia_tecnica, clasificacion, condicion_ejecucion, subcontratacion, situacion_personal, plantilla_minima, antiguedad_minima, otros; con código y nombre, descripción y umbral) y garantias (provisional, definitiva o complementaria, en % o en euros). Cobertura real: la mitad de las abiertas trae criterios y solvencia (las plataformas autonómicas agregadas solo mandan pliegos) y casi todas las del feed de perfiles traen pliego. Desde el 2026-09-21 cada fila de criterios, requisitos y garantias lleva origen: null si viene del anuncio de PLACSP y pscp si se leyó del anuncio oficial en la plataforma catalana (Plataforma de Serveis de Contractació Pública), que es de donde salen las condiciones de las licitaciones catalanas en plazo; esas filas van en la lengua en que se publicaron, casi siempre en catalán.

acceso (desde el 2026-09-14): cuenta con una clave de cuenta o con la sesión del visitante de la web, y entonces va todo; visitante con la clave de servicio de la web y sin sesión (la ficha pública /licitacion/{id} de openmoney.es). Desde el 2026-09-16 el visitante recibe también criterios, requisitos, garantias y declaraciones (decisión del usuario tras comparar con la competencia: las condiciones del anuncio se enseñan a todos y así Google las indexa); lo único que sigue con cuenta es antecedentes.filas, las adjudicaciones anteriores del órgano una a una (los agregados de antecedentes sí van).

Parámetros

NombreTipoPor defectoQué es
id *en la rutaentero, de 1 a 1000000000000—número del expediente en PLACSP (`id` en la lista y en las novedades)

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/licitaciones/20379296"
Respuesta (recortada)
{
  "id": 20379296, "expediente": "2026/ETSAE0327/00004180E", "titulo": "Adecuación de pistas de conducción en Cenad San Gregorio, Zaragoza.",
  "estado": "RES", "estado_nombre": "Resuelta", "abierta": false, "baja": null, "acceso": "cuenta",
  "organo": "EA0003109", "organo_nombre": "Jefatura de Intendencia de Asuntos Económicos Este",
  "organo_padres": ["SAECO de la Jefatura de Intendencia de Asuntos Económicos del Este", "Ejército de Tierra", "…"],
  "tipo": "3", "tipo_nombre": "Obras", "procedimiento": "1", "procedimiento_nombre": "Abierto",
  "presupuesto": 8429.75, "presupuesto_origen": "sin_iva",
  "presupuesto_sin_iva": 8429.75, "presupuesto_estimado": 8429.75, "presupuesto_total": 10200.0,
  "cpv": [{"codigo": "45100000", "nombre": "Trabajos de preparación del terreno."}],
  "lugar": "Zaragoza", "nuts": "ES243", "nuts_nombre": "Zaragoza", "lugar_ciudad": null, "lugar_cp": null,
  "fecha_anuncio": null, "fin_plazo_ofertas": "2026-07-30", "dias_restantes": null,
  "n_lotes": 0, "n_resultados": 1, "n_versiones": null, "link": "https://contrataciondelestado.es/…",
  "fin_plazo_ofertas_hora": "14:00:00", "fin_plazo_ofertas_nota": null, "fin_solicitudes": null, "fin_documentacion": "2026-07-30",
  "subasta_electronica": false, "presentacion_lotes": null, "presentacion_lotes_nombre": null, "max_lotes_oferta": null, "max_lotes_adjudicados": null,
  "candidatos_min": null, "candidatos_max": null, "contrato_mixto": false, "prorroga": null, "prorroga_opciones": null, "variantes": false,
  "revision_precios": "No procede", "recursos": 0, "financiacion_codigos": [{"codigo": "NO-EU", "nombre": "No hay financiación con fondos de la UE"}],
  "ted_uuid": null, "legislacion": "3", "legislacion_nombre": "Ley 9/2017",
  "declaraciones": [{"codigo": "1", "nombre": "Capacidad de obrar"}, {"codigo": "2", "nombre": "No prohibición para contratar"}],
  "duracion": 3, "duracion_unidad": "MON", "plazo_inicio": null, "plazo_fin": null, "forma_presentacion": "1", "forma_presentacion_nombre": "Electrónica",
  "lotes": [],
  "documentos": [
    {"origen": "pliego_administrativo", "tipo_codigo": null, "tipo_nombre": null, "nombre": "PCAP.pdf", "url": "https://contrataciondelestado.es/FileSystem/servlet/GetDocumentByIdServlet?…", "hash": "fAKr1ZUbmyjb29lUyFyB89x6q9M=", "anuncio_tipo": null, "anuncio_nombre": null, "orden": 1},
    {"origen": "expediente", "tipo_codigo": "12", "tipo_nombre": "Acta del órgano de asistencia", "nombre": "Acta de la mesa", "url": "https://contrataciondelestado.es/wps/wcm/connect/…", "hash": null, "anuncio_tipo": null, "anuncio_nombre": null, "orden": 1},
    {"origen": "anuncio", "tipo_codigo": "ACTA_ADJ", "tipo_nombre": "Documento de Acta de Adjudicación", "nombre": "Resolución de adjudicación.pdf", "url": "https://…", "hash": null, "anuncio_tipo": "DOC_CAN_ADJ", "anuncio_nombre": "Anuncio de adjudicación", "orden": 1}
  ],
  "anuncios": [
    {"tipo": "DOC_CN", "tipo_nombre": "Anuncio de licitación", "medio": "Perfil del contratante", "fecha": "2026-07-01", "envio_fecha": null},
    {"tipo": "DOC_CN", "tipo_nombre": "Anuncio de licitación", "medio": "Perfil del contratante", "fecha": "2026-07-08", "envio_fecha": null},
    {"tipo": "DOC_CAN_ADJ", "tipo_nombre": "Anuncio de adjudicación", "medio": "Perfil del contratante", "fecha": "2026-09-08", "envio_fecha": null}
  ],
  "criterios": [
    {"lote": null, "tipo": "OBJ", "tipo_nombre": "Cuantificables Automáticamente", "subtipo": "1", "subtipo_nombre": "Precio", "descripcion": "Precio", "peso": 70, "nota": "Fórmula lineal", "orden": 1},
    {"lote": null, "tipo": "SUBJ", "tipo_nombre": "Juicio de Valor", "subtipo": "99", "subtipo_nombre": "Otros", "descripcion": "Memoria técnica", "peso": 30, "nota": null, "orden": 2}
  ],
  "requisitos": [
    {"lote": null, "clase": "solvencia_economica", "codigo": "5", "nombre": "Cifra anual de negocio", "descripcion": "Volumen anual de negocios de al menos 12.000 €", "umbral": 12000, "orden": 1},
    {"lote": null, "clase": "solvencia_tecnica", "codigo": "OSR-COMPTASK", "nombre": "Trabajos realizados", "descripcion": "Relación de obras similares de los últimos cinco años", "umbral": null, "orden": 2},
    {"lote": null, "clase": "condicion_ejecucion", "codigo": "1", "nombre": "Consideraciones de tipo ambiental", "descripcion": "Gestión de residuos de obra", "umbral": null, "orden": 3}
  ],
  "garantias": [{"lote": null, "tipo": "2", "tipo_nombre": "Definitiva", "porcentaje": 5, "importe": null}],
  "adjudicaciones": [
    {"lote": null, "resultado": "9", "resultado_nombre": "Formalizado", "fecha_adjudicacion": "2026-09-08", "n_licitadores": 2,
     "nif": "A50046408", "tipo_nif": "juridica", "adjudicatario": "ARAELECTRIC S.A.", "pyme": true, "importe_sin_iva": 4978.94, "importe_con_iva": 6024.52,
     "oferta_minima": 0.0, "oferta_maxima": 0.0, "contrato_fecha": "2026-09-08", "es_menor": false, "sospechoso": null}
  ],
  "antecedentes": {
    "organo": "EA0003109", "cpv3": ["451"], "anios": 3, "n": 53, "adjudicatarios": 24, "importe_medio": 29958.147358490565, "baja_media": 0.14981140630088008,
    "filas": [
      {"id": 20377002, "objeto": "Derrumbe de los muros de la antigua galería de tiro ed.407 en el Acto.…", "procedimiento": "1", "lote": null, "nif": "B60393642", "adjudicatario": "MATERIALES Y CONSTRUCCIONES GAMA, SL",
       "fecha_adjudicacion": "2026-09-07", "importe_sin_iva": 29702.58, "presupuesto_sin_iva": 32617.01, "n_licitadores": 1, "baja": 0.0893530706830577, "link": "https://contrataciondelestado.es/…"},
      {"…": "hasta 20, las más recientes"}
    ]
  },
  "…": "…"
}

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

GET/licitaciones/novedadescon clave#

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ámetros

NombreTipoPor defectoQué es
desde *en la consultafecha y hora (ISO 8601)—marca de la última consulta (ISO 8601); vuelven los expedientes con updated igual o posterior
trasen la consultatexto, hasta 300 caracteres—id_url del último expediente recibido con ese mismo updated, para seguir la página
limiteen la consultaentero, de 1 a 500200

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/licitaciones/novedades?desde=2026-09-09T05:00:00Z&limite=500"
Respuesta
{
  "desde": "2026-09-09T05:00:00Z", "mas": true,
  "siguiente": {"desde": "2026-09-09T10:05:07.693000Z", "tras": "https://contrataciondelestado.es/sindicacion/PlataformasAgregadasSinMenores/20371637"},
  "expedientes": [
    {"id": 20384205, "expediente": "201/2026", "titulo": "Adquisición de material de mantenimiento.", "organo": "L01342257", "organo_nombre": "Alcaldía del Ayuntamiento de Villamuriel de Cerrato",
     "estado": "RES", "estado_nombre": "Resuelta", "abierta": false, "baja": null, "tipo": "1", "tipo_nombre": "Suministros", "procedimiento": "6", "procedimiento_nombre": "Contrato menor",
     "presupuesto": 165.29, "presupuesto_origen": "sin_iva", "presupuesto_sin_iva": 165.29, "presupuesto_estimado": 165.29, "actualizado": "2026-09-09T05:41:32.468000Z", "…": "los demás campos de la lista"},
    {"…": "hasta 500"}
  ],
  "bajas": [{"id_num": 19922421, "id_url": "https://contrataciondelestado.es/sindicacion/datosAbiertosMenores/19922421", "expediente": "24675", "baja": "2026-09-09T06:00:03.874000Z"}],
  "bajas_mas": false
}

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

GET/licitaciones/coberturacon clave#

Cobertura por fuente, comunidad y año

Paso 4.º (4E): cuántos expedientes hay por fuente (dataset: 643, 1143 y 1044 de PLACSP; cat, eus y and, los menores de las plataformas catalana, vasca y andaluza), comunidad del lugar de ejecución (nuts2, nulo sin territorio) y año, y de ellos cuántos con clave de órgano (con_organo; con_organo_bueno excluye las claves de plataforma sin DIR3 ni NIF), con criterios de adjudicación, con adjudicatario identificado y con anuncio en el TED. Es lo que /metodologia enseña como cobertura. Sale de la vista cobertura_fuentes, refrescada cada noche; vacío hasta el primer refresco tras la migración 20260914000003.

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

GET/licitaciones/{id}/pliegocon clave#

Lo leído por IA del pliego administrativo del expediente, con su frase y su página

Como el GET de las bases, para el pliego de cláusulas administrativas (solvencia, clasificación, habilitación, criterios, garantías, plazo, lotes, visita y subcontratación). Lo leído se enseña con cuenta (en la beta, solo a la lista); oculta dice por qué no va. Dato leído por IA, aparte y marcado: los pliegos mandan.

Parámetros

NombreTipoPor defectoQué es
id *en la rutaentero, de 1 a 1000000000000—número del expediente en PLACSP

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

POST/licitaciones/{id}/pliegocon clave#

Leer el pliego administrativo con IA (planes de pago)

Como el POST de las bases, sobre el pliego administrativo enlazado en el anuncio (nunca el técnico).

Parámetros

NombreTipoPor defectoQué es
id *en la rutaentero, de 1 a 1000000000000—número del expediente en PLACSP
forzaren la consultabooleanofalsevolver a leer aunque ya esté leído (beta y administradores)

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

POST/licitaciones/encajecon clave#

Radar por lotes: las licitaciones en plazo que le encajan a cada cliente de una cartera

Para una cartera de clientes, las limite licitaciones en plazo que mejor le encajan a cada uno, con sus motivos: lo que una plataforma o una asesoría pide cada mañana en una llamada en vez de una por NIF. Cada cliente va por nif (su historial de contratos si lo tiene; si no, lo que digas de él aquí o en su alta a mano en tu cuenta y, para lo que falte, el sector deducido de sus ayudas en la BDNS y su sede) o por perfil declarado (sector con provincia, municipio o comunidad, y tamano), como en /licitaciones/abiertas; con las dos cosas el historial manda. Hasta 500 clientes por petición con el plan Despacho o con un acuerdo de plataforma y 50 con el plan Pro (uso propio); más, en varias llamadas. POST porque el perfil por cliente no cabe en una URL.

La respuesta lleva clientes en el mismo orden: ref tal como llegó y nif normalizado («b-38.515.854» → B38515854; cruza por ref), estado («historial», «nombre», «ayudas», «declarado», o «sin_perfil» cuando no hay con qué encajar: NIF desconocido sin sector ni actividad, persona física, sección que no licita), motivo (con «sin_perfil» por qué; y también cuando el NIF no valía pero el cliente encaja por lo declarado, o cuando al perfil le falta el lugar o la actividad y por eso nada llega a «medio»), perfil (el mismo bloque que como en la lista, con falta), por_nivel y licitaciones (las de la lista, sin objeto, cada una con su encaje: puntos, nivel, motivos y avisos, con «nueva» si se anunció desde nuevas_desde). abiertas es cuántas había en plazo al calcular. Cuenta como una petición de la cuota diaria. Las abiertas se leen una vez por lote y los perfiles iguales se puntúan una vez: una cartera de 500 pymes tarda unos segundos.

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

CPV

Qué se contrata en cada categoría del CPV (el código europeo que dice de qué va un contrato): cuánto, quién compra, quién gana y qué está en plazo.

GET/cpvcon clave#

Las categorías CPV: qué se contrata, cuánto y cuántas licitaciones hay en plazo

Las 45 divisiones del CPV (divisiones, dos dígitos) y las categorías de tres dígitos con contratos desde 2022 (categorias, cada una con su division), ordenadas por importe adjudicado en el último año completo (anio_ref): n e importe de ese año, n_total e importe_total desde 2022 (desde-hasta), y n_abiertas y presupuesto_abiertas de las licitaciones en plazo hoy con algún código de la categoría. Arriba, los totales del índice y n_abiertas_sin_cpv (expedientes en plazo sin ningún código, que no caben en ninguna categoría). Un expediente con códigos de varias categorías cuenta en cada una; dentro de una categoría, una sola vez. Cambia una vez al día. 503 hasta que las vistas por CPV se hayan calculado en la base.

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/cpv"
Respuesta (recortada)
{
  "anio_ref": 2025, "n_categorias": 317, "n_divisiones": 45, "importe": 48120334001.2, "n": 612040,
  "n_abiertas": 5398, "n_abiertas_sin_cpv": 60,
  "divisiones": [
    {"codigo": "45", "nombre": "Trabajos de construcción", "n": 98120, "importe": 12403118500.5, "n_total": 401230,
     "importe_total": 51230004112.3, "n_abiertas": 1812, "n_categorias": 8}
  ],
  "categorias": [
    {"cpv3": "452", "nombre": "Trabajos generales de construcción de inmuebles y obras de ingeniería civil", "division": "45",
     "n": 61204, "importe": 9803118500.5, "n_total": 250110, "importe_total": 40120004112.3, "desde": 2022, "hasta": 2026,
     "n_abiertas": 944, "presupuesto_abiertas": 6806043075.89}
  ],
  "version_datos": "2026-09-11"
}

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

GET/cpv/{codigo}con clave#

Una categoría CPV: cuánto se contrata, quién compra, quién gana y qué está en plazo

Una categoría de tres dígitos: nombre y division de la nomenclatura, generico si es el código genérico de la división («450» es 45000000); por_anio (contratos adjudicados desde 2022: n, importe, menores, sin adjudicatario identificado, n_organos y n_empresas distintos, baja_media sobre el presupuesto en los expedientes sin lotes, licitadores_medio y n_unico_licitador en los procedimientos abiertos); por_procedimiento, top_organos (los veinte que más adjudican) y top_empresas (las veinte que más ganan) en la ventana de los últimos tres años, cada uno con su cuota sobre el importe de la categoría en esos años; abiertas (expedientes en plazo hoy con algún código de la categoría: n, presupuesto sin IVA, órganos, cuántos cierran en siete días y cuántos son nuevos; la lista con filtros es /licitaciones/abiertas?cpv=<código>); y relacionadas, las demás categorías de la división. Importes sin IVA, adjudicados, no pagos; cada adjudicación cuenta una vez por categoría. 404 si el código no existe en la nomenclatura o no tiene contratos ni licitaciones; 503 hasta que las vistas por CPV estén calculadas.

Parámetros

NombreTipoPor defectoQué es
codigo *en la rutatexto, 1-8 caracteres—los tres primeros dígitos del CPV («452»); con un código completo de ocho dígitos («45233140») se toman los tres primeros

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/cpv/158"
Respuesta (recortada)
{
  "cpv3": "158", "codigo": "15800000", "nombre": "Productos alimenticios diversos", "generico": false,
  "division": {"codigo": "15", "nombre": "Alimentos, bebidas, tabaco y productos afines"},
  "anio_ref": 2025, "ventana": {"desde": 2024, "anios": 3, "n": 8393, "importe": 282027444.06},
  "por_anio": [
    {"anio": 2025, "n": 3580, "importe": 114053069.1, "n_menores": 2610, "importe_menores": 18230114.2,
     "n_sin_adjudicatario": 41, "importe_sin_adjudicatario": 302118.5, "baja_media": 0.039, "n_baja": 812,
     "licitadores_medio": 2.2, "n_con_licitadores": 1030, "n_abiertos": 1061, "n_unico_licitador": 464,
     "n_organos": 519, "n_empresas": 1127}
  ],
  "por_procedimiento": [{"procedimiento": "1", "nombre": "Abierto", "n": 2002, "importe": 219433969.0}],
  "top_organos": [{"organo": "A01004623", "nombre": "Servicio Andaluz de Salud", "importe": 42860643.1, "n": 36, "desde": 2024, "hasta": 2026, "cuota": 0.152}],
  "top_empresas": [{"nif": "B91016238", "nombre_canonico": "PLATAFORMA FEMAR SL", "tipo": "juridica", "importe": 38067148.4, "n": 515, "desde": 2024, "hasta": 2026, "cuota": 0.135}],
  "abiertas": {"n": 27, "presupuesto": 9492366.93, "organos": 16, "cierran_7_dias": 14, "nuevas_7_dias": 1},
  "relacionadas": [{"cpv3": "151", "nombre": "Productos de origen animal, carne y productos cárnicos", "importe": 120330114.0, "n": 3012}],
  "version_datos": "2026-09-11"
}

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

Subvenciones

Convocatorias de subvenciones de la BDNS que admiten solicitudes hoy (concurrencia competitiva, concesión directa con bases y ayudas directas a particulares), con filtros, ficha con documentos, anuncios y concesiones ya publicadas, y novedades desde una marca.

GET/convocatorias/resumencon clave#

Cuántas convocatorias de subvenciones hay en plazo y cómo se reparten

Convocatorias abiertas hoy, por defecto las que se pueden pedir: concurrencia competitiva y concesión directa con bases (tipo como en /convocatorias/abiertas): n con fecha de fin de solicitud hoy o posterior, plazo_texto con el plazo solo en texto (recibidas en los últimos ventana_texto_dias), total las dos, el presupuesto convocado de las que tienen fecha, órganos distintos, cuántas cierran en siete días y cuántas se recibieron esta semana, nacionales (ámbito toda España) y abren_mas_tarde (plazo que aún no ha empezado). Y el reparto por tipo de beneficiario (una convocatoria cuenta en cada tipo que admite), comunidad autónoma (slug de /administracion/{slug}; una convocatoria de varias comunidades cuenta en cada una, y sin_nacionales deja fuera las de ámbito nacional que además la nombran: sin_nacionales + nacionales es el total de comunidad=<slug>,estado), sección CNAE, nivel de administración y finalidad: los valores que admiten los filtros de /convocatorias/abiertas. Las fichas repetidas (la misma ayuda dada de alta una vez por beneficiario) cuentan una sola vez, como en la lista: total es el total de /convocatorias/abiertas sin filtros. Cambia una vez al día.

Parámetros

NombreTipoPor defectoQué es
comunidaden la consultatexto, hasta 40 caracteres—slug de comunidad (el de /administracion/{slug}: «canarias») o «estado» (ámbito nacional)
tipoen la consultatexto, hasta 80 caracteres, patrón ^(competitiva|directa_canonica|directa_instrumental|instrumental_particulares|directa|todas)(,(competitiva|directa_canonica|directa_instrumental|instrumental_particulares|directa|todas))*$competitiva,directa_canonica,instrumental_particularescompetitiva (concurrencia competitiva), directa_canonica (concesión directa con bases: la pide quien cumple los requisitos, sin competir), directa_instrumental (nominativas y convenios, con destinatario), instrumental_particulares (la instrumental cuyo beneficiario declarado incluye a particulares: emergencia social, alquiler), directa (canónica e instrumental) o todas; varios separados por comas. Por defecto competitiva,directa_canonica,instrumental_particulares: todo lo que se puede pedir

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/convocatorias/resumen?comunidad=canarias"

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

GET/convocatorias/abiertascon clave#

Convocatorias de subvenciones en plazo, con filtros

Convocatorias que admiten solicitudes hoy, filtradas y paginadas: total (sobre lo filtrado), desde, limite, orden y resultados. Cada una trae numero (el de la BDNS, el de /convocatorias/{numero} y del enlace link), titulo, órgano (organo, organo_padre, nivel con nombre), tipo con nombre, presupuesto convocado, mrr, fechas de recepción, inicio y fin de solicitud, fecha_fin_origen (bdns, o texto cuando la BDNS trae la fecha escrita en el campo de texto y nada más: «12/06/2026»), texto_inicio y texto_fin (el plazo literal cuando no hay fecha), estado (en_plazo o plazo_texto), dias_restantes, abierto (la marca de la BDNS, que no significa en plazo), beneficiarios (literales) y beneficiario_tipos (códigos con nombre), sectores (secciones CNAE con nombre) y sectores_detalle, regiones (NUTS con nombre) y regiones_detalle, comunidades (slugs), ambito, finalidad, instrumentos, fondos, bases_url, sede, n_documentos, n_anuncios, actualizado, cambio, repetidas y nombre_comun (el nombre por el que se conoce la ayuda, «Bono infantil», cuando sus bases se han leído con IA y el documento se lo da; nulo en las demás, que son casi todas; q también lo busca). Los filtros se combinan con Y; los de listas admiten varios valores separados por comas. El orden por defecto pone primero las que antes cierran y, al final, las que solo tienen el plazo en texto.

Fichas repetidas: cuando un órgano da de alta la misma ayuda una vez por beneficiario (54 «Becas comedor» el mismo día) la lista trae una sola fila, la más reciente, con repetidas: cuántas más hay como ella entre lo filtrado (0 en el resto). total y la paginación cuentan filas, no fichas. Solo se junta la concesión directa instrumental dirigida a particulares, con el mismo órgano y el mismo título salvo números; el presupuesto es el de la ficha que se enseña, no la suma. iguales_a=<numero> devuelve las de su grupo una a una y agrupar=false, la lista entera sin juntar nada.

Parámetros

NombreTipoPor defectoQué es
comunidaden la consultatexto, hasta 200 caracteres—slugs de comunidad separados por comas («canarias,galicia»; los de /administracion/{slug}) o «estado» (ámbito nacional)
ambitoen la consultatexto, hasta 10 caracteres—nacional (toda España), comunidad (una), varias o exterior
nutsen la consultatexto, hasta 5 caracteres—prefijo NUTS de las regiones de la ficha: ES70 (Canarias), ES705 (Gran Canaria)
sectoren la consultatexto, hasta 50 caracteres—secciones de la CNAE 2025 separadas por comas (letras de la A a la V: «C,J»)
beneficiarioen la consultatexto, hasta 100 caracteres—tipos separados por comas: empresas (pymes o grandes), pymes, grandes, entidades, particulares, otros
nivelen la consultatexto, hasta 60 caracteres—estado, autonomica, local u otros, separados por comas
finalidaden la consultatexto, 2-80 caracteres—finalidad tal como la da /convocatorias/resumen («Cultura»)
tipoen la consultatexto, hasta 80 caracteres, patrón ^(competitiva|directa_canonica|directa_instrumental|instrumental_particulares|directa|todas)(,(competitiva|directa_canonica|directa_instrumental|instrumental_particulares|directa|todas))*$competitiva,directa_canonica,instrumental_particularescompetitiva (concurrencia competitiva), directa_canonica (concesión directa con bases: la pide quien cumple los requisitos, sin competir), directa_instrumental (nominativas y convenios, con destinatario), instrumental_particulares (la instrumental cuyo beneficiario declarado incluye a particulares: emergencia social, alquiler), directa (canónica e instrumental) o todas; varios separados por comas. Por defecto competitiva,directa_canonica,instrumental_particulares: todo lo que se puede pedir
plazoen la consultatexto, uno de fecha, texto—fecha: solo con fecha de fin; texto: solo con el plazo en texto
presupuesto_minen la consultanúmero, de 0 a 1000000000000—
presupuesto_maxen la consultanúmero, de 0 a 1000000000000—
diasen la consultaentero, de 0 a 730—solo las que cierran en estos días o menos (con fecha)
nuevas_desdeen la consultafecha (AAAA-MM-DD)—solo las publicadas en la BDNS ese día o después (lo nuevo desde una fecha)
plazo_desdeen la consultafecha (AAAA-MM-DD)—
plazo_hastaen la consultafecha (AAAA-MM-DD)—
mrren la consultabooleano—solo las financiadas por el Mecanismo de Recuperación y Resiliencia
qen la consultatexto, 2-80 caracteres—texto libre sobre título, órgano, finalidad, bases y el nombre por el que se conoce la ayuda («bono infantil»): todas las palabras tienen que estar, cada una por el comienzo de una palabra, sin tildes y en singular o plural; una sigla vale por lo que significa y al revés («PRL» y «riesgos laborales», «FP» y «formación profesional»), y las palabras más frecuentes, por sus equivalentes en catalán, gallego y euskera
agruparen la consultabooleanotruejunta en una fila las fichas repetidas (la misma ayuda dada de alta una vez por beneficiario); false: todas, una a una
iguales_aen la consultatexto, patrón ^\d{1,12}$—número de una convocatoria: solo las fichas repetidas de su grupo, una a una
ordenen la consultatexto, uno de plazo, presupuesto, recienteplazo
desdeen la consultaentero, de 0 a 100000
limiteen la consultaentero, de 1 a 10025convocatorias por página

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/convocatorias/abiertas?beneficiario=empresas&comunidad=cataluna&sector=C&dias=30&limite=100"
Respuesta (recortada)
{
  "total": 214, "desde": 0, "limite": 100, "orden": "plazo", "tipo": "competitiva,directa_canonica,instrumental_particulares",
  "resultados": [
    {"numero": "925512", "id": 1127073, "titulo": "Ayudas a la contratación de personas con discapacidad en empresas de Cataluña 2026",
     "organo": "DEPARTAMENTO DE EMPRESA Y TRABAJO", "organo_padre": "CATALUÑA", "nivel": "autonomica", "nivel_nombre": "Comunidades autónomas",
     "mrr": false, "tipo": "competitiva", "tipo_nombre": "Concurrencia competitiva", "presupuesto": 3000000.0, "abierto": false,
     "fecha_recepcion": "2026-08-19", "fecha_inicio": "2026-08-20", "fecha_fin": "2026-09-15", "texto_inicio": null, "texto_fin": null,
     "estado": "en_plazo", "dias_restantes": 4, "finalidad": "Fomento del Empleo",
     "bases_url": "https://dogc.gencat.cat/…", "sede": "https://web.gencat.cat/…",
     "beneficiarios": ["PYME Y PERSONAS FÍSICAS QUE DESARROLLAN ACTIVIDAD ECONÓMICA", "GRAN EMPRESA"],
     "beneficiario_tipos": [{"codigo": "pymes", "nombre": "Pymes y autónomos"}, {"codigo": "grandes", "nombre": "Grandes empresas"}],
     "sectores": [{"codigo": "C", "nombre": "Industria manufacturera"}], "sectores_detalle": ["C - INDUSTRIA MANUFACTURERA"],
     "regiones": [{"codigo": "ES51", "nombre": "Cataluña"}], "regiones_detalle": ["ES51 - CATALUÑA"], "comunidades": ["cataluna"], "ambito": "comunidad",
     "instrumentos": ["SUBVENCIÓN Y ENTREGA DINERARIA SIN CONTRAPRESTACIÓN"], "fondos": [], "n_documentos": 2, "n_anuncios": 1,
     "actualizado": "2026-08-19T00:00:00Z", "cambio": "alta", "repetidas": 0, "nombre_comun": null, "link": "https://www.infosubvenciones.es/bdnstrans/GE/es/convocatorias/925512"},
    {"numero": "925677", "titulo": "Ayudas a la digitalización del comercio local 2026", "organo": "CONSELLERIA DE INNOVACIÓN, INDUSTRIA, COMERCIO Y TURISMO",
     "estado": "plazo_texto", "fecha_fin": null, "dias_restantes": null,
     "texto_fin": "20 días hábiles a contar desde el día siguiente al de la publicación del extracto en el DOGV", "…": "…"}
  ]
}

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

GET/convocatorias/encajecon clave#

Ayudas que le encajan a una empresa, una entidad o una persona, ordenadas y con el motivo

Las convocatorias en plazo que le encajan a alguien, ordenadas de más a menos y cada una con el motivo por el que sale. Es un encaje automático, sin revisión humana, sobre los datos de la ficha de la BDNS (no lee los requisitos de las bases): sirve para ordenar y descartar, no para decidir que una ayuda se puede pedir. Solo con un plan con API (Pro, Despacho o plataforma).

Quién pide se dice con nif (una empresa o entidad con ficha: sector, comunidad y tamaño se deducen de las ayudas que ha recibido y de su sede, como en /empresa/{nif}; municipio, sector y tamano corrigen lo deducido) o a mano con clase y municipio (o comunidad), más forma, tamano y sector para una empresa o tema para un particular. Devuelve perfil (lo que el motor ha usado), total, nuevas, por_nivel (cuántas filas hay de encaje alto, medio y bajo), excluidas (cuántas convocatorias deja fuera cada regla), tema_sin_oferta (cierto cuando un particular pidió un tema, no hay nada de él en plazo y lo que va es lo demás de su zona, como si no lo hubiera dicho) y resultados: la fila de /convocatorias/abiertas más encaje (puntos, nivel, hasta tres motivos en llano y avisos), lineas y numeros (las líneas de una misma orden, con el mismo órgano y el mismo título salvo números, van en una fila) y dias_restantes_grupo (los de la línea que antes cierra).

Parte de las convocatorias de su comunidad y de ámbito nacional para su tipo de beneficiario, con el tipo por defecto de /convocatorias/abiertas. Deja fuera, solo con evidencia: las de otro ayuntamiento (otro_municipio), las de otra isla u otra provincia (otro_nuts3), las que ya tienen destinatario (nominativa: nominativas, convenios y concesiones directas con nombre propio), las que el órgano anuló (anulada) y la ayuda social a personas cuando pide una empresa o una entidad (social_a_empresa). Lo demás puntúa: el lugar (su ayuntamiento, su isla o provincia, su comunidad, el Estado), que solo admita a los de su clase y tamaño, que nombre a los autónomos, su sector (en la ficha, si no lleva casi todos, y en el título) y la finalidad, y los temas de un particular; resta que el título sea de otra actividad, de otra forma de empresa, para ayuntamientos o para un colectivo cerrado. alto desde 50 puntos, medio desde 25. El sector no filtra: la BDNS lo clasifica con poco cuidado.

Parámetros

NombreTipoPor defectoQué es
nifen la consultatexto, 9-20 caracteres—NIF de una empresa o entidad con ficha (`/empresa/{nif}`): el perfil se deduce de sus ayudas y de su sede; `municipio`, `sector` y `tamano`, si llegan, corrigen lo deducido (`clase`, `forma` y `tema` no se usan: la clase la dice el NIF)
municipioen la consultatexto, hasta 5 caracteres—código INE del municipio (cinco dígitos: «38038»); da la isla o la provincia y la comunidad. Con `nif`, afina su lugar
comunidaden la consultatexto, hasta 40 caracteres—slug de comunidad («canarias») o «estado» (solo ámbito nacional), si no se da el municipio
claseen la consultatexto, uno de particular, empresa, entidad—quién pide: particular, empresa (también un autónomo) o entidad sin actividad económica. Obligatoria sin `nif`
formaen la consultatexto, uno de autonomo, sociedad—de una empresa: autonomo o sociedad
tamanoen la consultatexto, uno de pymes, grandes—de una empresa: pymes o grandes
sectoren la consultatexto, hasta 30 caracteres—secciones CNAE de la empresa o la entidad, separadas por comas («F» o «C,G»); dan puntos, no filtran
temaen la consultatexto, hasta 60 caracteres—lo que busca un particular, hasta 3: estudios, vivienda, familia, empleo, discapacidad, cultura
nivelen la consultatexto, hasta 20 caracteresalto,medioniveles de encaje que se devuelven: alto, medio y bajo, separados por comas
nuevas_desdeen la consultafecha (AAAA-MM-DD)—marca como «nueva» (en `avisos`) lo publicado ese día o después, y lo cuenta en `nuevas`
desdeen la consultaentero, de 0 a 30000
limiteen la consultaentero, de 1 a 10025filas por página

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/convocatorias/encaje?clase=empresa&forma=autonomo&tamano=pymes&municipio=38038&sector=F"
Respuesta (recortada)
{
  "perfil": {"clase": "empresa", "forma": "autonomo", "tamano": "pymes", "municipio": "38038", "nuts3": ["ES709"], "comunidades": ["canarias"],
             "sectores": ["F"], "sectores_deducidos": false, "temas": [], "zona": false},
  "total": 16, "nuevas": 2, "por_nivel": {"alto": 3, "medio": 13, "bajo": 21},
  "excluidas": {"otro_municipio": 13, "otro_nuts3": 17},
  "desde": 0, "limite": 25,
  "resultados": [
    {"numero": "889775", "titulo": "CONCESIÓN DE SUBVENCIONES DE CUOTA CERO AUTÓNOMOS (2026)", "organo": "CONSEJERÍA DE ECONOMÍA…", "organo_padre": "CANARIAS",
     "presupuesto": 9000000.0, "fecha_fin": "2026-10-31", "estado": "en_plazo", "dias_restantes": 40, "municipio": null,
     "encaje": {"puntos": 50, "nivel": "alto", "motivos": ["de tu comunidad", "para autónomos", "solo para empresas y autónomos"], "avisos": []},
     "lineas": 2, "numeros": ["889775", "889445"], "dias_restantes_grupo": 40, "…": "…"},
    {"numero": "897035", "titulo": "Convocatoria de ayudas económicas destinadas al fomento del empleo de 2026…", "organo_padre": "CÁMARA DE COMERCIO DE TENERIFE",
     "encaje": {"puntos": 45, "nivel": "medio", "motivos": ["de tu isla", "solo para empresas y autónomos", "para pymes"], "avisos": ["nueva", "cierra en 6 días"]},
     "lineas": 1, "numeros": ["897035"], "…": "…"}
  ]
}

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

GET/convocatorias/{numero}con clave#

Ficha de una convocatoria: plazo, bases, documentos, anuncios y concesiones ya publicadas

Toda la convocatoria por su número en la BDNS: los campos de la lista más abierta (si sigue en plazo según la vista), ficha_completa (false para las del catálogo cuya ficha aún no se ha pedido: solo título, órgano y fecha de recepción), nombre_comun (como en la lista), bases (descripción), diario_oficial, reglamento (minimis, exención por categorías), ayuda_estado (número SA) con su URL, objetivos, ficha_comprobada (último día en que se pidió a la BDNS); documentos (los ficheros de la ficha con url de descarga en la BDNS, tamaño y fechas de publicación y modificación); anuncios (extractos en diarios oficiales: título, diario, url, CVE y fecha); y concesiones, lo ya publicado con cargo a esta convocatoria: cuántas, importe, beneficiarios distintos, primera y última fecha, las personas_fisicas solo agregadas y los mayores beneficiarios (NIF con enlace a /empresa/{nif}, nombre, concesiones e importe).

acceso (desde el 2026-09-14): cuenta con una clave de cuenta o con la sesión del visitante de la web, y entonces va todo; visitante con la clave de servicio de la web y sin sesión (la ficha pública /subvencion/{numero} de openmoney.es), y entonces concesiones.mayores va vacía (las cifras de concesiones sí van).

Parámetros

NombreTipoPor defectoQué es
numero *en la rutatexto, 1-12 caracteres, patrón ^\d{1,12}$—número de la convocatoria en la BDNS (`numero` en la lista y en las novedades)

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/convocatorias/925512"
Respuesta (recortada)
{
  "numero": "925512", "titulo": "Ayudas a la contratación de personas con discapacidad en empresas de Cataluña 2026",
  "abierta": true, "ficha_completa": true, "estado": "en_plazo", "dias_restantes": 4, "fecha_fin": "2026-09-15", "acceso": "cuenta",
  "bases": "ORDEN EMT/…/2026 por la que se aprueban las bases reguladoras…", "bases_url": "https://dogc.gencat.cat/…",
  "diario_oficial": true, "reglamento": "REG (UE) 651/2014, DE 17 DE JUNIO, de exención por categorías", "ayuda_estado": "SA.122469",
  "ficha_comprobada": "2026-09-11", "cambio": "documentos",
  "documentos": [{"id": 1507500, "descripcion": "Texto en castellano de la convocatoria", "nombre": "Resolucion_convocatoria_2026.pdf", "bytes": 517385,
                  "publicado": "2026-08-19", "modificado": "2026-09-02", "url": "https://www.infosubvenciones.es/bdnstrans/GE/es/convocatoria/925512/document/1507500"}],
  "anuncios": [{"num_anuncio": 217283, "titulo": "Extracto de la Orden…", "diario": "DOGC", "url": "https://dogc.gencat.cat/…", "cve": "…", "publicado": "2026-08-21"}],
  "concesiones": {"n": 0, "importe": null, "beneficiarios": 0, "primera": null, "ultima": null, "personas_fisicas": {"n": 0, "importe": null}, "mayores": []},
  "…": "…"
}

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

GET/convocatorias/novedadescon clave#

Convocatorias nuevas o con cambios desde una marca

Convocatorias cuya ficha se dio de alta o cambió (cambio: alta, plazo, documentos, anuncios, presupuesto u otro) desde desde, en orden de actualizado, con abierta según la vista. La BDNS no avisa de cambios: el incremental vuelve a pedir la ficha de las competitivas, las directas con bases y las instrumentales para particulares en plazo (cada día las dos primeras semanas tras la recepción, cada semana después, hasta los 150 días) y compara plazo, documentos, anuncios y presupuesto; una ampliación de plazo llega así como cambio = plazo. Para seguir: siguiente trae el desde y el tras de la página siguiente (cuando mas es true) o la marca para la próxima consulta. En la carga inicial actualizado es la fecha de recepción de la convocatoria (o de la última modificación de sus documentos), no el día de la carga.

Parámetros

NombreTipoPor defectoQué es
desde *en la consultafecha y hora (ISO 8601)—marca de la última consulta (ISO 8601); vuelven las convocatorias con `actualizado` igual o posterior
trasen la consultatexto, hasta 20 caracteres—número de la última convocatoria recibida con ese mismo `actualizado`, para seguir la página
tipoen la consultatexto, hasta 80 caracteres, patrón ^(competitiva|directa_canonica|directa_instrumental|instrumental_particulares|directa|todas)(,(competitiva|directa_canonica|directa_instrumental|instrumental_particulares|directa|todas))*$competitiva,directa_canonica,instrumental_particularescompetitiva (concurrencia competitiva), directa_canonica (concesión directa con bases: la pide quien cumple los requisitos, sin competir), directa_instrumental (nominativas y convenios, con destinatario), instrumental_particulares (la instrumental cuyo beneficiario declarado incluye a particulares: emergencia social, alquiler), directa (canónica e instrumental) o todas; varios separados por comas. Por defecto competitiva,directa_canonica,instrumental_particulares: todo lo que se puede pedir
limiteen la consultaentero, de 1 a 500200

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/convocatorias/novedades?desde=2026-09-10T05:00:00Z&limite=500"
Respuesta (recortada)
{
  "desde": "2026-09-10T05:00:00Z", "mas": false, "tipo": "competitiva,directa_canonica,instrumental_particulares",
  "siguiente": {"desde": "2026-09-11T05:12:40.118Z", "tras": "929084"},
  "convocatorias": [
    {"numero": "919558", "titulo": "Convocatoria para el fomento del uso del servicio de transporte público ferroviario…", "abierta": true,
     "estado": "plazo_texto", "cambio": "plazo", "actualizado": "2026-09-11T05:12:39.902Z", "…": "…"},
    {"numero": "929084", "titulo": "Bases específicas para el otorgamiento de subvenciones para la adquisición de equipamiento para embarcaciones…",
     "abierta": true, "estado": "en_plazo", "cambio": "alta", "actualizado": "2026-09-11T05:12:40.118Z", "…": "…"}
  ]
}

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

GET/convocatorias/{numero}/basescon clave#

Lo leído por IA de las bases de la convocatoria, con su frase y su página

Estado de la lectura de las bases (sin_leer, en_curso, leido, error, sin_texto, sin_documento), lectura (campo a campo: valor, cita literal, pagina, confianza, nota), contrastes con la ficha de la BDNS (cada uno con resultado: coincide, anade, contradice o incoherente, y las dos versiones, sin elegir), documento (el PDF que se lee) y puede_pedir con su motivo. Lo leído es público; pedir la lectura va con un plan de pago (POST). Dato leído por IA, aparte y marcado: las bases mandan.

Parámetros

NombreTipoPor defectoQué es
numero *en la rutatexto, 1-12 caracteres, patrón ^\d{1,12}$—número de la convocatoria en la BDNS

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

POST/convocatorias/{numero}/basescon clave#

Leer las bases de la convocatoria con IA (planes de pago)

Lanza la lectura del documento de la convocatoria y responde con el mismo cuerpo que el GET: 200 si terminó dentro de la espera, 202 si sigue en marcha (preguntar al GET cada pocos segundos). 403 sin un plan de pago (o fuera de la beta), 429 con la cuota diaria agotada, 503 apagado o con los topes de gasto alcanzados, 409 sin documento legible.

Parámetros

NombreTipoPor defectoQué es
numero *en la rutatexto, 1-12 caracteres, patrón ^\d{1,12}$—número de la convocatoria en la BDNS
forzaren la consultabooleanofalsevolver a leer aunque ya esté leído (beta y administradores)

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta 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).

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/historias"

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta 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ámetros

NombreTipoPor defectoQué es
slug *en la rutatexto—

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/historias/contratos-menores"

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta 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.

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/mapa"

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

GET/mapas/empresa/{nif}con clave#

Dónde le adjudican a una empresa

Parámetros

NombreTipoPor defectoQué es
nif *en la rutatexto, 1-64 caracteres—

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/mapas/empresa/A28599033"

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

GET/mapas/organo/{organo}con clave#

De dónde son los proveedores de un órgano

Parámetros

NombreTipoPor defectoQué es
organo *en la rutatexto, 1-64 caracteres—

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/mapas/organo/L01280796"

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 422 Validation Error · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta 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).

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/portada"
Respuesta (recortada)
{
  "anio": 2026,
  "ultimos_30_dias": {"…": "…"},
  "top_empresas": [{"nif": "A28599033", "nombre_canonico": "INDRA SISTEMAS SA", "importe": 486120334.2, "n": 412}],
  "top_organos": [{"…": "…"}],
  "n_empresas": 148213,
  "municipios": {"…": "…"},
  "organos": {"n": 24310, "con_municipio": 8102, "sin_dir3_ni_municipio": 1987, "importe_sin_dir3_ni_municipio": 10600000000.0},
  "version_datos": "2026-09-10"
}

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

GET/sitemapcon clave#

Claves del sitemap

Los identificadores con ficha y la fecha del último cambio de cada una: las 1.000 mayores empresas, los municipios con datos (liquidación en CONPREL o adjudicaciones de sus órganos; los demás llevan noindex), los órganos con actividad (10 expedientes o más y adjudicaciones desde 2022, contratos a personas físicas o licitaciones en plazo; los demás llevan noindex), los slugs de las administraciones y las categorías CPV con contratos (cpv, tres dígitos). Es lo que la web publica en su sitemap. Cada entrada es {id, lastmod}: lastmod (AAAA-MM-DD) es el día del último dato de esa ficha (última adjudicación o concesión de la empresa; último expediente, adjudicación o licitación en plazo del órgano y, en el municipio, de sus órganos; último anuncio en plazo de la categoría CPV) y null cuando no hay dato (las administraciones siempre; desde el 2026-09-14, antes eran listas de ids).

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/sitemap"

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta agotada; `Retry-After` dice cuánto esperar

GET/sitemap/abiertascon clave#

Claves del sitemap de las fichas en plazo

Las licitaciones en plazo (licitaciones: el id de /licitaciones/{id}) y las convocatorias de subvenciones en plazo que la web indexa (convocatorias: el numero de /convocatorias/{numero}; concurrencia competitiva y concesión directa con bases; la directa instrumental dirigida a particulares sale en las listas pero no aquí), cada una con lastmod, el día de su última versión en la fuente. Es lo que la web publica en sus sitemaps de fichas de expediente (/licitacion/<id>) y de convocatoria (/subvencion/<numero>); cambia con cada carga y se cachea una hora. Desde el 2026-09-14.

Ejemplo

Petición
curl -H "X-API-Key: om_…" "https://api.openmoney.es/sitemap/abiertas"

Códigos de respuesta: 200 correcto · 401 Sin clave, o clave con forma incorrecta o desconocida · 403 Clave revocada, o creada durante la prueba gratis del Pro y la prueba ha terminado · 429 Límite por IP (60 en ráfaga, 1 por segundo) o cuota diaria de la cuenta 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.

Ejemplo

Petición
curl "https://api.openmoney.es/"
Respuesta
{"nombre": "OpenMoney API", "version": "1.0", "documentacion": "https://openmoney.es/api", "openapi": "https://api.openmoney.es/openapi.json", "web": "https://openmoney.es"}

Códigos de respuesta: 200 correcto

GET/healthsin clave#

Estado de la API

Sin clave. db dice si la base responde (503 si no); datos_al_dia si ninguna fuente del incremental lleva más de 30 horas sin una ronda buena (datos_horas); feeds_al_dia si PLACSP ha publicado algo en cada uno de sus tres feeds en las últimas 30 horas (feeds_horas: las horas desde la última entrada del feed más atrasado); ok es las tres cosas; 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.

Ejemplo

Petición
curl "https://api.openmoney.es/health"
Respuesta (recortada)
{"ok": true, "db": "ok", "db_ms": 3, "version_datos": "2026-09-10", "datos_al_dia": true, "datos_horas": 6.5, "feeds_al_dia": true, "feeds_horas": 9.2, "cuentas": true, "clave_servicio": true, "enlaces_24h": 4, "ip": "203.0.113.7", "api": "1.0", "…": "…"}

Códigos de respuesta: 200 correcto

Rutas que no están aquí: /cuenta/… son las rutas que usa la propia web con la sesión del navegador (entrar, salir, crear claves). No forman parte del contrato de la API y pueden cambiar sin aviso. Para crear o revocar claves está tu cuenta.

Condiciones de uso

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

  • La API es la única vía autorizada para leer OpenMoney con un programa: nada de rastrear la web, sus datos estructurados ni sus enlaces.
  • La clave es personal: no se comparte, no se cede, no se publica ni se usa desde un navegador ajeno. Una cuenta, una persona.
  • Con los planes Pro y Despacho puedes usar los datos en tu propio programa o análisis, para ti, tu empresa o tu despacho y sus clientes, y citarlos. Meterlos en un producto o servicio que usan terceros (una plataforma, un programa de gestión, un boletín) necesita un acuerdo de plataforma, que es la única licencia para eso. En los dos casos, con la atribución «Datos: OpenMoney sobre PLACSP/BDNS» y un enlace a openmoney.es donde se muestren.
  • No puedes extraer una parte sustancial de la base de datos, redistribuirla, revenderla ni montar con ella otro servicio o conjunto de datos, ni usar el contenido para entrenar modelos sin licencia escrita.
  • Nada de lo que devuelve la API identifica a personas físicas, y así debe seguir: no intentes reidentificarlas.
  • Ante un uso prohibido o un intento de saltarse los límites, la clave y la cuenta se revocan sin aviso.

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.

  • 5 de octubre de 2026. El título leído. Campo nuevo titulo_leido en /licitaciones/abiertas (también con como), en la ficha /licitaciones/{id} y en las filas del radar /licitaciones/encaje: el título en llano que la IA escribe al leer cada anuncio en plazo, en castellano aunque el anuncio vaya en catalán, gallego o euskera («Muro de contención en la calle Orden de Calatrava, 2.ª fase» por «Contrato de obras del Proyecto de muro de contención en Calle Orden de Calatrava 2ª fase»). Solo dice lo que el anuncio dice: cada cifra y cada nombre propio del título tienen que estar en el enunciado, o no se sirve. Es null mientras el anuncio no se ha leído (se leen una vez al publicarse) y cuando no añade nada al enunciado. titulo y objeto siguen siendo los oficiales.
  • 29 de septiembre de 2026. La API por plan. La cuota diaria y los topes por petición salen del plan de la cuenta: 200 peticiones al día y 50 NIF o clientes por petición con el Pro (uso propio); 500 y 500 con el plan Despacho, nuevo; a medida con un acuerdo de plataforma. Antes eran 1.000 al día y 500 por petición para todas las cuentas. La API va con el plan: las claves de una cuenta que vuelve al gratis responden 403 y vuelven a valer, las mismas, cuando recupera un plan con API. Una plataforma puede crear una clave por cada asesoría a la que sirve, con el uso medido por clave. Sin cambio de versión.
  • 29 de septiembre de 2026. Afinado del encaje sin historial. sector= admite hasta cinco secciones (antes tres). En como (y en perfil del radar), campo nuevo falta: ["sector"] cuando no hay ninguna línea CPV con la que encajar y ["lugar"] cuando un perfil sin historial no dice dónde está (entonces ninguna licitación pasa de «bajo»: di provincia=, municipio= o comunidad=); vacío en los demás casos. Sin historial solo cuenta el código CPV principal del expediente (uno secundario ya no lo sube a «medio»). En el radar, nif vuelve normalizado («b-38.515.854» → B38515854; cruza por ref), un nif con comas y un campo que no existe son 422, motivo se rellena también cuando el NIF no valía pero el cliente encaja por lo declarado o cuando el perfil no dice dónde está, y un lote de 500 clientes con ref y perfil cabe en la petición (antes, 413 por encima de 16 KB). como.cpv3 sale por peso (el grupo principal primero), no en orden alfabético. Sin cambio de versión.
  • 28 de septiembre de 2026. Encaje sin historial y radar por lotes. /licitaciones/abiertas?como={nif} ya no responde 404 a una empresa sin contratos: encaja por su sector (el que pases en sector=, el de su alta a mano en tu cuenta o, si nadie lo dice, el deducido de sus ayudas en la BDNS), su lugar (municipio=, provincia= o comunidad=) y su tamaño (tamano=: autonomo, pymes o grandes); esos parámetros valen también sin como, y con una empresa con historial solo completan la sede que sus contratos no digan. El sector se traduce a grupos CPV con un mapa medido en 67.773 empresas que tienen sector e historial; ese encaje puntúa por grupo, no pasa de «medio» y sus motivos lo dicen («por tu actividad: construcción», «en tu isla»). En como, campos nuevos origen (historial, ayudas, declarado o nulo), sectores, lugar y tamano; nombre_canonico y nif pueden ser nulos con un perfil sin NIF; competidores y anios solo van con historial. En la ficha de empresa, abiertas_como lleva origen y sectores y cuenta también para las empresas sin contratos. Ruta nueva POST /licitaciones/encaje: el radar de una cartera (hasta 500 clientes por llamada; 50 con el plan Pro). Sin cambio de versión: solo se añade.
  • 22 de septiembre de 2026. En /licitaciones/abiertas con como: campo nuevo cpv_deducido en como (y en abiertas_como de la ficha de empresa), cierto cuando ninguno de los contratos de la empresa lleva código CPV y sus grupos se han deducido del texto de cada uno; entonces el encaje no pasa de «medio» y cada fila lleva el aviso «tu actividad, deducida del texto de tus contratos». Los competidores salen solo de sus grupos CPV habituales, no de cualquiera donde haya ganado algo. Un presupuesto de una entidad local que no se cree (más de 300 M€ por lote) lleva el aviso «presupuesto por comprobar», no cuenta en el tamaño y con orden=presupuesto va al final. En /convocatorias/abiertas y en la ficha, una fecha de fin más de cinco años más allá de hoy (una errata de la BDNS) va como null, con dias_restantes nulo y estado «plazo_texto». Sin cambio de versión.
  • 21 de septiembre de 2026 (tarde). Cambia lo que devuelve como={nif} en /licitaciones/abiertas. Hasta hoy filtraba por las categorías CPV de tres dígitos donde la empresa o sus diez competidores habían ganado en tres años; al medirlo con 48 empresas reales, a la mediana le salía el 89 % de todo lo que hay en plazo (los «competidores» de una pyme son siempre los grandes grupos multiservicio). Ahora devuelve las licitaciones que le encajan a esa empresa por su propio historial, de más a menos (orden=encaje, el orden por defecto con como; los demás órdenes siguen valiendo), y cada fila lleva encaje: puntos, nivel (alto, medio o bajo; se devuelven alto y medio, o los que diga el parámetro nuevo nivel), hasta tres motivos en llano («de tu especialidad», «en una provincia donde ya has ganado», «este órgano ya te ha adjudicado», «de tu tamaño») y avisos. Cuenta la coincidencia más fina de CPV (categoría de cinco dígitos, clase de cuatro, grupo de tres) según lo habitual que sea esa línea en la empresa, dónde gana, el tamaño de sus contratos y los órganos que ya le han adjudicado; sin ningún CPV en común no hay encaje. En como, cpv3 pasa a ser sus grupos CPV principales y se añaden contratos y por_nivel; competidores sigue, pero ya no entra en el filtro. En la ficha de empresa, abiertas_como.n es ese mismo recuento (alto y medio) y lleva por_nivel. En /convocatorias/encaje, campo nuevo tema_sin_oferta: cierto cuando un particular pidió un tema, no hay nada de él en plazo y lo que va es lo demás de su zona. Sin cambio de versión.
  • 21 de septiembre de 2026. Campo nuevo nombre_comun en /convocatorias/abiertas y en la ficha /convocatorias/{numero}: el nombre por el que la gente conoce la ayuda («Bono infantil», que la BDNS titula «Subvenciones para la escolarización de alumnado en CPEI y EEI»). Sale de la lectura de las bases por IA, solo cuando el documento lo escribe tal cual, y es null en las demás, que son casi todas: solo lo tienen las convocatorias cuyas bases ya se han leído. El filtro q de la lista lo busca también, junto al título, el órgano, la finalidad y las bases.
  • 20 de septiembre de 2026. Fichas repetidas: algunos órganos dan de alta en la BDNS una convocatoria por cada ayuda que conceden (54 «Becas comedor» el mismo día, o una serie que solo cambia en un número: «Beneficiario/a 1», «Beneficiario/a 2»). /convocatorias/abiertas las trae ahora en una sola fila, la más reciente, con el campo nuevo repetidas (cuántas más hay como ella; 0 en el resto), y total y la paginación cuentan filas. Solo se junta la concesión directa instrumental dirigida a particulares, con el mismo órgano y el mismo título salvo números; la concurrencia competitiva y la directa con bases no se tocan. iguales_a=<numero> devuelve las de un grupo una a una y agrupar=false, la lista como antes. /convocatorias/resumen cuenta igual que la lista, así que sus cifras bajan un poco, y el presupuesto total deja de sumar varias veces el mismo importe.
  • 19 de septiembre de 2026. En las convocatorias, cuando la BDNS trae el fin de plazo escrito como fecha en el campo de texto y nada más (texto_fin = «12/06/2026», con la fecha vacía), fecha_fin es esa fecha y el campo nuevo fecha_fin_origen vale texto (bdns cuando la fecha viene de la BDNS, null sin fecha); estado y dias_restantes salen de ella y texto_fin sigue yendo tal cual. Dejan de salir como abiertas las que ya habían vencido y siguen abiertas hasta su fecha las que antes desaparecían a los 60 días de publicarse. Una frase («20 días hábiles desde…», «hasta el 30/10/2026 o agotar el crédito») sigue sin convertirse en fecha, y tampoco una fecha a más de 180 días antes o 366 después de la publicación (año mal tecleado, otra edición o la vigencia de un convenio). Sin cambio de versión: solo se añade.
  • 16 de septiembre de 2026. En /convocatorias/abiertas, /convocatorias/resumen y /convocatorias/novedades, el tipo por defecto pasa a competitiva,directa_canonica,instrumental_particulares: entran también las concesiones directas instrumentales cuyo beneficiario declarado incluye a particulares (ayudas de emergencia social de los ayuntamientos, al alquiler, las del volcán de La Palma), que la BDNS clasifica como instrumentales aunque se pueden pedir; las nominativas a entidades concretas y los convenios siguen fuera. Nuevo valor tipo=instrumental_particulares para pedir solo esas. En /licitaciones/abiertas, cada fila trae territorio y territorio_nombre: el territorio efectivo (el lugar de ejecución o, si el anuncio no lo concreta, el del órgano), afinado a la isla en Canarias e Illes Balears cuando el órgano es un ayuntamiento o un cabildo conocidos.
  • 15 de septiembre de 2026. En /convocatorias/abiertas, /convocatorias/resumen y /convocatorias/novedades, el tipo por defecto pasa de competitiva a competitiva,directa_canonica: todo lo que se puede pedir, también las ayudas de concesión directa con bases (emergencia social, planes de renovación). Para seguir recibiendo solo la concurrencia competitiva, tipo=competitiva. Y ambito = nacional (el filtro comunidad=estado) queda para los órganos del Estado que declaran toda España: la convocatoria de una comunidad autónoma, de una entidad local o de una universidad (y demás «otros entes»: cámaras, consorcios) que declara «ES» en la BDNS cuenta en su comunidad (ambito = comunidad, o varias), porque es para su territorio. La de una universidad sale del lugar de su nombre o de la región que declara en sus demás convocatorias. En /licitaciones/abiertas y /licitaciones/resumen, nuts= filtra por el territorio del expediente: el lugar de ejecución o, si no lo concreta (NUTS «ES», de un dígito o extranjero), la provincia o la comunidad del órgano (un ayuntamiento, una diputación, una consejería, una universidad o una empresa pública); ES3 y ES7 cuentan como Madrid y Canarias. administracion=estado ya no añade los expedientes sin territorio de entidades locales, comunidades, universidades o plataformas autonómicas, y sin_territorio, por_comunidad y por_provincia del resumen siguen la misma regla. La salida (nuts) sigue siendo la de PLACSP. Sin cambio de versión.
  • 14 de septiembre de 2026. /sitemap cambia de forma: cada lista trae objetos {id, lastmod} en vez de ids sueltos, con lastmod el día del último dato de esa ficha (última adjudicación o concesión de la empresa; último expediente, adjudicación o licitación en plazo del órgano; la de sus órganos en el municipio; último anuncio en plazo de la categoría CPV) o null. Nueva /sitemap/abiertas: las licitaciones y las convocatorias en plazo con la fecha de su última versión en la fuente, una hora de caché. Las fichas /licitaciones/{id} y /convocatorias/{numero} responden también sin cuenta con la clave de servicio de la web (las fichas públicas openmoney.es/licitacion/{id} y openmoney.es/subvencion/{numero}) y traen acceso: cuenta (todo, como hasta ahora con una clave de cuenta) o visitante (sin criterios, requisitos, garantias, declaraciones, antecedentes.filas ni concesiones.mayores). Para las claves de cuenta no cambia nada salvo la forma de /sitemap.
  • 12 de septiembre de 2026 (tarde). En /licitaciones/resumen, nuts= (prefijo NUTS del lugar de ejecución) y administracion= (slug de /administracion/{slug}, o estado: los órganos de la Administración General del Estado y la Seguridad Social más los expedientes de ámbito estatal sin territorio) acotan las cifras a un territorio o una administración; el resumen trae además top_organos y cpv (los diez con más abiertas), por_dataset (de qué feed de PLACSP vienen) y, con administracion=estado, por_ministerio. En /licitaciones/abiertas, el filtro administracion=. /convocatorias/resumen trae top_organos (los diez que más convocan). La ficha de órgano lleva ccaa y provincia en municipio. Son los datos de las páginas por comunidad, provincia y Estado de la web (/licitaciones/canarias, /licitaciones/sevilla, /licitaciones/estado, /subvenciones/canarias). Sin cambio de versión: solo se añade.
  • 12 de septiembre de 2026. Nuevas /convocatorias/resumen, /convocatorias/abiertas, /convocatorias/{numero} y /convocatorias/novedades: las convocatorias de subvenciones de la BDNS que admiten solicitudes hoy (solo concurrencia competitiva por defecto; tipo=directa o todas para el resto), con filtros por comunidad, territorio NUTS, sector CNAE, tipo de beneficiario, nivel, finalidad, presupuesto y plazo; el plazo en texto se devuelve tal cual (texto_fin), nunca convertido en fecha. La ficha trae bases, documentos con enlace de descarga, anuncios en diarios oficiales y las concesiones ya publicadas con cargo a la convocatoria. Las novedades incluyen las ampliaciones de plazo y los documentos nuevos que el refresco detecta (cambio). Misma tarde: tipo admite también directa_canonica (concesión directa con bases, la que pide quien cumple los requisitos sin competir), directa_instrumental (nominativas y convenios) y varios separados por comas (competitiva,directa_canonica: todo lo que se puede pedir), en /convocatorias/abiertas, /convocatorias/novedades y ahora también en /convocatorias/resumen, cuya respuesta lleva tipo. Sin cambio de versión: solo se añade.
  • 11 de septiembre de 2026 (tarde). Nuevas /cpv y /cpv/{codigo}: qué se contrata en cada categoría del CPV (por año, por procedimiento, quién compra, quién gana, qué está en plazo). En /licitaciones/abiertas, el filtro como={nif} (solo las categorías donde esa empresa o sus competidores han ganado en los últimos tres años; la respuesta trae el perfil aplicado en como). La ficha de empresa lleva abiertas_como y la del órgano top_cpv; /sitemap, la lista cpv. En «Actividad por CPV» de la ficha de empresa cada adjudicación cuenta ahora una sola vez por categoría (antes, una por cada código de esa categoría que llevara el expediente). Sin cambio de versión: solo se añade.
  • 11 de septiembre de 2026. Nueva /empresas/novedades: para una lista de hasta 500 NIF, las adjudicaciones y las concesiones que PLACSP y la BDNS han publicado desde una marca, con la misma paginación por marca y cursor que /licitaciones/novedades. La ficha del expediente ya trae lotes, pliegos y documentos, historial de anuncios, criterios de adjudicación, solvencia y garantías (según el anuncio de PLACSP; los pliegos mandan). Sin cambio de versión: solo se añade.
  • 1.0 · 10 de septiembre de 2026. Clave obligatoria en toda ruta de datos (X-API-Key), portal de claves en la cuenta, cuota diaria por cuenta (la comparten sus claves) con cabeceras X-RateLimit-*, esta documentación y el OpenAPI público. Nuevas /licitaciones/resumen, /licitaciones/abiertas, /licitaciones/{id} y /licitaciones/novedades. Las rutas de fichas, búsqueda, administraciones, historias y mapas siguen igual que en la 0.1, ahora con clave.

Lo siguiente: fichas públicas de expediente y de convocatoria, y el gasto por área y política en las fichas de administración. Desde el 12 de septiembre la cuenta manda cada mañana por correo las novedades de las empresas vigiladas y lo nuevo de las búsquedas guardadas (es lo que enseña el panel; la API no cambia) y avisa al dueño de una clave al pasar del 80 % de su cuota diaria y al agotarla.