ParseForge Scrapers

TED Europa Tenders Scraper

parseforge/ted-europa-tenders-scraper

Lead generationDeveloper tools

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.

Run this scraper See the API call
Total runs
20
Bookmarked
0
Last modified
8 days ago

This scraper was last updated on .

What does the TED Europa Tenders Scraper return?

ParseForge

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; textLanguages records 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.

Free users

Free-plan runs return up to 10 notices as a preview. Upgrade your Apify plan to pull the whole archive.

Run it

  1. Create a free Apify account with $5 in credit.
  2. Open the TED Europa Tenders Scraper.
  3. Pick a window and your filters, then click Start.
  4. 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.

What input does the TED Europa Tenders Scraper accept?

FieldTypeWhat it doesDefault
publishedLastDays integer Rolling window for daily monitoring: 1 returns yesterday and today. Overrides the published-from and published-to dates below. Leave empty to use exact dates instead. 3
maxItems integer Stop after this many notices. TED publishes roughly 3,000 a day and about 600,000 a year, so always pair a large number with filters. Free-plan runs return up to 10 as a preview. 50
sortOrder string (2 options) Newest first is the publication number descending, which is stable across pages. Sorting by publication date instead looks the same but reshuffles ties between requests and silently truncates deep runs, so it is not offered. newest
onlyActive boolean Keep only notices whose submission deadline has not passed, the ones you can still bid on. Turns roughly 510,000 Spanish notices into 26,000. false
buyerCountries array Country of the contracting authority, ISO 3166 alpha-3. Multiple values are ORed. Leave empty for all of Europe. not set
cpvCodes array Common Procurement Vocabulary codes. Matching is hierarchical, so the division 72000000 also returns 72263000 and 72210000. Pick divisions here or type exact 8-digit codes in the expert query. not set
keywords string Searches the whole notice body, not just the title. Quoted as a phrase, e.g. artificial intelligence. not set
titleKeywords string Searches the notice title, including its machine translations, so an English word finds Polish and Greek notices too. not set
formTypes array The stage of the procurement. Competition is the live call for tenders, result is the award, planning is the prior information notice. not set
noticeTypes array The exact eForms notice subtype. Narrower than the stage above; leave empty unless you need one form. not set
contractNature array Works, supplies or services. not set
procedureTypes array The award procedure the buyer is running. not set
publishedAfter string YYYY-MM-DD. TED's archive starts on 2016-08-26. Ignored when Published in the last N days is set. not set
publishedBefore string YYYY-MM-DD, inclusive. not set
deadlineAfter string YYYY-MM-DD. Keeps notices whose deadline for receipt of tenders falls on or after this date. not set
deadlineBefore string YYYY-MM-DD, inclusive. not set
performanceCountries array Where the contract is carried out, which is not always the buyer's country. not set
buyerName string Part of the contracting authority's name, e.g. ministry. not set
winnerName string Part of an awarded supplier's name. Only matches contract award notices. not set
minValue integer Total value of the notice, in the currency TED recorded (usually EUR). Notices with no published value are excluded when this is set. not set
maxValue integer Upper bound on the total value. not set
onlyLatestVersions boolean Drop superseded versions when a notice has been corrected, keeping one row per notice. false
expertQuery string TED expert search, passed through untouched and replacing every filter above. Supports =, ~, IN (...), ranges, AND/OR/NOT and today(-7), e.g. buyer-country=DEU AND classification-cpv=72000000 AND publication-date>=today(-7). Sorting is added for you unless you write your own SORT BY. not set
language string (24 options) Language for the notice title, which TED machine-translates into all 24 EU languages. Descriptions and buyer names exist only in the language the buyer filed in, so those fall back to the original and the row records which language it used. eng
includeBuyerDetails boolean Full contracting authority block: address, e-mail, phone, contact point, buyer profile URL, legal type and main activity. 21 extra fields. false
includeLotDetails boolean Per-lot titles, descriptions, estimated values, durations, place of performance and award criteria with their weights. 35 extra fields. false
includeAwardDetails boolean For contract award notices: winner name, identifier, address, company size, awarded value, contract number and date, tender ranks and how many bids were received. 35 extra fields. false
includeConditions boolean Exclusion grounds, selection criteria source, framework agreement and dynamic purchasing system flags, e-submission and e-invoicing, guarantees, reserved and green procurement, EU funding. 36 extra fields. false
includeDocuments boolean Links to the procurement documents and the submission portal, document languages and restrictions, and the organisations that provide and receive them. 14 extra fields. false
includeReviewBodies boolean The body that hears appeals, its address and the deadline description, plus the review information point and mediator. 15 extra fields. false
includeRelatedOrganisations boolean Additional information point, tender evaluator and the eSender that filed the notice. 13 extra fields. false
includeNoticeHistory boolean Change description and reason, the section that changed, the previous notice in the procedure and the framework notice it belongs to. 12 extra fields. false
includeLegacyFields boolean The pre-eForms two-letter codes (TD, PR, NC, PC, RC, AA…). These are the only shape older archive notices carry, so switch this on when scraping before 2024. 29 extra fields. false
includeFullText boolean The complete notice body as TED indexes it, in the original language. Roughly triples the bytes per notice and the run time. false
includeTranslations boolean Keeps every machine translation of the title as a language-keyed object instead of the one output language. false
proxyConfiguration object The TED API is open and does not need a proxy; runs go direct by default. Turn one on only if your account is throttled. {"useApifyProxy":false}

