API + ETL para explorar datos de licitaciones de la Plataforma de Contratación del Sector Público.
Optimizada para consumo por agentes de IA: búsqueda unificada, respuestas densas, códigos CODICE resueltos a etiquetas legibles.
Base URL: https://api.licit.es/api/v1
Documentación interactiva: https://api.licit.es/docs
No requiere autenticación. Rate limit: 30 req/min por IP.
curl -X POST https://api.licit.es/api/v1/buscar \
-H 'Content-Type: application/json' \
-d '{"q": "desarrollo software", "filtros": {"tipo_contrato": ["Servicios"]}, "limit": 5}'curl https://api.licit.es/api/v1/licitacion/<uuid>curl https://api.licit.es/api/v1/catalogos/tipo_contrato| Método | Ruta | Descripción |
|---|---|---|
| POST | /buscar |
Búsqueda unificada: texto libre + filtros + cursor |
| GET | /licitacion/{id} |
Detalle completo (criterios, solvencia, lotes, docs) |
| GET | /empresa/{nif} |
Perfil de empresa con stats agregadas |
| GET | /organo/{id} |
Perfil de órgano con stats |
| GET | /similares/{id} |
Licitaciones similares (CPV + importe) |
| GET | /catalogos/{tipo} |
Valores válidos para filtros |
- API: FastAPI + asyncpg + PostgreSQL 16
- ETL: Ingestión de feeds ATOM CODICE (hourly cron)
- Búsqueda: tsvector español + pg_trgm para fuzzy
- Deploy: Docker Compose + Caddy (auto-HTTPS) en Hetzner
- Crear A record DNS:
api.licit.es → <IP del servidor> - Rellenar variables en
deploy/cloud-init.yml - Crear servidor e insertar cloud-init
- Tras boot, seed inicial:
ssh adf@<ip>
cd placsp-browser/deploy
docker compose exec etl-cron sh -c \
"cd /app && PYTHONPATH=src uv run python -m etl.handlers.feed_reader --seed"cp .env.example .env
uv sync
PYTHONPATH=src uv run pytest tests/
PYTHONPATH=src uv run uvicorn api.main:app --reload