# UK Contracts Finder - Tenders and Contract Awards (`staymeter-labs/uk-contracts-finder`) Actor

Search UK public sector tenders, planning notices and contract awards from the official Contracts Finder OCDS API. Filter by keyword, CPV code, value, buyer, region and date. No key needed.

- **URL**: https://apify.com/staymeter-labs/uk-contracts-finder.md
- **Developed by:** [Staymeter Labs](https://apify.com/staymeter-labs) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## 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 Contracts Finder — tenders and contract awards, official API

Get **UK public sector tenders, planning notices and contract awards** from GOV.UK's Contracts Finder as clean, structured JSON or CSV. Filter by keyword, CPV code, buyer, region, value and date, and run it daily to receive only new opportunities.

### Why this Actor

- **Official source, no key.** Uses the Cabinet Office's public Contracts Finder OCDS API. No browser, no proxies, no API key.
- **Opportunities and awards in one place.** Choose `tender` (open bids), `award` (who won, for how much) and/or `planning` (early market engagement).
- **Filters the API itself lacks.** The official API only filters by date and stage. This Actor adds keywords, CPV codes (or branches such as `72` = IT services), buyer name, delivery region, min/max value, SME-suitable and open-for-bids-only.
- **Incremental monitoring.** Set *Published in the last N days* and schedule the Actor daily. Notices are de-duplicated and paginated automatically.
- **Reliable.** Retries on rate limits (honours `Retry-After`) and server errors, clear errors for bad parameters.
- **No personal data.** Buyer contact names, e-mails and phone numbers are deliberately not output.

### Output

| Field | Example |
|---|---|
| `noticeId`, `ocid` | Unique release id and OCDS process id |
| `noticeType`, `stage` | `tender`, `tenderAmendment`, `award`, `awardUpdate`, `planning`; stage = `tender` / `award` / `planning` |
| `publishedDate`, `publishedAt` | `2026-10-01`, full timestamp |
| `title`, `description` | Notice title and text (first 2,000 characters) |
| `status` | `active`, `complete`… |
| `buyerName`, `buyerLocality`, `buyerPostcode`, `buyerWebsite` | `East Sussex County Council`, `Lewes`, `BN7 1UE` |
| `region`, `deliveryPostcode` | Delivery region / postcode when stated |
| `cpvCodes`, `cpvDescription`, `mainCategory` | `["72000000"]`, `services` |
| `procurementMethod` | `Open procedure` |
| `valueAmount`, `currency` | Tender value (minimum value if that is all that is published); total awarded value on award notices. `null` when not published |
| `awardedSuppliers`, `awardedSupplierDetails`, `awardDate` | Winners with company size (`sme` / `large`) on award notices |
| `tenderDeadline`, `contractStart`, `contractEnd` | ISO timestamps |
| `suitableForSme`, `suitableForVcse` | `true` / `false` |
| `noticeUrl` | Link to the official notice |

```json
{
  "noticeId": "b0a130a3-4b89-4587-bc61-34ba792f39bd-916396",
  "noticeType": "award",
  "stage": "award",
  "publishedDate": "2026-10-02",
  "title": "ENHT - Treatment Centre Theatre 1 and 2 renovation works, out of hours",
  "buyerName": "East and North Hertfordshire Teaching Hospital NHS Trust",
  "region": "England",
  "cpvCodes": ["45453100"],
  "mainCategory": "works",
  "valueAmount": 40172,
  "currency": "GBP",
  "awardedSuppliers": ["Wemh Group LTD"],
  "awardDate": "2026-10-02",
  "noticeUrl": "https://www.contractsfinder.service.gov.uk/Notice/b0a130a3-4b89-4587-bc61-34ba792f39bd"
}
```

### Input examples

New IT tenders from the last 3 days that are still open and suit SMEs:

```json
{ "stages": ["tender"], "cpvCodes": ["72"], "sinceDays": 3, "openOnly": true, "smeOnly": true }
```

NHS contract awards worth £100k+ since 1 September:

```json
{ "stages": ["award"], "buyerNames": ["NHS"], "minValue": 100000, "sinceDate": "2026-09-01", "maxItems": 1000 }
```

### Use cases

- Bid teams and SMEs: a daily list of new tenders matching your keywords and CPV codes.
- Competitor and market research: who wins which contracts, and for how much.
- Pairing with EU TED data for a full UK + EU tender feed.
- Feeding procurement data to dashboards, spreadsheets or AI agents (works via the Apify MCP server).

### Limits

- Filtering by keyword, CPV, buyer, region and value happens after download, so very narrow filters over long date ranges read many notices. Keep the date range sensible for scheduled runs.
- `valueAmount` and `region` are only present when the buyer published them.
- Covers notices published on Contracts Finder (England, plus UK-wide and devolved authorities that use it); Find a Tender above-threshold notices are not included.
- `maxItems` defaults to 100; raise it for bulk runs.
- Not affiliated with the UK Government. Contains public sector information licensed under the Open Government Licence v3.0. The original notices on Contracts Finder remain the legal reference.

### Pricing

Free to use — you only pay Apify's standard platform usage, which is tiny because this Actor calls an official API directly (no browser, no proxies).

# Actor input Schema

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

tender = opportunities open for bids, award = awarded contracts, planning = early market engagement and pipeline notices.

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

Keep notices whose title or description contains ANY of these words or phrases (case-insensitive). Leave empty for all.

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

Common Procurement Vocabulary codes. A shorter prefix matches the whole branch (e.g. 72 = IT services, 45 = construction, 85 = health and social care).

## `buyerNames` (type: `array`):

Keep notices whose buyer name contains ANY of these texts, e.g. NHS, County Council.

## `regions` (type: `array`):

Keep notices delivered in a matching region, e.g. London, Scotland, North West. Notices that do not state a region are dropped when this is set.

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

Keep notices whose value is at least this. Notices with no published value are dropped when this is set.

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

Keep notices whose value is at most this. Notices with no published value are dropped when this is set.

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

Only tender notices whose submission deadline has not passed (or has no deadline).

## `smeOnly` (type: `boolean`):

Only notices flagged as suitable for small and medium-sized enterprises.

## `sinceDays` (type: `integer`):

Ignored if Since date is set. Use with a schedule for daily monitoring.

## `sinceDate` (type: `string`):

Only notices published on or after this date (YYYY-MM-DD).

## `untilDate` (type: `string`):

Only notices published on or before this date (YYYY-MM-DD). Default: today.

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

Stop after this many matching notices.

## Actor input object example

```json
{
  "stages": [
    "tender"
  ],
  "keywords": [
    "software"
  ],
  "openOnly": false,
  "smeOnly": false,
  "sinceDays": 7,
  "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 = {
    "stages": [
        "tender"
    ],
    "keywords": [
        "software"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("staymeter-labs/uk-contracts-finder").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 = {
    "stages": ["tender"],
    "keywords": ["software"],
}

# Run the Actor and wait for it to finish
run = client.actor("staymeter-labs/uk-contracts-finder").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 '{
  "stages": [
    "tender"
  ],
  "keywords": [
    "software"
  ]
}' |
apify call staymeter-labs/uk-contracts-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,staymeter-labs/uk-contracts-finder"
        }
    }
}
```

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/9Hsq9QgZuPMmjWQ7i/builds/9hLQymZsEuZ2dc7Xc/openapi.json
