TED Tender Monitor - EU Tender Alerts & CPV avatar

TED Tender Monitor - EU Tender Alerts & CPV

Pricing

from $5.00 / 1,000 new tenders

Go to Apify Store
TED Tender Monitor - EU Tender Alerts & CPV

TED Tender Monitor - EU Tender Alerts & CPV

TED tender monitor for new or changed EU procurement notices and TED procurement alerts. Filter EU tenders by CPV code, country, keyword, value, or notice type and receive EU tender alerts as JSON or signed webhooks. Unofficial and not affiliated with TED, the EU, or its Publications Office.

Pricing

from $5.00 / 1,000 new tenders

Rating

0.0

(0)

Developer

Telemark Digital

Telemark Digital

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

a month ago

Last modified

Share

TED Tender Monitor - EU Tender Alerts & CPV is a TED tender monitor for official TED notices on a schedule. It checks the official TED Search API and delivers EU tender alerts and TED procurement alerts for only new or changed notices matching CPV code, country, keyword, minimum known EUR value, or notice type as structured JSON and optional HMAC-signed webhooks.

Independent service notice: This is an unofficial, independent community Actor. It is not affiliated with, endorsed by, or operated by TED, the European Union, or the Publications Office of the European Union.

Monitor TED tenders for TED procurement alerts by CPV, country, keyword, and value

  • Filter EU tenders by CPV code prefix, buyer country, keyword, minimum known EUR value, and TED notice type.
  • Receive new and changed notices as structured JSON in an Apify dataset and, optionally, as one HMAC-signed webhook per run.
  • Pay only for delivered new or changed notices. Sample runs, the first prime run, duplicates, skipped records, quiet days, and failures before durable dataset/state commit trigger no tender event charge.

30-second quickstart

  1. Leave Free sample mode on and click Start. You will receive up to ten of the newest matching competition notices, with no state and no tender charge. The preview stops after three TED pages or 120 seconds.
  2. Save the configuration as your own Apify Task, turn sample mode off, and run that Task once. This free prime run records the current matching publication numbers but delivers no tenders, preventing a historical flood.
  3. Attach a schedule to that same Task. Add a signed webhook if your CRM, agent, or automation needs push delivery.

TED tender monitor example: German IT tenders by CPV and value

Use this CPV tender monitor search to preview German IT procurement notices with a minimum known procedure value of EUR 100,000:

{
"sampleMode": true,
"cpvCodes": ["72"],
"countries": ["DEU"],
"minValueEur": 100000,
"maxNewPerRun": 10
}

CPV prefix 72 covers IT services; DEU selects the buyer's country, not necessarily the delivery location. The value threshold applies only to known procedure-level EUR values. Notices with an unknown value or a non-EUR value can still appear with valueUnknown: true; no currency conversion is performed. If your workflow requires a strict known-value shortlist, keep only records with valueUnknown: false and estimatedValueEur >= 100000.

The preview returns up to ten matching tender records plus a summary. A narrow search can legitimately return zero tenders: check the summary before treating that as an error. Sample mode writes no monitoring history and triggers no tender event charge.

To receive recurring EU tender alerts, save this input as your own Task, set sampleMode to false, and run that Task once. This first monitoring run creates a prime record and intentionally delivers no historical tenders. Then attach a schedule to the same Task. Subsequent runs deliver newly detected notices and changes; a quiet run can return a summary with no tender records. Changing CPV, country or value filters creates a new monitoring history and primes again.

Verified sample result

On 22 September 2026, this exact preview returned ten matching notices: two with known EUR values and eight flagged with unknown values. Results change as TED publishes notices. One returned notice was 652809-2026:

{
"publicationNumber": "652809-2026",
"title": "Germany – Feasibility study, advisory service, analysis – Erstellung einer strukturierten Bedarfs- und Entwicklungsplanung für die Feuerwehr Hamburg",
"buyerCountry": "DEU",
"cpvCodes": [
"71241000",
"71318000",
"72221000",
"72246000",
"73220000",
"79415200",
"85312320"
],
"estimatedValueEur": 450000,
"valueUnknown": false
}

Public TED, CPV, and EU tender alert examples

