# UK Tenders Scraper - Find a Tender + Contracts Finder (`orzelcolony/uk-public-tenders`) Actor

UK government tenders, contract awards and pipeline notices from Find a Tender and Contracts Finder via the official OCDS APIs. Filter by keyword, CPV, region, buyer, deadline, value and SME flag; monitor daily. Clean JSON with buyer contacts, values, deadlines and winning suppliers.

- **URL**: https://apify.com/orzelcolony/uk-public-tenders.md
- **Developed by:** [Orzel](https://apify.com/orzelcolony) (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.50 / 1,000 tender notices

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 Public Tenders – Find a Tender + Contracts Finder (official data)

Search, filter and monitor **UK government tenders, contract awards and procurement pipelines** from the two official notice services and get them as clean, flat JSON:

- **Find a Tender** (FTS): above-threshold notices from all four UK nations under the Procurement Act 2023 and the legacy regimes, typically 300–600 notices per working day.
- **Contracts Finder** (CF): lower-value opportunities and awards from the English public sector (central government, councils, NHS, universities, police, housing), typically 100–300 per working day.

The Actor reads the **official OCDS APIs** of both services (Open Contracting Data Standard, published under the Open Government Licence). No HTML scraping, no proxies, no login, no API key, nothing blocked and nothing missed: what the services publish, you get, usually within the hour.

### What you can do with it

- **Find open tenders** in your sector and region before the deadline: CPV `72` (IT services) in London (`UKI`), open only, suitable for SMEs.
- **Monitor new notices daily**: set a *monitor name*, schedule the task, and every run returns only the notices you have not received before. Send them to Slack, email, Google Sheets or your CRM with Apify integrations.
- **Win/loss intelligence**: contract awards with the winning suppliers (name, Companies House number, SME flag), the awarded value and the contract period.
- **B2G lead generation**: buyer name, type, address, contact name, email, phone and website as published in the notice.
- **Pipeline research**: planning and pipeline notices tell you what public bodies intend to buy months ahead.
- **Datasets**: thousands of notices per run with CPV codes, regions, values, procedures and deadlines for market analysis.

### Input

All filters are optional and combine with AND. Leave everything empty to get the newest notices of the last 7 days from both services.

| Field | Description |
| --- | --- |
| `sources` | `find-a-tender`, `contracts-finder` or both (default). |
| `noticeCategories` | `tender` (opportunities), `award` (contract awards and contract notices), `planning` (pipeline, planned procurement, early engagement). |
| `keywords` / `keywordMode` | Words or phrases matched against title and description; *any* or *all*. |
| `cpvCodes` | CPV codes; 8 digits match exactly, shorter prefixes match the whole group (`72` = IT, `45` = construction, `33` = medical, `79` = business services, `90` = environmental, `80` = education). |
| `regions` | NUTS/ITL code prefixes (`UKI` London, `UKE` Yorkshire, `UKM` Scotland, `UKL` Wales, `UKN` Northern Ireland, `UKJ` South East) or Contracts Finder region names (`London`, `North West`). |
| `buyerNames` | Only buyers whose name contains one of these texts (`NHS`, `Council`, `Ministry of Defence`). |
| `publishedAfter` / `publishedBefore` | Publication window, YYYY-MM-DD (default: last `daysBack` days, up to 400 days per run). |
| `daysBack` | Days to scan when `publishedAfter` is empty (default 7). Use 1-2 with Find a Tender and narrow filters: that API allows about 12 requests per 2 minutes, so each day of Find a Tender costs about a minute. |

Where the notices are: since the Procurement Act 2023 went live (February 2025), new tender notices are published on **Find a Tender**; **Contracts Finder** now carries mostly contract awards and below-threshold notices (in a typical week: about 630 awards and 30 tenders). For open tenders use Find a Tender with a short window; for award research Contracts Finder alone is fast.
| `openOnly` | Only opportunities whose submission deadline has not passed. |
| `deadlineAfter` / `deadlineBefore` | Submission deadline window. |
| `minValue` / `maxValue` | Estimated value (awarded value for awards) in GBP. |
| `smeOnly` | Only notices flagged as suitable for small and medium enterprises. |
| `excludeUpdates` | Drop releases that only amend, update or cancel an earlier notice. |
| `procurementMethods` | `open`, `selective`, `limited`, `direct`. |
| `maxItems` | How many notices to return, newest first (default 100, up to 20,000). |
| `monitorName` | Any name. With a key set, each run only returns notices not delivered under that key before. |
| `includeRaw` | Attach the original OCDS release. |

Example – open IT opportunities in London and the South East, SME-suitable, worth GBP 100k or more:

```json
{
  "noticeCategories": ["tender"],
  "cpvCodes": ["72", "48"],
  "regions": ["UKI", "UKJ", "London", "South East"],
  "openOnly": true,
  "smeOnly": true,
  "minValue": 100000,
  "maxItems": 200
}
```

Example – who won construction contracts last month:

```json
{
  "noticeCategories": ["award"],
  "cpvCodes": ["45"],
  "publishedAfter": "2026-09-01",
  "publishedBefore": "2026-09-30",
  "excludeUpdates": true,
  "maxItems": 2000
}
```

### Output

One dataset item per notice:

```json
{
  "noticeId": "097662-2026",
  "ocid": "ocds-h6vhtk-0788ee",
  "source": "find-a-tender",
  "noticeUrl": "https://www.find-tender.service.gov.uk/Notice/097662-2026",
  "publishedDate": "2026-10-15",
  "publishedAt": "2026-10-15T17:03:39+01:00",
  "noticeCategory": "tender",
  "noticeKind": "tender",
  "isUpdate": false,
  "tags": ["tender"],
  "title": "Tyres, Tubes and Associated Services",
  "description": "This framework is for the supply and fit of tyres ...",
  "status": "active",
  "procurementMethod": "open",
  "procurementMethodDetails": "Open procedure",
  "mainProcurementCategory": "goods",
  "cpvCodes": ["34350000", "34351000", "34351100", "34352000", "34352100"],
  "cpvDescriptions": ["Tyres for heavy/light-duty vehicles", "Light-duty tyres", "..."],
  "deliveryRegions": ["UKE12"],
  "estimatedValue": 1000000.0,
  "estimatedValueGross": 1200000.0,
  "estimatedValueCurrency": "GBP",
  "minValue": null,
  "deadlineDate": "2026-11-10",
  "deadlineAt": "2026-11-10T12:00:00+00:00",
  "enquiryDeadlineAt": "2026-11-03T17:00:00+00:00",
  "contractStartDate": "2027-02-01",
  "contractEndDate": "2031-01-31",
  "frameworkAgreement": true,
  "aboveThreshold": true,
  "smeSuitable": true,
  "vcseSuitable": null,
  "lotCount": 1,
  "lotTitles": [],
  "buyerName": "East Riding of Yorkshire Council",
  "buyerId": "GB-PPON-PZQH-9124-TMLN",
  "buyerType": "Public authority - sub-central government",
  "buyerAddress": "County Hall, Cross Street,",
  "buyerCity": "Beverley",
  "buyerPostcode": "HU17 9BA",
  "buyerRegionCode": "UKE12",
  "buyerCountry": "United Kingdom",
  "buyerContactName": "Sophie Williams",
  "buyerEmail": "sophie.williams@eastriding.gov.uk",
  "buyerPhone": "+44 1482395021",
  "buyerWebsite": "https://www.eastriding.gov.uk",
  "submissionUrl": "https://uk.eu-supply.com/app/rfq/rwlentrance_s.asp?PID=107959",
  "documents": [{"type": "tenderNotice", "description": "Tender notice on Find a Tender", "url": "https://www.find-tender.service.gov.uk/Notice/097662-2026"}],
  "awardCount": null,
  "awardDate": null,
  "awardedValue": null,
  "awardedValueCurrency": null,
  "supplierNames": [],
  "supplierIds": [],
  "supplierCompanyNumbers": [],
  "supplierScale": null,
  "legalBasis": "2023/54",
  "language": "en",
  "fetchedAt": "2026-10-16T18:02:11Z"
}
```

Award notices fill `awardCount`, `awardDate`, `awardedValue`, `supplierNames`, `supplierIds`, `supplierCompanyNumbers` (Companies House numbers where the service publishes them) and `supplierScale` (`sme`, `large`, `micro`).

`noticeCategory` is the coarse type (`tender`, `award`, `planning`); `noticeKind` is the exact OCDS tag (`tender`, `tenderUpdate`, `tenderCancellation`, `award`, `contract`, `contractAmendment`, `planning`, ...), and `isUpdate` is true for releases that only amend or cancel an earlier notice. Two-stage procedures (restricted, competitive flexible) sometimes publish a deadline for requests to participate instead of a tender deadline; `deadlineDate` is then empty and the date is in the notice text.

### Pricing

The current price is always shown on the **Pricing tab** of this page. The Actor is priced per **notice returned** (or free while no per-notice price is listed) and uses no proxies and no browser, so platform usage is negligible. Find a Tender allows only about six API requests per minute (100 notices each), so the Actor paces itself: a single day of both services is read in about a minute, a full week in roughly 6–8 minutes. Use `maxItems`, the date window and the run's spending limit to control cost. Notices that do not match your filters are never charged.

### Notes and limits

- Data sources: the official OCDS release APIs of Find a Tender (`find-tender.service.gov.uk/api/1.0`) and Contracts Finder (`contractsfinder.service.gov.uk/Published/Notices/OCDS`). Both publish under the Open Government Licence v3.0, which allows commercial reuse with attribution.
- The APIs only filter by date; all other filters are applied by the Actor, so a run scans whole days of notices (about 400–900 per working day across both services) newest first and stops once `maxItems` matches are found. Narrow the date window for narrow filters, or use `monitorName` on a daily schedule so each run only reads one or two days.
- Run timeout: the Actor watches its own run timeout. When the next paced request or rate-limit pause would run past it, it stops fetching and finishes **successfully** with the notices delivered so far (the status message says so). A whole week with narrow filters needs a timeout of 10 minutes or more; the default Apify timeout is plenty for the default input.
- Buyer contact details are the official contact points the authority published for supplier enquiries; use them responsibly and respect applicable data-protection law.
- Devolved Scottish (Public Contracts Scotland), Welsh (Sell2Wales) and Northern Irish (eTendersNI) portals publish their above-threshold notices on Find a Tender, which this Actor covers; their below-threshold notices are not on Contracts Finder.

### Integrations and API

Run it on a schedule, use the Apify API, webhooks or the Apify MCP server from any AI agent, and export to JSON, CSV, Excel, Google Sheets or your database. Questions or a field you need added: open an issue in the Issues tab and it will be answered within days.

# Actor input Schema

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

Find a Tender = above-threshold notices (Procurement Act 2023 and legacy regimes), all four UK nations. Contracts Finder = lower-value English public sector opportunities and awards. Default: both.

## `noticeCategories` (type: `array`):

tender = opportunities (calls for tender, including updates/amendments); award = contract awards and contract notices (who won, for how much); planning = pipeline, planned procurement and early engagement notices. Empty = all.

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

Words or phrases matched (case-insensitive) against the notice title and description, e.g. "software", "cloud", "road maintenance", "catering". Narrow keywords over many days mean more pages to read (Find a Tender allows about one request per 10 s), so combine them with a short date window or a monitor name.

## `keywordMode` (type: `string`):

Match notices containing ANY of the keywords, or ALL of them.

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

Common Procurement Vocabulary codes. Full 8-digit codes match exactly; shorter prefixes match the whole group, e.g. 72 = IT services, 45 = construction, 33 = medical, 79 = business services, 90 = environmental.

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

Delivery region: a NUTS/ITL code prefix (UKI = London, UKE = Yorkshire, UKM = Scotland, UKL = Wales, UKN = Northern Ireland) or part of a region name used by Contracts Finder ("London", "North West", "South East", "Yorkshire"). Matched against delivery regions and the buyer's region.

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

Only notices whose contracting authority name contains one of these texts, e.g. "NHS", "Council", "Ministry of Defence", "University".

## `publishedAfter` (type: `string`):

Earliest publication date, YYYY-MM-DD. Default: 7 days ago. Up to 400 days per run.

## `publishedBefore` (type: `string`):

Latest publication date, YYYY-MM-DD. Default: today.

## `daysBack` (type: `integer`):

How many days (ending at 'Published before') to scan when 'Published after' is empty. Default 7. Use 1-2 with Find a Tender and narrow filters: that API allows about 12 requests per 2 minutes, so each day of Find a Tender costs about a minute.

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

Only tender notices whose submission deadline has not passed yet.

## `deadlineAfter` (type: `string`):

Only notices with a tender deadline on or after this date, YYYY-MM-DD.

## `deadlineBefore` (type: `string`):

Only notices with a tender deadline on or before this date, YYYY-MM-DD.

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

Only notices with an estimated (or, for awards, awarded) value at or above this amount. Notices without any value are dropped when a value filter is set.

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

Only notices with an estimated (or awarded) value at or below this amount.

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

Only notices the buyer flagged as suitable for small and medium enterprises.

## `excludeUpdates` (type: `boolean`):

Drop releases that only change, amend or cancel an earlier notice, so you get each opportunity or award once. Keep them when monitoring deadlines and cancellations.

## `procurementMethods` (type: `array`):

OCDS procurement method: open, selective, limited, direct.

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

Maximum number of notices to return (newest first).

## `monitorName` (type: `string`):

Set any name, e.g. 'it-tenders-london', and schedule the task: each run then returns only notices not delivered under this key before. Leave empty to disable.

## `includeRaw` (type: `boolean`):

Attach the original OCDS release under 'raw' (large).

## Actor input object example

```json
{
  "sources": [
    "find-a-tender",
    "contracts-finder"
  ],
  "keywordMode": "any",
  "daysBack": 7,
  "openOnly": false,
  "smeOnly": false,
  "excludeUpdates": false,
  "maxItems": 100,
  "includeRaw": false
}
```

# Actor output Schema

## `notices` (type: `string`):

JSON array of UK procurement notices (buyer contacts, title, CPV, region, deadline, value, winning suppliers) matching the input filters.

# 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"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("orzelcolony/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 = { "sources": [
        "find-a-tender",
        "contracts-finder",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("orzelcolony/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 '{
  "sources": [
    "find-a-tender",
    "contracts-finder"
  ]
}' |
apify call orzelcolony/uk-public-tenders --silent --output-dataset

```

## MCP server setup

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