A free API for open EU tenders

Every page on this site is also a JSON endpoint. No key, no sign-up, no rate limit, and Access-Control-Allow-Origin: * on everything — so you can call it straight from a browser. Rebuilt once a day from the EU Official Journal.

Endpoints

/api/stats.jsonCounts and build time /api/countries.jsonCountries, with open tender counts /api/sectors.jsonThe 45 CPV divisions, with counts /api/cpv.jsonEvery CPV code in use: [code, label, open] /api/c/<ISO3>.jsonOpen tenders in one country /api/s/<division>.jsonOpen tenders in one CPV division /api/index.jsonCompact search index, all open tenders

A notice looks like this

{ "id": "533447-2026", "title": "Germany – Cleaning services – Unterhaltsreinigung", "buyer": "Landkreis Marburg-Biedenkopf", "country": "DEU", "country_name": "Germany", "cpv_divisions": ["90"], "cpv_main": "90910000", "cpv_main_label": "Cleaning services", "contract_nature": "services", "place_of_performance": "DE724", "published": "2026-08-03", "deadline": "2026-09-15T10:15:00+02:00", "url": "…/n/533447-2026.html", "ted_url": "https://ted.europa.eu/en/notice/-/detail/533447-2026" }

Try it

curl -s https://jaydemks.github.io/bidledger/api/sectors.json | jq '.[0]' # every open construction tender in Italy curl -s https://jaydemks.github.io/bidledger/api/c/ITA.json | jq '[.[] | select(.cpv_divisions[]=="45")] | length'

The catch

It is a static site, so there is no query language: you fetch a whole collection and filter it yourself. The largest file is /api/index.json, a few megabytes. Everything is regenerated once a day, so cache it rather than polling.

Closed calls are dropped from the API the day their deadline passes, though their page is kept for 60 days as a record.

Terms

The data comes from TED and is re-used under the European Commission's open data policy; it stays free under the same terms. Attribution is appreciated but not required. There is no uptime guarantee and no support — it is a static file on GitHub Pages. If you build something with it, the code is here.

The awards, as a dataset

This API covers what is open. What was already won — 374,443 contract awards with the winning company and the value converted to euro — is published as a dataset on Hugging Face, free and re-usable.

huggingface.co/datasets/jaydem/eu-contract-awards

Want the tenders, not the JSON?

Every sector and country page has an RSS feed, and the daily email lands in your inbox instead.

Daily alerts