# EU Tenders Scraper (TED) & Tender Monitor (`mmm_mita/eu-ted-tenders-monitor`) Actor

Get EU public tenders and contract awards from TED (Tenders Electronic Daily) via the official TED Search API. Filter by buyer country, CPV code, keyword, notice type, value and deadline. Flat JSON/CSV output with winners and award values. Monitor mode returns only new notices.

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

## Pricing

$3.00 / 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

### What does EU Tenders Scraper (TED) do?

This actor collects **EU public procurement notices** from **TED (Tenders Electronic Daily)**, the EU's official tender journal, through the **official TED Search API** (`api.ted.europa.eu/v3`). It returns one flat row per notice: **contract notices** (open tenders) and **contract award notices** (who won, for how much).

You can filter by **buyer country, CPV code, keywords, notice type, publication date, estimated value and deadline**. Turn on **monitor mode** and schedule the actor daily to get only notices you have not seen before.

Data can be exported from Apify as JSON, CSV, Excel or via the API, and runs can be scheduled or connected to integrations.

### How to use it

1. Enter one or more **buyer countries** as ISO-3 codes (for example `NLD`, `BEL`, `DEU`). Leave empty for all countries.
2. Optionally add **CPV code prefixes** (for example `72` for IT services) and **keywords**.
3. Pick **notice types**: `cn-standard` for open tenders, `can-standard` for contract awards.
4. Set **Published in the last N days**.
5. Run it. For alerts, turn on **monitor mode** and add a daily schedule.

### Data fields

| Field | Description |
|---|---|
| publicationNumber | TED publication number, e.g. `677699-2026` |
| publicationDate | Publication date (YYYY-MM-DD) |
| noticeType | TED notice type, e.g. `cn-standard`, `can-standard` |
| title | Notice title, English when TED provides it |
| lotTitles | Lot titles |
| buyerName | Contracting authority |
| buyerCountry | Buyer country (ISO-3) |
| placeOfPerformanceNuts | NUTS codes of the place of performance |
| cpvCodes | CPV codes |
| contractNature | e.g. `services`, `supplies`, `works` |
| procedureType | e.g. `open` |
| estimatedValue | Sum of the lot estimated values, or `null` if not published |
| currency | Currency of the estimated value |
| deadline | Earliest tender submission deadline across lots |
| winners | Winner names (award notices) |
| awardedTotalValue | Total awarded value (award notices only) |
| url | TED notice page |
| pdfUrl | TED PDF of the notice |
| description | Lot description (when "Include lot descriptions" is on) |
| scrapedAt | Time the row was created (UTC) |

### Use cases

- **Tender alerts** for a sector and set of countries (for example CPV 72 in NL, BE and DE).
- **Award intelligence**: which companies win which contracts, using `can-standard` notices.
- Feeding tenders into a CRM, spreadsheet or bid-management tool via the Apify API or integrations.

### Input example

```json
{
  "countries": ["NLD", "BEL", "DEU"],
  "cpvCodes": ["72", "48"],
  "keywords": ["cloud"],
  "noticeTypes": ["cn-standard"],
  "daysBack": 7,
  "onlyOpenDeadline": true,
  "monitorMode": true
}
```

Use `"noticeTypes": ["can-standard"]` to get contract awards with winner names.

#### All input options

| Option | Default | Notes |
|---|---|---|
| countries | `[]` (all) | ISO-3 buyer country codes |
| cpvCodes | `[]` | Prefix match (`72` matches `72268000`) |
| keywords | `[]` | Full-text, any keyword matches (OR). A keyword with several words is searched as an exact phrase (e.g. `cloud computing`) |
| noticeTypes | `["cn-standard"]` | Also `cn-social`, `cn-desg`, `pin-only`, `pin-cfc-standard`, `can-standard`, `can-social`, `veat`, `can-modif` |
| daysBack | 7 | 1–3650 |
| onlyOpenDeadline | false | Keep only notices with a deadline in the future (drops notices without a deadline) |
| minValueEur | – | Notices without a value are kept unless `requireValue` is on |
| requireValue | false | Keep only notices that publish an estimated value |
| maxItems | 500 | 1–50,000 |
| monitorMode | false | Only notices not returned in earlier runs |
| monitorStoreName | `ted-monitor-default` | Use one name per saved search |
| includeDescription | true | Adds `description` |

### Output example

```json
{
  "publicationNumber": "677699-2026",
  "publicationDate": "2026-10-01",
  "noticeType": "can-standard",
  "title": "Germany – Software supply services – Offenes Verfahren zur Bereitstellung eines Forschungsinformationssystems",
  "lotTitles": ["Offenes Verfahren zur Bereitstellung eines Forschungsinformationssystems"],
  "buyerName": "CISPA - Helmholtz-Zentrum für Informationssicherheit gGmbH",
  "buyerCountry": "DEU",
  "placeOfPerformanceNuts": ["DEC01"],
  "cpvCodes": ["72268000", "72200000", "72263000", "72267000"],
  "contractNature": ["services"],
  "procedureType": "open",
  "estimatedValue": null,
  "currency": null,
  "deadline": null,
  "winners": ["Elsevier bv"],
  "awardedTotalValue": null,
  "url": "https://ted.europa.eu/en/notice/-/detail/677699-2026",
  "pdfUrl": "https://ted.europa.eu/en/notice/677699-2026/pdf",
  "scrapedAt": "2026-10-18T14:18:40.623Z",
  "description": "Das CISPA beabsichtigt die Vergabe für die Bereitstellung eines Forschungsinformationssystems. ..."
}
```

