# EU TED Tenders Scraper – Public Procurement & Tender Alerts (`wantmannu/eu-ted-tenders`) Actor

EU tenders on TED with daily tender alerts for EU public procurement: calls for tenders, contract awards and RFPs from the official TED API. Filter by keyword, CPV code, country, value and deadline. English summaries. $0.004 per notice.

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

## Pricing

Pay per event

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?

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

### TED Tenders Scraper: EU public procurement and tender alerts

**Who it's for:** companies that bid for public contracts in Europe (IT, consulting, construction, medical, facilities and more), bid managers, tender-alert resellers and market analysts.

**What you get:** **EU tenders** published on TED: calls for tenders, contract awards and other **EU public procurement** notices from **TED (Tenders Electronic Daily)**, the official EU journal where every above-threshold public tender in the EU, EEA and partner countries is published. Each notice becomes a clean, **English-first** row with buyer, country, CPV code and label, **estimated or awarded value in EUR**, **tender deadline**, winners, and links to the notice, PDF, documents and e-submission. An optional **one-line English summary** tells you in a sentence what is being bought. Schedule it daily with **delta mode** for **tender alerts** that cost **$4 per 1,000 notices**.

Data comes from the official, open **TED Search API**, with no browser and no login.

### Quick start

1. Click **Try for free**. Defaults are a **cheap sample** (keyword `software`, contract notices, last 7 days, one-line English summary on, **10 results ≈ $0.04**). No fields are required — just click **Start**.
2. Narrow it down with **CPV codes** (e.g. `72` = all IT services), **keywords**, **countries**, **notice type** ("Contract notice" for open calls you can bid on) and **minimum value in EUR**. Raise **Max results** for bigger pulls.
3. Tick **Only open tenders** to keep notices whose deadline hasn't passed. Summary is already on by default (free).
4. Click **Start**, then export to Excel, CSV or JSON, or push rows to Google Sheets, Slack or your CRM.
5. For a daily alert, turn on **Delta mode** and add a **schedule**.

Sample input (about **$0.04** — same as the Try defaults):

```json
{
  "keywords": ["software"],
  "noticeTypes": ["competition"],
  "addSummary": true,
  "maxResults": 10
}
```

### Why this TED scraper?

- 🌍 **Readable in English.** Original titles are kept, and you also get TED's English headline, the English CPV label and (opt-in) a summary like *"Call for tenders: VĮ Registrų centras (PV) (Lithuania) is buying software programming and consultancy services (CPV 72200000): "Įgaliojimų registro priežiūros ir vystymo paslaugos" \[LT], est. €364.8K, open procedure. Deadline 16 Nov 2026."*
- 💶 **One value filter across currencies.** PLN, SEK, DKK, CZK and other amounts are converted to EUR with ECB reference rates.
- 🎯 **Precise filters.** Hierarchical CPV codes, keywords in any language, buyer country, notice type, raw eForms type, value range, deadline and TED expert queries.
- 🔔 **Delta mode.** Scheduled runs return only notices you haven't received, so you pay once per notice.
- 🏆 **Competitor intelligence.** Award notices include winners, their countries and awarded totals.
- 🔗 **Everything to bid.** Links to the official notice, PDF, eForms XML, procurement documents and e-submission portal.
- ⚡ **Fast and cheap to run.** Up to 250 notices per API call, and most runs finish in seconds.

### What data do you get?

| Field | Description |
|---|---|
| `title`, `titleLanguage`, `titleTranslated` | Original title, its language, TED's headline in your language |
| `noticeCategory`, `noticeCategoryLabel`, `eformsNoticeType` | Call for tenders, prior information, award, VEAT, modification… |
| `buyerName`, `buyerCity`, `buyerCountry`, `buyerWebsite`, `buyerType` | Contracting authority |
| `mainCpvCode`, `cpvCodes`, `cpvTitle`, `contractNature` | What is bought (works, supplies, services) |
| `procedureTypeLabel`, `lotCount`, `isFrameworkAgreement` | Procedure details |
| `totalValue`, `currency`, `totalValueEur`, `valueType` | Estimated or awarded value |
| `publicationDate`, `tenderDeadline`, `participationRequestDeadline` | Key dates |
| `winners`, `winnerCountries` | Winning tenderers (award notices) |
| `placeOfPerformanceNuts`, `placeOfPerformanceCountries`, `placeOfPerformanceCity` | Where the work happens |
| `noticeUrl`, `pdfUrl`, `xmlUrl`, `documentsUrl`, `submissionUrl` | Official links |
| `description` | Short description (original language) |
| `summary` *(opt-in)* | One-line English summary |

