# 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:** [dltik](https://apify.com/dltik) (community)
- **Categories:** Business, Lead generation, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

$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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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)

# 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).

## `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": 100,
  "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("💾 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 '{}' |
apify call dltik/ted-europa-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "TED Europa Scraper: EU Public Procurement Tenders",
        "description": "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.",
        "version": "1.0",
        "x-build-id": "JveSb4X8VbeUtNOsN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/dltik~ted-europa-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-dltik-ted-europa-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/dltik~ted-europa-scraper/runs": {
            "post": {
                "operationId": "runs-sync-dltik-ted-europa-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/dltik~ted-europa-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-dltik-ted-europa-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "keywords": {
                        "title": "Keywords",
                        "type": "string",
                        "description": "Free-text search across all notice fields (title, description, buyer). Example: 'machine learning', 'cloud infrastructure', 'cybersecurity'. Supports AND/OR/NOT."
                    },
                    "countries": {
                        "title": "Countries (ISO3)",
                        "type": "array",
                        "description": "Buyer country (ISO 3166-1 alpha-3). FRA, DEU, ESP, ITA, NLD, BEL, POL, SWE, AUT, FIN, GBR... Multiple = OR.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "cpvCodes": {
                        "title": "CPV codes",
                        "type": "array",
                        "description": "Common Procurement Vocabulary codes. Examples: '72000000' (IT services), '45000000' (construction), '85000000' (health), '79000000' (business services), '60000000' (transport). See cpv.eu.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "noticeTypes": {
                        "title": "Notice types",
                        "type": "array",
                        "description": "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.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "procedureTypes": {
                        "title": "Procedure types",
                        "type": "array",
                        "description": "Subset of: 'open', 'restricted', 'comp-dial' (competitive dialogue), 'innovation' (innovation partnership), 'neg-w-call', 'neg-wo-call'. Multiple = OR.",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "contractNatures": {
                        "title": "Contract natures",
                        "type": "array",
                        "description": "Subset of: 'works' (construction), 'services', 'supplies' (goods).",
                        "items": {
                            "type": "string"
                        },
                        "default": []
                    },
                    "publishedAfter": {
                        "title": "Published after",
                        "type": "string",
                        "description": "ISO date (YYYY-MM-DD) — only notices published on or after this date. Tip: 'today-30' for last 30 days."
                    },
                    "publishedBefore": {
                        "title": "Published before",
                        "type": "string",
                        "description": "ISO date (YYYY-MM-DD)."
                    },
                    "buyerName": {
                        "title": "Buyer name (partial)",
                        "type": "string",
                        "description": "Partial buyer name. Example: 'Ministère' to find French ministries, 'Bundesamt' for German federal agencies."
                    },
                    "minValue": {
                        "title": "Minimum value (€)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Minimum tender value in EUR. Use to filter for big-money contracts only."
                    },
                    "query": {
                        "title": "Raw expert query (advanced)",
                        "type": "string",
                        "description": "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": {
                        "title": "Preferred output languages",
                        "type": "array",
                        "description": "When notices have multilingual fields (title, description, buyer name), return this language first. ISO 639-3 codes: eng, fra, deu, spa, ita, por, nld...",
                        "items": {
                            "type": "string"
                        },
                        "default": [
                            "eng",
                            "fra"
                        ]
                    },
                    "maxResults": {
                        "title": "Max results",
                        "minimum": 1,
                        "maximum": 50000,
                        "type": "integer",
                        "description": "Maximum tenders to return. Use specific filters for huge searches (TED has millions of notices).",
                        "default": 100
                    },
                    "proxyConfig": {
                        "title": "Proxy (optional)",
                        "type": "object",
                        "description": "TED is open and rarely needs proxy. Only useful for very large runs.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
