# UK Public Tenders (Contracts Finder, Find a Tender) (`jadeite_geometry/uk-public-tenders`) Actor

UK government tender and contract notices from Contracts Finder and Find a Tender: title, buyer, value, CPV codes, deadline and notice link. For bid writers, consultancies and suppliers.

- **URL**: https://apify.com/jadeite_geometry/uk-public-tenders.md
- **Developed by:** [Niklesh Kumar](https://apify.com/jadeite_geometry) (community)
- **Categories:** Business, 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 $4.00 / 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.

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 (Contracts Finder, Find a Tender)

UK government tender and contract notices from Contracts Finder and Find a Tender (title, buyer, value, CPV codes, deadline, notice link), for bid writers, consultancies and suppliers.

### What does UK Public Tenders do?

UK councils, NHS bodies, universities and government departments must advertise the contracts they want to buy, and announce who won them, on two official government websites: Contracts Finder and Find a Tender. This Actor reads both websites through their open-data feeds and gives you one clean list, with the same fields whichever site a notice came from.

You can ask for open tenders to bid for, contract awards (who won and for how much), early planning notices, or all three. Narrow the list by keyword, CPV code (the standard product and service code), buyer name and contract value. It is built for bid writers, consultancies, suppliers and anyone who tracks public spending.

### What data does it return?

One row per notice.

| Field | Example | Meaning |
|---|---|---|
| `source` | `find-a-tender` | Which site the notice came from: `contracts-finder` or `find-a-tender`. |
| `noticeId` | `092822-2026` | The site's own ID for the notice. |
| `ocid` | `ocds-h6vhtk-077e95` | Open Contracting ID. Notices about the same procurement (tender, changes, award) share it. |
| `title` | `Cleaning Services Framework` | Notice title. |
| `descriptionSnippet` | `Contract cleaning services framework` | The first 500 characters of the description, with email addresses and phone numbers removed. |
| `buyer` | `DELTA ACADEMIES TRUST` | The organisation buying. |
| `stage` | `tender` | `planning`, `tender` or `award`. |
| `status` | `active` | Notice status as the site gives it, for example `active` or `complete`. |
| `isUpdate` | `false` | `true` when the notice changes or updates an earlier one. |
| `publishedAt` | `2026-10-01T12:49:51+01:00` | When the notice was published. |
| `deadline` | `2026-10-27T12:00:00Z` | Closing date for bids, when the notice gives one. |
| `valueAmount` | `2000000` | The value the buyer advertised, when it publishes one. |
| `currency` | `GBP` | Currency of the values. |
| `procedure` | `Restricted procedure` | How the buyer is running the procurement. |
| `category` | `services` | `goods`, `services` or `works`. |
| `cpvCodes` | `["90910000"]` | CPV codes, main code first. |
| `cpvDescription` | `Cleaning services` | Plain-English name of the main CPV code. |
| `regions` | `["UKE"]` | Where the work is delivered: a region or country name (Contracts Finder) or a NUTS area code (Find a Tender). |
| `noticeUrl` | `https://www.find-tender.service.gov.uk/Notice/092822-2026` | Link to the notice on the source site. |
| `license` | `http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/` | The licence link the source publishes with the notice. |
| `suppliers` | `["Haskoning UK LTD"]` | Winning suppliers that are companies, charities or public bodies (award notices only, up to 20 names). A supplier that may be a sole trader, that is a person, is counted but not named. |
| `supplierCount` | `1` | How many suppliers won, named or not. |
| `awardValue` | `999999.99` | Total value awarded (award notices only). |
| `awardDate` | `2026-09-21T00:00:00+01:00` | Date of the award (award notices only). |

A field the notice doesn't provide is `null` (or an empty list).

### How to use it

1. Open the Input tab and fill in the fields below. The prefilled values work as they are.
2. Click Start.
3. Download the results as JSON, CSV or Excel, or read them through the Apify API.

| Input | Meaning |
|---|---|
| `source` | `both` (default), `contracts-finder` or `find-a-tender`. With `both` the results alternate between the two sites. |
| `stage` | `tender` (open tenders, default), `award` (contract awards), `planning` (planning notices) or `all`. |
| `daysBack` | How far back to look, from 1 to 90 days (default 14). Contracts Finder uses the publication date. Find a Tender uses the date a notice was last updated. |
| `keywords` | Keep only notices that mention at least one of these words in the title, description, buyer name or CPV description. Not case sensitive. |
| `cpvPrefixes` | Keep only notices with a CPV code starting with one of these numbers, separated by commas, for example `72, 45`. |
| `buyerName` | Keep only notices whose buyer name contains this text, for example `NHS`. |
| `minValue`, `maxValue` | Keep only notices worth at least or at most this much (`0` means no limit). Award notices are compared on their award value when they have one. Notices without a value are left out when you set a limit. UK notices are almost always priced in GBP, and the Actor compares the number as published. |
| `maxItems` | Stop after this many results. |

Neither site can search by keyword, CPV code, buyer or value, so the Actor reads the notices for your date range and applies those filters itself. You pay only for the notices that match. A narrow filter over a long date range reads many pages and takes longer. One run reads at most 10,000 notices per site; use a shorter date range if the log says it stopped early.

### How much does it cost?

You pay **$4.00 per 1,000 results**, with no monthly fee. New Apify accounts get free monthly credit, so you can try it at no cost.

### Example output

An open tender from Find a Tender:

```json
{
    "source": "find-a-tender",
    "noticeId": "092822-2026",
    "ocid": "ocds-h6vhtk-077e95",
    "title": "Cleaning Services Framework",
    "descriptionSnippet": "Contract cleaning services framework",
    "buyer": "DELTA ACADEMIES TRUST",
    "stage": "tender",
    "status": "active",
    "isUpdate": false,
    "publishedAt": "2026-10-01T12:49:51+01:00",
    "deadline": "2026-10-27T12:00:00Z",
    "valueAmount": 2000000,
    "currency": "GBP",
    "procedure": "Restricted procedure",
    "category": "services",
    "cpvCodes": ["90910000"],
    "cpvDescription": "Cleaning services",
    "regions": ["UKE"],
    "noticeUrl": "https://www.find-tender.service.gov.uk/Notice/092822-2026",
    "license": "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/",
    "suppliers": [],
    "supplierCount": 0,
    "awardValue": null,
    "awardDate": null
}
```

A contract award from Find a Tender:

```json
{
    "source": "find-a-tender",
    "noticeId": "093030-2026",
    "ocid": "ocds-h6vhtk-077f0d",
    "title": "Continued support for ongoing bus stop infrastructure improvements",
    "descriptionSnippet": "To provide ongoing support with WNC bus stop infrastructure improvements,",
    "buyer": "West Northamptonshire Council",
    "stage": "award",
    "status": "complete",
    "isUpdate": false,
    "publishedAt": "2026-10-01T16:45:39+01:00",
    "deadline": null,
    "valueAmount": null,
    "currency": "GBP",
    "procedure": "Award procedure without prior publication of a call for competition",
    "category": "services",
    "cpvCodes": ["71311300"],
    "cpvDescription": "Infrastructure works consultancy services",
    "regions": ["UKF24"],
    "noticeUrl": "https://www.find-tender.service.gov.uk/Notice/093030-2026",
    "license": "http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/",
    "suppliers": ["Haskoning UK LTD"],
    "supplierCount": 1,
    "awardValue": 999999.99,
    "awardDate": "2026-09-21T00:00:00+01:00"
}
```

### Data source and limits

- **Source:** the official open-data feeds of [Contracts Finder](https://www.contractsfinder.service.gov.uk/) and [Find a Tender](https://www.find-tender.service.gov.uk/), the UK government's public notice services. Both publish their notices in the Open Contracting Data Standard format for other websites and applications to use. The terms are at the [Contracts Finder terms page](https://www.contractsfinder.service.gov.uk/Home/TermsAndConditions).
- **Licence:** the notices are published under the Open Government Licence, which allows commercial reuse if you acknowledge the source. If you republish the data, include this statement: *Contains public sector information licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).*
- **How fresh:** the Actor reads the live feeds every time it runs, so results are as current as the two websites.
- **Same notice twice:** a few procurements are listed on both sites, so choosing `both` can show the same contract twice. Match them on `title` and `buyer`. When a buyer corrects a notice, the site may list several versions of it; you get the newest version once per run.
- **Rate limits:** the Actor sends about one request every two seconds across both sites. Contracts Finder blocks callers for 5 minutes after too many requests. If it does, the Actor stops reading that site, says so in the run log, and carries on with the other one.
- **No contact details:** notices include named contact points. The Actor never reads them, and it removes email addresses and phone numbers from the description text it keeps. Suppliers are named only when they are on a company, charity or public-body register, or their name shows a legal form such as Ltd; a supplier that may be a sole trader is counted but not named.

The data is public. This Actor doesn't collect personal data. It is an independent tool and isn't affiliated with, endorsed by or sponsored by the UK Government, Contracts Finder or Find a Tender.

### FAQ

**Can I run it on a schedule?** Yes. Use Apify Schedules to run it daily or hourly and send the results to Google Sheets, Slack, a webhook or your own API. Set `daysBack` to 1 or 2 for a daily run.

**What is the difference between a tender and an award?** A tender notice is an opportunity: the buyer wants bids. An award notice says who won the contract and for how much. A planning notice is an early warning that a buyer expects to run a tender.

**Why are some values empty?** Not every notice states a value, a deadline or a region. The Actor shows what the source publishes and doesn't guess.

**Is it legal?** It reads public, non-personal data from official feeds that the UK government offers under the Open Government Licence, at a polite rate. Check that your own use fits the licence.

# Actor input Schema

## `source` (type: `string`):

Which UK notice service to read. 'Both' alternates between the two, so a small result limit still shows both.

## `stage` (type: `string`):

Open tenders to bid for, contract awards (who won), planning notices (early warning of a future tender), or all three.

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

Only notices published or updated in the last this many days.

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

Keep only notices that mention at least one of these words or phrases in the title, description, buyer name or CPV description. Leave empty to keep everything.

## `cpvPrefixes` (type: `string`):

Keep only notices with a CPV code that starts with one of these numbers, separated by commas. For example 72 is IT services and 45 is construction. Leave empty to keep everything.

## `buyerName` (type: `string`):

Keep only notices whose buyer name contains this text, for example NHS or Council. Leave empty to keep everything.

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

Keep only notices worth at least this much. Notices that don't publish a value are left out when you set a minimum or a maximum. 0 means no minimum.

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

Keep only notices worth at most this much. 0 means no maximum.

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

Stop after saving this many results. You pay per saved result.

## Actor input object example

```json
{
  "source": "both",
  "stage": "tender",
  "daysBack": 14,
  "keywords": [],
  "cpvPrefixes": "",
  "buyerName": "",
  "minValue": 0,
  "maxValue": 0,
  "maxItems": 100
}
```

# Actor output Schema

## `results` (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 = {
    "source": "both",
    "stage": "tender",
    "daysBack": 14,
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("jadeite_geometry/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 = {
    "source": "both",
    "stage": "tender",
    "daysBack": 14,
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("jadeite_geometry/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 '{
  "source": "both",
  "stage": "tender",
  "daysBack": 14,
  "maxItems": 100
}' |
apify call jadeite_geometry/uk-public-tenders --silent --output-dataset

```

## MCP server setup

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