EU TED Tender Monitor avatar

EU TED Tender Monitor

Pricing

from $2.00 / 1,000 tender notices

Go to Apify Store
EU TED Tender Monitor

EU TED Tender Monitor

Search and monitor EU public procurement notices from the official TED Search API v3 by keyword, CPV code, country, date and estimated value. Normalised output, optional only-new mode for scheduled alerts. No personal contact data.

Pricing

from $2.00 / 1,000 tender notices

Rating

0.0

(0)

Developer

Drucilla Seeringtl

Drucilla Seeringtl

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Categories

Security

Limited permissions

Share

Search and monitor EU public procurement notices published on TED (Tenders Electronic Daily), the official EU journal for public tenders. The Actor uses only the official, anonymous TED Search API v3. It does no web scraping, needs no login, and works around no limits.

Use it to:

  • get a daily or weekly list of new calls for tender that match your keywords, CPV codes and countries
  • feed tenders into a CRM, spreadsheet, Slack or e-mail alert (through Apify integrations)
  • build a lead list of public buyers for a sector

What it does

  • Filters: full-text keywords, CPV codes (with or without sub-codes), buyer country, a publication-date range or the last N days, TED form type, minimum estimated value, and "still open for submission".
  • Normalised output: one flat record per notice. Each record has the notice number, title, buyer, country, CPV codes, estimated value and currency, tender deadline, and links to the notice page, PDF and XML.
  • Only-new mode: for scheduled runs. Notices that an earlier run with the same filters already delivered are skipped. The state is kept in a named key-value store.
  • Privacy by default: contact persons, e-mail addresses and phone numbers are never requested from TED and never output.
  • Max-cost aware: if you set a maximum cost per run, the Actor stops cleanly when it reaches that limit.

Input

FieldTypeDefaultDescription
keywordsarray of strings–Full-text keywords or phrases, combined with OR. TED searches the full notice text in any language, so a keyword can match a notice whose title does not contain it.
cpvCodesarray of strings–CPV codes such as 72000000 or 48000000-8, combined with OR.
cpvIncludeSubcodesbooleantrueWhen on, 72000000 also matches 72212190 and other sub-codes.
countriesarray of strings–Buyer country as ISO alpha-2 (DE) or alpha-3 (DEU), combined with OR.
lastNDaysinteger7Publication window that ends today (UTC). Today counts as day 1. Ignored when publishedFrom is set.
publishedFrom / publishedTodate–Explicit publication-date range. Both ends are inclusive.
formTypesarray["competition"]TED form types. competition means calls for tender. Leave empty to get all types.
minEstimatedValueinteger–Keep notices whose estimated value is at least this amount in valueCurrency.
valueCurrencystringEURISO 4217 currency used by the value filter.
includeWithoutValuebooleanfalseWhen a minimum value is set, also keep notices with no published value or with a different currency.
onlyOpenForSubmissionbooleanfalseKeep only notices whose earliest deadline is still in the future.
onlyNewbooleanfalseSkip notices already delivered by an earlier run with the same filters.
stateKeystringderived from the filtersCustom name for the only-new state.
maxItemsinteger100Maximum number of notices output per run (1–10,000).
languagestringengPreferred 3-letter language for titles and links. When TED has no title in that language, the original language is used.
includeBuyerWebsitebooleanfalseAdds the buyer organisation's website URL. This is never a personal contact.

Example:

{
"keywords": ["software"],
"cpvCodes": ["72000000"],
"countries": ["DE", "AT"],
"lastNDays": 7,
"minEstimatedValue": 100000,
"onlyNew": true,
"maxItems": 200
}

Output

Each dataset item looks like this. The example is a real item from a test run on 2026-11-03; see sample_output.json.

