# SiteVerdict — UK Contract Awards & Supplier Win Analytics (`siteverdict/siteverdict-uk-contract-awards`) Actor

Who won which UK public contract, for how much, from which buyer: Contracts Finder + Find a Tender award notices (OCDS open data, OGL). Supplier and buyer analytics (wins, value share, top buyers, CPV, bids where published), monitoring and Slack/webhook alerts.

- **URL**: https://apify.com/siteverdict/siteverdict-uk-contract-awards.md
- **Developed by:** [Aman Thakran](https://apify.com/siteverdict) (community)
- **Categories:** Business, Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

## SiteVerdict — UK Contract Awards & Supplier Win Analytics

**See who is winning UK public-sector contracts, for how much and from whom. Every award notice on Find a Tender and Contracts Finder becomes a clean row (winner, value, buyer, date, CPV, procedure, bids received where published) plus supplier and buyer analytics: wins, total value, share of the market you filtered, top buyers and categories.**

Official open data only (OCDS APIs, Open Government Licence). No key, no scraping. It complements **SiteVerdict Public Tenders**, which finds *open* opportunities — this Actor tells you who *won*.

### Three ways teams use it

1. **Bid teams:** "Who won IT services (CPV 72) contracts over £100k from NHS trusts last quarter, and how often?" → competitor shortlist, incumbents and renewal timing (contract end dates).
2. **Sales to suppliers:** fresh winners need staff, subcontractors, finance and insurance. Monitor mode sends you new winners every morning.
3. **Market analysts and journalists:** supplier concentration per buyer, SME share, single-bid awards, framework share.

### Before / after

**You give:**

```json
{ "cpvCodes": ["72", "48"], "minValue": 100000, "awardedFrom": "2026-07-01", "awardedTo": "2026-09-30", "includeBuyerAnalytics": true }
```

**You get — award rows:**

```json
{ "awardDate": "2026-10-07", "supplier": { "name": "Civica UK Limited", "sme": false, "companiesHouseNumber": null }, "value": 130923, "currency": "GBP",
  "buyer": { "name": "…" }, "title": "…", "mainCpv": { "code": "72…", "label": "…" }, "competition": { "bidsReceived": null },
  "source": "contractsFinder", "noticeUrl": "https://www.contractsfinder.service.gov.uk/Notice/…" }
```

**— and supplier analytics:**

```json
{ "supplier": "…", "awardsWon": 14, "totalValue": 3820000, "shareOfValuePct": 9.6, "distinctBuyers": 11,
  "topBuyers": [{ "buyer": "…", "awards": 3, "value": 910000 }], "topCpvDivisions": [{ "division": "72", "label": "IT services…", "awards": 9 }],
  "competition": { "awardsWithBidData": 6, "averageBidsReceived": 4.3, "wonWithSingleBid": 1 } }
```

(Row values from the recorded 8 Oct 2026 sample; analytics numbers illustrate the format.)

### What you get

| Output | Contents |
|---|---|
| **Award rows** (one per winning supplier) | supplier name, ID, Companies House number when published, SME/VCSE flags, supplier town/postcode/country; award value + where it came from (award, contract, notice total, or lot estimate), currency, award/publication dates, contract start/end; buyer name/type/town; title, description, all CPV codes + main CPV; procedure, regime, framework, above-threshold; bids received / final-stage bids / SME bids / lowest & highest valid bid where Find a Tender publishes them; regions; notice link; `isNew` |
| **Supplier analytics** | awards won, total and average value, largest award, share of awards and of value in your filtered set, distinct buyers, top buyers, top CPV divisions, first/last award, average bids where known, single-bid wins, framework share |
| **Buyer analytics** (optional) | awards, total value, distinct suppliers, SME share, top suppliers, top CPV divisions |

The same award published on both platforms is counted once (Find a Tender preferred).

### Win rate — what is and is not possible

UK award notices list **winners**, not every bidder, so a true "bids won ÷ bids submitted" rate cannot be computed from open data. We report **win share** (share of awards and value in your filtered market) and, where Find a Tender publishes bid statistics, the **number of bids received** for the contracts each supplier won.

### Monitoring & alerts

`mode: monitor` remembers every award it has seen (`monitorStateName`) and returns only new ones; schedule it daily. Slack and/or HTTPS webhook alerts list new matching awards (optionally only above `alertMinValue`). The first monitor run is a silent baseline (no alert).

### Pricing (pay per event)

| Event | Price | When |
|---|---|---|
| `award` | $0.002 | an award row is delivered |
| `supplier-profile` | $0.01 | a supplier analytics row is delivered |
| `buyer-profile` | $0.01 | a buyer analytics row is delivered |

Free: errors, empty runs, monitor runs with nothing new, sample mode.
**Examples:** one month of IT awards (~600 rows) + top 25 suppliers ≈ **$1.45**; a daily monitor with ~20 new matching awards ≈ **$0.04/day**.

### Limits

- Date filters use the notices' **publication/update** date (what the APIs index); award dates are in the rows.
- Contracts Finder allows ~12 requests per window (we pace one per 5.5 s), and Find a Tender asks clients to pause for 120 s after about 20 quick requests (measured 15 Oct 2026). A 30-day all-sector pull can therefore take 10–20 minutes. Use filters, a shorter date range and `maxPagesPerSource`.
- **Run time limit:** the Actor watches its own run timeout. Near the limit it stops fetching, writes every award it already has and finishes with the status "Partial (run time limit)" instead of being killed with nothing saved. Each source gets a fair share of the time, so a slow source cannot starve the other. Raise the run timeout (Run options) for a complete pull.
- Values are as published: may be estimates, framework ceilings or totals across lots (`valueSource` says which).
- Scotland (PCS) and Wales (Sell2Wales) awards are not included in v1.

### Sources & compliance

- **Find a Tender** OCDS API (`find-tender.service.gov.uk/api/1.0/ocdsReleasePackages`) and **Contracts Finder** OCDS search API (`contractsfinder.service.gov.uk/Published/Notices/OCDS/Search`), checked 11 Oct 2026. Both publish under the **Open Government Licence v3.0** ("Contains public sector information licensed under the Open Government Licence v3.0."). Honest User-Agent `SiteVerdict/uk-contract-awards (hello@webrevenuescan.com)`, documented rate limits respected, Retry-After honoured.
- Personal data: supplier contact points (people's names, e-mails, phones) are never output. Some suppliers are sole traders whose business name is a person's name, published by the buyer under procurement transparency rules; if you use rows for outreach you are the controller — UK GDPR and PECR apply.
- Disclaimer: award data as published by contracting authorities. Not legal or procurement advice.

Built by SiteVerdict (BharatFare Travel and Technologies Ltd, UK). Contact: hello@webrevenuescan.com.

# Changelog

This Actor's version history is a separate document: https://apify.com/siteverdict/siteverdict-uk-contract-awards/changelog.md

# Actor input Schema

## `mode` (type: `string`):

<b>Search</b>: all matching awards in the window. <b>Monitor</b>: only awards not seen in previous runs (schedule daily, get alerts).

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

Sources.

## `awardedFrom` (type: `string`):

YYYY-MM-DD. Notices published/updated from this date. Default: last 30 days (7 in monitor mode).

## `awardedTo` (type: `string`):

YYYY-MM-DD. Default: today.

## `lookbackDays` (type: `integer`):

Look-back days (when no dates).

## `suppliers` (type: `array`):

Suppliers (name contains, or Companies House number).

## `buyers` (type: `array`):

Buyers (name contains).

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

Keywords (title/description/CPV, any).

## `excludeKeywords` (type: `array`):

Exclude keywords.

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

e.g. 72 (IT services), 48 (software packages), 79 (business services), 45 (construction).

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

Minimum award value (£).

## `maxValue` (type: `integer`):

Maximum award value (£).

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

SME winners only.

## `includeAwardRows` (type: `boolean`):

Output award rows.

## `includeSupplierAnalytics` (type: `boolean`):

Per supplier: awards won, total value, share of the filtered market, top buyers, CPV divisions, average bids where published.

## `topSuppliers` (type: `integer`):

How many supplier profiles.

## `includeBuyerAnalytics` (type: `boolean`):

Output buyer analytics.

## `topBuyers` (type: `integer`):

How many buyer profiles.

## `maxAwards` (type: `integer`):

Max award rows.

## `maxPagesPerSource` (type: `integer`):

Max pages per source (100 notices each).

## `monitorStateName` (type: `string`):

Monitor name.

## `alertMinValue` (type: `integer`):

Alert only for awards of at least (£).

## `slackWebhookUrl` (type: `string`):

HTTPS only. Stored encrypted, never logged.

## `webhookUrl` (type: `string`):

HTTPS endpoint; private addresses refused. Stored encrypted, never logged.

## `sampleMode` (type: `boolean`):

Sample mode (recorded real awards, no charge).

## Actor input object example

```json
{
  "mode": "search",
  "sources": [
    "fts",
    "contractsFinder"
  ],
  "suppliers": [],
  "keywords": [
    "software"
  ],
  "smeOnly": false,
  "includeAwardRows": true,
  "includeSupplierAnalytics": true,
  "topSuppliers": 25,
  "includeBuyerAnalytics": false,
  "topBuyers": 10,
  "maxAwards": 2000,
  "maxPagesPerSource": 60,
  "monitorStateName": "default",
  "alertMinValue": 0,
  "sampleMode": false
}
```

# Actor output Schema

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

No description

## `output` (type: `string`):

No description

## `files` (type: `string`):

No description

# 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 = {
    "mode": "search",
    "suppliers": [],
    "keywords": [
        "software"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("siteverdict/siteverdict-uk-contract-awards").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 = {
    "mode": "search",
    "suppliers": [],
    "keywords": ["software"],
}

# Run the Actor and wait for it to finish
run = client.actor("siteverdict/siteverdict-uk-contract-awards").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 '{
  "mode": "search",
  "suppliers": [],
  "keywords": [
    "software"
  ]
}' |
apify call siteverdict/siteverdict-uk-contract-awards --silent --output-dataset

```

## MCP server setup

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

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/LwtUaYYofuqV8T6gI/builds/4reuuuvWWoKKUTy6t/openapi.json
