# UK Government Contract Intelligence (`dogmatic_eyepiece/uk-government-contract-intelligence`) Actor

UK government contracts, tenders & Find a Tender OCDS: expiries, incumbents, recompetes, CPV opportunities, supplier/buyer intelligence for agents/MCP.

- **URL**: https://apify.com/dogmatic\_eyepiece/uk-government-contract-intelligence.md
- **Developed by:** [Matthew Harbour](https://apify.com/dogmatic_eyepiece) (community)
- **Categories:** AI, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $20.00 / 1,000 recompete analyses

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 Government Contract Intelligence

**Find UK government contracts, tenders and recompete opportunities** from Find a Tender OCDS — structured for coding agents, MCP clients and applications.

Use this Actor when you need:

- **expiring government contracts** / contract expiry windows
- **incumbent supplier** for a buyer and category (CPV)
- **recompete** / **contract renewal** candidates with transparent scores (not probabilities)
- **supplier intelligence** and **buyer intelligence** profiles
- open **public sector opportunities** / **bid opportunities**
- deterministic supplier ↔ opportunity matching

Built for **AI agents, BD automation, bid desks, CRM enrichment and procurement tools**.

> **Important:** Unofficial community Actor. Not affiliated with Cabinet Office, Crown Commercial Service or GOV.UK. Contains public sector information licensed under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/). Not legal or bid advice.

***

### How to call it

Send an `operation` plus that operation’s fields. One run = one operation.

Successful results use:

```json
{
  "operation": "find_likely_recompetes",
  "success": true,
  "data": [],
  "warnings": [],
  "assumptions": [],
  "sources": [{ "source": "find_a_tender_ocds" }],
  "generatedAt": "2026-08-08T12:00:00.000Z"
}
```

Failures return `success: false` and `error: { code, message, missingInformation }`.

**Limits:** `maxResults` defaults to 20 and cannot exceed 50.

***

### Operations

| Operation | When to use | Key inputs |
|-----------|-------------|------------|
| `find_expiring_contracts` | Contracts ending in a date window | `endingFrom`, `endingTo`; optional `buyer`, `supplier`, `cpvCodes`, `minimumValue` |
| `find_incumbent_supplier` | Who holds work for a buyer/category | `buyer`; optional `cpvCodes` |
| `find_likely_recompetes` | Ranked renewal / rebid targets | optional `cpvCodes`, `windowMonths`, `minimumValue`, filters |
| `get_supplier_profile` | Public-sector award history for a supplier | `supplier` |
| `get_buyer_profile` | Buyer awards, expiries, open tenders | `buyer` |
| `find_current_opportunities` | Open / active tenders | optional `query`, `cpvCodes`, closing dates, value bounds |
| `match_supplier_to_opportunities` | Fit open tenders to a supplier’s history | `supplier` |

#### Quick map for agents

| Intent | Prefer |
|--------|--------|
| “What IT contracts expire in the next 6 months?” | `find_expiring_contracts` |
| “Who is the incumbent for this trust on CPV 72000000?” | `find_incumbent_supplier` |
| “Where should we look for renewals?” | `find_likely_recompetes` |
| “Summarise this supplier’s public-sector wins” | `get_supplier_profile` |
| “What is this authority buying?” | `get_buyer_profile` |
| “Open cloud tenders closing soon” | `find_current_opportunities` |
| “Which live tenders fit this supplier?” | `match_supplier_to_opportunities` |

***

### Example inputs

#### Expiring contracts

```json
{
  "operation": "find_expiring_contracts",
  "endingFrom": "2026-08-01",
  "endingTo": "2026-12-31",
  "cpvCodes": ["72000000"],
  "minimumValue": 100000,
  "maxResults": 20
}
```

#### Likely recompetes

```json
{
  "operation": "find_likely_recompetes",
  "cpvCodes": ["72000000"],
  "windowMonths": 12,
  "minimumValue": 250000,
  "maxResults": 20
}
```

