# Find a Tender Scraper + Contracts Finder | UK Public Tenders (`s-r/uk-public-tenders`) Actor

Search UK government tenders, planning and contract award notices from Find a Tender and Contracts Finder in one dataset. Filter by keyword, CPV, region, value and dates; export buyers, deadlines and Companies House supplier numbers.

- **URL**: https://apify.com/s-r/uk-public-tenders.md
- **Developed by:** [SR](https://apify.com/s-r) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.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

## Find a Tender Scraper and Contracts Finder

Find a Tender and Contracts Finder notices in one dataset: search UK public procurement opportunities, planning notices and contract awards, with buyers, CPV codes, deadlines and disclosed supplier identifiers. Built for suppliers, bid teams and market analysts who track UK government tenders and public sector contracts.

The Actor helps suppliers and bid teams monitor relevant buying activity without maintaining separate exports for the two portals. It returns the original notice title and description, the buying organisation, the published value and currency, and a link to the notice. Award notices can include a Companies House registration number for each supplier when the official record discloses one. Missing information stays null; the Actor does not invent company identifiers or estimates.

### Find a Tender coverage

Choose Find a Tender, Contracts Finder, or both. Find a Tender covers UK procurement notices, including notices under the Procurement Act 2023 and earlier regimes. Contracts Finder provides its published procurement notices in the same output shape. A notice describes a publication or update, rather than an entire procurement history. Planning, tender and award records therefore share one schema while retaining a stage field and the original publication tags.

Tender amendments and cancellations are included in the tender stage. Contract notices, contract updates and implementation releases belong to award. A cancellation flag is separate from the source's status: a cancelled notice can retain a source status such as complete. Keeping these fields separate helps teams distinguish a new opportunity from an amendment or termination.

### Input

No input field is required. The default search covers the previous seven days, includes both portals and all stages, and returns up to 100 matching rows. Use `max_items` to set a total limit from 1 to 10,000. `maxItems` is an alias; when both limits are supplied, the smaller one applies.

For keyword searches, pass `keywords` as an array of words or phrases. Matching ignores case and uses OR: one term must occur in the title, description, a lot title or description, or buyer name. The `keyword` and `query` aliases accept comma-separated text. This is text matching, so a keyword does not imply that the buyer assigned a particular classification.

Use `cpv_codes` to match any classification on the notice. Prefixes contain two to eight digits, and an optional check digit is accepted. Trailing zeros after the first two division digits are removed for hierarchical matching: `72000000` searches the `72` family, and `70000000` searches only `70`. Use `stages` to restrict results to planning, tender or award. Each supplied filter group must match, while multiple entries inside a keyword, CPV or region group use OR.

Set `date_from` and `date_to` to publication or update boundaries. A date such as `2026-09-30` means a British calendar date, including British Summer Time where applicable. The ending calendar date is included. ISO timestamps must include a timezone; a timestamp in `date_to` is exclusive. Future windows, reversed boundaries and windows longer than 366 days are rejected. A search ending today covers the hours already elapsed.

`regions` selects UK delivery regions such as London, Scotland or North West. UK-wide and Any region notices match every regional selection. England-only notices match English regions and UK-wide, but are excluded for Scotland, Wales and Northern Ireland. Selecting England includes all English regions. Notices without a disclosed delivery region are excluded when this filter is active; the buyer's address is not substituted. `min_value` compares disclosed GBP values only. Notices without a value or with another currency are excluded rather than converted. Award values use contract totals where available, otherwise award totals.

Select a portal with `portal`: `both`, `find_a_tender` or `contracts_finder`. The short values `fts` and `cf` also work, and `source` is an input alias. In output, `source` always identifies this product and `portal` identifies the official portal.

A concrete search for the recorded airport technology notice is:

```json
{
  "keywords": ["Quantum Magnetic Sensing"],
  "portal": "find_a_tender",
  "stages": ["tender"],
  "date_from": "2026-09-30",
  "date_to": "2026-09-30",
  "max_items": 10
}
```

### Output

Each dataset row contains `notice_id`, `release_id`, `ocid`, `portal`, `title`, `description`, `buyer_name`, `buyer_id`, `cpv_codes`, `value`, `currency`, `stage`, `status`, `deadline`, `published_at`, `url` and `fetched_at`. Additional fields include delivery regions, procurement method, original tags, notice type, VAT treatment and detailed awards. Null indicates information the publication does not disclose.

One actual Find a Tender notice, `092305-2026`, is titled “Use of Quantum Magnetic Sensing and Edge-AI in Asset Performance Monitoring in Airports”. It names CONNECTED PLACES CATAPULT as buyer, gives CPV `72212132`, and discloses a gross value of GBP 80,000 with a deadline of `2026-10-15T12:00:00+01:00`. Award notice `092391-2026` discloses South Farnham Educational Trust with registration number `07652902` and GBP 90,000 in contract value.

The top-level `suppliers` list provides `name`, `registry_id` and `jurisdiction`. A disclosed Companies House number is normalised to eight characters and jurisdiction GB, allowing a join to the Companies House UK product on those two fields. `awards[].suppliers` preserves richer identifiers and any disclosed supplier scale. Removed suppliers are excluded.

#### Example output row

This is a real award row returned for the input `{"keywords": ["Teacher Apprenticeship L6"], "portal": "find_a_tender", "date_from": "2026-09-30", "date_to": "2026-09-30", "max_items": 1}`:

```json
{
  "source": "uk-public-tenders",
  "country": "GB",
  "fetched_at": "2026-10-05T09:47:21.826117+00:00",
  "row_id": "ocds-h6vhtk-077da2",
  "ocid": "ocds-h6vhtk-077da2",
  "notice_id": "092391-2026",
  "release_id": "092391-2026",
  "portal": "find_a_tender",
  "url": "https://www.find-tender.service.gov.uk/Notice/092391-2026",
  "title": "Teacher Apprenticeship L6",
  "description": "Teacher Apprenticeship training",
  "stage": "award",
  "status": "complete",
  "tags": [
    "award",
    "contract"
  ],
  "notice_type": "UK7",
  "cancelled": false,
  "published_at": "2026-09-30T14:09:14+01:00",
  "deadline": null,
  "buyer_name": "Portsmouth City Council",
  "buyer_id": "GB-PPON-PCNL-5714-PRZV",
  "buyer_scheme": "GB-PPON",
  "buyer_identifier": "PCNL-5714-PRZV",
  "buyer_companies_house_number": null,
  "buyer_region": "UKJ31",
  "cpv_codes": [
    "80500000"
  ],
  "cpv_main": "80500000",
  "regions": [
    "UKJ31"
  ],
  "value": 90000,
  "currency": "GBP",
  "value_includes_vat": true,
  "value_gross": 90000,
  "value_min": null,
  "procurement_method": null,
  "procurement_method_details": "Below threshold - unknown",
  "suitable_for_sme": null,
  "suitable_for_vcse": null,
  "suppliers": [
    {
      "name": "South Farnham Educational Trust",
      "registry_id": "07652902",
      "jurisdiction": "GB"
    }
  ],
  "awards": [
    {
      "id": "1",
      "date": null,
      "value": 90000,
      "currency": "GBP",
      "suppliers": [
        {
          "name": "South Farnham Educational Trust",
          "id": "GB-COH-07652902",
          "companies_house_number": "07652902",
          "identifiers": [
            {
              "scheme": "GB-COH",
              "id": "07652902"
            }
          ],
          "scale": "large"
        }
      ]
    }
  ],
  "related_notice_ids": []
}
```

A Contracts Finder row has the same shape. For example, notice `c786c0ef-fccb-41b3-b66f-13bf8ebdc59c` (“On-demand Technology Learning Platform”, buyer STUDENT LOANS COMPANY LIMITED) returns GBP 391,159.41, `suitable_for_sme: false` and supplier COMPUTACENTER (UK) LIMITED with registry id `01584718`.

### Use cases for UK government tenders

- **Bid pipeline.** Run a daily search on your CPV families and regions, and push new tender-stage notices with a deadline into your CRM or a spreadsheet before competitors see them.
- **Competitor and incumbent tracking.** Filter on the award stage to see who won which public sector contracts, for how much, and when. Renewal dates follow from the award history.
- **Lead generation for suppliers and partners.** Award winners with a Companies House number are companies that just received public money; join `suppliers.registry_id` to the Companies House UK product for directors, addresses and filings.
- **Market sizing.** Sum disclosed GBP values per CPV code, buyer or region to see where UK public procurement spend goes.
- **Buyer intelligence.** Group notices by `buyer_id` to learn which councils, NHS bodies or departments buy what, through which procurement method, and whether contracts are flagged as suitable for SMEs.

### Find a Tender scraper compared with the alternatives

| | This Actor | Find a Tender website | Contracts Finder website | Official OCDS APIs directly |
|---|---|---|---|---|
| Both portals in one search | Yes | No | No | No, two different APIs |
| One output schema | Yes | Not applicable | Not applicable | Two different OCDS dialects |
| Keyword, CPV, stage, region and GBP value filters together | Yes | Partly | Partly | Partly, and differently per API |
| Companies House supplier number as a join key | Normalised, eight characters | Shown on the notice page | Shown on the notice page | Raw identifier, in varying formats |
| Pagination, retries and continuation | Handled | Manual | Manual | Your own code |
| Export to JSON, CSV, Excel or an API | Yes, via the Apify dataset | Search in the browser | Search in the browser | JSON only |

Many Store actors cover a single portal. This Actor merges both into one dataset with the same fields and a ready Companies House join key, so a single scheduled run replaces two separate searches.

### Deduplication and continuation

With the default `dedupe_by_ocid: true`, the newest matching notice for a procurement OCID is retained. Set it to false to keep individual releases. The portals do not share procurement identifiers, so similar titles across the two services remain separate. `related_notice_ids` lists earlier notices observed within the same response; later pages cannot amend a row already returned.

The Actor follows continuation pages automatically. Direct API consumers should repeat unchanged search filters with the returned `next_cursor` until it is null. Work proceeds by British publication day, newest day first, with Find a Tender before Contracts Finder within each day. The combined dataset is ordered by this traversal, rather than a global comparison of timestamps across portals. `partial` and `warnings` report unfinished collection or unavailable sources, and unsuccessful positions remain resumable.

A continuation response can contain no matching notices and still have a `next_cursor`. Continue with that cursor to finish the search. Empty continuation responses add no billable notices; only delivered dataset rows count toward the tender event.

### Pricing

The billing unit is one delivered tender notice. Empty searches deliver no rows and incur no tender event. A repeated procurement excluded by deduplication is not a delivered row and is not charged again. The proposed price is USD 0.004 per delivered notice (USD 4 per 1,000 notices), with no start fee; the Actor's Pricing tab shows the price that applies to your run. Non-paying users receive up to ten matching rows per run, and collection stops when that allowance is filled. Requests below that limit keep their requested size.

### FAQ

#### Can I search both portals together?

Yes. The default portal choice is both. Use the output portal field when comparing sources or preparing separate exports.

#### Are supplier registration numbers always available?

No. They are returned only when the official OCDS record discloses a GB-COH identifier. A supplier can have a name and another identifier while its Companies House number remains null.

#### Does a region filter use the buyer's office address?

It uses disclosed delivery regions. A national delivery notice matches regional searches, while a record with no delivery region is excluded.

#### Can I keep every update to a tender?

Set `dedupe_by_ocid` to false. Each official release then has its own row identity, while the shared OCID still lets you group the history.

#### What happens when there are no matching notices?

The Actor finishes with an empty dataset and a no-results message. No tender event is charged. Broaden the keyword, CPV, region or date filters to collect a wider set of publications.

#### How do I get daily alerts for new UK tenders?

Create a schedule in Apify Console that runs the Actor every morning with your keywords or CPV codes and `stages: ["tender"]`. Leave `date_from` and `date_to` unset so each run searches the previous seven days. Deduplicate notices by OCID in your destination to avoid repeated alerts across overlapping runs. Connect the dataset to email, Slack, Google Sheets or a webhook through an Apify integration.

#### What is the difference between Find a Tender and Contracts Finder?

Find a Tender is the UK-wide service for notices under the procurement regulations, including the higher-value contracts; Contracts Finder lists public sector contracts in England, including many lower-value opportunities. Many suppliers need both, which is why the default searches both portals and labels each row with its `portal`.

#### Do I need an API key for Find a Tender or Contracts Finder?

No. The Actor reads the public notices on your behalf; you only need an Apify account.

# Actor input Schema

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

OR match, ignoring case, in title, description, lot title/description or buyer.

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

Alias: comma-separated keywords.

## `query` (type: `string`):

Alias: comma-separated keywords.

## `cpv_codes` (type: `array`):

CPV prefixes: 2–8 digits, optional check digit. Trailing zeros after the first two division digits are removed before matching all classifications (70000000 becomes 70, 45210000 becomes 4521).

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

Match release tags, including amendments and cancellations. Default: all three stages.

## `date_from` (type: `string`):

Inclusive publication/update boundary. YYYY-MM-DD uses UK midnight; ISO timestamp requires timezone. Default: seven days ago.

## `date_to` (type: `string`):

Exclusive ISO timestamp or inclusive UK calendar date. Default: now; today is capped at now. Maximum window: 366 days.

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

UK delivery regions. UK and Any region notices match every region. England-only notices match English regions and UK-wide, but not Scotland, Wales or Northern Ireland. England selects all English regions; Any region aliases UK-wide. Missing delivery regions are excluded; buyer region is not substituted.

## `min_value` (type: `number`):

Minimum GBP value. Missing values and other currencies are excluded. Award totals or highest disclosed individual award qualify.

## `portal` (type: `string`):

Source choice. Default both; fts/cf are aliases.

## `source` (type: `string`):

Alias for portal. Output source is always uk-public-tenders.

## `max_items` (type: `integer`):

Total matching rows across all continuation requests. Default 100.

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

Alias for max_items.

## `dedupe_by_ocid` (type: `boolean`):

Default true: newest matching notice per portal OCID. False: each release remains a row.

## `cursor` (type: `string`):

Opaque next_cursor from a previous response. Keep all search filters unchanged.

## Actor input object example

```json
{
  "keywords": [
    "Quantum Magnetic Sensing"
  ],
  "date_from": "2026-09-30",
  "date_to": "2026-09-30",
  "portal": "find_a_tender",
  "max_items": 1
}
```

# Actor output Schema

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

Tender, planning and award notices from Find a Tender and Contracts Finder.

## `output` (type: `string`):

Status, counts, charges, warnings and next_cursor for this run.

# 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 = {
    "keywords": [
        "Quantum Magnetic Sensing"
    ],
    "date_from": "2026-09-30",
    "date_to": "2026-09-30",
    "portal": "find_a_tender",
    "max_items": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("s-r/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 = {
    "keywords": ["Quantum Magnetic Sensing"],
    "date_from": "2026-09-30",
    "date_to": "2026-09-30",
    "portal": "find_a_tender",
    "max_items": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("s-r/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 '{
  "keywords": [
    "Quantum Magnetic Sensing"
  ],
  "date_from": "2026-09-30",
  "date_to": "2026-09-30",
  "portal": "find_a_tender",
  "max_items": 1
}' |
apify call s-r/uk-public-tenders --silent --output-dataset

```

## MCP server setup

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