How much does the TED Europa Tenders Scraper cost?

from $0.71 per 1,000 results

Charged forWhat it isPrice each
Actor Start Charged when the Actor starts running. Number of events charged depends on Actor memory (one event per GB, minimum one event). $0.0178 to $0.02
Notice One TED procurement notice: publication number, title in your language, publication and dispatch dates, notice and procedure type, CPV codes, buyer name, country and city, total value, tender deadline and the TED links. $0.00356 to $0.004
Buyer details Optional. Contracting authority address, e-mail, phone, contact point, buyer profile URL, legal type and main activity. $0.00089 to $0.001
Lot details Optional. Per-lot titles, descriptions, estimated values, durations, place of performance and award criteria with weights. $0.001335 to $0.0015
Award and winner details Optional. Winner name, identifier, address and company size, awarded value, contract number and date, tender ranks and bids received. $0.001335 to $0.0015
Participation conditions Optional. Exclusion grounds, selection criteria, framework and dynamic purchasing system flags, e-submission, guarantees, reserved and green procurement, EU funding. $0.00089 to $0.001
Tender documents Optional. Links to the procurement documents and the submission portal, document languages and restrictions, and the organisations behind them. $0.00089 to $0.001
Review and appeal bodies Optional. The body that hears appeals with its address, the review deadline description, the review information point and the mediator. $0.000712 to $0.0008
Other organisations Optional. Additional information point, tender evaluator and the eSender that filed the notice. $0.000712 to $0.0008
Corrections and previous notices Optional. Change description and reason, the section that changed, the previous notice in the procedure and the framework notice it belongs to. $0.000712 to $0.0008
Legacy TED codes Optional. The pre-eForms two-letter codes (TD, PR, NC, PC, RC, AA and the rest), which is the only shape archive notices before 2024 carry. $0.000712 to $0.0008
Full notice text Optional. The complete notice body as TED indexes it, in the language the buyer filed it in. $0.00178 to $0.002
Title in all 24 languages Optional. Every machine translation of the notice title as a language-keyed object. $0.00089 to $0.001

Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.

How do I call the TED Europa Tenders Scraper API?

One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.

POST · run and get results
curl -X POST "https://api.apify.com/v2/acts/parseforge~ted-europa-tenders-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "publishedLastDays": 3,
    "maxItems": 50,
    "sortOrder": "newest",
    "onlyActive": false,
    "onlyLatestVersions": false
  }'

What example inputs can I use?

Use these inputs to see how a run is configured.

input.json
{
  "publishedLastDays": 3,
  "maxItems": 50,
  "sortOrder": "newest",
  "onlyActive": false,
  "onlyLatestVersions": false
}

What do users say about the TED Europa Tenders Scraper?

No reviews yet. Be the first.

How do I report an issue with the TED Europa Tenders Scraper?

We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.

Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.

What related scrapers can I use?

Run TED Europa Tenders Scraper on Apify All scrapers