### How much does it cost to scrape TED tenders?

You pay per notice delivered: **$3.00 per 1,000 notices**, with no start fee. With monitor mode on, notices from earlier runs are skipped, so you are not charged for them again. You can set a maximum cost per run in Apify; the actor stops when it is reached. The $5 monthly credit on the Apify free plan covers about 1,650 notices.

In monitor mode, the first run (empty memory) is a free **baseline**: it stores the notices that exist today and returns nothing, so it costs nothing. Later runs return and charge only new notices. Turn off "Monitor: first run is a free baseline" if you also want the existing notices.

### Limits

- Data is what buyers publish on TED. **Estimated value, deadline and award value are often missing** (`null`).
- `estimatedValue` is the sum of the lot values; `deadline` is the earliest lot deadline.
- `title` and `buyerName` are in English only when TED provides an English version; otherwise another language is used. `description` is often in the original language.
- The value filter does not convert currencies.
- Monitor mode remembers up to the last 100,000 publication numbers per memory name.
- Maximum 50,000 notices per run.

### Legal and terms

The actor uses the public, official TED Search API, not HTML scraping. TED notices are published by the EU Publications Office. Notices may be reused freely, including commercially, under Commission Decision 2011/833/EU: see the [TED legal notice](https://ted.europa.eu/en/legal-notice) and [Decision 2011/833/EU](https://eur-lex.europa.eu/eli/dec/2011/833/oj). You are responsible for how you use the data, including any personal data that may appear in notices (for example contact names).

### FAQ

#### Is there an official TED API?

Yes. This actor uses the official TED Search API and turns the results into flat rows.

#### How do I get contract award notices and winners?

Set notice type to `can-standard` (or `can-social`, `can-modif`). The `winners` and `awardedTotalValue` fields are filled when the notice contains them.

#### How do I set up daily tender alerts?

Turn on monitor mode, keep the same monitor memory name, and schedule the actor daily in Apify. Each run returns only new notices.

#### Why are some values empty?

Buyers often do not publish an estimated value. Turn on "Require an estimated value" to keep only notices that have one.

#### Which countries are covered?

Any buyer country on TED. Filter with ISO-3 codes, or leave the field empty for all.

#### Can I use the data in Google Sheets, Slack or my CRM?

Yes, through Apify integrations, webhooks or the Apify API.

### Other Data Pipe actors

- [UK Tenders: Contracts Finder + Find a Tender](https://apify.com/mmm_mita/uk-public-tenders-unified)
- [France Company Register Scraper (SIRENE)](https://apify.com/mmm_mita/france-company-register)
- [SEC EDGAR Filings Search & Monitor](https://apify.com/mmm_mita/sec-edgar-filings-monitor)
- [LEI Lookup & Company Search (GLEIF)](https://apify.com/mmm_mita/gleif-lei-company-search)

# Actor input Schema

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

e.g. NLD, BEL, DEU, FRA. Empty = all EU/EEA.

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

e.g. 72 (IT services), 45 (construction), 3312 (medical devices). Prefixes are expanded with a wildcard.

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

Any of these words in the notice text (OR).

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

cn-standard = contract notices (open tenders). can-standard = contract award notices (who won).

## `daysBack` (type: `integer`):

Published in the last N days.

## `onlyOpenDeadline` (type: `boolean`):

Only tenders with deadline in the future.

## `minValueEur` (type: `integer`):

Notices without an estimated value are kept unless 'Require value' is on.

## `requireValue` (type: `boolean`):

Require an estimated value.

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

Max notices.

## `monitorMode` (type: `boolean`):

Remembers notice numbers between runs; schedule daily for alerts.

## `monitorStoreName` (type: `string`):

Monitor memory name.

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

Include lot descriptions.

## `monitorFirstRunBaseline` (type: `boolean`):

In monitor mode, the first run (empty memory) only stores what already exists, with no output and no charge. Later runs return only new records. Turn off to receive (and pay for) the existing records on the first run too.

## Actor input object example

```json
{
  "countries": [
    "NLD"
  ],
  "cpvCodes": [],
  "keywords": [],
  "noticeTypes": [
    "cn-standard"
  ],
  "daysBack": 7,
  "onlyOpenDeadline": false,
  "requireValue": false,
  "maxItems": 100,
  "monitorMode": false,
  "monitorStoreName": "ted-monitor-default",
  "includeDescription": true,
  "monitorFirstRunBaseline": true
}
```

# Actor output Schema

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

All results in the default dataset (table view 'overview').

# 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": [
        "NLD"
    ],
    "cpvCodes": [],
    "keywords": [],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("mmm_mita/eu-ted-tenders-monitor").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": ["NLD"],
    "cpvCodes": [],
    "keywords": [],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("mmm_mita/eu-ted-tenders-monitor").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": [
    "NLD"
  ],
  "cpvCodes": [],
  "keywords": [],
  "maxItems": 100
}' |
apify call mmm_mita/eu-ted-tenders-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,mmm_mita/eu-ted-tenders-monitor"
        }
    }
}
```

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/TgdP0G5G6G0dEMgnQ/builds/stUuYISoA0gPXYjHT/openapi.json
