EU Tender Monitor (TED) avatar

EU Tender Monitor (TED)

Pricing

Pay per usage

Go to Apify Store
EU Tender Monitor (TED)

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

certex

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

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

  1. Use countries for discovery or noticeIds for exact tender tracking.
  2. Use monitoringMode and diff only with noticeIds.
  3. Consume the dataset, CHANGES, and SUMMARY in 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, and tags
  • 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 -> DEU
  • PL -> POL
  • FR -> FRA
  • CZ -> CZE
  • SK -> SVK
  • GR or EL -> 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: trackingName is shared storage identity, not a private label. If another Actor user picks the same trackingName, 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 new the first time it is seen in that tracking stream
  • trackingName is 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 example customer-a-hospital-bids-2026-q1
  • if you materially change the tracked list, using a new trackingName is 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 CPV 72000000 and search terms such as software and it
  • construction - adds CPV 45000000 and the search term construction
  • consulting - adds CPV 79000000 and the search term consulting

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, and publishedTo are pushed into the TED API query
  • keywords are applied after fetch for intelligent ranking
  • when keywords are used, maxResults must not exceed 1000

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 searchTerms broad and let keywords express 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.

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:

  • telegramEnabled
  • telegramBotToken
  • telegramChatId

Message modes:

  • summary sends one run summary message
  • items sends tender item messages
  • both sends 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 SUMMARY and the Actor run continues
  • set failOnTelegramError: true if 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: true together with webhookUrl
  • choose webhookPayloadMode as summary, items, or both
  • add webhookSecret to send an X-Webhook-Secret header
  • add webhookHeaders for extra custom headers
  • summary mode now includes run totals such as totalFetched, totalAfterFiltering, and totalOutput, so it stays useful even when diffing is disabled
  • by default, webhook delivery errors are reported in SUMMARY without failing the whole run
  • set failOnWebhookError: true if 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 maxResults when you only need the top slice of current notices
  • using daysBack for recent monitoring instead of broad open-ended date searches
  • using noticeIds with monitoringMode when 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 maxResults at 1000 or below when you use keywords

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.