# UK Tenders Scraper: Find a Tender & Contracts Finder (`polderdata/uk-tenders-scraper`) Actor

Get UK public sector tenders and contract awards from Find a Tender and Contracts Finder (official open data). Filter by keyword, CPV code, region, value and deadline. Export to CSV, JSON or Excel.

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

## Pricing

from $3.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 Tenders Scraper: Find a Tender & Contracts Finder

Get **UK public sector tenders and awarded contracts** from **Find a Tender** and **Contracts Finder** (the official UK government procurement services) as clean, flat rows: title, buyer, value, CPV codes, region, deadlines, contract dates, winning companies and links. Filter by keyword, CPV code, region, value and open deadline, then export to **CSV, JSON or Excel**, or pull it via **API**.

> Unofficial tool. Not affiliated with or endorsed by the UK Government, Cabinet Office, Find a Tender or Contracts Finder. It reads the services' public open-data APIs (Open Government Licence v3.0) and exports no personal data.

### What data you get

One row per notice (tender, award or planning/pipeline notice):

| Field | Example | Description |
|---|---|---|
| `source` | `find-a-tender` | `find-a-tender` or `contracts-finder` |
| `noticeId` / `ocid` | `098226-2026` / `ocds-h6vhtk-078a31` | Notice id and Open Contracting process id (same id from tender to award) |
| `stage` | `tender` | `tender`, `tenderUpdate`, `award`, `planning`, … |
| `title` / `description` | `Electrical Maintenance. 4 Year Opportunity` | Notice text (e-mail addresses and phone numbers removed) |
| `buyerName`, `buyerType`, `buyerLocality`, `buyerPostcode`, `buyerRegion` | `Midlands Partnership Foundation Trust`, `UKG2` | Contracting authority and its location (NUTS region on Find a Tender) |
| `procurementMethod`, `procurementMethodDetails`, `mainCategory` | `open`, `Open procedure`, `services` | How the contract is procured |
| `valueAmount`, `valueCurrency` | `400000`, `GBP` | Estimated value (lots summed when only lot values exist) |
| `mainCpv`, `mainCpvDescription`, `cpvCodes` | `45310000`, `Electrical installation work` | Common Procurement Vocabulary codes |
| `deliveryRegions` | `["UKI", "UKJ"]` | NUTS codes of delivery locations (Find a Tender) |
| `suitableForSme` | `true` | Marked suitable for SMEs (Contracts Finder) |
| `publishedAt`, `tenderDeadline`, `enquiryDeadline` | `2026-11-19T10:00:00Z` | Key dates (ISO 8601) |
| `contractStart`, `contractEnd`, `lotCount` | `2027-01-01T00:00:00Z` | Contract period and number of lots |
| `awardCount`, `totalAwardValue`, `awardedSuppliers` | `[{"name":"FM Conway Ltd","scale":"large"}]` | Award notices: number of awards, total value and winning **companies** |
| `withheldSupplierCount` | `0` | Winners not exported because they may be sole traders (personal data) |
| `noticeUrl`, `documentUrls` | `https://www.find-tender.service.gov.uk/Notice/…` | Official notice page and public tender documents |
| `scrapedAt` | `2026-10-18T10:20:26.468Z` | When the notice was fetched (UTC) |

### How to use

1. Choose **Sources** (both by default) and **Notice stages**: *Tender* for open opportunities, *Award* for contracts already won, *Planning* for the pipeline.
2. Optionally narrow down with **Keywords**, **CPV codes** (prefixes like `72` = IT services, `45` = construction), **NUTS regions** (e.g. `UKI` London, `UKM` Scotland) and a **value range**. Set **Published within (days)** (up to 90) and **Maximum number of results**.
3. Click **Start**, then download the results as CSV, Excel or JSON, or read them through the API.

Example input (open IT and software tenders over £100k from the last 14 days):

```json
{
    "stages": ["tender"],
    "publishedWithinDays": 14,
    "keywords": ["software", "digital", "cloud"],
    "cpvCodes": ["72", "48"],
    "minValue": 100000,
    "openOnly": true,
    "maxItems": 200
}
```

### Pricing

You pay per notice returned: **$3.00 per 1,000 notices** ($0.003 each), plus Apify's tiny per-run start fee. 100 notices cost about **$0.30**. You never pay more than the **Maximum cost per run** you set in the run options, and notices that don't match your filters are free.

On the Apify Free plan a run returns at most 100 notices.

### Example output

