# EU Public Tenders (TED) (`great_stuff/eu-tenders-ted`) Actor

EU public procurement notices from the official TED API—buyer, CPV, country, value, deadline, winner and links.

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

## Pricing

from $2.00 / 1,000 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 Public Tenders (TED)

> Source: **TED – Tenders Electronic Daily** (ted.europa.eu), Publications Office of the European Union. Data is reused under Commission Decision 2011/833/EU. This Actor is not affiliated with or endorsed by the European Union, and only the Official Journal (OJ S) version of a notice is authentic. Records are reformatted (fields renamed, values deduplicated) from the TED Search API.

Search **EU public procurement** in TED, the EU's official journal for tenders, using the official **TED Search API v3**. Every call for tenders, prior information notice and contract award above the EU thresholds is published there: about 700,000 notices a year from all 27 member states plus EEA and other countries. Each one comes back as a clean record with the title (translated into your language), buyer, country, CPV codes, estimated value, tender deadline, **winners and awarded value**, and links to the notice page, PDF and XML.

### Use cases

- **B2B sales and bid teams**: a daily feed of new tenders in your CPV codes and countries, filtered by deadline and value.
- **Bid-writing and tender-alert consultancies**: monitor many sectors for clients.
- **Competitive intelligence**: who wins which contracts, at what price (contract awards with winners).
- **Market research and journalists**: analyze public spending by country, sector or buyer.

### How to use

1. Add **Keywords** (full-text, any language) and/or **CPV codes** (e.g. `72` = IT services, `33100000` = medical equipment, `45` = construction).
2. Optionally pick **Buyer countries** (`DE`, `FR`, `IE`, or `DEU`…), **Notice types** (calls for tenders, prior information, contract awards, changes), **Published within N days**, **Only open tenders** and a **Minimum value**.
3. Choose the **Title language** and **Max results**, then run. Schedule it daily for alerts.

### Input

| Field | Type | Description |
|---|---|---|
| `keywords` | array | Full-text terms, OR-combined. |
| `cpvCodes` | array | CPV codes, 2–8 digits (padded with zeros); sub-codes included. |
| `countries` | array | Buyer country, ISO 2- or 3-letter. |
| `formTypes` | array | `competition`, `planning`, `result`, `change`. Empty = all. |
| `postedWithinDays` | integer | Published in the last N days (default 7). |
| `openOnly` | boolean | Only notices with a tender deadline today or later. |
| `minEstimatedValue` | integer | Minimum estimated value (awarded value for results). Drops notices without a value. |
| `language` | string | Title and link language (default English). |
| `maxResults` | integer | Stop after N notices (default 100, up to 15,000). |

Example:

```json
{ "cpvCodes": ["72"], "countries": ["DE", "FR", "IE"], "formTypes": ["competition"], "openOnly": true, "postedWithinDays": 14, "minEstimatedValue": 100000, "maxResults": 150 }
```

### Output

Results are newest first. A call for tenders:

```json
{
  "noticeId": "745642-2026",
  "title": "France – Vehicles for the emergency services – Fourniture et aménagement d'un véhicule d'intervention à risque radiologique (VRAD)",
  "originalTitle": "Fourniture et aménagement d'un véhicule d'intervention à risque radiologique (VRAD)",
  "originalLanguage": "fra",
  "description": "Fourniture et aménagement d'un véhicule d'intervention à risque radiologique (VRAD)…",
  "formType": "competition",
  "noticeType": "cn-standard",
  "procedureType": "open",
  "contractNature": [
    "supplies"
  ],
  "buyerName": "SDIS DE L'ISERE",
  "buyerCity": "Fontaine",
  "buyerCountry": "FRA",
  "buyerWebsite": "https://www.sdis38.fr/",
  "placeOfPerformance": [
    "FRK24",
    "FRA"
  ],
  "mainCpv": "34144200",
  "cpvCodes": [
    "34144200",
    "51000000"
  ],
  "estimatedValue": null,
  "estimatedValueCurrency": null,
  "tenderDeadline": "2026-11-27",
  "publicationDate": "2026-10-28",
  "winners": [],
  "winnerCountries": [],
  "awardedTotalValue": null,
  "awardedCurrency": null,
  "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/745642-2026",
  "pdfUrl": "https://ted.europa.eu/en/notice/745642-2026/pdf",
  "xmlUrl": "https://ted.europa.eu/en/notice/745642-2026/xml",
  "attribution": "Source: TED - Tenders Electronic Daily (ted.europa.eu), Publications Office of the European Union. Reused under Commission Decision 2011/833/EU; only the Official Journal (OJ S) version is authentic.",
  "scrapedAt": "2026-10-28T13:54:03.684Z"
}
```

A contract award (title language German):

