# UK Government Contracts & Tenders — Contracts Finder (`powerfully_goliath/uk-government-contracts`) Actor

Search UK public-sector tenders and contract awards from the official Contracts Finder API: keywords, CPV codes, regions, value, postcode radius, SME-suitable. Get buyer contact name, email and phone, deadlines, values and winning suppliers. No API key. Pay per notice.

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

## Pricing

from $2.00 / 1,000 notice returneds

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 Government Contracts & Tenders (Contracts Finder) — with Buyer Contacts

Find **UK public-sector contract opportunities and awards** from **Contracts Finder**, the
government's official procurement notice service: councils, the NHS, schools, universities,
housing associations, police, central government and more. Search by **keyword, CPV
category, region, value, distance from a postcode and SME suitability**, and get back
**deadlines, values, buyer contact name, email and phone, and who won**.

It uses the **official Contracts Finder API**, published under the Open Government Licence:
no scraping, no blocks, **no API key**.

**$2 per 1,000 notices, or $4 per 1,000 with buyer contacts and supplier details.**

***

### Who uses it

- **Small businesses and SMEs** bidding for public work: a daily feed of open tenders in
  your trade and region, closing after today.
- **Bid writers and tender consultants**: opportunities for your clients, with the buyer's
  contact to ask questions.
- **Sales teams**: who is buying what, from whom, and when the contract ends. Awarded
  contracts with an end date are next year's re-tender.
- **Market and competitor research**: every award in a CPV category, the winning suppliers
  and the prices paid.

### Filters

| Filter | Example |
|---|---|
| **Keywords** (one search each, merged) | `cleaning`, `grounds maintenance`, `software development` |
| **Status** | Open (taking bids, the default), Closed, Awarded |
| **Notice types** | Contract (default), Pipeline (planned future buys), Early market engagement |
| **Published on or after / before** | `2026-09-01`, or `7 days`. Default: the last 30 days. |
| **Regions** | London, North West, Scotland, Wales... (the 12 UK regions) |
| **CPV codes** | `90910000` (cleaning), `72` (all IT services), `45000000` (construction) |
| **Minimum / maximum value** (£) | `10000` to `250000` |
| **Near postcode + radius** | `LS1 4DT`, 20 miles |
| **Only SME-suitable / VCSE-suitable** | the buyer's own suitability flags |
| **Buyer name contains** | `NHS`, `Council`, `University` |
| **Deadline on or after** | skip tenders closing too soon |
| **Add buyer contacts and suppliers** | fetches each notice in full (see pricing) |

Contracts Finder answers at most 1,000 notices per query. This actor splits large date
ranges automatically, so you can pull years of awards in one run.

#### Example input

Open cleaning tenders from the last 14 days, with buyer contacts:

```json
{
  "keywords": ["cleaning"],
  "statuses": ["Open"],
  "publishedFrom": "14 days",
  "includeContactDetails": true,
  "maxItems": 200
}
```

Every IT contract awarded in London this year, over £50k:

```json
{
  "statuses": ["Awarded"],
  "cpvCodes": ["72"],
  "regions": ["London"],
  "minValue": 50000,
  "publishedFrom": "2026-01-01",
  "maxItems": 5000
}
```

### Output

One row per notice. Download it as **CSV, Excel, JSON or XML**, or read it through the API.
This row is from a real run on 22 Oct 2026 (the description is shortened here):

```json
{
  "noticeId": "1a9512f5-a1e3-4330-be0b-78ab283abacb",
  "title": "CA18592 - The Dean Trust Tender for Cleaning Services",
  "description": "The Dean Trust is a multi-academy trust ... seeking a contractor to provide cleaning ...",
  "noticeType": "Contract",
  "noticeStatus": "Open",
  "buyerName": "The Dean Trust",
  "publishedDate": "2026-10-21T13:03:44+01:00",
  "deadlineDate": "2026-12-04T10:00:00Z",
  "contractStart": "2027-09-01",
  "contractEnd": "2030-08-31",
  "valueLow": 4648437,
  "valueHigh": 4648437,
  "cpvCodes": "90919300",
  "cpvDescription": "School cleaning services",
  "regions": "Any region",
  "postcode": "M33 5BP",
  "suitableForSme": true,
  "noticeUrl": "https://www.contractsfinder.service.gov.uk/Notice/1a9512f5-a1e3-4330-be0b-78ab283abacb",
  "hasContactDetails": true,
  "buyerEmail": "support@multiquote.com"
}
```

With **Add buyer contacts and suppliers** on, each row also gets `buyerContactName`,
`buyerEmail`, `buyerPhone`, `buyerAddress`, `buyerPostcode`, `buyerWebsite`,
`procedureType`, `isFrameworkAgreement`, `suppliers` (name and value of each award) and
`supplierAddresses`. Awarded notices always carry `awardedDate`, `awardedValue`,
`awardedSupplier` and whether it went to an SME or VCSE.

