EU Procurement Notices Scraper — All 27 Member States + UK
EU Procurement Notices Scraper — All 27 Member States + UK
Scrape procurement notices across all 27 EU member states, plus the UK. Every member state is covered end-to-end — no selectable country ever returns zero rows.
Six countries — France, UK, Spain, Netherlands, Belgium, Italy — additionally pull from their own national portal, adding notices below the EU publication threshold that the EU-wide source doesn't carry.
Returns CPV codes, estimated values, deadlines, authority data, and award-winner details.
What you get
Each record covers a single procurement notice:
| Field | Description |
|---|---|
country |
ISO-2 code of the buying authority |
source_portal |
Name of the source portal (TED, or the national portal) |
notice_id |
Portal-specific notice identifier |
notice_type |
contract_notice, award_notice, prior_info, or modification |
cpv_codes |
Common Procurement Vocabulary codes, comma-separated |
title |
Notice title |
description |
Notice description (up to 500 chars) |
publication_date |
ISO-8601 publication date |
submission_deadline |
ISO-8601 deadline for submissions |
estimated_value_eur |
Estimated contract value in EUR |
currency |
Original currency of the value |
contract_duration |
Contract duration (where available) |
awarding_authority_name |
Contracting authority name |
awarding_authority_country |
Authority country |
awarding_authority_type |
Authority type (ministry, municipality, etc.) |
award_winner_name |
Awarded supplier (award notices only) |
award_winner_country |
Supplier country |
award_value_eur |
Final awarded value in EUR |
num_bidders |
Number of bids received |
procedure_type |
Procurement procedure (open, restricted, negotiated, etc.) |
eu_funded |
Whether EU cohesion/structural funds are involved |
sustainability_criteria |
Green/social procurement criteria |
documents_url |
URL to tender documents |
cross_ref_ted_oj_id |
TED/OJEU reference ID (above-threshold notices) |
source_url |
Direct link to the notice |
Coverage
EU-wide, above the EU publication threshold. All 27 member states — Austria, Belgium, Bulgaria, Croatia, Cyprus, Czechia, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Ireland, Italy, Latvia, Lithuania, Luxembourg, Malta, Netherlands, Poland, Portugal, Romania, Slovakia, Slovenia, Spain, Sweden — resolve to real notices for every one of them. There is no country in the picker that returns nothing.
National portals, below the threshold. Six countries additionally pull from their own open-data portal, which carries smaller contracts the EU-wide source doesn't:
| Code | Country | Data quality |
|---|---|---|
| FR | France | Full — JSON, paginated |
| UK | United Kingdom | Full — REST/JSON (UK is not an EU member state, so this is its only source) |
| ES | Spain | Partial — title/date/link only |
| NL | Netherlands | Best-effort |
| BE | Belgium | Best-effort |
| IT | Italy | Best-effort |
The remaining 21 member states are EU-wide only — a legitimate absence, not a gap: they simply have no open national portal of their own to add to.
Input
{
"countries": ["FR", "UK"],
"mode": "recent_notices",
"lookbackDays": 7,
"maxItems": 100
}
Fields
| Field | Type | Default | Description |
|---|---|---|---|
countries |
array | required | ISO-2 country codes to crawl |
mode |
string | required | Query mode (see below) |
lookbackDays |
integer | 7 | Days to look back (for recent_notices mode) |
dateFrom |
string | — | Start date YYYY-MM-DD (for by_date_range mode) |
dateTo |
string | today | End date YYYY-MM-DD (for by_date_range mode) |
query |
string | — | Search keyword (for by_keyword mode) |
cpvCodes |
array | — | CPV codes to filter by (EU-wide source) |
noticeTypes |
array | all | Filter by notice type |
minValueEur |
integer | 0 | Minimum estimated value in EUR (EU-wide source) |
maxItems |
integer | 10 | Maximum records across all portals |
Modes
| Mode | Description |
|---|---|
recent_notices |
Notices published in the last N days |
by_keyword |
Full-text keyword search |
by_cpv_code |
Filter by CPV codes |
award_notices_only |
Only contract award notices |
by_date_range |
Notices within a specific date range |
Examples
Recent notices from France and UK (last 3 days)
{
"countries": ["FR", "UK"],
"mode": "recent_notices",
"lookbackDays": 3,
"maxItems": 50
}
Keyword search across multiple countries
{
"countries": ["FR", "DE", "IT"],
"mode": "by_keyword",
"query": "software development",
"maxItems": 100
}
Award notices from Spain and Belgium
{
"countries": ["ES", "BE"],
"mode": "award_notices_only",
"maxItems": 50
}
All IT contracts above EUR 100k in a date range
{
"countries": ["IT"],
"mode": "by_date_range",
"dateFrom": "2026-01-01",
"dateTo": "2026-03-31",
"minValueEur": 100000,
"maxItems": 500
}
Notes
- Above vs. below threshold. The EU-wide source carries every notice published above the EU procurement thresholds, for all 27 member states. National portals (FR, UK, ES, NL, BE, IT) add smaller, below-threshold contracts on top — select one of those six countries to get both.
- Spain (ES) national-portal data comes from a single Atom/XML feed and contains only title, publication date, and source URL. Full tender details require visiting the linked page.
- Best-effort national portals (NL, BE, IT) reflect the field structure of each portal's own open-data API. Field availability varies by portal.
- Set
maxItemsto a reasonable value. Default run memory is 1 GB with a 4-hour timeout.
Further reading: How to Get Government Tender Data From 14 Procurement Portals