EU Tender Watch: TED Deadlines & Amendments
Pricing
from $3.00 / 1,000 tender rows
EU Tender Watch: TED Deadlines & Amendments
Watch EU public tenders on TED by buyer country, CPV code and keyword. Get new notices plus change rows when a tracked tender's deadline, estimated value, title or status (award, cancellation) changes, with previous and current values. Dedupes across runs.
Pricing
from $3.00 / 1,000 tender rows
Rating
0.0
(0)
Developer
Clark Scroggin
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
18 hours ago
Last modified
Categories
Share
Unofficial; not affiliated with or endorsed by the European Union, the Publications Office of the EU or TED. This Actor reads public procurement notices through the official TED Search API (no key, no scraping) at a polite request rate. Source: TED (Tenders Electronic Daily), © European Union, https://ted.europa.eu — reused under the TED legal notice.
Know when a tender you are tracking changes. Public buyers in the EU publish their tenders on TED, and they keep changing them: the submission deadline is extended, the estimated value or the title is corrected, the procedure is cancelled, or an award notice closes it. TED never edits a notice. Each change is a new notice (a change notice, or a later award or cancellation notice of the same procedure), which you have to recognise and compare with the old one yourself.
EU Tender Watch does that comparison for you. Pick buyer countries, CPV codes and keywords and run it on a schedule:
- New tenders that match your shortlist come out as
rowType: "new"rows. - Later notices of tenders the watch has already seen come out as
rowType: "amendment"rows. Each one lists the fields that changed (changedFields) and has the previous and the current value of each:deadline,estimatedValue,currency,titleandstatus(competition → awarded / closed-no-award / cancelled). - Nothing is output twice. Each watch remembers every notice it has handled, so tomorrow's run brings only what is new or changed since today.
It is built for small suppliers and bid consultants who follow a country / CPV shortlist and do not want to miss a deadline extension or reread a whole TED export every morning.
What you get
One flat row per notice. Below are real rows from test runs on 2026-11-02 (DEU, CPV 72, IT services).
A deadline extension found by a scheduled watch. The buyer's change notice of 2026-10-30 moved the deadline by two weeks; the watch had stored the tender from an earlier notice (744245-2026):
{"rowType": "amendment","publicationNumber": "753103-2026","procedureId": "a2ce6c55-af5d-423a-aada-23ff75a67bb6","noticeType": "cn-standard","noticeTypeLabel": "Contract notice","stage": "competition","isChangeNotice": true,"changeReasonCode": "cor-buy","changeReasonLabel": "Correction by the buyer","publicationDate": "2026-10-30","title": "UEM OSS/MPC","titleLanguage": "deu","buyerName": "Dataport AöR","buyerCountry": "DEU","buyerCity": "Altenholz","cpvMain": "48000000","cpvCodes": ["48000000", "72267000"],"procedureType": "open","contractNature": "supplies","deadline": "2026-11-17T12:00:00+01:00","deadlineType": "tender","daysToDeadline": 14,"estimatedValue": null,"lotCount": 1,"changedFields": ["deadline"],"changes": [{ "field": "deadline", "previous": "2026-11-03T12:00:00+01:00", "current": "2026-11-17T12:00:00+01:00" }],"previousDeadline": "2026-11-03T12:00:00+01:00","currentDeadline": "2026-11-17T12:00:00+01:00","previousStatus": "competition","previousPublicationNumber": "744245-2026","tedUrl": "https://ted.europa.eu/en/notice/-/detail/753103-2026","tedUrlOriginal": "https://ted.europa.eu/de/notice/-/detail/753103-2026","xmlUrl": "https://ted.europa.eu/en/notice/753103-2026/xml","pdfUrl": "https://ted.europa.eu/en/notice/753103-2026/pdf","fetchedAt": "2026-11-02T16:23:19.763Z","source": "Source: TED (Tenders Electronic Daily), © European Union, https://ted.europa.eu — reused under the TED legal notice. ..."}
A status change. A tender for penetration tests (deadline 2026-11-18) was closed by a result notice with no winner. The watch found it by following up on the tenders it tracks, even though result notices are outside the "competition" filter:
{"rowType": "amendment","publicationNumber": "749724-2026","noticeTypeLabel": "Contract award notice","stage": "closed-no-award","awardOutcome": "closed-no-winner","title": "Durchführung von Penetrationstests","buyerName": "Medizinischer Dienst Westfalen-Lippe","changedFields": ["status"],"changes": [{ "field": "status", "previous": "competition", "current": "closed-no-award" }],"previousDeadline": "2026-11-18T10:00:00+01:00","previousPublicationNumber": "736115-2026","tedUrl": "https://ted.europa.eu/en/notice/-/detail/749724-2026"}
A new tender (abridged; amendment fields are null / empty on new rows):
{"rowType": "new","publicationNumber": "752780-2026","noticeTypeLabel": "Contract notice","stage": "competition","publicationDate": "2026-10-30","title": "Überlassung von Lizenzen des Herstellers Broadcom/CA","titleLanguage": "deu","buyerName": "Phoenics.IT GmbH","buyerCountry": "DEU","buyerCity": "Hannover","cpvMain": "72268000","procedureType": "open","deadline": "2026-11-30T12:00:00+01:00","daysToDeadline": 27,"estimatedValue": 216000,"currency": "EUR","valueBasis": "procedure","changedFields": [],"changes": [],"tedUrl": "https://ted.europa.eu/en/notice/-/detail/752780-2026"}
The columns
rowType:new(first notice of this procedure the watch has seen) oramendment(a later notice of a tracked procedure).stageis the status this notice shows:planning,competition,awarded,closed-no-award,direct-award-intent,contract-modification,completion,cancelledorother. A change notice whose reason is a cancellation (cancel,cancel-intent) iscancelled. A result notice isclosed-no-awardonly when every lot reports "closed, no winner";awardOutcomegives the detail (winner-selected,partly-awarded,closed-no-winner,no-winner-yet).deadlineis the earliest submission deadline across all lots, in ISO 8601 with the buyer's UTC offset (a plain date when TED has no time). When no tender deadline is published yet (restricted or negotiated procedures), it is the request-to-participate deadline, anddeadlineTypesays which one it is.lotslists each lot's deadline when the notice has 2 or more lots.estimatedValueis the procedure's estimated value. If the notice gives only lot values, it is their sum when all lots use one currency (valueBasis: "sum-of-lots"). Values of 0 or 1 are placeholders buyers enter when they do not disclose the value, so they becomenull.awardedValueis the total awarded on result notices, when published.titleis the procedure title in English when the notice has one, otherwise in the original language (titleLanguage, e.g.deu,fra). Most national tenders exist only in the original language.changesis a list of{field, previous, current}objects; the flat columnspreviousDeadline/currentDeadline,previousValue/currentValue,previousTitleandpreviousStatushold the same information in spreadsheet form. A field that is simply missing from a later notice (an award notice has no deadline, for example) is not counted as a change.changeReasonCode/changeReasonLabel/changeReasonTexton change notices give the buyer's stated reason, e.g.update-add"Verlängerung der Angebotsfrist" (deadline extension).tedUrlis the notice page on ted.europa.eu in the English interface, andtedUrlOriginalthe same page in the original language.xmlUrlis the eForms XML andpdfUrlthe PDF.buyerNameis the first buyer;otherBuyersCountcounts the rest in joint procurement. Only organisation-level buyer data is output, never contact persons, e-mail addresses or phone numbers.- Empty values are
null, never empty strings.
A RUN_SUMMARY record in the run's key-value store has the counts: the query sent, notices matching and scanned, tracked tenders followed up, notices already seen, filtered out or unchanged, new and amendment rows, which fields changed, requests used, why the run stopped and how big the watch memory is.
Why change rows instead of an export
A TED export gives you every notice as a separate record. To learn that "the deadline of the Dataport tender moved from 3 to 17 November", you have to find the earlier notice of the same procedure, line up the lots and compare dates in two time zones. This Actor keeps, per procedure, only the fields that matter for a bid decision. It compares every later notice with them and writes down only the difference. A follow-up notice that changes none of these fields (for example a corrected document link) is remembered but not output and not charged, unless you ask for it.
How to use it
- Pick your shortlist.
countries(buyer country, ISO 3-letter: DEU, FRA, ITA, ESP, POL, NLD...),cpvCodes(prefixes:72all IT services,722software,45construction) and optionallykeywords(searched in the notice's full text by TED; add translations, because notices are in the buyer's language). - Optionally narrow new rows:
deadlineAfter: "today"keeps only tenders still open;minEstimatedValuesets a floor on the estimated value. - Name the watch (
watchName). The first run is a baseline: everything in the window is new. A first run withdaysBack: 30gives the watch a month of history, so later changes can be matched to tenders published before you started. - Schedule it daily with
daysBack: 3(covers weekends; already-seen notices cost nothing). TED publishes Monday to Friday. - Connect the output to Slack, e-mail, Google Sheets, webhooks, Zapier, Make or n8n. Quiet runs push nothing.
Example 1: German IT services (the default)
{ "countries": ["DEU"], "cpvCodes": ["72"], "daysBack": 3, "maxItems": 50, "watchName": "de-it-services" }
Example 2: Open cloud tenders over EUR 500k in France and Benelux
{"countries": ["FRA", "BEL", "LUX", "NLD"],"cpvCodes": ["72", "48"],"keywords": ["cloud", "hébergement", "hosting"],"daysBack": 3,"deadlineAfter": "today","minEstimatedValue": 500000,"watchName": "benelux-fr-cloud"}
Example 3: Advanced, any TED expert query
{"expertQuery": "buyer-country IN (AUT CHE) AND classification-cpv IN (45*) AND procedure-type=open","daysBack": 3,"watchName": "alpine-construction"}
The expert query replaces countries, CPV codes, keywords and stages; the Actor adds the publication-date window and the sort order. Build and test queries on TED expert search.
Input reference
| Field | Type | Default | What it does |
|---|---|---|---|
countries | string[] | ["DEU"] | Buyer countries, ISO 3-letter (2-letter codes are converted). Empty = all. |
cpvCodes | string[] | ["72"] | CPV codes or prefixes (2–8 digits; 72200000-7 accepted). Matches main and additional CPV codes. Empty = all. |
keywords | string[] | [] | Full-text words or phrases (any of them). |
noticeStages | enum[] | competition | Which notices start a new row: competition, planning, result, direct-award, modification. Amendments of tracked tenders are always reported. |
daysBack | int 1–30 | 3 | Notices published in the last N days. |
deadlineAfter | date / today | none | New rows only: keep tenders with a deadline on or after this date. |
minEstimatedValue | number | none | New rows only: minimum estimated value. |
includeMissingValue | bool | true | With a minimum value set, keep notices that disclose no value. |
onlyNew | bool | true | Watch mode. Off = one-off report of the window, nothing remembered (changes within the window are still detected). |
watchName | string | default | Memory key (named key-value store ted-watch-<name>). |
maxItems | int | 50 | Max rows (charged events) per run; the rest comes with the next run. |
maxNoticesScanned | int | 1000 | Max notices read from TED per run (250 per request). |
followTrackedTenders | bool | true | Also look up later notices of up to maxTrackedChecked open tracked tenders (50 per request), so awards and cancellations are caught even outside your filters. |
maxTrackedChecked | int | 100 | See above. |
includeUnchangedFollowUps | bool | false | Also output follow-up notices that change none of the tracked fields. |
expertQuery | string | none | Advanced TED expert query (replaces the filters above; no SORT BY). |
Pricing
Pay per event: you pay for rows delivered, plus a small start fee.
| Event | Price | When |
|---|---|---|
| Actor start | $0.005 | Once per run, even when nothing is new |
tender-notice | $0.003 | Per row in the dataset (new tender or amendment) |
What a watch costs. German IT services (DEU, CPV 72, contract notices) had 55 notices in the 3 days before our test and 398 in 30 days. In that window 352 notices became rows and 46 were follow-ups with no tracked change, which are free. That is about 17 rows per business day, ≈ $0.055 a day (≈ $1.20 a month). The one-time 30-day baseline cost ≈ $1.06. A narrower shortlist (one CPV group, keywords, deadlineAfter) usually costs a few cents a week. Unchanged follow-ups and filtered notices are never charged, and the run stops before the spending limit you set on the run.
Data source and how the Actor behaves
- Source: the official TED Search API (
POST https://api.ted.europa.eu/v3/notices/search), which the Publications Office provides openly for data reuse without authentication. No web pages are scraped, no browser and no proxies are used. - One request returns up to 250 notices. A typical daily run makes 1–4 requests: the watch query, plus up to 2 follow-up queries for tracked tenders. Requests carry a declared User-Agent (
TedTenderWatch/0.1 ...) and are spaced at most 2.5 per second. Transient errors (429, 5xx, timeouts) are retried up to 3 times with backoff. A query that TED rejects fails the run immediately, with TED's own explanation. - The Actor asks only for the fields it outputs. Contact fields (e-mail, phone, contact person) are never requested, and free-text fields are additionally scrubbed of anything that looks like an e-mail address or phone number.
- If one notice in a response is malformed, it is skipped and counted (
errors) and the run continues. If the response as a whole no longer looks like the documented format, the run fails with a clear message instead of returning empty results. - Timing: TED publishes new notices Monday to Friday in its daily edition (OJ S). Rows appear after TED publishes. This is not a live feed.
How amendments are detected
- Every notice of an eForms procedure carries the same procedure identifier. The watch stores, per procedure, the last values it saw: deadline, value, currency, title, stage and the notice number. Change notices also point to the notice they change; that pointer is used when a notice has no procedure identifier (rare, older forms).
- Each notice is handled once per watch (deduplicated by publication number). Within a run, notices are processed oldest first, so a chain like 03 Nov → 06 Nov → 11 Nov produces two amendment rows, each against the step before.
- The same notice in another language or with a different UTC offset is not a change: deadlines are compared as instants, titles only in the same language, amounts as numbers.
- Memory size: about 280 bytes per tracked procedure. Entries not seen for 400 days are dropped, and the store is capped at 12,000 procedures and 30,000 notices (oldest dropped first), so it stays under about 4 MB.
Limitations
- The first run is a baseline: everything in the window is
new, including the latest change notice of a tender whose original notice is older than the window. Its row is complete (it carries the current deadline), but there is no "previous" to compare with. - Changes to a tender are matched only if the watch has seen an earlier notice of it. Run it regularly and start with a longer
daysBackif you need history. - Only the fields listed above are compared. Other edits (documents, criteria, lot descriptions) appear only through
includeUnchangedFollowUpsand the change reason. - Per-lot values are shown only when TED's lists line up with the lot list; otherwise the total is reliable but
lots[].estimatedValueisnull. keywordsuse TED's full-text search, which works in the language of the notice.- Notices in TED's older pre-eForms format (replaced by eForms in 2023) carry no procedure identifier; changes are then matched only through the change notice's reference, which is less reliable.
maxItemscaps rows per run. When a run stops early, the next run continues from where it stopped, without duplicates, as long as the notices are still inside thedaysBackwindow.
FAQ
Is this legal to use? TED is the EU's official public procurement journal, and the Publications Office provides the Search API for data reuse. Reuse of EU content generally requires acknowledging the source, which the source field on every row and this README do. Check the TED legal notice for the current terms. The Actor uses only the official open API, identifies itself and keeps a low request rate. It outputs no personal contact data. You remain responsible for how you use the data.
Is it official? No. It is an independent tool and is not affiliated with or endorsed by the European Union, the Publications Office of the EU or TED. For legally binding information, always check the notice on ted.europa.eu (tedUrl) and the buyer's procurement documents.
Why is a tender I know about missing? It may not be published on TED yet (below-threshold tenders are often only on national portals), it may be outside daysBack, in another stage than noticeStages, or excluded by deadlineAfter / minEstimatedValue, or maxItems was reached. RUN_SUMMARY has the counts.
Can I track several shortlists? Yes. Give each its own watchName.
What does a row cost when nothing changed? Nothing. Already-seen notices, unchanged follow-ups and filtered notices are not output and not charged; a quiet run costs only the $0.005 start fee.
Can I reset a watch? Delete the named key-value store ted-watch-<watchName> in your Apify storage, or use a new watchName.
Support
Open an issue on the Actor's Issues tab with your input and run ID. Ideas for more tracked fields (for example winner names on award notices) are welcome.