EU Tenders (TED) Scraper
Pricing
$5.00 / 1,000 tender (result)s
EU Tenders (TED) Scraper
Use this when you need public tenders from the EU's TED (Tenders Electronic Daily): contract notices and awards by keyword, country, CPV code and date, with buyer, deadline, estimated value and link. Official API, incremental mode for daily runs. Pay per result.
Pricing
$5.00 / 1,000 tender (result)s
Rating
0.0
(0)
Developer
Hexadata
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
9 hours ago
Last modified
Categories
Share
EU Tenders (TED) Scraper returns public procurement notices from TED (Tenders Electronic Daily, the official EU journal for public tenders) as clean JSON: contract notices, award notices and prior information notices filtered by keyword, buyer country, CPV code, notice type and publication date, with buyer, deadline, estimated value and the notice link. It uses the official TED Search API (no key, no HTML scraping), runs incrementally for daily schedules, and you pay per result.
What you get
One item per notice, same field names as every Hexadata Actor:
| Field | Type | Description |
|---|---|---|
id | string | TED publication number, e.g. 745163-2026 (unique) |
title | string | English title as published by TED: "Country – CPV description – buyer's title" |
originalTitle | string | null | Title in the notice language when it differs |
language | string | null | Original language (ISO 639-2: deu, fra, spa…) |
buyerName | string | Contracting authority (organisation) |
buyerCity | string | null | |
country | string | null | Buyer country, ISO alpha-2 (DE, FR) |
buyerCountry | string | null | Same, alpha-3 as stored by TED (DEU, FRA) |
noticeType / noticeTypeLabel | string | eForms code (cn-standard, can-standard, pin-only…) and label ("Contract notice") |
formType / formTypeLabel | string | null | planning, competition, result, dir-awa-pre, cont-modif |
procedureType | string | null | open, restricted, neg-w-call, comp-dial… |
contractNature | string | null | services, supplies, works |
cpvCodes | string[] | All CPV codes (8 digits), deduplicated |
mainCpv | string | null | Main CPV of the procedure |
placeOfPerformance | string[] | NUTS / country codes |
publishedAt | string | Publication date, YYYY-MM-DD |
deadline | string | null | Earliest deadline for receipt of tenders, ISO 8601 with offset |
estimatedValue / currency | number | null, string | null | Estimated value of the procedure (sum of lots when only lots carry one) |
awardedValue / awardedCurrency | number | null, string | null | Awarded amount (award and modification notices only) |
winnerNames | string[] | Winning organisations (award notices) |
description | string | null | Procedure description in the original language, up to 2,000 characters |
url / pdfUrl | string | Notice page and PDF on ted.europa.eu |
source, scrapedAt | string | Attribution and extraction timestamp |
With includeDetails: true you also get lots[] (id, title, description, value, deadline per lot), submissionUrl, documentsUrl, buyerLegalType, frameworkAgreement, durationMonths and tendersReceived. With includeRaw: true the original API object is attached as raw.
Use cases
- Bid managers and sales teams at B2B suppliers (IT, construction, medical devices, consulting) get every new call for tenders in their CPV codes and countries each morning, with the deadline and estimated budget, instead of browsing TED by hand.
- Procurement and tender consultants build client alerts:
searchQueries+countries+onlyNewSinceLastRunon a daily Schedule, pushed to e-mail, Slack or a CRM through an Apify integration. - Market-intelligence and competitive-intelligence analysts pull contract award notices (
noticeTypes: "result") to see who wins which public contracts, at what value, in which country. - Public-sector researchers, journalists and NGOs monitor spending by buyer, CPV category or procedure type with a reproducible, citable extraction from the official source.
- AI agents and RAG pipelines call the Actor as an MCP tool ("find open tenders for cloud hosting in the Netherlands closing after December 1") and reason over structured results instead of PDFs.
Input
| Field | Type | Default | Description |
|---|---|---|---|
searchQueries | string[] | [] (prefill ["software"]) | Full-text phrases, OR-ed. TED searches in the notice language; add translations to widen. |
countries | string[] | [] = all | Buyer countries as ISO alpha-2 (DE, FR, ES…); alpha-3 accepted. |
cpvCodes | string[] | [] | CPV codes, hierarchical: 72000000 or just 72 (IT services), 45 (construction). |
noticeTypes | select | all | competition (calls for tenders), result (awards), planning, direct-award, modification. |
dateFrom / dateTo | date | – | Publication date bounds (YYYY-MM-DD). With no other filter, the last 7 days are used. |
onlyNewSinceLastRun | boolean | false | For schedules: only notices published since the previous run that were not delivered before (state in the named store hexadata-eu-tenders-ted). |
maxResults | integer | 100 | Hard cap on results and cost. Newest first. |
includeDetails | boolean | false | Per-lot data, submission/document URLs, duration, framework flag, tenders received. Same price. |
includeRaw | boolean | false | Attach the original TED API notice. |
proxyConfiguration | object | off | Not needed for TED (open API). |
Invalid input (unknown country code, malformed CPV or date) stops the run before the first request, so it costs nothing.
Output example
Two real items from the runs saved in tests/ (2026-10-27). A contract notice (noticeTypes: "competition", searchQueries: ["software"], countries: ["DE"]):
{"id": "745163-2026","title": "Germany – Software package and information systems – PolBln 423_26 EU Beschaffung Storagesystem","originalTitle": "PolBln 423_26 EU Beschaffung Storagesystem","language": "deu","buyerName": "Polizei Berlin","buyerCity": "Berlin","country": "DE","buyerCountry": "DEU","noticeType": "cn-standard","noticeTypeLabel": "Contract notice","formType": "competition","formTypeLabel": "Competition (call for tenders)","procedureType": "open","contractNature": "supplies","cpvCodes": ["48000000"],"mainCpv": "48000000","placeOfPerformance": ["DE300", "DEU"],"publishedAt": "2026-10-27","deadline": "2026-11-26T07:00:00+01:00","estimatedValue": 1680672.27,"currency": "EUR","awardedValue": null,"awardedCurrency": null,"winnerNames": [],"description": "Lieferung, Installation und Inbetriebnahme von zwei baugleichen Speichersystemen einschließlich aller erforderlichen Lizenzen sowie die Erbringung von Wartungs- und Supportleistungen.","url": "https://ted.europa.eu/en/notice/-/detail/745163-2026","pdfUrl": "https://ted.europa.eu/en/notice/745163-2026/pdf","source": "TED (Tenders Electronic Daily), Publications Office of the European Union","scrapedAt": "2026-10-27T05:11:29.991Z"}
A contract award notice with includeDetails: true (cpvCodes: ["72"], countries: ["FR", "ES"], noticeTypes: "result"):
{"id": "742656-2026","title": "France – Computer-related services – Acquisition d’une solution logicielle de gestion des essais cliniques pour les Pharmacies à Usage Intérieur et le Département d’Essais Cliniques de l’Agence Générale des Equipements et Produits de Santé","language": "fra","buyerName": "AGEPS DA","buyerCity": "PARIS","country": "FR","noticeType": "can-standard","noticeTypeLabel": "Contract award notice","formType": "result","procedureType": "open","contractNature": "services","cpvCodes": ["72500000", "72514200"],"mainCpv": "72500000","publishedAt": "2026-10-27","deadline": null,"estimatedValue": null,"awardedValue": 1959880,"awardedCurrency": "EUR","winnerNames": ["LOGHOSP"],"url": "https://ted.europa.eu/en/notice/-/detail/742656-2026","lots": [{ "id": "LOT-0001", "title": "Lot unique", "estimatedValue": null, "currency": null, "deadline": null }],"buyerLegalType": "body-pl-la","frameworkAgreement": "fa-wo-rc","tendersReceived": 4,"source": "TED (Tenders Electronic Daily), Publications Office of the European Union","scrapedAt": "2026-10-27T05:12:32.933Z"}
Pricing & cost examples
$5.00 per 1,000 tenders (pay per event, charged only for items saved to the dataset; duplicates, invalid notices and failed runs are never billed). maxResults is a hard cost cap and Apify platform usage is included.
- A first look:
maxResults: 50≈ $0.25. - A daily alert for IT tenders in 3 countries with
onlyNewSinceLastRun(typically 20–60 new notices per business day) ≈ $0.10–0.30 per day, about $5 per month. - A market study: every contract award notice in CPV 72 across the EU for one quarter (≈ 10,000 notices) ≈ $50.
Use with AI agents (MCP)
Every Apify Actor is available as a tool through the Apify MCP server. Add this server to Claude, Cursor, VS Code or any MCP client (OAuth sign-in on first use, or an Authorization: Bearer <APIFY_TOKEN> header):
{"mcpServers": {"apify": {"url": "https://mcp.apify.com?tools=hexadatalabs/eu-tenders-ted-scraper"}}}
Then ask, for example:
"Which contract notices for road maintenance were published in Poland and Czechia this week, and which ones close before December 15?"
The agent calls the Actor with {"searchQueries":["road maintenance"],"countries":["PL","CZ"],"noticeTypes":"competition","dateFrom":"2026-10-20"} and reads deadline, estimatedValue and url from the results. The Actor description and every input field start with "Use this when…" so tool selection works without extra prompting.
Pay with USDC (x402, no account needed)
AI agents can pay for this Actor directly with USDC through Apify's x402 support, with no Apify account: the agent buys a prepaid token from Apify AGI with a Coinbase Agentic Wallet (USDC on Base, minimum $1) and uses that token as a normal API token. This Actor runs with limited permissions, which is what makes it eligible. Current steps are in Apify's x402 guide:
npx -y awal auth login <email> && npx awal auth verify <code> # one-time wallet setup; then fund it with USDC and a little ETH on BaseTOKEN=$(npx awal x402 pay 'https://agi.apify.com/protocols/x402/prepaid-tokens?amount=1¤cy=usd' --max-amount 1000000 --json | jq -r .token)curl -s -X POST "https://api.apify.com/v2/acts/hexadatalabs~eu-tenders-ted-scraper/run-sync-get-dataset-items" \-H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \-d '{"searchQueries":["software"],"countries":["DE"],"noticeTypes":"competition","maxResults":50}'
Cost: $1 USDC ≈ 200 tenders at this Actor's price; the token balance is a hard spending cap, and the token expires 14 days after purchase.
API & integrations
curl -X POST "https://api.apify.com/v2/acts/hexadatalabs~eu-tenders-ted-scraper/run-sync-get-dataset-items?token=<APIFY_TOKEN>" \-H "Content-Type: application/json" \-d '{"searchQueries":["software"],"countries":["DE"],"noticeTypes":"competition","maxResults":50}'
from apify_client import ApifyClientclient = ApifyClient("<APIFY_TOKEN>")run = client.actor("hexadatalabs/eu-tenders-ted-scraper").call(run_input={"cpvCodes": ["72"], "countries": ["FR", "ES"], "noticeTypes": "result", "dateFrom": "2026-10-01", "maxResults": 200,})for tender in client.dataset(run["defaultDatasetId"]).iterate_items():print(tender["publishedAt"], tender["buyerName"], tender["awardedValue"], tender["winnerNames"], tender["url"])
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<APIFY_TOKEN>' });const run = await client.actor('hexadatalabs/eu-tenders-ted-scraper').call({searchQueries: ['cloud'], countries: ['NL', 'BE'], onlyNewSinceLastRun: true, maxResults: 500,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items.map((t) => `${t.deadline ?? 'no deadline'} · ${t.title}`).join('\n'));
Schedules and webhooks: create a Schedule in Apify Console (e.g. every weekday at 08:00 UTC; TED publishes on business days) with onlyNewSinceLastRun: true, then add a webhook or integration (e-mail, Slack, Google Sheets, Make, Zapier, HTTP) on the ACTOR.RUN.SUCCEEDED event. Each run delivers only the notices published since the previous one.
Limitations & legal
- Source: the official TED Search API v3 (
api.ted.europa.eu), which needs no key. The Actor sends one request per page of up to 250 notices, identifies itself with a User-Agent and waits between pages; no HTML is scraped. - Licence: TED content may be reused under the European Commission's reuse policy (Decision 2011/833/EU, Creative Commons Attribution 4.0). Keep the attribution in
sourcewhen you republish data: © European Union, https://ted.europa.eu. Hexadata is not affiliated with the Publications Office of the EU. - No personal data:
buyerNameandwinnerNamesare organisations. TED's contact-person names, e-mails and phone numbers are never requested. - Coverage: notices in TED's eForms format and the previous standard forms; TED publishes on business days, so a daily schedule sees new notices Monday to Friday. Corrigenda are returned as the latest version of a notice (
onlyLatestVersions). - Full-text search (
searchQueries) matches the notice text in its own language; the Englishtitleis TED's translated heading, so an English keyword finds English notices and the many notices whose title contains the term (e.g. "software"). Add local-language terms to widen a search. - Result window: TED serves up to 15,000 notices per query in page mode; above that the Actor switches to iteration mode automatically. Narrow by date or country for very large extractions.
- Values are returned as published by the buyer;
estimatedValuemay be absent for negotiated procedures, anddeadlineis the earliest lot deadline. - If TED changes its API response and three consecutive pages come back without the mandatory fields, the run fails with
SITE_LAYOUT_CHANGEDand nothing is charged.
Changelog
- 0.1.0 (2026-10-27): first release. Keyword, country, CPV, notice-type and date filters; incremental mode; lot details; dataset table view; MCP-ready descriptions.
Support
Open an issue in the Issues tab of this Actor (or e-mail Hexadata through the Apify profile). Issues are answered within 24 hours and confirmed bugs are fixed in a beta build within 48 hours.
En español
EU Tenders (TED) Scraper extrae licitaciones públicas europeas del diario oficial TED (Tenders Electronic Daily) mediante su API oficial: anuncios de licitación, adjudicaciones y anuncios previos filtrados por palabra clave, país del comprador, código CPV, tipo de aviso y fecha. Devuelve comprador, plazo, valor estimado, adjudicatario y enlace en JSON limpio, con modo incremental (onlyNewSinceLastRun) para alertas diarias. Precio: $5.00 por cada 1,000 resultados; maxResults limita el costo. Sin datos personales: compradores y adjudicatarios son organizaciones.