{
"publicationNumber": "763816-2026",
"title": "USŁUGA UTRZYMANIA I ROZWOJU GDAŃSKIEJ PLATFORMY EDUKACYJNEJ",
"titleLanguage": "pol",
"tedTitle": "Poland – System and support services – USŁUGA UTRZYMANIA I ROZWOJU GDAŃSKIEJ PLATFORMY EDUKACYJNEJ",
"buyerName": "Gdańskie Centrum Informatyczne",
"buyerNames": ["Gdańskie Centrum Informatyczne"],
"buyerCountry": "POL",
"buyerCountries": ["POL"],
"buyerCity": "Gdańsk",
"cpvMain": "72250000",
"cpvCodes": ["72250000", "72230000", "72611000"],
"placeOfPerformance": ["PL634", "POL"],
"estimatedValue": null,
"estimatedValueCurrency": null,
"estimatedValueSource": null,
"tenderDeadline": "2026-11-17T10:00:00+01:00",
"publicationDate": "2026-11-03",
"noticeType": "cn-standard",
"formType": "competition",
"procedureType": "open",
"contractNature": "services",
"noticeUrl": "https://ted.europa.eu/en/notice/-/detail/763816-2026",
"pdfUrl": "https://ted.europa.eu/en/notice/763816-2026/pdf",
"xmlUrl": "https://ted.europa.eu/en/notice/763816-2026/xml",
"source": "TED - Tenders Electronic Daily (ted.europa.eu), (c) European Union",
"scrapedAt": "2026-11-03T12:09:44+00:00"
}
  • estimatedValue uses the procedure-level value. If that is missing, it uses the framework value, and otherwise the sum of the lot values when all lots share one currency. estimatedValueSource tells you which one was used. A value that TED publishes as 0, meaning not disclosed, is output as null.
  • tenderDeadline is the earliest deadline across lots. When TED gives a date with no time, only the date is output.

The Actor also writes a RUN_SUMMARY record to the run's default key-value store. It holds the TED query used, the total matches on TED, the number of notices scanned, delivered and skipped, the number of TED requests, and the duration.

Pricing (pay per event)

EventPrice
Actor start (apify-actor-start, Apify default, per GB of memory)$0.00005
tender-notice: one normalised notice written to the dataset$0.002 ($2.00 per 1,000)

You pay only for notices that are delivered. Notices skipped in only-new mode, or removed by the value or open filters, are free. You can cap the cost of any run with Apify's "maximum cost per run" setting.

Scheduling alerts

  1. Save a task with your filters and onlyNew: true.
  2. Schedule it, for example daily.
  3. Connect an integration (e-mail, Slack, Google Sheets, webhook) to the dataset.

Each run then delivers only notices that were not delivered before. The state is kept per filter combination in the named key-value store eu-ted-tender-monitor-state, under STATE-<hash> or under your own stateKey. It remembers the most recent 50,000 notice numbers. Delete that record to start again.

Data source, terms and attribution

Personal data

Notices can contain names, e-mail addresses and phone numbers of contact persons. These are personal data under the GDPR. The Actor never requests those fields from TED, so they cannot appear in the output. Buyer organisation names and cities are output because they identify public bodies. You remain responsible for how you process the data you receive.

Limitations

  • No currency conversion. The value filter compares only values in valueCurrency. Other currencies are excluded unless includeWithoutValue is on.
  • The value and open-for-submission filters run after the TED search. The Actor may therefore scan more notices than it delivers, up to 50,000 per run. Those notices are not charged.
  • Many notices publish no estimated value, so a minimum-value filter can remove a large share of the results. In the test run, 8 of 20 notices had a value.
  • buyerCountry is the lead buyer. Joint procurements list every buyer in buyerCountries, and the country filter matches any of them.
  • Full-text keyword matching is done by TED and covers the whole notice text.
  • Notices are returned newest first, sorted by publication number.

Run locally

python3 -m venv .venv && .venv/bin/pip install -r requirements.txt
apify run --input='{"keywords":["software"],"lastNDays":7,"maxItems":20}'
# or simulate pay-per-event pricing (optional max charge in USD):
./run_local.sh 0.05
# offline unit tests
.venv/bin/python -m unittest discover -s tests