# EU & UK Public Tenders — TED + Find a Tender (`nefes-tools/eu-tenders`) Actor

New public tenders from the EU (TED, 30+ countries) and the UK (Find a Tender) in one clean table. Filter by country, CPV code, keyword and value; get only new notices on each run for daily alerts. Official APIs, pay per notice.

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

## Pricing

from $5.00 / 1,000 tender notices

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

## EU & UK Public Tenders — TED + Find a Tender

**Get new government tenders from 30+ European countries and the UK in one clean table.** Filter by country,
CPV code, keyword and contract value. Turn on "Only new since the last run", schedule it daily, and you get a
ready-made tender alert. You only pay for notices you actually receive.

| What you get per tender | Example |
|---|---|
| Title and short description | *Case handling system*, *Hydropower plant modernisation* |
| Buyer, city, country, website | Nordre Follo kommune, Ski, NO |
| Estimated value and currency | 34 500 000 EUR |
| Deadline for bids | 2026-11-03 |
| CPV codes, contract type, procedure | 72000000 · services · open |
| Links | official notice, PDF, bid portal, tender documents |

### Who uses it

- **Companies that sell to the public sector.** IT, construction, consulting, healthcare and facility services
  get every new tender in their field each morning, not only the ones a paid portal happens to show.
- **Bid consultants and agencies.** One run covers all their clients' sectors and countries.
- **Market analysts.** Contract awards with values show who buys what and at what price.
- **AI agents and automations.** Output is flat JSON with stable fields for CRMs, Slack, Google Sheets,
  Make or Zapier.

### Sources

| Source | Coverage | Access |
|---|---|---|
| **EU TED** (Tenders Electronic Daily) | All EU member states plus Norway, Switzerland, Iceland and other countries publishing on TED: about 3 000 notices per working day | official TED Search API |
| **UK Find a Tender** | UK public procurement under the Procurement Act 2023 | official OCDS API (Open Government Licence) |

Both are official, public, no-login APIs. The Actor does not scrape web pages or get around any protection.

### How to use it

1. Enter **keywords** (any match), **countries** (2-letter codes) and/or **CPV codes**. Parent CPV codes include
   all children, so `72` means all IT services.
2. Choose how far back to look (default: last 3 days) and what to fetch: **open tenders** (default),
   **planning** notices (upcoming tenders) or **contract awards**.
3. Run it. For alerts, turn on **Only new since the last run** and add a daily **Schedule** in Apify.
   Each run then returns only notices you have not received yet. You can connect it to e-mail, Slack or a
   webhook with Apify integrations.

#### Example input

```json
{
    "keywords": ["software", "cloud", "Software", "logiciel"],
    "countries": ["DE", "FR", "GB"],
    "cpvCodes": ["72000000", "48000000"],
    "noticeTypes": ["tender"],
    "daysBack": 3,
    "minValue": 100000,
    "onlyNew": true,
    "maxResults": 200
}
```

#### Example output

```json
{
    "source": "TED",
    "noticeId": "646374-2026",
    "noticeType": "tender",
    "title": "Inovácia a modernizácia Vodnej elektrárne Čunovo",
    "buyerName": "Vodohospodárska výstavba, š.p.",
    "buyerCountry": "SK",
    "cpvMain": "45251120",
    "contractType": "works",
    "procedureType": "open",
    "value": 34500000,
    "currency": "EUR",
    "publishedAt": "2026-09-21",
    "deadline": "2026-11-03",
    "placeOfPerformance": ["SK010"],
    "submissionUrl": "https://evo.isepvo.sk//evoportal/sk-sk/Public/OrderSearch/Detail?id=563823",
    "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/646374-2026",
    "pdfUrl": "https://ted.europa.eu/en/notice/646374-2026/pdf"
}
```

### Pricing

**Pay per notice: $5 per 1 000 notices ($0.005 each)**, plus a tiny Actor start fee. Nothing else: no proxy,
browser or subscription costs.

- You pay only for notices written to the results. Filtered-out notices, duplicates and notices you already got
  (with *Only new*) are free.
