# EU Tenders Monitor (TED) - Public Procurement Data (`xerophylous_view_hkx/ted-eu-tenders`) Actor

Search and monitor EU public tenders and contract awards from the official TED API. Filter by country, CPV sector, keywords, value and open deadline. Clean flat JSON, only-new mode for daily alerts.

- **URL**: https://apify.com/xerophylous_view_hkx/ted-eu-tenders.md
- **Developed by:** [Gianluca](https://apify.com/xerophylous_view_hkx) (community)
- **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 Tenders Monitor (TED)

Search and monitor European public tenders and contract awards from **TED (Tenders Electronic Daily)**, the
official EU procurement journal, through its **official public API**. No scraping, no proxies, no blocked runs.

Get clean, flat JSON for every notice: title, buyer, country, CPV sector with a translated label, deadline,
estimated or awarded value, winners, and direct links to the notice, its PDF and the tender documents.

### What you can do with it

- **Find open tenders in your sector.** Filter by country, CPV code and keywords, keep only notices with a
  deadline still open, and set a minimum contract value.
- **Get a daily feed of new tenders.** Turn on *Only new notices*, schedule the Actor every morning and connect
  the dataset to email, Slack, Google Sheets, Make, Zapier or a webhook. Each run returns only notices that
  previous runs with the same filters have not returned yet.
- **Analyse competitors and prices.** Pull contract awards with winners and awarded values for a sector or a
  buyer, over any period.
- **Feed AI agents.** The output is compact and consistent, ready for RAG pipelines and LLM tools (the Actor
  can be called through Apify's MCP server).

### Why this Actor

| | This Actor |
|---|---|
| Data source | Official TED Search API v3, freely reusable under Commission Decision 2011/833/EU |
| Completeness | Scroll mode with a unique sort key: no 15,000-result cap and no notices lost between pages |
| Reliability | Requests are spaced out and retried on rate limits (HTTP 429) and server errors |
| Output | One flat record per notice; multilingual fields resolved to your language with English fallback |
| Monitoring | Built-in "only new notices" state per filter set, safe to resume when a run hits its limit |

### Input

| Field | Description |
|---|---|
| `countries` | ISO codes of the buyer's country: `IT`, `FR`, `DE`... (2 or 3 letters). Empty = all. |
| `cpvCodes` | CPV codes, matched hierarchically: `72000000` covers all IT services. |
| `keywords` | Full-text phrases, combined with OR. |
| `noticeKinds` | `competition` (calls for tenders), `result` (awards), `planning`, `dir-awa-pre`, `cont-modif`, `consultation`. |
| `publishedWithinDays` | Publication window back from today (default 7). |
| `dateFrom`, `dateTo` | Explicit publication window, overrides the above. |
| `onlyOpen` | Keep only notices whose tender deadline has not passed. |
| `minValue`, `maxValue` | Estimated or awarded value range, in the notice currency (almost always EUR). |
| `language` | Language of the CPV label and links (titles stay as published). |
| `onlyNew` | Monitoring mode: return only notices not returned before for the same filters. |
| `maxItems` | Maximum notices per run (default 1,000). |
| `customQuery` | Optional extra clause in TED expert-search syntax. |

Example: open IT-services tenders in Italy and Spain worth at least €100,000, published in the last 14 days.

```json
{
  "countries": ["IT", "ES"],
  "cpvCodes": ["72000000", "48000000"],
  "noticeKinds": ["competition"],
  "publishedWithinDays": 14,
  "onlyOpen": true,
  "minValue": 100000,
  "language": "en"
}
```

### Output

```json
{
  "publicationNumber": "756294-2026",
  "publicationDate": "2026-10-30",
  "kind": "competition",
  "noticeType": "cn-standard",
  "title": "PROCEDURA APERTA PER L'AFFIDAMENTO IN CONCESSIONE MEDIANTE FINANZA DI PROGETTO ...",
  "originalTitle": "PROCEDURA APERTA PER L'AFFIDAMENTO IN CONCESSIONE MEDIANTE FINANZA DI PROGETTO ...",
  "originalLanguage": "ita",
  "description": "PROCEDURA APERTA PER L'AFFIDAMENTO IN CONCESSIONE ...",
  "buyerName": "Comune di Gussago",
  "buyerCountry": "ITA",
  "buyerCity": "GUSSAGO",
  "buyerWebsite": "www.comune.gussago.bs.it",
  "contractNature": "services",
  "procedureType": "open",
  "mainCpv": "92610000",
  "mainCpvLabel": "Sports facilities operation services",
  "cpvCodes": ["92610000"],
  "placeOfPerformanceCountries": ["ITA"],
  "placeOfPerformanceNuts": ["ITC47"],
  "deadline": "2026-12-02",
  "isOpen": true,
  "estimatedValue": 24487440.0,
  "awardedValue": null,
  "currency": "EUR",
  "winners": [],
  "documentsUrl": "https://www.sintel.regione.lombardia.it/eprocdata/sintelSearch.xhtml",
  "submissionUrl": "https://www.sintel.regione.lombardia.it/eprocdata/sintelSearch.xhtml",
  "tedUrl": "https://ted.europa.eu/en/notice/-/detail/756294-2026",
  "pdfUrl": "https://ted.europa.eu/en/notice/756294-2026/pdf",
  "xmlUrl": "https://ted.europa.eu/en/notice/756294-2026/xml"
}
```

For contract awards (`kind: "result"`), `awardedValue` and `winners` are filled and `estimatedValue` is empty.

### Pricing

Simple pay-per-result pricing, with platform usage included (no compute or proxy costs on top):

| Event | Price |
|---|---|
| Notice returned | **$0.002** ($2.00 per 1,000 notices) |
| Run start | $0.00005 |

| Notices returned | Cost |
|---|---|
| 100 | $0.20 |
| 1,000 | $2.00 |
| 10,000 | $20.00 |

Monitoring is cheap: in one week, IT-services calls for tenders in Italy (CPV 72000000) added up to 25 new
notices, about $0.05. Apify's free monthly credit covers about 2,500 notices. Set a maximum cost per run in the
run options and the Actor stops cleanly when it is reached.

### Good to know

- **Titles are not translated.** TED publishes titles and descriptions in the buyer's language. The CPV sector
  label and the links follow the language you choose.
- **Coverage.** TED contains notices above the EU thresholds and many voluntary publications. Smaller national
  tenders may appear only on national portals.
- **Data and privacy.** Data comes from the TED official API and is reusable under Commission Decision
  2011/833/EU. The Actor does not output contact persons, e-mails or phone numbers. Award notices can name a
  winner who is a natural person, as published by law: process that data only for lawful purposes under GDPR.
- **Not affiliated** with the European Union or the Publications Office. "TED" refers to the data source.

### Support

Open an issue in the Issues tab with your input JSON and the run link, and it will be looked at quickly.

# Actor input Schema

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

ISO country codes of the contracting authority, e.g. IT, FR, DE (or ITA, FRA, DEU). Leave empty for all countries.

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

CPV codes to match, hierarchically: 72000000 also matches every IT-services sub-code. The check digit (e.g. -5) is optional.

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

Full-text search across the whole notice. Several keywords are combined with OR; each entry is searched as an exact phrase.

## `noticeKinds` (type: `array`):

Which kinds of notices to return.

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

Publication window counted back from today. Ignored when 'Published from' is set.

## `dateFrom` (type: `string`):

Optional start date of the publication window.

## `dateTo` (type: `string`):

Optional end date of the publication window.

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

Keep only notices whose tender deadline is today or later.

## `minValue` (type: `integer`):

Minimum estimated or awarded value, in the notice currency (almost always EUR).

## `maxValue` (type: `integer`):

Maximum estimated or awarded value, in the notice currency.

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

Language for the CPV sector label and the TED links. Titles stay in the buyer's original language, as published.

## `onlyNew` (type: `boolean`):

Return only notices not returned by previous runs with the same filters. Schedule the Actor daily to get a feed of new tenders.

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

Stop after this many notices.

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

Optional clause added with AND, in TED expert-search syntax, e.g. procedure-type=open. Test it first on ted.europa.eu > Search > Expert search.

## Actor input object example

```json
{
  "countries": [
    "IT"
  ],
  "cpvCodes": [
    "72000000"
  ],
  "noticeKinds": [
    "competition"
  ],
  "publishedWithinDays": 7,
  "onlyOpen": false,
  "language": "en",
  "onlyNew": false,
  "maxItems": 1000
}
```

# Actor output Schema

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

One flat record per TED notice: buyer, sector, deadline, value, winners and links.

# 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": [
        "IT"
    ],
    "cpvCodes": [
        "72000000"
    ]
};

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

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

```

## MCP server setup

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