### Example run

Open IT tenders (CPV `72`) that you can still bid on, with one-line English summaries. This is the exact input from a fresh run on the Apify platform on 18 October 2026 (run `4EQ3BFtL8hR1NhZi0`):

```json
{
  "cpvCodes": [
    "72"
  ],
  "noticeTypes": [
    "competition"
  ],
  "onlyOpenTenders": true,
  "addSummary": true,
  "maxResults": 5
}
```

Output excerpt: the first 2 rows, selected fields only:

```json
[
  {
    "noticeId": "718446-2026",
    "publicationDate": "2026-10-16",
    "tenderDeadline": "2026-10-22",
    "buyerName": "Deutsche Rentenversicherung Rheinland",
    "buyerCountry": "Germany",
    "mainCpvCode": "72000000",
    "cpvTitle": "IT services: consulting, software development, Internet and support",
    "title": "Vergabe von Dienstleistungen für Hosting, Betrieb und Content-Erstellung des Internetportals www.Ihre-Vorsorge.de",
    "titleLanguage": "de",
    "procedureTypeLabel": "Open",
    "totalValueEur": null,
    "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/718446-2026",
    "summary": "Call for tenders: Deutsche Rentenversicherung Rheinland (Germany) is buying IT services: consulting, software development, Internet and support (CPV 72000000): \"Vergabe von Dienstleistungen für Hosting, Betrieb und Content-Erstellung des…\" [DE], open procedure. Deadline 22 Oct 2026."
  },
  {
    "noticeId": "718585-2026",
    "publicationDate": "2026-10-16",
    "tenderDeadline": "2026-11-16",
    "buyerName": "VĮ Registrų centras (PV)",
    "buyerCountry": "Lithuania",
    "mainCpvCode": "72200000",
    "cpvTitle": "Software programming and consultancy services",
    "title": "Įgaliojimų registro priežiūros ir vystymo paslaugos",
    "titleLanguage": "lt",
    "procedureTypeLabel": "Open",
    "totalValueEur": 364800,
    "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/718585-2026",
    "summary": "Call for tenders: VĮ Registrų centras (PV) (Lithuania) is buying software programming and consultancy services (CPV 72200000): \"Įgaliojimų registro priežiūros ir vystymo paslaugos\" [LT], est. €364.8K, open procedure. Deadline 16 Nov 2026."
  }
]
```

The run made 1 TED request and took about 1 second. It was charged 5 × $0.004 for notices plus the $0.00005 start fee, about **2 cents**.

### Sample output

These are real rows from a run on 17 October 2026 (`cpvCodes: ["72"]`, open calls for tenders, summaries on; selected fields, a full record has about 45):

```json
[
  {
    "noticeId": "718585-2026",
    "noticeCategoryLabel": "Contract notice (call for tenders)",
    "title": "Įgaliojimų registro priežiūros ir vystymo paslaugos",
    "titleLanguage": "lt",
    "buyerName": "VĮ Registrų centras (PV)",
    "buyerCountry": "Lithuania",
    "buyerCity": "Vilnius",
    "mainCpvCode": "72200000",
    "cpvTitle": "Software programming and consultancy services",
    "procedureTypeLabel": "Open",
    "totalValue": 364800,
    "currency": "EUR",
    "totalValueEur": 364800,
    "publicationDate": "2026-10-16",
    "tenderDeadline": "2026-11-16",
    "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/718585-2026",
    "summary": "Call for tenders: VĮ Registrų centras (PV) (Lithuania) is buying software programming and consultancy services (CPV 72200000): \"Įgaliojimų registro priežiūros ir vystymo paslaugos\" [LT], est. €364.8K, open procedure. Deadline 16 Nov 2026."
  },
  {
    "noticeId": "718509-2026",
    "noticeCategoryLabel": "Contract notice (call for tenders)",
    "title": "Zakup i dostawa subskrypcji na platformę automatyzacji wraz z subskrypcjami na roboty nienadzorowane i nadzorowane oraz narzędzia do wytwarzania i zarządzania farmą robotów on-premise",
    "titleLanguage": "pl",
    "buyerName": "Zakład Ubezpieczeń Społecznych",
    "buyerCountry": "Poland",
    "buyerCity": "Warszawa",
    "mainCpvCode": "48000000",
    "cpvTitle": "Software package and information systems",
    "procedureTypeLabel": "Open",
    "totalValue": null,
    "currency": null,
    "totalValueEur": null,
    "publicationDate": "2026-10-16",
    "tenderDeadline": "2026-10-22",
    "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/718509-2026",
    "summary": "Call for tenders: Zakład Ubezpieczeń Społecznych (Poland) is buying software package and information systems (CPV 48000000): \"Zakup i dostawa subskrypcji na platformę automatyzacji wraz z subskrypcjami na roboty…\" [PL], open procedure. Deadline 22 Oct 2026."
  }
]
```

