EU Tender Monitor (TED)
Pricing
Pay per usage
EU Tender Monitor (TED)
Monitor and track EU tender notices from TED (Tenders Electronic Daily). Supports filtering, change detection, and automation-ready output.
Pricing
Pay per usage
Rating
0.0
(0)
Developer
certex
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
EU Tender Monitor
Monitor new and updated EU tenders from TED with change detection, smart filtering, and automation-ready output.
This Actor uses the official TED API for published notices, not page scraping. It monitors published tender data from TED and enriches it for filtering, scoring, and automation, but it does not browse websites, log in to portals, or submit tenders.
Quick Start
Smallest useful input:
{"countries": ["POL"]}
Easiest recent-monitoring input:
{"countries": ["POL"],"daysBack": 7}
Countries use ISO 3166-1 alpha-3 codes such as DEU, POL, and FRA.
The Actor also accepts common alpha-2 inputs such as DE, PL, and FR and normalizes them automatically to the alpha-3 format used in TED queries.
If you want to track a fixed shortlist of tenders directly, use noticeIds instead of countries.
How It Works
- Use
countriesfor discovery ornoticeIdsfor exact tender tracking. - Use
monitoringModeand diff only withnoticeIds. - Consume the dataset,
CHANGES, andSUMMARYin Apify, exports, or automations.
For exact tender tracking, use noticeIds to monitor up to 50 specific TED publication numbers without search-window churn.
daysBack is the simplest way to monitor recent tenders. If you set explicit publishedFrom or publishedTo, those dates override daysBack.
Monitoring snapshots are stored in a persistent named Apify key-value store (eu-tender-monitor-snapshots by default), so change detection works across cloud runs instead of only inside one run.
Why Use It
- Stop manually checking TED for the same notices again and again.
- See what is new, what changed, and what deserves attention first.
- Narrow results by country, CPV, title keywords, buyer name, and publication date.
- Use intelligent keyword matching to improve relevance across EU languages and wording differences.
- Feed flat, structured output into alerts, CRMs, spreadsheets, dashboards, Zapier, Make, or n8n.
Features Overview
- Official TED API access for published notices
- Exact tender tracking with snapshot diffing
- Filtering by country, CPV, title keywords, buyer name, and publication date
- Intelligent keyword matching for post-fetch ranking
- Actionable output fields such as
changeType,summary,relevanceScore, andtags - Optional TED metadata enrichments such as buyer and procedure identifiers, place of performance, extra titles and descriptions, and direct buyer or contract URLs when TED provides them
- Duplicate detection, trending insights, and helper fields for downstream workflows
- Supports bulk fetches up to 15000 notices per run
Supported Countries
The Actor currently supports TED notice monitoring for these country codes:
AUT, BEL, BGR, CHE, CYP, CZE, DEU, DNK, ESP, EST, FIN, FRA, GBR, GRC, HRV, HUN, IRL, ISL, ITA, LIE, LTU, LUX, LVA, MLT, NLD, NOR, POL, PRT, ROU, SVK, SVN, SWE
Recommended format in input: alpha-3 codes such as DEU, POL, and FRA.
For convenience, the Actor also normalizes common alpha-2 country inputs such as:
DE->DEUPL->POLFR->FRACZ->CZESK->SVKGRorEL->GRC
Example Input
{"countries": ["DEU"],"preset": "it","daysBack": 7,"maxResults": 50}
Exact Tender Tracking
If you already know which notices you want to follow, use noticeIds instead of search filters. This mode tracks a fixed shortlist of up to 50 TED publication numbers and avoids search result churn.
Example:
{"noticeIds": ["136392-2025", "140001-2025"],"monitoringMode": true,"enableDiff": true,"trackingName": "customer-a-hospital-bids-2026-q1"}
Warning:
trackingNameis shared storage identity, not a private label. If another Actor user picks the sametrackingName, they can accidentally overwrite or mix the monitoring history for that stream. Always use a highly unique name.
In exact tender tracking mode:
- the Actor fetches those exact notices directly
- search filters such as
countries,cpvCodes,daysBack, and keyword filters are not used - change detection compares the same fixed set across runs, which makes Telegram and webhook alerts much more predictable for shortlisted tenders
- if you remove a notice ID, it stops being tracked on the next run
- if you add a new notice ID, it appears as
newthe first time it is seen in that tracking stream trackingNameis the identity of the monitoring stream, not just a display label- if you reuse the same
trackingName, the Actor will continue the same monitoring history for that name - if another Actor user or workflow uses the same
trackingName, they will write into the same monitoring stream and can accidentally overwrite or mix your saved monitoring history - use a highly unique
trackingName, for examplecustomer-a-hospital-bids-2026-q1 - if you materially change the tracked list, using a new
trackingNameis the cleanest way to keep history easy to interpret
Presets (Quick Start)
Presets are pre-configured search shortcuts that add a basic CPV code and search term set for a common category.
Available presets:
it- adds CPV72000000and search terms such assoftwareanditconstruction- adds CPV45000000and the search termconstructionconsulting- adds CPV79000000and the search termconsulting
You can use a preset on its own or combine it with your own CPV codes, search terms, and keywords.
Example:
{"countries": ["DEU"],"preset": "it"}
Preset + custom filters example:
{"countries": ["DEU"],"preset": "it","cpvCodes": ["48814000"],"searchTerms": ["hospital software"],"keywords": ["hospital", "healthcare"]}
CPV Codes (Advanced)
Presets are just shortcuts. You can search using any CPV code directly with cpvCodes.
Example:
{"countries": ["DEU"],"cpvCodes": ["72200000"]}
Search Accuracy Note
Discovery mode fetches a TED result window first and then ranks the fetched results locally when keywords are used.
countries,cpvCodes,searchTerms,buyerNameContains,publishedFrom, andpublishedToare pushed into the TED API querykeywordsare applied after fetch for intelligent ranking- when
keywordsare used,maxResultsmust not exceed1000
Use keywords to intelligently rank tenders based on meaning, not just exact wording.
Keywords help match relevant tenders across EU languages and wording differences.
This improves relevance and reduces missed opportunities.
Keyword phrases usually produce the best results, especially for specific software or business workflows.
Example:
{"countries": ["DEU"],"searchTerms": ["software"],"keywords": ["hospital"]}
This searches TED for software-related notices and then ranks higher the notices that are relevant to hospitals or healthcare, even when described differently or in another EU language.
If you need deterministic change tracking for a fixed shortlist, use noticeIds instead of broad discovery filters.
Advanced Keyword Example
Keyword phrases usually work better than single broad words because they express clearer intent and reduce false positives.
Example:
{"countries": ["PL", "CZ", "SK", "DE"],"daysBack": 90,"searchTerms": ["system"],"keywords": ["school management system","student information system","digital learning"],"maxResults": 200}
This searches TED broadly for system-related notices and then ranks the results higher when they look relevant to schools, students, universities, or digital learning workflows.
For the best keyword quality:
- prefer short keyword phrases over single abstract words
- combine 2 to 5 related phrases when you know the use case well
- keep
searchTermsbroad and letkeywordsexpress the business intent
Matching Output Example
One dataset item can look like this:
{"sourceName": "ted","countryCode": "DEU","noticeId": "136392-2025","canonicalId": "ted:136392-2025","title": "Hospital software procurement","buyerName": "City Hospital Berlin","buyerIdentifier": "buyer-123","normalizedBuyerName": "city hospital berlin","region": "Berlin","publishedAt": "2025-03-03T00:00:00.000Z","cpvCodes": ["48814000"],"mainClassificationCode": "48814000","noticeType": "Contract notice","contractNature": "Services","procedureIdentifier": "proc-123","procedureType": "open","placeOfPerformanceCountry": "DEU","contractTitle": "Hospital software framework","scrapedAt": "2025-03-15T08:00:00.000Z","summary": "Tender: Hospital software procurement | country Germany | no deadline provided","isNew": false,"changeType": "updated","changedFields": ["title"],"changeSummary": "Updated fields: title","relevanceScore": 86,"matchReasons": ["Matches keyword 'hospital'", "Published recently"],"tags": ["cpv:48814000", "software"],"similarGroupId": "sim:k39wd1","isDuplicate": false,"url": "https://ted.europa.eu/en/notice/-/detail/136392-2025"}
CHANGES contains compact change events, and SUMMARY contains run-level counts plus trend indicators such as trendingCPVs and trendingKeywords.
When TED includes richer notice metadata, the Actor also adds optional fields such as buyerIdentifier, procedureIdentifier, mainClassificationCode, placeOfPerformanceCountry, contractTitle, lotTitle, lotDescription, procedureDescription, buyerProfileUrl, and contractUrl to make results easier to review and automate.
Recommended Schedule
For ongoing monitoring, the most practical setup is a daily or hourly schedule with noticeIds, monitoringMode: true, and enableDiff: true. That keeps each run focused on real changes for the same fixed tender list instead of diffing a shifting search window.
When monitoringMode is enabled, you should always set trackingName. It is the unique name of the monitoring stream for that tracked tender list, such as customer-a-hospital-bids-2026-q1 or team-eu-it-watchlist-2026-03.
Important: trackingName is shared storage identity, not a private label. If another user of this Actor chooses the same trackingName, they can accidentally overwrite or mix the monitoring history for that stream.
First monitoring run behavior is simple: if no earlier snapshot exists for that monitoring stream, all currently matching tenders are treated as new. Later runs return only what is new or changed compared with the saved snapshot.
If you need separate monitoring for different customers, teams, or tracked lists, use different and highly unique trackingName values. Reusing the same trackingName means reusing the same saved history.
Export & Formats
The default dataset can be exported from Apify in JSON, CSV, or Excel formats, which makes it easy to move results into reporting, spreadsheets, BI tools, and downstream workflows.
Direct Telegram Alerts
The Actor can send tender alerts directly to a Telegram chat using the Telegram Bot API.
Required fields:
telegramEnabledtelegramBotTokentelegramChatId
Message modes:
summarysends one run summary messageitemssends tender item messagesbothsends the summary followed by item messages
You can also set telegramDisablePreview: true to disable link previews. Telegram delivery is optional and works especially well with monitoringMode: true when you only want new or changed tenders.
Minimal example:
{"noticeIds": ["136392-2025", "140001-2025"],"monitoringMode": true,"enableDiff": true,"trackingName": "customer-a-hospital-bids-2026-q1-telegram","telegramEnabled": true,"telegramBotToken": "123456:telegram-bot-token","telegramChatId": "-1001234567890","telegramMessageMode": "both"}
Failure behavior is simple:
- by default, Telegram delivery errors are recorded in
SUMMARYand the Actor run continues - set
failOnTelegramError: trueif Telegram delivery failure should fail the run
The Actor still generates Telegram-friendly payloads, so direct delivery and external automation can be used separately if needed.
Direct Webhook Delivery
The Actor can now POST results directly to Zapier, Make, n8n, Slack-compatible webhooks, or custom HTTP endpoints.
- use
webhookEnabled: truetogether withwebhookUrl - choose
webhookPayloadModeassummary,items, orboth - add
webhookSecretto send anX-Webhook-Secretheader - add
webhookHeadersfor extra custom headers summarymode now includes run totals such astotalFetched,totalAfterFiltering, andtotalOutput, so it stays useful even when diffing is disabled- by default, webhook delivery errors are reported in
SUMMARYwithout failing the whole run - set
failOnWebhookError: trueif delivery failure should fail the run
Example direct webhook input:
{"noticeIds": ["136392-2025", "140001-2025"],"monitoringMode": true,"enableDiff": true,"trackingName": "customer-a-hospital-bids-2026-q1-webhook","webhookEnabled": true,"webhookUrl": "https://hooks.example.com/tenders","webhookPayloadMode": "both","webhookSecret": "shared-secret"}
Webhook-Ready Output
When webhookMode is enabled, the Actor also stores compact flat payloads for external automation tools in Apify output.
- useful for Zapier, Make, n8n, Slack, and webhook-driven internal systems
- keeps only the most operationally useful fields in a stable shape
- can be used on its own, even without direct outbound webhook delivery
Example webhook item:
{"canonicalId": "ted:136392-2025","title": "Hospital software procurement","summary": "Tender: Hospital software procurement | country Germany | no deadline provided","countryCode": "DEU","changeType": "updated","relevanceScore": 86,"url": "https://ted.europa.eu/en/notice/-/detail/136392-2025"}
Cost & Scale Tips
Keep runs lean and predictable by:
- limiting
maxResultswhen you only need the top slice of current notices - using
daysBackfor recent monitoring instead of broad open-ended date searches - using
noticeIdswithmonitoringModewhen you care about new or changed updates on a fixed shortlist - combining presets, CPV codes, keywords, and country filters to avoid broad low-signal runs
- keeping
maxResultsat1000or below when you usekeywords
If you want faster, cheaper recurring runs, narrow the search window first and then add more precision with presets or CPV filters.
The Actor supports bulk fetches up to 15000 notices per run. That is useful for wider discovery or export workflows. For recurring monitoring, use noticeIds so the tracked set stays stable across runs.
Monitoring storage cost is kept low by using one shared named snapshot store and overwriting one snapshot record per monitoring stream, rather than creating a new store for every run.
For simple recent monitoring, daysBack is often easier than managing exact date ranges manually.
Use Cases
- Business development teams tracking public-sector opportunities
- Market research teams watching activity in selected countries or sectors
- Procurement monitoring workflows that need structured change detection
- Automation pipelines that trigger alerts or enrichment when relevant tenders appear
Advanced Features
Source Coverage
Current source coverage is TED.