# EU Public Tenders Search, from TED data (`br_data_hub/eu-ted-tenders`) Actor

Search European public tenders using open data from TED (Tenders Electronic Daily), the EU procurement journal. Filter by keywords, CPV codes, countries, dates, notice types and days left to bid. English titles, CPV descriptions, values, deadlines and lots. Not affiliated with the EU.

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

## Pricing

from $2.10 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Search, from TED data

Find **European public tenders** from **TED (Tenders Electronic Daily)**, the official journal where public buyers in the EU and EEA must publish every procurement above the EU thresholds: about 750,000 notices a year from 30+ countries.

Search by keywords, **CPV codes**, buyer countries, publication dates and notice types, keep only tenders that are **still open** or have **at least N days left to bid**, and get every notice in one clean, flat format: **English title when TED has it**, buyer, city, country, CPV codes **with descriptions**, estimated value and currency, procedure, submission deadline, **days to deadline** and lots.

Use it to find sales opportunities with European governments, build a daily tender alert for your product, or give an AI agent a live view of EU public procurement.

### What you get per notice

- Publication number, publication date, link to the notice on TED and to the PDF
- Notice type (contract notice, prior information, award...) with its name
- Title in your preferred language (English by default), with the language actually used in `titleLanguage`
- Buyer name, city and country (ISO code and name), places of performance (country and NUTS codes)
- Main CPV code and description, and every CPV code of the notice with its description
- Contract nature (works, supplies, services) and procedure (open, restricted, negotiated...)
- Estimated value and currency (procedure value, or the sum of the lots)
- Next submission deadline (date and time), and **days left until it**; for restricted and negotiated procedures this is the deadline for requests to participate (`deadlineType`)
- Lots: identifier and title

### Input

| Field | Description |
|---|---|
| `keywords` | Words searched by TED in the full text of the notice (any word matches). Default `["software"]`. |
| `cpvCodes` | CPV codes, e.g. `72000000` (IT services). Check digit optional; a prefix like `72` means the whole division. |
| `countries` | Buyer countries, ISO 2 or 3 letters, e.g. `["DE", "FR"]`. Empty = all. |
| `noticeTypes` | `contract-notice` (default), `prior-information-call`, `prior-information`, `design-contest`, `qualification-system`, `subcontracting`, `pre-market-consultation`, `contract-award`, `voluntary-ex-ante`, `contract-modification`. Empty = all. |
| `publishedWithinDays` | Publication window, default the last 14 days. |
| `publishedFrom` / `publishedTo` | Exact publication dates (YYYY-MM-DD); override the window. |
| `onlyOpen` | Skip notices whose deadline has passed (default `true`). |
| `minDaysToDeadline` | Only notices with at least this many days left to bid. |
| `minEstimatedValue` | Minimum estimated value, in the notice's currency (mostly EUR). |
| `titleLanguage` | Preferred language for titles and names (`en`, `fr`, `de`...). Default `en`. |
| `maxItems` | Stop after this many notices (default 50). |

Keywords, CPV codes, countries, dates and notice types are filtered by TED itself, so they are fast. Deadline and value are checked by the Actor while reading the results. The default input finishes in a few seconds.

### Output example

```json
{
  "publicationNumber": "900001-2026",
  "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/900001-2026",
  "publicationDate": "2026-10-28",
  "noticeType": "cn-standard",
  "noticeTypeName": "Contract or concession notice – standard regime",
  "title": "Germany – Software maintenance services – Maintenance of business applications",
  "titleLanguage": "en",
  "buyerName": "Beispielstadt Musterhausen",
  "buyerCity": "Musterhausen",
  "countryCode": "DE",
  "countryName": "Germany",
  "contractNature": "Services",
  "procedureType": "Open",
  "mainCpvCode": "72267000",
  "mainCpvDescription": "Software maintenance and repair services",
  "cpv": [{ "code": "72267000", "description": "Software maintenance and repair services" }],
  "estimatedValue": 370000.5,
  "currency": "EUR",
  "submissionDeadline": "2026-11-20",
  "submissionDeadlineTime": "12:00",
  "daysToDeadline": 21,
  "deadlineType": "tenders",
  "lots": [{ "lotId": "LOT-0001", "title": "Lot 1 – core systems" }]
}
```

(Illustrative values.)

### How much does it cost?

Pay per event, no usage fees on top: **US$ 0.003 per notice returned** (`notice` event), i.e. US$ 3 per 1,000 notices.

Searching, paging, notices removed by your filters and failed runs are free.

**$0.003 per tender notice** (`notice` event, pay per event). Charged once per TED notice returned. Paging, notices removed by your filters and errors are free.

| You get | Free tier | Bronze tier (10% off) | Gold tier (30% off) |
|---|---|---|---|
| 100 tender notices | $0.30 | $0.27 | $0.21 |
| 1,000 tender notices | $3.00 | $2.70 | $2.10 |
| 10,000 tender notices | $30.00 | $27.00 | $21.00 |

