# EU Tenders Search (TED) (`tabulary/eu-ted-tenders`) Actor

Search EU public procurement notices from the official TED (Tenders Electronic Daily) API: open calls for tender, planned purchases and contract awards. Filter by keywords, buyer country, CPV code and date; get clean JSON.

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

## Pricing

from $2.50 / 1,000 results

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 Search (TED)

Search public procurement notices from across the European Union in seconds. This Actor queries
**TED (Tenders Electronic Daily)**, the EU's official online journal for public procurement,
through its public Search API, and returns one clean record per notice, newest first: open calls
for tender, prior information about planned purchases, and contract award notices. Bid teams,
consultants, sales teams, market researchers and AI agents use it to find opportunities by
keyword, country and CPV code without working through the TED website by hand.

### What you get

- Notice number, notice type (for example `cn-standard` for a contract notice) and a simple
  category: open call, planned purchase or award.
- Title in your chosen EU language (TED translates the country and subject; the buyer's own
  wording stays in the original language), plus the original-language description.
- Buyer organisation, its country (ISO 3166-1 alpha-3) and town.
- Publication date, the tender deadline (earliest across lots), procedure type and contract
  nature (works, supplies or services).
- CPV codes, place of performance (NUTS or country codes), estimated value and currency.
- For award notices: the winning organisations and the total value stated in the notice.
- Links to the official notice page and PDF. Export as JSON, CSV or Excel, or use it as a tool
  for AI agents through the Apify MCP server.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `keywords` | string | `""` (all) | Comma-separated words or phrases searched in the full notice text. Any one is enough. |
| `noticeCategory` | string | `competition` | `competition` (open calls), `planning` (prior information), `result` (awards) or `any`. |
| `countries` | array | `[]` (all) | Buyer countries, e.g. `["DEU", "FR"]`. Two- or three-letter ISO codes. |
| `cpvCodes` | array | `[]` | CPV codes; each also matches everything below it (`72` means `72000000`, all IT services). |
| `onlyOpen` | boolean | `true` | For open calls, keep only notices with a tender deadline today or later. |
| `publishedWithinDays` | integer | `7` | Notices published in the last 1 to 365 days. |
| `language` | string | `eng` | Language for titles and links: any of the 24 EU languages. |
| `maxItems` | integer | `10` | Stop after this many notices. |

Example: open IT-security calls from German and French buyers in the last 30 days:

```json
{ "keywords": "cyber security, penetration testing", "countries": ["DEU", "FRA"], "publishedWithinDays": 30, "maxItems": 100 }
```

### Output

One dataset item per notice. A real item from a test run on 13 October 2026:

```json
{
  "publicationNumber": "706518-2026",
  "noticeType": "cn-standard",
  "noticeCategory": "competition",
  "title": "Ireland – Design consultancy services – CFT 4012 – MPFA for Signage Design, and Procurement of signage manufacture and installation with an initial contract at County Hall and South Dublin County Council Libraries",
  "titleLanguage": "eng",
  "buyerName": "South Dublin County Council",
  "buyerCountry": "IRL",
  "buyerCity": "Dublin",
  "publishedAt": "2026-10-13",
  "tenderDeadline": "2026-11-09",
  "procedureType": "open",
  "contractNature": ["services"],
  "cpvCodes": ["79415200", "34992300"],
  "placeOfPerformance": ["IE061", "IRL"],
  "estimatedValue": 550000,
  "estimatedValueCurrency": "EUR",
  "totalValue": 550000,
  "totalValueCurrency": "EUR",
  "winnerNames": [],
  "description": "Multiparty Framework for Signage Design, and Procurement of signage manufacture and installation with an initial contract for signage design, and procurement of signage manufacture and installation at County Hall and South Dublin County Council Libraries. The initial contract would be for 15 signs across County Building and South Dublin County Council Libraries.",
  "url": "https://ted.europa.eu/en/notice/-/detail/706518-2026",
  "pdfUrl": "https://ted.europa.eu/en/notice/706518-2026/pdf"
}
```

Missing values are `null` (or an empty list). Dates are ISO 8601 (`YYYY-MM-DD`).
`estimatedValue` is the value for the whole procedure, or for the single lot when only one lot
value is given; it is never summed or guessed.

### Pricing

