TED Tenders API – EU Public Tenders & Procurement Scraper avatar

TED Tenders API – EU Public Tenders & Procurement Scraper

Pricing

from $1.00 / 1,000 results

Go to Apify Store
TED Tenders API – EU Public Tenders & Procurement Scraper

TED Tenders API – EU Public Tenders & Procurement Scraper

Search and export EU public tenders and procurement notices from TED (Tenders Electronic Daily): filter by country, CPV code, keyword and deadline; one-language records with buyer, value, deadline, CPV labels, document links and, for award notices, the winning companies.

Pricing

from $1.00 / 1,000 results

Rating

0.0

(0)

Developer

Perceptron Data

Perceptron Data

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

1

Monthly active users

5 days ago

Last modified

Share

TED Tenders

Pick countries, CPV codes and keywords, get one row per EU tender notice: buyer, estimated value, deadline, CPV labels and, for awards, the winner. Built on TED's official API, with one language per record instead of 24.

Limits: only notices above the EU thresholds – national tenders below them are not on TED. Estimated value and winner appear only where the notice publishes them. CPV labels come in English.

TED Tenders output: five German IT tenders from the last 30 days with notice number, title, buyer, city, notice type, deadline, open status and publication date – run of 12 October 2026

TED (Tenders Electronic Daily) is the EU's official procurement journal, with notices from all 27 member states, the EEA and EU institutions. The data comes straight from TED's API – no HTML scraping, no proxies.

How to use – step by step

  1. Click Try for free on this page (a free Apify account is enough) – the form opens with Germany and CPV 72 (IT services) for the last 30 days. Called through the API without filters, the actor covers all of Europe.
  2. Choose Countries (three-letter codes such as DEU, AUT) and CPV codes / categories – a two-digit division covers a whole sector; optionally Keywords in title.
  3. Set the time window (Published within last N days or Published from (date)), Only tenders you can still bid on, the Notice types (can-standard for awards) and the Output language.
  4. Set Maximum tenders (default 500) and click Start. Five notices out of 617 matches took about a second in a local test run on 12 October 2026.
  5. Open the Output tab: the Tenders view shows title, buyer, country, value, deadline, days left, CPV category and the notice link. Export as CSV, Excel or JSON, or read the rows through the API. The free COVERAGE record says how many notices matched and why the run stopped.
  6. For daily tender alerts, add only_new and a schedule (see Monitoring setup below).

Why this actor and not the raw API

TED's own API is powerful but awkward to consume: every text field comes back in all 24 EU languages at once, arrays contain duplicates, dates carry timezone suffixes, CPV codes are bare numbers, and page-based paging refuses to go past 15,000 results. This actor fixes all of it:

  • 🌍 One language, not 24 — pick your language and every title, description, buyer name and even the PDF link comes back in it, with English fallback
  • 🏷 CPV codes translated — 72260000 also arrives as "IT services: consulting, software development, Internet and support"
  • ⏳ Deadline maths done for you — daysUntilDeadline and isOpen, plus an option to return only tenders you can still respond to. Restricted and negotiated procedures count too: their notices carry a deadline for requests to participate instead of a tender deadline (deadlineType) — measured on German IT notices, that is a third of all open procedures
  • 🔎 Filters instead of query syntax — country, CPV category, keyword and date pickers; the expert query is still there if you want it
  • 📄 Direct links — notice page, PDF and XML, in your language
  • ♾️ No 15,000-result ceiling — token-based iteration goes as deep as your query needs (measured: 26,127 of 26,127 notices, no duplicates)
  • 🏆 Every winner, not just the first — multi-lot awards list all winning companies (winnerNames); the contract value is the total, the procedure estimate or the sum of all lots, and valueBasis says which
  • 🧾 Every row says where it came from — checkedAt, the exact query sent to TED, dataSource and the official notice link; a free COVERAGE record tells you how many notices matched and why a run stopped

Use cases

  • Bid monitoring — schedule a daily run for your sector and get every new tender into Slack, a webhook, Google Sheets or your CRM
  • Sales & lead generation — public buyers with a budget and a stated need, filtered to your industry and region
  • Market & competitor research — award notices (can-standard) show who won which contract and for how much
  • Grant & funding research — track what the public sector is buying and where
  • Data products & dashboards — a normalised procurement feed for analytics
  • AI agents — clean schema and plain-language filters, callable via MCP

Input example

Every new IT tender in Germany and Austria from the last week that is still open for bids:

