# EU TED Tenders — Public Procurement Notice Scraper (`fetchsmith/eu-ted-tenders-scraper`) Actor

Search the EU's official TED public-procurement journal by country, CPV code and date. Returns clean, English-preferred, deduplicated JSON: buyer, value, deadlines, CPV codes and notice link.

- **URL**: https://apify.com/fetchsmith/eu-ted-tenders-scraper.md
- **Developed by:** [Fetch Smith](https://apify.com/fetchsmith) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.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/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

## EU TED Tenders — Public Procurement Notice Scraper

Search **TED (Tenders Electronic Daily)**, the EU's official public-procurement journal, and get clean, structured JSON back — no EU login, no scraping tricks, just the official free API normalized into a usable shape.

### What it does

- Queries the official `api.ted.europa.eu` Search API (no key, no auth required).
- Filters by buyer country, CPV code, notice type and publication date, or drop in a raw TED expert-query string for full control.
- Normalizes TED's raw response: notices come back as multilingual maps (`{"deu": ["..."]}`) with heavily duplicated per-lot arrays (the same CPV code repeated a dozen times). This Actor flattens each notice to one row with an English-preferred title/buyer name, deduplicated CPV/contract-nature arrays, and the earliest deadline date.
- Pay per result: you are charged only for notices actually returned.
- HTTP-only (no browser), so runs are fast and cheap.

### Input

| Field | Type | Description |
|---|---|---|
| `countries` | array | ISO 3166-1 alpha-3 buyer country codes (e.g. `DEU`, `FRA`). Empty = all. |
| `cpvCodes` | array | 8-digit CPV codes to filter by (e.g. `72000000` for IT services). Empty = all. |
| `noticeTypes` | array | TED notice-type codes (e.g. `cn-standard`, `can-standard`, `pin-standard`). Empty = all. |
| `publishedWithinDays` | integer | Only notices published in the last N days. Default 7. |
| `expertQuery` | string | Raw TED expert-query string — overrides the filters above entirely. |
| `maxResults` | integer | Stop after this many notices. Default 100. |

### Output

One row per notice: `publicationNumber`, `noticeType`, `noticeSubtype`, `procedureType`, `title` (+ `titleLanguage`), `buyerName`, `buyerCountry`, `buyerCity`, `buyerEmail`, `buyerPhone`, `buyerUrl`, `placeOfPerformanceCountry` + `placeOfPerformanceCity` (arrays, deduplicated), `contractNature` (array), `cpvCodes` (array), `description`, `totalValue` + `totalValueCurrency`, `deadlineDate`, `deadlineReceiptRequestDate`, `publicationDate`, `noticeUrl`.

Buyer contact details (`buyerEmail`/`buyerPhone`/`buyerUrl`) are real lead-generation fields, not just reference data — most notices carry a direct procurement-office email or phone.

### Pricing

`result` — $0.003 per returned notice. The run start is free, no minimum spend.

### FAQ

**Why not just call the TED API myself?** You can — it's free and public. What you get here is normalization: TED's raw fields are multilingual maps and duplicated per-lot arrays, which are painful to consume directly. This Actor gives you one flat row per notice with an English-preferred title, a deduplicated CPV list and a single deadline date.

**Does this cover contract value?** Yes, when TED has it (`totalValue`/`totalValueCurrency`) — not every notice type carries a value (e.g. prior-information notices often don't).

**Can I search full text?** Not directly in the simple filters yet — use `expertQuery` with TED's expert-search syntax for anything beyond country/CPV/type/date.

### Notes

Only public data from an official EU government API is collected — no ToS or anti-bot risk. Issues or feature requests: support@fetchsmith.com. Also available as a hosted API at https://fetchsmith.com

Source code: https://github.com/Fetchsmith/fetchsmith/tree/main/actors/eu-ted-tenders-scraper

# Actor input Schema

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

ISO 3166-1 alpha-3 codes of the buyer's country (e.g. DEU, FRA, ITA, ESP, NLD). Leave empty for all EU/EEA countries.

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

Common Procurement Vocabulary codes to filter by (e.g. 72000000 for IT services, 45000000 for construction). Exact 8-digit codes only. Leave empty for all.

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

TED notice-type codes to filter by, e.g. cn-standard (contract notice), can-standard (contract award notice), pin-standard (prior information). Leave empty for all types.

## `publishedWithinDays` (type: `integer`):

Only return notices published in the last N days.

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

Raw TED expert-query string (same syntax as the TED website's expert search), e.g. "buyer-country=DEU AND classification-cpv=72000000 AND publication-date>=today(-30)". If set, this replaces countries/cpvCodes/noticeTypes/publishedWithinDays entirely.

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

Stop after this many notices.

## Actor input object example

```json
{
  "countries": [],
  "cpvCodes": [],
  "noticeTypes": [],
  "publishedWithinDays": 7,
  "maxResults": 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 = {};

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fetchsmith/eu-ted-tenders-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/5LxaohNcO1zA86cEp/builds/teiBpdFPKYApGUWzn/openapi.json
