TED EU Public Tenders Scraper - Procurement Notices API avatar

TED EU Public Tenders Scraper - Procurement Notices API

Pricing

$2.00 / 1,000 tender notices

Go to Apify Store
TED EU Public Tenders Scraper - Procurement Notices API

TED EU Public Tenders Scraper - Procurement Notices API

Scrape EU public tenders from TED (Tenders Electronic Daily), the official EU procurement journal. Search government contracts, calls for tenders, RFPs and contract award notices by CPV code, country, buyer or keyword, newest first. Official CPV labels in 24 languages. JSON, CSV, Excel. No API key.

Pricing

$2.00 / 1,000 tender notices

Rating

0.0

(0)

Developer

Nexus Scrapers

Nexus Scrapers

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 hours ago

Last modified

Security

Limited permissions

Share

Search and export EU public tenders and procurement notices from TED (Tenders Electronic Daily), the official EU database of public contracts, as clean, normalized JSON, CSV or Excel. Filter by keyword, buyer country, CPV code, notice type, publication date, submission deadline, value and buyer name. Every CPV code comes with its official CPV 2008 label, in any of the 24 EU languages. No API key, no proxy and no browser needed. Pay only for the results you get.

The Actor uses the official TED Search API v3 run by the Publications Office of the European Union. Each result follows the same tender schema v1, designed so that other procurement sources (US SAM.gov, UK Contracts Finder, Italian ANAC) can be returned in the same format.

Who is it for

  • Bid managers and sales teams who need a daily list of open tenders in their sector (CPV) and countries, with deadline and estimated value.
  • Consultants, analysts and market researchers measuring public spending by buyer, country or sector, and tracking who wins contracts.
  • Suppliers and lead-generation teams looking for contracting authorities that regularly buy what they sell.
  • AI agents and MCP users: the dataset schema describes every field, so an agent can query EU tenders in natural language (see API, MCP and AI agents).

What you get

One dataset item per notice, with:

  • notice id, type (contract notice, prior information, contract award, modification, ...) and procedure type
  • title and short description in your preferred language (fallback: English, then original language)
  • buyer name, country, city and NUTS region, plus a normalized buyer type
  • all CPV codes with their official CPV 2008 label (24 EU languages), plus main CPV and its division
  • estimated value and currency, number of lots
  • publication date and submission deadline
  • for award notices: winners (name, country), awarded value and award date
  • place of performance, links to the TED page and to the HTML / PDF / XML versions

The full field reference is in ./SCHEMA.md and in the Actor's dataset schema (visible in the Apify UI and to AI agents using MCP).

Use cases

  • Bid monitoring: get new open tenders in your sector and countries every day (CPV + country + "deadline on or after today"), then schedule the Actor and send the dataset to Slack, email or a spreadsheet.
  • Market research: measure how much a buyer, country or sector spends, which procedures it uses and how often it publishes.
  • Competitor and award tracking: list contract award notices with the winning companies and awarded values.
  • Lead generation for suppliers: find buyers that regularly purchase what you sell.
  • AI agents (MCP): the dataset schema describes every field, so an agent can query tenders in natural language through the Apify MCP server.

Input

All filters are optional and are combined with AND.

FieldDescription
keywordsFree-text words or phrases (OR between items)
buyerCountriesISO 3166-1 alpha-2 codes, e.g. IT, DE
cpvCodesCPV codes with prefix matching: 72 or 72000000 = all IT services
noticeTypescontract-notice, prior-information, contract-award, contract-modification, voluntary-ex-ante, other
daysBackPublished in the last N days (default 7; 0 = no limit)
publicationDateFrom / publicationDateToExplicit date range, YYYY-MM-DD
deadlineAfterSubmission deadline on or after this date
minValue / maxValueValue range in the notice currency (no conversion)
buyerNameWord(s) contained in the buyer name
maxItemsMaximum results (default 20, maximum 15,000, newest first)
preferredLanguageLanguage of titles/descriptions, e.g. en, it, fr
cpvLabelLanguageLanguage of the CPV labels in cpvCodes[].label: any of the 24 EU languages, default en (falls back to English)
expertQueryAdvanced: a raw TED expert query. Replaces all filters above

Example: by CPV code and country - open IT-services tenders in Italy and Germany

{
"noticeTypes": ["contract-notice"],
"buyerCountries": ["IT", "DE"],
"cpvCodes": ["72"],
"daysBack": 14,
"deadlineAfter": "2026-11-15",
"maxItems": 100
}

Example: by keyword - solar tenders in France, CPV labels in French

{
"keywords": ["solar panels", "photovoltaic", "panneaux solaires"],
"buyerCountries": ["FR"],
"daysBack": 30,
"cpvLabelLanguage": "fr",
"maxItems": 50
}

Example: by date range

{
"publicationDateFrom": "2026-01-01",
"publicationDateTo": "2026-03-31",
"buyerCountries": ["ES"],
"cpvCodes": ["45"],
"maxItems": 500
}

Example: awards only - who won contracts above 1 million EUR in Italy

{
"noticeTypes": ["contract-award"],
"buyerCountries": ["IT"],
"daysBack": 30,
"minValue": 1000000,
"maxItems": 200
}

Example: advanced expert query

{
"expertQuery": "buyer-country=FRA AND classification-cpv=45* AND publication-date>=today(-30)",
"maxItems": 50
}

Output example

Trimmed real record (contract notice published on TED in October 2026). mainCpvDivision is the name of the 2-digit CPV division, cpvCodes[].label the official label of each code:

