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

Search new UK public sector tenders, planned procurements and contract awards from the official Contracts Finder and Find a Tender APIs. Filter by keyword, CPV code, value and open deadline; get clean JSON.

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

## Pricing

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

Get new UK public sector tenders, planned procurements and contract awards as clean JSON, straight
from the two official UK procurement services: **Contracts Finder** and **Find a Tender**. Both
are run by the UK Cabinet Office and publish their notices through open APIs in the Open
Contracting Data Standard (OCDS). This Actor reads both, merges them newest first, applies your
filters and returns one tidy record per notice. Bid teams, procurement consultants, sales teams
and AI agents use it to spot opportunities early without checking two websites every day.

### What you get

- Title, description, buyer (organisation name and town) and a link to the official notice page.
- Stage (open tender, planned procurement or award), notice type (for example `UK4` tender notice)
  and procedure (open, selective, direct award).
- Estimated value in GBP, excluding VAT, plus the VAT-inclusive figure when the source gives one.
- Tender deadline, deadline to request to participate (for two-stage procedures), and contract
  start and end dates.
- CPV codes with their labels, delivery regions, and whether the buyer says it suits SMEs and VCSEs.
- For awards: the winning suppliers and the awarded value.
- Export as JSON, CSV or Excel, or call it as a tool from AI agents through the Apify MCP server.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `keywords` | string | `""` (all) | Comma-separated words or phrases. A notice matches when its title or description contains any of them. |
| `stages` | array | `["tender"]` | `tender` (open opportunities), `planning` (pipeline and market engagement), `award`. |
| `sources` | array | both | `contracts-finder`, `find-a-tender`. |
| `publishedWithinDays` | integer | `3` | Notices published or updated in the last 1 to 90 days. |
| `onlyOpen` | boolean | `true` | Drop tenders whose deadline has passed or that are cancelled, withdrawn or complete. |
| `cpvPrefixes` | array | `[]` | Keep notices with a CPV code starting with these digits, e.g. `72` for IT services. |
| `minValue` | integer | `0` | Keep notices with a stated value of at least this many GBP. |
| `maxItems` | integer | `10` | Stop after this many notices. |

Example: open IT tenders worth at least £100,000 from the last two weeks:

```json
{ "cpvPrefixes": ["72", "48"], "minValue": 100000, "publishedWithinDays": 14, "maxItems": 200 }
```

### Output

One dataset item per notice. A real item from a test run on 13 October 2026:

```json
{
  "id": "096730-2026",
  "ocid": "ocds-h6vhtk-077bad",
  "source": "find-a-tender",
  "stage": "tender",
  "noticeType": "UK4",
  "title": "Fire Risk Assessments - Domestic",
  "description": "The Council are looking for a suppler to conduct Fire Risk Assessments for our Domestic housing stock.",
  "buyerName": "West Lancashire Borough Council",
  "buyerLocality": "Ormskirk",
  "buyerCountry": "United Kingdom",
  "status": "active",
  "procurementMethod": "open",
  "procurementMethodDetails": "Open procedure",
  "mainCategory": "services",
  "cpvCodes": ["71000000"],
  "cpvLabels": ["Architectural, construction, engineering and inspection services"],
  "valueAmount": 340000,
  "valueAmountGross": 408000,
  "minValueAmount": null,
  "valueCurrency": "GBP",
  "awardedValue": null,
  "awardedValueCurrency": null,
  "awardedSuppliers": [],
  "publishedAt": "2026-10-13T16:57:10+01:00",
  "tenderDeadline": "2026-11-13T16:00:00+00:00",
  "participationDeadline": null,
  "contractStart": "2027-01-04T00:00:00+00:00",
  "contractEnd": "2030-01-03T23:59:59+00:00",
  "deliveryRegions": ["UKD47"],
  "suitableForSme": true,
  "suitableForVcse": null,
  "url": "https://www.find-tender.service.gov.uk/Notice/096730-2026"
}
```

Fields the source leaves empty are `null` (or an empty list). Text is copied as published,
typos included. Dates are ISO 8601 with the source's time zone.

### Pricing

Pay per result: you are charged for each notice saved to the dataset, at the price shown on this
page. There is no monthly fee. Set "Maximum cost per run" to cap any single run; the Actor stops
cleanly when the cap is reached and keeps everything it saved.

### Data source and limits

