# EU TED Tenders Scraper (`foxk1996/eu-ted-tenders`) Actor

Search EU TED procurement notices by CPV code, buyer country, and tender deadline using the official TED Search API. Exports structured tender records with buyer, CPV, dates, and notice links for bid consultants.

- **URL**: https://apify.com/foxk1996/eu-ted-tenders.md
- **Developed by:** [Kronos Fox](https://apify.com/foxk1996) (community)
- **Categories:** Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$30.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 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 Scraper

### EU TED procurement search for bid consultants

EU TED Tenders Scraper is a focused Apify actor for consultants, sales teams, capture managers, and procurement analysts who need a fast export of public European tender notices. It uses the official TED Search API at `api.ted.europa.eu/v3/notices/search`, so it does not require logins, browser automation, residential proxies, or scraping of protected pages. The actor sends the API's required POST request with a JSON body containing `query`, `fields`, and `limit`; this is important because the TED search endpoint returns 405 for GET requests.

### What you get

Each scraped tender record is normalized into a flat dataset row with the publication number, tender title, buyer name, buyer countries, CPV codes, submission deadline, publication date, notice type, place of performance, description text when TED provides it, and direct TED notice/PDF/XML links. The output is designed for spreadsheet review, CRM import, lead qualification, and automated monitoring workflows.

### Search by CPV code, country, and deadline

Most users can fill in `cpvCodes`, `countries`, `deadlineFrom`, `publicationDateFrom`, and `maxResults`. CPV codes should be entered as numeric strings such as `45000000` for construction or `72000000` for IT services. Buyer countries use TED ISO-3 codes such as `DEU`, `FRA`, `ESP`, `ITA`, `NLD`, `POL`, or `SWE`; common ISO-2 entries like `DE` are normalized automatically. Deadline and publication date filters accept `YYYY-MM-DD` or TED's compact `YYYYMMDD` format. Advanced users may provide a raw TED expert-search `query`, which overrides the form filters.

### Use cases

Use this actor to build daily tender watchlists, find newly published opportunities in a target CPV family, audit public-sector demand by country, feed bid/no-bid triage sheets, or give researchers a quick sample of TED opportunities without teaching them the TED expert-search syntax. Bid consultants can run separate tasks by sector and buyer country, then merge the Apify datasets downstream.

### Pricing

This actor is intended for Apify pay-per-event monetization. Configure one paid event in Apify Console: `tender-scraped` at $0.03 per exported tender. Local runs, free runs, or non-PPE pricing-model runs are capped by the built-in free-run gate to avoid unlimited uncharged extraction.

### FAQ

#### Does it scrape private data?

No. It only calls public TED procurement API endpoints and exports public tender notice data.

#### Why are there no browser actions?

The official API is more stable and polite than browser scraping. It also avoids Cloudflare or login issues.

#### Why did my country filter fail?

TED expects its own ISO-3 style values in expert search. Try `DEU` instead of Germany, `FRA` instead of France, or use the actor's ISO-2 normalization for common European country codes.

#### Can I write a custom query?

Yes. Put a TED expert-search expression in `query`; the actor sends it as-is with the requested fields and limit.

# Actor input Schema

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

Optional raw TED expert-search query. When provided, it is sent as-is to api.ted.europa.eu/v3/notices/search and overrides the CPV, country, and deadline filters.

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

CPV codes to filter by, such as 45000000 for construction. TED returns matching notices whose classification CPV is in this set.

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

Buyer country codes in TED ISO-3 format, such as DEU, FRA, ESP, ITA, NLD, POL, or SWE. Common ISO-2 codes like DE are normalized where possible.

## `deadlineFrom` (type: `string`):

Optional tender submission deadline lower bound. Use YYYY-MM-DD or TED format YYYYMMDD; it becomes deadline-receipt-request >= YYYYMMDD.

## `publicationDateFrom` (type: `string`):

Optional publication date lower bound in YYYY-MM-DD or YYYYMMDD. The prefill keeps the default run small and recent enough for a quick smoke test.

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

Maximum number of tender records to export. The actor asks TED for this limit and also truncates client-side if the API over-serves.

## Actor input object example

```json
{
  "cpvCodes": [
    "45000000"
  ],
  "countries": [
    "DEU"
  ],
  "deadlineFrom": "",
  "publicationDateFrom": "2026-07-01",
  "maxResults": 10
}
```

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

// Run the Actor and wait for it to finish
const run = await client.actor("foxk1996/eu-ted-tenders").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": ["45000000"],
    "countries": ["DEU"],
}

# Run the Actor and wait for it to finish
run = client.actor("foxk1996/eu-ted-tenders").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": [
    "45000000"
  ],
  "countries": [
    "DEU"
  ]
}' |
apify call foxk1996/eu-ted-tenders --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/uTXZUqX4QfC6pQOCY/builds/KdT9VWybgDnzQgkuU/openapi.json