{
"schemaVersion": "1.0",
"source": "TED",
"sourceId": "745164-2026",
"url": "https://ted.europa.eu/en/notice/-/detail/745164-2026",
"documentUrls": {
"html": "https://ted.europa.eu/it/notice/745164-2026/html",
"pdf": "https://ted.europa.eu/it/notice/745164-2026/pdf",
"xml": "https://ted.europa.eu/en/notice/745164-2026/xml"
},
"noticeType": "contract-notice",
"noticeTypeCode": "cn-standard",
"procedureType": "open",
"contractNature": "services",
"title": "GARA EUROPEA A PROCEDURA APERTA AI SENSI DELL'ART. 71 DEL D.LGS. N. 36/2023, PER L'AFFIDAMENTO PER IL SERVIZIO DI UPGRADE EVOLUTIVO DI LICENZE, SERVER, LIBRERIE E STORAGE HPE ...",
"language": "it",
"buyer": {
"name": "IZSAM - Istituto Zooprofilattico Sperimentale dell Abruzzo e del Molise G. Caporale",
"country": "IT",
"city": "Teramo",
"nutsCode": "ITF12",
"buyerType": "public-body"
},
"cpvCodes": [{ "code": "72500000", "label": "Computer-related services" }],
"mainCpv": "72500000",
"mainCpvDivision": "IT services: consulting, software development, Internet and support",
"estimatedValue": { "amount": 700000, "currency": "EUR" },
"lots": 1,
"publicationDate": "2026-10-27",
"submissionDeadline": "2026-11-27T12:00:00+01:00",
"awardInfo": null,
"placeOfPerformance": { "country": "IT", "city": "Teramo", "nutsCode": "ITF12" },
"scrapedAt": "2026-11-03T20:16:33+00:00"
}

Pricing

Pay only for the results you get. Set Maximum results (and the run's maximum cost) to control spending: the Actor stops as soon as either limit is reached. Runs that find no notices return no results and charge nothing. See the Pricing tab of this Actor for the current price.

API, MCP and AI agents

Every Apify Actor can be called over the API, and this one is also available as a tool for AI agents.

Apify API (Python)

from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("nexus-scrapers/ted-eu-tenders").call(run_input={
"cpvCodes": ["72"], "buyerCountries": ["IT"], "daysBack": 7, "maxItems": 50,
})
for tender in client.dataset(run["defaultDatasetId"]).iterate_items():
print(tender["publicationDate"], tender["buyer"]["name"], tender["title"])

Apify API (JavaScript)

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('nexus-scrapers/ted-eu-tenders').call({ keywords: ['cybersecurity'], maxItems: 50 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();

MCP and AI agents. Apify exposes Actors as MCP tools through the Apify MCP server. Add https://mcp.apify.com (with ?actors=nexus-scrapers/ted-eu-tenders to load this Actor directly) to Claude, ChatGPT-compatible clients, Cursor, VS Code or any MCP client, authorize with your Apify account, and ask in plain language, for example: "List open IT-services tenders in Germany with a deadline after 1 December, with CPV labels". The input and dataset schemas tell the agent every parameter and output field, and results are ready to be summarized, filtered or loaded into a spreadsheet. Also works with LangChain, LlamaIndex, CrewAI and n8n through the Apify integrations.

FAQ

What is a CPV code? The Common Procurement Vocabulary (CPV) is the EU's standard classification of what is being bought (for example 72000000 = IT services, 45000000 = construction work). Filters match by prefix: 72 matches every IT-services code. The Actor adds the official label for every code and can write it in any of the 24 EU languages (cpvLabelLanguage).

Do I need a TED API key? No. The TED Search API allows anonymous access to published notices.

Are the notices translated? No. Titles and descriptions are written by the buyers in their own language. When a notice contains several languages, the Actor picks your preferred language, then English, then any. Buyer countries, notice types and procedure types are normalized to English codes.

How fresh is the data? The Actor queries TED live, so new notices appear as soon as TED publishes them; the publication date of each notice is in the output.

Why are some fields null? TED notices differ by form and age. Older notices (before the eForms rollout in 2023) often lack lots, NUTS codes, deadlines in structured form or descriptions. Award notices have no estimated value and open tenders have no awardInfo.

Is the value in euros? The value is given in the currency of the notice (estimatedValue.currency). No conversion is applied.

How many results can I get? Up to 15,000 per run. Larger exports should be split by date range.

Can I get the full text of the tender documents? No. The Actor returns the notice data and links to the notice in HTML, PDF and XML. Tender documents are hosted by each buyer's procurement platform.

Data source, attribution and terms

Data comes from TED, provided by the Publications Office of the European Union. According to the TED legal notice, unless otherwise noted, procurement notices published in the Supplement to the Official Journal of the European Union can be freely reused for commercial or non-commercial purposes, under the Commission's reuse policy (Commission Decision of 12 December 2011 on the reuse of Commission documents). Please credit TED / European Union as the source and indicate if you modified the data. CPV labels come from the Common Procurement Vocabulary (CPV 2008, Regulation (EC) No 213/2008) published by the Publications Office of the European Union through EU Vocabularies; reuse is permitted with acknowledgement of the source (see the Publications Office copyright notice), and the data is bundled here unmodified except for whitespace normalisation. This Actor is an independent tool and is not affiliated with or endorsed by the European Union. Notices may contain names of natural persons acting as contacts or sole traders; handle such data in line with GDPR.

Limitations

  • Only notices published on TED are covered; national procurement below EU thresholds is usually not on TED.
  • The free-text search, buyer-name filter and value filters rely on TED's own indexing; the value filter uses the notice's total value and does not compare across currencies.
  • Winner country is filled only when it can be paired reliably with the winner name.
  • CPV labels follow CPV 2008; a code that is not in CPV 2008 (for example a typo in a notice) gets label: null.
  • Submission deadline is the earliest deadline among the lots.
  • The TED API occasionally returns temporary 5xx errors; the Actor retries with backoff, but a run can still fail if TED is down for several minutes.