# UK Tenders Scraper – Contracts Finder & Find a Tender (`iamshytv/uk-contracts-finder`) Actor

Search UK public sector tenders and contract awards from the official Contracts Finder and Find a Tender (FTS) APIs. Filter by keyword, CPV, buyer, region, value and deadline. Winners, values, links. No API key.

- **URL**: https://apify.com/iamshytv/uk-contracts-finder.md
- **Developed by:** [shai mate](https://apify.com/iamshytv) (community)
- **Categories:** Lead generation, Business
- **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 uk procurement 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 Tenders Scraper – Contracts Finder & Find a Tender

Search **UK public sector tenders and contract awards** from the two **official UK government notice services**: **Contracts Finder** (lower-value English public contracts) and **Find a Tender (FTS)** (higher-value contracts across England, Scotland, Wales and Northern Ireland under the Procurement Act 2023). The Actor reads their official OCDS (Open Contracting Data Standard) APIs. No API key, no login, no browser. Get clean JSON, CSV or Excel with the buyer, value, deadline, CPV codes, winners and a link to every notice.

Use it for **bid and tender alerts**, **public sector sales prospecting**, **competitor and incumbent research** (who won what, for how much), **framework and pipeline tracking** and **market analysis**. It pairs well with [EU Tenders (TED)](https://apify.com/iamshytv/ted-eu-tenders), [SAM.gov Contract Opportunities](https://apify.com/iamshytv/sam-gov-opportunities) and [USAspending Awards](https://apify.com/iamshytv/usaspending-awards).

### What you get for each notice

- Source (Contracts Finder or Find a Tender), notice ID, OCID and stage (tender, award or planning) with the raw release tags
- **Title** and **description** (length configurable)
- **Buyer** name, ID, type, town, postcode, region and website
- **Estimated value** and currency, **submission deadline**, contract start and end dates
- **CPV code** and description plus additional CPV codes, main category (goods, services, works)
- Procurement method, framework flag, number of lots, legal basis
- **SME and VCSE suitability** flags (Contracts Finder)
- **Awarded suppliers** with award values and dates (award stage)
- Delivery regions and a **direct link** to the notice page

Output is organisation-level business data. Contact names, emails and phone numbers are removed.

### How to use

1. Pick the **sources** (both by default) and **notice stages** (open tenders by default; add awards to see winners).
2. Add **keywords**, **CPV codes**, **buyer names**, **regions** or a **value range**.
3. Choose a time window (**last N days** or fixed dates). Turn on **Only open for bids** to skip closed tenders.
4. Run. Results appear in the dataset; download as JSON, CSV, Excel or use the API.

**Daily tender alert:** schedule the Actor every morning with `onlyNewSinceLastRun: true` and connect the dataset to email, Slack, Google Sheets, Make or Zapier. You only get (and pay for) notices you have not seen.

#### Example input: open IT and software tenders over £100k

```json
{
  "sources": ["contractsFinder", "findATender"],
  "noticeStages": ["tender"],
  "cpvCodes": ["72", "48"],
  "minValue": 100000,
  "onlyOpen": true,
  "publishedWithinDays": 14
}
```

#### Example input: who won NHS contracts in the last 30 days

```json
{
  "noticeStages": ["award"],
  "buyerNames": ["NHS"],
  "publishedWithinDays": 30,
  "maxResults": 500
}
```

#### Example output

```json
{
  "source": "Contracts Finder",
  "stage": "tender",
  "title": "Evaluation Scoping Studies (2 Lots)",
  "buyerName": "Gambling Commission",
  "valueAmount": 50000,
  "currency": "GBP",
  "tenderDeadline": "2026-12-03T12:00:00Z",
  "cpvCode": "73110000",
  "cpvDescription": "Research services",
  "suitableForSme": true,
  "awardedSuppliers": [],
  "noticeUrl": "https://www.contractsfinder.service.gov.uk/Notice/8d6ee322-4f9f-4343-af0a-9769ed660d8e"
}
```

(A real Contracts Finder notice from November 2026, trimmed to key fields.)

### Pricing

Pay per result: **$3 per 1,000 notices** ($0.003 each), plus the small Apify platform usage of the run. A default run returns up to 100 notices per source in well under a minute.

### Tips

- **Max results** applies per source, so a default run can return up to 200 notices.
- Keyword, CPV, buyer, region and value filters are applied to every notice the APIs return for your date window. For long windows with narrow filters, raise **Max pages scanned per source**.
- Find a Tender often gives regions as ITL/NUTS codes (UKI = London, UKM = Scotland, UKL = Wales, UKN = Northern Ireland).
- Many notices have no published value; setting a minimum or maximum value excludes them.

### Data source and licence

Data comes from the official [Contracts Finder](https://www.contractsfinder.service.gov.uk/) and [Find a Tender](https://www.find-tender.service.gov.uk/) OCDS APIs published by the UK Cabinet Office, reused under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/). Contains public sector information licensed under the Open Government Licence v3.0. This Actor is not affiliated with or endorsed by the UK government.

### FAQ

**Do I need an API key?** No. Both APIs are public and anonymous.

**How fresh is the data?** Notices appear in the APIs as soon as they are published; each run queries them live.

**Does it cover Scotland and Wales?** Find a Tender covers above-threshold notices across the UK. Lower-value notices in Scotland (Public Contracts Scotland) and Wales (Sell2Wales) are published on those portals and are not included.

# Actor input Schema

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

Which official UK notice services to search. Contracts Finder covers lower-value English public contracts (roughly £12k–£30k and up); Find a Tender (FTS) covers higher-value contracts across the UK under the Procurement Act 2023. Each source is searched separately and Max results applies per source.

## `noticeStages` (type: `array`):

Which stages to return: open tenders (including updates and cancellations), awards and contracts (who won and for how much), or planning (pipeline and pre-market engagement notices). Default: tenders.

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

Return only notices whose title or description contains any of these words or phrases (case-insensitive). Leave empty for all notices.

## `excludeKeywords` (type: `array`):

Drop notices whose title or description contains any of these words or phrases.

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

Return only notices whose main or additional CPV code starts with one of these, e.g. 72 (IT services), 48 (software packages), 79 (business services), 73 (research).

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

Return only notices from buyers whose name contains any of these, e.g. NHS, Ministry of Defence, Council.

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

Return only notices whose delivery region or buyer town matches any of these, e.g. London, Scotland, North West, Manchester. Find a Tender often uses ITL/NUTS codes such as UKI (London).

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

Only notices with an estimated value (or awarded value) at least this much. 0 = no minimum. Notices without a published value are excluded when this is set.

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

Only notices with a value at most this much. 0 = no maximum.

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

Only return notices whose submission deadline is still in the future.

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

Only notices the buyer marked as suitable for small and medium-sized businesses (mostly Contracts Finder).

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

How far back to look when no fixed dates are given.

## `fromDate` (type: `string`):

Fixed start date (YYYY-MM-DD). Overrides 'Published within the last N days'.

## `toDate` (type: `string`):

Fixed end date (YYYY-MM-DD). Default: now.

## `maxResults` (type: `integer`):

Maximum notices to output from each source.

## `maxPagesPerSource` (type: `integer`):

Safety cap on API pages (100 notices each) scanned per source while filtering. Raise it for long date ranges with narrow filters.

## `descriptionMaxChars` (type: `integer`):

Trim descriptions to this many characters. 0 = full text.

## `onlyNewSinceLastRun` (type: `boolean`):

Remember notices already output and skip them next time (for scheduled daily alerts). You only pay for new notices.

## Actor input object example

```json
{
  "sources": [
    "contractsFinder",
    "findATender"
  ],
  "noticeStages": [
    "tender"
  ],
  "keywords": [],
  "excludeKeywords": [],
  "cpvCodes": [],
  "buyerNames": [],
  "regions": [],
  "minValue": 0,
  "maxValue": 0,
  "onlyOpen": false,
  "smeSuitableOnly": false,
  "publishedWithinDays": 7,
  "maxResults": 100,
  "maxPagesPerSource": 30,
  "descriptionMaxChars": 1000,
  "onlyNewSinceLastRun": false
}
```

# Actor output Schema

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

UK tenders, awards and planning notices from Contracts Finder and Find a Tender (buyer, value, deadline, CPV, winners, links). Stored in the run's default dataset.

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

JSON record RUN_SUMMARY in the default key-value store: date window and counts per source.

# 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": [
        "contractsFinder",
        "findATender"
    ],
    "noticeStages": [
        "tender"
    ],
    "keywords": [],
    "excludeKeywords": [],
    "cpvCodes": [],
    "buyerNames": [],
    "regions": [],
    "minValue": 0,
    "maxValue": 0,
    "onlyOpen": false,
    "smeSuitableOnly": false,
    "publishedWithinDays": 7,
    "maxResults": 100,
    "maxPagesPerSource": 30,
    "descriptionMaxChars": 1000,
    "onlyNewSinceLastRun": false
};

// Run the Actor and wait for it to finish
const run = await client.actor("iamshytv/uk-contracts-finder").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": [
        "contractsFinder",
        "findATender",
    ],
    "noticeStages": ["tender"],
    "keywords": [],
    "excludeKeywords": [],
    "cpvCodes": [],
    "buyerNames": [],
    "regions": [],
    "minValue": 0,
    "maxValue": 0,
    "onlyOpen": False,
    "smeSuitableOnly": False,
    "publishedWithinDays": 7,
    "maxResults": 100,
    "maxPagesPerSource": 30,
    "descriptionMaxChars": 1000,
    "onlyNewSinceLastRun": False,
}

# Run the Actor and wait for it to finish
run = client.actor("iamshytv/uk-contracts-finder").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": [
    "contractsFinder",
    "findATender"
  ],
  "noticeStages": [
    "tender"
  ],
  "keywords": [],
  "excludeKeywords": [],
  "cpvCodes": [],
  "buyerNames": [],
  "regions": [],
  "minValue": 0,
  "maxValue": 0,
  "onlyOpen": false,
  "smeSuitableOnly": false,
  "publishedWithinDays": 7,
  "maxResults": 100,
  "maxPagesPerSource": 30,
  "descriptionMaxChars": 1000,
  "onlyNewSinceLastRun": false
}' |
apify call iamshytv/uk-contracts-finder --silent --output-dataset

```

## MCP server setup

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

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/4SKKtgiebr08HVUnG/builds/alGlLfD8VDf6tsmcy/openapi.json
