jaydem/eu-contract-awards
EU Public Contract Awards Every public contract award published in the Supplement to the Official Journal of the European Union over the last twelve months: 374,443 awards, with the buyer, the winning company, the sector, and the value converted to euro. The European Union publishes this. It is free, and it is served by an API that needs no key. Almost nobody uses it, because getting from that API to a table you can work with takes a day of unpleasant work: the values arrive in… See the full description on the dataset page: https://huggingface.co/datasets/jaydem/eu-contract-awards.
EU Public Contract Awards
Every public contract award published in the Supplement to the Official Journal of the European Union over the last twelve months: 374,443 awards, with the buyer, the winning company, the sector, and the value converted to euro.
The European Union publishes this. It is free, and it is served by an API that needs no key. Almost nobody uses it, because getting from that API to a table you can work with takes a day of unpleasant work: the values arrive in twenty currencies, the names arrive as multilingual dictionaries, and a handful of the numbers are wrong in ways that quietly ruin any total. That work is what this dataset is.
What is in it
Read this before you sum anything
Country totals are not comparable. Reporting conventions differ, and the difference is enormous. The median Swedish award in this data is €4,000,000; the median German one is €226,236. Sweden is not buying eighteen times bigger: Swedish authorities publish the ceiling of a framework agreement, German ones publish what the contract was actually worth. The thousand largest rows account for 39% of the total value in the file. Counts and per-country medians are sound. Cross-country sums are not, and anyone quoting a single headline figure for "the size of EU procurement" from this file is quoting an artefact.
`value_source` matters. TED carries up to three different values per notice, and they mean different things: the tender value, the value stated for the notice as a whole, and the buyer's pre-tender estimate. value_eur falls back through them in that order, and value_source records which one it used. In the last twelve months: 80% tender_value, 6% estimated_value, under 1% notice_value, and 13% with no value published at all.
168 values in the full archive are simply wrong. One German notice records a contract worth €74,654,684,654,465,482,752. These are typing mistakes by the authority, not mega-projects. They are kept exactly as published, because the notice is a public record and altering it would be worse — but they are marked value_quality = implausible so a single one cannot wreck your average. Filter on value_quality = ok unless you have a reason not to.
Load `cpv_main` as text, not as a number. 2.8% of CPV codes begin with a zero — 03111700 is vegetable seeds — and any tool that guesses the column is an integer will silently turn that into 3111700 and break every join against the CPV vocabulary. The column is declared as a string in this card, so the Hugging Face viewer and datasets get it right; in pandas, pass dtype={"cpv_main": str}.
`-1` and `0` mean "not disclosed", not zero. TED uses them as sentinels. They are reported here as an absent value, not as a contract worth nothing.
How it was built
POST https://api.ted.europa.eu/v3/notices/search with scope: ALL, one month at a time, taking the four award notice types. Multilingual fields flattened to English where available. Euro conversion at the European Central Bank's daily reference rate for the publication date, or the most recent rate before it when the notice fell on a weekend.
The code is open: <https://github.com/jaydemks/bidledger> — scripts/awards.py, scripts/enrich_awards.py, scripts/export_awards.py. You can rebuild this from scratch in about an hour, and you should, if you need to be certain of it.
Coverage
Twelve months, 374,443 awards. 90% name a winner; 87% carry a usable value. Germany, Poland, France, Spain, Czechia and Romania supply the most notices.
The two-year archive
This file is the last twelve months, and it is free for good. If you need the run before it — 719,960 awards from August 2024, twice the history, refreshed monthly for a year — that version is sold to pay for the work:
https://bidledger.gumroad.com/l/eu-contract-awards
Nothing is held back from the free file to make the paid one look better: it is the same pipeline, the same columns, the same documentation, over a longer period. And the source is public either way — the code above rebuilds all of it in about an hour if you would rather spend the hour than the money. That is a fair trade to state plainly rather than hide.
Licence and attribution
Data from Tenders Electronic Daily, the supplement to the Official Journal of the European Union, re-used under the European Commission's open data policy (Decision 2011/833/EU), which permits commercial re-use with attribution. This packaging is released under CC BY 4.0.
This is an independent project. It is not affiliated with, endorsed by, or operated by the European Union or any contracting authority. TED remains the authoritative source, and every row links back to it.
