EU Tender Watch: TED Deadlines & Amendments avatar

EU Tender Watch: TED Deadlines & Amendments

Pricing

from $3.00 / 1,000 tender rows

Go to Apify Store
EU Tender Watch: TED Deadlines & Amendments

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

Clark Scroggin

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

18 hours ago

Last modified

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, title and status (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) or amendment (a later notice of a tracked procedure).
  • stage is the status this notice shows: planning, competition, awarded, closed-no-award, direct-award-intent, contract-modification, completion, cancelled or other. A change notice whose reason is a cancellation (cancel, cancel-intent) is cancelled. A result notice is closed-no-award only when every lot reports "closed, no winner"; awardOutcome gives the detail (winner-selected, partly-awarded, closed-no-winner, no-winner-yet).
  • deadline is 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, and deadlineType says which one it is. lots lists each lot's deadline when the notice has 2 or more lots.
  • estimatedValue is 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 become null. awardedValue is the total awarded on result notices, when published.
  • title is 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.
  • changes is a list of {field, previous, current} objects; the flat columns previousDeadline / currentDeadline, previousValue / currentValue, previousTitle and previousStatus hold 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 / changeReasonText on change notices give the buyer's stated reason, e.g. update-add "Verlängerung der Angebotsfrist" (deadline extension).
  • tedUrl is the notice page on ted.europa.eu in the English interface, and tedUrlOriginal the same page in the original language. xmlUrl is the eForms XML and pdfUrl the PDF.
  • buyerName is the first buyer; otherBuyersCount counts 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

  1. Pick your shortlist. countries (buyer country, ISO 3-letter: DEU, FRA, ITA, ESP, POL, NLD...), cpvCodes (prefixes: 72 all IT services, 722 software, 45 construction) and optionally keywords (searched in the notice's full text by TED; add translations, because notices are in the buyer's language).
  2. Optionally narrow new rows: deadlineAfter: "today" keeps only tenders still open; minEstimatedValue sets a floor on the estimated value.
  3. Name the watch (watchName). The first run is a baseline: everything in the window is new. A first run with daysBack: 30 gives the watch a month of history, so later changes can be matched to tenders published before you started.
  4. Schedule it daily with daysBack: 3 (covers weekends; already-seen notices cost nothing). TED publishes Monday to Friday.
  5. 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

FieldTypeDefaultWhat it does
countriesstring[]["DEU"]Buyer countries, ISO 3-letter (2-letter codes are converted). Empty = all.
cpvCodesstring[]["72"]CPV codes or prefixes (2–8 digits; 72200000-7 accepted). Matches main and additional CPV codes. Empty = all.
keywordsstring[][]Full-text words or phrases (any of them).
noticeStagesenum[]competitionWhich notices start a new row: competition, planning, result, direct-award, modification. Amendments of tracked tenders are always reported.
daysBackint 1–303Notices published in the last N days.
deadlineAfterdate / todaynoneNew rows only: keep tenders with a deadline on or after this date.
minEstimatedValuenumbernoneNew rows only: minimum estimated value.
includeMissingValuebooltrueWith a minimum value set, keep notices that disclose no value.
onlyNewbooltrueWatch mode. Off = one-off report of the window, nothing remembered (changes within the window are still detected).
watchNamestringdefaultMemory key (named key-value store ted-watch-<name>).
maxItemsint50Max rows (charged events) per run; the rest comes with the next run.
maxNoticesScannedint1000Max notices read from TED per run (250 per request).
followTrackedTendersbooltrueAlso look up later notices of up to maxTrackedChecked open tracked tenders (50 per request), so awards and cancellations are caught even outside your filters.
maxTrackedCheckedint100See above.
includeUnchangedFollowUpsboolfalseAlso output follow-up notices that change none of the tracked fields.
expertQuerystringnoneAdvanced TED expert query (replaces the filters above; no SORT BY).

Pricing

Pay per event: you pay for rows delivered, plus a small start fee.

EventPriceWhen
Actor start$0.005Once per run, even when nothing is new
tender-notice$0.003Per 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 daysBack if you need history.
  • Only the fields listed above are compared. Other edits (documents, criteria, lot descriptions) appear only through includeUnchangedFollowUps and 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[].estimatedValue is null.
  • keywords use 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.
  • maxItems caps 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 the daysBack window.

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.