# EU TED Tenders & Contract Awards (Official API, EUR, Delta) (`knobby_woodworker_aig/eu-ted-tenders`) Actor

EU public tenders and contract awards from the official TED API. Filter by CPV (incl. sub-codes), country, stage, keywords, open-for-bids. Adds English category, sector, region names, days to deadline, values in EUR, winners and bid counts. Only-new mode.

- **URL**: https://apify.com/knobby_woodworker_aig/eu-ted-tenders.md
- **Developed by:** [Reval](https://apify.com/knobby_woodworker_aig) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.50 / 1,000 eu tender notices

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 TED Tenders & Contract Awards (Official API, EUR, Delta)

Every EU public tender and contract award published on **TED (Tenders Electronic Daily)**, the EU's official procurement journal, as one clean table. Data comes from the **official TED Search API v3**. No scraping of web pages, no API key, no proxies.

### Problems this fixes

| Common complaint about TED scrapers | What this Actor does |
|---|---|
| Titles only in Polish, French, German… and AI translation costs extra | Every row gets **summaryEnglish** ("Poland – Security software package – …") and **mainCpvLabel** in English, plus a plain-English **sector**. These are built from TED's own multilingual labels, at no extra cost |
| CPV filter only matches the exact code | Parent CPV codes **include all sub-codes** (72000000 = every IT service). Short codes like `45` or `7226` work too |
| Values in 20 currencies, so you can't sort | **estimatedValueEur** and **awardValueEur** are converted with the ECB daily reference rates |
| NUTS codes like `DE212` mean nothing | **placeOfPerformanceRegions** with real names (Eurostat GISCO) and country names |
| Same notices delivered every day | **Only-new (delta) mode** keeps publication numbers between scheduled runs |
| Awards and tenders need two different tools | Tenders, awards, planning (PIN), VEAT, modifications and consultations in one schema, with ready-made views |
| No idea if a tender is still open | **deadline**, **daysUntilDeadline**, **deadlineStatus**, plus an **open-for-bids only** filter |
| Awards don't show who won or how competitive it was | **winners**, winner country and size (SME/large), award value, **tendersReceived**, tenders from SMEs and from other EEA/non-EEA countries |

### Output fields (highlights)

`publicationNumber, stage, publicationDate, title (original), titleEnglish (when the buyer provided one), summaryEnglish, description, buyerName, buyerCity, buyerCountry, mainCpv, mainCpvLabel, sector, cpvCodes, contractNature, procedureType, lotCount, placeOfPerformanceRegions, deadline, daysUntilDeadline, estimatedValue (+ currency, EUR), durationValue/unit, frameworkAgreement, euFunded, winners, winnerCountries, winnerSizes, awardValue (+ currency, EUR), tendersReceived, contractConclusionDate, documentsUrl, submissionUrl, noticeUrl, pdfUrl, xmlUrl`

### Example uses

- **Daily bid alerts:** CPV 72000000 + countries DE, NL + open-for-bids only + delta mode, scheduled every morning and sent to Sheets or Slack
- **Competitor tracking:** contract awards in your CPV codes, then filter on `winners`
- **Market sizing:** award values in EUR by sector, country and year
- **Lead generation for suppliers:** public buyers who just awarded or announced similar contracts

### Pricing

Pay per result: you pay only for notices delivered. The enrichment (English labels, EUR values, region names, delta) is included.

### Data & privacy

Official TED open data (© European Union, reuse authorised under the EU Commission's reuse policy). Contact-person names, e-mails and phone numbers from notices are **deliberately not output**. Buyers are public bodies, and winners are the awarded organisations as published in the official notice. Not affiliated with the Publications Office of the EU.

# Actor input Schema

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

Full-text search across the notice. Multiple keywords are OR-ed, e.g. cloud, software, cybersecurity.

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

CPV codes; parent codes automatically include all sub-codes (72000000 = all IT services, 45 = all construction). Short codes like 72 or 4521 are padded.

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

ISO codes, 2 or 3 letters: DE, FR, PL, ESP, NLD…

## `stages` (type: `array`):

Leave empty for all stages.

## `contractNature` (type: `array`):

Leave empty for all.

## `procedureTypes` (type: `array`):

Optional TED codes: open, restricted, neg-w-call, neg-wo-call, comp-dial, innovation, oth-single, oth-mult.

## `openForBidsOnly` (type: `boolean`):

Keep only notices whose tender deadline is today or later.

## `daysBack` (type: `integer`):

Used when no start date is set: notices published in the last N days.

## `publishedFrom` (type: `string`):

YYYY-MM-DD (overrides Days back).

## `publishedTo` (type: `string`):

YYYY-MM-DD. Default today.

## `minValueEur` (type: `integer`):

Keep only notices whose award value (or estimated value) converted to EUR is at least this. Notices without a value are dropped when set.

## `customQuery` (type: `string`):

Optional extra clause AND-ed to the query, in TED expert-search syntax, e.g. buyer-city="Paris".

## `includeDescription` (type: `boolean`):

Procedure description in the original language.

## `addRegionNames` (type: `boolean`):

Resolve place-of-performance NUTS codes (e.g. DE212) to region names (München, Kreisfreie Stadt) using Eurostat GISCO.

## `onlyNew` (type: `boolean`):

Remember publication numbers between runs and output only notices not seen before. Ideal for daily tender alerts.

## `stateStoreName` (type: `string`):

Named key-value store for delta mode; use a different name per saved search.

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

Stop after this many rows.

## Actor input object example

```json
{
  "cpvCodes": [
    "72000000"
  ],
  "openForBidsOnly": false,
  "daysBack": 3,
  "includeDescription": true,
  "addRegionNames": true,
  "onlyNew": false,
  "stateStoreName": "eu-ted-tenders-state",
  "maxItems": 100
}
```

# Actor output Schema

## `tenders` (type: `string`):

No description

## `awards` (type: `string`):

No description

## `overview` (type: `string`):

No description

## `all` (type: `string`):

No description

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

No description

# 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 = {
    "cpvCodes": [
        "72000000"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("knobby_woodworker_aig/eu-ted-tenders").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 = { "cpvCodes": ["72000000"] }

# Run the Actor and wait for it to finish
run = client.actor("knobby_woodworker_aig/eu-ted-tenders").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 '{
  "cpvCodes": [
    "72000000"
  ]
}' |
apify call knobby_woodworker_aig/eu-ted-tenders --silent --output-dataset

```

## MCP server setup

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

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/hliJsu2K7qkHXdYGM/builds/Jr8ZmhCpl2c5Kq5mN/openapi.json
