# TED Europa Scraper: EU Public Procurement Tenders (`dltik/ted-europa-scraper`) Actor

Scrape EU public procurement tenders from TED (Tenders Electronic Daily). 28 EU countries + UK + EEA. Filter by keywords, country, CPV code, deadline, value, buyer. Get buyer, deadline, contract value, winner, document URLs. For procurement intelligence, B2B public-sector sales. $5/1K tenders.

- **URL**: https://apify.com/dltik/ted-europa-scraper.md
- **Developed by:** [Walid](https://apify.com/dltik) (community)
- **Categories:** Business, Lead generation, Marketing
- **Stats:** 30 total users, 3 monthly users, 100.0% runs succeeded, 2 bookmarks
- **User rating**: 3.00 out of 5 stars

## Pricing

from $5.00 / 1,000 tender scrapeds

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?

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

## TED Europa Scraper — EU Public Procurement Tenders API ($300B+/year market)

> Scrape **Tenders Electronic Daily (TED)** — the EU's official public procurement portal, $300B+/year contract market. Search across **28 EU member states** + EEA + UK + candidate countries. Filter by keyword, country, CPV code, deadline, value, buyer. Get every tender notice: buyer, value, deadline, CPV codes, location, document URLs, winners. **$0.005 per tender**.

⭐ **Bookmark this TED Europa Scraper** — Apify ranks actors by bookmarks, so it directly helps the visibility of this scraper on the Apify Store.

### What is the TED Europa Scraper?

The **TED Europa Scraper** is an Apify actor that queries the EU's official [Tenders Electronic Daily (TED)](https://ted.europa.eu/) — every public-sector contract above the EU threshold (currently €140K for goods/services, €5.5M for works) must be published on TED by law. That's a $300B+/year aggregate procurement market across 28 EU states, EEA, UK, and candidate countries. This scraper accepts complex filters (keyword, country, CPV code, deadline window, value band, buyer type) and returns clean JSON.

Backed by the official `ted.europa.eu` open API. No API key, no quota for normal usage.

### Use cases

- **B2B EU bid intelligence** — daily refresh of new tenders matching your CPV codes; no missed contracts.
- **Government-contract sales pipelines** — feed your CRM with every active tender for your products.
- **Competitive bid analysis** — track who's winning what in your sector (TED publishes contract awards).
- **Public-sector market research** — count tenders per CPV per country per quarter, build dashboards.
- **Compliance / due diligence** — verify a vendor's history of EU public contracts.
- **Lobbyist / consultant research** — identify high-value upcoming contracts in a sector.

### Input

```json
{
  "keywords": "data analytics",
  "countries": ["FR", "DE", "BE"],
  "cpvCodes": ["72000000", "73000000"],
  "minValueEur": 100000,
  "deadlineAfter": "2026-05-01",
  "limit": 200
}
```

### Output

```json
{
  "tender_id": "EXAMPLE-2026-12345",
  "title": "Provision of data analytics services for [buyer]",
  "buyer": "Ministère des Finances - France",
  "country": "FR",
  "cpv_codes": ["72000000-5", "73210000-7"],
  "value_eur": 850000,
  "deadline": "2026-06-15",
  "publication_date": "2026-04-25",
  "tender_type": "services",
  "language": "FR",
  "documents": [
    {"name": "Cahier des charges.pdf", "url": "https://ted.europa.eu/..."}
  ],
  "ted_url": "https://ted.europa.eu/udl?uri=TED:NOTICE:EXAMPLE-2026"
}
```

### Pricing

**PAY\_PER\_EVENT — $0.005 per tender** (= $5 per 1,000). Failed runs not charged.

### FAQ — TED Europa API alternatives

**TED official API alternative?** TED has a free API but its docs are sparse and field names change between formats (XML vs JSON). This actor normalizes everything into a clean schema.

**CPV code coverage?** All 9,000+ CPV (Common Procurement Vocabulary) codes across 45 product/service families. Filter by exact CPV or by family root.

**Multi-language?** Yes — tenders publish in their original language. The actor returns the original text plus a `language` field for routing.

**Award notices vs contract notices?** Both. Use `noticeType` filter: `contract_notice`, `contract_award_notice`, `prior_information`.

***

⭐ **Found this useful? Bookmark this TED Europa Scraper** — it's the strongest signal for Apify Store ranking.

#### Related actors

- [Pappers / Sirene Scraper](https://apify.com/dltik/pappers-sirene-scraper) — French B2B company data (winners enrichment)
- [BODACC MCP Server](https://apify.com/dltik/mcp-server-bodacc) — French commercial court announcements
- [SEC EDGAR MCP Server](https://apify.com/dltik/mcp-server-sec-edgar) — US public companies

License: MIT · Author: [dltik](https://apify.com/dltik)

- [Pappers MCP Server](https://apify.com/dltik/mcp-server-pappers) - 26M French companies for AI agents
- [Data Gouv FR MCP Server](https://apify.com/dltik/mcp-server-data-gouv) - DPE, DVF, BAN, INSEE - 6 tools

# Actor input Schema

## `keywords` (type: `string`):

Free-text search across all notice fields (title, description, buyer). Example: 'machine learning', 'cloud infrastructure', 'cybersecurity'. Supports AND/OR/NOT.

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

Buyer country (ISO 3166-1 alpha-3). FRA, DEU, ESP, ITA, NLD, BEL, POL, SWE, AUT, FIN, GBR... Multiple = OR.

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

Common Procurement Vocabulary codes. Examples: '72000000' (IT services), '45000000' (construction), '85000000' (health), '79000000' (business services), '60000000' (transport). See cpv.eu.

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

Subset of: 'cn-standard' (contract notice), 'can-standard' (contract award), 'pin-only' (prior info), 'pin-buyer' (call for competition), 'cn-social' (social services), 'cn-desg' (utilities). Multiple = OR.

## `procedureTypes` (type: `array`):

Subset of: 'open', 'restricted', 'comp-dial' (competitive dialogue), 'innovation' (innovation partnership), 'neg-w-call', 'neg-wo-call'. Multiple = OR.

## `contractNatures` (type: `array`):

Subset of: 'works' (construction), 'services', 'supplies' (goods).

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

ISO date (YYYY-MM-DD) — only notices published on or after this date. Tip: 'today-30' for last 30 days.

## `publishedBefore` (type: `string`):

ISO date (YYYY-MM-DD).

## `buyerName` (type: `string`):

Partial buyer name. Example: 'Ministère' to find French ministries, 'Bundesamt' for German federal agencies.

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

Minimum tender value in EUR. Use to filter for big-money contracts only.

## `query` (type: `string`):

Override all friendly inputs with a TED expert query. Example: 'FT="AI" AND CY=DEU AND PD>=20260101 AND TV>=1000000'. See docs.ted.europa.eu/api/SearchAPIQueryLanguage.html.

## `preferredLanguages` (type: `array`):

When notices have multilingual fields (title, description, buyer name), return this language first. ISO 639-3 codes: eng, fra, deu, spa, ita, por, nld...

## `maxResults` (type: `integer`):

Maximum tenders to return. Use specific filters for huge searches (TED has millions of notices). Aliases accepted: 'limit', 'max'. Each result charged at the per-event price — start small to validate output.

## `analyzeTenders` (type: `boolean`):

Enrich each tender with an AI 'ai' object: a plain-language summary, the concrete deliverables, and a recommended action (bid / watch / skip). Add 'Business profile' below to also get a 0-100 relevance score per tender - turns a long EU-wide result list into a ranked shortlist. Requires a paid Apify plan; billed as a separate 'tender-analyzed' event. If not on a paid plan the scrape still runs without analysis.

## `businessProfile` (type: `string`):

One or two sentences describing what your company sells or does, e.g. 'Cloud infrastructure and DevOps consultancy, 40 staff, serving the DACH region' or 'Manufacturer of medical imaging equipment'. When set (and AI analysis is on), each tender gets a relevance\_score (0-100) and a one-line reason for how well it fits. Leave empty to get summaries only.

## `proxyConfig` (type: `object`):

TED is open and rarely needs proxy. Only useful for very large runs.

## Actor input object example

```json
{
  "countries": [],
  "cpvCodes": [],
  "noticeTypes": [],
  "procedureTypes": [],
  "contractNatures": [],
  "preferredLanguages": [
    "eng",
    "fra"
  ],
  "maxResults": 20,
  "analyzeTenders": false,
  "proxyConfig": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

Procurement notices.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("dltik/ted-europa-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 = {}

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dltik/ted-europa-scraper"
        }
    }
}

```

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/RI57Gvekp2S5vxcPs/builds/kCXUeNhkva5jrsNzr/openapi.json
