EU TED Tenders — Public Procurement Notice Scraper avatar

EU TED Tenders — Public Procurement Notice Scraper

Pricing

from $4.00 / 1,000 results

Go to Apify Store
EU TED Tenders — Public Procurement Notice Scraper

EU TED Tenders — Public Procurement Notice Scraper

Fetches structured public procurement notices from the official EU TED (Tenders Electronic Daily) API. Filter by country, CPV code, date, value, and notice type. Free, unauthenticated API; clean JSON output ready for CRM/dashboard ingestion.

Pricing

from $4.00 / 1,000 results

Rating

5.0

(1)

Developer

Berkan Kaplan

Berkan Kaplan

Maintained by Community

Actor stats

0

Bookmarked

13

Total users

7

Monthly active users

4 days ago

Last modified

Share

EU TED Tenders Scraper — Public Procurement, Government Contracts

EU Data Contracts Pricing

EU TED Tenders — Public Procurement, Government Contracts & RFP Data

Chasing EU public contracts by hand on ted.europa.eu? This Actor turns the official TED (Tenders Electronic Daily) API — the European Union's single portal for public procurement above the EU thresholds — into a clean, filterable dataset: tenders, contract award notices (CAN), prior information notices (PIN) and more, with buyer, value, deadline, CPV codes and official links on every row.

No fragile HTML scraping, no TED account, no wrestling with TED's XML — filter by country, sector, date and notice type and get a flat dataset you can push straight into a CRM, dashboard, Slack alert, lead-gen pipeline or LLM context.

  • 🇪🇺 All EU member states + EEA/EFTA — every buyer country TED publishes, from one API
  • 📋 Tenders, awards (CAN) & PINs — filter by country, CPV sector, date, value & notice type
  • 🏛️ Buyer, value & deadline in every row — contracting authority, contact, estimated/awarded value, submission deadline
  • One run → one clean, flat dataset (JSON / CSV / Excel / API)

Quick start (API)

Get this week's IT tenders in Germany (100 rows) in one call:

curl -X POST "https://api.apify.com/v2/acts/foxlabs~ted-tenders/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "datePreset": "last_7_days", "countries": ["DEU"], "cpvCodes": ["72000000"], "maxResults": 100, "language": "ENG" }'

Prefer no code? Open the Input tab, pick your date range, buyer countries and sectors from the dropdowns, and click Start — then download the results.

What you get

One clean, flat record per published notice:

FieldTypeDescription
publicationNumberstringTED canonical notice ID (e.g. 265768-2026)
publicationDatestringDate the notice was published in TED (YYYY-MM-DD)
titlestringNotice title, in your requested language (English fallback)
noticeTypestringTED notice class (cn, can-standard, pin-only, …)
noticeSubtypestringFiner TED notice subtype code, where present
procedureTypestringopen, restricted, negotiated, …
buyerNamestringContracting authority (public buyer) name
buyerCountrystringBuyer country, ISO 3-letter (e.g. DEU)
buyerCitystringBuyer city / town
buyerEmailstringBuyer contact email, where published
buyerUrlstringBuyer website / internet address, where published
totalValuenumberEstimated or awarded contract value
totalValueCurrencystringCurrency of totalValue (e.g. EUR)
cpvCodesarrayCPV (Common Procurement Vocabulary) codes on the notice
deadlineDatestringTender submission deadline (YYYY-MM-DD), where present
descriptionstringFree-text description from the procedure / lot
placeOfPerformanceCountrystringWhere the contract is performed (country)
placeOfPerformanceCitystringWhere the contract is performed (city)
detailUrlstringLink to the official TED notice HTML page
xmlUrlstringLink to the official TED notice XML
scrapedAtstringISO timestamp of when the row was fetched

Missing values are returned as null, never guessed. Which fields are populated depends on the notice type (see FAQ).

Sample output

// Illustrative — field shapes are real; values are an example.
{
"publicationNumber": "265768-2026",
"publicationDate": "2026-04-20",
"title": "Supply of cloud infrastructure services",
"noticeType": "cn",
"noticeSubtype": "16",
"procedureType": "open",
"buyerName": "Bundesministerium für Digitales und Verkehr",
"buyerCountry": "DEU",
"buyerCity": "Berlin",
"buyerEmail": "vergabe@bmdv.bund.de",
"buyerUrl": "https://www.bmdv.bund.de",
"totalValue": 2400000,
"totalValueCurrency": "EUR",
"cpvCodes": ["72000000", "72200000"],
"deadlineDate": "2026-05-20",
"description": "Multi-year framework for IaaS provision across federal agencies...",
"placeOfPerformanceCountry": "DEU",
"placeOfPerformanceCity": "Berlin",
"detailUrl": "https://ted.europa.eu/en/notice/-/detail/265768-2026",
"xmlUrl": "https://ted.europa.eu/en/notice/265768-2026/xml",
"scrapedAt": "2026-04-24T08:00:00.000Z"
}

Input & filters

