# TED Tenders Scraper (`anyxsolutions/ted-tenders-scraper`) Actor

Scrape EU public procurement notices from TED (Tenders Electronic Daily): calls for tender, awards and planned purchases by keyword, country, CPV code, notice type and date, with buyers, estimated values, deadlines, lots, winners and award values. Official EU data. No API key, no login.

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

## Pricing

from $1.50 / 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

![banner](https://anyx.solutions/banners/ted-tenders-scraper.png)

## TED Tenders Scraper

**Every EU public tender, contract award and planned purchase published on TED — with buyers, CPV codes, estimated values, deadlines, lots and winners — as clean JSON.**

TED (Tenders Electronic Daily) is the official journal of European public procurement: every
public contract above the EU thresholds, from all 27 member states, the EEA and beyond, is
published there. This Actor scrapes TED by keyword, buyer country, CPV code, notice type and
publication date, from any ted.europa.eu search or notice URL, or from an expert query. Each
notice comes back with its title in English or its original language, description, notice type,
buyer (name, country, city, type and website), CPV codes and the main CPV category in English,
procedure type, contract nature (works, supplies or services), estimated value and currency, the
deadline for tenders or requests to participate, every lot with its value, the place of
performance, and for award notices the winning suppliers and the value awarded, plus links to the
English notice page, PDF, XML and the buyer's tender documents. Turn on **Open for bids only** to
keep notices you can still bid on. No API key, no login and no proxy. Built for bid and tender
teams, sales teams selling to the public sector, procurement consultants, market analysts, and
anyone tracking who buys what across Europe.

### ⚡ Quick start

```json
{
  "startUrls": [
    {
      "url": "https://ted.europa.eu/en/search/result?FT=software&buyer-country=DEU&notice-type=cn-standard&search-scope=ACTIVE"
    }
  ],
  "searchTerms": ["artificial intelligence"],
  "maxItems": 5
}
```

### 🧩 Input

| Field                | Type    | Required | Default                      | Description                                                                                                                                                                                                                                                         |
| -------------------- | ------- | -------- | ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`          | array   | no       | —                            | ted.europa.eu pages: a search results page (`https://ted.europa.eu/en/search/result?FT=software&buyer-country=DEU&search-scope=ACTIVE`) or a notice page (`https://ted.europa.eu/en/notice/-/detail/674450-2026`), in any language.                                 |
| `searchTerms`        | array   | no       | —                            | Words to find anywhere in a notice, one search per line, such as `artificial intelligence` or `cybersecurity`. Quote a phrase for an exact match (`"school buses"`).                                                                                                |
| `rawQuery`           | string  | no       | —                            | A search in TED's expert query syntax, such as `classification-cpv=72000000 AND buyer-country=DEU AND procedure-type=open`. Copy it from the expert search on ted.europa.eu.                                                                                        |
| `countries`          | array   | no       | —                            | Only return notices from buyers in these countries, as three-letter ISO codes such as `DEU`, `FRA`, `ITA` or `POL`. Two-letter codes such as `DE` also work.                                                                                                        |
| `cpvCodes`           | array   | no       | —                            | Only return notices for these CPV codes. A code covers every code below it: `72000000` (IT services), `45000000` (construction work), `33100000` (medical equipment), `90900000` (cleaning services).                                                               |
| `noticeTypes`        | array   | no       | —                            | Only return these kinds of notice: `competition` (calls for tender), `planning` (prior information), `result` (contract awards), `directAward` (voluntary ex-ante transparency), `modification`, `completion` or `consultation` (preliminary market consultations). |
| `publishedFrom`      | string  | no       | —                            | Only return notices published on or after this date (`YYYY-MM-DD`).                                                                                                                                                                                                 |
| `publishedTo`        | string  | no       | —                            | Only return notices published on or before this date (`YYYY-MM-DD`).                                                                                                                                                                                                |
| `activeOnly`         | boolean | no       | `false`                      | Open for bids only: only return notices whose deadline for tenders or requests to participate is today or later.                                                                                                                                                    |
| `maxItems`           | integer | no       | —                            | Maximum number of notices per URL, search term or expert query. The input form starts at 5; leave it empty for every matching notice.                                                                                                                               |
| `proxyConfiguration` | object  | no       | `{ "useApifyProxy": false }` | Proxy settings. TED needs no proxy.                                                                                                                                                                                                                                 |

Add TED URLs, search terms, an expert query, or any mix. The country, CPV, notice-type, date and
open-for-bids filters apply to all of them except notice URLs, which return that one notice. With
filters but no URL, search term or query, the filters alone make one search. The easiest way to
build a search is to run it on [ted.europa.eu](https://ted.europa.eu/en/search/result) and paste
the address bar. Results come newest first, unless an expert query sets its own `SORT BY`.

### 📤 Output

Each notice is one dataset row. TED publishes a new notice for every stage of a procurement, so a
call for tender, its corrections and its award are separate rows that share a `procedureId`.

#### Fields

| Field                    | Type   | Description                                                                                                      |
| ------------------------ | ------ | ---------------------------------------------------------------------------------------------------------------- |
| `publicationNumber`      | string | TED publication number, such as `705792-2026`.                                                                   |
| `url`                    | string | The notice's English page on ted.europa.eu.                                                                      |
| `title`                  | string | The procedure's title, in English when the buyer gave one, else in the original language.                        |
| `language`               | string | Language of `title` and `description`, as a three-letter code such as `deu` or `fra`.                            |
| `description`            | string | Description of the procedure.                                                                                    |
| `noticeType`             | string | Kind of notice, such as `Contract notice`, `Contract award notice` or `Prior information notice`.                |
| `noticeTypeCode`         | string | TED's notice-type code, such as `cn-standard` or `can-standard`.                                                 |
| `formType`               | string | Stage of the procurement: `planning`, `competition`, `result`, `dir-awa-pre`, `cont-modif` and so on.            |
| `publicationDate`        | string | Date published on TED (`YYYY-MM-DD`).                                                                            |
| `dispatchDate`           | string | Date the buyer sent the notice to TED.                                                                           |
| `buyer`                  | object | The buyer: `name`, `country` (three-letter code), `city`, `type` (such as `Local authority`) and `website`.      |
| `otherBuyers`            | array  | Names of other buyers in a joint procurement.                                                                    |
| `cpvCodes`               | array  | Every CPV code of the procedure and its lots.                                                                    |
| `mainCpvCode`            | string | The main CPV code.                                                                                               |
| `mainCpvDescription`     | string | The main CPV category in English, such as `IT services: consulting, software development, Internet and support`. |
| `procedureType`          | string | Procedure, such as `Open`, `Restricted` or `Negotiated with prior call for competition`.                         |
| `contractNature`         | string | `works`, `supplies` or `services`.                                                                               |
| `estimatedValue`         | number | Estimated value of the whole procedure, before tax.                                                              |
| `estimatedValueCurrency` | string | Currency of `estimatedValue`, such as `EUR`.                                                                     |
| `deadlineDate`           | string | The earliest deadline (`YYYY-MM-DD`): for tenders, else for requests to participate.                             |
| `deadlineDateTime`       | string | The same deadline with its time and UTC offset, such as `2026-11-12T10:30:00+01:00`.                             |
| `deadlineType`           | string | `tenders` or `requests to participate`.                                                                          |
| `lots`                   | array  | Each lot with `lotId`, `title`, `estimatedValue`, `awardedValue` and `currency`.                                 |
| `placeOfPerformance`     | object | Where the contract is performed: `countries`, `cities` and `regions` (NUTS codes such as `DE212`).               |
| `awardedSuppliers`       | array  | For awards: each winning supplier with `name`, `country`, `city` and `size` (`sme`, `large` and so on).          |
| `awardValue`             | number | For awards: the total value awarded.                                                                             |
| `awardCurrency`          | string | Currency of `awardValue`.                                                                                        |
| `awardDecisionDate`      | string | For awards: date the contract was awarded.                                                                       |
| `documentsUrl`           | string | The buyer's page with the tender documents.                                                                      |
| `submissionUrl`          | string | Where tenders are submitted.                                                                                     |
| `pdfUrl`                 | string | The notice as an English PDF.                                                                                    |
| `xmlUrl`                 | string | The notice's official XML.                                                                                       |
| `procedureId`            | string | Identifier of the procurement procedure, shared by all its notices.                                              |

<details><summary>Example output</summary>

```json
{
  "publicationNumber": "705792-2026",
  "url": "https://ted.europa.eu/en/notice/-/detail/705792-2026",
  "title": "A9_163,9-170,9_ERH_bRF_AS21a-22_E2_B, Bauoberleitung",
  "language": "deu",
  "description": "Bauoberleitung für die Erhaltungsmaßnahme A9, km 163,9 - 167,5 beider Richtungsfahrbahnen (RF)",
  "noticeType": "Contract notice",
  "noticeTypeCode": "cn-standard",
  "formType": "competition",
  "publicationDate": "2026-10-13",
  "dispatchDate": "2026-10-12",
  "buyer": {
    "name": "Die Autobahn GmbH des Bundes - NL Ost",
    "country": "DEU",
    "city": "Halle (Saale)",
    "type": "Public undertaking",
    "website": "https://www.autobahn.de"
  },
  "otherBuyers": [],
  "cpvCodes": ["71521000"],
  "mainCpvCode": "71521000",
  "mainCpvDescription": "Construction-site supervision services",
  "procedureType": "Open",
  "contractNature": "services",
  "estimatedValue": 109977.6,
  "estimatedValueCurrency": "EUR",
  "deadlineDate": "2026-11-12",
  "deadlineDateTime": "2026-11-12T10:30:00+01:00",
  "deadlineType": "tenders",
  "lots": [
    {
      "lotId": "LOT-0000",
      "title": "A9_163,9-170,9_ERH_bRF_AS21a-22_E2_B, Bauoberleitung",
      "estimatedValue": 109977.6,
      "awardedValue": null,
      "currency": "EUR"
    }
  ],
  "placeOfPerformance": {
    "countries": ["DEU"],
    "cities": ["Eisenberg"],
    "regions": ["DEG0J"]
  },
  "awardedSuppliers": [],
  "awardValue": null,
  "awardCurrency": null,
  "awardDecisionDate": null,
  "documentsUrl": "https://vergabe.autobahn.de/NetServer/TenderingProcedureDetails?function=_Details&TenderOID=54321-Tender-1a0a3ad2f0b-d580c516acea207",
  "submissionUrl": "https://vergabe.autobahn.de",
  "pdfUrl": "https://ted.europa.eu/en/notice/705792-2026/pdf",
  "xmlUrl": "https://ted.europa.eu/en/notice/705792-2026/xml",
  "procedureId": "4d5a2334-9af5-4420-81fd-0e6a92039e6d"
}
```

</details>

### 💡 Use cases

- **Bid pipeline** — collect every open call for tender in your CPV codes and countries each morning, with deadlines and links to the tender documents.
- **Public-sector sales intelligence** — find which ministries, cities and hospitals buy what you sell, and how much they budget.
- **Competitor tracking** — read contract award notices to see who wins which contracts, at what value, and from which buyers.
- **Market sizing** — total estimated and awarded values by country, sector and year.
- **Early warning** — follow prior information notices and preliminary market consultations to hear about purchases months before the call opens.
- **Procurement research** — build datasets of EU public spending for journalism, policy analysis or AI and NLP pipelines.

### ❓ FAQ

- **Do I need an API key or an account?** No. TED is public, and the Actor needs no key, login or proxy.
- **Which countries are covered?** Every notice published on TED: the 27 EU member states, the EEA, and other countries that publish there, such as Switzerland, Ukraine or Moldova.
- **Why is the title not in English?** Buyers write notices in their own language, and the title is returned as the buyer wrote it unless they also gave an English one. `language` tells you which language it is, and `mainCpvDescription` gives the category in English.
- **What is a CPV code?** The Common Procurement Vocabulary is the EU's classification of what is bought. Each notice carries at least one code, and a code covers everything below it: `72000000` (IT services) also finds `72260000` (software-related services).
- **Why are some values empty?** Buyers do not always publish an estimated value, and award notices may withhold the amount or the winner; those fields are `null`. Older notices carry fewer fields than current ones.
- **Does a search return every match?** Yes, page by page, until `maxItems` is reached. Very broad searches can be slow; narrow them with countries, CPV codes, notice types or dates.
- **Why did a run return fewer notices than expected?** The filters may be narrower than you think, or an expert query was rejected; the log says why. Open an issue if something looks off.

### 🔗 More scrapers by Anyx

- [USAspending Scraper](https://apify.com/anyxsolutions/usaspending-scraper)
- [Federal Register Scraper](https://apify.com/anyxsolutions/federal-register-scraper)
- [SEC EDGAR Scraper](https://apify.com/anyxsolutions/sec-edgar-scraper)
- [World Bank Data Scraper](https://apify.com/anyxsolutions/world-bank-data-scraper)

### 🤝 Anyx Solutions

We build custom scrapers and data-extraction pipelines.

- Email: tantosthor@gmail.com

### 🖼 Image credit

Image credit: [ted.europa.eu](https://ted.europa.eu/)

# Actor input Schema

## `startUrls` (type: `array`):

Public ted.europa.eu pages: a search results page (https://ted.europa.eu/en/search/result?FT=software\&buyer-country=DEU\&search-scope=ACTIVE) or a notice page (https://ted.europa.eu/en/notice/-/detail/674450-2026).

## `searchTerms` (type: `array`):

Words to find anywhere in a notice, one search per line, for example artificial intelligence, cybersecurity or "school buses" (quoted for an exact phrase).

## `rawQuery` (type: `string`):

A search in TED's expert query syntax, for power users, for example classification-cpv=72000000 AND buyer-country=DEU AND procedure-type=open. Copy it from the expert search on ted.europa.eu.

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

Only return notices from buyers in these countries, one per line, as three-letter ISO codes, for example DEU, FRA, ITA or POL. Two-letter codes such as DE also work. Leave empty for every country.

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

Only return notices for these Common Procurement Vocabulary codes, one per line. A code also covers every code below it, for example 72000000 (IT services), 45000000 (construction work), 33100000 (medical equipment) or 90900000 (cleaning services).

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

Only return these kinds of notice: open calls for tender, planned purchases, awarded contracts, direct awards, contract changes, completed contracts or market consultations. Leave empty for every kind.

## `publishedFrom` (type: `string`):

Only return notices published on or after this date, for example 2026-01-01.

## `publishedTo` (type: `string`):

Only return notices published on or before this date, for example 2026-06-30.

## `activeOnly` (type: `boolean`):

Only return notices whose deadline for tenders or requests to participate is today or later, so you can still bid.

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

Maximum number of notices to return per URL, search term or expert query. Leave empty for every matching notice.

## `proxyConfiguration` (type: `object`):

Proxy settings. TED is public and needs no proxy.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://ted.europa.eu/en/search/result?FT=software&buyer-country=DEU&notice-type=cn-standard&search-scope=ACTIVE"
    }
  ],
  "searchTerms": [
    "artificial intelligence"
  ],
  "activeOnly": false,
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (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 = {
    "startUrls": [
        {
            "url": "https://ted.europa.eu/en/search/result?FT=software&buyer-country=DEU&notice-type=cn-standard&search-scope=ACTIVE"
        }
    ],
    "searchTerms": [
        "artificial intelligence"
    ],
    "maxItems": 5
};

// Run the Actor and wait for it to finish
const run = await client.actor("anyxsolutions/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 = {
    "startUrls": [{ "url": "https://ted.europa.eu/en/search/result?FT=software&buyer-country=DEU&notice-type=cn-standard&search-scope=ACTIVE" }],
    "searchTerms": ["artificial intelligence"],
    "maxItems": 5,
}

# Run the Actor and wait for it to finish
run = client.actor("anyxsolutions/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 '{
  "startUrls": [
    {
      "url": "https://ted.europa.eu/en/search/result?FT=software&buyer-country=DEU&notice-type=cn-standard&search-scope=ACTIVE"
    }
  ],
  "searchTerms": [
    "artificial intelligence"
  ],
  "maxItems": 5
}' |
apify call anyxsolutions/ted-tenders-scraper --silent --output-dataset

```

## MCP server setup

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