# EU Tenders Scraper (TED Procurement) (`trendlab/eu-ted-tenders-scraper`) Actor

Scrape EU public procurement notices and contract awards from the official TED API. Filter by CPV code, country, buyer, value, and date. Clean, AI-ready JSON. No API key.

- **URL**: https://apify.com/trendlab/eu-ted-tenders-scraper.md
- **Developed by:** [Cheoljae Lee](https://apify.com/trendlab) (community)
- **Categories:** Developer tools, Jobs
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 tender scrapeds

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 Procurement)

Scrape **EU public procurement tenders and contract awards** from the official **TED (Tenders Electronic Daily)** API — filtered by CPV category, country, buyer, value, and date — as clean, AI-ready JSON. No API key required. The EU publishes ~€2 trillion of procurement a year through TED; this Actor turns it into a structured, filterable feed.

### What does this Actor do?

- 📋 **Tender notices & contract awards** — title, buyer, country, publication date, submission deadline, value, CPV codes
- 🏷️ **Filter by CPV category** — IT (72…), construction (45…), business services (79…), and any other Common Procurement Vocabulary code
- 🌍 **Filter by country** — DEU, FRA, IRL, POL, ESP… any EU member state
- 🔎 **Keyword & notice-type filters** — open tenders (`cn-standard`), awards (`can-standard`), prior info (`pin-only`)
- 🔗 **Direct link** to each notice + XML source
- 🌐 **English-normalized** — picks the English title/buyer name from TED's multilingual data
- 🤖 **AI-ready JSON** — for tender-alert tools, CRM enrichment, market research, and AI agents (via the Apify MCP server)

### Why scrape TED?

EU public procurement is a massive, high-value market, but TED's raw interface is hard to monitor. Vendors, consultancies, construction/IT/services firms, and bid-management teams use this Actor to:

- **Get alerted to new tenders** in their category and country as they publish
- **Feed opportunities into a CRM** or bid pipeline automatically
- **Analyze contract awards** — who's winning, at what value, in which markets
- **Track competitors** and buyer spending patterns
- Power **AI agents** that watch for relevant public-sector opportunities

### Input example

```json
{
  "cpvCodes": ["72000000"],
  "countries": ["DEU", "IRL"],
  "keywords": ["software", "cloud"],
  "publishedFrom": "2026-01-01",
  "maxNotices": 500
}
```

Or use a raw TED expert query for full control:

```json
{ "rawQuery": "classification-cpv=45000000 AND buyer-country=FRA AND publication-date>=20260101" }
```

### Output example

```json
{
  "publicationNumber": "161-2026",
  "title": "Germany — IT services: consulting, software development, Internet and support",
  "noticeType": "can-standard",
  "publicationDate": "2026-01-02",
  "deadline": "2026-02-15",
  "buyerName": "Bundesagentur für Arbeit",
  "buyerCountry": "DEU",
  "totalValue": 719735.8,
  "cpvCodes": ["72000000"],
  "url": "https://ted.europa.eu/en/notice/-/detail/161-2026"
}
```

### Finding CPV codes

CPV (Common Procurement Vocabulary) codes classify what's being procured. A prefix matches all subcategories — `72` catches all IT, `45` all construction. Full list: [SIMAP CPV](https://simap.ted.europa.eu/cpv). Common ones: `72000000` IT services, `45000000` construction, `79000000` business services, `85000000` health/social, `48000000` software packages.

### How much does it cost?

Pay per notice returned — a small fee each. A single won tender can be worth millions, so the ROI is high. No subscription.

### FAQ

**Do I need an API key?** No. TED's API is free and public.

**Is this affiliated with the EU?** No. It uses the EU's official public TED API and is not endorsed by the EU. Data © European Union, reused under TED's terms.

**How fresh is the data?** TED publishes notices daily; this Actor returns them as soon as they're in the API.

**Can AI agents use it?** Yes — works with the Apify MCP server, so Claude, ChatGPT, and other agents can call it and pay per use.

### Support

Need award-value breakdowns, contractor (winner) details, or scheduled daily alerts? Open an issue in the **Issues tab** — actively maintained, answered within one business day.

# Actor input Schema

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

Common Procurement Vocabulary codes to filter by, e.g. 72000000 (IT services), 45000000 (construction), 79000000 (business services). A prefix like 72 matches all IT subcategories. Leave empty for all.

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

Filter by buyer country using 3-letter codes, e.g. DEU, FRA, IRL, POL, ESP. Leave empty for all EU countries.

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

Only include notices whose title contains at least one of these words (matched in English title). Leave empty for no keyword filter.

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

Filter by notice type. Common: 'cn-standard' (contract notice / open tender), 'can-standard' (contract award notice), 'pin-only' (prior information). Leave empty for all.

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

Only notices published on or after this date.

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

Only notices published on or before this date.

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

Optional raw TED expert-search query. If set, it OVERRIDES the filters above. Example: 'classification-cpv=72000000 AND buyer-country=DEU AND publication-date>=20260101'.

## `preferredLanguage` (type: `string`):

3-letter language code for titles/buyer names when multiple are available (falls back to English, then any).

## `maxNotices` (type: `integer`):

Maximum number of notices to return.

## Actor input object example

```json
{
  "cpvCodes": [
    "72000000"
  ],
  "preferredLanguage": "eng",
  "maxNotices": 200
}
```

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("trendlab/eu-ted-tenders-scraper").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"] }

# Run the Actor and wait for it to finish
run = client.actor("trendlab/eu-ted-tenders-scraper").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"
  ]
}' |
apify call trendlab/eu-ted-tenders-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/HTkCS2tdr3h6pjQc0/builds/61hCYANlak9RnsikT/openapi.json
