TED Tenders Scraper - EU Public Procurement & Contract Awards avatar

TED Tenders Scraper - EU Public Procurement & Contract Awards

Pricing

from $1.50 / 1,000 notices

Go to Apify Store
TED Tenders Scraper - EU Public Procurement & Contract Awards

TED Tenders Scraper - EU Public Procurement & Contract Awards

Find open EU public tenders and contract award winners on TED (Tenders Electronic Daily), all EU/EEA countries. Input: keywords, countries, CPV, NUTS, deadline, value, notice type (tenders or awards). Returns per notice: title, buyer, value, winners, deadline, URL. Default: 20. $1.50/1K.

Pricing

from $1.50 / 1,000 notices

Rating

0.0

(0)

Developer

Bence Kadi

Bence Kadi

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

6 hours ago

Last modified

Share

EU Public Tenders Scraper (TED): public procurement data API

Export EU public tenders and contract awards from TED (Tenders Electronic Daily) to JSON, CSV or Excel. One clean row per notice: title, buyer, CPV category, estimated value, deadline, award winners and awarded values, NUTS region and links. No API key, no browser, no 15,000-result cap.

What is the EU Public Tenders Scraper (TED)?

TED is the official journal for public procurement in the European Union. Every working day it publishes about 1,000 new notices from 30+ European countries: calls for tenders, contract awards, planned purchases and more. This Actor reads the official TED API v3 for you, translates simple filters (countries, CPV codes, dates, values) into TED's query language and returns a flat, ready-to-use table.

Who uses it and why:

  • Bid and tender managers get a daily list of new calls for tenders in their CPV codes and countries, with deadlines, in Google Sheets, Slack or their CRM.
  • B2G sales teams find public buyers that purchase what they sell, and see what those buyers paid in earlier contracts.
  • Competitive intelligence analysts track which companies win contracts in their market, and for how much (winners, awardedValue).
  • Market researchers and consultants size public-sector demand by category, region and value.
  • Tender portals, SaaS products and AI agents feed fresh EU procurement data into their own search, alerts or matching features.
  • Journalists and NGOs follow public spending by a specific buyer, such as a city or a hospital.

Data fields

Every notice is one dataset item with these fields. Examples are from real runs.

FieldDescriptionExample
publicationNumberTED notice ID (unique)685614-2026
titleNotice title, in English when the buyer published oneSoftware for Manager Skill and Portfolio Analysis
titleLanguageLanguage of titleen
descriptionShort description of what is being bought (contact data removed)The subject of this Procurement is a Platform for portfolio manager analysis.
noticeTypeNotice type in plain EnglishContract award notice
noticeTypeCodeTED eForms notice subtypecan-standard
contractNatureWorks, supplies or servicesservices
buyerNameContracting authorityFjärde AP-fonden
buyerCountryBuyer country (2-letter code)SE
buyerCityBuyer cityStockholm
mainCpvMain CPV code72000000
mainCpvLabelEnglish label of the main CPV codeIT services: consulting, software development, Internet and support
cpvCodesAll CPV codes in the notice["72000000", "48000000"]
estimatedValueEstimated value of the whole procedure (empty if not published)7500000
currencyCurrency of estimatedValueSEK
awardedValueTotal value awarded (award notices)6030000
awardedCurrencyCurrency of awardedValueSEK
winnersNames of the winning companies["SEI Global Services INC"]
winnerCountriesCountries of the winners["SE"]
winnersOmittedHow many winners were left out because they are natural persons0
publicationDateDate TED published the notice2026-10-05
deadlineDeadline for tenders or requests to participate2026-11-04T09:59:00+01:00
procedureTypeProcedure (open, restricted, negotiated...)Open
placeOfPerformanceNutsNUTS regions where the contract is performed["DEA2C", "DEA22"]
placeOfPerformanceCountriesCountries where the contract is performed["DE"]
lotsCountNumber of lots1
urlNotice page on ted.europa.euhttps://ted.europa.eu/en/notice/-/detail/685607-2026
pdfUrlOfficial PDF of the noticehttps://ted.europa.eu/en/notice/685607-2026/pdf
xmlUrlOfficial eForms XMLhttps://ted.europa.eu/en/notice/685607-2026/xml
languageOriginal language of the noticede
isNewOnly in monitoring mode: true for notices not seen beforetrue
scrapedAtWhen the Actor saved the item (UTC)2026-10-05T00:05:59Z

