How to use it: 3 steps
- Make a free Apify accountApify is the cloud platform where our tools run. The free plan gives you $5 of usage every month, no credit card needed. You pay Apify, not us.
- Paste your input and press StartNo code needed: you fill in a form (the input). It already has a working example. For example:
72000000in CPV codes. Each start is one run. - Download the resultsWhen the run ends, the results are in a table (the dataset). Open Output, press Export and pick Excel or CSV. JSON and the API are there too.
This tool is an Apify Actor: a small program that runs on Apify. You can also run it on a schedule, for example every Monday. New to it? Read how it works, step by step and the 8 words you need first.
What it does
EU TED Tenders Scraper & Monitor searches public tender notices on TED (Tenders Electronic Daily, the EU's official journal for public procurement) by publication date, CPV code, buyer country, notice type and keywords, and saves one clean row per notice: title, buyer, deadline with time zone, estimated value with currency, lots and direct TED links.
- search — returns every matching notice in the date window, newest first, up to
maxResults. - monitor — returns only notices that earlier runs of the same monitor did not deliver yet. Schedule it every day and you get only new tenders.
Good for
- Sales and bid teams who want new contract notices for their CPV codes and countries every morning.
- Market research on who buys what in the EU: award notices with values and currencies.
- Lead generation: buyer name, country, city and website for each tender.
Not a good fit
- Full tender documents. The Actor gives
procurementDocumentsUrl,pdfUrlandxmlUrl, but does not download them. - Personal contacts. E-mail addresses and phone numbers are not in the output; e-mails inside descriptions are replaced with
[e-mail removed]. - Very old archives in one run. One run covers at most 31 days.
Who uses it
Bid and sales teams
Get new contract notices for your CPV codes each day.
Market researchers
See who buys what in the EU, with award values.
Consultants
Build lists of public buyers by country and city.
Price
Pay per event: you pay for each result the tool saves, plus a small start fee for each run. The price includes Apify platform costs. Apify bills you, not us. Prices below are for the Apify free plan.
| What you pay for | Price | When |
|---|---|---|
| Start fee | $0.01 | Charged once per run. This tool uses 1 GB of memory or less by default; more memory costs more. |
| Notice record | $0.0035 | One TED notice saved to the Dataset. Runs with no matches and monitor runs with no new notices save no records. |
Examples
- One tender notice: about $0.01.
- 1,000 tender notices: about $3.51.
- Every day 100 tender notices, for 30 days: about $10.80 a month.
Free to try: the Apify free plan gives you $5 of usage every month, no credit card needed. That is enough for about 1,400 tender notices.
Prices checked on 24 October 2026. See the current price on Apify.
Questions
Do I need a TED account or API key?
No. The tool uses the public TED Search API without a key.
Does it download the tender documents?
No. It gives you links to the documents, PDF and XML. You open them yourself.
Why do I see one procedure many times?
A procedure can have several notices, like a correction or an award. Each notice is one row.
When does TED publish new notices?
TED publishes on working days, Monday to Friday.
Is this an official TED product?
No. This Actor is not affiliated with or endorsed by the Publications Office of the European Union. Source: TED — Tenders Electronic Daily, Publications Office of the European Union, reused under the Commission's reuse decision 2011/833/EU. Always check the official notice before you bid. Each row links to the official notice on ted.europa.eu.
How fresh is the data?
Each run reads TED live, so you get what TED shows at that moment. TED publishes new notices on working days (Monday–Friday).
Why are there several rows with the same procedure?
A procedure can have several notices: a contract notice, corrections, an award notice. Each notice is its own row; procedureId connects them.
What is a CPV code?
The Common Procurement Vocabulary is the EU code list for what is bought. You can search codes on SIMAP.
Details
Step by step on Apify
- Open the Input tab. The form is already filled: CPV
72000000, last 7 days, 20 notices. - Optional: add buyer countries, for example
DEUandFRA, or choose a notice type such ascn-standard. - Click Start.
- Open the Output tab and look at the Overview view: title, buyer, country, deadline, value and link.
Use cases
| Task | Input | Key fields | Next step |
|---|---|---|---|
| Find open tenders to bid on | cpvCodes, buyerCountries, noticeTypes: ["cn-standard"] | title, tenderDeadline, estimatedValue, procurementDocumentsUrl | Send to a sheet or CRM |
| Daily tender alerts | mode: "monitor", schedule | monitorStatus, title, noticeUrl | Slack or e-mail via integrations |
| Market and competitor research | noticeTypes: ["can-standard"], dateFrom/dateTo | buyerName, totalValue, totalValueCurrency, cpvCodes | Export to CSV or BI |
| Public-sector lead lists | buyerCountries, cpvCodes | buyerName, buyerCity, buyerWebsite | Enrich in your CRM |
Tips for better results
- Use monitor mode on a daily schedule. You get only notices you have not seen.
- One run covers up to 31 days. Use several runs for longer periods.
- Always open the official TED link and check the notice before you bid.
Limits and good to know
- Window: at most 31 days per run. For longer periods, run once per month
- Rows: at most 2,500 rows per run (
maxResults). In our tests 2,500 rows took about 25 seconds - TED query window: TED serves only the first 15,000 notices of one query. A monitor run with very broad filters stops there with status
PARTIALand a warning; narrow the filters or uselastDaysof 1–3 - Run time: the Actor stops reading TED after about 4 minutes and keeps the rows it has (
PARTIAL) - Values as published: deadlines keep the time zone offset that TED publishes, even if it looks unusual. An
estimatedValueof0means the buyer published 0; a missing value isnull - Languages: buyer names and descriptions are often only in the original language. The
…Languagefields tell you which language you got - No personal contacts: contact e-mails and phone numbers are not returned
For developers
Sample result
One result from a real test run, in JSON. Real values change from run to run. In Excel or CSV each field is a column.
{
"publicationNumber": "700154-2026",
"procedureId": "c8e5ed0b-9c1a-4c7b-b32a-130c6ceda6a4",
"noticeType": "cn-standard",
"formType": "competition",
"procedureType": "open",
"publicationDate": "2026-10-09",
"title": "Germany – IT services: consulting, software development, Internet and support – Wartungleistungen von Server- und Storagesystemen sowie Switchen",
"titleLanguage": "ENG",
"buyerName": "Land Hessen, vertreten durch die Hessische Zentrale für Datenverarbeitung",
"buyerNameLanguage": "DEU",
"buyerCountry": "DEU",
"buyerCity": "Wiesbaden",
"buyerWebsite": "https://vergabe.hessen.de",
"mainCpvCode": "72000000",
"tenderDeadline": "2026-11-09T10:00:00+01:00",
"tenderDeadlineDateOnly": false,
"requestDeadline": null,
"estimatedValue": 345600,
"estimatedValueCurrency": "EUR",
"estimatedValueSource": "procedure",
"lotsCount": 1,
"lotIds": ["LOT-0000"],
"noticeUrl": "https://ted.europa.eu/en/notice/-/detail/700154-2026",
"pdfUrl": "https://ted.europa.eu/en/notice/700154-2026/pdf",
"xmlUrl": "https://ted.europa.eu/en/notice/700154-2026/xml",
"linkLanguage": "ENG",
"dataModel": "eforms",
"monitorStatus": null,
"source": "TED",
"fetchedAt": "2026-10-11T02:17:31.898Z"
}Use it from code
Actor ID: cliqtomedia/eu-ted-tenders-scraper. You need your Apify API token from Apify Console → Settings → API & Integrations.
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("cliqtomedia/eu-ted-tenders-scraper").call(run_input={
"mode": "search",
"lastDays": 7
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item)curl -X POST "https://api.apify.com/v2/acts/cliqtomedia~eu-ted-tenders-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"mode": "search", "lastDays": 7}'# pip install langchain-apify
# set APIFY_TOKEN in your environment
from langchain_apify import ApifyActorsTool
tool = ApifyActorsTool("cliqtomedia/eu-ted-tenders-scraper")
result = tool.invoke({"run_input": {"mode": "search", "lastDays": 7}})
print(result)The cURL call waits for the results, up to 300 seconds. For longer runs, start a run (/runs) and get the results with a webhook or by checking the run. Apify API docs. LlamaIndex, MCP for AI agents and the JavaScript client: AI agents & MCP.
Data fields (40)
| Field | Type | Meaning |
|---|---|---|
publicationNumber | string | TED publication number, e.g. 674231-2026. One row per published notice; a corrected or changed notice is a new row with its own number. |
noticeId | string | eForms notice identifier (UUID). Null for legacy notices published before eForms. |
noticeVersion | integer | eForms notice version (1, 2, …). Null for legacy notices. |
procedureId | string | eForms procedure identifier (UUID) shared by all notices of one procedure. A procedure is not a notice: several rows can share it. |
isChangeNotice | boolean | True when this notice changes an earlier notice (eForms change notice). |
changesNotice | string | Which notice this one changes, as given by TED: a publication number (657981-2026) or an eForms notice id with version suffix. |
changeReasonCode | string | TED change reason code, e.g. cor-buy (buyer correction), cor-pub, update-add. |
noticeType | string | eForms notice type, e.g. cn-standard (contract notice), can-standard (award), pin-only (prior information), corr (legacy correction). |
noticeSubtype | string | eForms notice subtype number (1–40, E1–E6) as published. |
formType | string | eForms form type: planning, competition, result, dir-awa-pre, cont-modif, change, consultation. |
procedureType | string | Procedure type code, e.g. open, restricted, neg-w-call. Null when TED gives none. |
publicationDate | string | Publication day in the Official Journal S (YYYY-MM-DD, as published, not shifted to UTC). |
publicationDateRaw | string | Publication date exactly as TED returns it, with its time zone offset, e.g. 2026-10-01+02:00. |
dispatchDate | string | Day the buyer sent the notice to TED (YYYY-MM-DD). |
ojsNumber | string | Official Journal S issue, e.g. 190/2026. |
title | string | Notice title in the preferred language, or the fallback shown in titleLanguage. |
titleLanguage | string | Language of title (ISO 639-2, e.g. ENG). Differs from preferredLanguage when TED had no translation. |
originalTitle | string | Short procedure title in the buyer's original language. |
description | string | Procedure description in the preferred language or the fallback in descriptionLanguage, cut at 4,000 characters. Usually only in the original language. |
descriptionLanguage | string | Language of description (ISO 639-2). |
buyerName | string | Buyer (contracting authority) name. TED publishes it only in the original language, so buyerNameLanguage often differs from preferredLanguage. |
buyerNameLanguage | string | Language of buyerName (ISO 639-2). |
buyerNames | array | All buyer names of a joint procurement, in the same language as buyerName. |
buyerCountry | string | Buyer country, ISO 3166-1 alpha-3 (e.g. DEU). |
buyerCountries | array | All buyer countries (alpha-3), for joint cross-border procurements. |
buyerCity | string | Buyer city as published. |
buyerWebsite | string | Buyer organisation website as published in TED; some buyers give a bare domain without https://. Not a personal contact. |
cpvCodes | array | All CPV codes of the procedure and its lots, without duplicates (8 digits, no check digit). |
mainCpvCode | string | Main CPV code of the procedure. |
placeOfPerformanceCountries | array | Countries of performance (alpha-3), when published. |
tenderDeadline | string | Earliest deadline for tenders across lots, ISO 8601 with the published offset, e.g. 2026-11-04T10:00:00+01:00. Only the date when TED gives no time (see tenderDeadlineDateOnly). Null when the notice has no tender deadline (e.g. award or prior information notices). |
tenderDeadlineDateOnly | boolean | True when TED gave a deadline day without a time. Null when there is no deadline. |
requestDeadline | string | Earliest deadline for requests to participate (restricted and negotiated procedures): ISO 8601 date-time with the offset published by TED, or a YYYY-MM-DD date when TED gives no time. |
estimatedValue | number | Estimated value without VAT: the procedure estimate, or the sum of lot estimates when all lots have one in the same currency (see estimatedValueSource). Null when not published — never 0 as a placeholder. |
estimatedValueCurrency | string | Currency of estimatedValue (ISO 4217, e.g. EUR, CZK). |
estimatedValueSource | string | procedure = published procedure estimate; lots_sum = sum of the lot estimates. |
totalValue | number | TED total value: for award notices the total awarded value, for other notices the total published value. Null when absent or published in several currencies. |
totalValueCurrency | string | Currency of totalValue. |
lotsCount | integer | Number of lots in the notice (0 for legacy notices without lot data). |
lotIds | array | Lot identifiers, e.g. LOT-0001. A lot is part of the notice, never its own row. |
Input settings (11)
The main fields of the input form. With the API you send them as JSON.
| Setting | Name in the API | Type | Example value |
|---|---|---|---|
| Mode | mode | string | "search" |
| Last N days | lastDays | integer | 7 |
| Date from | dateFrom | string | |
| Date to | dateTo | string | |
| CPV codes | cpvCodes | array | ["72000000"] |
| Buyer countries | buyerCountries | array | |
| Notice types | noticeTypes | array | |
| Keywords | keywords | string | |
| Preferred language | preferredLanguage | string | "ENG" |
| Max results | maxResults | integer | 20 |
| Monitor name | monitorStateName | string | "default" |
Use cases with this tool
Each guide shows all the steps and the other tools.
