EU Tender Monitor - TED Alerts
Alerts the moment a new EU public tender matching your business is published on TED. Filter by CPV codes, keywords in any EU language, countries and NUTS...
Alerts the moment a new EU public tender matching your business is published on TED. Filter by CPV codes, keywords in any EU language, countries and NUTS regions; alerts only on never-seen tenders via the official TED API. Clean output, no buyer contact persons. No personal data in the output.
$3.00 / 1,000 · 100.0% success over 27 public runs in the last 30 days.
Run it on Apify → Free to try - runs bill per result on your own account.
What you give it
Every field is optional unless marked; sensible defaults do the rest.
| Field | Type | What it does | Default |
|---|---|---|---|
keywords |
array | Alert on tenders whose title contains ANY of these words - in any EU language. TED translates every title into all 24 official languages and the search covers all of them, so "software", "logiciel" or "Straßenbau" all work. Example: ["software", "cloud"]. Combine with CPV codes for precision; at least one of keywords, cpvCodes, countries or nutsCodes is required. | [] |
cpvCodes |
array | EU procurement classification codes (CPV), the most reliable filter - language-free. Hierarchical: "72000000" (IT services) matches every sub-code like 72266000, and a short prefix such as "72" works too. Example: ["72000000", "48000000"]. Find codes at simap.ted.europa.eu (CPV). | ["72000000"] |
countries |
array | Only alert on tenders from buyers in these countries. Two- or three-letter ISO codes, e.g. ["BE", "NL"] or ["BEL", "NLD"]. Empty = all of TED (EU/EEA and beyond). | [] |
nutsCodes |
array | Only alert on tenders performed in these EU NUTS regions, hierarchical prefix match: "BE2" covers all of Flanders, "FR10" the Paris region. Tenders whose place of performance is a whole country match via that country's code in countries. Example: ["BE2", "NL3"]. | [] |
noticeTypes |
array | Which notice stages to monitor. Default: contract notices (open competitions you can still bid on). Add prior-information notices to see demand earlier, or award notices to track who wins. | ["contract-notice"] |
alsoMatchDescriptions |
boolean | Additionally match your keywords against tender descriptions. Honest limitation: unlike titles, descriptions exist only in the notice's source language, so a Polish tender's description only matches Polish keywords. Titles are always matched in all 24 languages. | False |
minValueEur |
integer | Only alert on tenders with an estimated or total value of at least this many euros. Tenders that publish no value (most of them) always pass this filter - TED makes values optional, and silently dropping them would hide real opportunities. | - |
lookbackDays |
integer | How many days of past notices the FIRST run of a profile loads as its baseline. Later runs automatically query from the previous run with one day of overlap - re-alerting a seen notice is impossible. TED publishes on working days only, so weekend runs find nothing new. | 7 |
alertOn |
string | "new" alerts once per tender. "new-and-updated" also alerts when a tender you have already seen is changed by a later corrigendum or change notice (marked isUpdate: true). | new |
emitBaseline |
boolean | On the very first run of a profile, push the currently matching tenders (flagged isBaseline: true, charged at the lower baseline price) so you start with today's full picture. Turn off to seed silently and only ever receive new alerts. | True |
resetState |
boolean | Discard this profile's memory of already-seen tenders and start over with a fresh baseline run. One-shot switch: turn it back off afterwards. | False |
maxItems |
integer | Upper bound on items pushed per run (baseline or alerts). On an alert run, matches beyond the cap alert on the next run. On the very first (baseline) run they are recorded as already seen instead, so raise this before the first run if you need the whole baseline. | 500 |
stateStoreName |
string | Named key-value store holding the monitor's seen-tender memory. Only change this to run fully isolated monitor instances. | ted-monitor-state |
reportFailures |
boolean | When a run fails, send the developer the actor name and build, an error category, the error message (truncated) and a one-way hash of your input - so a bug can be fixed without anyone asking you to reproduce it. Your input itself, your results and your identity are never sent, and successful runs send nothing at all. Switch this off and the actor behaves exactly the same. | True |
What you get back
One JSON object per result, with exactly these fields - no seller identities, no contact data, ever.
A real result row from a recent run:
{
"buyerCountry": "CZE",
"buyerName": "Nemocnice Prachatice, a.s.",
"cpvCodes": [
"48810000",
"48000000",
"48800000",
"32424000",
"72268000",
"72263000",
"72261000",
"71356300",
"32580000",
"32420000",
"31154000"
],
"deadline": "2026-11-16",
"description": "Předmětem dodávky je modernizace a rozšíření funkcionalit nemocničního informačního systému (NIS), laboratorního systému (LIS), systémů arch...",
"estimatedValueEur": 18941461,
"isBaseline": false,
"isUpdate": false,
"noticeCategory": "contract-notice",
"nutsCodes": [
"CZ031"
],
"performanceCountries": [
"CZE"
],
"publicationDate": "2026-10-15",
"publicationNumber": "711604-2026",
"sourceLanguage": "ces",
"sourceNoticeType": "cn-standard",
"title": "Czechia – Information systems – Modernizace informačních systému Nemocnice Prachatice pro zajištění interoperability",
"totalValueEur": 18941461,
"url": "https://ted.europa.eu/en/notice/-/detail/711604-2026"
}
| Field | Type | Meaning |
|---|---|---|
publicationNumber |
string | The notice's TED publication number - its stable public identifier. |
title |
string | Notice title in English (TED translates every title into all 24 EU languages; the buyer's free-text tail stays in its source language). |
buyerName |
string | The buying organization's name, in the notice's source language. Organization-level data only. |
buyerCountry |
string | The buyer's country, three-letter ISO code. |
cpvCodes |
array | All CPV classification codes on the notice (procedure and lots), deduplicated. Reusable as the cpvCodes input. |
nutsCodes |
array | NUTS codes of the places of performance, deduplicated. |
performanceCountries |
array | Countries of performance (three-letter ISO), for lots performed country-wide rather than in a NUTS region. |
noticeCategory |
string | Canonical notice stage, from the notice's TED form type. Reusable as the noticeTypes input (modification/other arrive only via change tracking). |
sourceNoticeType |
string | TED's own notice subtype code, unnormalized. |
description |
string | Tender description(s) in the notice's source language - TED does not translate descriptions. Multiple lots are separated by blank lines. |
sourceLanguage |
string | The notice's source language (ISO 639-2 code) - the language of buyerName and description. |
publicationDate |
string | Date the notice was published in the OJ S, normalized to YYYY-MM-DD. |
deadline |
string | Earliest tender-receipt deadline across the notice's lots, normalized to YYYY-MM-DD. Present on competition notices. |
estimatedValueEur |
number | Highest estimated lot value in euros, when the buyer published one. Most notices publish no value - absence does not mean small. |
totalValueEur |
number | Total procurement value in euros, mostly on award notices. |
winnerNames |
array | Winning tenderers' organization names, on award notices. Organization-level data only. |
winnerCountries |
array | Winning tenderers' countries (three-letter ISO), on award notices. |
changeNoticeVersion |
string | TED change-notice version identifier. When it references an earlier publication number, this notice amends that notice. |
url |
string | Link to the notice on ted.europa.eu (English page). |
isBaseline |
boolean | True on items from a profile's first run (the current baseline). False on real new-tender alerts. |
isUpdate |
boolean | True when the alert is a change to an already-seen tender (alertOn: new-and-updated). |
Health
100.0% success over 27 public runs in the last 30 days. Live record, failures included: status page.
Full documentation, examples and the AI-assistant prompt live on the store page.