Discounts follow your Apify subscription tier: Bronze 10%, Silver 20%, Gold and above 30%. No subscription to this Actor and no charge for platform usage: you pay only for results.
The Apify Free plan includes $5 of monthly credit, enough for about **1,666 tender notices** at the list price.
You can cap the cost of any run with **Maximum cost per run**; the Actor stops when it is reached.

### Data source

Official **TED Search API** of the Publications Office of the European Union (`api.ted.europa.eu/v3/notices/search`), open and without an API key, made for reuse of TED data including by commercial services. CPV descriptions, country names, notice types and procedure names come from the official eForms codelists (eForms SDK). Data is as published by each buyer; some notices have no estimated value or no English title. Only public-body data is returned; contact persons, e-mails and phone numbers are not collected. Always check the official notice on TED before bidding.

**Disclaimer:** this Actor is an independent tool. It is not affiliated with, endorsed by or operated by the European Union, the Publications Office of the EU or TED. "TED" is used only to describe the data source.

### More questions

#### Does it include tenders below the EU thresholds?

Only what is published on TED. TED is mandatory above the EU procurement thresholds; some buyers also publish smaller tenders there voluntarily, but most below-threshold tenders appear only on national portals, which this Actor does not read.

#### How do keywords and CPV codes combine?

Keywords are searched by TED in the full text of each notice, and **any** keyword matches (`software` OR `cloud`). All other filters must match together: keywords AND CPV codes AND countries AND notice types AND the publication window. A CPV code can be a prefix: `72` is the whole IT services division and `722` its software subgroup; the check digit (`72000000-5`) is optional.

#### What happens to notices without a deadline or without an estimated value?

With `onlyOpen` on, only notices whose deadline has passed are removed; notices with no deadline in the data are kept. `minDaysToDeadline` keeps only notices with a deadline at least that many days away, so notices without a deadline are left out. `minEstimatedValue` keeps only notices with a value at or above it, so notices without a value are left out too. When a notice has several lots, `submissionDeadline` is the earliest deadline not yet passed.

#### Why is the title not in English?

Titles and names come in `titleLanguage` (default English) when TED has that language, then in English, otherwise in the original language of the notice. `titleLanguage` in the output tells you which language you got.

#### What is the difference between "tenders" and "requestsToParticipate" in `deadlineType`?

In open procedures the deadline is for submitting tenders. In restricted and negotiated procedures the buyer first takes requests to participate, so when the notice has no tender deadline, the request deadline is returned and `deadlineType` is `requestsToParticipate`.

#### Is the estimated value converted to euros?

No. `estimatedValue` is in the notice's `currency` (mostly EUR; some countries use their own currency). When the procedure has no total, the lot values are added up, but only if all lots use the same currency. `minEstimatedValue` compares in the notice's currency.

#### How do I build a daily tender alert?

Set `publishedWithinDays` to 1 (or 2 to cover weekends and delays), keep `onlyOpen` on, add your keywords, CPV codes and countries, and schedule the Actor daily on Apify with a webhook or an integration (e-mail, Slack, Google Sheets). Each notice is returned and charged only once per run.

#### How many notices can one run return?

Up to `maxItems` (default 50, maximum 100,000). The Actor reads TED page by page and stops as soon as it has enough matching notices or reaches your maximum cost per run. Notices read but removed by the deadline, value or CPV filters are free.

### Use it via API

