# EU Tenders (TED): Public Procurement Search & Alerts (`frank0309/eu-ted-tenders`) Actor

Search EU public procurement notices on TED (Tenders Electronic Daily) by keyword, CPV code, buyer country, stage, deadline and contract value. English titles, buyer, deadlines, value and document links. Alert mode returns only new notices. No API key needed.

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

## Pricing

$2.00 / 1,000 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 Tenders (TED): Public Procurement Search & Alerts

Search every public tender published in the EU's official journal, [TED (Tenders Electronic Daily)](https://ted.europa.eu), and get clean, structured results. Over 700,000 notices a year from all EU member states, plus EEA and other countries, worth hundreds of billions of euros.

- **English titles for every notice**, alongside the original-language title and description.
- **Filter like a bid manager.** Keyword, CPV code (parent codes include sub-codes), buyer country, stage (open calls, awards, prior information), tender deadline and minimum value.
- **What you need to bid.** Buyer, city, tender deadline per lot, estimated value and currency, procedure type, framework-agreement flag, and links to the tender documents and PDF.
- **Alert mode.** Schedule it daily to get only new notices that match your filters.
- **Power-user escape hatch.** Add any TED expert-query condition.
- **No API key.** Uses TED's official public search API.

### Who uses it

- **Companies selling to the public sector** in Europe, from IT and consulting to construction and medical supplies.
- **Bid and proposal teams** watching for new calls in their CPV codes and countries.
- **Tender-alert services and consultants** building feeds for clients.
- **Market researchers and AI agents** analysing public spending and competitors' wins.

### Input

| Field | What it does |
|---|---|
| `keywords` | Full-text search in all languages. Words are combined with AND; use double quotes for a phrase, e.g. `"cloud computing"`. |
| `cpvCodes` | 8-digit CPV codes, e.g. `72000000` (IT services). Parent codes include their sub-codes. |
| `buyerCountries` | 3-letter ISO codes, e.g. `DEU`, `FRA`, `ITA`, `ESP`, `POL`, `NLD`. |
| `stages` | `competition` (calls for tenders), `result` (contract awards), `planning` (prior information). |
| `publishedWithinDays` | Only notices published in the last N days. |
| `openForTendersOnly` | Only notices whose tender deadline is today or later. |
| `minTotalValue` | Minimum estimated or awarded value, in the notice's currency. |
| `customQuery` | Extra condition in TED expert syntax, e.g. `procedure-type IN (open)`. |
| `onlyNewSinceLastRun` | Alert mode: return only notices that earlier runs with the same filters have not returned. |
| `maxItems` | How many notices to return. |

Example: open software tenders in Germany and France:

```json
{
  "keywords": "software",
  "buyerCountries": ["DEU", "FRA"],
  "stages": ["competition"],
  "openForTendersOnly": true,
  "onlyNewSinceLastRun": true,
  "maxItems": 500
}
```

### Output

```json
{
  "noticeId": "764894-2026",
  "title": "Germany – Software supply services – Verlängerung der PingIDM",
  "originalTitle": "Verlängerung der PingIDM",
  "buyerName": "Universität Stuttgart",
  "buyerCountry": "DEU",
  "buyerCity": "Stuttgart",
  "stage": "competition",
  "procedureType": "open",
  "contractNature": ["services"],
  "cpvCodes": ["72268000"],
  "publicationDate": "2026-11-04",
  "tenderDeadline": "2026-11-09",
  "totalValue": null,
  "currency": null,
  "isFrameworkAgreement": false,
  "description": "Verlängerung der PingIDM (früher OpenIDM) Lizenzen incl. Support/Wartung ...",
  "documentsUrls": ["https://ausschreibungen.landbw.de/Satellite/notice/CXUEYY8DYDCSEMCH/documents"],
  "pdfUrl": "https://ted.europa.eu/en/notice/764894-2026/pdf",
  "url": "https://ted.europa.eu/en/notice/-/detail/764894-2026"
}
```

Download the results as JSON, CSV or Excel, or send them to Google Sheets, Slack, email, Zapier or Make with Apify integrations.

### FAQ

**Where does the data come from?** From TED's official search API, run by the Publications Office of the European Union.

**Why is the description not in English?** TED translates titles into every EU language but publishes descriptions in the original language. Pipe the output into a translation step if you need English text.

**Is the value always filled?** No. Many buyers don't publish an estimated value.

**Also see** [SAM.gov Contract Opportunities](https://apify.com/frank0309/sam-gov-opportunities) for U.S. federal tenders.

### More tools from this developer

**Government contracts, grants and regulation:**

- [SAM.gov Contract Opportunities: Search & New-Notice Alerts](https://apify.com/frank0309/sam-gov-opportunities)
- [Federal Contract Awards (USAspending): Who Won What](https://apify.com/frank0309/usaspending-contract-awards)
- [Grants.gov Federal Grants: Search & New-Grant Alerts](https://apify.com/frank0309/grants-gov-opportunities)
- [UK Public Tenders: Find a Tender + Contracts Finder](https://apify.com/frank0309/uk-public-tenders)
- [Federal Register Rules & Notices: Search & New-Rule Alerts](https://apify.com/frank0309/federal-register-documents)

Also available: job postings from company career pages, developer and ai ecosystem data, research, health and safety data. See [all tools](https://apify.com/frank0309).

# Actor input Schema

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

Full-text search across notices in all languages. Words are combined with AND; put a phrase in double quotes, e.g. "cloud computing".

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

8-digit CPV codes, e.g. 72000000 (IT services) or 48000000 (software packages). A parent code also matches its sub-codes.

## `buyerCountries` (type: `array`):

3-letter ISO country codes, e.g. DEU, FRA, ITA, ESP, POL, NLD.

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

Competition = open calls for tenders; Result = contract award notices; Planning = prior information notices. Leave empty for all.

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

Leave empty for any date. If no other filter is set, the last 7 days are used.

## `openForTendersOnly` (type: `boolean`):

Only notices with a tender deadline today or later.

## `minTotalValue` (type: `integer`):

Minimum estimated or awarded value, in the notice's own currency.

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

Optional condition in TED's expert search syntax, added with AND, e.g. procedure-type IN (open).

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

Return only notices that earlier runs with the same filters have not returned. Schedule the Actor daily to get a feed of new tenders. The first run returns everything that matches.

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

Stop after this many notices.

## Actor input object example

```json
{
  "keywords": "software",
  "openForTendersOnly": false,
  "onlyNewSinceLastRun": false,
  "maxItems": 100
}
```

# Actor output Schema

## `notices` (type: `string`):

All notices saved by this run.

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

Title, buyer, country, stage, value, dates and link for each notice.

# 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("frank0309/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("frank0309/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 frank0309/eu-ted-tenders --silent --output-dataset

```

## MCP server setup

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