# EU Tenders (TED): Public Procurement Notices & Contract Awards (`tidelane/ted-tenders`) Actor

Search all EU public tenders on TED (Tenders Electronic Daily) by keywords, country, CPV code, notice type and date: open calls with deadline and submission link, contract awards with winner and value. 'Only new' mode for daily tender alerts. Official TED API, no key.

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

## Pricing

from $0.56 / 1,000 notices

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

## EU Tenders (TED): Public Procurement Notices & Contract Awards

Search **all EU public tenders** published on **TED (Tenders Electronic Daily)**, the official journal for public procurement in the European Union: more than 700,000 notices a year from the EU, EEA and partner countries.

- **Calls for tenders** with deadline, estimated value, CPV codes, place of performance and the link to the tender documents and submission portal
- **Contract awards** with the **winning companies**, their country, the awarded value and the contract date
- **Prior information notices**, corrections and contract modifications

Filter by **keywords, buyer country, CPV code, notice type, publication date, minimum value** and **only open calls**. With **Only new** and a daily schedule the Actor becomes a **tender alert**: each run returns only the notices it has not returned before.

- ✅ **Official TED API**: no key, no login, no scraping of web pages
- ✅ **One flat record per notice**, ready for Excel, Google Sheets, a CRM or a database
- ✅ **Titles in your language**: TED translates notice titles into all 24 EU languages
- ✅ **Fast**: 300 notices in about 5 seconds
- ✅ **Expert queries** for everything else TED can search
- ✅ **Fair billing**: per returned notice

### Use cases

- **Sales teams and bid managers**: a daily list of new calls in your sector and countries, before your competitors see them
- **Market research**: who wins public contracts in your market, at what prices
- **Consultants and tender services**: monitor many clients' CPV codes with one schedule
- **Journalists and researchers**: public spending by authority, country or sector

### Input examples

Open IT calls for tenders in Germany and Austria, titles in German:

```json
{
    "keywords": ["software development", "cloud"],
    "countries": ["DE", "AT"],
    "noticeTypes": ["competition"],
    "publishedWithinDays": 14,
    "onlyOpen": true,
    "language": "de"
}
```

Contract awards for IT services (CPV 72000000 and all sub-codes) above 100,000 in the last 30 days:

```json
{
    "cpvCodes": ["72000000"],
    "noticeTypes": ["result"],
    "publishedWithinDays": 30,
    "minValue": 100000
}
```

Daily tender alert (schedule the Actor once a day):

```json
{
    "keywords": ["photovoltaic", "solar park"],
    "noticeTypes": ["competition"],
    "publishedWithinDays": 3,
    "onlyNew": true
}
```

**Expert query**: anything in `expertQuery` is added with AND, in TED's expert search syntax, for example `procedure-type=open` or `buyer-legal-type=la` (local authorities).

### Output examples

Real output from a test run (description shortened). A call for tenders:

```json
{
    "publicationNumber": "686412-2026",
    "formType": "competition",
    "noticeType": "cn-standard",
    "publicationDate": "2026-10-06",
    "title": "Deutschland – Softwarepaket und Informationssysteme – Citrix 2027",
    "procedureTitle": "Citrix 2027",
    "description": "Es ist beabsichtigt, die bereits vorhandenen On-Premise-Lizenzen (Kauflizenzen, Perpetual Licenses) in zeitlich befristete Nutzungsrechte …",
    "buyerNames": ["Max Planck Information and Technology (MaxIT)"],
    "buyerCountry": "DEU",
    "buyerCity": "München",
    "contractNature": ["supplies"],
    "procedureType": "open",
    "cpvCodes": ["48000000"],
    "placeOfPerformanceCountries": ["DEU"],
    "deadline": "2026-11-03T12:00:00+01:00",
    "estimatedValue": null,
    "submissionUrl": "https://www.tender24.de",
    "documentsUrl": "https://www.tender24.de/NetServer/TenderingProcedureDetails?function=_Details&TenderOID=…",
    "noticeUrl": "https://ted.europa.eu/de/notice/-/detail/686412-2026",
    "pdfUrl": "https://ted.europa.eu/de/notice/686412-2026/pdf"
}
```

A contract award:

```json
{
    "publicationNumber": "646456-2026",
    "formType": "result",
    "noticeType": "can-standard",
    "publicationDate": "2026-09-21",
    "title": "France – System maintenance services – PRESTATIONS DE MAINTENANCE DU SITE INTERNET DU MUSEE NATIONAL PICASSO-PARIS",
    "buyerNames": ["Musée National Picasso-Paris"],
    "buyerCountry": "FRA",
    "buyerCity": "Paris",
    "procedureType": "open",
    "cpvCodes": ["50324100", "72000000", "72400000"],
    "awardedValue": 160000,
    "awardedValueCurrency": "EUR",
    "winners": ["DVTL communication"],
    "winnerCountries": ["FRA"],
    "contractConclusionDate": "2026-09-15",
    "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/646456-2026"
}
```

