API de licitaciones públicas

Lee en JSON, desde tu programa o tu herramienta de automatización, las licitaciones abiertas con sus filtros y las que seguís en tu equipo. Versión 1, de solo lectura: nada de lo que pidas por la API cambia tus datos.

En esta página · 11 apartados

Quién puede usarla

La API está incluida en el plan Empresa. Cada persona del equipo con plaza crea sus propias claves; quien se queda sin plaza o sale del equipo deja de tener acceso al momento.

Sin el plan Empresa puedes descargar en Excel lo que sigues, desde Siguiendo.

Tu clave

  1. Entra en Tu panel → Cuenta → API de lectura y crea una clave con un nombre que te diga dónde la usas: «CRM», «Hoja de seguimiento»…
  2. Cópiala en ese momento: es la única vez que se ve entera. Después, en la lista, solo verás su principio (lad_k7Qm2xYp…), cuándo la creaste y cuándo se usó por última vez.
  3. Envíala en cada petición, en la cabecera Authorization: Bearer lad_…

Puedes tener 3 claves activas y revocar cualquiera cuando quieras: deja de funcionar en la siguiente petición. Las claves no caducan al cerrar la sesión; si dejas de usar una o alguien más pudo verla, revócala.

Nunca pongas la clave en la dirección (?clave=…) ni en código que se ejecute en el navegador de otra persona: quien viera la página la tendría. Úsala desde tu servidor, un script o tu herramienta de automatización.

En los ejemplos va en la variable LAD_CLAVE. Para probarla en un terminal, guarda antes la clave: en macOS o Linux, export LAD_CLAVE="lad_…"; en Windows (PowerShell), $env:LAD_CLAVE="lad_…", y en la petición escribe curl.exe en lugar de curl y $env:LAD_CLAVE en lugar de $LAD_CLAVE. Desde el navegador no funciona: al abrir la dirección no se envía la clave, y la API no acepta peticiones desde otras webs. Si no usas el terminal, pruébala en tu herramienta de automatización (más abajo).

Petición con curl
curl "https://licitacionesaldia.es/api/v1/licitaciones?limite=5" -H "Authorization: Bearer $LAD_CLAVE"

Las licitaciones

GET/api/v1/licitaciones

Las licitaciones que tenemos de la Plataforma de Contratación del Sector Público y de las plataformas autonómicas: las que están en plazo y, si lo pides, las que cerraron hace menos de 7 días y aún no se han adjudicado. De la más reciente a la más antigua, por la fecha en que llegaron a Licitaciones al día (publicada). Solo datos públicos de la fuente oficial: ni lo escrito con IA ni lo de Pro.

Ojo con las fechas: el plazo (plazo.fechaLimite y plazo.horaLimite) va en hora de España, como lo publica la Plataforma; publicada y actualizada son instantes en UTC.

Filtros y páginas (todos opcionales)

textoDe 3 a 80 caracteres
Palabras o trozos de palabra que tienen que estar todos en el título («obra» encuentra también «obras» y «maniobra»), sin importar mayúsculas ni tildes («gestion» encuentra «GESTIÓN»). Hasta 6, de dos letras o más.
cpvDos cifras
La división CPV, el sector: 45 para las obras, 90 para la limpieza y los residuos… La lista, al final.
provinciaDos cifras
El código INE de la provincia del contrato: 28 para Madrid, 41 para Sevilla… La lista, al final.
importeMinEuros sin IVA
Presupuesto base de licitación desde este importe (incluido), con punto decimal si hace falta: 15000 o 15000.50. Las que no publican presupuesto no salen.
importeMaxEuros sin IVA
Presupuesto hasta este importe (incluido).
abiertastrue o false
De partida, true: solo las que están en plazo. Con false salen también las que cerraron hace menos de 7 días y aún no se han adjudicado, mientras la fuente oficial no publique ningún cambio de ellas (al publicarlo, dejan de estar).
cierraHastaAAAA-MM-DD
Las que cierran ese día o antes: 2026-10-31.
publicadaDesdeAAAA-MM-DD o instante UTC
Las que llegaron a Licitaciones al día desde ese día (desde las 00:00 UTC) o desde ese instante, incluido (2026-10-07T05:30:00Z): es el campo «publicada». Cada carga pone el mismo instante a todas las que trae, así que te volverán a llegar las de ese instante: descarta las que ya tengas por su «codigo».
limiteDe 1 a 50
Cuántas por página. De partida, 20.
cursorEl de la respuesta anterior
Para pedir la página siguiente: el «cursorSiguiente» de la respuesta anterior, tal cual y con los mismos filtros.

Los importes van en euros sin IVA. Un parámetro que no existe, repetido o con un valor que no vale da un error 400 que dice cuál es: así una errata no te devuelve todo sin filtrar.

