EU TED Tenders Scraper & Monitor avatar

EU TED Tenders Scraper & Monitor

Pricing

from $3.50 / 1,000 notice records

Go to Apify Store
EU TED Tenders Scraper & Monitor

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

Cliqto Media

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

14 days ago

Last modified

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.

EU TED Tenders Monitor: filters by date, CPV and country, one row per tender notice with deadline and value, monitor mode returns only new notices

Table of contents

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, pdfUrl and xmlUrl, 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, never 0.
  • 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

  1. Open the Input tab. The form is already filled: CPV 72000000, last 7 days, 20 notices.
  2. Optional: add buyer countries, for example DEU and FRA, or choose a notice type such as cn-standard.
  3. Click Start.
  4. 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.

FieldTypeDefault / prefillAllowed valuesWhat it changesRecommendation
modestringdefault searchsearch, monitorsearch: every match. monitor: only notices not delivered by earlier runs of the same monitor.Use monitor for daily schedules.
lastDaysintegerdefault 7, prefill 71–31Publication 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).
dateFromstringnoneYYYY-MM-DDFirst publication day, inclusive. Overrides lastDays.Use for a fixed period.
dateTostringtodayYYYY-MM-DDLast publication day, inclusive. Works only together with dateFrom.The window from dateFrom to dateTo must be 31 days or less.
cpvCodesarray of stringsprefill ["72000000"]up to 50 codes, 8 digitsOnly 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.
buyerCountriesarray of stringsemptyup to 60 ISO alpha-3 codesOnly buyers from these countries. Two-letter EU codes like DE are converted. Empty: all countries.DEU, FRA, POL, …
noticeTypesarray of stringsempty20 eForms typesOnly these notice types. Empty: all types.cn-standard for open calls; add can-standard for award results.
keywordsstringemptyup to 200 charactersFull-text search in all languages of the notice. Quotes, brackets and operators are removed.Short phrases such as cloud computing.
preferredLanguagestringENG24 EU languagesLanguage 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.
maxResultsintegerdefault 100, prefill 201–2500Maximum rows per run, newest first. Each row is one paid notice event.Keep it low for tests; raise for full exports.
monitorStateNamestringdefaulta-z, 0-9, -, 1–40 charactersMonitor 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.
  • dateFrom wins over lastDays. When dateTo is empty, it is today.
  • In monitor mode maxResults limits 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