A summary (the TED query used, total matches, notices read and returned, notices skipped as already seen) is saved as `OUTPUT` in the key-value store.

### Pricing

A fixed price per returned notice. Filters like "only open calls" and "min value" run before billing: you pay only for notices you get.

Paid Apify plans pay less: 10% off on Starter, 20% on Scale and 30% on Business and higher plans.

### FAQ

**Which countries are covered?** All notices published on TED: the 27 EU member states plus EEA countries, Switzerland and others that publish there. Contracts below the EU thresholds are often published only in national portals and are not on TED.

**What is a CPV code?** The Common Procurement Vocabulary classifies what is bought, for example 72000000 (IT services), 45000000 (construction work) or 79000000 (business services). A code also finds all its sub-codes.

**Why are some values empty?** Buyers do not always publish an estimated value, and some awards are published without the amount. The Actor returns what the notice contains.

**How does "Only new" work?** The Actor remembers the returned notices per search in the key-value store `ted-tenders-monitor-state` and skips them next time. Change the search and it starts fresh.

**Are personal data included?** No. Contact persons, e-mail addresses and phone numbers of buyers are not returned; e-mail addresses inside notice texts are removed.

### More tools from Tidelane Data

- [UK Companies House Search](https://apify.com/tidelane/uk-companies-house-search): companies by SIC code, postcode or town
- [SEC EDGAR](https://apify.com/tidelane/sec-edgar): filings, financial statements and full-text search
- [Research Papers](https://apify.com/tidelane/research-papers): search PubMed, arXiv and Crossref at once
- [RSS Feed Reader](https://apify.com/tidelane/rss-feed-reader): news, blogs and podcasts to JSON

All our tools: [apify.com/tidelane](https://apify.com/tidelane)

***

#### Impressum

Levi Griesinger, Tidelane Data\
Besigheimer Straße 18\
74369, Löchgau, Deutschland\
E-Mail: LeviGriesinger@gmail.com

# Actor input Schema

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

Full-text search in all notice texts; a notice matches if it contains any of these (phrases allowed).

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

Country of the contracting authority, as DE / DEU, FR / FRA, AT ... Empty means all.

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

Common Procurement Vocabulary codes; a code also finds its sub-codes (72000000 = all IT services).

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

Competition: open calls for tenders. Result: contract awards with winner and value. Planning: prior information notices. Empty means all.

## `publishedWithinDays` (type: `integer`):

Shortcut for 'Published from'. Use 1 or 2 with a daily schedule.

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

Publication date on TED, from (overrides 'last N days').

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

Publication date on TED, until.

## `onlyOpen` (type: `boolean`):

Keep notices whose deadline for tenders or requests to participate has not passed.

## `minValue` (type: `integer`):

Keep notices with an awarded or estimated value of at least this amount (in the notice currency). Notices without a value are dropped when set.

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

TED translates notice titles into all EU languages. Descriptions stay in the original language.

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

Extra TED expert search condition added with AND, for example procedure-type=open or buyer-legal-type=la.

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

Stop after this many notices.

## `onlyNew` (type: `boolean`):

For tender alerts with a schedule: remembers returned notices per search (key-value store 'ted-tenders-monitor-state') and returns only new ones.

## Actor input object example

```json
{
  "keywords": [
    "software development"
  ],
  "countries": [
    "DE",
    "AT"
  ],
  "publishedWithinDays": 14,
  "onlyOpen": false,
  "language": "en",
  "maxResults": 500,
  "onlyNew": false
}
```

# Actor output Schema

## `results` (type: `string`):

All results of the run as dataset items.

## `summary` (type: `string`):

Summary per input with status (ok, error and the reason).

# 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"
    ],
    "countries": [
        "DE",
        "AT"
    ],
    "publishedWithinDays": 14
};

// Run the Actor and wait for it to finish
const run = await client.actor("tidelane/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 development"],
    "countries": [
        "DE",
        "AT",
    ],
    "publishedWithinDays": 14,
}

# Run the Actor and wait for it to finish
run = client.actor("tidelane/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 development"
  ],
  "countries": [
    "DE",
    "AT"
  ],
  "publishedWithinDays": 14
}' |
apify call tidelane/ted-tenders --silent --output-dataset

```

## MCP server setup

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