# UK & EU Public Tenders: Find a Tender, Contracts Finder, TED (`kingkiller2164/uk-eu-public-tenders`) Actor

Bid teams spend every morning checking three government websites for tenders worth chasing. This Actor reads all three official sources, UK Find a Tender, Contracts Finder and EU TED, and returns one clean list: buyer, deadline, value, category, link. Schedule it, and it reports only what is new.

- **URL**: https://apify.com/kingkiller2164/uk-eu-public-tenders.md
- **Developed by:** [Rishabh Arora](https://apify.com/kingkiller2164) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## UK & EU Public Tenders: Find a Tender, Contracts Finder and TED in one feed

Get open public-sector tenders from the UK and the EU as clean, structured
data: title, buyer, deadline, estimated value, CPV codes and a link to the
official notice. Three official sources share one schema. You can filter by
keyword, CPV code, country, value and date. **Monitoring mode** returns only
notices you haven't seen before, so a daily schedule becomes a daily tender
alert.

### Who it's for

- **Bid and sales teams** who check tender portals every morning and want one
  list instead of three websites.
- **Consultants and analysts** tracking public demand in a sector such as IT,
  construction, health or energy.
- **Automations and AI agents** that need tenders as JSON: send them to Google
  Sheets, Slack, n8n, Make or Zapier through Apify integrations, or call the
  Actor from an agent over Apify's MCP server.

### Sources

| Source | What it covers | Volume we measured (Nov 2026) |
|---|---|---|
| UK Find a Tender (`uk-fts`) | UK above-threshold procurement, including Procurement Act 2023 tender notices | about 100 new tender notices in 3 days |
| UK Contracts Finder (`uk-cf`) | Lower-value public contracts in England | a few a day |
| EU TED (`eu-ted`) | Tenders Electronic Daily, the EU's official procurement journal | about 2,000 opportunity notices per weekday |

All three are official open-data APIs, so there is no scraping of web pages
and nothing breaks when a site's layout changes.

### Sample output

Real records returned on 2026-11-09:

| Published | Deadline | Source | Title | Buyer | Value | CPV |
|---|---|---|---|---|---|---|
| 2026-11-09 | 2026-12-10 | `uk-fts` | [Integrated Community Care Service for SCI Patients](https://www.find-tender.service.gov.uk/Notice/105988-2026) | MERSEY AND WEST LANCASHIRE TEACHING HOS… | 760,000 GBP | 85100000 |
| 2026-11-06 | 2026-12-04 | `uk-cf` | [Theatre Royal Plymouth - Multi-disciplinary Engineering Team Services](https://www.contractsfinder.service.gov.uk/Notice/1bd10227-ca24-4db1-9a27-0152448ac0e8) | Theatre Royal Plymouth | 950,000 GBP | 71310000 |
| 2026-11-09 | 2026-12-14 | `eu-ted` | [France – Address plates – 26MC0370AOO - FOURNITURE DE PLAQUES DE RUES…](https://ted.europa.eu/en/notice/-/detail/775173-2026) | Toulouse Métropole | 220,000 EUR | 44423460 |

Each result also includes `description`, `titleOriginal` (TED's original
language), `procedure`, `category`, `status`, `rawNoticeType`, `ocid`,
`licence`, `attribution` and `fetchedAt`. The **Output** tab lists every field.

### How to use it

**Default run (`{}`):** the newest 100 open notices from all three sources,
published in the last 3 days.

**IT services in Germany and France worth at least €100,000:**

```json
{ "sources": ["eu-ted"], "countries": ["DEU", "FRA"], "cpvPrefixes": ["72"], "minValue": 100000 }
```

**Daily UK construction alert.** Save this as a task and add a daily schedule:

```json
{ "sources": ["uk-fts", "uk-cf"], "cpvPrefixes": ["45"], "publishedWithinDays": 2, "onlyNew": true, "monitorName": "uk-construction" }
```

**Keyword search across everything:**

```json
{ "keywords": ["cyber security", "penetration testing"], "publishedWithinDays": 7 }
```

### Input

| Field | What it does | Default |
|---|---|---|
| `sources` | Any of `uk-fts`, `uk-cf`, `eu-ted` | all three |
| `keywords` | Keep notices that mention any keyword. UK: title and description. TED: full notice text, via TED's own search. | none |
| `cpvPrefixes` | CPV code prefixes, e.g. `72` (IT services) or `45` (construction) | none |
| `countries` | Buyer country, ISO 3-letter codes such as `GBR`, `DEU`, `FRA` | all |
| `publishedWithinDays` | How far back to look, 1–30 days | 3 |
| `openOnly` | Drop notices whose deadline has passed | true |
| `minValue` | Drop notices with a known estimated value below this number. Unknown values are kept, and currencies are not converted. | none |
| `maxItems` | Maximum results per run, shared fairly across the selected sources, so TED's volume can't crowd out the UK | 100 |
| `onlyNew` | Monitoring mode: return only notices not returned by earlier runs | false |
| `monitorName` | Keeps separate monitors apart (letters, digits, hyphens) | `default` |

### Pricing

Pay per result: **$2.00 per 1,000 notices** ($0.002 each). There is no start
fee, and you pay only for notices returned. A daily alert that returns about
20 new notices a day costs about **$1.20 a month**.

### Monitoring mode

With `onlyNew: true`, the Actor remembers the notices it has returned, in a
named key-value store called `uk-eu-tenders-<monitorName>` in your account.
Later runs skip those notices. The first run returns everything in the
window, and after that you get only what's new. Use a different
`monitorName` for each saved search, so that two alerts never hide each
other's notices. A run that finds nothing new succeeds with the status
message "No new notices since the last run."

### FAQ

**Can I reuse this data commercially?** UK notices are published under the
Open Government Licence v3.0. TED notices may be reused for commercial or
non-commercial purposes under Commission Decision 2011/833/EU. Both require
attribution, so every result carries a `licence` and an `attribution` field.

**Why are there no contact names or email addresses?** Notices name
individual officials. This Actor outputs organisation-level data only, and it
replaces any email address found in a description with `[email removed]`.
Contact details for bidders are on the official notice behind `url`.

**Why are TED dates plain dates and UK dates timestamps?** That's how each
source publishes them. `publishedAt` and `deadlineAt` start with `YYYY-MM-DD`
in both cases, so they sort and filter the same way.

**Why can a UK run take a few minutes?** Find a Tender rate-limits API
clients. When it answers "too many requests", the Actor waits the time the
server asks for, which is about two minutes, and then continues. You aren't
charged for waiting.

**Does `minValue` convert currencies?** No. It compares the published number,
whether that's GBP, EUR, PLN or something else. Pair it with `countries` when
the currency matters.

**A source was down. Do I lose the run?** No. The other sources still return
their results, and the run's status message names the source that was
unavailable. The run fails only if every selected source fails.

**Something missing or wrong?** Open an issue on the Issues tab.

### Changelog

- **0.1** (November 2026): first release, covering UK Find a Tender, UK
  Contracts Finder and EU TED, plus monitoring mode.

# Actor input Schema

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

Which tender sources to query. Defaults to all three.

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

Only return notices matching any of these words. UK notices match on title and description; TED matches on the full notice text. Leave empty for no keyword filter.

## `cpvPrefixes` (type: `array`):

Only return notices with a CPV code starting with one of these digit prefixes, for example 72 for IT services or 4512 for site preparation.

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

ISO 3166-1 alpha-3 buyer country codes such as GBR or DEU. If set without GBR, the UK sources are skipped.

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

Only return notices published in the last N days (1 to 30).

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

Skip notices whose submission deadline has already passed. Notices with no stated deadline are kept.

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

Skip notices with a known estimated value below this amount. Currencies are not converted, and notices with no stated value are kept.

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

Maximum number of notices to return (1 to 5000). Each returned notice is one billable event.

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

Return only notices not returned by earlier runs that use the same monitor name. Schedule the Actor and each run delivers just the new notices.

## `monitorName` (type: `string`):

Name of the monitoring list used when monitoring mode is on. Use different names to keep separate lists of seen notices.

## Actor input object example

```json
{
  "sources": [
    "uk-fts",
    "uk-cf",
    "eu-ted"
  ],
  "keywords": [],
  "cpvPrefixes": [],
  "countries": [],
  "publishedWithinDays": 3,
  "openOnly": true,
  "maxItems": 100,
  "onlyNew": false,
  "monitorName": "default"
}
```

# Actor output Schema

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

All notices returned by this run.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("kingkiller2164/uk-eu-public-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("kingkiller2164/uk-eu-public-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 '{}' |
apify call kingkiller2164/uk-eu-public-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,kingkiller2164/uk-eu-public-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/58YwEnvG4FhDFit33/builds/nhKCNjVfkO2tb5Kfe/openapi.json
