# EU Tenders (TED) Feed (`appropriate_songbird/eu-tenders-ted-feed`) Actor

European public tenders from TED (Tenders Electronic Daily) as clean, English-first data: title, buyer, country, CPV, value, deadline and links. Filter by country, CPV, notice type, keywords, value and deadline. Only-new delta mode.

- **URL**: https://apify.com/appropriate_songbird/eu-tenders-ted-feed.md
- **Developed by:** [Puneet](https://apify.com/appropriate_songbird) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.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 (TED) Feed

**Find European public contracts in plain English.** TED (Tenders Electronic Daily) publishes thousands of procurement notices a week from across the EU and EEA, in 24 languages. This Actor turns them into clean, English-first records you can filter, schedule and drop into a spreadsheet or CRM: title, buyer, country, CPV category, estimated value, deadline and links.

### Who it's for

- **Companies selling to the public sector in Europe:** IT, construction, engineering, medical, consulting, facilities and more.
- **Bid and tender consultants** monitoring several countries or sectors for clients.
- **Tender-alert and market-intelligence products** that need a reliable, structured daily feed.
- **Analysts** studying public demand by country and CPV category.

### Why this one

- **English-first output.** Each notice comes with TED's English title ("Germany – Software implementation services – …"), an English CPV category label, plain-English notice-type and procedure labels, and English country names. The original-language title is kept alongside.
- **Filters that matter:** buyer country (ISO-2 or ISO-3), CPV code or prefix, notice type, full-text keywords in any language, minimum EUR value and deadline. Power users get a raw expert-query box.
- **Both deadlines:** the tender deadline, plus the request-to-participate deadline for restricted and negotiated procedures. `daysUntilDeadline` is pre-computed.
- **Only new since last run:** schedule it daily and get just the new notices.
- **Privacy by design:** contact persons, emails, phones and **award-winner names are never requested** from the API. The output is organisation-level facts and links.
- **Rate-limit friendly:** well under TED's published fair-use limits, with backoff on errors.

### Sample output

```json
{
  "publicationNumber": "714885-2026",
  "publicationDate": "2026-10-15",
  "noticeType": "cn-standard",
  "noticeTypeLabel": "Contract notice",
  "title": "Netherlands – Software implementation services – Integratieplatform",
  "titleLanguage": "eng",
  "originalTitle": "Integratieplatform",
  "originalLanguage": "nld",
  "buyerName": "Provincie Noord-Brabant",
  "buyerCity": "'s-Hertogenbosch",
  "buyerCountry": "NLD",
  "buyerCountryName": "Netherlands",
  "placeOfPerformanceNuts": [],
  "placeOfPerformanceCountries": ["NLD"],
  "cpvCodes": ["72263000"],
  "mainCpv": "72263000",
  "mainCpvLabel": "Software implementation services",
  "contractNature": ["services"],
  "procedureType": "restricted",
  "procedureTypeLabel": "Restricted procedure",
  "estimatedValue": {"amount": null, "currency": null},
  "tenderDeadline": null,
  "requestToParticipateDeadline": "2026-11-17T10:00:00+01:00",
  "daysUntilDeadline": 33,
  "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/714885-2026",
  "pdfUrlEn": "https://ted.europa.eu/en/notice/714885-2026/pdf",
  "reuseNotice": "Procurement notice published in the Supplement to the Official Journal of the EU (TED); freely reusable for commercial or non-commercial purposes under Commission Decision 2011/833/EU. Independent tool, not affiliated with the Publications Office of the EU."
}
```

With **Include description** on, you also get `description` and `descriptionLanguage`. Descriptions are published in the buyer's language and are not machine-translated.

### Inputs

| Field | What it does | Example |
|---|---|---|
| `countries` | Buyer countries, ISO alpha-3 or alpha-2 | `["DEU", "FR", "NL"]` |
| `cpvCodes` | CPV code (sub-codes included) or prefix | `["72", "48000000"]` |
| `noticeTypes` | eForms types, default `cn-standard` (open contract notices) | `["cn-standard", "pin-cfc-standard"]` |
| `keywords` | Full-text terms or phrases, any language, match any | `["cloud", "logiciel"]` |
| `publishedWithinDays` | Look-back window, 1–90 | `3` |
| `minEstimatedValueEur` | Drop EUR notices below this | `100000` |
| `deadlineAfter` | Tender or request deadline on/after | `2026-11-01` |
| `preferredLanguage` | Title language (ISO 639-3), falls back to English | `eng` |
| `includeDescription` | Add procedure description | `false` |
| `expertQuery` | Raw TED expert query, replaces the filters | `buyer-country IN (IRL) AND classification-cpv IN (45*)` |
| `onlyNewSinceLastRun` | Delta mode (default on) | `true` |
| `maxResults` | Cap, newest first | `1000` |

**Tip:** run once per target market (for example "DACH IT services" or "Nordics construction") as saved Tasks on a daily schedule.

### Pricing (pay per event)

| Event | Price |
|---|---|
| Run started | $0.005 |
| Notice delivered | $0.0025 (= $2.50 per 1,000) |

Example: a daily run returning 40 new notices for your countries and CPV codes costs about $0.105 a day, roughly **$3 a month**. Set *maximum cost per run* to cap spend; the Actor stops cleanly at the cap. Platform compute is included.

### Data source and licence

- **Source:** the public **TED Search API** (`api.ted.europa.eu/v3/notices/search`, anonymous access), operated by the Publications Office of the European Union.
- **Licence / reuse:** per the TED legal notice, procurement notices published in the Supplement to the Official Journal of the EU can be freely reused for commercial or non-commercial purposes (Commission Decision 2011/833/EU on the reuse of Commission documents). Each output item carries a `reuseNotice` field.
- **Fair use:** TED asks technical users to use the API and publishes fair-use limits (700 requests per minute). This Actor sends at most about 2 requests per second, one at a time.
- We output facts and links only. Tender documents are not downloaded or re-hosted, and the TED logo is not used.

### Privacy and legal note

- TED notices can name contact persons and, in award notices, winning tenderers who may be natural persons. **This Actor never requests contact-person fields or winner names from the API**, so they never enter your dataset. Buyer organisation names are kept. Optional descriptions have personal-looking emails and phone numbers scrubbed.
- This is an independent tool. It is **not affiliated with, endorsed by or sponsored by the Publications Office of the EU, the European Commission or TED.** Always confirm details on the official notice before bidding.

### Reliability

- Backoff and retries on 429/5xx and network errors. The run fails loudly with a clear message if TED changes its response format.
- Malformed notices are skipped and counted.
- Each run writes a `RUN_SUMMARY` record (matching total, read, delivered, skipped). A persistent run-health counter (runs started / succeeded / failed / unfinished, plus the last error) is kept in your account's `eutf-state` key-value store.
- A run with nothing new **succeeds** with zero items.

### FAQ

**Why is the title partly in another language?** TED's English title is "Country – CPV category – buyer's own title". The first two parts are English and the last part is whatever the buyer wrote. `originalTitle` holds the buyer's title on its own.

**Are UK tenders included?** No. Since 2021 UK notices are published on the UK's own services, not on TED. See our UK Public Tenders Feed Actor.

**Issues or ideas?** Use the Issues tab. Issues are answered within a few days.

# Actor input Schema

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

ISO country codes, alpha-3 (DEU, FRA) or alpha-2 (DE, FR). Leave empty for all.

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

Full 8-digit CPV codes (sub-codes included automatically) or prefixes such as 72 (IT services) or 4800 (software packages).

## `noticeTypes` (type: `array`):

eForms notice types. Default: contract notices (open opportunities).

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

Full-text terms, any language, phrases allowed. Tip: add local-language terms too (Software, logiciel).

## `publishedWithinDays` (type: `integer`):

Look-back window on the TED publication date.

## `minEstimatedValueEur` (type: `integer`):

Drops EUR-valued notices below this. Notices with no published value or a non-EUR currency are kept.

## `deadlineAfter` (type: `string`):

Tender or request-to-participate deadline on/after this date (YYYY-MM-DD).

## `preferredLanguage` (type: `string`):

ISO 639-3 code (eng, deu, fra...). Falls back to English, then the original language.

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

Adds the procedure description (in the buyer's language). Personal-looking emails and phone numbers are removed from it.

## `expertQuery` (type: `string`):

Optional raw TED expert-search query. When set, it replaces the country/CPV/type/keyword/deadline filters (the publication window still applies).

## `onlyNewSinceLastRun` (type: `boolean`):

Each notice is delivered once per filter set (state kept in your own account).

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

Cap on delivered notices, newest first.

## Actor input object example

```json
{
  "countries": [
    "DEU",
    "FRA",
    "NLD"
  ],
  "cpvCodes": [
    "72"
  ],
  "noticeTypes": [
    "cn-standard"
  ],
  "publishedWithinDays": 3,
  "preferredLanguage": "eng",
  "includeDescription": false,
  "onlyNewSinceLastRun": true,
  "maxResults": 1000
}
```

# Actor output Schema

## `results` (type: `string`):

Dataset of EU TED notices matching the input filters.

## `runSummary` (type: `string`):

Counts for this run (scanned, matched, delivered, skipped).

# 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 = {
    "countries": [
        "DEU",
        "FRA",
        "NLD"
    ],
    "cpvCodes": [
        "72"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("appropriate_songbird/eu-tenders-ted-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 = {
    "countries": [
        "DEU",
        "FRA",
        "NLD",
    ],
    "cpvCodes": ["72"],
}

# Run the Actor and wait for it to finish
run = client.actor("appropriate_songbird/eu-tenders-ted-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 '{
  "countries": [
    "DEU",
    "FRA",
    "NLD"
  ],
  "cpvCodes": [
    "72"
  ]
}' |
apify call appropriate_songbird/eu-tenders-ted-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,appropriate_songbird/eu-tenders-ted-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/7GzULnQdZC2jQ1Srz/builds/eJtEVCxe7hNi7yMqA/openapi.json