- Sources: the [Contracts Finder API](https://www.contractsfinder.service.gov.uk/apidocumentation)
  ([terms](https://www.contractsfinder.service.gov.uk/Home/TermsAndConditions)) and the
  [Find a Tender API](https://www.find-tender.service.gov.uk/Developer/Documentation)
  ([terms](https://www.find-tender.service.gov.uk/Home/TermsAndConditions)). Contains public sector
  information licensed under the
  [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).
- Contracts Finder mostly carries lower-value contracts from public bodies in England. Find a
  Tender carries higher-value notices from across the UK, including every notice under the
  Procurement Act 2023.
- Find a Tender's own stage filter misses Procurement Act notices, so the Actor reads every Find
  a Tender release in your period and keeps the stages you chose. Stages come from each notice's
  OCDS release tags.
- Keyword, CPV and value filters run inside the Actor on the fields above. Long periods with
  narrow filters scan more notices and take longer.
- When a procurement has several tender or planning notices in your period (for example an
  update), you get the newest one. Award notices are returned one per notice, because each lot
  can have its own contract.
- Regions are ITL/NUTS codes on Find a Tender (for example `UKD47`) and region names on
  Contracts Finder.
- The Actor sends at most about one request per second to each site, identifies itself, and
  backs off when asked. If Contracts Finder reports its rate limit, the Actor stops reading that
  source for the run, keeps what it saved and says so in the run status.
- No personal contact data: the contact-person fields (names, emails, phone numbers) are left
  out, and email addresses or phone numbers that buyers type into a title or description are
  replaced with `[email removed]` or `[phone removed]`. Otherwise text is copied as published.
- Not affiliated with or endorsed by the UK Government or the Cabinet Office.

### FAQ

**Is this data official?** Yes. It comes from the services' public APIs. Only field names and
formatting change, contact-person fields are dropped, and contact details in free text are masked.

**How fresh is it?** Every run fetches live data. New notices usually appear within minutes of
publication.

**Can I get new tenders every morning?** Schedule the Actor daily with `publishedWithinDays: 1`
and your filters. Notices updated during the day can appear again, so de-duplicate on `id`.

**Why is the value or deadline empty?** The buyer did not state it in the notice. Two-stage
procedures often give a participation deadline instead of a tender deadline.

**Something broke?** Open an issue on the Issues tab. The Actor is tested daily.

### About Tabulary

This tool is part of [Tabulary](https://apify.com/tabulary): clean tables from official public
sources. Every Tabulary tool uses the source's official API or open data where one exists,
collects no personal data, and is tested on Apify every day. Questions or ideas? Open an issue on
the Issues tab.

# Actor input Schema

## `keywords` (type: `string`):

Optional. Comma-separated words or phrases, for example "software, cyber security". A notice matches when its title or description contains any of them (not case-sensitive). Leave empty to get every notice in the period.

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

Which kinds of notices to return: open tenders (opportunities you can bid for), planned procurements (pipeline and market engagement) and awards (who won, for how much).

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

Contracts Finder carries mostly lower-value contracts in England; Find a Tender carries higher-value notices for the whole UK, including all Procurement Act 2023 notices. Results from both are merged, newest first.

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

Only notices published or updated in this many days, counting back from now.

## `onlyOpen` (type: `boolean`):

Skip tender notices whose submission or participation deadline has passed, or that are cancelled, withdrawn or complete. A tender that states no deadline is kept only if the source marks it active. Has no effect on planned procurements or awards.

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

Optional. Keep notices with at least one CPV code starting with any of these digits, for example 72 (IT services), 48 (software) or 45 (construction work).

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

Optional. Keep notices whose stated value is at least this amount. Notices that state no value are dropped when this is above 0.

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

Stop after this many notices. Each notice is one billable dataset item.

## Actor input object example

```json
{
  "keywords": "",
  "stages": [
    "tender"
  ],
  "sources": [
    "contracts-finder",
    "find-a-tender"
  ],
  "publishedWithinDays": 3,
  "onlyOpen": true,
  "cpvPrefixes": [],
  "minValue": 0,
  "maxItems": 10
}
```

# Actor output Schema

## `overview` (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 = {
    "keywords": "",
    "stages": [
        "tender"
    ],
    "sources": [
        "contracts-finder",
        "find-a-tender"
    ],
    "publishedWithinDays": 3,
    "onlyOpen": true,
    "cpvPrefixes": [],
    "minValue": 0,
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("tabulary/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 = {
    "keywords": "",
    "stages": ["tender"],
    "sources": [
        "contracts-finder",
        "find-a-tender",
    ],
    "publishedWithinDays": 3,
    "onlyOpen": True,
    "cpvPrefixes": [],
    "minValue": 0,
    "maxItems": 10,
}

# Run the Actor and wait for it to finish
run = client.actor("tabulary/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 '{
  "keywords": "",
  "stages": [
    "tender"
  ],
  "sources": [
    "contracts-finder",
    "find-a-tender"
  ],
  "publishedWithinDays": 3,
  "onlyOpen": true,
  "cpvPrefixes": [],
  "minValue": 0,
  "maxItems": 10
}' |
apify call tabulary/uk-public-tenders --silent --output-dataset

```

## MCP server setup

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