Award notices also carry `winners`. For example, from the same day: *"Contract awarded: JUDETUL VRANCEA(CONSILIUL JUDETEAN) (Romania) awarded bridge construction work (CPV 45221110) … awarded value €5.9M, open procedure, 2 lots. Winners: CRISTILORY PROD; S.C. TROIA PREMIUM CONSTRUCT S.R.L.; S.C. VALLYS DECO S.R.L."*

### How much does it cost?

Pay per result, with no subscription:

- **$0.004 per notice saved**, which is **$4 per 1,000 notices**.
- Plus Apify's tiny Actor start fee (about $0.00005 per run). Platform compute is included.
- Notices removed by the value filter, or skipped by delta mode, are free.
- The summary option costs nothing extra.

| Use case | Typical cost |
|---|---|
| Default sample (`maxResults: 10`) | about $0.04 |
| Larger pull with `maxResults: 100` | $0.40 |
| Daily alert whose filters match about 20 new notices a day | about $2.40 a month (20 × 30 × $0.004) |
| One-off market study of 5,000 award notices | $20 |

Apify's free plan includes $5 of monthly usage, enough for about 1,250 notices a month. Cap spending with **Max results** or Apify's maximum cost per run.

### Integrations

- **Export** to Excel, CSV, JSON, XML or HTML.
- **Google Sheets, Slack, email, Airtable, HubSpot** through Apify integrations, **Make**, **Zapier** or **n8n**.
- **Webhooks** when a run finishes.
- **API** and JavaScript/Python clients (see the **API** tab).
- **AI agents** through the Apify MCP server, for example "find open cybersecurity tenders in Poland over €200K".

### Tips

- TED publishes Monday to Friday. A daily morning schedule with delta mode catches every new notice.
- CPV matching is hierarchical: `45` covers all construction work and `72` covers all IT services.
- Many notices publish no value, so a minimum value filter drops them. Leave it empty for maximum coverage.
- Use **Contract award notice** with your competitors' CPV codes to see who wins and at what price.

### FAQ

#### What is TED?

Tenders Electronic Daily is the online version of the Supplement to the Official Journal of the EU. Public buyers must publish tenders above EU thresholds there, so it covers most large public contracts in the EU and EEA.

#### Is it legal to reuse TED data?

Yes. Under the European Commission's reuse policy, procurement notices published in the Supplement to the Official Journal **can be freely reused for commercial or non-commercial purposes**. TED's editorial content is licensed under CC BY 4.0, which requires credit and an indication of changes. Every row carries a `source` attribution stating that the data comes from TED (© European Union) and has been normalised. Only notices published in the Official Journal are authentic, so always check the official notice before you bid. This Actor is not affiliated with or endorsed by the Publications Office of the EU, and it does not use the TED logo.

#### How does it respect TED fair use?

It calls only the official public Search API, fetches up to 250 notices per request and by default makes at most 2 requests per second, far below TED's 700 requests per minute fair-use limit. It backs off politely on rate-limit errors.

#### Are the EUR values exact?

No. They are converted with the latest ECB euro reference rates. `totalValue` and `currency` always keep the original amount. For calls for tenders the value is the buyer's estimate; for award notices it's the awarded total (`valueType`).

#### Is the summary written by AI?

No. It is assembled from the notice's own fields (notice type, buyer, CPV label, value, procedure, deadline, winners) by fixed rules, so it is instant, free and cannot hallucinate. Original-language titles are quoted with their language code.

#### Why did I get 0 results?

Filters combine with AND. Widen the date window, remove the value filter or use a broader CPV prefix. In delta mode, notices you already received are skipped.

#### Personal data

TED notices are official records about organisations. This Actor does not request contact persons, emails or phone numbers. Your results could still contain personal data, for example a sole trader named as a winner. Personal data is protected by the GDPR in the EU and by other laws worldwide. Don't process it without a legitimate reason; if unsure, consult a lawyer.

#### Support

Missing a field or filter? Open an issue in the **Issues** tab. Replies usually come within a day.

