# EU Tenders Scraper — TED Public Procurement (`tender.intelligence/eu-tenders-ted`) Actor

Extract live EU public procurement tenders from TED (Tenders Electronic Daily) by CPV code, country and deadline. Clean JSON output: buyer, title, value, deadline, direct notice URL. No proxies needed — official data source.

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

## Pricing

from $4.00 / 1,000 tender records

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## EU Tenders Scraper — TED Public Procurement Data

Extract **live EU public procurement tenders** from [TED (Tenders Electronic Daily)](https://ted.europa.eu) — the official journal where every European government contract above threshold must be published. Filter by **CPV code, country, publication date and submission deadline**, and get clean, structured JSON ready for lead generation, bid monitoring, market research or BI dashboards.

No proxies, no fragile HTML scraping: this Actor uses the official TED Search API (EU open data), so results are complete, legal and stable.

### What you get per tender

| Field | Example |
|---|---|
| `title` | "Netherlands – IT services – Application management" |
| `buyer` | "Gemeente Purmerend" |
| `estimatedValue` / `currency` | 275000 / EUR |
| `submissionDeadline` | 2026-08-19 |
| `publishedDate` | 2026-06-16 |
| `cpv` | 72000000 |
| `countries` | NLD |
| `noticeUrl` | direct link to the official notice |

### Use cases

- **Sales & lead generation** — find companies' next opportunities before competitors do; feed tender alerts into your CRM or outbound tooling
- **Bid / tender monitoring** — track every open tender in your industry (CPV) and countries with a scheduled run
- **Market & competitor research** — analyze public-sector spending by sector, country and buyer
- **Data products & dashboards** — pipe EU procurement data into Google Sheets, BigQuery, Power BI or your app via the Apify API

### How to use

1. Enter one or more **CPV codes** (e.g. `72000000` for IT services, `45000000` for construction, `33000000` for medical equipment)
2. Pick **countries** (ISO-3: `NLD`, `BEL`, `DEU`, `FRA`, …) or leave empty for all EU
3. Keep **"Only open deadlines"** on to get only tenders you can still bid on
4. Run once, or **schedule it** (daily/weekly) for continuous tender monitoring

Advanced users can pass a raw TED expert query to unlock any filter the TED API supports (buyer name, notice type, award criteria and more).

### Common CPV codes

`72000000` IT services · `45000000` construction · `79000000` business services · `33000000` medical equipment · `90000000` environmental · `71000000` architecture/engineering · `80000000` education · `60000000` transport · `50000000` repair/maintenance · `48000000` software packages

### Why TED data matters

The EU public procurement market is worth **€2+ trillion per year**. Every above-threshold contract from all 27 EU member states — plus EU institutions (Europol, EIB, agencies) — is published on TED in 24 languages. Most companies never systematically monitor it. The ones that do, win.

### Related

Works great together with scheduled runs + the Apify Google Sheets integration for a zero-code tender-alert pipeline.

# Actor input Schema

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

Common Procurement Vocabulary codes to filter by. Examples: 72000000 (IT services), 45000000 (construction), 79000000 (business services), 33000000 (medical equipment), 90000000 (environmental services). One code per line.

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

Place-of-performance country codes, e.g. NLD, BEL, DEU, FRA, LUX, ESP, ITA, POL, SWE. One per line. Leave empty for all EU.

## `publishedAfter` (type: `string`):

Only notices published after this date, e.g. 20260601. Leave empty for no publication-date filter.

## `onlyOpenDeadlines` (type: `boolean`):

If enabled, only returns tenders whose submission deadline is still open (recommended for lead generation and bid monitoring).

## `maxPages` (type: `integer`):

How many result pages to fetch. 1 page = up to 100 notices.

## `rawQuery` (type: `string`):

Optional: override all filters above with a raw TED expert-search query, e.g. (classification-cpv IN (72000000)) AND (place-of-performance IN (NLD)).

## Actor input object example

```json
{
  "cpvCodes": [
    "72000000"
  ],
  "countries": [
    "NLD",
    "BEL",
    "LUX"
  ],
  "onlyOpenDeadlines": true,
  "maxPages": 2
}
```

# 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 = {
    "cpvCodes": [
        "72000000"
    ],
    "countries": [
        "NLD",
        "BEL",
        "LUX"
    ]
};

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

# Run the Actor and wait for it to finish
run = client.actor("tender.intelligence/eu-tenders-ted").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "cpvCodes": [
    "72000000"
  ],
  "countries": [
    "NLD",
    "BEL",
    "LUX"
  ]
}' |
apify call tender.intelligence/eu-tenders-ted --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=tender.intelligence/eu-tenders-ted",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/VAJuYRdaPv2cknzRE/builds/HUavlwKOd4hDZNtv4/openapi.json
