# EU Tenders Scraper — TED Public Procurement Notices (`grilled_gorge/eu-ted-tender-scraper`) Actor

Unofficial tool for searching EU tenders and public procurement notices through the TED API. Not affiliated with the European Union or its Publications Office.

- **URL**: https://apify.com/grilled\_gorge/eu-ted-tender-scraper.md
- **Developed by:** [Jonathan Willburry](https://apify.com/grilled_gorge) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 result items

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

### What does EU Tenders Scraper do?

> **Unofficial and independent:** This Actor is not affiliated with, sponsored by, or endorsed by the European Union, its institutions, the Publications Office of the European Union, or TED.

**EU Tenders Scraper searches public procurement notices from the official [TED portal](https://ted.europa.eu/)** and exports a clean, flat dataset. Search by CPV classification, place of performance, publication date, full text, or a raw TED expert query. The Actor runs without a TED account or API key and can be scheduled, called through the Apify API, monitored, or connected to common Apify integrations.

### Why use EU Tenders Scraper?

Use the Actor to monitor new public-sector opportunities, research procurement markets, build tender alerts, compare buyers, or feed qualified notices into an internal opportunity pipeline. It requests only tender and organization fields from the official API. It does not request contact people, email addresses, or telephone numbers.

Results are normalized across TED's multilingual response format. Choose a preferred language and the Actor falls back to English or the first available language when a translation is unavailable.

### Ready-to-run examples

- [Find IT tenders in Germany (TED)](https://apify.com/grilled_gorge/eu-ted-tender-scraper/examples/find-it-tenders-germany)
- [Monitor EU construction tenders](https://apify.com/grilled_gorge/eu-ted-tender-scraper/examples/monitor-eu-construction-tenders)
- [Find medical equipment tenders in the EU](https://apify.com/grilled_gorge/eu-ted-tender-scraper/examples/find-medical-equipment-tenders-eu)

Each example opens with a working configuration that you can copy and adjust.

### How to use EU Tenders Scraper

1. Open the Actor and select **Create new task** or **Start**.
2. Enter one or more CPV codes, optional country codes, and the number of days to search.
3. Optionally add a full-text phrase. Advanced users can instead provide a TED expert query.
4. Set the maximum number of notices and run the Actor.
5. Open the Dataset tab to filter or export the results.

### Input

The default input searches CPV `72000000` for notices published during the previous seven days and returns up to 100 items. `expertQuery` overrides the generated filters. Country codes use three-letter values such as `DEU` and `FRA`; CPV codes must contain exactly eight digits.

```json
{
    "cpvCodes": ["72000000"],
    "countryCodes": [],
    "daysBack": 7,
    "language": "eng",
    "maxItems": 100
}
```

### Output

The following abbreviated item comes from a real TED API test run on July 18, 2026:

```json
{
    "publicationNumber": "479739-2026",
    "title": "Finland – Radio, television, communication, telecommunication and related equipment – Mobiilipäätelaitteet",
    "buyerName": "Veikkaus Oy",
    "buyerCountry": "FIN",
    "cpvCodes": ["32000000", "32250000", "50300000", "72000000"],
    "contractNature": "supplies; services",
    "noticeType": "cn-standard",
    "publicationDate": "2026-07-13+02:00",
    "deadlineDate": "2026-08-19Z",
    "tedUrl": "https://ted.europa.eu/en/notice/-/detail/479739-2026"
}
```

You can download the dataset in various formats such as JSON, HTML, CSV, or Excel.

### Data table

| Field                | Description                                          |
| -------------------- | ---------------------------------------------------- |
| `publicationNumber`  | Official TED publication number                      |
| `title`              | Notice title in the selected or fallback language    |
| `buyerName`          | Contracting organization                             |
| `buyerCountry`       | Buyer country code                                   |
| `cpvCodes`           | CPV classifications present in the notice            |
| `contractNature`     | Supplies, services, works, or available combinations |
| `publicationDate`    | Official publication date                            |
| `deadlineDate`       | First available tender deadline                      |
| `estimatedValue`     | Procedure-level estimated value when published       |
| `currency`           | Currency of the estimated value                      |
| `placeOfPerformance` | Published place-of-performance codes                 |
| `tedUrl`             | Direct link to the notice on TED                     |
| `query`              | Exact expert query used for the result               |
| `scrapedAt`          | ISO timestamp of extraction                          |

### Pricing / Cost estimation

The Actor uses pay-per-event pricing: one small run-start event and one result event per saved notice. Review the current price shown in the Apify Console before starting a run. Use `maxItems` to place a clear upper bound on output volume.

### Tips and advanced options

- Start with CPV and date filters, then add countries or full text to narrow the result set.
- Use `expertQuery` for TED operators such as `FT ~ software` or combined notice-type filters.
- Estimated values and deadlines are optional source fields and can be empty for some notices.
- Schedule a daily run with `daysBack` set to one or two days for lightweight monitoring.

### FAQ, disclaimers, and support

**Is a TED login required?** No. The Actor uses TED's open Search API.

**Is the data complete?** The Actor returns fields published by TED. Missing values are represented as `null`; source availability varies by notice type.

Public procurement data can still be subject to source terms and downstream compliance requirements. Verify important details on the linked TED notice before making business or legal decisions. Use the Actor's Issues tab for bug reports or support requests. Custom solutions can be discussed through the support channel.

# Actor input Schema

## `fullTextSearch` (type: `string`):

Words or an exact phrase to find across published TED notices.

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

Eight-digit Common Procurement Vocabulary codes.

## `countryCodes` (type: `array`):

Three-letter country codes such as DEU or FRA.

## `daysBack` (type: `integer`):

Only return notices published within this many days.

## `language` (type: `string`):

Preferred language for multilingual titles and buyer names.

## `expertQuery` (type: `string`):

Raw TED expert query. When set, it replaces all other filters.

## `maxItems` (type: `integer`):

Maximum number of dataset items for the run.

## Actor input object example

```json
{
  "fullTextSearch": "",
  "cpvCodes": [
    "72000000"
  ],
  "countryCodes": [],
  "daysBack": 7,
  "language": "eng",
  "expertQuery": "",
  "maxItems": 100
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# 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"
    ],
    "countryCodes": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("grilled_gorge/eu-ted-tender-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"],
    "countryCodes": [],
}

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

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/0stnEcxwFeKUqmQLp/builds/swolKsrHdrixYmaSP/openapi.json
