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

Get new public procurement notices from UK Find a Tender, UK Contracts Finder and EU TED in one table. Filter by date, keyword, CPV code and estimated value. Each row has the buyer, deadline, value, CPV codes and the official link.

- **URL**: https://apify.com/onescriptfix/uk-eu-public-tenders.md
- **Developed by:** [One Script Fix](https://apify.com/onescriptfix) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

## UK & EU Public Tenders - Find a Tender, Contracts Finder, TED

Pull new public procurement notices from three official sources in one run: the UK's Find a Tender service, UK
Contracts Finder and the EU's Tenders Electronic Daily (TED). Filter by date, keyword, CPV code and estimated value,
and get one clean table with the buyer, notice type, deadline, value, CPV codes and a link to the official notice.

Built for bid teams, consultants and sales teams who want a daily list of tenders in their field without checking three
portals by hand. Data comes from each service's public API at the time you run it.

### Quick start

```json
{
  "keywords": ["software", "cyber security"],
  "publishedFrom": "2026-09-01",
  "maxResults": 500
}
```

Leave `keywords` empty to get everything published in the date range. With no dates, the run covers the last seven
days.

### Input

| Field | Default | What it does |
| --- | --- | --- |
| `sources` | all three | Any of `find-tender`, `contracts-finder` and `ted`. |
| `keywords` | empty | Keep notices whose title, description or buyer contains any of these phrases. |
| `publishedFrom` | 7 days ago | First publication date to include (`YYYY-MM-DD`, UTC). |
| `publishedTo` | today | Last publication date to include. |
| `cpvCodes` | empty | Keep notices with a matching CPV code. A prefix works too: `72` covers all IT services. |
| `minimumValue` | `0` | Keep notices with an estimated value at or above this amount. Needs `valueCurrency`. |
| `valueCurrency` | empty | Three-letter currency for `minimumValue`, such as `GBP` or `EUR`. There is no conversion. |
| `maxResults` | `100` | Stop after this many notices (up to 10,000). |

Filters run before anything is saved, so you only pay for the notices you keep.

### Output

One row per notice. Example from TED (long text shortened here):

```json
{
  "recordType": "notice",
  "source": "ted",
  "noticeId": "670714-2026",
  "title": "Romania – Medical equipments – Furnizare echipamente medicale pentru tratarea pacienților critici cardiaci …",
  "buyerName": "JUDETUL CARAS-SEVERIN",
  "buyerCountry": "ROU",
  "noticeType": "cn-standard",
  "publishedAt": "2026-09-30",
  "deadline": "2026-10-15T12:00:00Z",
  "estimatedValue": 3243807.59,
  "currency": "RON",
  "cpvCodes": ["33100000", "79632000"],
  "procedureType": "open",
  "officialUrl": "https://ted.europa.eu/en/notice/-/detail/670714-2026",
  "licenseUrl": "https://ted.europa.eu/en/legal-notice"
}
```

Rows also carry the full `description`, the source's own IDs (`sourceId`, `ocid`), every published deadline, the raw
deadline text and an `attribution` line.

A few things to know:

- Each row is a notice. One procurement can have several notices over time (the call for tender, changes, the award),
  and UK notices above the threshold often appear in both Find a Tender and Contracts Finder with different IDs.
- `estimatedValue` is the estimate published in the notice. Award amounts are not mixed in, and nothing is guessed, so
  many rows have no value.
- Country codes are kept as each source writes them (Find a Tender uses `GB`, TED uses three letters such as `ROU`).
- TED publication dates are day-only, so `publishedAt` has no time for TED rows.
- Contact-point fields are left out, and email addresses and phone numbers inside the text are masked.

### Pricing

$3.00 per 1,000 notices on the Free plan, $2.70 on Starter, $2.30 on Scale and $1.90 on Business. Filtered-out
notices and duplicates are free, and there is no start fee.

### FAQ

**How fresh is the data?** Each run reads the official APIs live, so new notices show up as soon as the source
publishes them.

**Can I run it every morning?** Yes. Schedule it in Apify with `publishedFrom` left empty, or set it to yesterday, and
send the results to Google Sheets, Slack or email with an integration.

**Do you cover Australia or the US?** Not yet. Only the three sources above.

**Can I reuse the data?** UK notices are published under the Open Government Licence v3.0, and each UK row carries the
required attribution. TED notices can be reused under the EU's legal notice for TED. This actor is not affiliated with
the UK government or the Publications Office of the EU.

### Responsible use

The actor uses only the documented public APIs, sends one request at a time, honours `Retry-After` and stops when a
source refuses access.

# Actor input Schema

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

Official adapters, queried serially in round-robin order.

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

Match ANY phrase, case insensitive, in normalized title, description or buyer. Applied before saving.

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

Inclusive UTC date, YYYY-MM-DD. Defaults to seven days ago.

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

Inclusive UTC date, YYYY-MM-DD. Defaults to today.

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

Match ANY 2-8 digit prefix or full CPV code. Applied locally across all sources.

## `minimumValue` (type: `number`):

Inclusive numeric threshold. Requires valueCurrency when positive; unknown estimates are excluded. No currency conversion.

## `valueCurrency` (type: `string`):

Optional three-letter currency filter, required for a positive minimumValue.

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

Global unique matching notice cap across sources.

## `pageSize` (type: `integer`):

Maximum upstream page size. Sources share the remaining result budget.

## `requestDelaySeconds` (type: `number`):

Minimum seconds between serial requests, including retries.

## `maxPages` (type: `integer`):

Safety bound on source pages scanned. Filters can result in fewer saved items.

## Actor input object example

```json
{
  "sources": [
    "find-tender",
    "contracts-finder",
    "ted"
  ],
  "keywords": [],
  "cpvCodes": [],
  "minimumValue": 0,
  "maxResults": 100,
  "pageSize": 50,
  "requestDelaySeconds": 1.2,
  "maxPages": 100
}
```

# Actor output Schema

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

No description

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

// Run the Actor and wait for it to finish
const run = await client.actor("onescriptfix/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("onescriptfix/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 onescriptfix/uk-eu-public-tenders --silent --output-dataset

```

## MCP server setup

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