# UK Payment Practices Report API: Supplier Pay Data (`tabulary/uk-payment-practices-reports`) Actor

UK large companies' and LLPs' statutory payment-practices filings from the official check-payment-practices.service.gov.uk register: average time to pay, invoice payment % within 30/31-60/60+ days, and prompt payment code status, filterable by company.

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

## Pricing

from $5.60 / 1,000 payment practices filings

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 Payment Practices Report API: Supplier Pay Data do?

This Actor returns the UK's official **payment practices report** data straight from
[check-payment-practices.service.gov.uk](https://check-payment-practices.service.gov.uk/export/),
the government register where every large UK company and LLP is legally required ("Duty to
Report") to file how it pays its suppliers every six months: average time to pay, the share of
invoices paid within 30, 31-60 and over 60 days, and whether the business has signed a prompt
payment code. It is a **UK payment practices report** feed covering every reporting company, not
just construction. Credit-risk, invoice-financing, procurement and supplier-risk teams use it to
check how reliably a current or prospective customer pays before extending terms. An optional
alert mode returns only filings added for a company since your last run.

### What you get

- **Who filed:** company name, Companies House number, reporting regime, reporting period and
  filing date.
- **How they pay:** average time to pay (days), % of invoices paid within 30 / 31-60 / over 60
  days, £ value in each band, % not paid within agreed terms, % unpaid due to dispute.
- **Terms and policy:** shortest/longest/maximum standard and contractual payment periods, whether
  terms changed in the period, dispute resolution process, e-invoicing and supply-chain financing
  offered.
- **Prompt payment code:** whether the business says it has signed a prompt payment code, and
  which one.
- Filter by company name or Companies House number.
- Optional **only new since last run** alert mode, scoped per company filter.

### How much does it cost?

You pay per filing returned, with no monthly fee: **$8.00 per 1,000 filings** 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 625 filings. Prices as of October 2026; the
price shown on this page is the one that applies.

| Use | Filings | Cost on the free plan |
|---|---|---|
| Check one company's recent filings | 1-5 | about $0.04 |
| Latest 100 filings across all companies | 100 | about $0.80 |
| Weekly alert on 10 watched suppliers, about 5 new filings a week | about 20 a month | about $0.16 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

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

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

```json
{ "companyName": "tesco", "maxItems": 50 }
```

```json
{ "companyName": "tesco", "onlyNewSinceLastRun": true, "maxItems": 100 }
```

#### Alerts

Set `onlyNewSinceLastRun` to `true` and run this Actor on a schedule (weekly works well, since
filings are six-monthly) to get only filings added for your `companyName`/`companyNumber` filter
since the last run. The watermark is kept per filter, so separate saved tasks watching different
companies never interfere with each other, and a run cut short by `maxItems` or your spending cap
picks up exactly where it left off next time.

### Input

| Field | Type | Default | Description |
|---|---|---|---|
| `companyName` | string | `""` | Keep only filings whose company name contains this text. Case-insensitive. |
| `companyNumber` | string | `""` | Keep only filings with this exact Companies House number. |
| `onlyNewSinceLastRun` | boolean | `false` | Keep only filings added since this Actor's last run with the same company filter. |
| `maxItems` | integer | `20` | Stop after this many filings. Without `onlyNewSinceLastRun`, these are the most recent matches. |

### Output

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

```json
{
  "reportId": 118549,
  "company": "3I PLC",
  "companyNumber": "00397156",
  "policyRegime": "Regime-3",
  "reportingPeriodStartDate": "2026-04-01",
  "reportingPeriodEndDate": "2026-09-30",
  "filingDate": "2026-10-30",
  "qualifyingContractsInPeriod": true,
  "qualifyingConstructionContractsInPeriod": false,
  "averageTimeToPayDays": 13,
  "percentPaidWithin30Days": 90,
  "percentPaidBetween31And60Days": 9,
  "percentPaidLaterThan60Days": 1,
  "totalValuePaidWithin30Days": 11616186,
  "totalValuePaidBetween31And60Days": 873296,
  "totalValuePaidLaterThan60Days": 99432,
  "totalValuePaidLaterThanAgreedTerms": 6313614,
  "percentNotPaidWithinAgreedTerms": 23,
  "percentNotPaidDueToDispute": 3,
  "shortestStandardPaymentPeriodDays": 0,
  "longestStandardPaymentPeriodDays": null,
  "standardPaymentTerms": "3i plc has standard payment terms of 30 days from receipt of an invoice although invoices are paid earlier if appropriate.",
  "paymentTermsHaveChanged": null,
  "suppliersNotifiedOfChanges": null,
  "maximumContractualPaymentPeriodDays": 60,
  "maximumContractualPaymentPeriodInformation": null,
  "otherInformationPaymentTerms": null,
  "disputeResolutionProcess": "In the event of any disputes with suppliers, this would normally be dealt with by the supplier's relevant 3i business contact. Alternatively, suppliers can contact 3i's accounts payable team at [email removed], who will ensure this is resolved by the appropriate person.",
  "promptPaymentCodeSignatory": true,
  "paymentCodeDetails": "Prompt payment code",
  "eInvoicingOffered": false,
  "supplyChainFinancingOffered": false,
  "url": "https://check-payment-practices.service.gov.uk/report/118549"
}
```

Notes: monetary fields (`totalValuePaid...`) are GBP, only filled in when the business reported
monetary values rather than percentages only. `null` means the question did not apply to this
business's filing or it answered a different question set for its reporting regime (`policyRegime`
is the source's own regime code, e.g. `Regime-1`, `Regime-3`). `promptPaymentCodeSignatory` is
derived: the source's own field is free text (most filers write "No"); anything else is treated as
"yes, signed", with `paymentCodeDetails` keeping which code or description they gave. Any email
address or phone number typed into a free-text field is replaced with `[email removed]` or
`[phone removed]`.

### 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-payment-practices-reports`). Ask in plain language, for
example: "How fast does Tesco pay its suppliers according to its latest payment practices filing?"
The agent fills in the input and gets structured filings back.

### Use it from code

```bash
curl -X POST "https://api.apify.com/v2/acts/tabulary~uk-payment-practices-reports/run-sync-get-dataset-items?token=YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"companyName": "tesco", "maxItems": 50}'
```

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

### Data source and limits

- Source: [check-payment-practices.service.gov.uk](https://check-payment-practices.service.gov.uk/export/),
  the UK government's statutory payment-practices register under the Duty to Report on Payment
  Practices and Performance Regulations 2017. The [export page](https://check-payment-practices.service.gov.uk/export/)
  states "All content is available under the [Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/),
  except where otherwise stated", which permits commercial reuse with attribution.
- The source publishes one bulk CSV covering every filing since 2017, oldest first, with no
  per-company lookup, date filter or API; this Actor downloads that file (around 100 MB) and
  filters it for you on every run, which typically takes 10-20 seconds.
- Only large companies and LLPs that meet the reporting thresholds must file, twice a year; small
  and medium businesses do not appear here.
- Free-text fields (payment terms notes, dispute process, prompt payment code description) are
  kept, with any email address or phone number a business typed into them redacted. No field in
  the source names an individual signatory.
- Not affiliated with or endorsed by the UK government or the Department for Business and Trade.

### 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 Modern Slavery Statement Registry API](https://apify.com/tabulary/uk-modern-slavery-statements)
- [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 UK government's statutory payment
practices register, the same filings businesses are legally required to submit under the Duty to
Report regulations.

**How fresh is it?** As fresh as the source: it adds filings as businesses submit them, and this
Actor always reads the current file. Run with `onlyNewSinceLastRun` on a schedule to catch new
filings for the companies you watch.

**Does this cover construction retention clauses in detail?** No. This tool focuses on the
cross-sector payment figures every reporting business answers. Construction-specific retention
clause terms are in the source but not included in this feed.

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

### Changelog

- **2026-10-30:** first version: reads the official bulk CSV export, filters by company name or
  Companies House number, with 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

## `companyName` (type: `string`):

Only keep filings whose company name contains this text. Case-insensitive. Leave empty for every company.

## `companyNumber` (type: `string`):

Only keep filings with this exact Companies House number (for example 01070807). Leave empty to skip this filter.

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

Skip filings this Actor already saved for this exact company name/number filter on a previous run, keeping only ones added since. Useful for a scheduled alert on a supplier or customer.

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

Stop after this many filings. Without onlyNewSinceLastRun, these are the most recent matching filings. Each one is one billable dataset item.

## Actor input object example

```json
{
  "companyName": "",
  "companyNumber": "",
  "onlyNewSinceLastRun": false,
  "maxItems": 20
}
```

# 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 = {
    "companyName": "",
    "companyNumber": "",
    "onlyNewSinceLastRun": false,
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("tabulary/uk-payment-practices-reports").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 = {
    "companyName": "",
    "companyNumber": "",
    "onlyNewSinceLastRun": False,
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("tabulary/uk-payment-practices-reports").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 '{
  "companyName": "",
  "companyNumber": "",
  "onlyNewSinceLastRun": false,
  "maxItems": 20
}' |
apify call tabulary/uk-payment-practices-reports --silent --output-dataset

```

## MCP server setup

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

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/27EhyP90tVkqLlst9/builds/iZUoQbAPPjcG4U1dJ/openapi.json
