EU TED Tender & Award Monitor avatar

EU TED Tender & Award Monitor

Pricing

from $10.00 / 1,000 useful history notices

Go to Apify Store
EU TED Tender & Award Monitor

EU TED Tender & Award Monitor

Search EU TED tenders and monitor lot deadlines, awards and winning suppliers. Export values, tender counts and verified changes for your CRM.

Pricing

from $10.00 / 1,000 useful history notices

Rating

0.0

(0)

Developer

Vadim Bezrukov

Vadim Bezrukov

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

What does EU TED Tender & Award Monitor do?

Search EU procurement notices, follow tender histories and inspect published awards and winning suppliers. Turn TED links, procedure identifiers or search filters into JSON/CSV-ready records for a procurement watchlist, CRM or analysis. The first successful monitor run returns a baseline; repeat runs identify newly observed publications and verified changes.

Use the official TED Search API and Open Data Service through this independent Actor. The default example, 107799-2025, includes a Czech road tender, a deadline correction and an award for CZK 4,000,000. Published award statistics identify five received tenders and an award decision dated 2025-04-01. Fields that TED does not publish remain null; a missing field is never a cancellation or a lost contract.

This repository describes the schema-2 upgrade. Its new search inputs must be deployed before using them on the hosted Actor. The technical Actor slug and existing API inputs remain unchanged.

Monitor tenders from announcement to award

Supply procedureIds, publicationNumbers, or the existing targets / tedUrls. An entry in targets accepts exactly one noticeId, tedUrl or procedureId, plus an optional externalRef for your CRM. Each input gets a target_status, including invalid entries and duplicate aliases. Shared histories are delivered once; join business-row input_indices to target_status.input_index for every CRM reference.

Notice UUID, version, publication number and explicit procedure references carry identity. A title never establishes a relationship. Lots are notice-scoped; cross-notice continuity requires an explicit lot reference or a unique shared internal lot identifier. Ambiguous references remain visible as evidence/issues. Unresolved links do not justify moving an award onto another procedure or lot.

Track competitor contract wins

Use winnerNames to discover award/result publications. Search first finds candidates; normalized whole-token phrase matching then verifies supplier names. Accenture matches Accenture Outsourcing Services, but not NotAccenture. winner_matches reports matched_winner_query, matched_winner_name and EXACT_NORMALIZED or CONTAINS. No fuzzy matching or corporate alias resolution is claimed.

Selected notices expand into their linked histories. Those histories may include other suppliers or older awards: use winner_matches on award/winner rows to select the requested supplier, and publication_date for the reporting window. Search filters select notices; they do not filter every row in an expanded history.

Track tender and lot deadline changes

Corrections compare the full normalized states of verified lot tracks, including lots omitted from the declared changed-section list. Deadlines retain their raw source offset and a UTC instant. previous_deadline comes from a unique verified parent; deadline_extension_days is the elapsed UTC difference divided by 86,400. A negative value means a shortened deadline. Date-only or unknown-zone values do not produce an elapsed-time delta.

Analyze awards and procurement outcomes

Award rows contain winners, winning-tender value, currency, tender count and award decision date when published. Contract rows retain their own lot reference, conclusion date and value. A conflicting contract/tender relationship is reported without transferring the tender's winner or value to the wrong contract.

Derived fields are deterministic convenience calculations, not official TED metrics:

FieldMeaning
award_vs_estimate_pct(winning value - estimate) / estimate * 100, rounded to four decimals. Requires matching currency/scope, a positive estimate and one award outcome for that lot observation.
single_bidtrue for one received tender, false for more than one, otherwise null.
competition_intensity1: SINGLE_BID; 2–3: LOW; 4–7: MEDIUM; 8+: HIGH; zero/missing: NONE_OR_UNKNOWN.
time_to_award_daysAward decision's local calendar date minus the latest uniquely linked tender deadline's local date. Negative/unknown comparisons are null. Publication dates are never substituted.