FieldTypeCan be empty?ExampleMeaning
publicationNumberstringno700154-2026TED publication number. One row per notice; a changed notice is a new row with its own number.
noticeIdstringyes (legacy notices)UUIDeForms notice identifier.
noticeVersionintegeryes (legacy)1eForms notice version.
procedureIdstringyesUUIDProcedure identifier. Several notices can belong to one procedure.
isChangeNoticebooleannofalseTrue when the notice changes an earlier notice.
changesNoticestringyes657981-2026Which notice this one changes.
changeReasonCodestringyescor-buyTED change reason code.
noticeTypestringyescn-standardeForms notice type (contract notice, award, prior information, …).
noticeSubtypestringyes16eForms subtype as published.
formTypestringyescompetitionplanning, competition, result, change, …
procedureTypestringyesopenProcedure type code.
publicationDatestringyes2026-10-09Publication day in the Official Journal S.
publicationDateRawstringyes2026-10-09+02:00Publication date exactly as TED returns it.
dispatchDatestringyes2026-10-08Day the buyer sent the notice to TED.
ojsNumberstringyes196/2026Official Journal S issue.
titlestringyessee exampleTitle in the preferred language or the fallback.
titleLanguagestringyesENGLanguage actually used for title.
originalTitlestringyesWartungleistungen …Short title in the buyer's original language.
descriptionstringyestextProcedure description, cut at 4,000 characters; e-mails removed.
descriptionLanguagestringyesDEULanguage actually used for description.
buyerNamestringyesLand Hessen, …Buyer name. TED usually has it only in the original language.
buyerNameLanguagestringyesDEULanguage of buyerName.
buyerNamesarraycan be []["Land Hessen, …"]All buyers of a joint procurement.
buyerCountrystringyesDEUBuyer country, ISO alpha-3.
buyerCountriesarraycan be []["DEU"]All buyer countries.
buyerCitystringyesWiesbadenBuyer city.
buyerWebsitestringyeshttps://vergabe.hessen.deBuyer organisation website as published; sometimes a bare domain.
cpvCodesarraycan be []["72000000"]All CPV codes of the procedure and its lots.
mainCpvCodestringyes72000000Main CPV code.
placeOfPerformanceCountriesarraycan be []["DEU"]Countries of performance, when published.
tenderDeadlinestringyes2026-11-09T10:00:00+01:00Earliest deadline for tenders across lots, with the offset that TED publishes. Null when the notice has none (for example award notices).
tenderDeadlineDateOnlybooleanyesfalseTrue when TED gave only a day, no time.
requestDeadlinestringyesYYYY-MM-DDThh:mm:ss+hh:mm or YYYY-MM-DDEarliest deadline for requests to participate (restricted and negotiated procedures).
estimatedValuenumberyes345600Estimated value without VAT. Null when not published.
estimatedValueCurrencystringyesEURCurrency of estimatedValue.
estimatedValueSourcestringyesprocedureprocedure or lots_sum (sum of lot estimates in one currency).
totalValuenumberyes345600Total value from TED; for award notices the awarded total.
totalValueCurrencystringyesEURCurrency of totalValue.
lotsCountintegerno1Number of lots (0 for legacy notices).
lotIdsarraycan be []["LOT-0000"]Lot identifiers.
officialLanguagesarraycan be []["DEU"]Languages the notice was published in.
procurementDocumentsUrlstringyesURLWhere the buyer publishes the tender documents.
noticeUrlstringnoURLNotice page on ted.europa.eu.
pdfUrlstringyesURLPDF of the notice (link only).
xmlUrlstringyesURLeForms XML of the notice (link only).
linkLanguagestringyesENGLanguage of noticeUrl and pdfUrl.
dataModelstringnoeformseforms or legacy (older notices have fewer identifiers).
monitorStatusstringyesnewnew in monitor mode; null in search mode.
sourcestringnoTEDData source.
fetchedAtstringnoISO date-timeWhen the Actor read the notice.

Run status

The run summary (RUN_SUMMARY) and the run status message show one of these statuses:

StatusMeaningRows
COMPLETEAll matches were returned.all matches
CAPPEDMore matches exist; maxResults stopped the run.maxResults
NO_RESULTSTED answered, but nothing matches the filters.0
NO_NEWMonitor mode: nothing new since the last run.0
PARTIALSome pages were read, then TED timed out or the run deadline came. Saved rows stay.some
CHARGE_LIMITYour maximum cost per run was reached.some
CANCELLEDThe run was aborted. Saved rows stay.some
INVALID_INPUTInput or filters are not valid. The run fails.0
ERRORTED 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.

EventPriceWhen
Actor start$0.01Once per run (the Actor runs on 256 MB, so it is always one start event).
Notice record$0.0035For each notice saved to the Dataset.
ScenarioRowsTotal price
Test run (prefill)20$0.08
Daily search100$0.36
Large export1,000$3.51
Maximum run2,500$8.76
Filter with no matches0$0.01
Monitor run with no new notices0$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

JobInputKey fieldsNext step
Find open tenders to bid oncpvCodes, buyerCountries, noticeTypes: ["cn-standard"]title, tenderDeadline, estimatedValue, procurementDocumentsUrlSend to a sheet or CRM
Daily tender alertsmode: "monitor", schedulemonitorStatus, title, noticeUrlSlack or e-mail via integrations
Market and competitor researchnoticeTypes: ["can-standard"], dateFrom/dateTobuyerName, totalValue, totalValueCurrency, cpvCodesExport to CSV or BI
Public-sector lead listsbuyerCountries, cpvCodesbuyerName, buyerCity, buyerWebsiteEnrich in your CRM

Monitoring and schedules

  1. Set mode to monitor and give the search a monitorStateName, for example it-services-de.
  2. Keep lastDays at 1–3 so the window always covers the time since the last run.
  3. 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/runs and 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), buyerName and buyerCountry (who buys), tenderDeadline (when offers are due, with time zone), estimatedValue with estimatedValueCurrency (how much, null if 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 PARTIAL and a warning; narrow the filters or use lastDays of 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 estimatedValue of 0 means the buyer published 0; a missing value is null.
  • Languages: buyer names and descriptions are often only in the original language. The …Language fields 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.

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.