Run it from any language and get the results as JSON. Replace `<YOUR_API_TOKEN>` with your [Apify API token](https://console.apify.com/settings/integrations).

```bash
curl -X POST "https://api.apify.com/v2/acts/br_data_hub~eu-ted-tenders/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"keywords": ["software"]}'
```

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")
run = client.actor("br_data_hub/eu-ted-tenders").call(run_input={'keywords': ['software']})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

You can also schedule runs, send results to webhooks, or connect the Actor to Make, Zapier, n8n, Google Sheets and other [integrations](https://docs.apify.com/platform/integrations).

### Use it with AI agents (MCP)

This Actor is ready for AI agents: typed input and output schemas, pay-per-event pricing, limited permissions and short runs.

- **Apify MCP server:** add `https://mcp.apify.com/?tools=br_data_hub/eu-ted-tenders` to Claude, ChatGPT, Cursor, VS Code or any MCP client, and the agent can call this Actor as a tool.
- **Agent frameworks:** call it from LangChain, LlamaIndex, CrewAI or the OpenAI Agents SDK through the Apify integrations, or with the API call above.
- Results come as structured JSON with stable field names, documented in the **Output** tab.

### FAQ

#### Where does the data come from?

Official **TED Search API** of the Publications Office of the European Union (`api.ted.europa.eu/v3/notices/search`), open and without an API key, made for reuse of TED data including by commercial services. CPV descriptions, country names, notice types and procedure names come from the official eForms codelists (eForms SDK). Data is as published by each buyer; some notices have no estimated value or no English title. Only public-body data is returned; contact persons, e-mails and phone numbers are not collected. Always check the official notice on TED before bidding.

#### How much does it cost?

$0.003 per tender notice. Discounts follow your Apify subscription tier: Bronze 10%, Silver 20%, Gold and above 30%. See **How much does it cost?** above for examples.

#### Do I pay for errors or empty results?

No. Charged once per TED notice returned. Paging, notices removed by your filters and errors are free.

#### Can I run it on a schedule or connect it to other tools?

Yes. Use Apify schedules to run it daily or weekly, webhooks to get notified, and integrations such as Make, Zapier, n8n and Google Sheets. Everything also works through the API.

#### Can AI agents use it?

Yes. It works as a tool in the Apify MCP server and in agent frameworks, and AI agents can pay per event. See **Use it with AI agents (MCP)**.

#### Is it legal to use this data?

The Actor reads only public sources. You are responsible for how you use the data and for complying with the source's terms and with privacy laws such as GDPR.

#### I found a bug or need a feature. What should I do?

Open an issue in the **Issues** tab. We answer within 14 days, usually much sooner.

### More Actors from BR Data Hub

| Actor | What it does |
|---|---|
| [EU VAT Number Bulk Validator (from VIES data)](https://apify.com/br_data_hub/eu-vat-validator) | Bulk-check EU and Northern Ireland (XI) VAT numbers using the European Commission's public VIES service: valid |
| [LEI Lookup & Corporate Ownership Tree, from GLEIF data](https://apify.com/br_data_hub/lei-corporate-tree) | Look up companies by LEI or name in GLEIF's open Global LEI Index: legal data, direct and ultimate parent, sub |
| [Sanctions Screening: OFAC, UN, EU, UK](https://apify.com/br_data_hub/global-sanctions-screening) | Screen people and companies using data from the official OFAC SDN and Consolidated, UN Security Council, EU an |
| [US Company Financials from SEC XBRL Data (normalized)](https://apify.com/br_data_hub/sec-company-financials) | Standardized financial statements of US-listed companies, built from public SEC XBRL data: revenue, profits, E |
| [Entity Resolver & ID Crosswalk (from Wikidata data)](https://apify.com/br_data_hub/wikidata-entity-resolver) | Resolve company, brand, organization and place names to the right Wikidata entity with an explained confidence |

See all our Actors at [apify.com/br_data_hub](https://apify.com/br_data_hub).

### Usar em português

Licitações públicas europeias do TED (Diário Oficial da UE), pela API oficial e aberta. Filtros por palavras-chave, códigos CPV, países, datas de publicação, tipo de aviso e prazo mínimo restante. Cada aviso vem com comprador, país, cidade, título em inglês (ou no idioma original, indicado em `titleLanguage`), CPV com descrição, valor estimado e moeda, procedimento, prazo de proposta, dias até o prazo, lotes e link. Cobrança só pelos avisos devolvidos (US$ 0,003 cada). Ferramenta independente, sem afiliação com a União Europeia nem com o TED. Confira sempre o aviso oficial no TED antes de concorrer.

**Quanto custa:** $0.003 por resultado (`notice`); 1.000 resultados saem por $3.00. Desconto pelo nível da assinatura Apify: Bronze 10%, Silver 20%, Gold ou acima 30%. Erros e consultas sem resultado não são cobrados. Use também pela API ou por agentes de IA no servidor MCP da Apify (`https://mcp.apify.com/?tools=br_data_hub/eu-ted-tenders`).

# Actor input Schema

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

Enter words to search in the full text of the notice, one per line, e.g. software, cloud or ambulance. Any word matches, in any language field. Leave empty for no keyword filter.

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

Enter Common Procurement Vocabulary codes, one per line, e.g. 72000000 (IT services) or 45000000 (construction). The check digit is optional and a short prefix such as 72 covers the whole division. Leave empty for all sectors.

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

Enter buyer countries as 2- or 3-letter ISO codes, one per line, e.g. DE, FR or PL. Leave empty for every country that publishes on TED.

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

Pick the kinds of notice to return. Contract notices are the open calls for tenders. Leave empty for all types.

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

Set the publication window in days, ending on 'Published to' (or today), e.g. 14. Ignored when 'Published from' is set.

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

Keep on to skip notices whose submission deadline has passed. Notices without a deadline (such as award notices) are kept.

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

Type the oldest publication date as YYYY-MM-DD to use instead of the last N days.

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

Type the newest publication date as YYYY-MM-DD. Leave empty for today.

## `minDaysToDeadline` (type: `integer`):

Set the minimum days until the next submission deadline, e.g. 10 to leave time to prepare a bid. Notices without a deadline are skipped when set.

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

Set a minimum estimated value in the notice's own currency (most are EUR), e.g. 100000. Notices without an estimate are skipped when set.

## `titleLanguage` (type: `string`):

Type an EU language code for titles, buyer names and lot titles, e.g. en, fr or de. Falls back to English, then to the original; the language used is returned in titleLanguage.

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

Set the maximum number of matching notices to return, e.g. 50. You pay only for the notices returned.

## Actor input object example

```json
{
  "keywords": [
    "software"
  ],
  "cpvCodes": [],
  "countries": [],
  "noticeTypes": [
    "contract-notice"
  ],
  "publishedWithinDays": 14,
  "onlyOpen": true,
  "publishedFrom": "",
  "publishedTo": "",
  "titleLanguage": "en",
  "maxItems": 50
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset with all results

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("br_data_hub/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": ["software"] }

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

```

## MCP server setup

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