`recompeteScore` is an **explainable points score** with `scoreFactors[]`. It is **not** a calibrated win probability.

#### Incumbent (conservative)

```json
{
  "operation": "find_incumbent_supplier",
  "buyer": "Example NHS Trust",
  "cpvCodes": ["72000000"]
}
```

If evidence is weak the Actor returns `NO_CREDIBLE_INCUMBENT` rather than guessing.

#### Match supplier to opportunities

```json
{
  "operation": "match_supplier_to_opportunities",
  "supplier": "Acme Software Limited",
  "maxResults": 20
}
```

Matching uses deterministic CPV overlap, keyword similarity and prior buyer history — not an LLM judgment.

***

### Errors to handle

| Code | Meaning |
|------|---------|
| `DATA_NOT_READY` | Underlying notice corpus is not ready yet — retry later |
| `INVALID_DATE_RANGE` | `endingFrom` is after `endingTo` |
| `INVALID_CPV_CODE` | CPV codes must be 8 digits |
| `NO_CREDIBLE_INCUMBENT` | No conservative incumbent match |
| `INSUFFICIENT_RECOMPETE_EVIDENCE` | No candidates met the evidence threshold |
| `BUYER_NOT_FOUND` / `SUPPLIER_NOT_FOUND` | No matching organisation in the corpus |
| `RESULT_LIMIT_EXCEEDED` | `maxResults` above 50 |

Empty lists with `success: true` are normal when nothing matches.

***

### Provenance

Where available, rows include `sourceEvidence` (OCID, release id, notice URL). Prefer citing those in answers.

***

### Keywords

UK government contracts · UK tenders · Find a Tender · public procurement · public sector opportunities · contract expiry · expiring government contracts · incumbent supplier · recompete · contract renewal · bid opportunities · supplier intelligence · buyer intelligence · CPV · MCP

# Actor input Schema

## `operation` (type: `string`):

Which procurement intelligence tool to run.

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

Optional free-text filter on title/buyer.

## `buyer` (type: `string`):

Public-sector buyer name.

## `supplier` (type: `string`):

Supplier / incumbent name.

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

Eight-digit CPV codes to filter by.

## `endingFrom` (type: `string`):

For find\_expiring\_contracts: start of end-date window (YYYY-MM-DD).

## `endingTo` (type: `string`):

For find\_expiring\_contracts: end of end-date window (YYYY-MM-DD).

## `windowMonths` (type: `integer`):

For find\_likely\_recompetes: how many months ahead to look.

## `minimumValue` (type: `number`):

Minimum contract or opportunity value in GBP.

## `maximumValue` (type: `number`):

Maximum opportunity value in GBP.

## `closingFrom` (type: `string`):

For find\_current\_opportunities: earliest tender closing date (YYYY-MM-DD).

## `closingTo` (type: `string`):

For find\_current\_opportunities: latest tender closing date (YYYY-MM-DD).

## `maxResults` (type: `integer`):

Maximum rows to return (hard maximum 50).

## Actor input object example

```json
{
  "operation": "find_expiring_contracts",
  "cpvCodes": [
    "72000000"
  ],
  "windowMonths": 12,
  "maxResults": 20
}
```

# Actor output Schema

## `result` (type: `string`):

Default dataset item containing the procurement intelligence envelope.

# 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 = {
    "cpvCodes": [
        "72000000"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dogmatic_eyepiece/uk-government-contract-intelligence").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 = { "cpvCodes": ["72000000"] }

# Run the Actor and wait for it to finish
run = client.actor("dogmatic_eyepiece/uk-government-contract-intelligence").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 '{
  "cpvCodes": [
    "72000000"
  ]
}' |
apify call dogmatic_eyepiece/uk-government-contract-intelligence --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dogmatic_eyepiece/uk-government-contract-intelligence"
        }
    }
}

```

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/2ca7GHRpN9zUL8Wfc/builds/rrCcSl76KJBfAYHIu/openapi.json
