# UK Contracts Finder Notices — Official OCDS API (`civicrows/uk-contracts-finder-notices`) Actor

Below-threshold and legacy UK public procurement notices from Contracts Finder, normalised to the same flat rows as the Find a Tender Actor. Organisation-level data only.

- **URL**: https://apify.com/civicrows/uk-contracts-finder-notices.md
- **Developed by:** [Levi Corteen](https://apify.com/civicrows) (community)
- **Categories:** Lead generation, Automation, Developer tools
- **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 Contracts Finder Notices — Official OCDS API

UK public procurement notices from **Contracts Finder**, flattened from OCDS
into plain rows. No personal data.

**Read this first:** since the Procurement Act 2023 commenced on 24 February
2025, *new* notices are published to Find a Tender (the Central Digital
Platform). Contracts Finder continues to carry procurements commenced under the
Public Contracts Regulations 2015, plus the historical record. **Volume here is
declining structurally.** If you want current notices, you probably want the
Find a Tender Actor or the Unified Feed instead.

### Honest note before you install

The [official Contracts Finder API](https://www.contractsfinder.service.gov.uk/apidocumentation/home)
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:

- Rate limiting arrives as **HTTP 403 with an HTML body**, not 429, and the
  documented remedy is to wait five minutes — easy to mistake for a permissions
  failure and give up
- It filters on **publication date** (`publishedFrom`), whereas Find a Tender
  filters on **last-updated** — using the wrong one returns an empty set rather
  than an error
- Values are often present only per-lot and need summing
- Cursor pagination
- 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 Find a Tender
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: Contracts Finder, 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

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

Lower limit on publication date (ISO 8601). Defaults to 7 days ago. NOTE: Contracts Finder filters on publication date, whereas Find a Tender filters on last-updated date. They are not the same window.

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

Upper limit on publication date (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-contracts-finder-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-contracts-finder-notices").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 '{}' |
apify call civicrows/uk-contracts-finder-notices --silent --output-dataset

```

## MCP server setup

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

```

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/1x3Whlf9AHaQ0qLhS/builds/5a0TVIi9Yfpkjk9OQ/openapi.json