The **OUTPUT** record in the key-value store gives the query, notices delivered, events
charged, API calls made, any day that held more than 1,000 notices, and why the run stopped.

### Pricing

| Event | Price |
|---|---|
| Notice returned | **$0.002** ($2 per 1,000) |
| Notice with buyer contacts | **$0.004** ($4 per 1,000), charged instead of the above when the contacts option is on |
| Actor start | Apify's minimum ($0.00005 per run) |

You are charged only for notices delivered, never past **Maximum results** or your run's
spending limit.

### Good to know

- Contracts Finder is the UK government's service for public contract notices in England
  (plus central-government and some UK-wide buyers). It currently carries around 150-200
  new notices a day. Larger above-threshold procurements, and most Scottish, Welsh and
  Northern Irish ones, are also or only advertised on Find a Tender and the devolved
  portals, which this actor does not cover.
- Many tenders are run through e-procurement portals, so the "buyer email" is sometimes
  the portal's support address. The description usually says where to register.
- Values are the buyer's estimate unless the notice is awarded.
- Contains public sector information licensed under the
  [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).
  This actor is independent and not endorsed by Crown Commercial Service or the Cabinet
  Office.

### Related UK open-data actors

- **UK Charity Register**: every registered charity in England & Wales, with income,
  contacts, causes and trustees.
- **UK Food Hygiene Ratings (FSA)**: every food business's hygiene rating.
- **UK Companies House: Companies, Officers & PSCs**: check a supplier's directors,
  owners and filings.

# Actor input Schema

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

Contracts Finder keyword search, one search per entry, results merged and de-duplicated, e.g. 'cleaning', 'software development', 'grounds maintenance'. Leave empty for everything that matches the other filters.

## `statuses` (type: `array`):

Open = still taking bids. Awarded = contract let (has the winning supplier and value). Default: Open.

## `noticeTypes` (type: `array`):

Default: Contract (tenders and awards). Pipeline = planned future buys; Early market engagement = buyers asking the market before a tender.

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

Default: 30 days ago. Accepts 2026-01-31 or relative values like '7 days'. Data starts 26 Feb 2015.

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

Default: today.

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

Delivery region(s). Leave empty for anywhere.

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

Common Procurement Vocabulary codes; shorter codes are padded, so '72' = 72000000 (IT services) and includes its sub-codes. Examples: 90910000 cleaning, 45000000 construction, 79340000 advertising.

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

Contract value at least this (£).

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

Contract value at most this (£).

## `postcode` (type: `string`):

A full UK postcode; finds notices located within the radius.

## `radiusMiles` (type: `integer`):

Distance from the postcode. Default 10.

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

Only notices the buyer marked suitable for small and medium businesses.

## `vcseSuitableOnly` (type: `boolean`):

Only notices marked suitable for voluntary, community and social enterprises.

## `buyerContains` (type: `array`):

Keep only buyers whose name contains ANY of these, e.g. 'NHS', 'Council', 'University'.

## `closingAfter` (type: `string`):

Only notices whose bid deadline is on/after this date (e.g. today, to skip ones closing too soon).

## `includeContactDetails` (type: `boolean`):

Fetch each notice in full: buyer contact name, email, phone, address and website, procedure type, and every awarded supplier with address and value. Priced as 'Notice with buyer contacts'.

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

Stop after this many notices. You are charged only for notices delivered.

## Actor input object example

```json
{
  "keywords": [
    "cleaning"
  ],
  "statuses": [
    "Open"
  ],
  "noticeTypes": [
    "Contract"
  ],
  "publishedFrom": "30 days",
  "postcode": "LS1 4DT",
  "smeSuitableOnly": false,
  "vcseSuitableOnly": false,
  "includeContactDetails": false,
  "maxItems": 20
}
```

# Actor output Schema

## `overview` (type: `string`):

Title, buyer, status, deadline, value and link.

## `contacts` (type: `string`):

Buyer contact name, email, phone and website.

## `awards` (type: `string`):

Award dates, values and winning suppliers.

## `runSummary` (type: `string`):

The OUTPUT record: query used, notices delivered, events charged, API calls and why the run stopped.

# 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": [
        "cleaning"
    ],
    "publishedFrom": "30 days",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("powerfully_goliath/uk-government-contracts").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": ["cleaning"],
    "publishedFrom": "30 days",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("powerfully_goliath/uk-government-contracts").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": [
    "cleaning"
  ],
  "publishedFrom": "30 days",
  "maxItems": 20
}' |
apify call powerfully_goliath/uk-government-contracts --silent --output-dataset

```

## MCP server setup

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

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/n0LW9Ye8U5CoSFmun/builds/QAw4XkPyE0fgEGe2M/openapi.json