# Changelog

This Actor's version history is a separate document: https://apify.com/wantmannu/eu-ted-tenders/changelog.md

# Actor input Schema

## `keywords` (type: `array`):

Full-text keywords or phrases searched in all notice text and all languages (any keyword matches). Example: "cybersecurity", "road maintenance". Leave empty to get all notices.

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

Common Procurement Vocabulary codes. Matching is hierarchical: "72000000" (IT services) also matches every sub-code like 72212000. Short prefixes like "72" or "4521" are accepted and padded with zeros.

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

Country of the contracting authority as ISO codes, e.g. "DE", "FR", "PL" (2- or 3-letter, "UK"/"EL" also accepted). Leave empty for all EU/EEA countries.

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

Which kinds of notices to return. Pick "Contract notice" for open calls for tenders you can bid on, "Contract award notice" for winners and prices. Empty = all types.

## `minValueEur` (type: `integer`):

Only notices whose total estimated (or awarded) value, converted to EUR with ECB reference rates, is at least this amount. Notices without a published value are excluded when a value filter is set.

## `maxValueEur` (type: `integer`):

Only notices whose total value in EUR is at most this amount.

## `deadlineAfter` (type: `string`):

Only notices with a tender submission deadline on or after this date (YYYY-MM-DD).

## `onlyOpenTenders` (type: `boolean`):

Shortcut: only notices whose tender submission deadline is today or later.

## `lastNDays` (type: `integer`):

Publication window ending on "Published to" (default today). Ignored if "Published from" is set.

## `dateFrom` (type: `string`):

Start of the publication date range (YYYY-MM-DD). Overrides "Last N days".

## `dateTo` (type: `string`):

End of the publication date range (YYYY-MM-DD). Defaults to today.

## `language` (type: `string`):

Language for the translated headline, CPV label and TED links. Titles and descriptions are returned in this language when the buyer published one, otherwise in the original language.

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

Maximum number of notices to save (and be charged for) in this run. Default 10 is a cheap sample; raise it for bigger pulls.

## `addSummary` (type: `boolean`):

Adds a "summary" field in English, e.g. "Call for tenders: Carlow County Council (Ireland) is buying archaeological services (CPV 71351914): "N80 Leagh Bends Scheme…", est. €830K, open procedure. Deadline 20 Nov 2026." Built from the notice by fixed rules, not an AI model: free, instant and never invents facts. Original-language titles are quoted with their language code.

## `deltaMode` (type: `boolean`):

Remember delivered notices and skip them in later runs with the same filters. Ideal for scheduled daily tender alerts.

## `deltaStoreName` (type: `string`):

Named key-value store used to remember delivered notices. Use different names to keep independent alert feeds.

## `eformsNoticeTypes` (type: `array`):

Raw TED eForms notice-type codes, e.g. "cn-standard", "cn-social", "can-standard", "pin-only", "veat", "can-modif".

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

Optional TED expert-search expression added with AND, e.g. procedure-type IN (open). See the TED expert search help. Do not include SORT BY.

## `maxRequestsPerSecond` (type: `integer`):

Politeness limit toward the TED API (fair use allows 700 requests/minute; each request returns up to 250 notices).

## Actor input object example

```json
{
  "keywords": [
    "software"
  ],
  "noticeTypes": [
    "competition"
  ],
  "onlyOpenTenders": false,
  "lastNDays": 7,
  "language": "en",
  "maxResults": 10,
  "addSummary": true,
  "deltaMode": false,
  "deltaStoreName": "eu-ted-tenders-delta",
  "maxRequestsPerSecond": 2
}
```

# Actor output Schema

## `dataset` (type: `string`):

Dataset with one row per matching TED notice

## `runSummary` (type: `string`):

Query used, notices scanned, filtered and returned

# 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"
    ],
    "noticeTypes": [
        "competition"
    ],
    "lastNDays": 7,
    "maxResults": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("wantmannu/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 = {
    "keywords": ["software"],
    "noticeTypes": ["competition"],
    "lastNDays": 7,
    "maxResults": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("wantmannu/eu-ted-tenders").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 '{
  "keywords": [
    "software"
  ],
  "noticeTypes": [
    "competition"
  ],
  "lastNDays": 7,
  "maxResults": 10
}' |
apify call wantmannu/eu-ted-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,wantmannu/eu-ted-tenders"
        }
    }
}
```

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/FpkReSgzi7RZw5Nr3/builds/b1MfBddlAM5TXJn6n/openapi.json
