# EU TED Tenders Scraper — Monitor & Alerts (`quenched_zythum/eu-ted-tenders`) Actor

Scrape EU public tenders from TED (ted.europa.eu). Filter by CPV, country, value and notice type. Alert on new notices. No buyer contacts collected.

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

## Pricing

from $5.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 TED Tenders Scraper — Monitor & Alerts

Scrape EU public procurement notices from **TED (Tenders Electronic Daily)** at [ted.europa.eu](https://ted.europa.eu). Filter by keywords, CPV codes, buyer country, notice type, and contract value. Run once for a bulk extract, or use monitor mode to alert on **new notices since the last run**.

**No emails, phone numbers, or contact names are collected.** Buyer organisation details and notice metadata are returned; personal contact fields on notices are omitted by design.

Pairs with our **UK Tenders** (Contracts Finder & Find a Tender) and **USAspending** Actors for multi-market public-procurement coverage.

Procurement notices from TED / the OJ S Supplement may be freely reused for commercial or non-commercial purposes (credit the source; do not use the TED logo). See [Data sources and licence](#data-sources-and-licence).

***

### What it does

- Pulls public notices from the official **TED Search API v3** (`POST https://api.ted.europa.eu/v3/notices/search`).
- Searches and filters by keywords, date range, buyer countries, CPV codes, notice types, and contract value band.
- Every result includes the official **notice ID**, a link back to TED, and a **licence credit** field for redistribution.
- **Monitor / alerts mode:** keep only notices that are new since the previous run (ideal for scheduled Apify runs + webhooks or email integrations).
- Structured JSON/CSV output ready for CRM, BI, or bid-management tools.
- Uses the official public TED API — designed for normal API reads without inventing HTML scraping.

***

### Who it's for

Built for **EU bid teams**, **bid consultancies**, and **suppliers selling to EU governments**.

- **Bid teams** inside SMEs and mid-market suppliers chasing EU public contracts
- **Bid consultancies** and bid-writing agencies monitoring multiple buyers, countries, or sectors
- Suppliers and B2B sales teams selling into EU central government, agencies, and other public bodies
- Procurement-intelligence and market-research workflows that need clean, repeatable TED tender data

***

### Input fields

| Field | Type | Required | Description |
|---|---|---|---|
| `keywords` | string / array | No | Free-text search against title and description |
| `publishedAfter` / `publishedBefore` | date (ISO) | No | Publication date window for bulk extract |
| `buyerCountries` | array of strings | No | Buyer country filters (ISO country codes or TED country codes as supported by the API) |
| `cpvCodes` | array of strings | No | CPV codes to include (exact or prefix match, depending on mode) |
| `noticeTypes` | array of strings | No | e.g. tender / contract notice, award, prior information / PIN, as exposed by TED |
| `minValue` / `maxValue` | number | No | Contract value band (in each notice’s **original currency** — no conversion) |
| `monitorMode` | boolean | No (default: `false`) | If `true`, return only notices new since the last successful run for this Actor configuration (“only new since last run” for alerts) |
| `maxItems` | integer | No | Cap on notices returned per run (max results) |
| `proxyConfiguration` | object | No | Unused for standard TED API reads; reserved for edge cases |

> **Currency:** Value filters and outputs use each notice’s **original currency**. This Actor does **not** convert amounts to EUR or any other currency.
>
> **Privacy:** The Actor does **not** collect or store buyer contact **emails**, **phone numbers**, or **contact names**, even when those fields exist on the source notice. Do not request them via input — they are not available as output.

***

### Output fields (example)

Each dataset item is one notice. Every item includes the official **notice ID**, a TED **link**, and a **licence credit** string. Example shape:

# Actor input Schema

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

Full-text search across the notice (any keyword matches; multi-word entries are treated as phrases). Empty = all.

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

YYYY-MM-DD. Default: 7 days ago.

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

YYYY-MM-DD. Default: today.

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

ISO country codes, alpha-2 (DE) or alpha-3 (DEU).

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

CPV code prefixes, e.g. "72" (IT services) or full codes like "48000000".

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

TED eForms notice types, e.g. cn-standard (contract notice), can-standard (award), pin-only, cn-social, can-modif, veat.

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

In the notice's own currency (mostly EUR). Notices without a value are excluded when set.

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

In the notice's own currency. Notices without a value are excluded when set.

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

Stop after this many notices are saved.

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

Skip notices returned by previous runs (IDs kept in the named key-value store 'eu-ted-tenders-state'). For scheduled alerts.

## Actor input object example

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

# Actor output Schema

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

Dataset items: one TED notice per row.

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

```

## MCP server setup

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