# European TED Tenders Scraper (`parseforge/european-ted-tenders-scraper`) Actor

Collects EU procurement notices from TED by publication date and returns each tender as a flat row with title, buyer, country, deadline, CPV codes, and full notice text.

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

## Pricing

from $19.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

[![ParseForge](https://raw.githubusercontent.com/ParseForge/apify-assets/main/banner-v4.webp)](https://apify.com/parseforge?fpr=vmoqkp)

### European TED Tenders Scraper

**Scrape European public procurement notices from TED (Tenders Electronic Daily) by publication date, up to a million per run.** Each tender comes with its title, buyer, deadline, CPV codes, and full notice text. Export to CSV, JSON, Excel, or XML.

The TED portal publishes thousands of new public contracts across the EU every day, but its web interface makes bulk analysis slow. This actor reads the official TED search feed directly, collects every matching notice, and returns them in a clean, flat schema. No API key, no registration, no manual downloads.

| Who uses it | What they scrape TED for |
|---|---|
| Business development teams | Find public contracts their company can bid on before the deadline. |
| Market researchers | Track which sectors and countries are spending the most public money. |
| Data analysts | Build a historical dataset of EU procurement for spend analysis. |
| Compliance officers | Monitor tenders for regulatory or competitive intelligence signals. |

### What it does

This Actor collects EU procurement notices from TED by publication date and returns each tender as a structured row.

- 📅 **Publication date filter:** collect notices published on a single day, formatted as YYYYMMDD.
- 📊 **Flat row output:** every tender returns as one row with title, buyer, country, deadline, CPV codes, and full text.
- ⚡ **High volume ready:** set maxItems up to 1,000,000 per run for bulk historical collection.
- 📁 **Multi-format export:** download your dataset as CSV, JSON, Excel, or XML.

Results export to CSV, JSON, Excel, or XML, or straight from the API.

### What you can do with TED data

**📈 Build a sales pipeline of public contracts.**

A business developer runs the actor daily for the latest notices, filters by CPV codes matching their services, and qualifies leads before the competition.

**🌍 Map public spending by country and sector.**

A market analyst collects a year of TED data, groups it by NUTS region and CPV division, and identifies the fastest-growing procurement markets.

**📊 Feed a procurement intelligence dashboard.**

A data engineer schedules the actor to run each morning, pipes the JSON output into a BI tool, and gives the sales team a live view of new opportunities.

**🔍 Monitor a competitor's public-sector wins.**

A strategy lead searches for a rival's name in the full notice text across months of data to understand their EU contract footprint.

### Why choose this scraper

|  | What you get |
|---|---|
| **No API key needed** | Reads the public TED search feed directly, no registration or OAuth. |
| **Structured output** | Every notice is parsed into the same flat schema, ready for analysis. |
| **Bulk collection** | Collect up to a million notices in a single run for historical research. |
| **Official source** | Data comes straight from the EU Publications Office, the authoritative publisher. |

### How it compares

No other Store actor targets TED the same way, so the honest comparison is with the alternatives teams actually weigh.

| | European TED Tenders Scraper | Build it in-house | By hand |
|---|---|---|---|
| Setup | Run it now, zero config | Days of engineering | None, but hours per pull |
| When TED changes | Maintained for you | You fix it | You re-learn the page |
| Proxies, retries, anti-bot | Built in | Your problem | Browser only |
| Output | Fixed JSON schema, CSV/Excel export | Whatever you build | Copy-paste |
| Cost | Pay per result | Engineering time | Analyst hours |

### Configure the run

Drive the Actor with a publication date in YYYYMMDD format and a maximum tender count; filters run as each notice is read so only matches reach your dataset. The Input tab lists every parameter.

A first run with the defaults:

```json
{
  "maxItems": 10
}
```

A larger pull:

```json
{
  "maxItems": 200
}
```

### Pricing

Pay-per-result: **$0.021 per result** collected. You pay only for the results written to your dataset.

| Results collected | Approximate cost |
|---|---|
| 100 results | $2.10 |
| 1,000 results | $21.00 |
| 10,000 results | $210.00 |

New Apify accounts start with $5 in free credit.

### Free users

Free-plan runs return up to 10 results as a preview. [Upgrade your Apify plan](https://console.apify.com/sign-up?fpr=vmoqkp) to collect up to 1,000,000 results per run.

### Run it

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [European TED Tenders Scraper](https://apify.com/parseforge/european-ted-tenders-scraper?fpr=vmoqkp).
3. Set your inputs and any filters, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the **Dataset** tab.

Run it programmatically through the [Apify API](https://docs.apify.com/api/v2) (`run-sync-get-dataset-items`) or the [ApifyClient](https://docs.apify.com/api/client/js) for JavaScript and Python.

### Use with AI agents (MCP)

Give an AI agent live access to TED through the Model Context Protocol. Add the Actor to Claude, Cursor, or any MCP client:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/european-ted-tenders-scraper"
```

Then prompt it in plain language to run the scraper and read back the results.

### Troubleshooting

**Why am I getting no results?**

Check that your publicationDate is a valid past date in YYYYMMDD format. TED does not publish notices on weekends or public holidays, so a Saturday or Sunday date will often return zero tenders.

**The actor collected fewer items than my maxItems setting.**

maxItems is an upper limit. The actor stops when it has read all notices published on the given date. If TED published only 200 notices that day, you will get 200, even if maxItems is set to 10,000.

**Some fields are empty in my output.**

Not every TED notice includes every field. For example, a prior information notice may not have a deadline for receipt of tenders. Empty fields reflect missing data in the original notice.

**The run timed out.**

If you set a very high maxItems on a date with many notices, the run may hit the Apify platform timeout. Reduce maxItems or split the collection across multiple dates.

**I need to filter by country or CPV code.**

Country and CPV filters are not yet available as input parameters. As a workaround, collect the full day's notices and filter the output dataset by the relevant columns in your spreadsheet or script.

### FAQ

| Question | Answer |
|---|---|
| What is TED? | TED (Tenders Electronic Daily) is the official online journal for European Union public procurement notices, published by the EU Publications Office. It covers contracts above certain thresholds from all EU member states. |
| Do I need an API key or login? | No. This actor reads the public TED search interface directly. You do not need to register an application or manage OAuth tokens. |
| What data does each tender row contain? | Each row includes the notice title, contracting authority name, country, publication date, deadline for receipt of tenders, CPV classification codes, notice type, and the full notice text. |
| Can I filter by country or CPV code? | The current input schema supports filtering by publication date and a maximum item count. Country and CPV filtering are not yet exposed as input fields but can be applied on the output dataset after collection. |
| How many tenders can I collect in one run? | You can set maxItems up to 1,000,000. The actual number collected depends on how many notices TED published on the date you specify. |
| What date format does the publicationDate field expect? | YYYYMMDD, for example 20251001 for October 1, 2025. If you leave it empty, the actor defaults to yesterday's date. |
| Does this cover all EU countries? | Yes. TED publishes notices from all EU member states, plus EEA countries and Switzerland when their contracts meet the EU thresholds. |
| Can I get historical data? | Yes. Set the publicationDate to any past date and increase maxItems to collect that day's notices. Run it for a range of dates to build a historical archive. |
| What export formats are supported? | Your dataset can be downloaded as CSV, JSON, Excel, or XML from the Apify platform. |
| Is this the same as the TED API? | This actor reads the public web interface, not the official TED API. It requires no registration and returns the same notice content in a flat, analysis-ready format. |

### Related actors

Browse the full [ParseForge collection](https://apify.com/parseforge?fpr=vmoqkp) for more scrapers.

🆘 **Need help?** Email parseforge@protonmail.com with your run ID, your input, and what you expected.

⚠️ **Disclaimer.** This Actor is unofficial and is not affiliated with, endorsed by, or sponsored by Publications Office of the European Union. It collects only publicly available data. You are responsible for using the collected data in compliance with the source's terms of service and applicable data-protection laws, including GDPR, CCPA, and PIPL. Do not use it to collect personal data unlawfully.

# Actor input Schema

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

Maximum number of tenders to collect per run.

## `publicationDate` (type: `string`):

Single date YYYYMMDD (e.g. 20251001). Defaults to yesterday.

## Actor input object example

```json
{
  "maxItems": 10
}
```

# Actor output Schema

## `results` (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 = {
    "maxItems": 10
};

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

# Run the Actor and wait for it to finish
run = client.actor("parseforge/european-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 '{
  "maxItems": 10
}' |
apify call parseforge/european-ted-tenders-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/european-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/LCoS4L4iaDSfpKSMZ/builds/PhKpMnz1xRA550yVR/openapi.json