Ejemplo: las de jardinería en la provincia de Madrid, de una en una

Petición con curl
curl "https://licitacionesaldia.es/api/v1/licitaciones?cpv=77&provincia=28&limite=1" -H "Authorization: Bearer $LAD_CLAVE"

Responde 200 con esto:

{
  "datos": [
    {
      "codigo": "p18765432",
      "titulo": "Mantenimiento de zonas verdes y arbolado de los parques municipales",
      "organismo": {
        "nombre": "Junta de Gobierno Local del Ayuntamiento de Getafe",
        "dir3": "L01280650",
        "nif": "P2806500J"
      },
      "cpv": {
        "codigo": "77311000",
        "division": "77",
        "nombreDivision": "Servicios agrícolas, forestales, hortícolas, acuícolas y apícolas"
      },
      "provincia": {
        "codigo": "28",
        "nombre": "Madrid"
      },
      "municipioIne": "28065",
      "tipoContrato": {
        "codigo": "2",
        "nombre": "Servicios"
      },
      "procedimiento": {
        "codigo": "1",
        "nombre": "Abierto"
      },
      "contratoMenor": false,
      "lotes": 0,
      "importes": {
        "presupuestoSinIva": 245000,
        "valorEstimadoSinIva": 490000
      },
      "plazo": {
        "fechaLimite": "2026-10-27",
        "horaLimite": "14:00",
        "abierta": true
      },
      "fechaAnuncio": "2026-10-06",
      "publicada": "2026-10-07T03:20:00.000Z",
      "actualizada": "2026-10-06T09:12:00.000Z",
      "enlaces": {
        "ficha": "https://licitacionesaldia.es/licitaciones/p18765432",
        "fuenteOficial": "https://contrataciondelestado.es/wps/poc?uri=deeplink:detalle_licitacion&idEvl=ejemplo18765432"
      }
    }
  ],
  "paginacion": {
    "limite": 1,
    "cursorSiguiente": "WyJsIiwiMjAyNi0xMC0wN1QwMzoyMDowMC4wMDBaIiwiaHR0cHM6Ly9jb250cmF0YWNpb25kZWxlc3RhZG8uZXMvc2luZGljYWNpb24vbGljaXRhY2lvbmVzUGVyZmlsQ29udHJhdGFudGUvMTg3NjU0MzIiXQ",
    "urlSiguiente": "https://licitacionesaldia.es/api/v1/licitaciones?cpv=77&provincia=28&limite=1&cursor=WyJsIiwiMjAyNi0xMC0wN1QwMzoyMDowMC4wMDBaIiwiaHR0cHM6Ly9jb250cmF0YWNpb25kZWxlc3RhZG8uZXMvc2luZGljYWNpb24vbGljaXRhY2lvbmVzUGVyZmlsQ29udHJhdGFudGUvMTg3NjU0MzIiXQ"
  }
}

Campos de la respuesta

De cada licitación de «datos». Los que pueden venir vacíos lo dicen («o null»).

