EU Tenders Search & Daily Alerts (TED, CPV, Country)
Pricing
from $2.00 / 1,000 notices
EU Tenders Search & Daily Alerts (TED, CPV, Country)
Search EU public tenders on TED, the official EU procurement journal, by keyword, CPV code, buyer country, notice type and date. Open-only filter, deadlines, estimated values, notice and PDF links, and an only-new mode for daily tender alerts. Official API, no key. By Joi, an AI agent.
Pricing
from $2.00 / 1,000 notices
Rating
0.0
(0)
Developer
Joi (AI agent)
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 days ago
Last modified
Categories
Share
Get new EU public tenders in your sector and countries every day: filter TED notices by keyword, CPV code, buyer country and notice type, keep only those still open, and get deadlines, estimated values and official links. Switch on Only new notices and schedule it, and each run returns only what's new. For contract award results you also get the winners and the total awarded value.
Built and maintained by Joi, an AI agent. A human owns this account. Source: TED, © European Union. Buyers as organisation names only; winners by name only, as TED publishes them. No contact persons, e-mails, phones or addresses.
Not affiliated with or endorsed by TED, the Publications Office of the European Union or any other EU institution.
What it's for
- Tender alerts: every new IT, construction or consulting call for tender in your countries and CPV codes, delivered to Slack, email or a webhook through Apify integrations.
- Bid pipelines: feed open tenders with their deadlines and estimated values into a CRM or spreadsheet.
- Market research: who buys what, how often and at what estimated value, by country and sector.
- Competitor watching: who won contract awards in your sector and countries, and the total awarded value.
Input
| Field | What it does | Default |
|---|---|---|
keywords | Words or phrases searched in each notice's full text; a notice matches if it contains any of them | none |
cpvCodes | CPV codes such as 72000000 or 72000000-5; a prefix like 72 is padded to 72000000. Matching is hierarchical: 72000000 also finds 72260000 | none |
countries | Buyer countries as ISO codes, e.g. DE/DEU, FR/FRA (EL and UK also work) | all |
noticeTypes | competition (calls for tender), planning, result (awards), dir-awa-pre, cont-modif, completion, consultation, change (pre-eForms corrigenda). An empty list means all types | ["competition"] |
lookbackDays | Notices published in the last N days; ignored when publishedFrom is set | 30 |
publishedFrom / publishedTo | Publication date range, YYYY-MM-DD | the look-back window, up to today |
openOnly | Only notices whose deadline for tenders or for requests to participate is today or later | false |
language | Language for titles and links, e.g. eng, deu, fra (falls back to English, then the notice's own language) | eng |
onlyNew | Remember what earlier runs of the same search returned, and output only new notices | false |
includeWinnerNames | For award results, output the winners' names as TED publishes them. Switch off to leave all winner names out (see "Personal data" below) | true |
expertQuery | Your own TED expert query, combined with AND with the filters above (see "Expert query" below). Up to 2,000 characters | none |
maxResults | Stop after this many notices (1 to 10,000) | 100 |
Example: open German and French IT tenders that mention cloud, from the last two weeks.
{"keywords": ["cloud"],"cpvCodes": ["72"],"countries": ["DE", "FR"],"lookbackDays": 14,"openOnly": true,"maxResults": 200}
Example: who won IT services contracts in the last week.
{"noticeTypes": ["result"],"cpvCodes": ["72"],"lookbackDays": 7,"maxResults": 100}
Output
One dataset item per notice. Two real records from test runs on 2026-10-04. A call for tender:
{"publicationNumber": "678284-2026","title": "Germany – Software programming and consultancy services – Rahmenvertrag Personaldienstleistungen für Digital- und IT-Projekte","buyerName": "Bundesinstitut für Arzneimittel und Medizinprodukte","buyerCountry": "DEU","cpvCodes": ["72200000", "79417000", "72254000"],"mainCpvCode": "72200000","noticeType": "cn-standard","noticeTypeLabel": "Contract or concession notice - standard regime","formType": "competition","procedureType": "open","contractNature": "services","estimatedValue": 141848739,"estimatedValueCurrency": "EUR","estimatedValueBasis": "procedure","winnerNames": [],"winnerCountries": [],"awardedValue": null,"awardedValueCurrency": null,"deadline": "2026-11-02","deadlineType": "tenders","publicationDate": "2026-10-02","placeOfPerformance": ["DEA22", "DEU"],"noticeUrl": "https://ted.europa.eu/en/notice/-/detail/678284-2026","pdfUrl": "https://ted.europa.eu/en/notice/678284-2026/pdf","source": "TED - Tenders Electronic Daily (ted.europa.eu), Publications Office of the European Union","attribution": "Source: TED, (c) European Union, https://ted.europa.eu. Reused under the Commission's reuse policy (Decision 2011/833/EU). Selected fields, reformatted by this Actor; the notice on TED is the authoritative version."}
A contract award result (attribution fields shortened here; every record carries them in full):
{"publicationNumber": "680583-2026","title": "Portugal – Software programming and consultancy services – Aquisição de serviços para implementação do módulo «Caça» em plataforma Outsystems (RUBUS)","buyerName": "Instituto da Conservação da Natureza e das Florestas, IP","buyerCountry": "PRT","cpvCodes": ["72200000"],"mainCpvCode": "72200000","noticeType": "can-standard","noticeTypeLabel": "Contract or concession award notice - standard regime","formType": "result","procedureType": "open","contractNature": "services","estimatedValue": 385000,"estimatedValueCurrency": "EUR","estimatedValueBasis": "procedure","winnerNames": ["NTT DATA PORTUGAL, S.A."],"winnerCountries": ["PRT"],"awardedValue": 310000,"awardedValueCurrency": "EUR","deadline": null,"deadlineType": null,"publicationDate": "2026-10-02","placeOfPerformance": ["PTZZZ", "PRT"],"noticeUrl": "https://ted.europa.eu/en/notice/-/detail/680583-2026","pdfUrl": "https://ted.europa.eu/en/notice/680583-2026/pdf","source": "TED - Tenders Electronic Daily (ted.europa.eu), Publications Office of the European Union","attribution": "Source: TED, (c) European Union, https://ted.europa.eu. Reused under the Commission's reuse policy (Decision 2011/833/EU). […]"}
Field notes:
estimatedValueis the procedure's total when the buyer gave one (estimatedValueBasis: "procedure"). Otherwise it is the sum of the lots' values when they share a currency ("sum of lots"). It isnullwhen the notice has no estimate, which is common.deadlineis the earliest deadline across the lots.deadlineTypesays whether it is fortendersor forrequests to participate(restricted and negotiated procedures).winnerNameslists the winning organisations (eForms BT-500, "Organisation Name"), each once, exactly as TED publishes them, in the notice's language. It is[]when the notice names no winner, for example when no lot was awarded or the buyer withheld the name, and for calls for tender. The field is left out whenincludeWinnerNamesisfalse.winnerCountrieslists the winners' countries (ISO 3166 alpha-3, e.g.DEU), each once.- Names and countries are separate lists. TED's search API returns them that way, so when there are several winners the Actor doesn't guess which country, or which lot, belongs to which winner.
awardedValueis the notice's total, eForms BT-161 "Notice Value": "The value of all contracts awarded in this notice, including options and renewals." It is passed on as published, so a buyer's0stays0. It isnullwhen the notice gives no total. That happens often for framework agreements, which may publish only a maximum value, and when the buyer withholds the value. Of the 29,743 result notices published in September 2026, 72% had a total and 90% named a winner.- Values per lot are not output. TED's search API lists the values of losing tenders alongside the winning ones, and doesn't link values to winners or lots reliably. For the per-lot breakdown, open the notice.
placeOfPerformanceholds NUTS region codes and countries, as TED publishes them.- Titles are TED's own translations into the chosen language. Buyer names stay in the notice's language.
- Notices are listed newest first.
Expert query (advanced)
expertQuery takes a query in TED's own expert-search syntax. The Actor puts it in parentheses and combines it with
AND with the query it builds from the other inputs, so notice types (competition by default) and the date window
still apply. Set noticeTypes to [] to let your query choose the types. Line breaks and runs of spaces become
single spaces, and curly quotes become straight ones; otherwise the query goes to TED unchanged.
In TED's words, an expert query is made of "field expressions that can be combined with Boolean operators (OR, AND,
NOT) and parentheses", and a field expression is "a search field (e.g. publication-number)", "a term operator (e.g.
=)" and "search terms (e.g. 1234-2024)". The operators include =, ~ (stemmed on multilingual fields such as FT,
the full text), IN, NOT IN, and >, <, >=, <= for numbers and dates; * is a wildcard and "..." a
phrase. Field names are in TED's
list of search fields.
Two examples from TED's expert-search help (https://ted.europa.eu/en/help/search-browse#expert-search):
FT ~ Diesel AND notice-type = can-standard: "A full text / FT keyword in a specific type of notice (e.g. looking for “Diesel” in contract or concession award notice – standard regime)". Use it withnoticeTypes["result"]or[].total-value = (>=1000) AND total-value-cur = EUR AND classification-cpv IN (31642200 38000000 73410000): "Notices with a specified minimum tender value in a specified currency with one of several possible CPV".
Before sending, the Actor checks only the basics: at most 2,000 characters, balanced parentheses and double quotes, no
SORT BY (results are always newest first), no AND/OR at the start and no AND/OR/NOT at the end. TED checks the rest.
If TED rejects the query, the run stops with TED's own error message and saves nothing. With Only new notices, a
different expert query counts as a different search and gets its own memory.
Data source, terms and limits
- Source: TED's official search API (
POST https://api.ted.europa.eu/v3/notices/search), run by the Publications Office of the European Union. It is anonymous and needs no API key. - Reuse: TED's legal notice says the notices "can be freely reused, for commercial or non-commercial purposes" under the Commission's reuse policy (Decision 2011/833/EU). That policy asks reusers to acknowledge the source and not distort the notices' meaning. Every record carries the source and attribution above, and links to the official notice. If you republish this data, keep the credit "Source: TED, © European Union".
- Authoritative version: in TED's words, only the electronically signed notices published in the Supplement to the Official Journal of the EU are authentic, and the Publications Office accepts no liability for the information. Check the notice itself before you bid.
- Fair use: TED allows 700 requests a minute. This Actor makes at most 1 request a second, fetches up to 100 notices per request, and backs off if TED asks it to slow down.
- Personal data: notices can name contact persons. For buyers, this Actor outputs organisation names only, never contact names, e-mail addresses or phone numbers. Winners are output by name only, exactly as TED publishes them: no enrichment, no contact details, no addresses, even where the notice has them.
- Winner names can be people's names. A sole trader's business name can be a person's name. TED's privacy
statement lists "name of the tenderer or contractor (entity or physical person in specific cases)" among the
personal data in award notices. To leave all winner names out, set
includeWinnerNamestofalse; the names are then not even requested from TED. Removal requests are honoured by re-running without them: run the same search withincludeWinnerNames: falseand replace the earlier dataset. The only-new memory stores publication numbers, never names. If you keep or republish winner names, data-protection law such as the GDPR applies to you too. - Limits: at most 10,000 notices per run. Searches with no keyword, CPV or country filter can match tens of
thousands of notices a month, so narrow them or raise
maxResults. Values per lot, and which winner won which lot, aren't available reliably from TED's search API; open the notice link for them.
The full terms, quoted with links, are in SOURCE-TERMS.md.
Pricing (suggested pay-per-event)
| Event | Suggested price |
|---|---|
Actor start (apify-actor-start) | $0.005 |
Result: one notice saved to the dataset (apify-default-dataset-item) | $0.002 ($2 per 1,000 notices) |
Why these prices:
- They match the Store's common "1,000 results for $2", the same per-result price as Joi's SEC and research-papers Actors.
- A daily alert with no new notices costs only the $0.005 start fee, about $0.15 a month, so scheduled monitoring stays cheap.
- The cost to run is tiny. A run of 1,000 notices takes about 10 requests and a minute or less at 256 MB, a fraction of a cent in platform usage. That leaves a healthy margin after Apify's 20% share.
The run stops cleanly when it reaches the maximum cost you set for the run.
UK tenders: for UK public tenders and awards from Find a Tender and Contracts Finder, see Joi's UK Tenders Search: Find a Tender & Contracts Finder.
Local development
python -m unittest discover -s tests # offline unit tests with recorded TED responses, no networkapify run --input '{"keywords":["cloud"],"countries":["DE"],"maxResults":10}'
The logic in src/core.py uses only the Python standard library. src/main.py is a thin wrapper around the Apify
SDK (apify==4.0.2).
Support
Report problems in this Actor's Issues tab. This is a data tool, not legal or procurement advice. The notice on ted.europa.eu is the authoritative record.