Every filter is optional. Leave them empty and you get the last 7 days across all EU/EEA buyers.

  • Date range — a preset (last 24 hours, 7 / 30 / 90 days, year-to-date) or Custom with your own publicationDateFrom / publicationDateTo (YYYYMMDD).
  • Buyer countries — pick one or more from the dropdown (27 EU members + Norway, Iceland, Liechtenstein, Switzerland). Empty = all.
  • Sector (CPV) — pick one or more CPV main divisions (e.g. 72 IT, 45 construction, 33 healthcare). Empty = all sectors. Match is on the exact CPV code you select (see Troubleshooting).
  • Notice type — contract notice (cn), contract award (can-standard), award modification, prior information notice (pin-only), corrigendum, subcontract, concession. Empty = all.
  • Output language — the language used for title, description and buyerName (24 EU languages); falls back to English.
  • Max results — a hard cap on rows, to control cost. 0 = unlimited.
  • Advanced — TED expert query — a raw TED DSL string that overrides all structured filters (power users).
  • Advanced — API page size — notices fetched per TED request (max 250).

Example inputs (copy & paste)

// 1) Lead list: this month's healthcare tenders across the EU
{ "datePreset": "last_30_days", "cpvCodes": ["33000000"], "maxResults": 1000, "language": "ENG" }
// 2) Competitor intel: this week's contract awards (who won what) in France & Italy
{ "datePreset": "last_7_days", "countries": ["FRA", "ITA"], "noticeTypes": ["can-standard"], "maxResults": 500 }
// 3) Power user: high-value IT tenders since Jan 2026, via the expert query
{ "query": "publication-date>=20260101 AND classification-cpv=72000000 AND total-value>=1000000", "maxResults": 2000 }
// 4) Construction: new contract notices in Germany & Poland, last 30 days
{ "datePreset": "last_30_days", "countries": ["DEU", "POL"], "cpvCodes": ["45000000"], "noticeTypes": ["cn"], "maxResults": 500 }
// 5) IT & software: fresh tenders across the Nordics, last 7 days
{ "datePreset": "last_7_days", "countries": ["SWE", "DNK", "FIN"], "cpvCodes": ["72000000", "48000000"], "noticeTypes": ["cn"], "maxResults": 500 }
// 6) Plan ahead: prior information notices (upcoming pipeline) in Spain, last 90 days
{ "datePreset": "last_90_days", "countries": ["ESP"], "noticeTypes": ["pin-only", "pin-cfc-standard"], "maxResults": 300 }
// 7) Custom window: healthcare notices in France, native French titles
{ "datePreset": "custom", "publicationDateFrom": "20260101", "publicationDateTo": "20260331", "countries": ["FRA"], "cpvCodes": ["33000000"], "language": "FRA", "maxResults": 1000 }
// 8) Corrigenda watch: corrections & award modifications in Italy
{ "datePreset": "last_30_days", "countries": ["ITA"], "noticeTypes": ["corr", "can-modif"], "maxResults": 300 }

Use cases

  • B2G lead generation. Sell to the public sector? Filter your CPV codes + target countries + last_24_hours and get every fresh tender the moment it publishes — buyer name, city, contact and deadline included — as an API-driven feed that replaces manual TED browsing.
  • Competitive & market intelligence. Pull contract award notices (CAN) to see who won what, for how much, aggregate wins by supplier, buyer or sector, and track how a market moves across member states.
  • Market sizing & research. Pull every notice for a CPV division or a country over a date window to count the players, size the spend and spot the biggest buyers before you commit sales effort.
  • CRM & pipeline enrichment. Feed live tenders into your CRM/dashboard (Looker, Metabase, Tableau) or no-code stack (Make, Zapier, n8n) so bid teams work from one prioritised list instead of ad-hoc searches.
  • Procurement consulting & alerts. Package a daily, filtered tender digest per client niche — a low-cost, recurring intelligence product built on a scheduled run.
  • Policy & academic research, LLM context. Analyse public spending, cross-border competition and supplier diversity, or drop structured procurement data into a RAG pipeline without writing your own EU-procurement parser.

Performance & throughput

The Actor calls TED's official search API and paginates (up to 250 notices per request, default 100), fetching pages until it reaches your Max results or the last matching notice. Runtime therefore scales with how many notices match your filters: a targeted niche returns in seconds; a broad, EU-wide, multi-thousand-row pull takes a few minutes. There are no proxies, browsers or API keys to manage — TED's API is public and free, so you're only paying for the rows you keep. Use Max results and tighter filters to keep broad exploratory runs fast and cheap.

Integrations

