# UK Public Tenders: Find a Tender & Contracts Finder Procurement (`nexus-scrapers/uk-public-tenders`) Actor

Scrape UK public tenders, government contracts and procurement notices from Find a Tender (FTS) and Contracts Finder in one run. Search by keyword, CPV code, region, value or deadline, with buyers, awards, suppliers and document links. JSON, CSV or Excel. No API key, no login.

- **URL**: https://apify.com/nexus-scrapers/uk-public-tenders.md
- **Developed by:** [Nexus Scrapers](https://apify.com/nexus-scrapers) (community)
- **Categories:** Lead generation, Business, AI
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 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.

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 Scraper - Find a Tender & Contracts Finder Procurement Notices

Search and export **UK public tenders and procurement notices** from the two official UK sources, **Find a Tender** and **Contracts Finder**, as clean, normalized JSON, CSV or Excel. Filter by keyword, **CPV code**, notice type (tender, award, planning), publication date, value and region. Every CPV code comes with its **official CPV 2008 label**. The same procurement published on both services is returned once. No API key, no proxy, no browser and no login needed.

The Actor reads the official **OCDS (Open Contracting Data Standard) APIs** of the UK government. Each result follows the same **tender schema v1** used by the other Actors of this procurement family (EU TED, and more to come), so UK and EU tenders can be loaded into one table.

### Who is it for

- **Bid managers and sales teams** selling to the UK public sector who need a daily list of open tenders in their sector (CPV), region and value band, with the deadline.
- **Consultants, analysts and market researchers** measuring public spending by buyer, region or sector, and tracking who wins which contract.
- **Suppliers and SMEs** looking for opportunities flagged as suitable for small businesses, and for the buyers that regularly purchase what they sell.
- **AI agents and MCP users**: the dataset schema describes every field, so an agent can query UK tenders in plain language (see [API, MCP and AI agents](#api-mcp-and-ai-agents)).

### What you get

One dataset item per notice, with:

- notice id, type (tender, planning, award, contract change, ...), the official notice code (`UK4`, `UK6`, ...) and procedure type
- title and description, buyer name, city, region and buyer type
- all CPV codes with their official CPV 2008 label (24 EU languages), plus main CPV and its division
- estimated value and currency (GBP), number of lots, publication date and submission deadline
- for award notices: **winning suppliers**, awarded value and award date
- delivery regions, SME / VCSE suitability, framework flag, the buyer's own reference
- links to the official notice page and to the OCDS JSON; the OCDS process id (`ukOcid`) links the planning, tender and award notices of one procurement

Contact names, e-mail addresses and phone numbers are **not** collected: only official, organisation-level fields.

The full field reference is in [SCHEMA.md](./SCHEMA.md) and in the Actor's dataset schema (visible in the Apify UI and to AI agents using MCP).

### Sources

| Source | Covers | Notice types |
|---|---|---|
| [Find a Tender](https://www.find-tender.service.gov.uk) (`find-a-tender`) | The UK-wide service for above-threshold procurement; since the Procurement Act 2023 came into force (24 February 2025) it also publishes many other notices, including below-threshold awards and direct-award transparency notices | UK1-UK15: pipeline, preliminary market engagement, planned procurement, tender, transparency, contract award, contract details, contract change, termination, dynamic market notices |
| [Contracts Finder](https://www.contractsfinder.service.gov.uk) (`contracts-finder`) | Below-threshold opportunities and awards of English buyers, and central government | planning, tender (and amendments), award |

### Use cases

- **Bid monitoring**: new open tenders in your CPV codes, regions and value band every morning. Schedule the Actor and send the dataset to Slack, e-mail or a spreadsheet.
- **Market research**: how much a buyer, region or sector spends, which procedures it uses, how often it publishes.
- **Competitor and award tracking**: contract awards with the winning companies and awarded values.
- **Pipeline intelligence**: pipeline and planned-procurement notices tell you what a buyer will tender months before the call.
- **AI agents (MCP)**: ask in natural language, get structured notices back.

### Input

All filters are optional and are combined with AND.

| Field | Description |
|---|---|
| `sources` | `find-a-tender`, `contracts-finder` (both by default) |
| `keyword` | Word or phrase in the title, description or buyer name; separate alternatives with commas |
| `cpvCodes` | CPV codes with prefix matching: `72` or `72000000` = all IT services |
| `noticeTypes` | `contract-notice` (default), `prior-information`, `contract-award`, `contract-modification`, `other`. Empty list = all |
| `daysBack` | Published in the last N days (default 7; 0 = no limit) |
| `dateFrom` / `dateTo` | Explicit publication date range, `YYYY-MM-DD` (override `daysBack`) |
| `minValue` / `maxValue` | Value range in GBP (estimated value; awarded value for award notices). Notices without a value are excluded when set |
| `regions` | English regions, `Wales`, `Scotland`, `Northern Ireland`, `England (nationwide)`, `UK-wide` |
| `maxItems` | Maximum results (default 20, maximum 10,000, newest first) |
| `cpvLabelLanguage` | Language of `cpvCodes[].label`: any of the 24 EU languages, default `en` |

#### Example: open IT-services tenders in London and the South East

```json
{
  "noticeTypes": ["contract-notice"],
  "cpvCodes": ["72"],
  "regions": ["London", "South East"],
  "daysBack": 14,
  "maxItems": 100
}
```

#### Example: keyword search across both sources

```json
{
  "keyword": "cyber security, penetration testing",
  "daysBack": 30,
  "maxItems": 50
}
```

#### Example: who won large construction contracts

```json
{
  "noticeTypes": ["contract-award"],
  "cpvCodes": ["45"],
  "minValue": 1000000,
  "dateFrom": "2026-09-01",
  "dateTo": "2026-09-30",
  "maxItems": 200
}
```

#### Example: what buyers plan to tender (pipeline)

```json
{
  "noticeTypes": ["prior-information"],
  "sources": ["find-a-tender"],
  "keyword": "digital",
  "daysBack": 60,
  "maxItems": 100
}
```

### Output example

Real record (tender notice published on Find a Tender on 3 November 2026), description shortened:

```json
{
  "schemaVersion": "1.0",
  "source": "find-a-tender",
  "sourceId": "104449-2026",
  "url": "https://www.find-tender.service.gov.uk/Notice/104449-2026",
  "documentUrls": { "html": "https://www.find-tender.service.gov.uk/Notice/104449-2026", "pdf": null, "xml": null },
  "noticeType": "contract-notice",
  "noticeTypeCode": "UK4",
  "procedureType": "open",
  "contractNature": "services",
  "title": "Welfare Advice Services and Advice Network Support & Training Services",
  "description": "The City of Bradford Metropolitan District Council is procuring Welfare Advice Services and Advice Network Support and Training Services to support residents experiencing financial hardship…",
  "language": "en",
  "buyer": {
    "name": "City of Bradford Metropolitan District Council",
    "country": "GB",
    "city": "Bradford",
    "nutsCode": "UKE41",
    "buyerType": "central-government"
  },
  "cpvCodes": [
    { "code": "85312400", "label": "Welfare services not delivered through residential institutions" },
    { "code": "85311100", "label": "Welfare services for the elderly" }
  ],
  "mainCpv": "85312400",
  "mainCpvDivision": "Health and social work services",
  "estimatedValue": { "amount": 21102592, "currency": "GBP" },
  "lots": 1,
  "publicationDate": "2026-11-03",
  "submissionDeadline": "2026-12-04T17:00:00+00:00",
  "awardInfo": null,
  "placeOfPerformance": { "country": "GB", "city": null, "nutsCode": "UKE41" },
  "scrapedAt": "2026-11-03T23:26:11+00:00",
  "ukOcid": "ocds-h6vhtk-07971f",
  "ukBuyerReference": "CBMC-PTR-291-2026-27",
  "ukProcurementMethodDetails": "Open procedure",
  "ukRegions": ["Yorkshire and the Humber"],
  "ukAboveThreshold": true,
  "ukFramework": null,
  "ukSuitability": { "sme": true, "vcse": true },
  "ukOcdsUrl": "https://www.find-tender.service.gov.uk/api/1.0/ocdsReleasePackages/104449-2026",
  "ukAlsoPublishedOn": []
}
```

For award notices `awardInfo` is filled, for example:

```json
"awardInfo": {
  "winners": [{ "name": "D&G Bus", "country": "GB" }],
  "awardedValue": { "amount": 2272776, "currency": "GBP" },
  "awardDate": "2026-08-03"
}
```

Fields starting with `uk` are UK-specific extras; all other fields are shared with the other procurement Actors.

### Pricing

Pay only for the results you get. Set **Maximum results** (and the run's maximum cost) to control spending: the Actor stops as soon as either limit is reached. Runs that find no notices return no results and charge nothing. See the Pricing tab of this Actor for the current price.

### API, MCP and AI agents

Every Apify Actor can be called over the API, and this one is also available as a tool for AI agents.

**Apify API (Python)**

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("nexus-scrapers/uk-public-tenders").call(run_input={
    "cpvCodes": ["72"], "regions": ["London"], "daysBack": 7, "maxItems": 50,
})
for tender in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(tender["publicationDate"], tender["buyer"]["name"], tender["title"])
```

**Apify API (JavaScript)**

```js
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });
const run = await client.actor('nexus-scrapers/uk-public-tenders').call({ keyword: 'cybersecurity', maxItems: 50 });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
```

**MCP and AI agents.** Apify exposes Actors as MCP tools through the [Apify MCP server](https://mcp.apify.com). Add `https://mcp.apify.com` (with `?actors=nexus-scrapers/uk-public-tenders` to load this Actor directly) to Claude, ChatGPT-compatible clients, Cursor, VS Code or any MCP client, authorize with your Apify account, and ask in plain language, for example: "List open IT tenders in London published this week with a value above 100,000 pounds" or "Who won cleaning contracts in Scotland last month?". The input and dataset schemas tell the agent every parameter and output field. Also works with LangChain, LlamaIndex, CrewAI and n8n through the Apify integrations.

### FAQ

**Do I need an API key?** No. Both services publish their OCDS data openly, without registration.

**Is the data official?** Yes. It comes straight from the OCDS APIs of Find a Tender and Contracts Finder, run by the Cabinet Office (Government Commercial Function). Every record links to the official notice.

**What is the difference between the two sources?** Find a Tender is the central UK service: above-threshold procurement for the whole UK and, since the Procurement Act 2023 regime started (24 February 2025), also many other notice types. Contracts Finder covers below-threshold opportunities and awards of English buyers and central government. The Actor reads both and merges duplicates.

**What is a CPV code?** The Common Procurement Vocabulary is the standard classification of what is being bought (for example `72000000` = IT services, `45000000` = construction work). Filters match by prefix: `72` matches every IT-services code. The Actor adds the official label for every code, in any of the 24 EU languages (`cpvLabelLanguage`).

**How are duplicates handled?** If the same notice (same buyer, same title or buyer reference, same notice type) is found on both sources, one record is returned: the Find a Tender one, with the Contracts Finder page listed in `ukAlsoPublishedOn`.

**What do the notice types mean?** `contract-notice` = tender notice (UK4) or Contracts Finder tender; `prior-information` = pipeline, planned procurement and preliminary market engagement; `contract-award` = contract award (UK6), contract details (UK7), transparency / direct award (UK5) and Contracts Finder awards; `contract-modification` = contract change notice (UK10); `other` = terminations, performance and dynamic market notices. The exact UK code is in `noticeTypeCode`.

**How fresh is the data?** The Actor queries the services live, so new notices appear as soon as they are published; the publication date is in every record.

**Why are some fields `null`?** Notices differ by type and age. Award notices have no estimated value, tenders have no `awardInfo`, Contracts Finder does not publish lots, buyer type or NUTS codes, and many notices state no delivery region.

**Is the value in pounds?** Yes, in the currency of the notice (GBP); no conversion is applied. Values are net of VAT when the notice gives both.

**How many results can I get?** Up to 10,000 per run. The Actor reads at most 60 pages (6,000 notices) per source per run; for rare keywords over long periods split the search by date range. A run says in its status message when it stopped early.

**Can I get the tender documents?** No. The Actor returns notice data and links. Documents are hosted by each buyer's e-sourcing portal.

**Does it include contact details?** No. Contact names, e-mail addresses and phone numbers in the source are intentionally left out; use the official notice link if you need to contact the buyer.

### Data source, attribution and terms

Contains public sector information licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/). Notice data comes from [Find a Tender](https://www.find-tender.service.gov.uk) and [Contracts Finder](https://www.contractsfinder.service.gov.uk), provided by the Cabinet Office through their OCDS APIs. Under the OGL you may copy, publish, distribute, adapt and use the data commercially provided you acknowledge the source, as above. CPV labels come from the Common Procurement Vocabulary (CPV 2008, Regulation (EC) No 213/2008) published by the Publications Office of the European Union through [EU Vocabularies](https://op.europa.eu/en/web/eu-vocabularies/dataset/-/resource?uri=http://publications.europa.eu/resource/dataset/cpv); the labels are bundled unmodified except for whitespace normalisation. This Actor is an independent tool and is not affiliated with or endorsed by the UK Government or the European Union. The Actor accesses the services politely (descriptive User-Agent, request pacing, back-off on rate limits) and honours the rate limits published in their API documentation.

### Limitations

- Only notices published on Find a Tender and Contracts Finder are covered. Scotland (Public Contracts Scotland), Wales (Sell2Wales) and Northern Ireland (eSourcing NI) publish their own below-threshold notices elsewhere; above-threshold ones appear on Find a Tender, and some Scottish notices are mirrored there.
- The two APIs only filter by date; keyword, CPV, value, region and notice-type filters are applied by the Actor, so selective searches over long date ranges read many pages (limit: 60 pages per source and run).
- Region filtering depends on the delivery region stated in the notice; notices without a region are excluded when `regions` is set.
- Value filters compare the estimated value (awarded value for awards) and exclude notices without a value.
- When several lots or suppliers of one award carry the same value (a shared framework ceiling), it is counted once, otherwise values are summed.
- Buyer type and NUTS code are only available on Find a Tender; the buyer type is as declared by the buyer in the notice.
- Find a Tender notices published under the old Public Contracts Regulations 2015 have no UK notice code (`noticeTypeCode` is `null`) and are typed from their OCDS stage.
- The services rate-limit heavy use. The Actor waits and retries; if a service keeps refusing, the run keeps the notices already read from the other source and says so in the status message.

# Actor input Schema

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

Which official UK sources to read. Both are used by default; the same notice published on both is returned once.

## `keyword` (type: `string`):

Word or phrase that must appear in the title, description or buyer name (case-insensitive). Separate alternatives with a comma: 'solar, photovoltaic' matches either. Leave empty to search everything.

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

Common Procurement Vocabulary codes with prefix matching: '72' or '72000000' matches every IT-services code, '7221' matches 7221xxxx. A notice matches if any of its CPV codes matches.

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

Which kinds of notices to return. Leave empty for all types. Use 'Tender / contract notices' for opportunities you can bid on and 'Awards' to see who won.

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

Only notices published in the last N days. Ignored if 'Published from' or 'Published to' is set. Use 0 for no date limit (results are always newest first).

## `dateFrom` (type: `string`):

Earliest publication date, format YYYY-MM-DD. Overrides 'last N days'.

## `dateTo` (type: `string`):

Latest publication date (inclusive), format YYYY-MM-DD.

## `minValue` (type: `number`):

Minimum estimated value (awarded value for award notices), in the notice currency (GBP). Notices without a published value are excluded when a value filter is set.

## `maxValue` (type: `number`):

Maximum estimated value (awarded value for award notices), in the notice currency (GBP).

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

Only notices whose place of delivery is in one of these regions (English regions, Wales, Scotland, Northern Ireland). Notices that do not state a region are excluded when this filter is set. 'England (nationwide)' and 'UK-wide' match notices that cover the whole country.

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

Maximum number of notices to return, newest first. You are charged per result, so keep this low while testing.

## `cpvLabelLanguage` (type: `string`):

Language of the official CPV (Common Procurement Vocabulary) labels in cpvCodes\[].label. All 24 EU languages are available; falls back to English.

## Actor input object example

```json
{
  "sources": [
    "find-a-tender",
    "contracts-finder"
  ],
  "keyword": "cyber security, penetration testing",
  "cpvCodes": [
    "72",
    "48"
  ],
  "noticeTypes": [
    "contract-notice"
  ],
  "daysBack": 7,
  "dateFrom": "2026-01-01",
  "dateTo": "2026-06-30",
  "minValue": 100000,
  "maxValue": 5000000,
  "regions": [
    "London",
    "South East"
  ],
  "maxItems": 20,
  "cpvLabelLanguage": "en"
}
```

# Actor output Schema

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

All notices in the default dataset, opened on the Overview table (date, type, title, buyer, value, deadline, link).

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

The same dataset opened on the Awards view: winners and awarded values from contract-award notices.

# 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"
    ],
    "noticeTypes": [
        "contract-notice"
    ],
    "daysBack": 7,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("nexus-scrapers/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",
    ],
    "noticeTypes": ["contract-notice"],
    "daysBack": 7,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("nexus-scrapers/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"
  ],
  "noticeTypes": [
    "contract-notice"
  ],
  "daysBack": 7,
  "maxItems": 20
}' |
apify call nexus-scrapers/uk-public-tenders --silent --output-dataset

```

## MCP server setup

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