# TED Tender Scraper · EU Public Procurement (`siccscha/ted-tender-scraper`) Actor

Search, filter and monitor EU public tenders from TED via the official API — no scraping. Clean JSON per notice: buyer, country, CPV codes, deadlines, values, links. Schedule it as a daily tender-alert engine; works as an MCP tool for AI agents. No start fee — pay per notice.

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

## Pricing

$4.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

## TED Tender Scraper — EU procurement monitoring & tender alerts

Search, filter, and monitor **EU public tenders from TED (Tenders Electronic Daily)** — the official journal where every European public contract above the EU thresholds must be published. This Actor uses the **official TED API** (no fragile scraping) and returns clean, analysis-ready JSON: buyer, country, CPV codes, submission deadline, estimated value, and direct links to the notice. Run it once to search, or schedule it as a tender-alert engine.

Around **2,500+ new notices are published every working day**. Use this Actor to find open competitions in your industry, track awarded contracts, or run it on a schedule as a tender-alert engine for your team or your clients.

### What data do you get?

| Field | Example |
|---|---|
| `publicationNumber` | `487530-2026` |
| `title` (English) | Germany – Software package and information systems – Rahmenvereinbarung SaaS |
| `originalTitle` | Rahmenvereinbarung SaaS für sicheren Datenaustausch |
| `buyerName` | Land Niedersachsen — IT.Niedersachsen |
| `buyerCountry` | `DEU` |
| `publicationDate` / `deadlineDate` | `2026-07-15` / `2026-07-21` |
| `cpvCodes` | `["48000000", "48210000"]` |
| `contractNature` | `["services"]` |
| `noticeType` | `cn-standard` |
| `estimatedValue` + `currency` | `170000` `EUR` |
| `description` | Beschaffung von Cloud-Leistungen zum sicheren Datenaustausch |
| `noticeUrl` / `pdfUrl` / `xmlUrl` | direct TED links |

### How to find EU tenders in 3 steps

1. **Set your filters** — keywords (full-text, any language), CPV codes (wildcards like `72*` work), buyer countries, and whether you want open competitions, awarded contracts, or prior information notices.
2. **Run the Actor** — it queries the official TED Search API and pushes every matching notice to the dataset.
3. **Export or integrate** — download as JSON/CSV/Excel, or connect the dataset to Make, Zapier, Google Sheets, or your own code via the Apify API.

### Use it as a tender alert service

Schedule the Actor (e.g. every morning with `lookbackDays: 1` and your keywords/CPV codes) and pipe new items to Slack or email with an Apify integration. You get a daily digest of every new tender in your niche — the same functionality commercial tender-alert services charge hundreds of euros per month for.

### Example input

```json
{
    "keywords": "cloud computing, artificial intelligence",
    "cpvCodes": ["72*"],
    "buyerCountries": ["DEU", "AUT", "NLD"],
    "noticeGroup": "competition",
    "onlyOpenDeadlines": true,
    "lookbackDays": 7,
    "maxItems": 100
}
```

Power users can pass a raw TED expert query instead (`expertQuery`) — the same syntax as the expert search on ted.europa.eu, including `SORT BY`.

### Example output

```json
{
    "publicationNumber": "487530-2026",
    "title": "Germany – Software package and information systems – Rahmenvereinbarung SaaS für sicheren Datenaustausch",
    "buyerName": "Land Niedersachsen vertreten durch IT.Niedersachsen",
    "buyerCountry": "DEU",
    "publicationDate": "2026-07-15",
    "deadlineDate": "2026-07-21",
    "cpvCodes": ["48000000", "48100000", "48200000", "48210000"],
    "contractNature": ["supplies"],
    "noticeType": "cn-standard",
    "estimatedValue": null,
    "currency": null,
    "description": "Beschaffung von Cloud-Leistungen zum sicheren Datenaustausch",
    "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/487530-2026",
    "pdfUrl": "https://ted.europa.eu/en/notice/487530-2026/pdf",
    "xmlUrl": "https://ted.europa.eu/en/notice/487530-2026/xml"
}
```

### FAQ

