# UK Find a Tender Notices — Official OCDS API (`civicrows/uk-find-a-tender-notices`) Actor

Public procurement notices from the UK Find a Tender service (the Central Digital Platform), normalised to flat rows. Organisation-level data only.

- **URL**: https://apify.com/civicrows/uk-find-a-tender-notices.md
- **Developed by:** [Levi Corteen](https://apify.com/civicrows) (community)
- **Categories:** Lead generation, Developer tools, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 results

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## UK Find a Tender Notices — Official OCDS API

UK public procurement notices from **Find a Tender**, the Central Digital
Platform, flattened from OCDS into plain rows. No personal data.

Since 24 February 2025, Find a Tender is the statutory publication point for
procurement notices under the Procurement Act 2023.

### Honest note before you install

The [official Find a Tender API](https://www.find-tender.service.gov.uk/Developer/Documentation)
is **free, well documented, requires no authentication, and is licensed under the
Open Government Licence**. If you are comfortable calling it, **do that instead** —
you do not need this Actor and it would be strange to pretend otherwise.

This Actor exists for people who want the awkward parts handled:

- Dates must be `YYYY-MM-DDTHH:MM:SS` with **no milliseconds** — the format
  `new Date().toISOString()` produces is rejected
- Cursor pagination via `links.next`
- 429/503 throttling with `Retry-After`
- OCDS release packages are deeply nested; most people want flat rows
- Contact names, emails and phone numbers must be stripped for lawful commercial use

### Fields

`source` · `ocid` · `noticeId` · `sourceUrl` · `stage` · `title` · `description` ·
`procurementCategory` · `cpvCode` · `cpvDescription` · `cpvDivision` · `buyerName` ·
`buyerRegion` · `buyerPostcode` · `valueAmount` · `valueCurrency` · `publishedDate` ·
`deadlineDate` · `contractStartDate` · `contractEndDate` · `supplierNames` ·
`awardValueAmount` · `isFramework`

**Identical field names to the other Actors in this collection**, so outputs can
be concatenated without reconciliation.

### No personal data

Organisation-level only. The source feed includes named contact officers with
email and telephone; these are **stripped before anything is written**, enforced
by an automated guard that fails the run rather than publishing them.

### → If you want more than one source

Use **UK Unified Tender Feed**, which combines this source with Contracts Finder
and removes the duplicates that occur when a procurement is advertised on both.
That is the Actor most people actually want.

### What a row actually looks like

Three real rows, trimmed to the columns most people use:

| publishedDate | title | buyerName | valueAmount | deadlineDate | cpvDescription |
|---|---|---|---|---|---|
| 2026-07-29 | Provision of Highways Maintenance Services | Lancashire County Council | 4500000 | 2026-09-15 | Highway maintenance work |
| 2026-07-28 | Grounds Maintenance Services 2027-2031 | Preston City Council | 500000 | 2026-08-29 | Planting and maintenance of green areas |
| 2026-07-30 | Supply of Laboratory Consumables | NHS Lancashire Teaching Hospitals | 250000 | — | Laboratory reagents |

Every row also carries `ocid`, `noticeId`, `sourceUrl`, `stage`, `description`,
`procurementCategory`, `cpvCode`, `cpvDivision`, `buyerRegion`, `buyerPostcode`,
`valueCurrency`, `contractStartDate`, `contractEndDate`, `supplierNames`,
`awardValueAmount` and `isFramework`.

Export as JSON, CSV, Excel or feed it straight through the Apify API.

### Questions people ask before running it

**Is this data free elsewhere?**
Yes. It is published by the UK government under the Open Government Licence and
the official APIs are linked above. If you only need one source and you are happy
calling an API, do that. This Actor is for when that stops being convenient.

**How fresh is it?**
As fresh as the source. Notices appear here as soon as they appear on the portal.
Run it on a daily or weekly schedule to pick up new notices automatically.

**How far back can I go?**
Set the date window as far back as you like. Bear in mind older windows return
more rows, and you are charged per row, so use `maxItems` to cap it.

**Does it include contact details for the buyer?**
No, deliberately. Contact names, emails and phone numbers are stripped before
anything is written, and an automated guard stops the run if any survive. If you
need named contacts, this is not the right tool and never will be.

**What does a typical run cost?**
The default settings return 250 notices. Scale from there — you are charged per
row returned, so a small window costs very little.

**Can I filter to my sector?**
Yes. Use `cpvDivisions` with two-digit CPV codes — `45` construction, `85` health
and social care, `72` IT services, `79` business services, `77` grounds and
agriculture. Combine with `minValue` to drop contracts below your threshold.

**Why are some notices missing a value?**
Buyers do not always publish one. Those rows are kept deliberately: a missing
figure is not evidence of a small contract, and dropping them would lose real
opportunities.

**Can I get this as a proper API instead of an Actor run?**
Every Apify Actor is callable via the Apify API, so you can trigger a run and
collect the dataset programmatically.

**What if it breaks?**
Raise an issue on the Actor. It is built on official documented APIs rather than
scraped HTML, so it breaks far less often than a typical Store listing — and
there is a published maintenance runbook behind it.

### Data licence

Contains public sector information licensed under the
[Open Government Licence v3.0](http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/).
Source: Find a Tender, Cabinet Office / Crown Copyright.

***

*UK government contracts data · public sector tender alerts · procurement
opportunities feed · Find a Tender API · Contracts Finder API · OCDS notices ·
public sector bid leads · UK tender data for CRM · government contract awards
dataset*

# Actor input Schema

## `updatedFrom` (type: `string`):

Earliest last-updated date/time (ISO 8601). Defaults to 7 days ago.

## `updatedTo` (type: `string`):

Latest last-updated date/time (ISO 8601). Defaults to now.

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

Which stages to return. Leave empty for all.

## `cpvDivisions` (type: `array`):

Two-digit CPV divisions to keep, e.g. 45 (construction), 85 (health). Empty = all.

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

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

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

HARD CAP on results. Default 250 keeps a first run inside the $5/month credit that Apify free-plan users get, so the Actor can be trialled at no cost. Raise it for production pulls. Also protects run time and unit economics.

## `maxRequests` (type: `integer`):

Second safety cap, on pagination rather than results.

## `maxRunSeconds` (type: `integer`):

Wall-clock budget. The run stops cleanly and returns what it has collected rather than exceeding this. Default 240s, chosen to stay inside Apify's 5-minute quality-check window even if a source imposes a long rate-limit wait.

## Actor input object example

```json
{
  "stages": [],
  "cpvDivisions": [],
  "maxItems": 250,
  "maxRequests": 200,
  "maxRunSeconds": 240
}
```

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("civicrows/uk-find-a-tender-notices").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("civicrows/uk-find-a-tender-notices").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call civicrows/uk-find-a-tender-notices --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=civicrows/uk-find-a-tender-notices",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/YtioOVNVFXWRo6n0a/builds/uR8kfNHWrSKShx7Ro/openapi.json
