# Government Contract Winners B2B Leads – UK & Singapore (`zhucl1006/government-contract-winners-leads`) Actor

B2B lead list of companies that just won public-sector contracts (UK Contracts Finder, Singapore GeBIZ). Each lead: award, buyer, value, Companies House no., verified website, tech stack, contact page, generic company email. Company-level data only. From $3 per 1,000 basic leads.

- **URL**: https://apify.com/zhucl1006/government-contract-winners-leads.md
- **Developed by:** [leo zhu](https://apify.com/zhucl1006) (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 $15.00 / 1,000 enriched leads

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

## Government Contract Winners – B2B Leads (UK & Singapore)

**$3 per 1,000 basic leads, $15 per 1,000 enriched leads · official award notices · company-level data only · CSV, Excel, JSON or API.**

**Get a B2B lead list of companies that have just won public-sector contracts.** Each lead is a supplier company taken from official award notices (UK **Contracts Finder** and Singapore **GeBIZ**). We add the company's **own website** (checked against the company name or registration number), its **technology stack**, and the **generic contact page, company inbox and switchboard** that the company publishes itself.

A company that just won a public contract has new budget, a delivery deadline and often new hiring needs. That makes it a good prospect if you sell:

- subcontracting, staffing and recruitment, equipment hire, materials;
- software, SaaS, IT services, cyber security, cloud;
- bid writing, compliance (ISO, Cyber Essentials), insurance, finance and invoice factoring;
- agency services: web, marketing, PR.

> Company-level data only. The Actor never exports names, personal emails or phone numbers of individuals.

### What you get (one row per company)

| Field | Example | Notes |
|---|---|---|
| `companyName` | `Fivium Limited` | Supplier name as published in the award notice |
| `country` | `GB` / `SG` | |
| `companiesHouseNumber`, `companiesHouseUrl` | `05775733` | UK only, when the notice includes it |
| `isSme` | `true` | UK only, as declared in the notice |
| `supplierPostcode` | `EC4A 3HQ` | Registered-address postcode from the notice (UK) |
| `website`, `websiteDomain` | `https://www.fivium.co.uk/` | The company's own site, verified (see below) |
| `websiteConfidence`, `websiteMatch` | `high`, `companies-house-number-on-site` | How the site was verified |
| `contactPageUrl`, `hasContactForm` | `https://www.fivium.co.uk/contact` | The company's own contact page |
| `genericEmails` | `enquiries@fivium.co.uk` | **Role mailboxes on the company's own domain only** (info@, sales@, enquiries@ …) |
| `sitePhone` | `+44…` | Switchboard number published on the company's site (E.164) |
| `linkedinCompanyUrl`, `facebookUrl`, `xUrl` | | Company pages only (personal profiles are dropped) |
| `cms`, `ecommerce`, `analytics`, `marketingTools`, `hostingCdn` | `WordPress`, `Google Analytics`, `HubSpot` | From the homepage (7,600+ fingerprints) |
| `emailProvider` | `Microsoft 365` / `Google Workspace` | From the domain's public MX records |
| `technologies`, `technologyCount` | | Full list of detected technologies |
| `awardsCount`, `totalAwardedValue`, `currency` | `3`, `412000`, `GBP` | Awards in the chosen window |
| `latestAwardDate`, `latestAwardTitle`, `latestAwardValue`, `latestBuyer`, `latestNoticeUrl` | | The most recent win, with a link to the official notice |
| `buyers`, `categories`, `deliveryRegion` | `NHS England; Home Office` | Buyers, CPV descriptions and region (UK) |
| `enrichmentStatus`, `checkedAt`, `source`, `licence`, `attribution` | | Where the data came from and how you may use it |

Download the dataset as CSV, Excel, JSON, or through the API, or send it straight to your CRM with Apify integrations (Make, Zapier, n8n, HubSpot via webhook).

### Input

| Field | Default | Description |
|---|---|---|
| `sources` | `["uk"]` | `uk` = Contracts Finder (updated daily), `sg` = GeBIZ via data.gov.sg |
| `daysBack` | `14` | UK: notices published in the last N days (1–92) |
| `sgDaysBack` | `90` | Singapore: days back from the latest award in the dataset |
| `dateFrom`, `dateTo` | – | Optional explicit window |
| `keywords` | – | Contract title or description contains any of these (e.g. `software`, `cleaning`, `cyber`) |
| `buyerKeywords` | – | Buyer or agency contains (e.g. `NHS`, `council`, `Land Transport Authority`) |
| `cpvPrefixes` | – | UK CPV prefixes, e.g. `72` (IT services), `48` (software), `45` (construction) |
| `regions` | – | UK delivery region contains (e.g. `London`, `Scotland`) |
| `minAwardValue`, `maxAwardValue` | – | Award value range in GBP or SGD |
| `smeOnly` | `false` | UK: only SME suppliers |
| `excludePublicBodies` | `true` | Skip suppliers that are councils, NHS trusts, universities and similar |
| `excludeCompanies` | – | Skip names containing these strings (e.g. your competitors or existing clients) |
| `sortBy` | `latestAward` | `latestAward`, `totalValue` or `awardsCount` |
| `maxLeads` | `50` | The run stops after this many leads |
| `onlyWithWebsite` | `true` | `true`: you only receive (and pay for) enriched leads. `false`: also returns cheaper basic leads with award and company data only |
| `includeTechStack` | `true` | Detect the technology stack and email provider |
| `maxContactPages` | `2` | Contact or about pages read per site (0 = homepage only) |
| `includeUnincorporated` | `false` | Off by default. Suppliers without Ltd, LLP, PLC, Pte etc. and without a company number may be sole traders (natural persons), so they are skipped |

Example: IT and software suppliers that won UK public contracts worth £25k or more in the last 30 days:

```json
{ "sources": ["uk"], "daysBack": 30, "cpvPrefixes": ["72", "48"], "minAwardValue": 25000, "maxLeads": 200 }
```

### How the website is found and verified

No search engine is scraped and no paid directory is used. From the legal or trading name we build a short list of likely domains (for example `fivium.co.uk`, `fivium.com`) and keep the ones that exist in DNS. For each, we load the homepage (robots.txt is respected) and accept the site **only if it proves that it belongs to that company**:

- **high**: the UK Companies House number is printed on the site (UK companies must show it), or the full legal name appears on the page;
- **medium**: the trading or brand name appears in the page title or site name **and** in the domain, the remaining name words appear on the page, **and** the site shows a UK or Singapore signal (`.uk`/`.sg` domain, postcode, `+44`/`+65`, or the country name).

Parked, for-sale and placeholder pages, directory sites and anti-bot challenge pages are rejected. Companies with no verifiable site are not charged when `onlyWithWebsite` is on. In tests, about **45–55 % of UK winners** and **30–40 % of Singapore winners** received a verified website. Large companies and SMEs with a domain that matches their name score best.

### Data sources and legal basis

| Data | Source | Licence / basis |
|---|---|---|
| UK awards | [Contracts Finder OCDS API](https://www.contractsfinder.service.gov.uk/apidocumentation), Cabinet Office / Crown Commercial Service | **Open Government Licence v3.0**: commercial re-use allowed with attribution (stated in every API response) |
| Singapore awards | ["Government Procurement via GeBIZ"](https://data.gov.sg/datasets/d_acde1106003906a75c3fa052592f2fcb/view), Ministry of Finance, via data.gov.sg | **Singapore Open Data Licence v1.0**: commercial use allowed with attribution |
| Website, contact page, tech stack | The company's own public website (homepage plus at most 2 contact or about pages) | Publicly available pages. robots.txt is followed (RFC 9309; unreachable robots = no crawl). Identified user agent, about 3–5 requests per site, no login, no CAPTCHA bypass, no proxies used to evade blocks |
| Email provider | Public DNS (MX/SPF) records | Public infrastructure data |
| Tech fingerprints | [enthec/webappanalyzer](https://github.com/enthec/webappanalyzer) | GPL-3.0 rules, fetched at build time |

Every row carries `source`, `licence` and `attribution`. Keep the attribution when you republish the award data.

**Privacy.** The Actor processes only company-level data. Buyer contact names and emails in the notices are never exported. Suppliers that may be individuals are skipped by default. Only *role* mailboxes on the company's own domain are returned (no `firstname.lastname@`), and LinkedIn personal profiles are dropped. You are the controller of how you use the list. In the UK, B2B emails to corporate subscribers must identify you and offer an opt-out (PECR), and UK GDPR legitimate-interest rules still apply.

### Pricing (pay per event)

| Event | Price | When |
|---|---|---|
| **Enriched lead** | **$0.015** ($15 per 1,000) | A company with a verified website, contact page and tech stack is saved |
| Basic lead | $0.003 | A company without a verified website is saved (only when `onlyWithWebsite` = `false`) |
| Actor start | $0.00005 | Apify's standard start fee |

There are no platform-usage charges on top. Examples: 50 enriched leads = **$0.75**, 500 = **$7.50**. Companies that cannot be verified cost you nothing in the default mode. Set *Maximum cost per run* in Apify Console to cap spend.

### Data freshness and limitations

- **UK**: Contracts Finder publishes about 100–150 award notices per working day. Run daily or weekly with `daysBack` 1–7 to get new winners only.
- **Singapore**: the Ministry of Finance publishes the GeBIZ awards dataset on data.gov.sg in batches (currently up to 31 Mar 2026). `sgDaysBack` counts back from the latest date available, and `sgDatasetCoverageEnd` in `RUN_SUMMARY` shows that date.
- UK Contracts Finder mainly carries lower-value contracts (from about £12k for central government and £30k for other public bodies). Many large above-threshold awards are published only on Find a Tender, which is not covered yet. Some framework awards list many suppliers or "see attachment", and such placeholder supplier names are skipped.
- Some sites block automated requests or disallow them in robots.txt. Those companies are skipped, never forced.
- The run summary (key-value store `RUN_SUMMARY`) shows the counts: notices read, companies found, verified sites, blocked and robots-disallowed sites.

### FAQ

**Can I get the decision-maker's name and email?** No. This Actor is company-level only by design. Use the website, contact page and company LinkedIn page to reach the company through its official channels.

**Why didn't company X get a website?** Its name did not map to a domain that proves ownership, the site blocked us, or robots.txt disallowed it. Turn off `onlyWithWebsite` to still receive it as a basic lead.

**Can I monitor new winners automatically?** Yes. Create a Task with `daysBack: 1` and schedule it daily, then send the results to Google Sheets, Slack or your CRM with an Apify integration.

**Other countries?** Canada (CanadaBuys) is next. Ask in the Issues tab.

Related Actors by the same author: [UK Contract Awards (Contracts Finder)](https://apify.com/zhucl1006/uk-contracts-finder-awards), [GeBIZ Singapore Tender Awards](https://apify.com/zhucl1006/gebiz-singapore-tender-awards), [Website Tech Stack & Domain Intelligence](https://apify.com/zhucl1006/website-tech-stack-domain-intelligence), [Website Contact Info Extractor](https://apify.com/zhucl1006/website-contact-info-extractor).

# Actor input Schema

## `sources` (type: `array`):

uk = UK Contracts Finder award notices (updated daily). sg = Singapore GeBIZ awards from data.gov.sg (the government publishes this dataset in yearly batches; see README).

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

Ignored when dateFrom is set.

## `sgDaysBack` (type: `integer`):

Singapore awards are published by the Ministry of Finance in yearly batches, so the window ends at the latest award date in the dataset.

## `dateFrom` (type: `string`):

UK: notice published date. Singapore: award date.

## `dateTo` (type: `string`):

Optional end date.

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

Keep awards whose title/description contains any of these words, e.g. software, cleaning, cyber, consultancy.

## `buyerKeywords` (type: `array`):

e.g. NHS, council, Ministry of Defence, Land Transport Authority.

## `cpvPrefixes` (type: `array`):

e.g. 72 (IT services), 48 (software), 79 (business services), 90 (cleaning/environmental).

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

e.g. London, North West, Scotland.

## `minAwardValue` (type: `integer`):

Minimum award value (GBP / SGD)

## `maxAwardValue` (type: `integer`):

Maximum award value (GBP / SGD)

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

Only suppliers flagged as SME in the notice.

## `excludePublicBodies` (type: `boolean`):

Skip suppliers that are themselves public bodies.

## `excludeCompanies` (type: `array`):

Skip suppliers whose name contains any of these strings.

## `sortBy` (type: `string`):

Which contract winners are enriched first.

## `maxLeads` (type: `integer`):

The run stops when this many leads are saved.

## `onlyWithWebsite` (type: `boolean`):

On: you only get (and pay for) enriched leads. Off: companies whose website could not be verified are also returned as cheaper basic leads (award + company data only).

## `includeTechStack` (type: `boolean`):

Detect CMS, analytics, e-commerce, marketing tools and email provider from the homepage and DNS.

## `maxContactPages` (type: `integer`):

0 = homepage only.

## `concurrency` (type: `integer`):

Higher is faster.

## `requestTimeoutSecs` (type: `integer`):

Per HTTP request.

## `includeUnincorporated` (type: `boolean`):

Off by default: names without Ltd/LLP/PLC/Pte etc. and without a Companies House number may be individuals, and this Actor exports company-level data only.

## Actor input object example

```json
{
  "sources": [
    "uk"
  ],
  "daysBack": 14,
  "sgDaysBack": 90,
  "keywords": [],
  "smeOnly": false,
  "excludePublicBodies": true,
  "sortBy": "latestAward",
  "maxLeads": 25,
  "onlyWithWebsite": true,
  "includeTechStack": true,
  "maxContactPages": 2,
  "concurrency": 8,
  "requestTimeoutSecs": 12,
  "includeUnincorporated": false
}
```

# Actor output Schema

## `leads` (type: `string`):

All leads (dataset items), shown with the 'overview' view by default.

## `runSummary` (type: `string`):

Counts: award notices read, companies found, verified websites, blocked/robots-disallowed sites, data windows.

# 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 = {
    "sources": [
        "uk"
    ],
    "daysBack": 14,
    "keywords": [],
    "maxLeads": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("zhucl1006/government-contract-winners-leads").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 = {
    "sources": ["uk"],
    "daysBack": 14,
    "keywords": [],
    "maxLeads": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("zhucl1006/government-contract-winners-leads").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 '{
  "sources": [
    "uk"
  ],
  "daysBack": 14,
  "keywords": [],
  "maxLeads": 25
}' |
apify call zhucl1006/government-contract-winners-leads --silent --output-dataset

```

## MCP server setup

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

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/j0dDHcMeftIq3lJaP/builds/CcvVTzyX0UoMGceML/openapi.json
