# SiteVerdict — UK Gender Pay Gap Data & Benchmarks (`siteverdict/siteverdict-uk-gender-pay-gap`) Actor

Official UK gender pay gap data (all years since 2017): employer search by name or company number, year-by-year trends, sector benchmarks and percentiles, possibly-missing filings, monitoring alerts and CSV export. Open data (OGL), no key needed.

- **URL**: https://apify.com/siteverdict/siteverdict-uk-gender-pay-gap.md
- **Developed by:** [Aman Thakran](https://apify.com/siteverdict) (community)
- **Categories:** Business, Jobs
- **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 Gender Pay Gap Data & Benchmarks

**Every UK gender pay gap filing since 2017, matched to the employers you care about, benchmarked against their sector, with year-by-year trends, possibly-missing filings and alerts when new figures land.**

Official open data from the UK Government gender pay gap service (Open Government Licence). No API key, no scraping, no proxies.

### What you get

- 🏢 **Employer reports**: search by name, Companies House number or service id. Every year's mean and median hourly gap, bonus gaps, % of men and women receiving a bonus, women's share of each pay quartile, employer size, late-filing flag, written-statement link.
- 📈 **Trend**: change in the median gap (percentage points) between the first and last year, labelled *narrowing*, *widening*, *stable* or *reversed*, plus late filings and missing years.
- 🧭 **Benchmark**: the employer's percentile in its SIC sector and nationally, against the sector median.
- 🏭 **Sector benchmarks**: by SIC section (`J`), SIC prefix (`62`, `64191`), `public` or `all`: employers, median of median gaps, quartiles, % paying men more, women in the top quartile, bonus gap, late-filing rate, per year.
- 🚩 **Possibly-missing filings**: employers that reported last year (250+ staff) but have nothing after this year's deadline, with a confidence level.
- 🔔 **Monitor mode**: schedule it and get Slack/webhook alerts when a watched employer files or amends its figures.
- 📄 **CSV exports** (`employer-reports.csv`, `sector-benchmarks.csv`) and an optional **AI brief** written by *your own* Anthropic/OpenAI key.

### Who it is for

- **HR, reward and DEI teams** benchmarking against competitors and the sector before publishing their own figures.
- **ESG analysts and investors** screening portfolios for pay-equity trends and late or missing reporting.
- **Journalists and researchers** building sector league tables and year-on-year stories.
- **Recruiters and employer-branding agencies** preparing client comparisons.
- **AI agents** via the MCP tool `uk_gender_pay_gap` on the SiteVerdict MCP server.

### Quick start

1. Add employers (one per line): `Tesco Stores`, `00445790`, `id:19070`.
2. Optionally add sectors: `J`, `62`, `public`.
3. Run. Try **Sample mode** first (no network, free).

#### Example input

```json
{
  "employers": ["Tesco Stores", "Sainsbury's Supermarkets", "00445790"],
  "sectors": ["G", "47"],
  "yearFrom": 2021,
  "missingFilingsScope": "sectors",
  "monitorMode": true,
  "slackWebhookUrl": "<secret>"
}
```

#### Example output (live run 11 Oct 2026, abridged)

```json
{ "recordType": "employer-report", "employerName": "TESCO STORES LIMITED", "employerId": "12141", "latestYear": 2025,
  "latest": { "medianHourlyGap": 4.8, "meanHourlyGap": 7.7, "femaleTopQuartile": 35.4, "submittedLate": false },
  "trend": { "firstYear": 2023, "lastYear": 2025, "changePp": -0.1, "direction": "stable", "lateFilings": 0, "missingYears": [] },
  "benchmark": { "sectorEmployers": 949, "sectorMedianOfMedianGap": 4.9, "nationalMedianOfMedianGap": 8, "percentileInSector": 49, "percentileNational": 40 } }

{ "recordType": "sector-benchmark", "sectorLabel": "SIC section J: Information and communication",
  "latest": { "year": 2025, "employers": 668, "medianOfMedianHourlyGap": 14, "p25MedianHourlyGap": 7, "p75MedianHourlyGap": 20.8, "pctEmployersPayingMenMore": 90.1, "medianWomenInTopQuartile": 24.2, "lateFilingPct": 5.8 } }

{ "recordType": "missing-filing-flag", "employerName": "BLUE STOCKINGS (UK) LIMITED", "missingYear": 2024, "deadline": "2025-04-05T00:00:00Z",
  "lastReportedYear": 2023, "lastReportedSize": "500 to 999", "confidence": "medium" }
```

Benchmarks above are from a live run over all filings (about 11,000 employers a year). Sample mode uses a 34-employer extract, so its sector and national figures are not representative.

### How it works

- Downloads the official yearly CSVs (`/viewing/download-data/{year}`, ~4 MB each) once per run, politely (1.5 s between files, honest user agent).
- **Snapshot years**: `2025` means the reporting year 2025 to 2026 (snapshot 31 March / 5 April 2025, deadline April 2026). By default the last 5 years whose deadline has passed are used.
- **Matching**: exact on service id and company number; names are normalised (LTD/PLC/THE removed, & = AND) and scored (exact > prefix > all words). Raise *Matches per employer query* for groups with several legal entities.
- **Missing filings** are only checked for years whose deadline has passed, only for employers that reported ≥ 250 staff the year before, and are skipped when the same company number filed under a new id.

### Pricing (pay per event)

| Event | Price | When |
|---|---|---|
| `employer-report` | $0.01 | one employer with all years, trend and benchmark |
| `sector-benchmark` | $0.02 | one sector with per-year statistics |
| `missing-filing-flag` | $0.005 | one possibly-missing filing |
| `filing-change-alert` | $0.01 | a watched employer filed or amended figures (monitor mode) |
| `ai-brief` | $0.05 | only when your own AI key returns a brief |

Examples: 50 competitors + 2 sectors ≈ **$0.54**. A whole sector's missing-filing sweep (e.g. 300 flags) ≈ $1.50. Errors, not-found rows, summaries and sample mode are free. No start fee.

### FAQ

**Is a pay gap the same as unequal pay?** No. The gap compares average hourly pay of all men and all women; unequal pay is paying people differently for equal work.

**Why is an employer missing?** Only employers with 250+ staff must report. Names change (use the company number), and public bodies report under their own names.

**Does "possibly missing" mean they broke the law?** No. They may have dropped below 250 staff, merged, been dissolved or reported under another entity. Treat it as a lead to check.

**Can I get the person who signed off each report?** The files include a "responsible person". It is **off by default** (data minimisation). Only enable it with a lawful basis.

### Limits

- Great Britain reporting only (the service covers England, Wales and Scotland employers; Northern Ireland has separate rules).
- Figures are self-reported and not audited. Some employers file late or amend later; monitor mode catches amendments.
- Max 500 employer queries, 50 sectors and 12 years per run.

### Sources & compliance

- **Source**: UK Government gender pay gap service, yearly downloads https://gender-pay-gap.service.gov.uk/viewing/download (column glossary on that page). Checked 11 Oct 2026.
- **Licence**: Open Government Licence v3.0 (site footer: "All content is available under the Open Government Licence v3.0, except where otherwise stated"). Attribution is attached to every row: *Contains public sector information from the UK Government gender pay gap service, licensed under the Open Government Licence v3.0.*
- **robots.txt**: none published (the path returns an error page); we download 1 file per year per run with a 1.5 s gap and an honest user agent `SiteVerdict/uk-gender-pay-gap (hello@webrevenuescan.com)`.
- **Personal data**: the only personal field ("responsible person") is excluded unless you switch it on. UK GDPR: you are the controller for how you use outputs; do not use them to profile or contact individuals. PECR does not apply (no electronic marketing).
- **Not legal, HR or investment advice.** Not affiliated with or endorsed by the Government Equalities Office or Cabinet Office.

# Changelog

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

# Actor input Schema

## `employers` (type: `array`):

One per line: an employer name (<code>Tesco</code>), a Companies House number (<code>00445790</code>, <code>SC016876</code>) or a service id (<code>id:19070</code>). Max 500.

## `sectors` (type: `array`):

SIC 2007 section letter (<code>J</code> = information and communication), a 2-5 digit SIC prefix (<code>62</code>, <code>64191</code>), <code>public</code> or <code>all</code>. Max 50.

## `yearFrom` (type: `integer`):

Snapshot year (2017 = reporting year 2017 to 2018). Default: 4 years before 'To'.

## `yearTo` (type: `integer`):

Default: the latest year whose reporting deadline (5 April the next year) has passed.

## `maxMatchesPerQuery` (type: `integer`):

Name searches can match several legal entities (e.g. Tesco Stores Ltd and Tesco PLC). Each match is one employer report.

## `checkMissingFilings` (type: `boolean`):

Flags employers that filed the previous year (250+ staff) but have no filing after this year's deadline. A heuristic, not proof of non-compliance.

## `missingFilingsScope` (type: `string`):

Only the matched employers, or every employer in the sectors above.

## `minSizeForMissing` (type: `string`):

Only flag employers whose last filing reported at least this size.

## `monitorMode` (type: `boolean`):

Remembers the matched employers' filings in a named key-value store and reports new filings and amended figures on later (scheduled) runs. The first run saves a baseline.

## `stateStoreName` (type: `string`):

Named key-value store that keeps the monitor state between runs.

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

We POST a JSON digest of alerts here (Zapier, Make, n8n, your API). Stored encrypted, never logged.

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

https://hooks.slack.com/services/... Stored encrypted, never logged.

## `exportCsv` (type: `boolean`):

Saves employer-reports.csv and sector-benchmarks.csv to the run's key-value store.

## `aiProvider` (type: `string`):

Adds a short analyst brief written by your own Anthropic or OpenAI account. Off by default; we never use our own key.

## `aiApiKey` (type: `string`):

Your own key. Stored encrypted, never logged or output.

## `aiModel` (type: `string`):

Default: claude-sonnet-5-5 (Anthropic) or gpt-4.1-mini (OpenAI).

## `includePersonalData` (type: `boolean`):

The files name the senior person who confirmed each filing. Off by default (UK GDPR data minimisation). Only enable if you have a lawful basis.

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

Replays a small extract of the official files (2022-2025) to show every output type. Nothing is charged.

## Actor input object example

```json
{
  "employers": [
    "Tesco Stores",
    "id:19070"
  ],
  "sectors": [
    "J"
  ],
  "maxMatchesPerQuery": 1,
  "checkMissingFilings": true,
  "missingFilingsScope": "matched",
  "minSizeForMissing": "250 to 499",
  "monitorMode": false,
  "stateStoreName": "siteverdict-gpg-monitor",
  "exportCsv": true,
  "aiProvider": "none",
  "includePersonalData": false,
  "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 = {
    "employers": [
        "Tesco Stores",
        "id:19070"
    ],
    "sectors": [
        "J"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("siteverdict/siteverdict-uk-gender-pay-gap").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 = {
    "employers": [
        "Tesco Stores",
        "id:19070",
    ],
    "sectors": ["J"],
}

# Run the Actor and wait for it to finish
run = client.actor("siteverdict/siteverdict-uk-gender-pay-gap").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 '{
  "employers": [
    "Tesco Stores",
    "id:19070"
  ],
  "sectors": [
    "J"
  ]
}' |
apify call siteverdict/siteverdict-uk-gender-pay-gap --silent --output-dataset

```

## MCP server setup

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

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/jMPLJfJnbfYrGUsjd/builds/1Gt70XNNeWdkZULxb/openapi.json
