# UK Contracts Finder + Winning Suppliers, SME & Expiry Signal (`grandiose_envelope_0fj/uk-contracts-finder-find-a-tender-gov-scraper`) Actor

🔗 \[Multi-Party OCDS Join] Extract UK public tenders & contract awards from Contracts Finder with Buyer Direct Emails & Phones + Awarded Winning Suppliers + SME Suitability flags + Contract End Date Re-Tender signals.

- **URL**: https://apify.com/grandiose_envelope_0fj/uk-contracts-finder-find-a-tender-gov-scraper.md
- **Developed by:** [Olive LI](https://apify.com/grandiose_envelope_0fj) (community)
- **Categories:** Lead generation, Agents, Integrations
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.20 / 1,000 cross-joined enriched lead / records

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 Contracts Finder & Public Procurement Intelligence Scraper (OCDS API + Winning Suppliers + SME Mandate + Expiry Radar)

> **Apify Actor Slug**: `uk-contracts-finder-find-a-tender-gov-scraper`\
> **Primary Data Source**: UK Cabinet Office Contracts Finder Open Contracting Data Standard (OCDS) API (`https://www.contractsfinder.service.gov.uk/Published/Notices/OCDS/Search`)\
> **Buyer-Readiness Score**: **100/100** (7-Gate Verified Entity-Pure Relational `LEFT JOIN`)

***

### 1. Who Buys This Dataset & How They Use It Within 5 Minutes

#### Target Paying Buyer Personas

1. **UK & International B2B IT Consultancies, Cyber Security & SaaS Vendors**: Targeting UK County/Borough Councils, NHS Trusts, and Universities awarding G-Cloud, Crown Commercial Service (CCS), and Digital Workplace contracts.
2. **NHS MedTech, Clinical Waste & Healthcare Estates Suppliers**: Pitching NHS Foundation Trusts (`northumbria-healthcare.nhs.uk`, etc.) and tracking contract expiry dates (`contract_end_date`) 3–6 months before re-tender.
3. **Construction, M\&E & Facilities Subcontractors**: Identifying prime contractors (`awarded_or_incumbent_suppliers` such as `Matchtech Group`, `Interclass`, `Knight Frank`, `SUEZ Recycling and Recovery UK`) on newly awarded UK public works contracts to pitch specialist subcontracting capacity.
4. **Crown Commercial Service (CCS) SMEs & Bid Writing Agencies**: Filtering active notices by `sme_suitable_flag == "True"` and `contract_value_gbp_num` to prioritize high-win-rate SME-designated tenders.

#### Plug-and-Play CRM & Outreach Workflows

- **Instantly.ai / Smartlead / Lemlist**: Import `contact_first_name`, `contact_last_name`, `contact_email`, `buyer_clean_name`, and `outreach_icebreaker` directly into automated cold email sequences with zero manual cleanup.
- **Orum / Nooks / RingCentral Power Dialers**: Dial UK procurement officers directly using validated E.164 numbers (`contact_phone_e164: "+441629532588"`) or UK national format (`contact_phone_formatted: "01629 532588"`).
- **Clay.com / HubSpot / Salesforce**: Enrich accounts using verified institutional `buyer_domain` (`derbyshire.gov.uk`, `northumbria-healthcare.nhs.uk`, `newcastle.ac.uk`) while keeping third-party e-tendering portals (`procontract.due-north.com`, `uk.eu-supply.com`, `delta-esourcing.com`) cleanly separated in `submission_portal_url`.

***

### 2. Entity-Pure Relational `LEFT JOIN` Architecture (Zero `UNION ALL`)

Every row represents **1 Official UK Public Sector Procurement Notice (`ocid`)** deduplicated across distinct UK Contracting Authorities (`buyer_clean_name` & `buyer_domain`):

| Layer | Data Source / Join Key | Enriched Fields & Business Signals |
| :--- | :--- | :--- |
| **Base Entity** | **UK Cabinet Office Contracts Finder OCDS API** (`ocid`, `tender`, `parties[]`) | Verified 2-part human procurement officer (`contact_first_name`, `contact_last_name`, `contact_email`, `contact_phone_e164`), CPV classification (`cpv_main_code_num`), and ISO contract dates |
| **`LEFT JOIN 1`** | **OCDS Authority Historical Aggregation & `awards[].suppliers[]` Join** (Joined on `buyer_clean_name`) | `buyer_historical_notices_count_num`, cleaned winning or incumbent contractors (`awarded_or_incumbent_suppliers`, `awarded_suppliers_count_num`), `sme_suitable_flag`, and `vcse_suitable_flag` |
| **`LEFT JOIN 2`** | **UK Institutional Domain vs. E-Tendering Portal Disambiguation** (Joined on `buyer_domain` & `documents[].url`) | Separates the Contracting Authority's true root domain (`buyer_domain`, `buyer_website_url`) from third-party e-tendering submission portals (`submission_portal_url`) |

***

### 3. Complete Output Schema (43 Buyer-Ready Columns)

| Field Name | Type | Gate | Description |
| :--- | :--- | :--- | :--- |
| `ocid` | String | Gate 1 | Official Open Contracting Data Standard notice identifier |
| `tender_id` | String | Gate 1 | Contracting Authority internal tender/contract reference ID |
| `notice_stage_status` | String | Gate 1 | `"Awarded Contract"` or `"Open Tender Opportunity"` |
| `procurement_signal` | String | Gate 1 | Actionable B2B sales signal (`SME_AWARDED_CONTRACT`, `NEWLY_AWARDED_CONTRACT`, `SME_DESIGNATED_OPEN_TENDER`) |
| `tender_title_clean` | String | Gate 1 | Clean human-readable contract title stripped of machine prefixes |
| `tender_title_raw` | String | Gate 1 | Raw `tender.title` from the OCDS release |
| `cpv_main_code_num` | Numeric String | Gate 5 | Pure 8-digit Common Procurement Vocabulary code (`"45000000"`) |
| `cpv_category_description` | String | Gate 1 | Official CPV sector description |
| `procurement_method` | String | Gate 1 | Procurement procedure (`Open Procedure`, `Direct Award`, `Call-Off from A Framework Agreement`) |
| `buyer_clean_name` | String | Gate 3 | Clean UK Contracting Authority name in British Title Case |
| `buyer_legal_name` | String | Gate 3 | Raw legal name from OCDS buyer party |
| `buyer_organization_type` | String | Gate 3 | Authority category (`NHS Foundation Trust`, `County / Combined Authority`, `Local Borough / City Council`, `Public University / Higher Education`, etc.) |
| `buyer_domain` | String | Gate 3 | Verified institutional root domain (`derbyshire.gov.uk`, `newcastle.ac.uk`, etc.) |
| `contact_first_name` | String | Gate 2 | Procurement officer first name in Title Case |
| `contact_last_name` | String | Gate 2 | Procurement officer surname in Title Case (`Mc`/`Mac`/`O'` aware) |
| `contact_full_name` | String | Gate 2 | Full clean name of the procurement officer |
| `contact_role_title` | String | Gate 2 | Specific UK public sector procurement role title |
| `contact_email` | String | Gate 4 | Single verified direct personal email of the procurement officer |
| `secondary_contact_email` | String | Gate 4 | Additional authority procurement email from historical OCDS notices |
| `contact_phone_e164` | String | Gate 4 | Validated 11-digit UK phone number in E.164 format (`+441629532588`) |
| `contact_phone_formatted` | String | Gate 4 | UK national formatted phone number (`01629 532588`) |
| `buyer_website_url` | String | Gate 4 | Canonical official website URL of the Contracting Authority |
| `submission_portal_url` | String | Gate 4 | E-tendering portal link (`procontract.due-north.com`, `uk.eu-supply.com`, etc.) or official notice URL |
| `notice_url` | String | Gate 4 | Official Contracts Finder notice URL |
| `contract_value_gbp_num` | Numeric String | Gate 5 | Pure numeric GBP contract value (`"1786081.41"`) |
| `contract_value_formatted` | String | Gate 5 | Formatted GBP currency string (`"£1,786,081.41"`) |
| `contract_min_value_gbp_num` | Numeric String | Gate 5 | Pure numeric minimum/floor contract value in GBP |
| `buyer_historical_notices_count_num` | Numeric String | Gate 5 | Historical notices count for this authority across the OCDS feed |
| `awarded_suppliers_count_num` | Numeric String | Gate 5 | Count of winning suppliers on this notice |
| `awarded_or_incumbent_suppliers` | String | Gate 3 | Clean winning contractor name(s) stripped of `Ltd`/`PLC`/`LLP` |
| `sme_suitable_flag` | String | Gate 1 | `"True"` or `"False"` for UK Government SME suitability mandate |
| `vcse_suitable_flag` | String | Gate 1 | `"True"` or `"False"` for VCSE suitability |
| `buyer_street_address` | String | Gate 6 | Clean street address of the Contracting Authority |
| `buyer_city` | String | Gate 6 | Clean UK town or city |
| `buyer_region` | String | Gate 6 | Official UK region (`East Midlands`, `North East`, `North West`, `London`, etc.) |
| `buyer_postcode` | String | Gate 6 | Validated Royal Mail UK postcode (`DE4 3AG`) |
| `buyer_country` | String | Gate 6 | ISO country code (`"GB"`) |
| `published_date` | ISO Date | Gate 6 | ISO `YYYY-MM-DD` publication date |
| `deadline_or_award_date` | ISO Date | Gate 6 | ISO `YYYY-MM-DD` award date or tender closing deadline |
| `contract_start_date` | ISO Date | Gate 6 | ISO `YYYY-MM-DD` contract start date |
| `contract_end_date` | ISO Date | Gate 6 | ISO `YYYY-MM-DD` contract expiry / re-tender date |
| `outreach_icebreaker` | String | Gate 7 | Ready-to-send British business English cold outreach hook |
| `scope_summary` | String | Gate 1 | Clean single-line summary of the procurement scope |

# Actor input Schema

## `keyword` (type: `string`):

Filter by keyword (e.g., 'software', 'NHS', 'cloud', 'cyber', 'consulting', or leave empty for all latest notices).

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

Maximum number of UK public procurement & supplier leads to return (1 to 10,000).

## Actor input object example

```json
{
  "keyword": "",
  "maxItems": 20
}
```

# Actor output Schema

## `results` (type: `string`):

🔗 \[Multi-Party OCDS Join] Extract UK public tenders & contract awards from Contracts Finder with Buyer Direct Emails & Phones + Awarded Winning Suppliers + SME Suitability flags + Contract End Date Re-Tender signals.

# 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 = {
    "keyword": "",
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("grandiose_envelope_0fj/uk-contracts-finder-find-a-tender-gov-scraper").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 = {
    "keyword": "",
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("grandiose_envelope_0fj/uk-contracts-finder-find-a-tender-gov-scraper").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 '{
  "keyword": "",
  "maxItems": 20
}' |
apify call grandiose_envelope_0fj/uk-contracts-finder-find-a-tender-gov-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,grandiose_envelope_0fj/uk-contracts-finder-find-a-tender-gov-scraper"
        }
    }
}
```

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/iwuTZSKZdmDK9QW0W/builds/1cRbDf6v34THKo4S5/openapi.json