{
"countries": ["DEU", "AUT"],
"cpv_codes": ["72", "48"],
"published_since_days": 7,
"only_open_tenders": true,
"notice_types": ["cn-standard"],
"language": "de",
"max_items": 500
}

Who won public construction contracts in France this year:

{
"countries": ["FRA"],
"cpv_codes": ["45"],
"notice_types": ["can-standard"],
"published_from": "2026-01-01",
"language": "fr"
}

Output example

{
"publicationNumber": "446016-2026",
"title": "Germany – Software-related services – Microsoft training services, Lot 2",
"buyerName": "Bundesrepublik Deutschland, Beschaffungsamt des BMI",
"buyerCity": "Bonn",
"buyerCountry": "DEU",
"noticeType": "cn-standard",
"procedureType": "open",
"contractNature": "services",
"publicationDate": "2026-06-30",
"deadline": "2026-08-04",
"deadlineType": "tender",
"daysUntilDeadline": 5,
"isOpen": true,
"estimatedValue": 1200000.0,
"currency": "EUR",
"valueBasis": "procedure_estimate",
"cpvMain": "72260000",
"cpvCategory": "IT services: consulting, software development, Internet and support",
"cpvCodes": ["72260000", "72261000"],
"placeOfPerformance": ["DEA22", "DEU"],
"noticeUrl": "https://ted.europa.eu/en/notice/-/detail/446016-2026",
"pdfUrl": "https://ted.europa.eu/de/notice/446016-2026/pdf",
"checkedAt": "2026-07-30T08:14:02Z",
"query": "(buyer-country=DEU OR buyer-country=AUT) AND (classification-cpv=72* OR classification-cpv=48*) AND publication-date>=20260723",
"dataSource": "TED – Tenders Electronic Daily, Publications Office of the EU (api.ted.europa.eu)"
}

Award notices add winnerName (all winners, joined with ; ) and winnerNames (a list).

Coverage report – what was checked

Besides the dataset, every run writes a COVERAGE record to its key-value store (free, not charged): the query, how many notices matched at TED, how many were delivered, how many were skipped and why (closed, no deadline, delivered in an earlier run), and why the run stopped — all matching notices delivered, your maximum reached, your maximum cost per run reached, or the run timeout near. The status message says the same in one line. A run never claims more than it stored.

CPV quick reference

Pass a 2-digit division to cover a whole sector:

CodeSectorCodeSector
45Construction work72IT services & software development
48Software packages71Architecture & engineering
79Business services (consulting, marketing, HR)85Health & social work
80Education & training90Cleaning & environmental services
50Repair & maintenance34Transport equipment
33Medical equipment & pharmaceuticals31Electrical equipment

Monitoring setup

  1. Set your filters, published_since_days: 7 and only_new: true
  2. Add a Schedule (daily)
  3. Connect a webhook, Slack, Google Sheets or a database integration

With only_new the actor remembers which notices it delivered for these filters (in the key-value store eu-tenders-ted-monitor of your account) and skips them on the next run — they are neither delivered nor charged twice. The window can therefore overlap generously, so a late run or a missed day loses nothing. The first run delivers everything in the window.

A rolling window alone (published_since_days: 1) is not duplicate-free: it reaches back to yesterday, so every notice falls into two consecutive daily runs.

Notes

  • Data comes from the official, public TED API — no login, no proxies. Requests are paced so runs stay reliable.
  • Notices are legal publications about public bodies and contracts. Award notices name the winning bidders; where a winner is a sole trader, its trading name can contain a person's name (e.g. "… Inhaber: …").
  • Large exports stop cleanly before the run timeout and before your maximum cost per run, keep everything already stored and say so.
  • Not affiliated with or endorsed by the Publications Office of the European Union.

What does a run cost?

$0.01 per run start plus a price per tender that drops with your Apify plan:

Your Apify planPer tender1,000 tenders10,000 tenders
Free$0.002$2.01$20.01
Starter$0.0015$1.51$15.01
Scale$0.0012$1.21$12.01
Business & Enterprise$0.001$1.01$10.01

You pay only for tenders stored in the dataset — not for skipped notices, not for notices an earlier monitoring run already delivered, and not for the COVERAGE record.