- **Max notices** and Apify's *maximum cost per run* cap your spend. The Actor stops cleanly at the limit.
- A typical daily alert (one sector, a few countries) returns 5–50 notices, which costs $0.03–0.25 a day.

### Good to know

- **Language:** TED notices are written in the buyer's language. Titles and descriptions come in your preferred
  language when the buyer supplied a translation (often English), otherwise in the original. Keywords are
  matched against the full text in all languages, so add local terms for better recall
  (e.g. *Software*, *logiciel*, *informatica*).
- **Values** are the buyer's estimate for tenders and the awarded amount for awards. Many buyers publish no
  value; use *Keep notices without a stated value* to include or skip those.
- **Privacy:** only data about the procurement and the buying organisation. Named contact persons, e-mail
  addresses and phone numbers are not collected and are removed from description texts. Winning bidders' names
  are not included.
- **Rate limits:** UK Find a Tender limits request rates. The Actor pauses between pages and waits when asked,
  so long date ranges take a few minutes.
- The `SUMMARY` record in the key-value store shows notices per source, which filters were applied and why
  the run stopped.

### FAQ

**How fresh is the data?** Every run queries the official APIs live. TED publishes on working days, UK notices
appear continuously.

**Can I get older notices?** Yes. Set *Published from* / *Published to* (up to a year per run is practical).

**Something is wrong or missing?** Open an issue on the Actor page. Fixes are usually quick.

# Actor input Schema

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

Match any of these words or phrases in the notice (full text). Notices are written in the buyer's language, so add local terms too (e.g. "software", "Software", "logiciel"). Leave empty for all notices.

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

Buyer countries as 2-letter codes (DE, FR, CZ, GB…). Leave empty for all of Europe. GB is served from UK Find a Tender, all other countries from EU TED.

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

Common Procurement Vocabulary codes. Parent codes include all children: "72000000" (or just "72") = all IT services. Leave empty for all sectors.

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

Tenders = open calls you can bid on. Planning = prior information notices (upcoming tenders). Awards = contract award notices with the awarded value.

## `daysBack` (type: `integer`):

How far back to look. 0 = today only. Ignored when "Published from" is set.

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

Optional start date (YYYY-MM-DD). Overrides "last N days".

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

Optional end date (YYYY-MM-DD), inclusive.

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

Only notices with an estimated (or awarded) value of at least this amount, in the notice currency (mostly EUR or GBP).

## `includeWithoutValue` (type: `boolean`):

Many buyers do not publish a value. When a minimum value is set, keep those notices anyway?

## `openOnly` (type: `boolean`):

Skip tenders whose submission deadline has already passed.

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

Remember delivered notices and return only new ones next time (per combination of filters). Ideal for a daily schedule: you pay only for notices you have not seen.

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

Stop after this many notices (each notice is one charged result).

## `sources` (type: `array`):

EU TED (EU/EEA member states and more) and UK Find a Tender.

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

Language for titles and descriptions from TED when a translation exists (2-letter code). Falls back to English, then the original.

## Actor input object example

```json
{
  "keywords": [
    "software",
    "cloud"
  ],
  "countries": [
    "DE",
    "FR",
    "GB"
  ],
  "noticeTypes": [
    "tender"
  ],
  "daysBack": 3,
  "includeWithoutValue": true,
  "openOnly": true,
  "onlyNew": false,
  "maxResults": 200,
  "sources": [
    "ted",
    "uk"
  ],
  "language": "en"
}
```

# Actor output Schema

## `tenders` (type: `string`):

One row per notice: title, buyer, country, value, deadline, CPV codes and links to the official notice and bid portal.

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

Notices per source, why the run stopped and the filters used.

# 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",
        "cloud"
    ],
    "countries": [
        "DE",
        "FR",
        "GB"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("nefes-tools/eu-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",
        "cloud",
    ],
    "countries": [
        "DE",
        "FR",
        "GB",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("nefes-tools/eu-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",
    "cloud"
  ],
  "countries": [
    "DE",
    "FR",
    "GB"
  ]
}' |
apify call nefes-tools/eu-tenders --silent --output-dataset

```

## MCP server setup

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