EU Tender Match
Pricing
from $5.00 / 1,000 results
EU Tender Match
Find and rank relevant European public procurement opportunities from the official TED Search API.
Pricing
from $5.00 / 1,000 results
Rating
0.0
(0)
Developer
LEMAIRE ANTOINE
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
EU Tender Match — European procurement opportunity monitor
Search published European procurement notices using simple country, sector and date filters. Return structured fields, explain the words matched and optionally suppress previously delivered notices in a recurring watch. The source is the official TED Search API v3. No language model, browser or proxy is used by this implementation.
Quick start: French IT notices
{"countries": ["FR"],"sector": "it","lookbackDays": 30,"noticeKind": "competition","keywords": [],"matchingMode": "words","limit": 5,"maxPages": 1,"minKeywordMatches": 0,"maxResults": 5,"maxRuntimeSeconds": 60,"historyMode": "off"}
The rolling publication window includes today in UTC. competition selects notice types; it does not establish that the submission deadline is still open. A successful empty search is possible. A five-result cap is not a promise that five relevant notices exist.
Simple and expert search
In simple mode, choose buyer countries, sector, optional cpvCodes, lookbackDays and noticeKind. IT uses CPV families 48* and 72*; construction uses 45*; engineering uses 71*. Additional CPV codes are OR-combined with the preset. These presets are practical starting points, not exhaustive industry definitions.
Supply a non-empty tedQuery to use TED Expert Search instead. The expert query takes precedence over all simple search filters. Do not assume that a country selected in the form also restricts an expert query.
For compatibility, existing API inputs with tedQuery and no explicit matchingMode use legacy substring matching and the original default fields. Select matchingMode: "words" explicitly to use the improved matching. New simple searches use words by default. A caller-provided fields list replaces the defaults; publication-number is always included.
Matching you can inspect
words matches complete literal tokens and phrases, ignoring case and accents. It does not translate, stem or infer intent. For example, data does not match datamateriel; logiciel and logiciels are distinct terms. Use variants as appropriate.
The preferred matching fields are procedure/lot titles and descriptions. When none is available, the Actor falls back to the multilingual notice-title and adds a warning: this field can contain generic CPV labels. A category phrase such as “except software packages” can therefore still produce a literal match in fallback mode. This is not semantic AI.
excludeKeywords removes a notice when any excluded term matches. minKeywordMatches is the minimum count of distinct requested terms. matchScore is the rounded percentage of requested terms matched, not a probability of eligibility or contract award. With no keywords in words mode, the score is null and matchingStatus explains that scoring was not performed. Legacy mode preserves its previous no-keyword score of 100.
Each result includes matchEvidence, with the actual source fields and bounded literal passages, and matchWarnings when applicable.
Readable results without invented data
The default dataset exposes flat columns for publication number/date, title, buyer, buyer country, CPV codes, notice type/category, tender deadlines when supplied, estimated procedure value/currency when unambiguous, direct TED URL, score and matched terms.
The original notice, source, matchScore and matchedKeywords keys remain available. TED may return multilingual/nested values. The preferred output language selects a value already present; it does not translate missing content.
Missing or ambiguous values remain null. An estimated value is a decimal string, not a guessed contract price. Submission deadlines use explicit tender-receipt fields, not an additional-information deadline. Dates may refer to different lots and do not establish opening hours or time zones. Always inspect the underlying notice before deciding to submit a bid. deadlineStatus is descriptive, never an isOpen guarantee.
Recurring watches
Set historyMode to newOnly or newOrChanged and provide a stable watchName. History is scoped by Actor, watch name and selection fingerprint in the account owning the run. A different country, keyword set or returned field list creates a separate selection history. Changing the current day does not reset a simple rolling-window watch.
newOnly suppresses publication numbers already confirmed as delivered. newOrChanged also emits a previously delivered publication number when its returned raw content changes. This is notice-level history, not procedure-level aggregation: a new publication number for a correction or award is a new notice. It is not necessarily a new commercial opportunity.
The first pass delivers matching notices within the scan limits. The same incomplete scan repeated can return more previously undelivered notices; zero on the second pass is guaranteed only for an identical sample already fully delivered. Default retention is 90 days, configurable from 7 to 365 days. After expiry an older notice can be delivered again. History is capped at 20,000 entries; capacity problems fail explicitly rather than silently resetting history.
Concurrent runs of the same watch use a lease. A busy watch stops with WATCH_BUSY. A crashed lease expires after 600 seconds. History is committed after verified dataset writes. A crash in that cross-service gap can cause a repeat; exactly-once delivery is not promised. Migration/resurrection into an already populated default dataset is deliberately rejected; start a new run.
Limits, costs and failures
limit controls page size (1–250). maxPages caps pages (1–10; default 1). maxResults caps delivered items (1–250). Ranking is within each inspected page, not across the entire TED corpus. SUMMARY records inspected counts, delivered counts, stop reason and whether the query was exhausted. A capped run is marked BOUNDED_PARTIAL, even if the process succeeds.
The work phase has a time limit of 15–180 seconds. Initialization and diagnostic cleanup can add time. HTTP responses are bounded to 8 MiB and recoverable requests to three attempts. Persistent history and verification reads consume additional platform storage operations; actual cloud costs must be measured.
When configured on Apify, the synthetic default-dataset event is charged by the platform. The implementation does not add a duplicate custom charge. It checks the reported event budget before further collection/writes. Platform usage and billing depend on the caller's Apify plan and the Store pricing currently configured for this Actor.
Malformed or timed-out TED responses fail rather than becoming billable result rows. Rows delivered before a later error may remain in the dataset; inspect SUMMARY and do not assume a failed run delivered nothing.