How to export EU public tenders from TED (Tenders Electronic Daily) to CSV or JSON
Updated 2026-10-08 · Tool used: TED EU Tenders Scraper - Public Procurement & Awards on Apify · Price: $2.50 per 1,000 notices; already-seen notices in alert mode are free
TED (ted.europa.eu) publishes every EU/EEA public tender above the EU thresholds, but its search UI is slow for repeat work and its API returns deeply nested eForms data that is hard to use in a spreadsheet.
This guide shows how to export tenders by CPV codes, countries and dates to flat CSV/JSON rows (buyer, CPV, deadline, value, winners, links to the PDF and documents), and how to turn it into a daily tender alert.
Open TED EU Tenders Scraper on Apify →Steps
- Pick CPV codes (e.g.
72000000IT services) and buyer countries, or use keywords. - Set
publishedWithinDays,noticeCategories(competition/result/planning) andonlyOpen. - Schedule daily with Only new notices on and connect it to email, Slack or a Google Sheet.
Example input
{
"cpvCodes": [
"72000000",
"48000000"
],
"countries": [
"DE",
"AT"
],
"publishedWithinDays": 7,
"noticeCategories": [
"competition"
],
"onlyOpen": true,
"maxResults": 200
}
Example output (one item, shortened)
{
"publicationNumber": "681061-2026",
"noticeId": "bcc87ea3-dab7-4dd4-b8b3-fc9c3b18d452",
"noticeVersion": 1,
"procedureId": "059ca195-f237-4299-83b3-ad6520a48e7a",
"title": "LC - MSMS",
"titleLanguage": "de",
"titleOriginal": "LC - MSMS",
"noticeTitle": "Germany – Laboratory, optical and precision equipments (excl. glasses) – LC - MSMS",
"publicationDate": "2026-10-02",
"dispatchDate": "2026-09-30",
"deadline": "2026-11-04T08:00:00+01:00",
"deadlineDate": "2026-11-04",
"isOpen": true,
"noticeCategory": "competition",
"noticeType": "cn-standard",
"noticeTypeLabel": "Contract or concession notice – standard regime",
"procedureType": "open",
"procedureTypeLabel": "Open",
"contractType": "supplies",
"frameworkAgreement": false,
"buyerName": "LAVES",
"buyerCountry": "DE",
"buyerCountryIso3": "DEU",
"buyerCountryName": "Germany",
"buyerCity": "Oldenburg",
"buyerWebsite": "https://www.laves.niedersachsen.de",
"buyerType": "Regional authority",
"buyerActivity": "Health",
"mainCpv": "38000000",
"mainCpvLabel": "Laboratory, optical and precision equipments (excl. glasses)",
"cpvCodes": [
"38000000"
],
"placeOfPerformanceCountries": [
"DE"
],
"placeOfPerformanceNuts": [
"DE939"
],
"estimatedValue": 302000,
"estimatedValueCurrency": "EUR",
"awardedValue": null,
"awardedValueCurrency": null,
"winners": [],
"winnerCountries": [],
"awardDate": null,
"lotCount": 1,
"description": "Beschaffung eines Laborgerätes LC-MSMS",
"language": "de",
"legalBasis": "32014L0024",
"ojsNumber": "191/2026",
"noticeUrl": "https://ted.europa.eu/en/notice/-/detail/681061-2026",
"pdfUrl": "https://ted.europa.eu/en/notice/681061-2026/pdf",
"xmlUrl": "https://ted.europa.eu/en/notice/681061-2026/xml",
"documentsUrl": "https://vergabe.niedersachsen.de/Satellite/notice/CXQ6YYERS9M/documents",
"submissionUrl": "https://vergabe.niedersachsen.de/Satellite/notice/CXQ6YYERS9M",
"scrapedAt": "2026-10-04T16:45:00.000Z"
}
Every run's dataset can be downloaded as JSON, CSV, Excel, XML or HTML from the Apify Console, or via https://api.apify.com/v2/datasets/<datasetId>/items?format=csv.
Run it from code
Python
from apify_client import ApifyClient # pip install apify-client
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run_input = {
"cpvCodes": [
"72000000",
"48000000"
],
"countries": [
"DE",
"AT"
],
"publishedWithinDays": 7,
"noticeCategories": [
"competition"
],
"onlyOpen": true,
"maxResults": 200
}
run = client.actor("tinyrex/ted-tenders-scraper").call(run_input=run_input)
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)JavaScript / Node.js
import { ApifyClient } from 'apify-client'; // npm i apify-client
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('tinyrex/ted-tenders-scraper').call({
"cpvCodes": [
"72000000",
"48000000"
],
"countries": [
"DE",
"AT"
],
"publishedWithinDays": 7,
"noticeCategories": [
"competition"
],
"onlyOpen": true,
"maxResults": 200
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);curl (no SDK)
# Runs the actor and returns the results directly (CSV here; use format=json for JSON)
curl -X POST "https://api.apify.com/v2/acts/tinyrex~ted-tenders-scraper/run-sync-get-dataset-items?format=csv" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"cpvCodes": ["72000000", "48000000"], "countries": ["DE", "AT"], "publishedWithinDays": 7, "noticeCategories": ["competition"], "onlyOpen": true, "maxResults": 200}' > results.csv
Get your API token in Apify Console → Settings → API & Integrations. The free Apify plan includes monthly credit that is enough to try this.
Use it from an AI agent (MCP)
The Apify MCP server exposes this actor as a tool for Claude, Cursor, VS Code, n8n and other MCP clients. Add this to your client's MCP config (or use the OAuth flow at mcp.apify.com instead of a token):
{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=tinyrex/ted-tenders-scraper",
"headers": {
"Authorization": "Bearer <YOUR_APIFY_TOKEN>"
}
}
}
}
Then ask in plain language, e.g. "Ted tenders api export for this list and give me a table".
Pricing
Pay per result: $2.50 per 1,000 notices; already-seen notices in alert mode are free. You can cap the cost of every run in the run options.
FAQ
Is there an official TED API?
Yes, the TED Search API (api.ted.europa.eu). The actor uses it, so there is no HTML scraping and no blocking, and flattens the results for you.
Can I get contract award winners?
Yes. Use noticeCategories: ["result"] to get awarded values, winners and award dates.
How do I get daily tender alerts?
Enable the only-new-notices option and create an Apify schedule; each run returns only notices you have not seen before.
Try it on Apify →More guides
- Bulk tech stack lookup: a Wappalyzer / BuiltWith alternative for thousands of domains
- How to scrape Greenhouse, Lever and Ashby jobs (plus Personio, Teamtailor, Recruitee)
- How to export all products from any Shopify store to CSV or JSON
- How to scrape jobs from Workday career sites (myworkdayjobs.com)
- How to export products from any WooCommerce store to CSV or JSON
- How to export jobs from the Bundesagentur für Arbeit (Arbeitsagentur) and EURES
- How to scrape remote jobs from Himalayas, Remote OK, We Work Remotely and more in one run
- How to scrape Apple App Store reviews for any app and country (CSV, JSON, API)
- How to export open EU funding calls (Horizon Europe, Digital Europe, cascade funding) to CSV or JSON