Multiple winners remain separate winner rows for the same award. Its full value is repeated with JOINT_AWARD_NOT_ALLOCATED; do not sum those winner rows as separate contracts. No FX conversion, supplier success rate or bid-win rate is calculated: TED award publications do not expose every supplier's submitted bids.

What data do you get?

The default Dataset preserves existing snake_case record types and adds winner_observation and search_status. Each row includes schema_version: 2, source, stable source_id, source_url, UTC scraped_at and a deterministic fingerprint. KVS state retains its existing version/layout; no baseline reset is required. Parser version 3 causes a refresh; newly interpreted historical events are marked INTERPRETATION_UPDATED, rather than presented as new buyer activity.

Views: Opportunities, Changes, Awards, Winners, plus the existing dossiers, statuses and evidence views. Views select columns, not row types. Filter downloaded records by record_type; award-only exports use award_outcome, winner-only exports use winner_observation. No unsupported server-side view filter is claimed.

Events include NEW_PROCEDURE, NEW_NOTICE, NEW_LOT, DEADLINE_CHANGED, ESTIMATED_VALUE_CHANGED, LOT_STATUS_CHANGED, AWARD_PUBLISHED, AWARD_CORRECTED, AWARD_VALUE_CHANGED, WINNER_CHANGED, TENDERS_RECEIVED_CHANGED, CONTRACT_PUBLISHED and contract-modification events. NEW_* means first observed in the verified history, not guaranteed earliest publication in TED. Baseline history is backfill. For notifications use only crm_eligible: true; deduplicate by event_id.

Input examples

Find new EU tender publications:

{"keywords":["cybersecurity"],"countries":["DEU"],"daysBack":7,"maxResults":100}

Monitor an existing tender:

{"publicationNumbers":["107799-2025"],"monitorKey":"important-bids","mode":"changesOnly"}

Track competitor awards:

{"winnerNames":["Accenture","Capgemini"],"countries":["DEU","FRA"],"cpvCodes":["72"],"daysBack":30,"monitorKey":"competitors"}

buyerNames, publicationDateFrom/To, deadlineFrom/To, minEstimatedValue, maxEstimatedValue and currency are also supported. Dates are inclusive YYYY-MM-DD. Use daysBack or explicit publication dates. Countries identify buyers, not the place of performance. CPV accepts 2–8 digit prefixes. TED's notice-level filters may match different lots in the same notice; inspect the lot records before making a bid decision. Competition publications are not guaranteed still open: check the current verified deadline.

Use search filters or an identifier watchlist, not both. Search defaults to a 30-day window and 100 candidate notices; arrays accept up to 20 search values. maxResults bounds candidates, not the number of rows or expanded history notices. When capped, narrow the dates/filters: incomplete searches do not advance state. includeLots, includeAwards, includeChanges and includeDerivedMetrics control output. They do not eliminate the source verification required for safe monitoring.

Output examples

A subset of the live Czech award observation:

{"record_type":"award_outcome","schema_version":2,"notice":"273334-2025","lot_handle":"LOT-0001","award_status":"WINNER_SELECTED","winning_value":{"amount":"4000000","currency":"CZK","value_type":"WINNING_TENDER","scope":"LOT","source_notice":"273334-2025"},"tenders_received":5,"award_decision_date":"2025-04-01","single_bid":false,"competition_intensity":"MEDIUM"}

search_status distinguishes SUCCESS, NO_RESULTS, PARTIAL, SOURCE_FAILED and SUSPICIOUS_EMPTY. target_status.outcome retains SUCCESS, PARTIAL, NOT_FOUND, INVALID_INPUT, FAILED and SKIPPED_LIMIT. A successful empty search is different from a request failure. A previously populated search becoming empty preserves state for investigation.

Schedule monitoring

Save a monitoring input and schedule it daily in your Apify account, for example at 07:00 UTC (0 7 * * *). Keep monitorKey unchanged. It uses the persistent ted-tender-award-monitor KVS in your account, with a namespace derived from the monitor name and search filters. The first run emits a baseline; quiet repeats still emit statuses. Changing filters creates a separate comparison namespace.

