# UK Public Tenders Search (Contracts Finder + Find a Tender) (`aesthetic_gewgaw/uk-public-tenders`) Actor

Search UK government tenders, awards and planning notices from Contracts Finder and Find a Tender by keyword, CPV code, buyer, region and value. Clean JSON from the official APIs.

- **URL**: https://apify.com/aesthetic_gewgaw/uk-public-tenders.md
- **Developed by:** [Huskarian Geist](https://apify.com/aesthetic_gewgaw) (community)
- **Categories:** Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $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 Search (Contracts Finder and Find a Tender)

Get clean, filterable UK public sector tenders, awards and planning notices from the two official government portals, Contracts Finder and Find a Tender, in one dataset. Filter by keyword, CPV code, buyer, region and contract value, and get one tidy JSON record per notice instead of raw OCDS. It reads the official open APIs, so there is no scraping, no login and no breakage when a site is redesigned. Run it on a schedule and you have a tender alert feed for bid teams, consultancies and sales teams selling to the public sector.

### What you get

| field | example |
|---|---|
| source | contracts_finder |
| stage | tender, award or planning |
| noticeId | ocds-b5fd17-e8d6a3ec-... |
| title | Digital Learning Infrastructure Framework |
| description | Full notice summary (first 1500 characters) |
| buyerName | East Sussex County Council |
| cpvCode, cpvDescription, cpvCodes | 72212190, Educational software development services |
| valueAmount, valueCurrency | 226842, GBP |
| region | Scotland |
| procurementMethod | Open procedure |
| category | services |
| smeSuitable | true |
| publishedDate, deadline | 2026-10-07T16:50:53+01:00, 2026-11-09T12:00:00Z |
| contractStart, contractEnd | contract dates when stated |
| suppliers | winning companies (award notices) |
| url | link to the official notice |

Not every notice states every field. Value, region and deadline are empty where the buyer did not publish them.

### Example input

```json
{
  "sources": ["contracts_finder", "find_a_tender"],
  "stages": ["tender"],
  "keywords": ["software", "cyber security"],
  "cpvPrefixes": ["72"],
  "minValue": 50000,
  "daysBack": 7,
  "maxItems": 100
}
```

### Common uses

- **Daily tender alerts.** Schedule the Actor every morning with your keywords and send the dataset to Slack, email or a spreadsheet using Apify integrations.
- **Competitor and market research.** Use `stages: ["award"]` to see who won which contracts, for how much, and which buyers keep re-buying.
- **Early pipeline.** Use `stages: ["planning"]` to see buyer intentions before a tender is published.

### Pricing

Pay per result: $3 per 1,000 notices saved to the dataset. No subscription. Set `maxItems` to cap your spend. A typical daily alert run returns a few dozen notices and costs a few cents.

### Data source and licence

Notices come from the official Contracts Finder and Find a Tender OCDS APIs, published under the Open Government Licence v3.0. The Actor requests data politely, paces its requests and retries when asked to slow down. Buyer contact names and email addresses are deliberately left out of the output.

### FAQ

**How far back can I look?** Up to 90 days with `daysBack`. For ongoing monitoring, schedule a daily run with `daysBack: 2`.

**Why did I get fewer results than `maxItems`?** Only notices that match all your filters are saved. Loosen the keywords or widen `daysBack`.

**Do I get duplicates between the two portals?** Each portal publishes its own notices, and duplicates within a run are removed by notice ID.

**Can I get the full tender documents?** The `url` field links to the official notice, where documents are attached.

# Actor input Schema

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

Which official portals to read. Contracts Finder covers England and the UK-wide below-threshold notices. Find a Tender covers above-threshold UK notices.

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

tender = open opportunities, award = who won and for how much, planning = early market engagement and pipeline notices.

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

Keep notices whose title or description contains at least one of these words or phrases. Leave empty to keep everything.

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

Drop notices whose title or description contains any of these.

## `cpvPrefixes` (type: `array`):

Keep notices with a CPV code starting with one of these, for example 72 for IT services or 45 for construction.

## `buyerContains` (type: `string`):

Only keep notices from buyers whose name contains this text, for example NHS or Council.

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

Keep notices delivered in a region whose name contains one of these, for example London or Scotland.

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

Drop notices with a stated value below this. Notices with no stated value are kept.

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

Drop notices with a stated value above this. Notices with no stated value are kept.

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

Keep only notices whose deadline has not passed (notices with no deadline are kept).

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

Look at notices published or updated in the last N days (1 to 90).

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

Stop after this many matching notices. You are charged per result, so this is also your spending cap.

## Actor input object example

```json
{
  "sources": [
    "contracts_finder",
    "find_a_tender"
  ],
  "stages": [
    "tender"
  ],
  "keywords": [
    "software",
    "cyber security"
  ],
  "onlyOpen": true,
  "daysBack": 7,
  "maxItems": 100
}
```

# Actor output Schema

## `tenders` (type: `string`):

One clean record per tender, award or planning notice. Field definitions are in the dataset schema.

# 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": [
        "contracts_finder",
        "find_a_tender"
    ],
    "stages": [
        "tender"
    ],
    "keywords": [
        "software",
        "cyber security"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("aesthetic_gewgaw/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": [
        "contracts_finder",
        "find_a_tender",
    ],
    "stages": ["tender"],
    "keywords": [
        "software",
        "cyber security",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("aesthetic_gewgaw/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": [
    "contracts_finder",
    "find_a_tender"
  ],
  "stages": [
    "tender"
  ],
  "keywords": [
    "software",
    "cyber security"
  ]
}' |
apify call aesthetic_gewgaw/uk-public-tenders --silent --output-dataset

```

## MCP server setup

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