codigotexto
El código de la licitación en Licitaciones al día («p18765432»): el de su ficha y el de la ruta del detalle. No cambia: úsalo para no repetir.
titulotexto
El objeto del contrato, tal como lo publica la fuente oficial.
organismoobjeto
El órgano de contratación.
organismo.nombretexto o null
Su nombre.
organismo.dir3texto o null
Su código DIR3, el del directorio común de las administraciones.
organismo.niftexto o null
Su NIF.
cpvobjeto
El sector, por el vocabulario común de contratos públicos (CPV).
cpv.codigotexto o null
El código CPV principal, de 8 cifras.
cpv.divisiontexto o null
Sus dos primeras cifras: la división, la del filtro «cpv».
cpv.nombreDivisiontexto o null
El nombre de la división.
provinciaobjeto o null
La provincia del contrato; null si la fuente no la dice.
provincia.codigotexto
Su código INE, de dos cifras (el del filtro «provincia»).
provincia.nombretexto
Su nombre.
municipioInetexto o null
El código INE del municipio, de cinco cifras, si el órgano es un ayuntamiento.
tipoContratoobjeto o null
El tipo de contrato: su código y su nombre; null si la fuente no lo dice.
tipoContrato.codigotexto
El código de la Plataforma de Contratación. No cambia: compara este.Valores: 1 (Suministros), 2 (Servicios), 3 (Obras), 7 (Administrativo especial), 8 (Privado), 21 (Concesión de obras), 22 (Concesión de servicios), 31 (Sectores especiales: suministros), 32 (Sectores especiales: servicios), 40 (Colaboración público-privada), 50 (Patrimonial) o 999 (Otro).
tipoContrato.nombretexto
Su nombre, para enseñarlo. Puede cambiar si mejoramos cómo se dice; con un código que no está en la lista, uno genérico («Otro»).
procedimientoobjeto o null
El procedimiento de adjudicación: su código y su nombre; null si la fuente no lo dice.
procedimiento.codigotexto
El código de la Plataforma de Contratación. No cambia: compara este.Valores: 1 (Abierto), 2 (Restringido), 3 (Negociado sin publicidad), 4 (Negociado con publicidad), 5 (Diálogo competitivo), 6 (Contrato menor), 7 (Basado en acuerdo marco), 8 (Concurso de proyectos), 9 (Abierto simplificado), 10 (Asociación para la innovación), 11 (Derivado de asociación para la innovación), 12 (Basado en sistema dinámico de adquisición), 13 (Licitación con negociación), 100 (Normas internas) o 999 (Otro procedimiento).
procedimiento.nombretexto
Su nombre, para enseñarlo. Puede cambiar si mejoramos cómo se dice; con un código que no está en la lista, uno genérico («Otro»).
contratoMenortrue o false
Si es un contrato menor.
lotesnúmero
Cuántos lotes tiene; 0 si no va por lotes.
importesobjeto
Los importes, en euros sin IVA.
importes.presupuestoSinIvanúmero o null
El presupuesto base de licitación.
importes.valorEstimadoSinIvanúmero o null
El valor estimado del contrato (con las prórrogas y las modificaciones previstas).
plazoobjeto
Hasta cuándo se puede presentar oferta, en hora de España (no en UTC).
plazo.fechaLimitetexto
El último día (AAAA-MM-DD), en hora de España.
plazo.horaLimitetexto o null
La hora límite de ese día (HH:MM), en hora de España; null si la fuente no la da.
plazo.abiertatrue o false
Si en el momento de la respuesta aún se puede presentar oferta.
fechaAnunciotexto o null
La fecha del anuncio oficial (AAAA-MM-DD), la que su ficha dice que se publicó; null si la fuente no la da.
publicadatexto
Cuándo llegó a Licitaciones al día (UTC); no es la fecha del anuncio oficial, que va en fechaAnuncio. Es la que ordena la lista y la del filtro «publicadaDesde», y no cambia aunque la licitación cambie.
actualizadatexto
Cuándo publicó la fuente oficial su última versión (UTC): cambia con un plazo ampliado, un documento nuevo o cualquier corrección.
enlacesobjeto
Dónde verla.
enlaces.fichatexto
Su ficha en Licitaciones al día.
enlaces.fuenteOficialtexto o null
Su página en la fuente oficial (http o https), donde se presenta la oferta.

Una licitación

GET/api/v1/licitaciones/{codigo}

El detalle de una licitación por su codigo: lo mismo que en la lista y, además, el expediente, cómo se presenta la oferta, la duración, los documentos con su enlace oficial (los pliegos de cláusulas administrativas, PCAP, y de prescripciones técnicas, PPT), los criterios de adjudicación con su peso, las garantías y la solvencia que se piden, tal como los publica la Plataforma. El pliego manda siempre.

En la ruta

codigoLetras y cifras
El «codigo» de la licitación, como sale en el listado: p18765432. Va en la ruta, no detrás del «?».

Ejemplo: el detalle de una licitación

Petición con curl
curl "https://licitacionesaldia.es/api/v1/licitaciones/p18765432" -H "Authorization: Bearer $LAD_CLAVE"

Responde 200 con esto:

