# UK Contracts Finder Scraper: Public Tenders & Awards (`bogdiehard/uk-contracts-finder-scraper`) Actor

Pulls UK public-sector tenders, contract awards and planning notices from the official Contracts Finder API, with buyer contacts, CPV codes, values, deadlines and winning suppliers.

- **URL**: https://apify.com/bogdiehard/uk-contracts-finder-scraper.md
- **Developed by:** [Demetrius Greses Jr](https://apify.com/bogdiehard) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.20 / 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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Contracts Finder Scraper: Public Tenders & Awards

Returns UK public-sector tenders, contract awards and planning notices from the official Contracts Finder API as flat JSON, with buyer contacts, CPV codes, values, deadlines and winning suppliers, for bid teams, B2B sales and procurement consultants who need a daily feed of public contracts.

### Use cases

- **Bid teams:** get a daily list of new open tenders that match your services by keyword, CPV code and value band, with deadlines and the buyer's published contact.
- **B2B sales:** find public buyers that spend in your category, using buyer name, locality and CPV code, then contact them through the procurement contact published on the notice.
- **Competitor intelligence:** track which suppliers win contracts in your sector, with award value and award date (award stage).
- **SME and small-firm pipelines:** keep only notices the buyer marks as SME-suitable, with open tenders only.
- **Data and BI teams:** load notices into Google Sheets, a CRM or a dashboard with stable IDs (`id`, `noticeId`, `releaseId`) and ISO dates.

### Sample output

| Title | Buyer | Value (GBP) | CPV code | Deadline |
| --- | --- | --- | --- | --- |
| CA18543 - Northampton College - Media planning & Buying Services | Northampton College | 250000 | 79340000 | 2026-11-04 |
| 4 John Street, Maryport - Lintel Replacement and Rendering | Storm Tempest Ltd | 30000 | 45453100 | 2026-11-05 |
| Design and Installation of the East Midlands Pavilion at UKR | East Midlands Combined Authority | 130000 | 79952000 | 2026-11-06 |

One item as JSON, from a live run (the description is shortened here):

```json
{
    "id": "ocds-b5fd17-eba856aa-b8d6-4d73-b794-8420ea10a3d9",
    "noticeId": "d2301388-4ca6-48fc-805d-eb2e5793377e",
    "releaseId": "d2301388-4ca6-48fc-805d-eb2e5793377e-917336",
    "stage": "tender",
    "title": "CA18543 - Northampton College - Media planning & Buying Services",
    "description": "Northampton College is seeking to appoint an experienced media planning and buying agency to support the planning, booking, optimisation and evaluation of paid …",
    "status": "active",
    "buyerName": "Northampton College",
    "buyerId": "GB-CFS-117389",
    "buyerLocality": "Northampton",
    "buyerPostalCode": "NN3 3RF",
    "buyerCountry": "England",
    "contactName": "Victoria Murphy",
    "contactEmail": "support@multiquote.com",
    "contactPhone": "0151 482 9230",
    "procurementMethod": "Open procedure",
    "mainCategory": "services",
    "cpvCode": "79340000",
    "cpvDescription": "Advertising and marketing services",
    "additionalCpvCodes": ["79342000", "79413000"],
    "valueAmount": 250000,
    "valueCurrency": "GBP",
    "publishedAt": "2026-10-09T17:30:14.000Z",
    "deadline": "2026-11-04T12:00:00.000Z",
    "contractStart": "2026-11-30T00:00:00.000Z",
    "contractEnd": "2029-11-29T23:59:59.000Z",
    "smeSuitable": true,
    "vcseSuitable": false,
    "deliveryPostalCode": "NN3 3RF",
    "awardedSuppliers": [],
    "awardValue": null,
    "awardDate": null,
    "noticeUrl": "https://www.contractsfinder.service.gov.uk/Notice/d2301388-4ca6-48fc-805d-eb2e5793377e",
    "sourceUrl": "https://www.contractsfinder.service.gov.uk/Notice/d2301388-4ca6-48fc-805d-eb2e5793377e",
    "scrapedAt": "2026-10-11T00:57:40.801Z"
}
```

### Pricing

**$6 per 1,000 results.** A 500-result run costs about $3. You pay only for results saved to your dataset, plus Apify's standard start fee of $0.00005 per run. Apify Silver and Gold plan users get lower per-result prices automatically.

Set **Max results** to cap what a run can cost. The Actor stops cleanly when it reaches your spending limit.

### Input

See the input tab for the full configuration. The fields are:

| Field | Type | Description |
| --- | --- | --- |
| `stages` | array | Notice stages: `tender` (open opportunities, default), `award` (contract awards) or `planning` (early market engagement). |
| `publishedFrom` | string | First publication date, `YYYY-MM-DD`. Dates are interpreted in UTC. Empty means 14 days before the run. |
| `publishedTo` | string | Last publication date, `YYYY-MM-DD`, included in full. Dates are interpreted in UTC. Empty means the time of the run. |
| `keywords` | array | Keep notices whose title or description contains any of these words, case-insensitive. |
| `cpvPrefixes` | array | Keep notices whose main or additional CPV code starts with any of these digits, for example `72` for IT services. |
| `minValue` | integer | Keep notices worth at least this many pounds. Notices with no published value are dropped when a value filter is set. |
| `maxValue` | integer | Keep notices worth at most this many pounds. Notices with no published value are dropped when a value filter is set. |
| `onlySmeSuitable` | boolean | Keep only notices the buyer marks as suitable for small and medium-sized enterprises. |
| `onlyOpen` | boolean | Tender notices only: keep status `active` with a deadline in the future. |
| `maxItems` | integer | Maximum number of results to return, from 1 to 100,000. Default 100. |
| `proxyConfiguration` | object | Off by default. The API is open, so you normally do not need a proxy. |

Filters run after the data is read. Notices that a filter removes are not saved and not charged.

Example input (the daily test):

```json
{
    "stages": ["tender", "award"],
    "maxItems": 20
}
```

Example input for open software tenders worth at least £50,000 published since 1 September 2026:

```json
{
    "stages": ["tender"],
    "keywords": ["software"],
    "minValue": 50000,
    "onlyOpen": true,
    "publishedFrom": "2026-09-01",
    "maxItems": 100
}
```

### Integrations

- **API:** run the Actor and fetch results with the [Apify API](https://docs.apify.com/api/v2) or the JavaScript and Python clients.
- **AI agents:** call it as a tool through the [Apify MCP server](https://mcp.apify.com).
- **No-code:** connect it to Make, Zapier or n8n, or export results straight to Google Sheets.
- **Scheduling:** run it daily with Apify Schedules. Each run reads the last 14 days by default (UTC), so you get only recent notices.

### FAQ

**What are the limits?** Each API page holds up to 100 notices, and a run reads pages until it reaches **Max results** or runs out of notices. Filters are applied after the read, so a narrow filter over a long date range reads more pages and takes longer. The API limits how fast you can ask: when it returns HTTP 429, the Actor waits for the time the API gives and then retries, so runs can take longer. Each stage is read one page after another. A notice is read as the API publishes it, so the default 14-day window on a daily schedule is enough for new notices.

**Why does a procurement appear more than once?** When a buyer amends a notice, the API publishes a new release with the same `id` (the procurement ID) and a different `releaseId`. Amended tenders have stage `tenderAmendment`. To count each notice once, use `releaseId`.

**Why is `publishedAt` older than my date range?** `publishedAt` is the original publication date of the notice. In a 1,000-result test, 17 results had an older `publishedAt` than the start of the range (15 of them amendments). The API's date filter does not always match the original publication date. Keep that in mind when you deduplicate or report by publication date.

**Why are some fields empty?** A field is `null` (or an empty list) when the buyer did not publish it. Values are missing on some notices, and buyer contacts are missing when no procurement contact was given. Award fields (`awardedSuppliers`, `awardValue`, `awardDate`) are filled only on award notices.

**Is this legal?** The Actor collects public data only, from the official Contracts Finder open-data API. It needs no login, no account cookies and no CAPTCHA solving, and it crawls politely. It is not affiliated with, endorsed by or connected to Contracts Finder, the Cabinet Office or the UK Government. The data is published under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/). You are responsible for how you use it.

Buyer contact names, emails and phone numbers are personal data when they belong to a person. They come from what the buyer published on the notice, and the Actor does not look them up or enrich them. Check your UK GDPR and PECR obligations before you use them for outreach.

**Something broke or a field is missing?** Open an issue on the Actor's Issues tab. We answer within one business day and usually ship a fix within 48 hours.

### Related Actors

- [UK Find a Tender Scraper: High-Value Public Contracts](https://apify.com/bogdiehard/uk-find-a-tender-scraper): the same field names for above-threshold notices from Find a Tender, so you can merge both feeds.

### Changelog

- **0.1** (2026-10-10): First release. Tender, award and planning stages; keyword, CPV, value, SME and open-tender filters.

# Actor input Schema

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

Notice stages to collect: open opportunities (tender), contract awards (award) or early market engagement (planning). Each stage is one API request chain.

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

First publication date to include, as YYYY-MM-DD. Dates are interpreted in UTC. Leave empty for 14 days before the run.

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

Last publication date to include, as YYYY-MM-DD (the whole day is included). Dates are interpreted in UTC. Leave empty for the time of the run.

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

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

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

Keep notices whose main or additional CPV code starts with ANY of these digits, for example 72 for IT services or 45 for construction.

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

Keep notices worth at least this many pounds. Notices with no published value are dropped when a value filter is set.

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

Keep notices worth at most this many pounds. Notices with no published value are dropped when a value filter is set.

## `onlySmeSuitable` (type: `boolean`):

Keep only notices the buyer marks as suitable for small and medium-sized enterprises.

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

Tender notices only: keep those with status active and a deadline in the future. Award and planning notices are not affected.

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

Maximum number of results to return. You are charged per result, and the run stops at this number.

## `proxyConfiguration` (type: `object`):

Not needed for this official open-data API, so it is off by default. Turn it on only if the API blocks your requests.

## Actor input object example

```json
{
  "stages": [
    "tender",
    "award"
  ],
  "onlySmeSuitable": false,
  "onlyOpen": false,
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `stats` (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",
        "award"
    ],
    "maxItems": 20,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("bogdiehard/uk-contracts-finder-scraper").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",
        "award",
    ],
    "maxItems": 20,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("bogdiehard/uk-contracts-finder-scraper").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",
    "award"
  ],
  "maxItems": 20,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call bogdiehard/uk-contracts-finder-scraper --silent --output-dataset

```

## MCP server setup

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

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/PbEEIEzGNzKg02xmV/builds/M5IYTarPqEwauZ17E/openapi.json