```json
[
  {
    "source": "find-a-tender",
    "noticeId": "098226-2026",
    "ocid": "ocds-h6vhtk-078a31",
    "stage": "tender",
    "title": "RRE-01284 - For the provision of a Digitally Enabled Children & Young People’s Mental Health Service (South Staffordshire)",
    "description": "We are seeking a Provider to work in partnership with, who will provide therapeutic interventions and a resource library via patient facing digital tools and platforms for Children, Young People and/or their parents or c…",
    "status": "active",
    "buyerName": "Midlands Partnership Foundation Trust",
    "buyerType": "Body governed by public law",
    "buyerLocality": "Stafford",
    "buyerPostcode": "ST16 3AG",
    "buyerRegion": "UKG2",
    "procurementMethod": "open",
    "procurementMethodDetails": "Open procedure",
    "mainCategory": "services",
    "valueAmount": null,
    "valueCurrency": null,
    "mainCpv": "85121270",
    "mainCpvDescription": "Psychiatrist or psychologist services",
    "cpvCodes": [
      "85121270"
    ],
    "deliveryRegions": [
      "UKG2"
    ],
    "suitableForSme": null,
    "publishedAt": "2026-10-16T21:36:55+01:00",
    "tenderDeadline": "2026-11-03T09:30:00Z",
    "enquiryDeadline": null,
    "contractStart": null,
    "contractEnd": null,
    "lotCount": 1,
    "awardCount": 0,
    "awardedSuppliers": [],
    "withheldSupplierCount": 0,
    "totalAwardValue": null,
    "noticeUrl": "https://www.find-tender.service.gov.uk/Notice/098226-2026",
    "documentUrls": [],
    "scrapedAt": "2026-10-18T10:20:26.468Z"
  },
  {
    "source": "find-a-tender",
    "noticeId": "098107-2026",
    "ocid": "ocds-h6vhtk-0789e8",
    "stage": "tender",
    "title": "British Sign Language Customer Information Service",
    "description": "RDG is looking to secure a supplier to deliver a National Rail British Sign Language solution that can consume approved industry data sources, process them and provide a BSL translation that the system's users can displa…",
    "status": "active",
    "buyerName": "Rail Delivery Group",
    "buyerType": "Public authority - sub-central government",
    "buyerLocality": "London",
    "buyerPostcode": "EC4V 3DS",
    "buyerRegion": "UKI31",
    "procurementMethod": "open",
    "procurementMethodDetails": "Competitive flexible procedure",
    "mainCategory": "services",
    "valueAmount": 1000000,
    "valueCurrency": "GBP",
    "mainCpv": "63711000",
    "mainCpvDescription": "Support services for railway transport",
    "cpvCodes": [
      "63711000"
    ],
    "deliveryRegions": [],
    "suitableForSme": null,
    "publishedAt": "2026-10-16T15:42:12+01:00",
    "tenderDeadline": "2026-12-08T12:00:00+00:00",
    "enquiryDeadline": null,
    "contractStart": "2027-04-01T00:00:00+01:00",
    "contractEnd": "2028-09-30T23:59:59+01:00",
    "lotCount": 1,
    "awardCount": 0,
    "awardedSuppliers": [],
    "withheldSupplierCount": 0,
    "totalAwardValue": null,
    "noticeUrl": "https://www.find-tender.service.gov.uk/Notice/098107-2026",
    "documentUrls": [],
    "scrapedAt": "2026-10-18T10:20:27.559Z"
  },
  {
    "source": "contracts-finder",
    "noticeId": "c56a2304-3495-4771-80c4-f6596cbabd45-917165",
    "ocid": "ocds-b5fd17-c4da7d4e-9b80-4024-a556-7954dfead045",
    "stage": "tender",
    "title": "Non-Planar Surface Characterisation and Swabbing Using the Spot Robot",
    "description": "The Contractor's scope shall include the design, development, functional demonstration, and delivery (including all required testing, verification, and documentation) of the Spot software suite for surface characterisati…",
    "status": "active",
    "buyerName": "UK Atomic Energy Authority",
    "buyerType": null,
    "buyerLocality": "Oxfordshire",
    "buyerPostcode": "OX14 3DB",
    "buyerRegion": null,
    "procurementMethod": "open",
    "procurementMethodDetails": "Open procedure",
    "mainCategory": "services",
    "valueAmount": null,
    "valueCurrency": null,
    "mainCpv": "72262000",
    "mainCpvDescription": "Software development services",
    "cpvCodes": [
      "72262000",
      "72230000",
      "73120000",
      "73430000"
    ],
    "deliveryRegions": [],
    "suitableForSme": true,
    "publishedAt": "2026-10-08T16:33:22+01:00",
    "tenderDeadline": "2026-10-29T12:00:00Z",
    "enquiryDeadline": null,
    "contractStart": "2026-10-30T00:00:00Z",
    "contractEnd": "2026-10-31T23:59:59Z",
    "lotCount": 0,
    "awardCount": 0,
    "awardedSuppliers": [],
    "withheldSupplierCount": 0,
    "totalAwardValue": null,
    "noticeUrl": "https://www.contractsfinder.service.gov.uk/Notice/c56a2304-3495-4771-80c4-f6596cbabd45",
    "documentUrls": [
      "https://uk.eu-supply.com/app/rfq/rwlentrance_s.asp?PID=109835&B=UKAEA",
      "https://uk.eu-supply.com/ctm/Company/CompanyInformation/Index/72814"
    ],
    "scrapedAt": "2026-10-18T10:20:37.363Z"
  },
  {
    "source": "contracts-finder",
    "noticeId": "e6d3a3a0-3d1e-49a4-b9b5-24d7cab498d1-918189",
    "ocid": "ocds-b5fd17-a2ba33df-84e9-45ec-a99e-60a4b1d1362a",
    "stage": "award",
    "title": "Build Back 5 Houses Farm Close",
    "description": "Build Back 5 Houses Farm Close",
    "status": "complete",
    "buyerName": "SOUTHERN HOUSING",
    "buyerType": null,
    "buyerLocality": "LONDON",
    "buyerPostcode": "CR09XP",
    "buyerRegion": null,
    "procurementMethod": "limited",
    "procurementMethodDetails": "Competitive quotation (below threshold)",
    "mainCategory": "works",
    "valueAmount": 1601593.56,
    "valueCurrency": "GBP",
    "mainCpv": "45211100",
    "mainCpvDescription": "Construction work for houses",
    "cpvCodes": [
      "45211100"
    ],
    "deliveryRegions": [
      "East Midlands",
      "West Midlands",
      "London",
      "South East",
      "South West"
    ],
    "suitableForSme": true,
    "publishedAt": "2026-10-16T14:09:30+01:00",
    "tenderDeadline": "2025-03-21T13:00:00Z",
    "enquiryDeadline": null,
    "contractStart": "2026-09-16T00:00:00+01:00",
    "contractEnd": "2027-10-16T23:59:59+01:00",
    "lotCount": 0,
    "awardCount": 1,
    "awardedSuppliers": [
      {
        "name": "BONDS BUILDERS AND CONTRACTORS LIMITED",
        "companyNumber": "02973643",
        "scale": "sme"
      }
    ],
    "withheldSupplierCount": 0,
    "totalAwardValue": 1601593.56,
    "noticeUrl": "https://www.contractsfinder.service.gov.uk/Notice/e6d3a3a0-3d1e-49a4-b9b5-24d7cab498d1",
    "documentUrls": [],
    "scrapedAt": "2026-10-18T10:27:32.319Z"
  },
  {
    "source": "contracts-finder",
    "noticeId": "4c9c11b5-2371-44fa-8add-991b9da5db33-918142",
    "ocid": "ocds-b5fd17-29dc5752-d071-48a1-8285-2278f4d8c70d",
    "stage": "award",
    "title": "PDF Framework - Area 3 - SDF - Rapid Response - Tranche 1",
    "description": "PDF Framework - Area 3 - SDF - Rapid Response - Tranche 1",
    "status": "complete",
    "buyerName": "National Highways Limited",
    "buyerType": null,
    "buyerLocality": "Annesley",
    "buyerPostcode": "NG15 0DS",
    "buyerRegion": null,
    "procurementMethod": "selective",
    "procurementMethodDetails": "Call-off from a framework agreement",
    "mainCategory": "works",
    "valueAmount": 1339155.98,
    "valueCurrency": "GBP",
    "mainCpv": "45233210",
    "mainCpvDescription": "Surface work for highways",
    "cpvCodes": [
      "45233210"
    ],
    "deliveryRegions": [],
    "suitableForSme": false,
    "publishedAt": "2026-10-16T10:54:40+01:00",
    "tenderDeadline": "2026-09-22T12:00:00+01:00",
    "enquiryDeadline": null,
    "contractStart": "2026-09-23T00:00:00+01:00",
    "contractEnd": "2027-03-31T23:59:59+01:00",
    "lotCount": 0,
    "awardCount": 1,
    "awardedSuppliers": [
      {
        "name": "FM Conway Ltd",
        "companyNumber": null,
        "scale": "large"
      }
    ],
    "withheldSupplierCount": 0,
    "totalAwardValue": 1339155.98,
    "noticeUrl": "https://www.contractsfinder.service.gov.uk/Notice/4c9c11b5-2371-44fa-8add-991b9da5db33",
    "documentUrls": [],
    "scrapedAt": "2026-10-18T10:27:32.319Z"
  }
]
```