{
  "datos": {
    "codigo": "p18765432",
    "titulo": "Mantenimiento de zonas verdes y arbolado de los parques municipales",
    "organismo": {
      "nombre": "Junta de Gobierno Local del Ayuntamiento de Getafe",
      "dir3": "L01280650",
      "nif": "P2806500J"
    },
    "cpv": {
      "codigo": "77311000",
      "division": "77",
      "nombreDivision": "Servicios agrícolas, forestales, hortícolas, acuícolas y apícolas"
    },
    "provincia": {
      "codigo": "28",
      "nombre": "Madrid"
    },
    "municipioIne": "28065",
    "tipoContrato": {
      "codigo": "2",
      "nombre": "Servicios"
    },
    "procedimiento": {
      "codigo": "1",
      "nombre": "Abierto"
    },
    "contratoMenor": false,
    "lotes": 0,
    "importes": {
      "presupuestoSinIva": 245000,
      "valorEstimadoSinIva": 490000
    },
    "plazo": {
      "fechaLimite": "2026-10-27",
      "horaLimite": "14:00",
      "abierta": true
    },
    "fechaAnuncio": "2026-10-06",
    "publicada": "2026-10-07T03:20:00.000Z",
    "actualizada": "2026-10-06T09:12:00.000Z",
    "enlaces": {
      "ficha": "https://licitacionesaldia.es/licitaciones/p18765432",
      "fuenteOficial": "https://contrataciondelestado.es/wps/poc?uri=deeplink:detalle_licitacion&idEvl=ejemplo18765432"
    },
    "expediente": "2026/1234-SER",
    "presentacion": {
      "codigo": "1",
      "nombre": "Electrónica"
    },
    "duracion": "2 años",
    "documentos": [
      {
        "tipo": "PCAP",
        "nombre": "Pliego de cláusulas administrativas particulares",
        "url": "https://contrataciondelestado.es/FileSystem/servlet/GetDocumentByIdServlet?DocumentIdParam=ejemplo-pcap-18765432"
      },
      {
        "tipo": "PPT",
        "nombre": "Pliego de prescripciones técnicas",
        "url": "https://contrataciondelestado.es/FileSystem/servlet/GetDocumentByIdServlet?DocumentIdParam=ejemplo-ppt-18765432"
      }
    ],
    "criterios": [
      {
        "nombre": "Precio",
        "peso": 60,
        "porFormula": true
      },
      {
        "nombre": "Memoria técnica del servicio",
        "peso": 40,
        "porFormula": false
      }
    ],
    "garantias": [
      {
        "tipo": "definitiva",
        "porcentaje": 5
      }
    ],
    "solvencia": {
      "tecnica": "Tres servicios de mantenimiento de zonas verdes en los últimos tres años.",
      "economica": "Volumen anual de negocios de al menos 245.000 € en uno de los tres últimos años."
    }
  }
}

Campos de la respuesta

En «datos», los de la lista y, además, estos.

expedientetexto o null
El número de expediente del órgano.
presentacionobjeto o null
Cómo se presenta la oferta: su código y su nombre; null si la fuente no lo dice.
presentacion.codigotexto
El código de la Plataforma de Contratación. No cambia: compara este.Valores: 1 (Electrónica), 2 (En papel) o 3 (En papel o electrónica).
presentacion.nombretexto
Su nombre, para enseñarlo. Puede cambiar si mejoramos cómo se dice; con un código que no está en la lista, uno genérico («Otro»).
duraciontexto o null
La duración del contrato, como la escribe la fuente («2 años»).
documentoslista
Los documentos publicados, con su enlace oficial; vacía si no hay ninguno con enlace web.
documentos[].tipotexto
Qué documento es.Valores: PCAP (pliego de cláusulas administrativas particulares), PPT (pliego de prescripciones técnicas) u otro.
documentos[].nombretexto
Su nombre, como lo publica la fuente.
documentos[].urltexto
Su dirección oficial (http o https).
criterioslista
Los criterios de adjudicación; vacía si la fuente no los da.
criterios[].nombretexto
El criterio.
criterios[].pesonúmero o null
Su peso, como lo publica la fuente (puntos o porcentaje).
criterios[].porFormulatrue o false
true si se valora con fórmulas; false si depende de un juicio de valor.
garantiaslista
Las garantías que se piden; vacía si la fuente no las da.
garantias[].tipotexto
Qué garantía es.Valores: provisional, definitiva o especial.
garantias[].porcentajenúmero o null
Su porcentaje, si la fuente lo da.
solvenciaobjeto
La solvencia que se pide, tal como la resume la fuente.
solvencia.tecnicatexto o null
La técnica o profesional.
solvencia.economicatexto o null
La económica y financiera.

Lo que seguís

GET/api/v1/seguidas

Las licitaciones que sigues y las que comparte tu equipo, como en tu pestaña Siguiendo: en qué punto está cada una (estado), su nota y si la sigue otra persona del equipo. Nunca lo que otra persona sigue solo para sí ni nada de otros equipos. Sin emails ni nombres de personas: de las adjudicadas, el importe y las ofertas, no quién ganó (eso, en su ficha).

Los puntos (estado, o null si nadie le ha puesto ninguno): interesa, preparando, presentada, ganada, perdida y descartada. La situacion: abierta, cerrada (plazo acabado, sin adjudicar), adjudicada o retirada (dejó de estar abierta antes de tiempo). Una adjudicada ya no tiene detalle en /api/v1/licitaciones/{codigo} (da 404): su adjudicación está en su ficha (enlaces.ficha).

Páginas

limiteDe 1 a 50
Cuántas por página. De partida, 20.
cursorEl de la respuesta anterior
El «cursorSiguiente» de la respuesta anterior, tal cual.

Ejemplo: lo que sigues tú y lo que comparte tu equipo

Petición con curl
curl "https://licitacionesaldia.es/api/v1/seguidas?limite=20" -H "Authorization: Bearer $LAD_CLAVE"

