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
- 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»…
- 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. - 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).
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
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
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
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
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-MinuteyX-RateLimit-Remaining-Minute: las peticiones del minuto y las que quedan.X-RateLimit-Limit-DayyX-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í:
- Crea una clave solo para esa herramienta, con su nombre: si un día la dejas, la revocas sin tocar las demás.
- 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 cabeceraAuthorizationcon el valorBearer, un espacio y tu clave. Si la herramienta guarda datos secretos, guárdala ahí. - Indica que la respuesta es JSON: las licitaciones están en
datos, una por elemento. - Para la página siguiente, repite la petición con la dirección de
paginacion.urlSiguientemientras no seanull. - Para traer cada día solo lo nuevo, guarda el
publicadade la primera licitación de la primera página y pásalo la próxima vez enpublicadaDesde. Te volverán a llegar las de ese mismo instante: si la herramienta pide un campo único para no repetir, escodigo. - Si llega un 429, espera los segundos de
Retry-Aftery repite.
Códigos de provincias y sectores
Provincias (provincia): 52 códigos INE
01Araba/Álava02Albacete03Alicante/Alacant04Almería05Ávila06Badajoz07Illes Balears08Barcelona09Burgos10Cáceres11Cádiz12Castellón/Castelló13Ciudad Real14Córdoba15A Coruña16Cuenca17Girona18Granada19Guadalajara20Gipuzkoa21Huelva22Huesca23Jaén24León25Lleida26La Rioja27Lugo28Madrid29Málaga30Murcia31Navarra32Ourense33Asturias34Palencia35Las Palmas36Pontevedra37Salamanca38Santa Cruz de Tenerife39Cantabria40Segovia41Sevilla42Soria43Tarragona44Teruel45Toledo46Valencia/València47Valladolid48Bizkaia49Zamora50Zaragoza51Ceuta52Melilla
Sectores (cpv): 45 divisiones CPV
03Productos de la agricultura, ganadería, pesca, silvicultura y productos afines09Derivados del petróleo, combustibles, electricidad y otras fuentes de energía14Productos de la minería, de metales de base y productos afines15Alimentos, bebidas, tabaco y productos afines16Maquinaria agrícola18Prendas de vestir, calzado, artículos de viaje y accesorios19Piel y textiles, materiales de plástico y caucho22Impresos y productos relacionados24Productos químicos30Máquinas, equipo y artículos de oficina y de informática, excepto mobiliario y paquetes de software31Máquinas, aparatos, equipo y productos consumibles eléctricos; iluminación32Equipos de radio, televisión, comunicaciones y telecomunicaciones y equipos conexos33Equipamiento y artículos médicos, farmacéuticos y de higiene personal34Equipos de transporte y productos auxiliares35Equipo de seguridad, extinción de incendios, policía y defensa37Instrumentos musicales, artículos deportivos, juegos, juguetes, artículos de artesanía, materiales artísticos y accesorios38Equipo de laboratorio, óptico y de precisión (excepto gafas)39Mobiliario (incluido el de oficina), complementos de mobiliario, aparatos electrodomésticos (excluida la iluminación) y productos de limpieza41Agua recogida y depurada42Maquinaria industrial43Maquinaria para la minería y la explotación de canteras y equipo de construcción44Estructuras y materiales de construcción; productos auxiliares para la construcción (excepto aparatos eléctricos)45Trabajos de construcción48Paquetes de software y sistemas de información50Servicios de reparación y mantenimiento51Servicios de instalación (excepto software)55Servicios comerciales al por menor de hostelería y restauración60Servicios de transporte (excluido el transporte de residuos)63Servicios de transporte complementarios y auxiliares; servicios de agencias de viajes64Servicios de correos y telecomunicaciones65Servicios públicos66Servicios financieros y de seguros70Servicios inmobiliarios71Servicios de arquitectura, construcción, ingeniería e inspección72Servicios TI: consultoría, desarrollo de software, Internet y apoyo73Servicios de investigación y desarrollo y servicios de consultoría conexos75Servicios de administración pública, defensa y servicios de seguridad social76Servicios relacionados con la industria del gas y del petróleo77Servicios agrícolas, forestales, hortícolas, acuícolas y apícolas79Servicios a empresas: legislación, mercadotecnia, asesoría, selección de personal, imprenta y seguridad80Servicios de enseñanza y formación85Servicios de salud y asistencia social90Servicios de alcantarillado, basura, limpieza y medio ambiente92Servicios de esparcimiento, culturales y deportivos98Otros 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.