### Use cases

- **Bid teams and SMEs:** a daily list of new tenders in your CPV codes and regions, straight into a spreadsheet or CRM.
- **Market intelligence:** who buys what, at which values, in which regions; track a buyer's pipeline from planning to award.
- **Competitor tracking:** see which companies win contracts in your sector and for how much (award stage).
- **Consultancies and bid writers:** monitor opportunities for several clients with one scheduled run each.
- **Research and journalism:** analyse UK public spending patterns using the official open data.

### Integrations

- **API:** start runs and fetch results with the [Apify API](https://docs.apify.com/api/v2) or the Apify JavaScript/Python clients.
- **Scheduling:** run every morning with Apify Schedules (e.g. `publishedWithinDays: 1`) to get only new notices.
- **Webhooks:** get notified or trigger your own pipeline when a run finishes.
- **Google Sheets, Make, Zapier, n8n, Slack:** send results to your tools via Apify integrations.
- **AI agents (MCP):** let Claude, ChatGPT or any MCP client search UK tenders through the [Apify MCP server](https://mcp.apify.com).

### Limits and FAQ

**Is this legal?** The data is published by the UK Government as open data under the Open Government Licence v3.0. The Actor exports no personal data: named contact persons, their e-mail addresses and phone numbers are never exported, e-mails and phone numbers are removed from descriptions, and winning suppliers are only named when they are registered companies or public bodies. You remain responsible for using the data in line with the licence and applicable law, including the UK GDPR.

**How fast is it?** Small runs take a few seconds. Both government APIs limit how fast anyone may request data, and the Actor respects that: it paces requests and, when an API asks it to wait (usually 2 minutes), it waits and then continues. Keyword searches over long periods scan every notice in the period, so a 14-day keyword search can take a few minutes. Narrow date ranges are fastest.

**Why do keyword searches scan so many notices?** The official APIs have no keyword or CPV filter, so the Actor reads all notices in your date range and filters them for you. You only pay for the notices that match.

**Why are some regions empty?** Contracts Finder notices carry postcodes but no NUTS region, so the region filter only matches Find a Tender notices.

**Why is a supplier name missing?** Award winners that may be sole traders are counted in `withheldSupplierCount` instead of being named, because a sole trader's name is personal data.

**Something broke?** Open an issue on the Issues tab with your input and it will be looked at promptly.

### Changelog / maintained

Last verified working: 2026-10-18. See the changelog tab for changes.

# Changelog

This Actor's version history is a separate document: https://apify.com/polderdata/uk-tenders-scraper/changelog.md

# Actor input Schema

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

Which official UK procurement services to read. 'find-a-tender' is Find a Tender (the central UK service, most notices since 2025); 'contracts-finder' is Contracts Finder (England, lower-value notices).

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

'tender' = open opportunities you can bid on; 'award' = contracts already awarded (with winning companies and values); 'planning' = early market engagement / pipeline notices.

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

Only notices published (Contracts Finder) or updated (Find a Tender) in the last N days (1–90). Shorter ranges run faster: the government APIs limit request rates.

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

Keep notices whose title or description contains at least one of these words or phrases (case-insensitive), e.g. "software", "cleaning", "electrical maintenance". Empty = no keyword filter.

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

Common Procurement Vocabulary codes. A prefix matches all codes below it: "72" = IT services, "45" = construction work, "90" = cleaning/environmental services, "79" = business services. Empty = all.

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

UK NUTS codes or prefixes for the buyer or delivery location, e.g. "UKI" London, "UKM" Scotland, "UKL" Wales, "UKN" Northern Ireland, "UKD" North West England. Only Find a Tender notices carry regions. Empty = all.

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

Only notices with an estimated (or awarded) value of at least this amount. Notices without a value are excluded when this is set.

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

Only notices with an estimated (or awarded) value of at most this amount. Notices without a value are excluded when this is set.

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

For tender notices, keep only those whose submission deadline is in the future. Has no effect on award or planning notices.

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

The run stops after this many notices. You pay per result, so this also caps the cost of a run.

## Actor input object example

```json
{
  "sources": [
    "find-a-tender",
    "contracts-finder"
  ],
  "stages": [
    "tender"
  ],
  "publishedWithinDays": 3,
  "keywords": [],
  "cpvCodes": [],
  "regions": [],
  "openOnly": true,
  "maxItems": 20
}
```

# Actor output Schema

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

No description

## `runSummary` (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 = {
    "sources": [
        "find-a-tender",
        "contracts-finder"
    ],
    "stages": [
        "tender"
    ],
    "publishedWithinDays": 3,
    "keywords": [],
    "cpvCodes": [],
    "regions": [],
    "openOnly": true,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("polderdata/uk-tenders-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 = {
    "sources": [
        "find-a-tender",
        "contracts-finder",
    ],
    "stages": ["tender"],
    "publishedWithinDays": 3,
    "keywords": [],
    "cpvCodes": [],
    "regions": [],
    "openOnly": True,
    "maxItems": 20,
}

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

```

## MCP server setup

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