Use these public Apify Task examples as ready-made starting points. Each example runs in free sample mode, writes no monitoring state, and shows the exact JSON dataset shape before you copy the filter into a persistent scheduled Task.

Intent clusterPublic example
AI procurementMonitor EU AI procurement notices
Cybersecurity procurementTrack EU cybersecurity tenders
German managed detectionFind German managed detection tenders
Healthcare and medical equipmentFind EU healthcare tenders
French medical equipmentFind French medical equipment tenders
Public sector SaaS and cloudMonitor public sector SaaS tenders
EU software by CPVWatch CPV 72 software tenders
German software previewPreview EU software tenders by CPV code
Polish IT servicesFind Polish IT services tenders
Construction and public worksTrack EU construction procurement
Renewable energy procurementMonitor EU renewable energy procurement
Change notices and corrigendaTrack TED change notices and corrigenda
JSON procurement outputPreview recent EU procurement notices as JSON

Why most TED monitors silently lose tenders

TED's publication-date has day-level granularity. Thousands of notices can share one value, so SORT BY publication-date DESC plus page-number pagination does not define a stable order. Repeating the same page can change its membership while a new Official Journal release arrives; page-number mode also documents that cross-page consistency is not guaranteed.

This Actor avoids that trap:

  1. It queries a publication-date overlap window but sorts by deterministic publication-number DESC.
  2. It uses TED's point-in-time-consistent ITERATION pagination until the result set is exhausted.
  3. It normalizes and sorts deliveries by (publicationDate ASC, publicationNumber ASC within that date).
  4. It deduplicates on universal publication-number, including pre-eForms notices that have no UUID.
  5. It journals each attempted dataset record, commits seen state only after the complete dataset write, and verifies an interrupted run's actual dataset before recovering IDs. Unconfirmed records remain eligible for delivery and billing is never retried for an already committed ID.

Replayable correctness recipe

  • Run a new non-sample filter once: the dataset contains a prime record and zero tender deliveries.
  • Run the identical filter again without a new TED release: the summary reports zero new tenders and the run costs $0 in tender events.
  • Change a state-defining filter such as CPV, country, keyword, minimum value, or notice type: the canonical state key changes and the new filter primes separately.

For an independent API check, send the same keyless TED Search request twice with SORT BY publication-number DESC; the ordered publication numbers remain stable. Do not use date-only page 1 as a cursor.

Choosing the right workflow

  • Use official TED alerts when a person wants procurement notices delivered to a human inbox.
  • Use procurement enrichment platforms when the workflow needs analytics, curation, or contractual SLAs.
  • Use this Actor when an Apify workflow needs stateful new-or-changed monitoring with machine-readable datasets and webhooks.

This is a tender monitor, not an award analytics product, translation service, multi-source portal, or bid-scoring tool.

Input reference

InputDefaultMeaning
sampleModetrueReturn up to ten newest matches within a three-page, 120-second preview; write no state; charge no tender events. Set explicitly to false for normal stateful monitoring.
cpvCodes[]CPV prefixes, 2–8 digits. 72 covers IT; 45 covers construction. Empty means all sectors.
countries[]Buyer countries as ISO alpha-3 codes such as DEU, FRA, ESP.
keywords[]OR-matched full-text words or phrases. Terms are safely quoted.
minValueEur0Minimum for known procedure-level EUR values. Unknown or non-EUR values still pass with valueUnknown=true. No FX conversion is performed.
noticeTypescompetition typesOne or more accepted TED codes listed below.
includeChangeNoticestrueInclude modern linked changes and automatically add can-modif plus legacy corr to the TED query.
lookbackDays3Minimum overlap. Effective lookback automatically expands to the actual run gap plus one day.
maxNewPerRun5000Delivery/billing ceiling from 1–10,000. Excess matches are explicitly deferred oldest-first.
webhookUrlunsetOptional HTTP(S) destination; must be supplied with webhookSecret.
webhookSecretunsetSecret used for X-Watch-Signature.
stateKeyTask + filter hashAdvanced override. Giving multiple Tasks the same value deliberately makes them share state.