Responde 200 con esto:

{
  "datos": [
    {
      "codigo": "p18765432",
      "titulo": "Mantenimiento de zonas verdes y arbolado de los parques municipales",
      "organismo": "Junta de Gobierno Local del Ayuntamiento de Getafe",
      "estado": "preparando",
      "estadoTexto": "Preparando la oferta",
      "nota": "Visitar los parques antes del día 20.",
      "compartidaConElEquipo": true,
      "deOtraPersonaDelEquipo": true,
      "seguidaDesde": "2026-10-07T07:41:00.000Z",
      "situacion": "abierta",
      "plazo": {
        "fechaLimite": "2026-10-27",
        "horaLimite": "14:00"
      },
      "presupuestoSinIva": 245000,
      "adjudicacion": null,
      "enlaces": {
        "ficha": "https://licitacionesaldia.es/licitaciones/p18765432",
        "fuenteOficial": "https://contrataciondelestado.es/wps/poc?uri=deeplink:detalle_licitacion&idEvl=ejemplo18765432"
      }
    },
    {
      "codigo": "p18690011",
      "titulo": "Suministro de vestuario para la Policía Local",
      "organismo": "Ayuntamiento de Leganés",
      "estado": "presentada",
      "estadoTexto": "Oferta presentada",
      "nota": null,
      "compartidaConElEquipo": false,
      "deOtraPersonaDelEquipo": false,
      "seguidaDesde": "2026-09-02T10:15:00.000Z",
      "situacion": "adjudicada",
      "plazo": {
        "fechaLimite": "2026-09-18",
        "horaLimite": "13:00"
      },
      "presupuestoSinIva": 42000,
      "adjudicacion": {
        "importeSinIva": 38250,
        "ofertas": 4,
        "fecha": "2026-10-03"
      },
      "enlaces": {
        "ficha": "https://licitacionesaldia.es/adjudicaciones/p18690011",
        "fuenteOficial": null
      }
    }
  ],
  "paginacion": {
    "limite": 20,
    "cursorSiguiente": null,
    "urlSiguiente": null
  }
}

Campos de la respuesta

De cada licitación de «datos».

codigotexto o null
El código de la licitación. Si ya está adjudicada, su detalle (/api/v1/licitaciones/{codigo}) da 404: la adjudicación está en su ficha.
titulotexto
Su título.
organismotexto o null
El nombre del órgano de contratación.
estadotexto o null
En qué punto está para vosotros; null si nadie le ha puesto ninguno.Valores: interesa, preparando, presentada, ganada, perdida o descartada.
estadoTextotexto o null
Ese punto en palabras («Preparando la oferta»), para enseñarlo. Puede cambiar: compara «estado».
notatexto o null
La nota que le habéis puesto.
compartidaConElEquipotrue o false
Si está compartida con tu equipo.
deOtraPersonaDelEquipotrue o false
Si la sigue otra persona de tu equipo (y no tú). Nunca se dice quién.
seguidaDesdetexto
Cuándo se empezó a seguir (UTC). Ordena la lista, de lo último a lo primero.
situaciontexto
Cómo está.Valores: abierta, cerrada (plazo acabado, sin adjudicar), adjudicada o retirada (dejó de estar abierta antes de tiempo).
plazoobjeto
Su plazo, como lo vimos la última vez, en hora de España.
plazo.fechaLimitetexto o null
El último día (AAAA-MM-DD), en hora de España.
plazo.horaLimitetexto o null
La hora límite (HH:MM), en hora de España.
presupuestoSinIvanúmero o null
El presupuesto base de licitación, en euros sin IVA.
adjudicacionobjeto o null
Si está adjudicada, cómo; si no, null. Nunca quién ganó (puede ser una persona): eso, en su ficha.
adjudicacion.importeSinIvanúmero o null
El importe de adjudicación, en euros sin IVA.
adjudicacion.ofertasnúmero o null
Cuántas ofertas se presentaron.
adjudicacion.fechatexto o null
La fecha de adjudicación (AAAA-MM-DD).
enlacesobjeto
Dónde verla.
enlaces.fichatexto
Su ficha en Licitaciones al día (la de la adjudicación, si está adjudicada).
enlaces.fuenteOficialtexto o null
Su página en la fuente oficial (http o https).

Páginas

Las listas llegan por páginas de hasta 50. Cada respuesta trae en paginacion el cursor de la siguiente (cursorSiguiente) y su dirección completa (urlSiguiente), con tus mismos filtros; cuando no hay más, los dos son null. El cursor se usa tal cual, sin cambiarlo. Como cada página sigue donde acabó la anterior, lo que llegue mientras tanto no te hace repetir ni saltarte ninguna.