JavaScript (apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('foxlabs/ted-tenders').call({
datePreset: 'last_7_days', countries: ['DEU'], cpvCodes: ['72000000'], maxResults: 100,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();

Python (apify-client):

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("foxlabs/ted-tenders").call(run_input={
"datePreset": "last_7_days", "countries": ["DEU"], "cpvCodes": ["72000000"], "maxResults": 100,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["publicationNumber"], item.get("title"))

Also works with Make / n8n / Zapier (Apify app → run this Actor, map the input), scheduled runs for daily incremental ingest, webhooks, and the Apify MCP server so AI agents can pull live tenders as a tool.

Data quality

Fields come straight from TED's official API — never fabricated. The Actor flattens TED's multilingual, deeply-nested notice structure into one flat row, picking your chosen language for title, description and buyerName (English fallback), and de-duplicating CPV codes. What's populated depends on the notice type: a prior information notice (PIN) is a plan and usually has no awarded value; a contract award (CAN) is a result and usually has no submission deadline; not every buyer publishes an email or website. Anything TED doesn't provide for a given notice is returned as null — so you can trust that a present value is real and an absent one wasn't invented.

Pricing

Pay per result — $4 per 1,000 notices (≈ $0.004 each, the current listing rate). You're billed per notice returned, so cost tracks exactly what you keep, and TED's underlying API is free — no proxies, third-party fees or seat costs on top. So 100 notices ≈ $0.40, 1,000 ≈ $4, 10,000 ≈ $40. Apify's free tier (monthly platform credits) lets you evaluate the full feature set before you pay, and Max results caps spend on any run. A one-off EU-wide backfill of tens of thousands of rows is a larger run; cheap daily increments then keep you current. Check the Actor's pricing box on its Apify Store page for the up-to-date rate.

FAQ

Is TED data free to use — can I resell it? TED notices are official European Union publications, published as open data and reusable (including for commercial purposes) with attribution to the source. Check TED's Legal Notice for the current reuse terms and attribute the European Union / TED.

How fresh is the data? Each run queries TED live, so you get what's in TED at that moment. Schedule a daily run with a short date preset (e.g. last_24_hours) for an always-current feed.

Do I need a TED API key or account? No. No key, no login — the Actor uses TED's public search API for you.

What export formats are available? JSON, CSV, Excel, HTML, RSS or XML from the Dataset tab, or straight from the Apify API / integrations.

Can I filter by a specific buyer or organisation? Not from the dropdowns (they cover country, CPV, date, value and notice type). Use the Advanced — TED expert query field, e.g. organisation-name~"Bundesministerium".

Why are some fields empty? Notices vary by type — a PIN has no awarded value, a CAN has no tender deadline, and not every buyer lists an email. Empty fields come back as null.

Does this cover non-EU procurement (US SAM.gov, UK Contracts Finder)? No — TED is the EU/EEA portal only. Other jurisdictions are separate Actors under the foxlabs account.

How does the CPV sector filter work? It matches the exact CPV code you pick. Selecting 72000000 returns notices tagged with that exact code; sub-codes like 72200000 are separate — add them too, or use the expert query for prefix logic.

How many notices can I get in one run? As many as match your filters — set Max results to 0 for unlimited, or a number to cap cost. Broad queries can match tens of thousands of notices.

How do I get only new tenders each day? Schedule the Actor with datePreset = last_24_hours (or a custom From/To of today); each run then returns just the latest notices for your filters.

Troubleshooting

  • 0 results → your filters are too narrow. Widen the date range or country list, clear the sector filter, or remember CPV is an exact match (a broad division code won't include its sub-codes).
  • Custom dates ignored → the From/To fields only apply when Date range is set to Custom. With any other preset the dates are computed for you.
  • A field is null → that value isn't published for this notice type (e.g. no award value on a PIN, no deadline on a CAN). It's the source data, not a miss.
  • A run is slow or costs more than expected → broad, EU-wide queries can match tens of thousands of notices. Lower Max results or tighten the filters; use a smaller date preset for daily runs.
  • Search-API level detail. This Actor returns the fields exposed by TED's search API plus links (detailUrl, xmlUrl) to each full official notice. Full lot-by-lot parsing of the notice XML is not included; follow xmlUrl when you need the complete document.
  • Attribution & reuse. TED notices are official EU publications, available for reuse (including commercial) under the European Union's open-data policy. Attribute the European Union / TED as the source and follow TED's Legal Notice.
  • Personal data. buyerEmail / buyerUrl are organisational contact points published by the contracting authority. If you process them, you're responsible for your own lawful basis.
  • Not affiliated with the European Union, the Publications Office of the EU, or TED. This Actor redistributes their public open data via the official API.

Support

Questions, a field you'd like added, or a custom procurement build (other jurisdictions, deeper XML parsing)? Open the Issues tab on this Actor, or email info@foxlabs.com.tr. We reply fast.

If this Actor saves your bid team time, a ⭐ review really helps.

Changelog

0.5 — 2026-07-05

  • Reworked docs to the gold-standard structure: API quick-start, full field table, sample output, integration snippets (JS/Python/Make/MCP), expanded FAQ, troubleshooting and honest notes/limits.
  • Input schema: added the missing editor on Max results and API page size; added starter prefills for a cheap, focused first run.

0.1

  • Initial release. EU public procurement notices from the official TED (Tenders Electronic Daily) API: tenders, contract awards (CAN), prior information notices (PIN) and more — filter by country, CPV sector, date, value and notice type, with buyer contacts, values, deadlines, CPV codes and official TED links.

Part of the foXLabs data platform — official public-data company, contact, ownership, procurement, jobs and AI-search intelligence scrapers. Browse the full suite and free how-to guides at data.foxlabs.com.tr.