EU TED Tenders Scraper
Pricing
Pay per event
EU TED Tenders Scraper
Export EU TED (Tenders Electronic Daily) public procurement notices as flat, buyer-ready rows: buyer, title, CPV code, estimated value, deadline, and winner info. Keyless EU API — filter by CPV code, buyer country, notice type, and publication date.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share
🎯 What this scrapes
TED (Tenders Electronic Daily) is the EU-wide official journal for public procurement — every EU/EEA member state's contracting authorities publish notices there, from a Polish ministry's IT framework agreement to a German city's construction tender. TED's own v3 search API is keyless and public, but it returns deeply nested eForms-taxonomy JSON with 24-language multilingual fields ({"eng": [...], "pol": [...]}) that are painful to parse by hand. This Actor queries TED's public search API and flattens every notice into one buyer-ready row — buyer, title, CPV classification, estimated value, deadline, and award/winner info once a contract has been won. No API key, no login, no eForms-schema puzzle.
🔥 What we handle for you
- 🔁 Retries with exponential backoff on
408/429/503/network errors — up to 5 attempts,Retry-Afterhonoured. - 🧱 Per-notice fault isolation — one malformed notice is skipped and logged, never crashes the whole run.
- 🌐 Multilingual-first field extraction — English preferred, falling back through 24 EU languages so a title/buyer name is never silently dropped.
- 🧊 Clean, typed dataset rows — Pydantic-validated, ISO-8601 timestamps, never the raw eForms JSON blob.
- 💰 Pay-Per-Event pricing — you only pay for rows that land in your dataset. No data, no charge.
💡 Use cases
- Bid-team pipeline — pull new EU-wide tenders matching a CPV code or country every day.
- Market intelligence — track which EU public bodies are buying what, and at what value, across all 27+ member states.
- Award tracking — monitor closed notices for winner names and countries on contracts you bid on.
- Lead generation — build a cross-border prospect list of buyers issuing contracts in your sector.
⚙️ How to use it
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
query | string | no | '—' | Raw TED expert-query string (e.g. classification-cpv=72000000 AND buyer-country=POL). When set, used… |
cpvCodes | array | no | ['72000000'] | CPV classification codes, OR-combined (e.g. 72000000 for IT services). Default is a confirmed-live,… |
buyerCountries | array | no | [] | Buyer country codes, OR-combined (ISO3, e.g. POL, DEU). Leave empty to match all EU/EEA… |
noticeTypes | array | no | [] | Notice types, OR-combined (e.g. cn-standard, can-standard). Leave empty to match all notice… |
publishedFrom | string | no | '—' | Only include notices published on or after this date, e.g. 2026-01-01. |
publishedTo | string | no | '—' | Only include notices published on or before this date, e.g. 2026-08-01. Must be on/after… |
maxResults | integer | no | 20 | Hard cap on the number of notice rows returned by this run. |
useProxy | boolean | no | False | Route requests through Apify Proxy. TED is EU public infrastructure with no observed anti-bot, so this defaults off —… |
Example input
{"cpvCodes": ["72000000"],"maxResults": 5,"useProxy": true}
📤 Output
Every row is one dataset item.
| Field | Type | Notes |
|---|---|---|
publication_number | string | TED publication number, e.g. 13-2026. Always present. |
notice_id | ['string', 'null'] | Stable per-notice UUID. |
title | string | Notice title, multilingual-first (English preferred). |
notice_url | string | Public TED notice URL, built from the publication number. |
notice_type | ['string', 'null'] | TED notice type enum, e.g. cn-standard (contract notice), can-standard (contract award notice). |
form_type | ['string', 'null'] | TED form type enum, e.g. competition, result. |
procedure_type | ['string', 'null'] | Procurement procedure type, e.g. open, neg-w-call, oth-single. |
buyer_name | ['string', 'null'] | Contracting authority / buyer name, multilingual-first. |
buyer_country | ['string', 'null'] | Buyer country, ISO3 code (e.g. POL). |
buyer_city | ['string', 'null'] | Buyer city, multilingual-first. |
place_of_performance_country | ['string', 'null'] | Place-of-performance country, ISO3 code. |
cpv_codes | array | Deduplicated CPV classification codes; empty list when none present. |
description | ['string', 'null'] | Lot description, multilingual-first. |
estimated_value_amount | ['number', 'null'] | Estimated value of the first lot, parsed as a float. |
estimated_value_currency | ['string', 'null'] | Currency of estimated_value_amount. |
deadline_date | ['string', 'null'] | Submission deadline of the first lot; null on award notices (no open deadline). |
publication_date | ['string', 'null'] | Notice publication date, as returned by TED. |
winner_name | ['string', 'null'] | Winning supplier name, multilingual-first; populated on award notices only. |
winner_country | ['string', 'null'] | Winner country, ISO3 code; populated on award notices only. |
scraped_at | string | ISO 8601 UTC timestamp when this row was scraped. |
Example output
{}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.2 | One-off warm-up charge per run |
result-row | $0.004 | Per unique dataset item |
Example: 1 000 results at the rates above ≈ $4.20. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
- TED (EU-wide) only — national procurement portals are out of scope (see our UK Contracts Finder Actor for UK-specific coverage).
- No eForms XML/PDF document downloads, only the structured notice metadata.
- Real-time per-query only — no historical bulk export and no cross-run deduplication.
❓ FAQ
Do I need a TED account or API key?
No. TED's v3 search API is public and keyless — this Actor calls it directly.
Why does the default CPV code return so many results?
72000000 (IT services) alone matches 396k+ live notices — confirmed on TED. maxResults defaults to 20 to keep a first run fast and cheap; raise it once you've confirmed the filter shape you want.
What if a notice's title isn't in English?
TED's multilingual fields aren't guaranteed to carry an "eng" key. This Actor falls back to the generic "mul" key, then the first available language, so title/buyer_name/description/winner_name are never silently dropped.
Can I write my own TED expert query?
Yes — set query to any raw TED expert-query string (e.g. classification-cpv=72000000 AND buyer-country=POL) and it's sent verbatim, overriding every structured filter.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.