Existing mode: "monitor", watchlistId, and exactly one of stateStoreId or stateStoreName remain supported. Do not combine those fields with monitorKey. Use snapshotAndChanges with monitorKey for snapshots plus changes on each run; without it, the mode is a non-persistent snapshot.

A run-success webhook can deliver the Dataset URL to n8n, Make or your CRM. Fetch rows and process crm_eligible events only; inspect RUN_SUMMARY for partial coverage first. Local Task drafts are in examples/upgrade-task-drafts.json. Creating schedules, publishing Tasks and running paid jobs are separate actions.

API / automation use

Start the unchanged Actor slug automa-flow/eu-ted-tender-history-award-tracker through the Apify API with your input JSON and a deliberate maxTotalChargeUsd run setting. Read RUN_SUMMARY and the default Dataset, then join aliases through input_indices. scripts/crm_adapter.py demonstrates deduplication and CRM export.

Direct MCP endpoint: https://mcp.apify.com?tools=automa-flow/eu-ted-tender-history-award-tracker. Example: “Inspect TED 107799-2025, show winning suppliers and tender counts, flag unresolved links, and cap the run at $0.10.” Use your own authenticated Apify session. New hosted schema/MCP exposure must be rechecked after this upgrade is deployed; earlier checks do not establish availability of these new inputs.

Pricing

The existing contract remains $0.01 per useful unique notice version (history-notice) and $0.01 per completed repeat procedure check (watch-check). An unchanged successful check is still a paid check. Baseline has no check fee. There is no extra fee for metrics, winner rows, retries, aliases or failure rows. Award, lot and event rows belonging to one notice do not multiply its history fee.

For a three-useful-notice history, baseline is $0.03 and 30 successful quiet checks are $0.30. This is an example workload, not an average. A $0.10 evaluation cap may stop a longer history with explicit partial output. The minimum spend limit is $0.01, not a minimum invoice. No useful billable units means zero custom events. The upgrade's four offline baskets are in examples/upgrade-benchmark.json; new hosted cost and margin remain unmeasured.

Limitations

  • Monitoring reflects published TED data. External buyer portals may publish clarifications earlier; the Actor does not follow third-party documents.
  • ODS enrichment can lag Search. Pending, failed and partial enrichment are explicit and retain known values. No missing value means cancellation/no-award.
  • Legacy WINNER_SELECTED, NO_WINNER, UNKNOWN meanings are preserved. Procedure-wide cancellation/status transitions are not inferred from partial lot results. Dedicated cancellation classification is outside the verified mapping.
  • Lot/result continuity can remain unresolved. Contract identity across different notices is not proven by reusing CON-0001; term-level deltas require evidence.
  • Winner-name matching is not legal-entity resolution. Published data may omit winners, currencies, dates, values or tender counts.
  • Three transport attempts are bounded. HTTP 429 opens a circuit immediately; the reported Retry-After should guide the next run. No proxy rotation or browser.
  • Concurrent writers fail closed. Delivery is at-least-once; keep event IDs and billing receipts, and do not delete an active writer's lock. Export Dataset history before account retention removes it.

TED, Publications Office of the European Union, © European Union. This Actor normalizes and interprets published data and is not endorsed by TED. See the Search API documentation and TED legal notice, rechecked 2026-09-13. Public procurement notices are reusable subject to the stated exceptions; third-party rights and personal-data rules still apply. No contact emails, telephone numbers, personal addresses or bidder profiles are collected. Organisation identifiers can identify sole traders: retain only what the procurement workflow needs.

From the repository root, uv run pytest actors/eu-ted-tender-history-award-tracker/tests runs offline tests. scripts/local_run.py performs a bounded public HTTP snapshot without Apify billing; scripts/revalidate_upgrade.py refreshes the source evidence. For support, provide the public publication number, run ID and disputed field; do not send credentials or an entire CRM export.