```json
{
  "noticeId": "747370-2026",
  "title": "Spanien – Möbel – Suministro, instalación, integración y puesta en marcha del equipamiento integrado del ecosistema de innovación digital y emprendimiento del territorio (C2IET), en el Marco del Plan de Recuperación, Transformación y Resiliencia, financiado por la UE-Next Generation EU",
  "originalTitle": "Suministro, instalación, integración y puesta en marcha del equipamiento integrado del ecosistema de innovación digital y emprendimiento del territorio (C2IET), en el Marco del Plan de Recuperación, Transformación y Resiliencia, financiado por la UE-Next Generation EU",
  "originalLanguage": "spa",
  "description": "Constituye el objeto del presente contrato el suministro, instalación, integración y puesta en marcha del equipamiento integral del edificio C2IET (Centro Integ…",
  "formType": "result",
  "noticeType": "can-standard",
  "procedureType": "open",
  "contractNature": [
    "supplies"
  ],
  "buyerName": "Alcaldia del Ayuntamiento de Ponferrada",
  "buyerCity": "Ponferrada",
  "buyerCountry": "ESP",
  "buyerWebsite": "http://www.ponferrada.org",
  "placeOfPerformance": [
    "ES413",
    "ESP"
  ],
  "mainCpv": "39100000",
  "cpvCodes": [
    "39100000",
    "30200000",
    "32320000",
    "32500000",
    "33100000",
    "38000000"
  ],
  "estimatedValue": null,
  "estimatedValueCurrency": null,
  "tenderDeadline": null,
  "publicationDate": "2026-10-28",
  "winners": [
    "PROCONSI, S.L."
  ],
  "winnerCountries": [
    "ESP"
  ],
  "awardedTotalValue": 476162,
  "awardedCurrency": "EUR",
  "noticeUrl": "https://ted.europa.eu/de/notice/-/detail/747370-2026",
  "pdfUrl": "https://ted.europa.eu/de/notice/747370-2026/pdf",
  "xmlUrl": "https://ted.europa.eu/en/notice/747370-2026/xml",
  "attribution": "Source: TED - Tenders Electronic Daily (ted.europa.eu), Publications Office of the European Union. Reused under Commission Decision 2011/833/EU; only the Official Journal (OJ S) version is authentic.",
  "scrapedAt": "2026-10-28T13:54:03.684Z"
}
```

Fields can be empty when the buyer did not publish them: many notices have no estimated value, and some awards are marked "value not disclosed" (TED's `-1`), which this Actor returns as `null`. `description` is in the notice's original language. `title` is TED's translation into the language you picked.

### Pricing

Pay per result: **$0.002 per notice** saved to the dataset (event `notice`), so 1,000 notices cost $2. You are never charged for notices dropped by your filters. Set a maximum charge on the run and the Actor stops cleanly when it is reached.

### Limits and tips

- TED returns at most **15,000 notices per search**. The Actor warns you when there are more; narrow the dates, countries or CPV codes.
- Searches run about 2 requests per second, well under TED's fair-use limit of 700 requests per minute.
- An unknown CPV or country code fails the run with TED's own error message, e.g. `Value '99999999' is not supported for search field 'classification-cpv'`.
- Every record carries an `attribution` field; keep it when you republish the data.
- Coverage: a small number of buyer countries are not supported. Notices from or performed in them are skipped (never charged), and the `countries` field tells you if a code is unavailable.

### FAQ

**What is TED?**
Tenders Electronic Daily, the official EU journal for public procurement notices from the EU, EEA and partner countries.

**Which languages are supported?**
Titles come in any of the 24 official EU languages (`language`). The original-language title and description are always included.

**Why are there at most 15,000 notices per search?**
That is the TED search API limit. Narrow the dates, countries or CPV codes to get the rest.

**Will I pay for duplicates?**
No. A notice is saved and charged once per run, even if TED shifts results between pages.

### Legal

TED notices are published by the Publications Office of the EU and may be reused, commercially or not, under Commission Decision 2011/833/EU, provided the source is acknowledged and changes are indicated. This Actor does that in every record. It uses only the public, anonymous TED Search API (no login, no scraping of web pages). It does **not** collect buyer contact emails or personal contact persons. Check the TED legal notice (https://ted.europa.eu/en/legal-notice) for your use case.

# Actor input Schema

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

Full-text search terms (any language); notices matching any keyword are returned. Example: "software", "cybersecurity", "cloud".

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

Common Procurement Vocabulary codes, 8 digits or a shorter prefix that is padded with zeros (72 -> 72000000, IT services). Matching includes sub-codes.

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

ISO country codes of the buying authority, 2- or 3-letter (DE or DEU, FR, IE...).

## `formTypes` (type: `array`):

competition = open calls for tenders; planning = prior information; result = contract awards (with winners); change = corrections.

## `postedWithinDays` (type: `integer`):

Only notices published in the last N days.

## `openOnly` (type: `boolean`):

Keep notices whose tender deadline is today or later.

## `minEstimatedValue` (type: `integer`):

Keep notices whose estimated value (or awarded value for results) is at least this amount, in the notice currency (mostly EUR). Notices without a value are dropped when set. 0 = off.

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

Language for the translated notice title and the notice/PDF links. The original title and description are always included.

## `maxResults` (type: `integer`):

Stop after this many notices. One search can return up to 15,000.

## Actor input object example

```json
{
  "keywords": [
    "software"
  ],
  "cpvCodes": [],
  "countries": [],
  "formTypes": [
    "competition"
  ],
  "postedWithinDays": 3,
  "openOnly": false,
  "minEstimatedValue": 0,
  "language": "eng",
  "maxResults": 25
}
```

# Actor output Schema

## `items` (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 = {
    "keywords": [
        "software"
    ],
    "formTypes": [
        "competition"
    ],
    "postedWithinDays": 3,
    "maxResults": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("great_stuff/eu-tenders-ted").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 = {
    "keywords": ["software"],
    "formTypes": ["competition"],
    "postedWithinDays": 3,
    "maxResults": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("great_stuff/eu-tenders-ted").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 '{
  "keywords": [
    "software"
  ],
  "formTypes": [
    "competition"
  ],
  "postedWithinDays": 3,
  "maxResults": 25
}' |
apify call great_stuff/eu-tenders-ted --silent --output-dataset

```

## MCP server setup

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

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/BD0f8VIeRaf97QXOR/builds/Vk2mTpYizmL0DStYk/openapi.json