How to use the TED tenders scraper

  1. Open the Actor and click Try for free (you need a free Apify account).
  2. Pick Buyer countries and Notice types. "Contract notice" = open calls you can still bid on; "Contract award" = who won and for how much.
  3. Set a date window, for example Published within the last N days = 7.
  4. Optionally add Keywords, CPV codes, a minimum value or NUTS regions.
  5. Set Max results (the prefill is 20 so the first run takes a few seconds) and click Start.
  6. Open the Output tab and download the data as CSV, Excel or JSON, or send it to Google Sheets.
  7. For alerts, turn on Only new notices, then create a daily Schedule (see below).

Input guide

Keywords. Full-text search over the whole notice, in any EU language. Each line is one search term; several lines are combined with OR.

  • Good: cloud computing, Reinigung, nettoyage (TED notices are mostly in the buyer's own language, so add local words).
  • Bad: one long sentence like we sell cloud software to hospitals. That rarely matches anything. Use short terms and CPV codes instead.

Buyer countries. The country of the contracting authority, picked from a list. Leave it empty for all of Europe.

CPV codes. The Common Procurement Vocabulary is the EU's product and service catalogue. Every notice has a main CPV code. Sub-categories are included automatically.

  • Good: 72000000 (all IT services, including 72100000, 72260000 ...), 45000000 (construction work), or a short prefix such as 72.
  • Bad: 72000000-5. The digit after the dash is a check digit. The Actor handles it, but the 8 digits alone are enough.
  • Tip: to find your codes, run a keyword search first and look at mainCpv and cpvCodes in the results. Then switch to CPV codes, which are language-independent.

Notice types. contract_notice, contract_award, prior_information, voluntary_ex_ante, contract_modification, market_consultation. Leave empty for all.

Date window. Use Published within the last N days for rolling searches (7 = the last week, 1 = yesterday and today). Use Published from / to (YYYY-MM-DD) for a fixed period, for example a full year of award notices for research. If you set both, both conditions apply, so clear the prefilled 7 when you want a fixed period further back.

  • Warning: with no date window, no filters and Max results = 0, the Actor would export millions of notices. It logs a warning first.

Submission deadline on or after. Only tenders you can still bid on. Accepts a date (2026-11-01), today or +14 days (at least two weeks left to prepare).

Min / max estimated value. The estimated value of the whole procedure, in the notice's own currency (most notices use EUR). About half of buyers do not publish a value, and those notices are excluded when you set a minimum or maximum.

Buyer name contains. Words in the buyer's name, for example Charité or Stadt München. Accents do not matter.

NUTS codes. The EU's region codes for where the work is done. Sub-regions are included: DE2 returns every Bavarian region, FR10 is Île-de-France, ITC4 is Lombardy.

Max results. Stop after N notices. 0 = no limit. This is also your cost cap: 1,000 notices cost $1.50.

Only new notices (monitoring mode). The Actor remembers which notices it returned and outputs only new ones on the next run with the same filters. You pay only for new notices. Use a different Monitor name for each saved search that should keep its own "already seen" list. Changing any filter also starts a new list.

Expert query. A raw TED expert-search query, for example buyer-country=DEU AND classification-cpv=72000000 AND publication-date>=today(-7). It replaces all the filters above. Test it first at ted.europa.eu (Search > Expert search).

Proxy. Not needed. TED is an open-data API, so the proxy is off by default.

Input example: open IT tenders in Germany and Austria

{
"countries": ["DE", "AT"],
"cpvCodes": ["72000000", "48000000"],
"noticeTypes": ["contract_notice"],
"publishedWithinDays": 7,
"deadlineAfter": "today",
"minEstimatedValue": 100000,
"maxResults": 500,
"onlyNewNotices": true
}

Output

Each notice is one item in the run's dataset. This is a real award notice from a run on 2026-10-05:

{
"publicationNumber": "685614-2026",
"title": "Software for Manager Skill and Portfolio Analysis",
"titleLanguage": "en",
"description": "The subject of this Procurement is a Platform for portfolio manager analysis.",
"noticeType": "Contract award notice",
"noticeTypeCode": "can-standard",
"contractNature": "services",
"buyerName": "Fjärde AP-fonden",
"buyerCountry": "SE",
"buyerCity": "Stockholm",
"mainCpv": "72000000",
"mainCpvLabel": "IT services: consulting, software development, Internet and support",
"cpvCodes": ["72000000", "48000000", "48700000", "72220000", "72250000"],
"estimatedValue": 7500000,
"currency": "SEK",
"awardedValue": 6030000,
"awardedCurrency": "SEK",
"winners": ["SEI Global Services INC"],
"winnerCountries": ["SE"],
"winnersOmitted": 0,
"publicationDate": "2026-10-05",
"deadline": null,
"procedureType": "Open",
"placeOfPerformanceNuts": ["SE110"],
"placeOfPerformanceCountries": ["SE"],
"lotsCount": 1,
"url": "https://ted.europa.eu/en/notice/-/detail/685614-2026",
"pdfUrl": "https://ted.europa.eu/en/notice/685614-2026/pdf",
"xmlUrl": "https://ted.europa.eu/en/notice/685614-2026/xml",
"language": "en",
"scrapedAt": "2026-10-05T00:00:00Z"
}

On contract notices, deadline holds the tender deadline, for example "2026-11-04T09:59:00+01:00", and the winner fields are empty. mainCpvLabel is always in English.

In a live sample of 1,500 recent notices, title, description, buyer, country, city, CPV and links were filled for 100% of notices. For contract notices the deadline was filled for 97%. For award notices the awarded value was filled for 91% and the winners for 90%. The estimated value was filled for about 50%, because many buyers keep it confidential.

Dataset views. The Output tab shows three tables:

  • Notices: date, title, type, buyer, country, CPV label, estimated value, deadline, link. Best for daily review.
  • Awards and winners: buyer, winners, awarded value, CPV, link. Best for competitor analysis.
  • Full details: description, procedure, all CPV codes, NUTS regions, lots, language, PDF link.

Every run also saves a Run summary (RUN_SUMMARY in the key-value store) with the TED query used, the number of matching notices, notices saved, notices skipped in monitoring mode and any API problems.

Export. Download any view as JSON, CSV, Excel, XML, HTML or RSS from the Output tab or the API. You can also send results straight to Google Sheets with the Google Sheets integration.

Pricing

This Actor uses pay per event: $1.50 per 1,000 notices saved ($0.0015 per notice). Apify also charges a start fee of $0.00005 per run. Platform compute is included in the price.

Typical runNoticesCost
First test with the prefilled input20about $0.03
Weekly export for one country and one CPV area1,000about $1.50
Daily alert, about 50 new notices a day, for 30 days1,500about $2.25 per month
Bulk research export, one year of award notices20,000about $30

What is free:

  • In monitoring mode, notices that were already returned in earlier runs are skipped and not charged.
  • A search with no matches costs only the $0.00005 start fee.
  • Apify's free plan gives you monthly platform credit (see apify.com/pricing), enough for a few thousand notices each month.

You can cap spending with Max results or with Max charge per run in the run options. When the cap is reached, the Actor stops cleanly and keeps what it already saved.

Use it via API

Replace MY_APIFY_TOKEN with your token from Apify Console > Settings > API & Integrations.

JavaScript / Node.js (npm install apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });
const run = await client.actor('kadi_bence/ted-tenders-scraper').call({
countries: ['DE', 'AT'],
cpvCodes: ['72000000'],
noticeTypes: ['contract_notice'],
publishedWithinDays: 7,
deadlineAfter: 'today',
maxResults: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]?.title);

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("MY_APIFY_TOKEN")
run = client.actor("kadi_bence/ted-tenders-scraper").call(run_input={
"countries": ["FR"],
"noticeTypes": ["contract_award"],
"publishedWithinDays": 30,
"maxResults": 1000,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["buyerName"], item["winners"], item["awardedValue"], item["awardedCurrency"])

cURL (runs the Actor and returns the items in one call):

curl -X POST "https://api.apify.com/v2/acts/kadi_bence~ted-tenders-scraper/run-sync-get-dataset-items?token=MY_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"countries": ["IT"], "cpvCodes": ["45000000"], "noticeTypes": ["contract_notice"], "publishedWithinDays": 1, "maxResults": 100}'

Apify CLI:

$apify call kadi_bence/ted-tenders-scraper --input '{"countries": ["ES"], "publishedWithinDays": 3, "maxResults": 50}' --output-dataset

MCP (AI agents such as Claude, Cursor or VS Code). Add this to your MCP client config. The client will ask you to sign in to Apify (or send your token as an Authorization: Bearer header):

{"mcpServers":{"apify":{"url":"https://mcp.apify.com/?actors=kadi_bence/ted-tenders-scraper"}}}

Then ask your agent things like "Find open IT tenders in Austria with a deadline after next week".

Integrations and scheduling

  • Schedules. In Apify Console go to Schedules > Create new, pick this Actor (or a saved task) and set a cron time, for example every weekday at 07:00.
  • Webhooks. Call your own URL when a run succeeds or fails, and fetch the new items from the dataset.
  • Zapier, Make and n8n. Use the Apify app or node: "Run Actor" as an action, or "Actor run finished" as a trigger, then send rows to your CRM, Slack, Teams or e-mail.
  • Google Sheets. Use the Google Sheets integration on the Actor's Integrations tab to append each run's results to a sheet.

Recipe: new tenders in my CPV codes every morning

  1. Set your filters: countries, CPV codes, Notice types = Contract notice, Published within the last N days = 2, Submission deadline on or after = +7 days.
  2. Turn on Only new notices and give the monitor a name, such as it-dach.
  3. Click Save as a new task, then add a schedule: every day at 07:00.
  4. Connect the task to Google Sheets or to Slack through Make, Zapier or n8n. Each morning you get only the notices you have not seen yet.

Recipe: weekly competitor wins. Notice types = Contract award, your CPV codes and countries, Published within the last N days = 7, weekly schedule, export the Awards and winners view to a sheet.

FAQ

How does it work, and where does the data come from? The Actor sends your filters as one query to the official TED Search API v3, run by the Publications Office of the European Union, and pages through all results. No browser and no API key are used. TED notices are open data that you may re-use, also commercially, under the EU's re-use policy (Commission Decision 2011/833/EU, CC BY 4.0). Please keep this attribution when you publish the data: "Source: TED – Tenders Electronic Daily, © European Union, https://ted.europa.eu".

Are there limits? There is no 15,000 cap. TED's normal page-based search stops at 15,000 notices, but this Actor uses TED's scroll (iteration) mode, so it can export any number. TED's fair-usage limit (700 requests per minute) is never reached, because each request returns 250 notices. If TED answers "429 Too Many Requests", the Actor waits and retries.

How fast is it? Usually 3,000 to 6,000 notices per minute. In our tests 1,500 notices took 16 seconds and 17,500 notices took about 5 minutes.

How fresh is the data? As fresh as TED. TED publishes new notices every working day, and the Actor reads them live at run time, so a notice is in your results as soon as it is on ted.europa.eu.

Why are my results different from the TED website? Common reasons: CPV and NUTS sub-codes are always included here; the date filters use the TED publication date; keywords search the full notice text; winners that are natural persons are left out; and new notices appear during the day, so two searches minutes apart can differ. Check RUN_SUMMARY to see the exact query the Actor used, and paste it into TED's expert search to compare.

Why is the estimated value or the deadline sometimes empty? Buyers do not always publish them. Award notices have no deadline, and many contract notices keep the value confidential. The Actor never invents values: a TED value of 0 is returned as empty.

Is it legal? What about personal data? Yes. The data is official open data published for re-use. The Actor does not collect contact names, e-mails or phone numbers: e-mails and phone numbers are removed from descriptions, and winners that are natural persons (as flagged by the buyer, or sole traders such as "PFA" or "ditta individuale") are omitted. winnersOmitted shows how many were left out. Descriptions written by buyers can still mention people, so handle the data in line with GDPR.

Are old notices supported? Yes. Notices from before eForms (before about 2024) have fewer fields: descriptions and deadlines are often missing, and the title is TED's English headline.

Can I use it from Python or another program? Yes. See Use it via API above for JavaScript, Python, cURL, the Apify CLI and MCP for AI agents.

Can I connect it to Google Sheets, Slack or my CRM? Yes, through the Google Sheets integration, webhooks, or the Apify apps for Zapier, Make and n8n. See Integrations and scheduling.

How does "Only new notices" work? The Actor stores the IDs of returned notices in a named key-value store in your account. The next run with the same filters and monitor name outputs only notices that are not in that list, marked isNew: true. You pay only for those. Change the monitor name to start a fresh list.

What if a run fails or something looks wrong? If TED rejects the query, the run fails with a clear message (for example an invalid expert query) and RUN_SUMMARY holds the details. If TED is down, the Actor retries several times before stopping and keeps what it already saved. Please open an issue on the Issues tab with the run link. Fixes usually land within 24 to 48 hours.

What changed recently? See the changelog below.

More low-cost Actors by the same developer, built on official APIs and public data:

All my Actors: apify.com/kadi_bence

Changelog

  • 1.0 (2026-10-05): First release. TED API v3 with iteration mode, award winners and values, monitoring mode, CPV/NUTS hierarchy, GDPR filtering.