TED EU Tenders API: Notices, CPV, Buyers, Deadlines
Pricing
from $0.85 / 1,000 ted notices
TED EU Tenders API: Notices, CPV, Buyers, Deadlines
EU public tenders from TED (official API): title in your language, buyer, country, CPV, deadline, estimated and awarded value in EUR, winners, PDF link. Filter by country, CPV, keyword, notice type, dates, value. onlyNew alerts. No API key, no login. MCP-ready. Pay per result. $1 per 1,000 notices
Pricing
from $0.85 / 1,000 ted notices
Rating
0.0
(0)
Developer
ABM
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
10 days ago
Last modified
Categories
Features
Share
TED EU Tenders API: European Public Procurement Notices
$1 per 1,000 notices. You pay only for notices delivered. Errors and empty searches cost nothing.
This actor searches TED (Tenders Electronic Daily), the official EU database of public procurement notices (the "S" series of the Official Journal of the EU). It returns each notice as clean JSON: title in the language you choose, buyer, country, CPV codes, tender deadline, estimated and awarded value (also converted to EUR), lots, winners and direct links (HTML, PDF, XML).
It reads the official TED Search API v3 (api.ted.europa.eu). It does not scrape HTML, so it keeps working when the website changes. No API key, no login, no proxy.
- Filter by country (buyer or place of performance), CPV codes (hierarchical), keywords (full text), notice type (calls for tenders, awards, prior information, corrigenda…), publication dates, tender deadline, value in EUR
- Choose the language of the titles: all 24 EU languages
- onlyNew mode for daily or hourly alerts: each run returns only the notices you have not received yet
- LLM-ready: every notice includes a
markdownfield you can drop into a prompt or a RAG index - MCP-ready for Claude, Cursor, ChatGPT and other AI agents
How much does it cost?
You pay one notice event per notice written to the dataset: $0.001 per notice.
| Run | Notices | Price |
|---|---|---|
| Daily alert, one country + one CPV | ~20 | $0.02 |
| Weekly market watch, 5 countries | 500 | $0.50 |
| Bulk export for analysis | 1,000 | $1.00 |
| Annual dataset of one sector | 50,000 | $50 |
There is no monthly rental. Nothing is charged for errors, duplicates, notices dropped by the value filter, or searches with no result. If you set a maximum charge for a run, the actor stops cleanly when the budget is reached.
Input example
{"countries": ["FR"],"cpvCodes": ["72000000"],"noticeTypes": ["competition"],"language": "fr","publishedWithinDays": 7,"onlyOpen": true,"maxResults": 50}
| Field | Description |
|---|---|
countries | ISO codes (FR, DEU) or English names. OR between countries |
countryField | buyer (default) or placeOfPerformance |
cpvCodes | 8-digit CPV codes. A parent code (72000000) includes all its sub-codes |
keywords, keywordsMatch, excludeKeywords | Full-text search, any/all |
noticeTypes | competition (calls for tenders), result (awards), planning (prior information), change (corrigenda), dir-awa-pre, cont-modif, or exact eForms subtypes (cn-standard, can-standard, pin-only…) |
language | en, fr, de, es, it, pl… or original |
publishedWithinDays, publishedFrom, publishedTo | Publication date (YYYY-MM-DD or 7 days) |
deadlineFrom, deadlineTo, onlyOpen | Tender submission deadline |
minValueEur, maxValueEur, includeNoValue | Value range in EUR (estimated value, or awarded value for awards) |
maxResults | Maximum notices, newest first (default 100) |
onlyNew | Return only notices not delivered by a previous run with the same filters |
scope | ALL, ACTIVE or LATEST (latest OJ S issue) |
expertQuery | Optional raw TED expert-search clause, added with AND |
Output example
{"publicationNumber": "612345-2026","url": "https://ted.europa.eu/fr/notice/-/detail/612345-2026","pdfUrl": "https://ted.europa.eu/fr/notice/612345-2026/pdf","xmlUrl": "https://ted.europa.eu/en/notice/612345-2026/xml","title": "France – Services de programmation de logiciels – Maintenance et évolution du système d'information RH","originalTitle": "Maintenance et évolution du système d'information RH","description": "Le présent accord-cadre a pour objet la tierce maintenance applicative…","language": "fra","officialLanguages": ["fra"],"noticeType": "cn-standard","formType": "competition","procedureType": "open","contractNature": "services","publicationDate": "2026-10-16","deadline": "2026-11-20","deadlineTime": "12:00:00+01:00","deadlineType": "tender","isOpen": true,"buyerName": "Région Occitanie","buyerCountry": "FRA","buyerCity": "Toulouse","buyerEmail": "marches@example.fr","mainCpvCode": "72262000","cpvCodes": ["72262000", "72267000"],"placeOfPerformance": ["FRJ23"],"estimatedValue": 1800000,"estimatedValueCurrency": "EUR","estimatedValueEur": 1800000,"awardedValue": null,"lotsCount": 2,"lotTitles": ["Lot 1 – TMA", "Lot 2 – Évolutions"],"winners": [],"documentsUrl": "https://marches.example.fr/dce/12345","submissionUrl": "https://marches.example.fr/depot/12345","procedureId": "3f1c…","markdown": "## TED 612345-2026: France – Services de programmation…\n- **Buyer:** Région Occitanie, Toulouse, FRA\n…","scrapedAt": "2026-10-18T07:00:04+00:00"}
Fields that a notice does not publish are null or an empty list. The Overview tab of the dataset shows a table: notice, title, buyer, country, type, dates, CPV, values, winners, link.
Use cases
1. Daily IT tender alert for a bid manager (France)
A bid manager at an IT services firm wants every new French call for tenders in IT services, in French, in Google Sheets each morning.
Input (scheduled every day at 7:00):
{"countries": ["FR"], "cpvCodes": ["72000000", "48000000"], "noticeTypes": ["competition"], "language": "fr", "onlyOpen": true, "onlyNew": true, "maxResults": 200}
Output extract:
[{"publicationNumber": "612345-2026", "title": "France – Services de programmation de logiciels – …", "buyerName": "Région Occitanie", "deadline": "2026-11-20", "estimatedValueEur": 1800000, "url": "https://ted.europa.eu/fr/notice/-/detail/612345-2026"}]
Next: about 15 to 40 new notices a day (≈ $0.03/day, under $1/month) go into a Google Sheet through the Apify integration. The team marks go / no-go, and the deadline column feeds the bid calendar.
2. Competitive intelligence on contract awards (DACH region)
A market analyst follows who wins medical equipment contracts above €1M in Germany, Austria and Switzerland.
Input (weekly):
{"countries": ["DE", "AT", "CH"], "cpvCodes": ["33100000"], "noticeTypes": ["result"], "minValueEur": 1000000, "publishedWithinDays": 7, "language": "en", "maxResults": 500}
Output extract:
[{"title": "Germany – Medical equipments – CT scanner for University Hospital", "buyerName": "Universitätsklinikum …", "awardedValue": 2350000, "awardedValueCurrency": "EUR", "winners": ["Siemens Healthcare GmbH"], "publicationDate": "2026-10-14"}]
Next: the weekly dataset (≈ 60 awards, $0.06) is loaded into a BI tool to compute market share per supplier and average contract value per buyer.
3. AI agent that answers "which tenders fit my company?"
A consulting firm's AI assistant (Claude via MCP) receives a client profile and searches open EU tenders in several languages.
Input sent by the agent:
{"keywords": ["cybersecurity", "cybersécurité", "Cybersicherheit"], "countries": ["FR", "BE", "LU", "DE"], "onlyOpen": true, "language": "en", "maxResults": 30}
Output used by the agent: the markdown field of each notice (title, buyer, deadline, CPV, value, link). The model ranks the 30 notices against the profile and writes a shortlist with deadlines, for $0.03 per question.
4. Lead generation for subcontractors (Poland, construction)
A construction subcontractor wants the winners of large Polish works contracts, to offer them its services.
{"countries": ["PL"], "noticeTypes": ["result"], "expertQuery": "contract-nature IN (works)", "minValueEur": 5000000, "publishedWithinDays": 30, "maxResults": 300}
Values in PLN are converted with an approximate rate in awardedValueEur, and the original amount stays in awardedValue. The winners list becomes the call list for the month.
Call it from the API
Python
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("<username>/ted-eu-tenders").call(run_input={"countries": ["FR"], "cpvCodes": ["72000000"], "noticeTypes": ["competition"],"language": "fr", "publishedWithinDays": 7, "maxResults": 100,})for notice in client.dataset(run["defaultDatasetId"]).iterate_items():print(notice["publicationNumber"], notice["deadline"], notice["title"])
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<APIFY_TOKEN>' });const run = await client.actor('<username>/ted-eu-tenders').call({countries: ['DE'], cpvCodes: ['45000000'], noticeTypes: ['competition'], onlyOpen: true, maxResults: 100,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map((n) => `${n.publicationNumber} ${n.deadline} ${n.title}`));
HTTP (one call, returns the items)
POST https://api.apify.com/v2/acts/<username>~ted-eu-tenders/run-sync-get-dataset-items?token=<APIFY_TOKEN>{"countries": ["ES"], "cpvCodes": ["72000000"], "maxResults": 20}
Automation (Make, n8n, Zapier, Google Sheets)
- Make / Zapier: use the Apify app, action "Run an Actor" with the input JSON above, then "Get dataset items". Map
title,buyerName,deadline,estimatedValueEurandurlto a Google Sheets row, a Slack message or a CRM deal. - n8n: a Schedule Trigger (every morning) → Apify node "Run actor and get dataset" with
"onlyNew": true→ IFestimatedValueEur > 100000→ Gmail or Microsoft Teams message. Because ofonlyNew, each notice is sent only once. - Google Sheets: Apify's Google Sheets integration appends each run's dataset to a sheet. Schedule the actor in Apify Console (Schedules → daily).
- Webhooks: trigger your own endpoint when a run succeeds and fetch
.../datasets/<id>/items?format=csv.
Use with AI agents (MCP)
The actor works with the Apify MCP server (https://mcp.apify.com), so Claude, Cursor, ChatGPT and other agents can call it as a tool. Typical prompts:
- "Find open IT tenders in France and Belgium published this week, in French."
- "Who won hospital equipment contracts above €1M in Germany last month?"
Each notice comes with a compact markdown summary, which keeps the agent's context small.
FAQ
Is this the official data? Yes. It reads the public TED Search API of the Publications Office of the EU, the same data as ted.europa.eu. TED data is free to reuse with attribution.
Which notices are on TED? Procurement above the EU thresholds in the 27 EU member states, plus EEA countries, Switzerland and EU institutions, and some below-threshold notices that buyers publish voluntarily. Purely national, small tenders (for example French MAPA notices that appear only on BOAMP) are not on TED. Use a national source for those.
Which language do I get? Notice titles exist in all 24 EU languages. Descriptions, buyer names and lot titles are published only in the notice's own language(s): when your language is missing, the actor returns the original text and shows its language in descriptionLanguage.
How does onlyNew work? The actor remembers the notices it delivered, per set of filters, in a named key-value store (ted-eu-tenders-state). The next run returns only notices it has not delivered yet, and looks back 7 days to catch notices that were indexed late. When there is nothing new, nothing is charged.
Does the CPV filter include sub-codes? Yes. TED's CPV search is hierarchical: 72000000 also returns 72262000, and so on. You can also type a shorter prefix like 72.
Why is the value often empty? Many notices do not publish an estimated value. With a value filter, those notices are skipped unless you turn on includeNoValue.
How fast is it? About 250 notices per request: 1,000 notices take under a minute.
Limits
- The data is exactly what TED publishes. Missing fields stay
null, and the actor does not guess them. - EUR conversion uses fixed approximate rates. It is good for filtering and ranking, not for accounting. The original amount and currency are always included.
- Lot-level fields (lot titles, lot deadlines, document URLs) come as lists. When a notice has several lots,
deadlineis the earliest deadline still in the future, anddeadlinesholds all of them. - Full-text keywords follow TED's own search engine (word stems, all languages of the notice).
- Notices published before eForms (2023 and earlier) have fewer structured fields.
- Fair use: the actor spaces its requests and retries on rate limits. If TED ever refuses the server IP, it switches automatically to a proxy (still at no extra cost for you). Very large exports (100,000+ notices) take longer.