TED Tender Monitor — EU Procurement Alerts avatar

TED Tender Monitor — EU Procurement Alerts

Pricing

from $5.00 / 1,000 new tenders

Go to Apify Store
TED Tender Monitor — EU Procurement Alerts

TED Tender Monitor — EU Procurement Alerts

TED tender monitor for new or changed EU public procurement notices. Filter by CPV, country, keyword, minimum 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

2

Total users

1

Monthly active users

2 hours ago

Last modified

Share

OSPREY is a TED tender monitor for EU procurement alerts. It checks the official TED Search API on a schedule and delivers only new or changed notices matching CPV, 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.

What it does

  • Filter EU tenders by CPV 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 the final charge step trigger no tender event charge.

30-second quickstart

  1. Leave Free sample mode on and click Start. You will receive the ten newest matching competition notices, with no state and no tender charge.
  2. Turn sample mode off and run the same input once. This free prime run records the current matching publication numbers but delivers no tenders, preventing a historical flood.
  3. Save the configuration as an Apify Task and schedule it. Add a signed webhook if your CRM, agent, or automation needs push delivery.

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.

Honest alternatives

OptionWhere it winsWhere TED Tender Watch wins
Established Apify TED scrapersThey already have adoption, a review history, and some offer AI enrichment or lower per-result pricing.This Actor delivers stateful only-new results, signed push, explicit change notices, and documented no-truncation behavior.
Existing delta-monitor ActorsSome already use a KV seen-set; one is cheaper.This implementation documents the date-sort failure, uses ITERATION paging, handles legacy corrigenda, exposes overflow, and tests no rebilling under backlog.
Official TED email and RSS alertsIf you just want an email, use TED's free alerts. They are the right choice for a person reading notices.This Actor is for machine-shaped JSON, pipelines, CRMs, automations, and agents.
Tender intelligence SaaS or flat-price APIsThey can provide curation, enrichment, support, analytics, and SLAs.This Actor is usage-priced, runs inside Apify, and is focused on correct new-only delivery rather than enrichment.

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

Input reference

InputDefaultMeaning
sampleModefalse (true in the Store prefill)Return ten newest matches; write no state; charge no tender events.
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.
stateKeyfilter hashAdvanced override. Use only when multiple Tasks must deliberately 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 canonical sorted cpvCodes, countries, keywords, minValueEur, and noticeTypes. 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 the final charge step also trigger no tender event charge.

Charging happens only after filtering, deduplication, and durable dataset/state delivery. 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.

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 state commit but before billing. A webhook failure never removes dataset results or repeats 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, use the same JSON with sampleMode=false, run it once to prime, then save it as an Apify Task and attach a schedule.

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

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.