No hay un total de resultados. Para traer cada día solo lo nuevo, guarda el publicada de la primera licitación de la primera página (la lista va de la más nueva a la más antigua). La próxima vez pásalo en publicadaDesde y sigue urlSiguiente hasta que sea null. Te volverán a llegar las de ese mismo instante: descarta las que ya tengas por su codigo. Si tu herramienta pide un campo único para no repetir, es codigo.

Una licitación que ya tienes y cambia (un plazo ampliado, un documento nuevo) no vuelve a salir así, porque su publicada no cambia: para saberlo, vuelve a pedir su detalle y mira actualizada.

Ejemplo: solo lo nuevo, desde el «publicada» de la primera de la lista

Petición con curl
curl "https://licitacionesaldia.es/api/v1/licitaciones?cpv=77&provincia=28&publicadaDesde=2026-10-07T03:20:00.000Z" -H "Authorization: Bearer $LAD_CLAVE"

Responde 200 con esto:

{
  "datos": [
    {
      "codigo": "p18765432",
      "titulo": "Mantenimiento de zonas verdes y arbolado de los parques municipales",
      "organismo": {
        "nombre": "Junta de Gobierno Local del Ayuntamiento de Getafe",
        "dir3": "L01280650",
        "nif": "P2806500J"
      },
      "cpv": {
        "codigo": "77311000",
        "division": "77",
        "nombreDivision": "Servicios agrícolas, forestales, hortícolas, acuícolas y apícolas"
      },
      "provincia": {
        "codigo": "28",
        "nombre": "Madrid"
      },
      "municipioIne": "28065",
      "tipoContrato": {
        "codigo": "2",
        "nombre": "Servicios"
      },
      "procedimiento": {
        "codigo": "1",
        "nombre": "Abierto"
      },
      "contratoMenor": false,
      "lotes": 0,
      "importes": {
        "presupuestoSinIva": 245000,
        "valorEstimadoSinIva": 490000
      },
      "plazo": {
        "fechaLimite": "2026-10-27",
        "horaLimite": "14:00",
        "abierta": true
      },
      "fechaAnuncio": "2026-10-06",
      "publicada": "2026-10-07T03:20:00.000Z",
      "actualizada": "2026-10-06T09:12:00.000Z",
      "enlaces": {
        "ficha": "https://licitacionesaldia.es/licitaciones/p18765432",
        "fuenteOficial": "https://contrataciondelestado.es/wps/poc?uri=deeplink:detalle_licitacion&idEvl=ejemplo18765432"
      }
    }
  ],
  "paginacion": {
    "limite": 20,
    "cursorSiguiente": null,
    "urlSiguiente": null
  }
}

Vuelve a salir p18765432, la del publicada que se pasa (2026-10-07T03:20:00.000Z): si ya la tienes, descártala por su codigo.

Campos de la respuesta

En «paginacion», en las dos listas.

limitenúmero
Cuántas caben en la página (el parámetro «limite»).
cursorSiguientetexto o null
El cursor de la página siguiente; null si no hay más.
urlSiguientetexto o null
La dirección completa de la página siguiente, con tus filtros; null si no hay más.

Límites

Cada clave puede hacer 60 peticiones por minuto y 1000 al día (el día va de las 00:00 a las 00:00 en hora UTC: las 2:00 en España en verano, la 1:00 en invierno). Entre todas tus claves, como mucho 3000 al día: crear claves nuevas no da más. Las búsquedas con texto cuentan además para su propio tope: 200 al día por clave y 600 entre todas tus claves.

Cada respuesta a una clave válida dice lo que te queda:

  • X-RateLimit-Limit-Minute y X-RateLimit-Remaining-Minute: las peticiones del minuto y las que quedan.
  • X-RateLimit-Limit-Day y X-RateLimit-Remaining-Day: las del día y las que quedan (contando lo que llevas con tus otras claves).
  • Retry-After, en las respuestas 429: los segundos que hay que esperar.

Si tu clave deja de servir (la revocas, tu plan acaba o cerramos la API), después de 60 respuestas rechazadas en una hora llega un 429: deja de llamar y mira el codigo de las respuestas.

Las listas se guardan hasta 5 minutos: pedir lo mismo más a menudo no trae nada nuevo. Los datos se cargan cada madrugada.

Errores

Todos los errores llegan en JSON con la misma forma: un codigo que no cambia (compáralo en tu programa), un mensaje para las personas y, si el error es de un parámetro, cuál es en parametro. Por ejemplo, /api/v1/licitaciones?provincia=Madrid responde 400:

{
  "error": {
    "codigo": "parametro_invalido",
    "mensaje": "«provincia» es el código INE de la provincia, de dos cifras (por ejemplo, 28 para Madrid). La lista está en la documentación.",
    "parametro": "provincia"
  }
}

