# UK Public Tenders: Find a Tender + Contracts Finder (`frenchdatalab/uk-public-tenders`) Actor

Every UK public contract opportunity and award from the official Find a Tender and Contracts Finder services, merged and deduplicated: keywords, CPV codes, buyer, location, value, deadline, SME suitability. Daily monitoring of new notices. Open Government Licence.

- **URL**: https://apify.com/frenchdatalab/uk-public-tenders.md
- **Developed by:** [French Data lab](https://apify.com/frenchdatalab) (community)
- **Categories:** Lead generation, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 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.

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 Public Tenders: Find a Tender + Contracts Finder

Every **UK public sector contract opportunity and award** from the two official services, **Find a Tender** (all UK, high-value and Procurement Act 2023 notices) and **Contracts Finder** (England, lower-value contracts), merged into one clean, deduplicated list.

Filter by **keywords, CPV codes, buyer, location, value, deadline and SME suitability**, or schedule it to receive **only the new notices** every morning. Official data, Open Government Licence.

### What can you do with it?

- 🎯 **Find contracts to bid for**: *"open IT and software tenders in London"*, *"cleaning or catering contracts over £100,000"*, *"NHS tenders suitable for SMEs"*.
- 🔔 **Daily alerts**: schedule a run every morning with `onlyNewSinceLastRun` and get only what you have not seen yet.
- 🕵️ **Competitor intelligence**: award notices with **who won and for how much**.
- 📅 **Pipeline**: planning notices announce procurements before they open.

### Why this Actor?

| | This Actor | Typical UK tender scrapers |
|---|---|---|
| Both official services in one run, one row per procedure | ✅ Find a Tender + Contracts Finder, copies merged (`alsoPublishedOn`) | ⚠️ one service |
| Procurement Act 2023 notices (UK4…) | ✅ all of them: the services' own stage filter misses most of them (32 of 373 tenders in a test week), so stages are sorted here | ❌ most new-regime tenders missing |
| Reliable | ✅ follows the services' rate limit (12 requests/min) and waits when asked: no failed runs | ⚠️ frequent failures (HTTP 429) |
| Open tenders only | ✅ passed deadlines, cancelled and closed tenders removed | ❌ |
| Locations by name | ✅ "London", "North West", "Scotland", towns, postcode areas | ⚠️ codes only |
| Clean fields | ✅ plain-text descriptions, value, deadline, CPV codes and labels, buyer contact, winners | ⚠️ raw OCDS JSON |

### Input

| Field | Description | Example |
|---|---|---|
| `keywords` | At least one word in the title or description | `["software", "cyber security"]` |
| `cpvCodes` | CPV codes or prefixes | `["72", "48"]` |
| `stages` | `tender` (open), `planning` (upcoming), `award` (who won) | `["tender"]` |
| `publishedWithinDays` / `publishedSince` | Publication period (default 7 days, up to a year) | `30` |
| `locations` | Regions, towns or postcode areas | `["London"]` |
| `buyers` | Part of the buyer's name | `["NHS"]` |
| `minValue` / `maxValue` | Contract value in GBP | `100000` |
| `openOnly` | Skip passed deadlines and closed tenders (default `true`) | `true` |
| `smeSuitableOnly` | Only notices flagged as suitable for SMEs | `false` |
| `sources` | `FTS`, `CF` (default both) | `["FTS", "CF"]` |
| `onlyNewSinceLastRun` | Monitoring mode | `true` |
| `maxResults` | Maximum notices (newest first) | `200` |

### Output

Real example (shortened):

```json
{
    "source": "Find a Tender",
    "noticeId": "093572-2026",
    "url": "https://www.find-tender.service.gov.uk/Notice/093572-2026",
    "stage": "tender",
    "title": "Football Delivery Partner - Redcar and Cleveland College",
    "status": "active",
    "cpvCodes": ["80000000"],
    "cpvDescriptions": ["Education and training services"],
    "mainCategory": "services",
    "procurementMethodDetails": "Below threshold - open competition",
    "value": 75000,
    "currency": "GBP",
    "publishedDate": "2026-10-02 19:02",
    "deadline": "2026-10-16 12:00",
    "contractStart": "2026-11-01 00:00",
    "contractEnd": "2029-10-31 23:59",
    "smeSuitable": true,
    "buyerName": "The Education Training Collective",
    "buyerTown": "Thornaby",
    "buyerPostcode": "TS176FB",
    "buyerRegion": "North East",
    "deliveryRegionNames": ["North East"]
}
```

Other fields: `ocid`, `noticeTypes`, `description` (plain text), `procurementMethod`, `aboveThreshold`, `valueMin`, `enquiryDeadline`, `vcseSuitable`, `lots`, `buyerAddress`, `buyerContactName`, `buyerContactEmail`, `buyerContactPhone`, `buyerWebsite`, `deliveryRegions` (ITL codes), `suppliers` and `awardValue` / `awardDate` (award notices), `documents` (links), `alsoPublishedOn`.

A `SUMMARY` record gives the counts by source, stage and buyer, and how many notices were skipped by each filter.

### Notes

- Find a Tender and Contracts Finder allow 12 requests per minute: a 7-day search takes 2–3 minutes, a 30-day search about 10 minutes. When a service asks to wait, the Actor waits instead of failing.
- Several notices of the same procedure (notice, updates, award) are reduced to one row: the latest complete one, with every notice type seen in `noticeTypes`.
- Contact details are those published by the buyers for suppliers' questions about the procurement.

### Pricing

You only pay for the results returned. No subscription.

| Results | Price |
|---|---|
| 1 notice | $0.004 |
| 100 notices | $0.40 |
| 1,000 notices | $4.00 |

A start fee of a fraction of a cent applies per run. Set a **maximum cost per run** and the Actor stops exactly at your budget.

### Use it in your tools

- **No code**: run it from the Apify Console, download the results as Excel, CSV or JSON, and **schedule** it (daily, weekly…).
- **Integrations**: send the results to Google Sheets, Slack, email, webhooks, Make, Zapier or n8n with Apify's integrations.
- **API**: start runs and read the results with the Apify API or the official Python and JavaScript clients.
- **AI agents**: assistants and agents that support MCP can call this Actor as a tool through Apify's MCP server (mcp.apify.com).

### Related Actors

- [Public Tenders Monitor: TED (EU) + BOAMP (France)](https://apify.com/frenchdatalab/eu-france-public-tenders): EU (TED) and French (BOAMP) public tenders, with alerts
- [USAspending Federal Awards: Contract & Grant Winners](https://apify.com/frenchdatalab/usaspending-federal-awards): Who wins US federal contracts and grants (USAspending)
- [UK Company Financials: Companies House Accounts](https://apify.com/frenchdatalab/uk-company-financials): UK companies' latest accounts: employees, net assets, cash, debts

### Source & licence

Find a Tender and Contracts Finder (UK Government). Contains public sector information licensed under the **Open Government Licence v3.0**. This Actor is independent and not affiliated with or endorsed by the UK Government.

# Actor input Schema

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

Notices containing at least one of these words in the title or description, e.g. "software", "cleaning", "cyber security". Leave empty for all.

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

Codes or prefixes: "72" (IT services), "48" (software), "45" (construction), "79" (business services), "85" (health), "90" (cleaning & environment).

## `stages` (type: `array`):

Tender = open opportunities to bid for. Planning = upcoming procurements (market engagement). Award = contracts awarded, with suppliers and values (competitor intelligence).

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

Default 7. Up to 366. Longer periods take longer (the services allow 12 requests per minute).

## `publishedSince` (type: `string`):

YYYY-MM-DD (instead of the number of days).

## `locations` (type: `array`):

Regions ("London", "North West", "Scotland", "Wales"…), towns ("Manchester") or postcode areas ("M1", "EC2").

## `buyers` (type: `array`):

Part of the buyer's name, e.g. "NHS", "Council", "Ministry of Defence".

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

Notices without a published value are excluded when a minimum is set.

## `maxValue` (type: `integer`):

Notices above this value are excluded.

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

Skip tenders whose deadline has passed or that were cancelled or closed.

## `smeSuitableOnly` (type: `boolean`):

Only notices the buyer flags as suitable for small and medium enterprises.

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

Find a Tender (all UK, high-value and Procurement Act 2023 notices) and Contracts Finder (England, lower-value contracts). Notices published on both appear once.

## `onlyNewSinceLastRun` (type: `boolean`):

Monitoring: schedule the Actor (e.g. every morning) and receive only the notices you have not received yet.

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

Maximum number of notices returned (newest first).

## Actor input object example

```json
{
  "stages": [
    "tender"
  ],
  "publishedWithinDays": 7,
  "openOnly": true,
  "smeSuitableOnly": false,
  "sources": [
    "FTS",
    "CF"
  ],
  "onlyNewSinceLastRun": false,
  "maxResults": 50
}
```

# Actor output Schema

## `notices` (type: `string`):

No description

## `summary` (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 = {
    "maxResults": 50
};

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

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

```

## MCP server setup

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