# 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
- **Features:** Limited permissions
- **Stats:** 51 total users, 15 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?

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

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

![TED Europa Scraper banner](https://api.apify.com/v2/key-value-stores/K2LtmeJMntqmTuIKm/records/banner.png)

> 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 with the **buyer contact (email, phone, contact point)**, value, deadline, CPV codes, location, document URLs and **award winners** — plus optional **AI relevance scoring**. **$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.

For the **French national layer** below the EU threshold — a far larger volume of France-only contracts — pair this with the [BOAMP Scraper](https://apify.com/dltik/boamp-fr-scraper). BOAMP + TED together give full coverage of the French public-sector market.

### What you get for every tender

- **Buyer contact** — `buyer_name`, `buyer_email` (~100% fill), `buyer_phone`, `buyer_contact_point`, `buyer_website`, `buyer_country`, `buyer_city`. The lead-gen payload most TED tools drop.
- **The opportunity** — `title`, `description`, `cpv_codes`, `contract_nature`, `estimated_value` + currency, `deadline_tender_date`, `procedure_type`.
- **Award intelligence** — `winner_name`, `winner_country`, `winner_email`, `total_value` on contract-award notices.
- **Location & documents** — `place_of_performance_*`, `url_ted`, `url_pdf`, `url_xml`, `url_html`.

### Use cases

- **B2B EU bid intelligence** — daily refresh of new tenders matching your CPV codes, now with the **buyer's email and phone** attached; no missed contracts.
- **Government-contract sales pipelines** — feed your CRM with every active tender, ranked by AI relevance to your business.
- **Competitive bid analysis** — track who's winning what in your sector (TED publishes contract awards with winner + value).
- **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.

### AI analysis (premium, opt-in)

Set `analyzeTenders: true` to add an `ai` object to every tender: a plain-language `summary`, extracted `deliverables`, a `recommended_action` (`bid` / `watch` / `skip`), and — when you provide `businessProfile` — a `relevance_score` (0-100) with a one-line reason. It turns an EU-wide result set into a ranked shortlist. Requires a paid Apify plan; billed as a separate `tender-analyzed` event. Without a paid plan the scrape still runs, without the `ai` field.

### Ready-to-run tasks (pre-configured, one click)

- [EU IT & Software Public Tenders](https://apify.com/dltik/ted-europa-scraper/eu-it-software-tenders) — cross-border IT tenders (CPV 72)
- [EU Construction & Works Tenders](https://apify.com/dltik/ted-europa-scraper/eu-construction-works-tenders) — works & construction (CPV 45)
- [German Public Tenders](https://apify.com/dltik/ted-europa-scraper/german-public-tenders) — öffentliche Ausschreibungen (Germany)

For the French national layer below the EU threshold, see the [BOAMP Scraper tasks](https://apify.com/dltik/boamp-fr-scraper); for awarded French contracts, the [DECP Scraper tasks](https://apify.com/dltik/decp-fr-scraper).

### Input

```json
{
  "keywords": "data analytics",
  "countries": ["FRA", "DEU", "BEL"],
  "cpvCodes": ["72000000", "73000000"],
  "minValue": 100000,
  "publishedAfter": "today-30",
  "maxResults": 200,
  "analyzeTenders": true,
  "businessProfile": "Cloud infrastructure and DevOps consultancy, 40 staff, serving the DACH region"
}
```

Country codes are ISO 3166-1 alpha-3 (`FRA`, `DEU`, `ESP`, `ITA`, `NLD`...). All inputs are optional; with no filters the actor returns the most recent notices.

### Output

![Sample output — TED Europa Scraper](https://api.apify.com/v2/key-value-stores/K2LtmeJMntqmTuIKm/records/output.png)

```json
{
  "type": "tender",
  "publication_number": "413531-2026",
  "title": "France - Motor vehicles - Fourniture de vehicules en location longue duree",
  "buyer_name": "COMMUNAUTE DE COMMUNES DU BAZADAIS",
  "buyer_country": "FRA",
  "buyer_email": "contact@cdcdubazadais.fr",
  "buyer_phone": "+33 556252881",
  "buyer_contact_point": "Delphine HOUGAS",
  "cpv_codes": ["34100000"],
  "contract_nature": "supplies",
  "estimated_value": 850000,
  "estimated_value_currency": "EUR",
  "deadline_tender_date": "2026-07-17+02:00",
  "procedure_type": "open",
  "winner_name": null,
  "url_ted": "https://ted.europa.eu/en/notice/-/detail/413531-2026",
  "ai": {
    "summary": "The Bazadais community of municipalities wants to lease a fleet of vehicles long-term.",
    "deliverables": ["Long-term vehicle leasing", "Fleet maintenance"],
    "recommended_action": "skip",
    "relevance_score": 5,
    "relevance_reason": "Vehicle leasing, unrelated to cloud/DevOps consulting."
  }
}
```

### Pricing

**PAY_PER_EVENT — $0.005 per tender** (= $5 per 1,000). Optional AI analysis is billed separately at **$0.01 per analyzed tender** (`tender-analyzed`, paid plans only). 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 the `noticeTypes` filter: `cn-standard` (contract notice), `can-standard` (contract award), `pin-only` (prior information).

**Do you return buyer email addresses?** Yes — TED notices carry the buyer's official contact, and this actor surfaces `buyer_email` (~100% fill), `buyer_phone` and `buyer_contact_point` as clean fields for your CRM.

**TED vs BOAMP?** TED = EU-wide, above the EU threshold. [BOAMP](https://apify.com/dltik/boamp-fr-scraper) = the French national bulletin (all sizes, France only). Many French contracts appear on BOAMP only — run both for full coverage.

***

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

#### Related actors

- [BOAMP Scraper](https://apify.com/dltik/boamp-fr-scraper) — French national public tenders (the layer below the EU threshold)
- [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/L5g8RHuDKCagxY1qw/openapi.json
