Licitaciones públicas de España - open data (no oficial)
Pricing
from $20.00 / 1,000 licitacións
Licitaciones públicas de España - open data (no oficial)
Licitaciones públicas de España desde el feed oficial de la PLACSP: registros tipados con objeto, estado, tipo de contrato, valor estimado, CPV, órgano de contratación, fechas y adjudicatario. CSV/Excel listos. No oficial: actor no afiliado a la PLACSP.
Pricing
from $20.00 / 1,000 licitacións
Rating
0.0
(0)
Developer
Riccardo Pongetti
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Spain Public Tenders — PLACSP open data (Apify Actor)
Public tenders published on Spain's Public Sector Procurement Platform (PLACSP), from the official open-data syndication feed sindicacion_643 — "Licitaciones publicadas en los perfiles del contratante ubicados en la Plataforma de Contratación del Sector Público, excluyendo los contratos menores".
- 100% legal / no scraping: official Atom feed published by the Dirección General del Patrimonio del Estado (Ministerio de Hacienda), reusable under Ley 19/2013 and Ley 37/2007. No key, no login, no cookies, no captcha.
- Clean, typed records: object, status, contract type, estimated value, CPV codes, contracting authority (name + NIF + DIR3), place of performance (region/NUTS), dates, and — when awarded — the awardee (name + NIF) and award amount.
- Ready-to-open CSV and Excel exports (RFC-4180 CSV, styled XLSX with real numeric cells, autofilter and a provenance sheet).
- Unofficial: not affiliated with, endorsed by or sponsored by the PLACSP or the Ministry of Finance.
How it works
The Actor fetches the live feed
https://contrataciondelsectorpublico.gob.es/sindicacion/sindicacion_643/licitacionesPerfilesContratanteCompleto3.atom,
parses each Atom <entry> (CODICE 2.07 ContractFolderStatus), normalises it into a flat
typed record, applies the requested filters, and pushes one dataset item per returned
tender. The payload is cached in the key-value store for cacheMinutes (default 60) so
repeated runs do not hammer the endpoint.
Inputs
| Field | Type | Default | Description |
|---|---|---|---|
statuses | array | [] (all) | Filter by tender status: PUB, EV, ADJ, RES, PRE. |
keywords | array | [] | Partial match on object / ID / authority (accents optional). |
cpvCodes | array | [] | Filter by CPV code (prefix match, e.g. 4523 = construction). |
contractTypes | array | [] | Filter by contract type: 1=Suministros, 2=Servicios, 3=Obras, 8/22/50=concesiones/otros. |
contractingAuthorities | array | [] | Partial match on authority name or NIF. |
regions | array | [] | Partial match on region / NUTS (e.g. Madrid, ES521). |
minValueEur / maxValueEur | number | — | Filter on estimated value. |
awardedOnly | boolean | false | Only tenders that already have an awardee. |
maxResults | integer | 0 (no limit) | Caps the run (and its cost). The feed holds the most recent updates, up to ~500 entries. |
exportFiles | array | ["csv","xlsx"] | Also write ready-to-open files (free, no events). |
exportLanguage | string | es | Export language: es / en. |
chargeReport | boolean | true | Add the aggregate run-report event. |
cacheMinutes | integer | 60 | Cache the source payload this long (0 = always fetch fresh). |
Output
Dataset items (one per tender):
tenderId, object, status, statusCode, contractType, contractTypeCode, link,estimatedValueEur, budgetEur, budgetNetEur, cpvCodes[],contractingAuthority, contractingAuthorityNif, contractingAuthorityDir3,region, regionNuts, countryCode, publishedAt, submissionDeadline,awardDate, awardeeName, awardeeNif, awardAmountEur, awardAmountNetEur,source, sourceUrl, sourceLicence, sourceUpdatedAt
Key-value store: SUMMARY (run metadata + statistics) and, when enabled, the export
files licitaciones-es.csv / licitaciones-es.xlsx (or -en.).
Pay-per-event pricing
| Event | Price | When |
|---|---|---|
tender-charged | $0.02 | Once per returned tender. |
run-report | $0.01 | Once per run (optional aggregate statistics). |
Examples (cost to the customer):
- Latest 20 tenders →
20 × $0.02 + $0.01= $0.41 - Awarded construction tenders (say 40 match) →
40 × $0.02 + $0.01= $0.81 - Full feed (~284 entries) →
284 × $0.02 + $0.01= $5.69
maxResults is the cost guardrail: a "give me everything" run on a busy day costs a few
dollars, never surprises the customer.
Coste real (créditos + tokens) vs ingreso esperado
Estimates to validate in Apify Console before/after first payout:
- Compute (créditos): one GET of ~8 MB + parse of ~284 XML entries runs in a couple of seconds of a small container. Estimated ~$0.01–0.05/run in compute credits.
- Tokens (LLM): zero at runtime (the Actor is deterministic Python; no LLM calls). The only token spend was one-time, building the Actor.
- Ingreso bruto por run completo (284 licitaciones): ~$5.69.
- Apify platform fee (pay-per-event revenue share): budget ~20–30% (confirm in Console). Net per full run ≈ $4.0–4.5, against ~$0.03 compute ⇒ margin ≈ 99% of revenue.
Bottom line: the marginal cost of serving a run is negligible; the value is the data. The
real question is demand (B2B tender alerts), not unit economics. Do not run un-capped
automations against the full feed for yourself — that is what maxResults and the cache
are for.
Local testing (no Apify token)
uv venv .venv --python 3.13uv pip install --python .venv/bin/python 'apify>=2.0.0' openpyxl pytest.venv/bin/python -m pytest tests -q # logic.venv/bin/python -m src.main --local examples/input-latest.json # real end-to-end
Publication checklist (account owner — NOT done here)
- Create/verify the Apify account and complete KYC.
apify push(or connect the repo in Apify Console and build).- In Console → Monetization, enable pay-per-event with the two events above.
- Verify the charge path end-to-end with a real paid run (one item) before marketing.
- Confirm the exact platform fee and compute-credit cost; update this README.
This repo has been built and tested locally; it is not published.