# UK Tenders Scraper & Monitor (Find a Tender) (`gr1n/uk-tenders-monitor`) Actor

Get UK public sector tenders and contract awards from Find a Tender as a clean table: buyer, region, CPV, deadline, value, SME suitability and winners. Filter by keyword, CPV, region and value, or get only new tenders daily with Telegram, Slack or webhook alerts.

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

## Pricing

from $2.50 / 1,000 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 & Monitor (Find a Tender)

Get **UK public sector tenders and contract awards** from **Find a Tender**, the UK government's central procurement service, as a clean table you can open in Excel or Google Sheets, or send to your CRM or an AI agent.

Under the Procurement Act 2023, UK public buyers (central government, councils, NHS trusts, universities, housing associations and more) publish their tenders, awards and contract details on Find a Tender, both above and below the old EU thresholds. This Actor reads that feed, keeps what matches your filters and, if you want, sends you only the new notices every day.

### What you can do with it

- **Find contracts to bid on.** Filter by keywords, CPV codes, region (London, Scotland, North West… or NUTS codes), minimum value in pounds and SME suitability. Keep only tenders that are still open.
- **Get a daily feed of new tenders, straight to Telegram or Slack.** Turn on *Only new notices since the last run*, add a Telegram bot, a Slack webhook or any webhook (Make, Zapier, n8n), and schedule the Actor. You never pay twice for the same notice.
- **Track who wins what.** Pull contract award notices to see suppliers, awarded values and contract periods by buyer, region and category.

### How to use it

1. Enter **keywords** (whole words or phrases, for example `software`, `grounds maintenance`), **CPV codes** (for example `72000000` for IT services; child codes are included), or both.
2. Optionally pick **regions**, **notice types**, a **date range**, a **minimum value** or **Only SME-suitable**.
3. Click **Start**, then download the results as Excel, CSV or JSON, or connect them to Google Sheets, Make, Zapier or n8n.

#### Example inputs

Open software and digital tenders in London and the South East from the last week:

```json
{
  "keywords": ["software", "digital", "cloud"],
  "regions": ["London", "South East"],
  "noticeTypes": ["tender"],
  "openOnly": true
}
```

A daily Slack alert for new SME-friendly construction tenders over £100,000:

```json
{
  "cpvCodes": ["45000000"],
  "noticeTypes": ["tender"],
  "minValue": 100000,
  "smeOnly": true,
  "monitorMode": true,
  "slackWebhookUrl": "<your Slack incoming webhook>"
}
```

Contract awards for facilities management last month, to see who won:

```json
{
  "keywords": ["facilities management", "cleaning"],
  "noticeTypes": ["award"],
  "publishedFrom": "2026-09-01",
  "publishedTo": "2026-09-30"
}
```

### What you get

| Field | What it is |
|---|---|
| `noticeId`, `ocid`, `publicationDate` | Find a Tender notice number, procurement ID and publication date |
| `noticeType`, `noticeTypeLabel` | Tender notice, tender update, contract award, contract details… |
| `title`, `description`, `status` | What is being bought |
| `buyerName`, `buyerTown`, `buyerRegion`, `buyerPostcode`, `buyerWebsite` | The public body buying |
| `category`, `procurementMethod`, `procurementMethodDetails` | Goods, services or works; open, competitive flexible, direct award… |
| `cpvMain`, `cpvCodes`, `deliveryRegions` | CPV codes and places of delivery (NUTS) |
| `deadline` | Tender submission deadline |
| `valueGbp`, `lotCount` | Estimated value in pounds, and the number of lots |
| `suitableForSme`, `suitableForVcse` | Whether the buyer marked it suitable for SMEs or voluntary, community and social enterprises |
| `awardedSuppliers`, `awardedValueGbp` | Contract award notices only |
| `contractStart`, `contractEnd` | Contract period |
| `submissionUrl`, `noticeUrl` | Where to bid, and the notice on Find a Tender |

**Compact output** (`"outputMode": "compact"`) returns only the essentials per notice: ID, date, type, title, buyer, region, CPV, deadline, value, suppliers and link.

### Pricing

