# UK Modern Slavery Statement Registry API (`tabulary/uk-modern-slavery-statements`) Actor

UK organisations' modern slavery statements from the Home Office's official statement registry: sector type, turnover band, which of the Modern Slavery Act's six recommended statement elements are covered, and a link to the PDF. Filter by organisation, sector or year, with an alert mode.

- **URL**: https://apify.com/tabulary/uk-modern-slavery-statements.md
- **Developed by:** [Tabulary](https://apify.com/tabulary) (community)
- **Categories:** Lead generation, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.40 / 1,000 statements

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

### What does UK Modern Slavery Statement Registry API do?

This Actor returns **UK modern slavery statements** straight from the Home Office's official
[modern slavery statement registry](https://modern-slavery-statement-registry.service.gov.uk/download),
as clean per-organisation JSON: sector type, turnover band, which of the Modern Slavery Act 2015's
six recommended statement elements (organisational structure, policies, risk assessment, due
diligence, training, goals) each statement covers, and a link to the published PDF. Every large UK
organisation (turnover over £36 million) that chooses to submit is on the register, so this is a
**modern slavery statement registry** export, not a sample. ESG and compliance teams, procurement
due-diligence teams and investors use it to screen a company, sector or supply chain for **modern
slavery compliance data** without touching the government's CSV download by hand. An optional
alert mode re-checks the current statement year and returns only statements added or updated since
your last run, which matters because organisations keep submitting through the year.

### What you get

- **Organisation identity:** name, parent group name (for group submissions), address, Companies
  House number, sector type (Private/Public), industry sector(s), turnover band.
- **Compliance coverage:** whether the statement covers each of the six recommended elements, plus
  a 0-6 count, and how many years the organisation has been producing statements.
- **Filing details:** the statement's reporting period, when it was approved and last updated, a
  link to the organisation's own published statement, and a direct PDF link.
- Filter by organisation name, sector type or statement year (2020 to the current year in
  progress).
- Optional **only statements missing a recommended element** screen for due-diligence checks.
- Optional **only new or updated since last run** mode for a scheduled alert on the current year.

### How much does it cost?

You pay per statement returned, with no monthly fee: **$2.00 per 1,000 statements** on Apify's free
plan, and 10-40% less on paid Apify plans. Each run also costs $0.001 to start. Apify's free plan
includes $5 of credit every month, enough for about 2,500 statements. Prices as of October 2026;
the price shown on this page is the one that applies.

| Use | Statements | Cost on the free plan |
|---|---|---|
| Look up one organisation by name | 1-5 | about $0.01 |
| Screen the Public sector for incomplete statements, current year | about 100-200 | about $0.20-0.40 |
| Daily alert through the year as organisations submit, about 15 new/updated a day | about 450 a month | about $0.90 a month |

Set **Maximum cost per run** to cap any run; the Actor stops cleanly at the cap and keeps
everything it saved.

### Ready-made inputs

Four real use cases as JSON inputs, each tested in the local run above.

```json
{ "statementYear": 2026 }
```

```json
{ "statementYear": 2026, "organisationName": "tesco" }
```

```json
{ "statementYear": 2026, "sectorType": "Public" }
```

```json
{ "statementYear": 2026, "onlyIncompleteStatements": true }
```

#### Alerts

Set `onlyNewSinceLastRun` to `true` and run this Actor on a schedule (daily or weekly works well)
to get only statements submitted or resubmitted since the last run, scoped to the `statementYear`
you give it. The watermark is kept per statement year, so you can monitor the current year without
missing or duplicating anything if a run is ever cut short by your spending cap.

Or open these as ready-made examples:

- [UK modern slavery statements filed this year](https://apify.com/tabulary/uk-modern-slavery-statements/examples/modern-slavery-statements-this-year)
- [Tesco's modern slavery statements](https://apify.com/tabulary/uk-modern-slavery-statements/examples/modern-slavery-statement-tesco)
- [Public sector modern slavery statements](https://apify.com/tabulary/uk-modern-slavery-statements/examples/modern-slavery-statements-public-sector)
- [Modern slavery statements missing recommended elements](https://apify.com/tabulary/uk-modern-slavery-statements/examples/modern-slavery-incomplete-statements)

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `statementYear` | integer | required (prefill `2026`) | The statement year to fetch. 2020 is the earliest year published. |
| `organisationName` | string | `""` | Keep only organisations whose name or parent group name contains this text. Case-insensitive. |
| `sectorType` | string | `""` | Keep only `Private` or `Public` sector organisations. Leave empty for both. |
| `onlyIncompleteStatements` | boolean | `false` | Keep only statements that do not cover all six recommended elements. |
| `onlyNewSinceLastRun` | boolean | `false` | Keep only statements added or updated since this Actor's last run for the same `statementYear`. |
| `maxItems` | integer | `1000` | Stop after this many statements. |

### Output

One dataset item per organisation statement. A real item from the local test run above:

```json
{
  "organisationName": "TESCO DISTRIBUTION LIMITED",
  "parentName": "TESCO PLC",
  "groupSubmission": true,
  "address": "Tesco House, Shire Park, Kestrel Way, Welwyn Garden City, United Kingdom, AL7 1GA",
  "companyNumber": "02972724",
  "sectorType": "Private",
  "organisationSectors": ["Food and beverages, agriculture and fishing"],
  "turnover": "Over £500 million",
  "statementYear": 2026,
  "yearsProducingStatements": "More than 5 years",
  "statementStartDate": "2025-02-22",
  "statementEndDate": "2026-02-28",
  "dateApproved": "2026-04-15",
  "lastUpdated": "2026-06-15",
  "includesOrgStructure": true,
  "includesPolicies": true,
  "includesRiskAssessment": true,
  "includesDueDiligence": true,
  "includesTraining": true,
  "includesGoals": true,
  "elementsCoveredCount": 6,
  "statementUrl": "https://www.tescoplc.com/media/ahag4vn0/modern-slavery-statement-2024_25_v15.pdf",
  "statementSummaryUrl": "https://modern-slavery-statement-registry.service.gov.uk/statement-summary/4C73ZLVe/2026",
  "pdfUrl": "https://downloads.modern-slavery-statement-registry.service.gov.uk/pdf-published/4C73ZLVe/2026/Modern Slavery Statement 2025_26_V22.pdf",
  "pdfDate": "2026-06-15T09:11:26"
}
```

Notes: `companyNumber` and `address` are `null` when the organisation didn't provide one (common
for group-submission entries, which carry the group's own CompanyNumber under `parentName`
instead). `organisationSectors` is an array because an organisation can carry more than one
industry sector. `elementsCoveredCount` is a quick 0-6 summary of the six boolean element fields,
for sorting or filtering without reading all six. Dates are the values recorded by the registry
(UK local time; the source does not state a timezone offset for `statementStartDate`,
`statementEndDate`, `dateApproved` or `lastUpdated`; `pdfDate` includes a time). We deliberately
drop the source's `ApprovingPerson` and `EmailAddressNoURL` columns: one names the individual
board signatory, the other is a literal email address, and this tool only returns
organisation-level data, never data about named individuals.

### Use it from AI agents

Add the Actor to Claude, ChatGPT, Cursor or any MCP client through the Apify MCP server
(`https://mcp.apify.com?tools=tabulary/uk-modern-slavery-statements`). Ask in plain language, for
example: "Does Tesco's 2026 modern slavery statement cover all six recommended elements?" The
agent fills in the input and gets structured statements back.

### Use it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/tabulary~uk-modern-slavery-statements/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"statementYear": 2026, "sectorType": "Public"}'
```

The same works with the Apify Python and JavaScript clients. See the API tab for details.

### Data source and limits

- Source: the UK Home Office's [modern slavery statement registry](https://modern-slavery-statement-registry.service.gov.uk/download).
  Its [download page](https://modern-slavery-statement-registry.service.gov.uk/download) states
  "All content is available under the Open Government Licence v3.0, except where otherwise
  stated." The [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/)
  permits commercial reuse with attribution: "Contains public sector information licensed under
  the Open Government Licence v3.0."
- Submission to the registry is a legal requirement for commercial organisations with turnover
  over £36 million under the Modern Slavery Act 2015, but the registry itself only contains
  organisations that have chosen to submit through it; it is not a complete list of every
  qualifying organisation.
- The source publishes one CSV per statement year covering every submission in that year; there is
  no per-organisation API, so this Actor downloads the year's file and filters it for you.
- The current statement year's file grows through the year as organisations submit new or updated
  statements — use `onlyNewSinceLastRun` to track that.
- Only organisation-level fields are returned. The source's `ApprovingPerson` (a named board
  signatory) and `EmailAddressNoURL` (a literal email address) columns are always dropped.
- Not affiliated with or endorsed by the UK Home Office or the Government Equalities Office.

### Other Tabulary tools

Clean data from official and public sources, priced per result:

- [Airport METAR & TAF Weather](https://apify.com/tabulary/airport-weather-metar-taf)
- [EU Tenders API: TED Public Procurement Notices](https://apify.com/tabulary/eu-ted-tenders)
- [Company Job Postings: Greenhouse, Lever, Ashby & Workable](https://apify.com/tabulary/multi-ats-job-postings)
- [Remote Jobs API: RemoteOK & Jobicy Postings](https://apify.com/tabulary/remote-jobs-feed)
- [SAM.gov Federal Contract Opportunities](https://apify.com/tabulary/sam-gov-contract-notices)
- [UK Gender Pay Gap Reports API: Employer Filings](https://apify.com/tabulary/uk-gender-pay-gap-reports)
- [UK House Price Index API: Average Prices by Area](https://apify.com/tabulary/uk-house-price-index-stats)
- [UK Tenders API: Contracts Finder & Find a Tender](https://apify.com/tabulary/uk-public-tenders)

### FAQ

**Is this data official?** Yes. It comes directly from the Home Office's statutory modern slavery
statement registry, the same register organisations submit to.

**How fresh is it?** As fresh as the source: organisations submit throughout the year, and the
source updates as submissions land. Run with `onlyNewSinceLastRun` on a schedule to catch new and
updated statements as they appear.

**Does this cover every organisation that must report?** No. The registry only contains
organisations that chose to submit through it; the Act requires submission but the government does
not maintain (and this tool cannot provide) a complete list of non-compliant organisations.

**Something broke?** Open an issue on the Issues tab. The Actor is tested daily.

### Changelog

- **2026-10-25:** first version: reads the official per-year CSV, filters by organisation name,
  sector type or statement year, with an only-incomplete-statements screen and an optional
  new-since-last-run alert mode.

### About Tabulary

This tool is part of [Tabulary](https://apify.com/tabulary): clean tables from official public
sources. Every Tabulary tool uses the source's official API or open data where one exists,
collects no personal data, and is tested on Apify every day. Questions or ideas? Open an issue on
the Issues tab.

# Actor input Schema

## `statementYear` (type: `integer`):

The reporting year to fetch from the Home Office's modern slavery statement registry. 2020 is the earliest year published. The current in-progress year has the fewest statements and runs fastest.

## `organisationName` (type: `string`):

Only keep organisations whose name or parent group name contains this text. Case-insensitive. Leave empty for every organisation in the year.

## `sectorType` (type: `string`):

Only keep organisations of this sector type. Leave empty for both.

## `onlyIncompleteStatements` (type: `boolean`):

Keep only statements that do not cover all six of the Modern Slavery Act's recommended elements (organisational structure, policies, risk assessment, due diligence, training, goals). Useful for procurement due-diligence screening.

## `onlyNewSinceLastRun` (type: `boolean`):

Skip statements this Actor already saved for this statement year on a previous run, keeping only ones added or updated since. Useful for a scheduled alert on the current year as more organisations submit.

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

Stop after this many statements. Each one is one billable dataset item.

## Actor input object example

```json
{
  "statementYear": 2026,
  "organisationName": "",
  "sectorType": "",
  "onlyIncompleteStatements": false,
  "onlyNewSinceLastRun": false,
  "maxItems": 1000
}
```

# Actor output Schema

## `overview` (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 = {
    "statementYear": 2026
};

// Run the Actor and wait for it to finish
const run = await client.actor("tabulary/uk-modern-slavery-statements").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 = { "statementYear": 2026 }

# Run the Actor and wait for it to finish
run = client.actor("tabulary/uk-modern-slavery-statements").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 '{
  "statementYear": 2026
}' |
apify call tabulary/uk-modern-slavery-statements --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,tabulary/uk-modern-slavery-statements"
        }
    }
}
```

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/yaPTohXfV7Ijdbeue/builds/SXBL4M9dXdqPs4bF3/openapi.json