Accepted current notice types are brin-ecs, brin-eeig, can-desg, can-modif, can-social, can-standard, can-tran, cn-desg, cn-social, cn-standard, compl, pin-buyer, pin-cfc-social, pin-cfc-standard, pin-only, pin-rtl, pin-tran, pmc, qu-sy, subco, and veat. Live legacy code corr is also accepted.

The default state key is SHA-256 over the Apify Task identity and canonical sorted cpvCodes, countries, keywords, minValueEur, and noticeTypes. Ad-hoc runs use the Apify user identity as their scope. Separate Tasks therefore keep independent history even when their filters are identical. An explicit stateKey deliberately overrides this isolation so multiple Tasks can share state. Delivery-only settings do not silently fork historical state. Suppressed changes are not marked seen, so enabling change delivery later can surface them once. Runs sharing one state key are serialized with an Apify Request Queue lease; an overlapping run exits before delivery or billing.

Output schema

The default dataset contains three explicit record types:

  • tender: one delivered new or changed notice.
  • prime: the required free first-run information record.
  • summary: counts and overflow/budget flags for sample and monitoring runs.

Representative tender record:

{
"recordType": "tender",
"publicationNumber": "488405-2026",
"noticeIdentifier": "69d7fb9a-e58b-4f91-a2fd-7d59312fde31",
"publicationDate": "2026-07-15",
"noticeType": "cn-standard",
"isChangeNotice": false,
"modifiesPublicationNumber": null,
"title": "Spain – Repair and maintenance services of electrical building installations – …",
"titleLanguage": "eng",
"buyerName": "Reus Mobilitat i Serveis SA",
"buyerCountry": "ESP",
"cpvCodes": ["50711000"],
"estimatedValueEur": null,
"valueUnknown": true,
"deadlineDate": "2026-09-14",
"links": {
"html": "https://ted.europa.eu/en/notice/-/detail/488405-2026",
"pdf": "https://ted.europa.eu/en/notice/488405-2026/pdf",
"xml": "https://ted.europa.eu/en/notice/488405-2026/xml"
},
"isNew": true,
"firstSeenAt": "2026-07-16T09:00:00.000Z",
"stateKey": "sha256:…"
}

Title selection is deterministic: eng when present, otherwise the alphabetically first available ISO-639-2 language key. CPVs are a deduplicated notice/lot union. The value is procedure-level only; lot values are never summed. The earliest valid lot deadline is exposed. Missing fields remain null and are never invented.

Pricing and billing honesty

  • new-tender: $0.005 per newly delivered notice.
  • changed-tender: $0.005 per delivered correction or modification.
  • Actor start: no start event is configured; platform usage is included rather than added to the event price.
  • Sample, prime, duplicate, malformed, skipped, and quiet paths: $0 tender event charge. Failures before durable dataset/state commit also trigger no tender event charge.

Charging happens immediately after filtering, deduplication, and durable dataset/state delivery. It is the first post-commit operation, before final summary persistence, webhook retries, lease release, or cleanup. The Actor reads the run's maximum-charge limit and defers work that cannot fit. A rare platform charge failure after delivery is never retried for the same publication number; preserving “never billed twice” takes priority over developer revenue.

The summary row written with the dataset records the attempted new-tender and changed-tender counts with chargeStatus: "pending", because dataset delivery necessarily precedes billing. The final OUTPUT key-value-store summary records both attempted and actual charged counts and sets chargeStatus to complete, partial, or failed. Sample and quiet paths report zero actual tender charges.

A corrigendum is new information and is billed as its own changed-tender event. Therefore one procurement can produce up to two charges: the original new-tender, then its later correction. This is deliberate and visible in isChangeNotice.

Scheduling, signed webhooks, and integrations

Save a primed input as an Apify Task, then choose the cadence that matches your filter. Narrow CPV/country filters can run hourly or daily. Broad EU-wide filters should run daily or increase maxNewPerRun; persistent filters whose protected in-window seen-set alone would exceed 150,000 IDs fail explicitly instead of evicting IDs and rebilling them.

When configured, the webhook body is the JSON array of tender records only. Headers:

  • X-Watch-Signature: lowercase hex HMAC-SHA256 of the exact body using webhookSecret.
  • X-Watch-Run-Id: the Apify run ID.