You pay **per notice saved**: **$2.50 per 1,000 notices**. Notices the Actor reads but that don't match your filters are free, and so are alerts. There is no monthly fee. Set **Max notices** or a spending limit and the Actor stops exactly there.

### Tips

- **Keywords match whole words, in the title and description.** `software` won't match `softwares`; add variants if you need them.
- **Regions** match either the buyer's address or the place of delivery.
- **Long periods take longer.** Find a Tender's API has no keyword search, so the Actor reads every notice in your date range and filters it. A week takes seconds; a few months can take several minutes, because Find a Tender limits how fast it can be read.

### FAQ

**Where does the data come from?**
From Find a Tender's official public OCDS API, run by the UK Cabinet Office. No scraping of web pages.

**Is it legal to use this data?**
Yes. Find a Tender data is published under the Open Government Licence v3.0, which allows commercial reuse with attribution.

**Does it collect personal data?**
No contact names, emails or phone numbers are included. The Actor returns the buyer organisation, its town, region, postcode and website.

**What about Contracts Finder?**
Contracts Finder is the older UK service for lower-value contracts. Its public API doesn't reliably filter by date, so this Actor uses Find a Tender, where new procurements under the Procurement Act 2023 are published.

***

Contains public sector information licensed under the Open Government Licence v3.0. Source: Find a Tender, https://www.find-tender.service.gov.uk. This Actor is not affiliated with or endorsed by the UK government.

# Actor input Schema

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

A notice matches if its title or description contains any of these words or phrases.

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

Common Procurement Vocabulary codes, like 45000000 (construction work) or 72000000 (IT services). Child codes are included automatically.

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

UK regions by name (London, Scotland, North West…) or NUTS code (UKI, UKM, UKG2…). Matches the buyer's region or the place of delivery. Leave empty for the whole UK.

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

Which notices to get. 'Tender notices' are open opportunities; 'Contract awards' name the suppliers and values.

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

Used when 'Published from' is empty.

## `publishedFrom` (type: `string`):

Only notices published on or after this date.

## `publishedTo` (type: `string`):

Only notices published on or before this date.

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

Skip tenders whose submission deadline has passed.

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

Keep only notices the buyer marked as suitable for small and medium-sized enterprises.

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

Only notices whose estimated value (or awarded value for contract awards) is at least this many pounds. Notices without a published value are skipped when this is set.

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

Stop after this many notices. Leave empty to get every match.

## `outputMode` (type: `string`):

'Full' gives every field. 'Compact' gives a short row per notice, handy for spreadsheets, alerts and AI agents.

## `monitorMode` (type: `boolean`):

Remember what earlier runs of this same search returned and save only notices published since. Schedule the Actor daily to get a feed of new tenders and pay only for new ones.

## `telegramBotToken` (type: `string`):

Send a digest of the saved notices to Telegram. Create a bot with @BotFather and paste its token here.

## `telegramChatId` (type: `string`):

Chat, group or channel to send the digest to. Add the bot to it first.

## `slackWebhookUrl` (type: `string`):

Send the digest to a Slack channel through an incoming webhook.

## `webhookUrl` (type: `string`):

POST the digest as JSON to any URL, for example a Make, Zapier or n8n webhook.

## `notifyWhenEmpty` (type: `boolean`):

Also send a message when a run finds no notices.

## Actor input object example

```json
{
  "keywords": [
    "software"
  ],
  "noticeTypes": [
    "tender"
  ],
  "daysBack": 7,
  "openOnly": false,
  "smeOnly": false,
  "maxItems": 100,
  "outputMode": "full",
  "monitorMode": false,
  "notifyWhenEmpty": false
}
```

# Actor output Schema

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

One row per Find a Tender notice: buyer, deadline, value, suppliers and links.

## `summary` (type: `string`):

The time window read and how many notices were scanned, saved or skipped.

# 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": [
        "software"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("gr1n/uk-tenders-monitor").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": ["software"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("gr1n/uk-tenders-monitor").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": [
    "software"
  ],
  "maxItems": 100
}' |
apify call gr1n/uk-tenders-monitor --silent --output-dataset

```

## MCP server setup

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

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/UVIuiGWDfqVxAzEbB/builds/esKEg7cE9RqqtMshw/openapi.json
