TED Europa Tenders Scraper
Pricing
from $3.56 / 1,000 notices
TED Europa Tenders Scraper
Scrape TED Europa tender notices and contract award notices: title in English, buyer, country, CPV codes, deadline, value, winner and 245 eForms fields. Daily tender alerts by country, CPV, keyword or expert query.
Pricing
from $3.56 / 1,000 notices
Rating
0.0
(0)
Developer
ParseForge
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
TED Europa Tenders Scraper
Scrape EU tender notices and contract award notices from TED (Tenders Electronic Daily) — every notice with its title in English, the buyer, the country, the CPV codes, the submission deadline, the contract value and the winning supplier. No login, no API key, no browser. Built for daily tender alerts: point it at the last day and it returns only what was published since. Export to CSV, JSON, Excel, or XML.
TED is the EU's official journal supplement for public procurement: every contract above the EU threshold in 27 member states plus Norway, Switzerland, Iceland and the Western Balkans is published there. The website itself sits behind an AWS captcha, and its search API takes an expert query language, an explicit list of 1,830 field names and three different pagination rules. This Actor drives that API and returns one flat row per notice, with the fields you asked for and nothing you did not.
| Who uses it | What they scrape TED tender notices for |
|---|---|
| Bid and capture teams | Daily tender alerts for their CPV codes and countries, with the deadline and the submission portal link |
| Public-sector sales | Which authorities buy what they sell, who they bought it from last time and for how much |
| Competitive and supplier intelligence | Contract award notices naming a competitor, with the awarded value, the ranking and the number of bids received |
| Procurement analysts and researchers | Award rates, framework agreements, green and reserved procurement flags across a country or a whole sector |
| Tender-alert and government-tender platforms | A deduplicated daily feed keyed on TED's own publication number |
What it does
This Actor searches TED's official API — 7.0 million notices back to 26 August 2016, about 2,500 new ones every working day — and returns one row per notice:
- 📋 The notice (always): publication number, title in your language, publication and dispatch dates, OJS issue, notice type and stage, procedure type, contract type, CPV codes, buyer name, country, region and city, total value and currency, tender deadline, and links to TED's own HTML, PDF and XML.
- 🏛️ Buyer details (optional): full address, e-mail, phone, contact point, buyer profile URL, legal type and main activity.
- 📦 Lot details (optional): per-lot titles, descriptions, estimated values, durations, place of performance, and the award criteria with their weights.
- 🏆 Award and winner details (optional): winner name, VAT identifier, address and company size, the awarded value, contract number and date, tender ranks, and how many bids arrived — including how many came from SMEs and from outside the EEA.
- 📑 Participation conditions (optional): exclusion grounds, selection criteria, framework agreements, dynamic purchasing systems, e-submission and e-invoicing, guarantees, reserved and green procurement, EU funding.
- 📎 Tender documents (optional): links to the procurement documents and the submission portal, their languages and access restrictions.
- ⚖️ Review and appeal bodies (optional): the body that hears appeals, its address, and the deadline for lodging one.
- 🏢 Other organisations, corrections, legacy codes, full text and all 24 title translations (optional, one block each).
A row with everything switched on carries about 150 columns drawn from 245 TED fields.
Every filter runs inside TED's own index, so a search by country, CPV code or keyword costs a single request instead of a sweep.
Titles in English, whatever language the buyer filed in
TED machine-translates every notice title into all 24 official EU languages, and this Actor picks the one you asked for. A Czech hospital's notice comes back as "Czechia – Medical consumables – Dodávky jednorázových bipolárních elektrochirurgických nástrojů…": the English summary first, then the buyer's own wording.
Descriptions, lot texts and buyer names exist only in the language the buyer filed in — TED does not translate those. Those fields fall back to the original, and every row carries a textLanguages field naming the language buckets it actually used, so a run set to German never silently hands you Polish while claiming otherwise.
Filter by CPV code
CPV (Common Procurement Vocabulary) codes are how TED classifies what is being bought, and matching is hierarchical: asking for the division 72000000 also returns 72263000, 72210000 and every other code beneath it. Pick whole divisions from the list — IT services, construction work, medical equipment, transport and 41 more — or put exact eight-digit codes in the expert query.
What you can do with TED procurement data
Get a daily tender alert for your sector.
A construction firm schedules a run every morning with buyerCountries: ["DEU", "AUT"], cpvCodes: ["45000000"] and publishedLastDays: 1, and pushes the new rows straight into its CRM.
Only see tenders you can still bid on.
Switch on Only tenders still open and TED drops everything whose submission deadline has passed — 510,000 Spanish notices become the 26,000 that are actually live.
Watch a competitor.
Set winnerName to a company and switch on the award block to get every contract it has won: the buyer, the value, where it ranked and how many others bid.
Build a market-sizing dataset.
Pull every contract award notice in a CPV division for a year with the award and lot blocks on, and total the awarded values by buyer, country and supplier size.
Search the full text.
keywords: "artificial intelligence" searches the whole notice body, not just the title, across every language.
Why choose this scraper
| What you get | |
|---|---|
| The whole archive | 7.0M notices back to 26 August 2016, not just what is currently open |
| 245 TED fields | Eleven optional blocks, each charged only when you switch it on |
| English titles everywhere | TED's own translations, so one keyword search reaches all 24 languages |
| Deduplicated, in order | Sorted on a unique key, so parallel pages never repeat a row and a deep run never stops early |
| No 15,000-row ceiling | Past TED's page window the Actor switches to token iteration and keeps going |
| Expert query passthrough | Anything TED's own expert search accepts, including today(-7), IN (…) and NOT |
| No browser, no proxy, no key | The API is open; a run is HTTP requests and nothing else |
How it compares
| Feature | ParseForge | Other TED scrapers |
|---|---|---|
| Notice, buyer, CPV, deadline, value, winner | Yes | Yes |
| Per-lot descriptions, values and award criteria | Yes | Not listed |
| Participation conditions, e-submission, EU funding flags | Yes | Not listed |
| Review and appeal body with the appeal deadline | Yes | Not listed |
| Bids received, split by SME and non-EEA | Yes | Not listed |
| Title in all 24 EU languages | Yes | Not listed |
| Legacy TED codes for pre-2024 archive notices | Yes | Not listed |
| Only-still-open filter | Yes | Not listed |
| Runs past 15,000 rows | Yes | Not listed |
| Pay only for the blocks you enable | Yes | Single flat price |
Configure the run
Pick a window, add filters, set the maximum number of notices. Every extra block is off by default.
A first run with the defaults:
{"publishedLastDays": 3,"maxItems": 50}
Daily tender alerts for one sector:
{"publishedLastDays": 1,"buyerCountries": ["DEU", "AUT", "CHE"],"cpvCodes": ["45000000"],"formTypes": ["competition"],"maxItems": 500,"includeLotDetails": true,"includeDocuments": true}
Live tenders you can still bid on, closing next month:
{"onlyActive": true,"cpvCodes": ["72000000"],"deadlineBefore": "2026-10-31","maxItems": 1000,"includeLotDetails": true}
Every contract a competitor has won:
{"winnerName": "Siemens","formTypes": ["result"],"publishedAfter": "2024-01-01","maxItems": 2000,"includeAwardDetails": true}
An expert query, exactly as TED's own expert search takes it:
{"expertQuery": "buyer-country IN (FRA ESP) AND classification-cpv=33000000 AND total-value>=1000000 AND publication-date>=today(-30)","maxItems": 500,"includeAwardDetails": true}
Limits
- TED's API caps a page at 250 notices and at 10,000 field-values. The more blocks you switch on, the smaller the pages get: 250 notices per request with the base fields, 40 with all eleven blocks on. A 5,000-notice run takes 20 requests with the base row and 125 with everything.
- Page numbers stop working at 15,000 rows. Past that the Actor switches to TED's iteration token, which is sequential rather than three pages at a time, so very large runs are slower per row. A verified 16,000-notice run took 64 requests and returned no duplicates.
- Sorting is on the publication number, not the publication date. TED accepts
SORT BY publication-date DESC, but the key is not unique: a paged sweep of one month came back 14% duplicated, and a token iteration with that sort silently stopped yielding at 4,750 rows while still reporting 59,945 matches. The publication number is unique and TED orders it by year and sequence, so it is both stable and genuinely newest-first. - The archive starts on 26 August 2016. Earlier dates return nothing rather than an error.
- Notices before the 2024 eForms switchover carry the legacy two-letter codes, not the modern field names. Switch on Legacy TED codes when scraping the older archive, or those rows will look sparse.
- Only titles are translated. Descriptions, lot texts and buyer names come in the buyer's own language;
textLanguagesrecords which. - A handful of fields repeat per lot. A three-lot notice lists its contract type three times; the Actor deduplicates every field before writing it, and keeps a real array only where the values genuinely differ.
- A run stops when it reaches its cost ceiling. Apify caps what a single run may charge, and with every block enabled a notice costs about $0.016, so the default ceiling is reached after roughly a thousand of them. The Actor stops there and says so in the log rather than collecting a result set it cannot bill for; raise Max cost per run in the run options to go further.
- The run needs 256 MB. The heaviest configuration measured — 5,000 notices with all eleven blocks — peaked at 129 MB, so there is no reason to pay for more.
Pricing
Pay-per-event. $4 per 1,000 notices (notice) plus $0.02 per run start. Extras are charged only when enabled, and only on the notices that carry them:
| Event | Price | When |
|---|---|---|
notice | $0.004 | Every row |
lot-details | $0.0015 | Lot details on |
award-details | $0.0015 | Award and winner details on |
full-text | $0.002 | Full notice text on |
buyer-details | $0.001 | Buyer details on |
procurement-conditions | $0.001 | Participation conditions on |
tender-documents | $0.001 | Tender documents on |
title-translations | $0.001 | All 24 title translations on |
review-bodies | $0.0008 | Review and appeal bodies on |
related-organisations | $0.0008 | Other organisations on |
notice-history | $0.0008 | Corrections and previous notices on |
legacy-fields | $0.0008 | Legacy TED codes on |
| Run | Approximate cost |
|---|---|
| 50 notices, base row | $0.22 |
| 500 daily alerts with lots and documents | $3.27 |
| 1,000 notices with lots and awards | $7.02 |
| 5,000 award notices with the award block | $27.52 |
New Apify accounts start with $5 in free credit.
Free users
Free-plan runs return up to 10 notices as a preview. Upgrade your Apify plan to pull the whole archive.
Run it
- Create a free Apify account with $5 in credit.
- Open the TED Europa Tenders Scraper.
- Pick a window and your filters, then click Start.
- Export the results as CSV, Excel, JSON, or XML from the Dataset tab, or schedule the run daily.
Run it programmatically through the Apify API (run-sync-get-dataset-items) or the ApifyClient for JavaScript and Python.
Use with AI agents (MCP)
Give an AI agent live access to EU procurement through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:
$claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/ted-europa-tenders-scraper"
Then ask: "Which German IT tenders published this week are still open, and when is each deadline?"
FAQ
Is the data public? Yes. TED is the EU's official publication channel for public procurement; every notice is published for anyone to read. The Actor reads TED's own public search API.
How current is it? TED publishes on every working day, and notices appear in the API the same morning they hit the Official Journal. A run with publishedLastDays: 1 catches them.
Do I need an API key for TED? No. TED's search API is open and unauthenticated. The single-notice endpoints do need a key, which is why this Actor reads everything through the search API instead.
Why is winnerName empty on most rows? Only contract award notices name a winner. Filter with formTypes: ["result"] to get only those.
Why does a notice appear twice with different publication numbers? TED republishes a corrected notice under a new number. Switch on Latest version only to keep one row per notice.
Can I get more than 15,000 notices in one run? Yes. Set maxItems higher and the Actor switches to TED's iteration token automatically; it is slower per row but has no ceiling.