**Is it legal to scrape TED?**
Yes — this Actor doesn't even scrape. It uses the official, publicly documented TED API. TED data is EU open data: reuse (including commercial reuse) is explicitly permitted, and notice metadata is dedicated under CC0. See TED's [data reuse policy](https://ted.europa.eu/en/help/data-reuse).

**Which notices are covered?**
Everything published on TED: contract notices (competitions), contract award notices (results), and prior information notices (planning) from all EU institutions and member states, plus EEA and other participating countries — in all 24 official EU languages, with English titles normalized for you.

**What are CPV codes?**
The Common Procurement Vocabulary — the EU's classification for procurement. `72*` = IT services, `45*` = construction, `85*` = health services. Filter with full codes or wildcards.

**How current is the data?**
Live. The Actor queries the TED API at run time; new notices appear as soon as TED publishes them (typically each working day, 9:00 CET).

**Can AI agents use this?**
Yes — the Actor works as an MCP tool via Apify's MCP server, so agents can search EU tenders programmatically (e.g. "find open AI tenders in Germany closing this month").

### Why this one and not a TED scraper

- **Official API, not HTML scraping.** TED's search API is the documented, supported interface. A
  scraper breaks the next time the portal is redesigned; this doesn't. The notice metadata is EU
  open data, so there is no grey area about reuse either.
- **Built for the monitoring case, not the one-off pull.** `lookbackDays`, keyword and CPV filters
  and open-deadline filtering exist so a scheduled run returns *only what is new and relevant* —
  which is what makes a daily alert usable rather than noise.
- **Expert query passthrough.** If you already know TED's query language, put it in `expertQuery`
  and the Actor gets out of your way.

### Use with AI agents (MCP)

This Actor is available as a tool through the [Apify MCP server](https://mcp.apify.com), so agents
in Claude, ChatGPT or any MCP client can search EU procurement data mid-conversation. Prompts that
map onto this Actor:

- *"Find open IT tenders in Germany and Austria closing in the next 30 days."*
- *"Which public buyers awarded cloud contracts above €1M last quarter?"*
- *"Monitor CPV 72* in the Netherlands and summarize anything new since yesterday."\*

Filters are plain fields (keywords, CPV wildcards, countries, deadlines), so an agent can construct
a precise query without knowing TED's expert-search syntax — and `maxItems` keeps its spend bounded.

### Pricing

**$0.004 per notice returned**, nothing else — no start fee. Filter tightly and set `maxItems` to
control costs: a daily monitoring run with tight CPV filters typically returns a handful of notices
and costs a couple of cents a month.

### More from this publisher

- **[SEO Audit + AI Visibility](https://apify.com/siccscha/seo-health-auditor)** — technical SEO
  audit plus the check whether AI systems can cite your site.
- **[Core Web Vitals Auditor](https://apify.com/siccscha/core-web-vitals-auditor)** — bulk
  Lighthouse for a list of URLs.
- **[E-Invoice Parser](https://apify.com/siccscha/e-invoice-parser)** — XRechnung, ZUGFeRD/Factur-X
  and UBL e-invoices to clean, validated JSON.

# Actor input Schema

## `keywords` (type: `string`):

Full-text search across notice content. Separate multiple terms or phrases with commas — a notice matches if it contains ANY of them (e.g. <code>cloud computing, data centre</code>). Leave empty to match all notices.

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

Filter by Common Procurement Vocabulary codes. Wildcards supported: <code>72\*</code> matches all IT services. Find codes at <a href='https://ted.europa.eu/en/browse-by/cpv' target='_blank'>ted.europa.eu</a>.

## `buyerCountries` (type: `array`):

ISO 3166-1 alpha-3 country codes of the buying organisation, e.g. <code>DEU</code>, <code>FRA</code>, <code>NLD</code>, <code>SWE</code>. Empty = all countries.

## `noticeGroup` (type: `string`):

Which stage of the procurement lifecycle to return.

## `onlyOpenDeadlines` (type: `boolean`):

Skip notices whose submission deadline has already passed.

## `lookbackDays` (type: `integer`):

How far back to search, counted from today. Use small values (1–3) for scheduled monitoring runs.

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

Stop after this many notices. You are only charged for notices actually returned.

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

Raw TED expert-search query. When set, it REPLACES all filters above except 'Maximum notices'. Same syntax as the expert search on ted.europa.eu, e.g. <code>classification-cpv IN (72\*) AND organisation-country-buyer IN (DEU) SORT BY publication-date DESC</code>.

## Actor input object example

```json
{
  "keywords": "software development",
  "noticeGroup": "competition",
  "onlyOpenDeadlines": false,
  "lookbackDays": 7,
  "maxItems": 100
}
```

# Actor output Schema

## `notices` (type: `string`):

One item per TED notice: buyer, country, CPV codes, publication and submission deadline, estimated value, contract nature, plus links to the notice, its PDF and its XML.

## `overview` (type: `string`):

The columns a bid manager scans: notice number, title, buyer, deadline, value, link.

## `runInConsole` (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 = {
    "keywords": "software development"
};

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

# Run the Actor and wait for it to finish
run = client.actor("siccscha/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 '{
  "keywords": "software development"
}' |
apify call siccscha/ted-tender-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

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