Webhook delivery makes one initial attempt plus three retries with backoff. Every request has a 15-second timeout and runs after durable dataset/state commit and the single non-retried billing attempt. A slow or failed webhook therefore cannot delay or suppress billing, remove dataset results, or repeat a charge.

Connect the dataset or run event through Apify integrations to Make, Zapier, n8n, Slack, cloud storage, or your own API. AI agents can discover this Actor through the Apify MCP server using Store search, inspect its schema, add it as a tool, and call it; it is not automatically preinstalled in every agent.

Run through the Apify API

Use an Authorization header so your token is not placed in a URL or log:

curl -X POST "https://api.apify.com/v2/acts/uplifted_novice_vbl~ted-tender-watch/runs" \
-H "Authorization: Bearer YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"sampleMode":true,"cpvCodes":["72"],"countries":["DEU"]}'

The run response links to its default dataset. For scheduled monitoring, save the same JSON as an Apify Task, set sampleMode=false, run that Task once to prime, then attach a schedule to the same Task.

Change notices

Modern eForms changes are detected from change-notice-version-identifier or modification-previous-notice-identifier. TED also still serves legacy notice-type=corr records whose linkage fields can be empty, so corr is treated as a change for compatibility. modifiesPublicationNumber is set only when a linkage value is actually a TED publication number; UUID/version identifiers are not mislabeled.

If includeChangeNotices=false, change records are neither delivered nor added to the seen-set. Enabling the option later can deliver a previously suppressed change once.

Limits, errors, and FAQ

Can I monitor TED tenders by CPV code?

Yes. Add one or more CPV prefixes such as 72 for IT/software, 45 for construction, or a more specific 4- to 8-digit prefix. The public examples include CPV 72 software tenders and EU software tenders by CPV code.

Can I get EU procurement alerts as JSON or signed webhooks?

Yes. Each run writes structured JSON records to the Apify dataset. If you add webhookUrl and webhookSecret, the Actor also sends an HMAC-signed webhook after durable dataset/state commit.

Can I get TED procurement alerts for specific CPV codes?

Yes. Use cpvCodes, countries, keywords, minValueEur, and noticeTypes together to turn the same persistent Task into narrow TED procurement alerts for a sector, country, buyer pattern, or contract type.

How is this different from a TED tender scraper?

It is a stateful tender monitor, not a one-off scraper. A persistent Task primes once, then returns only new or changed TED procurement notices that match the same CPV, country, keyword, value, and notice-type filter.

What data source is used?

Only the official keyless TED API v3 Search endpoint. There is no HTML scraping fallback, no login, and no third-party tender source.

What happens during TED rate limits or outages?

The client self-caps at two requests per second. HTTP 429 and 5xx responses retry after approximately 1, 4, and 16 seconds. Persistent failure ends cleanly before state advancement or tender charges.

Can a malformed notice stop the batch?

No. A notice missing the universal publication number or publication date is logged, skipped, and never charged. An unknown stored state schema does stop the run with a clear error; state is never wiped or guessed.

Does minimum value convert currencies?

No. Current eForms procedure values come from BT-27 fields; older global aliases are a fallback. Only an unambiguous EUR procedure value is compared. Missing, ambiguous, and non-EUR values remain deliverable as unknown so a potentially relevant opportunity is not silently lost.

What is not included in v1?

AI relevance scoring, summaries, translation, per-lot output, email formatting, award analytics, historical backfill, national portals, currency conversion, a custom MCP server, and a separate dashboard are intentionally out of scope.

Where can I get support?

Open the Actor's Issues tab in Apify Console with the run ID, input with secrets removed, and the relevant log excerpt. Do not post webhook secrets or Apify tokens.

European teams may search for the same job using terms such as przetargi, appalti, ausschreibung, or licitaciones. The Actor is built for TED Europa, eForms, CPV, EU tenders, procurement pipelines, a tender alert, and a stateful tender monitor.

Changelog

0.1 — 2026-07-16

Initial publish-ready release: deterministic ITERATION client, stateful new-only delivery, current eForms and legacy mapping, signed webhooks, honest PPE events, complete Apify schemas, and recovery-aware deduplication.