EU TED Tenders Scraper & Monitor
Pricing
from $3.50 / 1,000 notice records
EU TED Tenders Scraper & Monitor
Search and monitor EU public tenders from TED (Tenders Electronic Daily) by date, CPV code, buyer country and notice type. Deadlines with time zone, estimated values with currency, lots and direct notice links; monitor mode returns only new notices.
Pricing
from $3.50 / 1,000 notice records
Rating
0.0
(0)
Developer
Cliqto Media
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
14 days ago
Last modified
Categories
Share
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.
Use it to find new EU tenders for your sales team, track a market every day, or feed tender data into a CRM or AI agent. The smallest run takes a few seconds: CPV code 72000000 (IT services), the last 7 days, 20 notices.

Table of contents
- What it does
- What data you get
- Quick start
- Input
- Input examples
- Output
- Pricing
- Use cases
- Monitoring and schedules
- API, integrations and AI agents (MCP)
- Limits and partial results
- Troubleshooting
- FAQ
- Related Actors
- Support
What it does
The Actor sends your filters to the public TED Search API and turns each published notice into one flat Dataset row. It works in two modes:
- 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.
It reads only public notice data. It does not log in, does not download PDF or XML files (it gives you the links), and does not collect personal contact data.
Good fit
- 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 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.
What data you get
One row = one published TED notice. For each notice you get:
- Identity: publication number, eForms notice ID and version, procedure ID, notice type, form type, procedure type, change-notice links.
- Text: title, description and buyer name, each with the language that was actually used.
- Buyer: name, all buyer names, country, city, website.
- Dates: publication date, dispatch date, tender deadline and request-to-participate deadline with the time zone offset that TED publishes.
- Money: estimated value and total value, each with its currency. A value that TED does not publish is
null, never0. - Scope: main CPV code, all CPV codes, lots, places of performance, official languages.
- Links: TED notice page, PDF, XML and the buyer's procurement documents page.
Quick start
- 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.
Expected result: up to 20 IT-services notices from the last 7 days, newest first. A run like this took 1–4 seconds in our tests.
Input
All fields are optional. With an empty input the Actor returns the newest 100 notices of the last 7 days for all CPV codes and countries.
| Field | Type | Default / prefill | Allowed values | What it changes | Recommendation |
|---|---|---|---|---|---|
mode | string | default search | search, monitor | search: every match. monitor: only notices not delivered by earlier runs of the same monitor. | Use monitor for daily schedules. |
lastDays | integer | default 7, prefill 7 | 1–31 | Publication window: the last N calendar days (UTC), including today. Used when dateFrom is empty. | 1–3 for a daily monitor; 7 or more for a one-off search (TED does not publish at weekends). |
dateFrom | string | none | YYYY-MM-DD | First publication day, inclusive. Overrides lastDays. | Use for a fixed period. |
dateTo | string | today | YYYY-MM-DD | Last publication day, inclusive. Works only together with dateFrom. | The window from dateFrom to dateTo must be 31 days or less. |
cpvCodes | array of strings | prefill ["72000000"] | up to 50 codes, 8 digits | Only notices with these CPV codes or their sub-codes. A -N check digit is ignored. Empty: all codes. | Use a broad code (e.g. 45000000 construction) to get all sub-codes. |
buyerCountries | array of strings | empty | up to 60 ISO alpha-3 codes | Only buyers from these countries. Two-letter EU codes like DE are converted. Empty: all countries. | DEU, FRA, POL, … |
noticeTypes | array of strings | empty | 20 eForms types | Only these notice types. Empty: all types. | cn-standard for open calls; add can-standard for award results. |
keywords | string | empty | up to 200 characters | Full-text search in all languages of the notice. Quotes, brackets and operators are removed. | Short phrases such as cloud computing. |
preferredLanguage | string | ENG | 24 EU languages | Language for title, description and links. If TED has no text in it, the row falls back to English, then to the original language. | Your team's language. |
maxResults | integer | default 100, prefill 20 | 1–2500 | Maximum rows per run, newest first. Each row is one paid notice event. | Keep it low for tests; raise for full exports. |
monitorStateName | string | default | a-z, 0-9, -, 1–40 characters | Monitor mode only: the name of the saved list of delivered notices. | One name per saved search, e.g. it-services-de. |
How settings work together
- Different filters are combined with AND: CPV and country and notice type and keywords. Several values inside one filter are combined with OR.
dateFromwins overlastDays. WhendateTois empty, it is today.- In monitor mode
maxResultslimits how many new notices one run delivers. If there are more, the rest comes in the next run, without repeats. - Invalid input (for example a 45-day window) stops the run before any request with status
INVALID_INPUT. Codes that TED rejects (for example an unknown country) give the same status.
Input examples
New IT tenders in Germany and Austria
{"lastDays": 3,"cpvCodes": ["72000000"],"buyerCountries": ["DEU", "AUT"],"noticeTypes": ["cn-standard"],"maxResults": 100}
Expected output: open contract notices with title, buyer, tenderDeadline, estimatedValue and noticeUrl.
Daily monitor for construction tenders in France, in French
{"mode": "monitor","lastDays": 3,"cpvCodes": ["45000000"],"buyerCountries": ["FRA"],"preferredLanguage": "FRA","maxResults": 500,"monitorStateName": "construction-fr"}
Expected output: the first run returns all matches; later runs return only new notices with monitorStatus: "new". A run without new notices ends with status NO_NEW and 0 rows.
Award results for a fixed month
{"dateFrom": "2026-09-01","dateTo": "2026-09-30","cpvCodes": ["48000000"],"noticeTypes": ["can-standard"],"maxResults": 1000}
Expected output: award notices with totalValue and totalValueCurrency (the awarded total, when TED publishes it).
Output
Each row is one TED notice. The Dataset has two views: Overview (the main columns) and Details (the key fields). Every field listed below is in the JSON, CSV and Excel exports. The run summary is saved as RUN_SUMMARY in the run's key-value store.
Output example
A real row from a run with CPV 72000000 and preferredLanguage: "ENG" (trimmed: description and some identifiers removed):
{"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"}
null means TED did not publish this value for the notice. It never means zero.
Output fields
| Field | Type | Can be empty? | Example | Meaning |
|---|---|---|---|---|
publicationNumber | string | no | 700154-2026 | TED publication number. One row per notice; a changed notice is a new row with its own number. |
noticeId | string | yes (legacy notices) | UUID | eForms notice identifier. |
noticeVersion | integer | yes (legacy) | 1 | eForms notice version. |
procedureId | string | yes | UUID | Procedure identifier. Several notices can belong to one procedure. |
isChangeNotice | boolean | no | false | True when the notice changes an earlier notice. |
changesNotice | string | yes | 657981-2026 | Which notice this one changes. |
changeReasonCode | string | yes | cor-buy | TED change reason code. |
noticeType | string | yes | cn-standard | eForms notice type (contract notice, award, prior information, …). |
noticeSubtype | string | yes | 16 | eForms subtype as published. |
formType | string | yes | competition | planning, competition, result, change, … |
procedureType | string | yes | open | Procedure type code. |
publicationDate | string | yes | 2026-10-09 | Publication day in the Official Journal S. |
publicationDateRaw | string | yes | 2026-10-09+02:00 | Publication date exactly as TED returns it. |
dispatchDate | string | yes | 2026-10-08 | Day the buyer sent the notice to TED. |
ojsNumber | string | yes | 196/2026 | Official Journal S issue. |
title | string | yes | see example | Title in the preferred language or the fallback. |
titleLanguage | string | yes | ENG | Language actually used for title. |
originalTitle | string | yes | Wartungleistungen … | Short title in the buyer's original language. |
description | string | yes | text | Procedure description, cut at 4,000 characters; e-mails removed. |
descriptionLanguage | string | yes | DEU | Language actually used for description. |
buyerName | string | yes | Land Hessen, … | Buyer name. TED usually has it only in the original language. |
buyerNameLanguage | string | yes | DEU | Language of buyerName. |
buyerNames | array | can be [] | ["Land Hessen, …"] | All buyers of a joint procurement. |
buyerCountry | string | yes | DEU | Buyer country, ISO alpha-3. |
buyerCountries | array | can be [] | ["DEU"] | All buyer countries. |
buyerCity | string | yes | Wiesbaden | Buyer city. |
buyerWebsite | string | yes | https://vergabe.hessen.de | Buyer organisation website as published; sometimes a bare domain. |
cpvCodes | array | can be [] | ["72000000"] | All CPV codes of the procedure and its lots. |
mainCpvCode | string | yes | 72000000 | Main CPV code. |
placeOfPerformanceCountries | array | can be [] | ["DEU"] | Countries of performance, when published. |
tenderDeadline | string | yes | 2026-11-09T10:00:00+01:00 | Earliest deadline for tenders across lots, with the offset that TED publishes. Null when the notice has none (for example award notices). |
tenderDeadlineDateOnly | boolean | yes | false | True when TED gave only a day, no time. |
requestDeadline | string | yes | YYYY-MM-DDThh:mm:ss+hh:mm or YYYY-MM-DD | Earliest deadline for requests to participate (restricted and negotiated procedures). |
estimatedValue | number | yes | 345600 | Estimated value without VAT. Null when not published. |
estimatedValueCurrency | string | yes | EUR | Currency of estimatedValue. |
estimatedValueSource | string | yes | procedure | procedure or lots_sum (sum of lot estimates in one currency). |
totalValue | number | yes | 345600 | Total value from TED; for award notices the awarded total. |
totalValueCurrency | string | yes | EUR | Currency of totalValue. |
lotsCount | integer | no | 1 | Number of lots (0 for legacy notices). |
lotIds | array | can be [] | ["LOT-0000"] | Lot identifiers. |
officialLanguages | array | can be [] | ["DEU"] | Languages the notice was published in. |
procurementDocumentsUrl | string | yes | URL | Where the buyer publishes the tender documents. |
noticeUrl | string | no | URL | Notice page on ted.europa.eu. |
pdfUrl | string | yes | URL | PDF of the notice (link only). |
xmlUrl | string | yes | URL | eForms XML of the notice (link only). |
linkLanguage | string | yes | ENG | Language of noticeUrl and pdfUrl. |
dataModel | string | no | eforms | eforms or legacy (older notices have fewer identifiers). |
monitorStatus | string | yes | new | new in monitor mode; null in search mode. |
source | string | no | TED | Data source. |
fetchedAt | string | no | ISO date-time | When the Actor read the notice. |
Run status
The run summary (RUN_SUMMARY) and the run status message show one of these statuses:
| Status | Meaning | Rows |
|---|---|---|
COMPLETE | All matches were returned. | all matches |
CAPPED | More matches exist; maxResults stopped the run. | maxResults |
NO_RESULTS | TED answered, but nothing matches the filters. | 0 |
NO_NEW | Monitor mode: nothing new since the last run. | 0 |
PARTIAL | Some pages were read, then TED timed out or the run deadline came. Saved rows stay. | some |
CHARGE_LIMIT | Your maximum cost per run was reached. | some |
CANCELLED | The run was aborted. Saved rows stay. | some |
INVALID_INPUT | Input or filters are not valid. The run fails. | 0 |
ERROR | TED was not reachable or answered with an error before any row. The run fails; it is never shown as an empty success. | 0 |
Pricing
This Actor uses pay-per-event pricing. You pay only these events; platform usage is included.
| Event | Price | When |
|---|---|---|
| Actor start | $0.01 | Once per run (the Actor runs on 256 MB, so it is always one start event). |
| Notice record | $0.0035 | For each notice saved to the Dataset. |
| Scenario | Rows | Total price |
|---|---|---|
| Test run (prefill) | 20 | $0.08 |
| Daily search | 100 | $0.36 |
| Large export | 1,000 | $3.51 |
| Maximum run | 2,500 | $8.76 |
| Filter with no matches | 0 | $0.01 |
| Monitor run with no new notices | 0 | $0.01 |
A failed or invalid run costs the start event, plus the notices that were saved before the stop. Use the Maximum cost per run setting to cap spending: the Actor stops before a row that would go over the limit (status CHARGE_LIMIT).
Use cases
| Job | 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 |
Monitoring and schedules
- Set
modetomonitorand give the search amonitorStateName, for exampleit-services-de. - Keep
lastDaysat 1–3 so the window always covers the time since the last run. - Create a schedule in Apify (for example every working day at 08:00 UTC). TED publishes on working days.
The first run returns all current matches. The Actor saves the publication numbers it delivered in your named key-value store eu-ted-tenders-monitor. Each later run returns only notices with new publication numbers. If TED is down, the run fails with ERROR and the saved list is not changed, so you do not lose or repeat notices. Use a different monitorStateName for each saved search.
API, integrations and AI agents (MCP)
- API: start a run with
POST https://api.apify.com/v2/acts/cliqtomedia~eu-ted-tenders-scraper/runsand the input JSON, then read the Dataset items. See the API tab for ready code in JavaScript, Python and cURL. - Export: JSON, CSV, Excel, XML or HTML from the Output tab or the Dataset API.
- Schedules and webhooks: use Apify schedules for daily monitors and webhooks or integrations (Make, Zapier, Slack, Google Sheets) to send new rows.
Use with AI agents (MCP)
- MCP server URL with only this Actor:
https://mcp.apify.com?tools=cliqtomedia/eu-ted-tenders-scraper - Smallest useful input (same as the prefill):
{ "lastDays": 7, "cpvCodes": ["72000000"], "maxResults": 20 }
- Key output fields:
title(what is bought),buyerNameandbuyerCountry(who buys),tenderDeadline(when offers are due, with time zone),estimatedValuewithestimatedValueCurrency(how much,nullif not published),noticeUrl(official notice page). - Typical run: 1–10 seconds for up to 1,000 rows. Cost: $0.01 per run plus $0.0035 per row. Limits: 31-day window, 2,500 rows per run.
Limits and partial results
- 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.
Troubleshooting
The run finished with 0 rows
Check the status message. NO_RESULTS means TED has no notice for these filters in this window: try a broader CPV code, more countries or a longer lastDays. NO_NEW in monitor mode means nothing new since the last run. An outage is never shown as 0 rows: it ends with ERROR.
The run failed with INVALID_INPUT
The message names the field. Common reasons: the date window is longer than 31 days, dateFrom is after dateTo, a CPV code does not have 8 digits, or TED did not accept a country code.
The run failed with ERROR
TED was not reachable or returned a server error. Wait a few minutes and start the run again. In monitor mode the saved list was not changed.
The title is not in my language
TED does not translate every notice. The row falls back to English, then to the original language, and titleLanguage shows which one you got.
FAQ
Do I need a TED account or API key?
No. The Actor uses the public anonymous TED Search API.
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.
Related Actors
- USAspending Federal Awards & Recipient Monitor — the same job for US federal contract and grant awards.
- France Company & SIRET Search — check French buyers or winners in the official Sirene register.
Support
Open an issue in the Issues tab of this Actor. Include the run ID, the input (without private data) and the status message. Never send API tokens or passwords.