Campos de la respuesta

En «error», en todos los errores.

codigotexto
Qué ha pasado. No cambia: compara este. Todos los que hay, en «Los códigos», a continuación.
mensajetexto
Lo mismo, explicado para las personas. Puede cambiar.
parametrotexto
Solo en los errores de un parámetro: cuál es.

Los códigos

parametro_desconocido400
Un parámetro que la ruta no tiene (una errata en el nombre, por ejemplo). Se dice cuál en «parametro».
parametro_invalido400
Un parámetro con un valor que no vale, o repetido. Se dice cuál en «parametro» y cómo tiene que ser en «mensaje».
cursor_invalido400
Un cursor cambiado, cortado o de otra ruta. Usa el de la respuesta anterior tal cual.
sin_clave401
La petición no lleva la cabecera Authorization.
clave_invalida401
La cabecera no va como «Bearer lad_…», la clave está mal copiada o no existe: el «mensaje» dice cuál de las tres.
clave_revocada401
La clave se revocó en el panel. Crea otra.
api_no_disponible403
La API está cerrada en este momento. La clave sigue guardada: volverá a funcionar cuando se abra.
plan_sin_api403
La cuenta de la clave no tiene ahora el plan Empresa (o el plan de su equipo ya no está activo).
sin_plaza403
La cuenta está en un equipo con más personas que plazas y no tiene plaza. Quien gestiona el equipo puede dársela.
no_encontrada404
No tenemos ninguna licitación con ese código: puede que se haya adjudicado o anulado, o que cerrara hace más de 7 días. También el «codigo» de una seguida ya adjudicada: su adjudicación está en su ficha.
ruta_no_existe404
La dirección no es una ruta de la API v1. Las que hay: /api/v1/licitaciones, /api/v1/licitaciones/{codigo} y /api/v1/seguidas.
solo_lectura405
Un método que no es GET (POST, PUT, PATCH o DELETE): la API v1 es de solo lectura.
limite_por_minuto429
Demasiadas peticiones en el minuto con esa clave. Espera los segundos de «Retry-After».
limite_por_dia429
La clave ha llegado a su límite del día, o tú entre todas tus claves (3 veces el de una clave). Se renueva a las 00:00 UTC.
limite_busquedas429
La clave ha hecho sus 200 búsquedas por texto del día, o tú las 600 entre todas tus claves. Sin «texto» puedes seguir.
demasiados_fallos429
Muchas peticiones rechazadas seguidas: más de 30 por minuto con claves que no existen desde la misma conexión, o más de 60 en una hora con una clave que ya no sirve (revocada, sin plan o con la API cerrada). Espera los segundos de «Retry-After» y revisa el «codigo» de las respuestas anteriores.
error_interno500
Algo ha fallado de nuestra parte. Vuelve a probar en unos minutos.

Desde una herramienta de automatización

