# EU Tenders & Contract Awards Feed (TED, daily, CPV filters) (`moment-data/eu-ted-tenders-feed`) Actor

New EU public tenders and contract awards from TED (Tenders Electronic Daily, all EU/EEA buyers). Filter by country, CPV code, keyword, buyer or value; get English titles, deadlines, values and winning companies. 'New since last run' mode for daily bid alerts.

- **URL**: https://apify.com/moment-data/eu-ted-tenders-feed.md
- **Developed by:** [Luke Miller](https://apify.com/moment-data) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## EU Tenders & Contract Awards Feed (TED): New Public Tenders, Awards & Winners Daily

Get every new **EU public procurement notice** from **TED (Tenders Electronic Daily)**, the official journal for public tenders across the EU/EEA, as clean JSON/CSV/Excel. Filter by **buyer country, CPV code, keyword, buyer name or contract value**, read **English titles** for notices written in any language, see **submission deadlines, estimated values, awarded values and winning companies**, and run it on a schedule with **"new since last run"** mode so you only get (and pay for) notices you have not seen.

No API key, no login, no browser: it uses the official, free TED Search API.

### Who it's for

- **Bid and sales teams** selling to the public sector in Europe: a daily list of new calls for tender in your CPV codes and countries, with deadlines and estimated values.
- **Bid consultants and tender-alert services**: one feed per client via saved inputs (`stateKey`), delivered to Slack, email, Google Sheets or your CRM through Apify integrations.
- **Market and competitor intelligence**: contract awards show who won, for how much, from which buyer, in which sector.
- **Agencies and suppliers in a niche** (marketing/events CPV 79952000, IT 72, construction 45, medical 33, translation 79530000 ...): spot buyers that procure what you sell.
- **Data and AI pipelines**: structured, deduplicated notices for dashboards, LLM summarisation and lead scoring.

### What you get

Each record is one TED notice:

- **What**: English title (TED machine-translated title "Country – CPV – original title"), original title and language, description, CPV codes, contract nature (works/supplies/services), procedure type, framework agreement flag.
- **Who buys**: buyer organisation, country, city, buyer legal type, place of performance (NUTS codes and cities).
- **Money and dates**: estimated value and currency, submission deadline (calls for tender), awarded total value and currency (awards).
- **Who won** (awards): winning organisations, winner countries and enterprise sizes.
- **Links**: TED notice page, PDF and XML.

### Quick start

1. Click **Try for free** and run with the default input `{}`: you get the 30 newest notices from the last 3 days (15 calls for tender + 15 contract awards) in a few seconds.
2. Narrow it down, for example IT tenders from Germany and Austria that are still open:

```json
{ "noticeKinds": ["competition"], "countries": ["DE", "AT"], "cpvCodes": ["72"], "onlyOpenTenders": true, "maxItems": 100 }
```

3. For alerts, set `"mode": "sinceLastRun"` and **schedule** the Actor daily (TED publishes Monday-Friday). Each run returns only notices you have not received yet. Use a different `stateKey` per saved search.

#### More recipes

- Marketing, events and promotional services across the EU: `{ "cpvCodes": ["79340000", "79950000", "79952000", "39294100"], "noticeKinds": ["competition"] }`
- Big construction awards in Poland: `{ "noticeKinds": ["award"], "countries": ["PL"], "cpvCodes": ["45"], "minValue": 5000000 }`
- Hospital buyers anywhere: `{ "buyerKeywords": ["hospital", "Klinikum", "szpital", "hôpital"] }`
- Full-text search: `{ "keywords": ["cybersecurity", "SOC"], "lookbackDays": 14 }`

### Input

| Field | Default | Description |
|---|---|---|
| `mode` | `window` | `window` = stateless lookback; `sinceLastRun` = only notices not delivered before (saved per `stateKey`) |
| `noticeKinds` | `["competition","award"]` | also `planning`, `modification`, `completion` |
| `lookbackDays` | 3 | publication-date window (1-90) |
| `countries` | all | buyer country ISO codes, 2 or 3 letters |
| `cpvCodes` | all | CPV codes or prefixes; sub-codes included |
| `keywords` | none | full-text match, any of the words/phrases |
| `buyerKeywords` | none | buyer name contains any of these |
| `minValue` | none | estimated or awarded value at least this (notice currency) |
| `onlyOpenTenders` | false | calls for tender with a deadline today or later |
| `language` | `eng` | preferred language for titles/descriptions |
| `maxItems` | 30 | max notices per run (split fairly across kinds), newest first |
| `stateKey` | `default` | separate saved state per saved search |

### Output (example, real records from Oct 30, 2026, trimmed)

```json
[
  {
    "publicationNumber": "756372-2026",
    "noticeKind": "competition",
    "noticeType": "cn-standard",
    "publicationDate": "2026-10-30",
    "dispatchDate": "2026-10-29",
    "title": "Germany – Construction work – Ulm, JVA, Ersatzbau Küchengebäude VE5530 Erd-, Entwässerungskanal- und Kabeltiefbauarbeiten, Oberflächenwiederherstellung",
    "titleOriginal": "Ulm, JVA, Ersatzbau Küchengebäude VE5530 Erd-, Entwässerungskanal- und Kabeltiefbauarbeiten, Oberflächenwiederherstellung",
    "originalLanguage": "deu",
    "description": "VE5530 Erd-, Entwässerungskanal- und Kabeltiefbauarbeiten, Oberflächenwiederherstellung",
    "buyerName": "Vermögen und Bau Baden-Württemberg, Amt Ulm",
    "buyerCountry": "DEU",
    "buyerCity": "Ulm",
    "buyerLegalType": "ra",
    "contractNature": [
      "works"
    ],
    "procedureType": "open",
    "cpvCodes": [
      "45000000"
    ],
    "mainCpv": "45000000",
    "placeOfPerformanceNuts": [
      "DE144"
    ],
    "placeOfPerformanceCities": [
      "Ulm"
    ],
    "estimatedValue": 393064.1,
    "estimatedValueCurrency": "EUR",
    "awardedTotalValue": null,
    "awardedCurrency": null,
    "tenderDeadline": "2026-12-01",
    "frameworkAgreement": false,
    "winners": [],
    "winnersWithheld": 0,
    "winnerCountries": [],
    "winnerSizes": [],
    "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/756372-2026",
    "pdfUrl": "https://ted.europa.eu/en/notice/756372-2026/pdf",
    "xmlUrl": "https://ted.europa.eu/en/notice/756372-2026/xml",
    "source": "TED - Tenders Electronic Daily (Publications Office of the EU)"
  },
  {
    "publicationNumber": "756370-2026",
    "noticeKind": "award",
    "noticeType": "can-standard",
    "publicationDate": "2026-10-30",
    "dispatchDate": "2026-10-29",
    "title": "Czechia – Seats, chairs and related products, and associated parts – Dynamický nákupní systém na dodávky sedacího nábytku",
    "titleOriginal": "Dynamický nákupní systém na dodávky sedacího nábytku",
    "originalLanguage": "ces",
    "description": "Předmětem zadávacího řízení je zavedení dynamického nákupního systému s elektronickým katalogem pro zadávání veřejných zakázek na dodávky sedacího nábytku pro F…",
    "buyerName": "Fakultní nemocnice Brno",
    "buyerCountry": "CZE",
    "buyerCity": "Brno",
    "buyerLegalType": "body-pl-cga",
    "contractNature": [
      "supplies"
    ],
    "procedureType": "oth-single",
    "cpvCodes": [
      "39110000",
      "39111100",
      "39112000"
    ],
    "mainCpv": "39110000",
    "placeOfPerformanceNuts": [
      "CZ064"
    ],
    "placeOfPerformanceCities": [],
    "estimatedValue": 16000000,
    "estimatedValueCurrency": "CZK",
    "awardedTotalValue": 2034500,
    "awardedCurrency": "CZK",
    "tenderDeadline": null,
    "frameworkAgreement": false,
    "winners": [
      "Multised, spol. s r.o."
    ],
    "winnersWithheld": 0,
    "winnerCountries": [
      "CZE"
    ],
    "winnerSizes": [
      "sme"
    ],
    "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/756370-2026",
    "pdfUrl": "https://ted.europa.eu/en/notice/756370-2026/pdf",
    "xmlUrl": "https://ted.europa.eu/en/notice/756370-2026/xml",
    "source": "TED - Tenders Electronic Daily (Publications Office of the EU)"
  }
]
```

A run summary is saved to the `OUTPUT` record: window, total matches per notice kind on TED, filters dropped, winners withheld.

### Data source, timing and fair use

- Source: **TED - Tenders Electronic Daily**, published by the Publications Office of the European Union, via the public TED Search API (v3). TED content is reusable under Commission Decision 2011/833/EU; © European Union. This Actor is not an official EU service.
- TED publishes about 2,500-4,000 notices per working day (Monday-Friday). The default 3-day window therefore always has data, including on weekends.
- Requests are few and sequential (one API page per notice kind for a default run), with retries and back-off.
- **Privacy**: buyer names are public bodies. Winner names are output **only when clearly an organisation** (company legal form such as GmbH, SA, sp. z o.o., s.r.o., Ltd; a single-word brand; or all winners on the notice are medium/large enterprises). Names that may be sole traders or individuals are withheld and counted in `winnersWithheld`. Contact names, emails and phone numbers are never output.
- Values are in each notice's own currency (EUR, PLN, CZK, SEK ...); `minValue` compares without FX conversion.

### Pricing

Pay per event (Apify takes care of billing; you only pay for what is delivered):

| Event | Price | Charged |
|---|---|---|
| `apify-actor-start` | $0.005 | once per run |
| `tender-record` | $0.003 | per notice delivered |

A default test run (30 notices) costs about $0.095. A daily filtered alert (~15 notices/day) costs about $0.05/day. `maxItems` and Apify's *max cost per run* cap your spend; the Actor stops delivering when your budget is reached, so you are never charged for more than you set. No separate platform-usage charges: compute is included in the event prices.

### FAQ

**Which countries are covered?** All buyers that publish on TED: the 27 EU member states plus EEA/other countries that use TED (e.g. Norway, Iceland, Switzerland and some candidate countries). Below-threshold national tenders that are not sent to TED are not included.

**Why do titles start with a country and a category?** That is TED's official English notice title (country – main CPV description – original title). The original-language title is in `titleOriginal`.

**Why are some winners missing?** Either the notice does not name winners (calls for tender, unsuccessful procedures) or the winner may be a sole trader/individual and is withheld for privacy (`winnersWithheld` > 0). Open `noticeUrl` for the full official notice.

**How do CPV prefixes work?** `72` or `72000000` matches every IT-services code below it; `7922` matches 79220000 and its children.

**Can I get older notices?** Yes, up to 90 days with `lookbackDays`. For larger backfills raise `maxItems`.

**Is this legal to use commercially?** TED data is published for reuse with attribution under the EU reuse policy. You remain responsible for how you use it (e.g. GDPR if you add personal data from other sources).

# Actor input Schema

## `mode` (type: `string`):

window (default): notices published in the lookback window, no saved state. sinceLastRun: only notices not delivered before for this State key; use this for daily schedules.

## `noticeKinds` (type: `array`):

competition: calls for tenders you can bid on (contract notices, PINs used as call for competition, qualification systems). award: contract award notices with winners and values. planning: prior information notices. modification: contract modifications. completion: contract completion notices.

## `lookbackDays` (type: `integer`):

Publication-date window. TED publishes ~2,500-4,000 notices each working day (Monday-Friday). Also the first-run window in sinceLastRun mode.

## `countries` (type: `array`):

ISO country codes of the contracting authority, e.g. DE, FR, PL, IE (2- or 3-letter). Empty = all countries.

## `cpvCodes` (type: `array`):

Common Procurement Vocabulary codes. Prefixes match sub-codes: 72 or 72000000 = all IT services, 7922 = advertising/marketing, 45 = construction work, 33 = medical equipment.

## `keywords` (type: `array`):

Any of these words or phrases anywhere in the notice (any language as written in the notice, e.g. 'software', 'Software', 'logiciel').

## `buyerKeywords` (type: `array`):

Only notices whose buyer name contains one of these words, e.g. 'university', 'Universität', 'hospital'.

## `minValue` (type: `integer`):

Keep notices whose estimated or awarded value is at least this amount (in the notice's own currency, no FX). Notices without a published value are dropped when this is set.

## `onlyOpenTenders` (type: `boolean`):

Keep only calls for tender whose submission deadline is today or later.

## `language` (type: `string`):

Language for titles/descriptions when TED has it (TED machine-translates notice titles into all EU languages). Falls back to English, then the original language.

## `maxItems` (type: `integer`):

Maximum notices delivered (and charged) per run, split fairly between notice kinds. Newest first.

## `stateKey` (type: `string`):

Only for sinceLastRun: separate saved state per saved search, e.g. 'it-germany'.

## Actor input object example

```json
{
  "mode": "window",
  "noticeKinds": [
    "competition",
    "award"
  ],
  "lookbackDays": 3,
  "countries": [],
  "cpvCodes": [],
  "keywords": [],
  "buyerKeywords": [],
  "onlyOpenTenders": false,
  "language": "eng",
  "maxItems": 30,
  "stateKey": "default"
}
```

# Actor output Schema

## `notices` (type: `string`):

One record per TED notice (call for tender, award, ...).

## `summary` (type: `string`):

Window, matches per notice kind, filters dropped, winners withheld.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "mode": "window",
    "noticeKinds": [
        "competition",
        "award"
    ],
    "lookbackDays": 3,
    "countries": [],
    "cpvCodes": [],
    "keywords": [],
    "buyerKeywords": [],
    "onlyOpenTenders": false,
    "language": "eng",
    "maxItems": 30,
    "stateKey": "default"
};

// Run the Actor and wait for it to finish
const run = await client.actor("moment-data/eu-ted-tenders-feed").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "mode": "window",
    "noticeKinds": [
        "competition",
        "award",
    ],
    "lookbackDays": 3,
    "countries": [],
    "cpvCodes": [],
    "keywords": [],
    "buyerKeywords": [],
    "onlyOpenTenders": False,
    "language": "eng",
    "maxItems": 30,
    "stateKey": "default",
}

# Run the Actor and wait for it to finish
run = client.actor("moment-data/eu-ted-tenders-feed").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "mode": "window",
  "noticeKinds": [
    "competition",
    "award"
  ],
  "lookbackDays": 3,
  "countries": [],
  "cpvCodes": [],
  "keywords": [],
  "buyerKeywords": [],
  "onlyOpenTenders": false,
  "language": "eng",
  "maxItems": 30,
  "stateKey": "default"
}' |
apify call moment-data/eu-ted-tenders-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,moment-data/eu-ted-tenders-feed"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/YM79lfx0xXeIarJRb/builds/K4t9MJJrR4AM7HUA7/openapi.json
