EU Public Tenders & Contract Awards API (TED procurement)
Coming soon to the StoreGet European public tenders and contract awards as clean, predictable JSON from TED, filtered by keyword, buyer country, CPV code, notice type, date and value: open calls for tenders with their deadline and estimated value, award notices with the winning companies and the awarded amount, and prior information notices about planned purchases. One row per notice, the same field names for every country and notice form. For bid teams, tender-alert services, market researchers and AI agents.
Pricing (pay per event): $0.002 per notice ($2 per 1,000 notices), no start fee. You only pay for notices delivered, a notice is never charged twice in the same run, and the Actor stops at your max charge limit. With onlyNewSinceLastRun, scheduled runs only pay for notices you haven't received yet.
Questions agents ask
- “Find open IT tenders above 1 million euros in Germany and the Netherlands from the last two weeks and list their deadlines.”
- “Which companies won construction contracts from Polish buyers last month, and for how much?”
- “Alert me to new cloud hosting tenders in the Nordics every morning.”
Example
Input
{
"keywords": "software",
"countries": ["DE", "NL", "FR"],
"cpvCodes": ["72", "48"],
"noticeTypes": ["contract_notice", "contract_award"],
"publishedFrom": "2026-10-01",
"minValueEur": 100000,
"maxResults": 200
}Output
{
"schema_version": "1",
"notice_id": "768694-2026",
"notice_type": "contract_award",
"ted_notice_type": "can-standard",
"published": "2026-11-05",
"deadline": null,
"title": "Netherlands – Software package and information systems – Software Schuldhulpverlening",
"title_language": "eng",
"description": "De gemeente heeft als doel om op basis van deze Europese openbare aanbestedingsprocedure volgens de Aanbestedingswet 2012 te komen tot een overeenkomst met één partij voor het leveren van software als een dienst ten aanzien van Schuldhulpverlening. zie leidraad",
"description_language": "nld",
"buyer_name": "Gemeente Apeldoorn, team Inkoop",
"buyer_country": "NLD",
"buyer_city": "Apeldoorn",
"cpv_codes": ["48000000"],
"main_cpv": "48000000",
"estimated_value": 3000000,
"awarded_value": 3600000,
"currency": "EUR",
"winner_names": ["Innovadis B.V."],
"procedure_type": "open",
"lots_count": 1,
"ted_url": "https://ted.europa.eu/en/notice/-/detail/768694-2026",
"source_url": "https://ted.europa.eu/en/notice/768694-2026/xml",
"retrieved_at": "2026-11-05T16:05:27+00:00"
}What you get
| Field | Type | Meaning |
|---|---|---|
schema_version | string | Output schema version. |
notice_id | string | TED publication number, e.g. 760925-2026. Unique per notice. |
notice_type | string | null | contract_notice, contract_award, prior_information, direct_award_preannouncement, contract_modification or market_consultation (from TED's form type). |
ted_notice_type | string | null | TED's detailed notice type code, e.g. cn-standard, can-standard, pin-only, can-modif. |
published | string | null | Publication date in the Official Journal S (YYYY-MM-DD). |
deadline | string | null | Deadline for receipt of tenders (earliest over all lots), ISO date or date-time with UTC offset. Null when the notice has none (e.g. award notices). |
title | string | null | Notice title, English when TED provides it (TED's 'Country – CPV – title' form), else the original language. |
title_language | string | null | ISO 639 language code of title, e.g. eng. |
description | string | null | Short description of the procurement (max. 500 characters), English if available, else the original language. E-mail addresses and phone numbers are removed. Null for legacy (pre-eForms) notices. |
description_language | string | null | ISO 639 language code of description, e.g. deu. |
buyer_name | string | null | Name of the (first) buyer: the contracting authority or entity. |
buyer_country | string | null | Country of the buyer, ISO 3166 alpha-3 (e.g. DEU), as published by TED. |
buyer_city | string | null | City of the buyer. |
cpv_codes | array | All CPV codes of the notice (8 digits, no check digit), duplicates removed. |
main_cpv | string | null | Main CPV code of the procedure (eForms notices only). |
estimated_value | number | null | Estimated value of the procedure, excl. VAT, in currency. Not converted. |
awarded_value | number | null | Total value of the contracts awarded in this notice, excl. VAT, in currency (award notices). |
currency | string | null | ISO 4217 currency of awarded_value, or of estimated_value when there is no awarded value. |
winner_names | array | null | Names of the winning tenderers (award notices; usually companies). |
procedure_type | string | null | Procedure type as coded by TED, e.g. open, restricted. Null when not given. |
lots_count | integer | null | Number of lots (eForms notices only). |
ted_url | string | Notice page on ted.europa.eu. |
source_url | string | Official XML of the notice on ted.europa.eu. |
retrieved_at | string | UTC time the notice was fetched from the TED API. |
Coverage
Every country that publishes on TED: the 27 EU member states, Norway, Iceland, Liechtenstein, Switzerland, candidate countries and EU-funded procurement abroad; about 22,000 notices a week. History from November 2016 (complete from 2017). New notices are available the day they are published.
Use with AI agents (MCP)
Add this URL to your MCP client (Claude, Cursor, VS Code, ...) to load the Actor as a tool through the Apify hosted MCP server. It signs you in with OAuth or accepts Authorization: Bearer <APIFY_TOKEN>. It works once the Actor is live on the Apify Store.
https://mcp.apify.com?tools=bosco_labs/eu-tenders
For “Find open IT tenders above 1 million euros in Germany and the Netherlands from the last two weeks and list their deadlines.” the agent passes:
{"countries": ["DE", "NL"], "cpvCodes": ["72"], "minValueEur": 1000000, "publishedFrom": "2026-10-22"}
stable, typed JSON, one row per notice. Every row has schema_version and a source_url pointing to the official notice XML on ted.europa.eu (plus ted_url, the notice page), so the agent can cite its source.
Or call the Apify API: POST https://api.apify.com/v2/acts/bosco_labs~eu-tenders/run-sync-get-dataset-items with the input as JSON body. Cost: $0.002 per notice.
Input fields
| Field | Type | Meaning |
|---|---|---|
keywords | string | Full-text search over the whole notice, in any language; a notice matches when it contains all words, e.g. "cloud hosting". Empty = no keyword filter. |
countries | array | Buyer countries as ISO 3166 alpha-2 (DE, FR, NL, PL, ...) or alpha-3 (DEU) codes, e.g. ["DE", "NL"]. Alpha-3 works for any country, e.g. UKR. Empty = all countries. |
cpvCodes | array | Common Procurement Vocabulary (CPV) code prefixes as digit strings; a prefix matches every code below it, e.g. ["72"] = IT services, "45" = construction work, "3312" = medical equipment, "72212000" = one specific code. Empty = all sectors. |
noticeTypes | array | Kinds of notices: contract_notice (open call for tenders), contract_award (who won, for how much), prior_information, direct_award_preannouncement, contract_modification, market_consultation. Default ["contract_notice"]. Pass [] for all kinds. |
publishedFrom | string | Earliest publication date, YYYY-MM-DD, e.g. "2026-10-01". The TED API covers notices from November 2016. Empty = 7 days before publishedTo. |
publishedTo | string | Latest publication date, YYYY-MM-DD. Empty = today. |
minValueEur | integer | Minimum total notice value in EUR, e.g. 1000000 (estimated value for calls, awarded value for awards). When set, notices stated in other currencies (e.g. PLN, SEK) and notices without a value are left out, as TED does not convert currencies. Empty = no minimum. |
maxResults | integer | Maximum notices, newest first, e.g. 100. Default 50. You pay per notice delivered. |
onlyNewSinceLastRun | boolean | true = skip (and don't charge for) notices an earlier run with the same filters already delivered. For scheduled runs. Default false. Remembered in a named key-value store in your account. |
Sources, licence and limits
Which countries? Every country that publishes on TED: the 27 EU member states, the EEA (Norway, Iceland, Liechtenstein), Switzerland, candidate countries and EU-funded procurement abroad. Use ISO codes; for countries outside Europe, use the alpha-3 code (e.g. UKR).
How fresh? TED publishes a new edition every working day. Runs read the live API, so new notices are available the day they are published.
Why is a field empty? It isn't in the notice. Award notices have no deadline, many contract notices state no estimated value, and older (pre-eForms) notices have fewer fields.
How does minValueEur work? It uses TED's total value of the notice: the estimated value for calls and the awarded value for awards. TED does not convert currencies, so with this filter set, notices stated in other currencies (PLN, SEK, CZK, ...) and notices without a value are left out. Leave it empty for non-euro countries.
Which language? Titles are in English (TED translates them into all EU languages). Descriptions are in the language the buyer wrote them in, unless an English version exists; description_language tells you which.
Can I get older notices? Yes: set publishedFrom and publishedTo. The TED API covers notices from November 2016 onwards (complete from 2017; checked 2026-11-05), and there is no 15,000-notice cap per run.
Contact details? Not included. Rows contain no contact persons, e-mail addresses or phone numbers, even where TED publishes them; they are also removed from descriptions.
Legal basis? TED notices may be freely reused for commercial and non-commercial purposes (Commission Decision 2011/833/EU, see the TED legal notice). Winner names are published by law; some winners are sole traders (natural persons), so if you process the data further, you are responsible for your own legal basis under GDPR.