Pay per result: you are charged for each notice saved to the dataset, at the price shown on this
page. There is no monthly fee. Set "Maximum cost per run" to cap any single run; the Actor stops
cleanly when the cap is reached and keeps everything it saved.

### Data source and limits

- Source: the official [TED Search API](https://docs.ted.europa.eu/api/latest/search.html),
  which allows anonymous search of published notices for analysis and reuse. Reuse is subject to
  the [TED legal notice](https://ted.europa.eu/en/legal-notice); the source is the Publications
  Office of the European Union.
- Coverage: notices that EU and EEA public buyers must publish in TED, mostly contracts above
  the EU thresholds. Smaller national contracts often appear only on national portals.
- Keyword search uses TED's full-text index, so a phrase can match text in any part of the
  notice, in any language.
- One run returns at most 10,000 notices (`maxItems`). For bigger pulls, split by country, CPV
  code or period.
- The Actor sends at most about one request per second, identifies itself, and backs off when
  TED asks it to.
- No personal contact data: contact-person, email and phone fields are never requested, and
  email addresses or phone numbers that buyers type into a title or description are replaced
  with `[email removed]` or `[phone removed]`. Otherwise text is copied as published.
- Not affiliated with or endorsed by the European Union or the Publications Office.

### FAQ

**Is this data official?** Yes. It comes from TED's own API. Only field names and formatting
change, and contact details in free text are masked.

**How fresh is it?** Every run fetches live data, so notices appear as soon as TED publishes
them.

**Can I get new tenders every morning?** Schedule the Actor daily with `publishedWithinDays: 1`
and your filters, and de-duplicate on `publicationNumber`.

**Why is the description in another language?** TED translates titles automatically but keeps
descriptions in the language the buyer used. Pick your language for titles with `language`.

**Something broke?** Open an issue on the Issues tab. The Actor is tested daily.

### About Tabulary

This tool is part of [Tabulary](https://apify.com/tabulary): clean tables from official public
sources. Every Tabulary tool uses the source's official API or open data where one exists,
collects no personal data, and is tested on Apify every day. Questions or ideas? Open an issue on
the Issues tab.

# Actor input Schema

## `keywords` (type: `string`):

Optional. Comma-separated words or phrases searched in the full notice text, for example "cyber security, penetration testing". A notice matches when it contains any of them. Leave empty for every notice in the period.

## `noticeCategory` (type: `string`):

Contract notices are open calls you can bid for. Prior information notices announce planned purchases. Award notices say who won and for how much.

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

Optional. Countries of the buying organisation as ISO 3166-1 codes (DEU or DE both work). Leave empty for all countries.

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

Optional. CPV codes of what is being bought. A code also matches everything below it: 72000000 (IT services) includes 72400000 (internet services). Short forms such as 72 are padded to 72000000.

## `onlyOpen` (type: `boolean`):

For contract notices, keep only those with a tender deadline today or later. Ignored for the other notice types.

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

Only notices published in TED in this many days, counting back from today.

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

Preferred language for titles and links. TED translates the title prefix (country and subject) into every EU language; the buyer's own wording stays in the original language.

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

Stop after this many notices, newest first. Each notice is one billable dataset item.

## Actor input object example

```json
{
  "keywords": "",
  "noticeCategory": "competition",
  "countries": [],
  "cpvCodes": [],
  "onlyOpen": true,
  "publishedWithinDays": 7,
  "language": "eng",
  "maxItems": 10
}
```

# Actor output Schema

## `overview` (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": "",
    "noticeCategory": "competition",
    "countries": [],
    "cpvCodes": [],
    "onlyOpen": true,
    "publishedWithinDays": 7,
    "language": "eng",
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("tabulary/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 = {
    "keywords": "",
    "noticeCategory": "competition",
    "countries": [],
    "cpvCodes": [],
    "onlyOpen": True,
    "publishedWithinDays": 7,
    "language": "eng",
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("tabulary/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 '{
  "keywords": "",
  "noticeCategory": "competition",
  "countries": [],
  "cpvCodes": [],
  "onlyOpen": true,
  "publishedWithinDays": 7,
  "language": "eng",
  "maxItems": 10
}' |
apify call tabulary/eu-ted-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tabulary/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/HWpfn5RQcy2FhuqJw/builds/WwOggfUfVof7aPwCA/openapi.json