Changelog

  • 12 October 2026 – only_new monitoring: each notice is delivered once, also when the windows overlap. "Only open" also counts deadlines for requests to participate (deadlineType). Award notices list every winner (winnerNames); the contract value is the total or the sum of all lots (valueBasis). CPV codes with check digit (72260000-5) work. Every row carries checkedAt, the query sent to TED and the source; a free COVERAGE record per run; at your cost limit or near the timeout the run stops cleanly and says how much it stored. Called through the API without filters, the actor now covers all of Europe instead of the form's German example.

Auf Deutsch: EU-Ausschreibungen aus TED exportieren

Länder, CPV-Codes und Stichwörter rein, je Bekanntmachung eine Zeile raus: Auftraggeber, geschätzter Wert, Frist, CPV-Bezeichnungen und bei Zuschlägen der Gewinner – aus TED, über die offizielle TED-Schnittstelle. Täglich geplant entsteht daraus ein Ausschreibungsalarm für Deutschland oder jedes andere EU-Land.

Filter: Länder, CPV-Codes (auch mit Prüfziffer, z. B. 72260000-5), Stichwörter im Titel, Veröffentlichungszeitraum, Frist und „nur noch offene Ausschreibungen“ — dabei zählen Angebotsfristen und Fristen für Teilnahmeanträge (nicht offene und Verhandlungsverfahren). Jede Zeile enthält Auftraggeber mit Ort, Bekanntmachungsart, Verfahrensart, Frist mit Art und verbleibenden Tagen, Auftragswert mit Herkunft, CPV-Bezeichnungen, Ausführungsort, bei Zuschlägen alle Gewinner sowie Links zu PDF, XML und Webansicht — auf Wunsch in deutscher Sprache. Dazu Prüfzeitpunkt, die an TED gesendete Abfrage und die Quelle; der kostenlose Datensatz COVERAGE nennt Treffer, Lieferung und Abbruchgrund.

Typische Anwendungsfälle: tägliches Ausschreibungsmonitoring per Zeitplan (mit only_new ohne Doppellieferung), Vertrieb an öffentliche Auftraggeber, Wettbewerbs- und Marktanalysen.

FAQ

Is there an official TED API? Yes — and this actor is built on it. What it adds is usability: TED returns every text in all 24 EU languages at once, duplicated arrays and timezone-laden dates, and its page-based paging refuses to go past 15,000 results. This actor returns one language, clean values, and iterates past that ceiling.

How do I monitor new tenders in my sector? Pick your countries and CPV codes, set published_since_days: 7 and only_new: true, then schedule the actor daily and connect a webhook, Slack or Google Sheets integration. Each notice is delivered once, even though the windows overlap.

What is a CPV code? The EU's procurement category system. A two-digit code covers a whole sector — 72 is IT services, 45 construction, 85 health. Full eight-digit codes narrow it down. Prefixes match automatically.

Can I see who won a contract? Yes. Set notice_types to can-standard (contract award notice) — those records carry every winner (winnerNames; 23 % of award notices name more than one) and the awarded value where published.

Why do many tenders have no value? Publishing an estimated value is not mandatory for every notice type. The field stays empty rather than being estimated.

Does this cover national tenders below the EU threshold? No. TED covers procurement above the EU thresholds. Below-threshold German tenders are published elsewhere and are not part of this dataset.

More from Perceptron Data

ActorWhat it does
Advertiser Check (Google & Bing)Company list in, one row per company out: Google ads, Bing ads, ad counts, accounts
Imprint & VAT CheckDomains in, company rows out: legal name, address, register number and EU VAT ID checked against VIES (Swiss UIDs excluded)
Free Imprint & Contact CheckThe same company row, free, for up to 10 websites per run
PDF to MarkdownPDF, Word, Excel and PowerPoint to Markdown for AI – tables as JSON, OCR for scans
Research AgentA question in, cited passages out – every source graded by evidence level
App Store & Google Play DataApp IDs or App Store keywords in, one row per app out, plus App Store reviews
Arbeitsagentur JobsGerman job listings from the Jobbörse of the Bundesagentur für Arbeit
kununu Employer DataEmployer score vs. industry, salary ranges, benefits and reviews for DACH companies
Messe München ExhibitorsExhibitor lists of bauma, IFAT, BAU and more
Koelnmesse ExhibitorsExhibitor lists of Anuga, ISM, imm cologne and more
MaStR Energy AssetsSolar, wind and storage units in Germany with operator and capacity
EUDAMED Medical DevicesEU medical devices, manufacturers and certificates
Data Source FinderFree: tells you which ready-made scraper covers your data source

Support

Bug reports are welcome in the Issues tab.