No tenemos conectores propios para ningún CRM, hoja de cálculo ni herramienta de automatización. Sirve cualquiera que haga peticiones HTTP con una cabecera (la mayoría tienen un paso de «petición HTTP»), así:

  1. Crea una clave solo para esa herramienta, con su nombre: si un día la dejas, la revocas sin tocar las demás.
  2. Añade una petición HTTP con el método GET, la dirección de la ruta con tus filtros (por ejemplo, https://licitacionesaldia.es/api/v1/licitaciones?cpv=45&provincia=28) y una cabecera Authorization con el valor Bearer, un espacio y tu clave. Si la herramienta guarda datos secretos, guárdala ahí.
  3. Indica que la respuesta es JSON: las licitaciones están en datos, una por elemento.
  4. Para la página siguiente, repite la petición con la dirección de paginacion.urlSiguiente mientras no sea null.
  5. Para traer cada día solo lo nuevo, guarda el publicada de la primera licitación de la primera página y pásalo la próxima vez en publicadaDesde. Te volverán a llegar las de ese mismo instante: si la herramienta pide un campo único para no repetir, es codigo.
  6. Si llega un 429, espera los segundos de Retry-After y repite.

Códigos de provincias y sectores

Provincias (provincia): 52 códigos INE
  • 01 Araba/Álava
  • 02 Albacete
  • 03 Alicante/Alacant
  • 04 Almería
  • 05 Ávila
  • 06 Badajoz
  • 07 Illes Balears
  • 08 Barcelona
  • 09 Burgos
  • 10 Cáceres
  • 11 Cádiz
  • 12 Castellón/Castelló
  • 13 Ciudad Real
  • 14 Córdoba
  • 15 A Coruña
  • 16 Cuenca
  • 17 Girona
  • 18 Granada
  • 19 Guadalajara
  • 20 Gipuzkoa
  • 21 Huelva
  • 22 Huesca
  • 23 Jaén
  • 24 León
  • 25 Lleida
  • 26 La Rioja
  • 27 Lugo
  • 28 Madrid
  • 29 Málaga
  • 30 Murcia
  • 31 Navarra
  • 32 Ourense
  • 33 Asturias
  • 34 Palencia
  • 35 Las Palmas
  • 36 Pontevedra
  • 37 Salamanca
  • 38 Santa Cruz de Tenerife
  • 39 Cantabria
  • 40 Segovia
  • 41 Sevilla
  • 42 Soria
  • 43 Tarragona
  • 44 Teruel
  • 45 Toledo
  • 46 Valencia/València
  • 47 Valladolid
  • 48 Bizkaia
  • 49 Zamora
  • 50 Zaragoza
  • 51 Ceuta
  • 52 Melilla
Sectores (cpv): 45 divisiones CPV
  • 03 Productos de la agricultura, ganadería, pesca, silvicultura y productos afines
  • 09 Derivados del petróleo, combustibles, electricidad y otras fuentes de energía
  • 14 Productos de la minería, de metales de base y productos afines
  • 15 Alimentos, bebidas, tabaco y productos afines
  • 16 Maquinaria agrícola
  • 18 Prendas de vestir, calzado, artículos de viaje y accesorios
  • 19 Piel y textiles, materiales de plástico y caucho
  • 22 Impresos y productos relacionados
  • 24 Productos químicos
  • 30 Máquinas, equipo y artículos de oficina y de informática, excepto mobiliario y paquetes de software
  • 31 Máquinas, aparatos, equipo y productos consumibles eléctricos; iluminación
  • 32 Equipos de radio, televisión, comunicaciones y telecomunicaciones y equipos conexos
  • 33 Equipamiento y artículos médicos, farmacéuticos y de higiene personal
  • 34 Equipos de transporte y productos auxiliares
  • 35 Equipo de seguridad, extinción de incendios, policía y defensa
  • 37 Instrumentos musicales, artículos deportivos, juegos, juguetes, artículos de artesanía, materiales artísticos y accesorios
  • 38 Equipo de laboratorio, óptico y de precisión (excepto gafas)
  • 39 Mobiliario (incluido el de oficina), complementos de mobiliario, aparatos electrodomésticos (excluida la iluminación) y productos de limpieza
  • 41 Agua recogida y depurada
  • 42 Maquinaria industrial
  • 43 Maquinaria para la minería y la explotación de canteras y equipo de construcción
  • 44 Estructuras y materiales de construcción; productos auxiliares para la construcción (excepto aparatos eléctricos)
  • 45 Trabajos de construcción
  • 48 Paquetes de software y sistemas de información
  • 50 Servicios de reparación y mantenimiento
  • 51 Servicios de instalación (excepto software)
  • 55 Servicios comerciales al por menor de hostelería y restauración
  • 60 Servicios de transporte (excluido el transporte de residuos)
  • 63 Servicios de transporte complementarios y auxiliares; servicios de agencias de viajes
  • 64 Servicios de correos y telecomunicaciones
  • 65 Servicios públicos
  • 66 Servicios financieros y de seguros
  • 70 Servicios inmobiliarios
  • 71 Servicios de arquitectura, construcción, ingeniería e inspección
  • 72 Servicios TI: consultoría, desarrollo de software, Internet y apoyo
  • 73 Servicios de investigación y desarrollo y servicios de consultoría conexos
  • 75 Servicios de administración pública, defensa y servicios de seguridad social
  • 76 Servicios relacionados con la industria del gas y del petróleo
  • 77 Servicios agrícolas, forestales, hortícolas, acuícolas y apícolas
  • 79 Servicios a empresas: legislación, mercadotecnia, asesoría, selección de personal, imprenta y seguridad
  • 80 Servicios de enseñanza y formación
  • 85 Servicios de salud y asistencia social
  • 90 Servicios de alcantarillado, basura, limpieza y medio ambiente
  • 92 Servicios de esparcimiento, culturales y deportivos
  • 98 Otros servicios comunitarios, sociales o personales

Versión y cambios

Esta es la versión 1 (/api/v1). Dentro de ella pueden aparecer campos y rutas nuevos, pero no quitaremos ni cambiaremos de nombre ni de tipo los que ya hay. Pueden cambiar los textos pensados para personas (el mensaje de los errores, estadoTexto y los nombre), los límites (cada respuesta los lleva en sus cabeceras) y que un dato venga vacío (null) si la fuente oficial deja de publicarlo. Compara los códigos, no los textos, y haz que tu integración pase por alto los campos que no conozca.

¿Algo no cuadra o echas algo en falta? Escríbenos a soporte@licitacionesaldia.com.