---
title: "Reported payment practices"
method: GET
path: "/company/{number}/payment-practices"
tags: ["Report series"]
---

# Reported payment practices

`GET /company/{number}/payment-practices`

## Request

- Base URL: `https://api.companystack.co.uk`
- URL: `https://api.companystack.co.uk/company/{number}/payment-practices`
- Auth: one of:
  - HTTP bearer
  - API key in header `X-Api-Key`

What the company reported to the government about how it pays its suppliers: the reporting period, the date the report was filed, the average time to pay, the share of invoices paid within 30 days, in 31 to 60 days and later than 60 days, the share not paid within the agreed terms, its standard payment terms, and whether it offers e-invoicing or supply-chain finance, with the report's address on the government's service.

These are the company's own figures, reported by the company to the government under the Reporting on Payment Practices and Performance Regulations 2017, and shown as reported. CompanyStack has not checked them; they are not a credit rating, a score or an assessment, and no threshold is applied to them. Only large companies and limited liability partnerships have to report (each half of their financial year, within 30 days of its end), so a company with no report answers `reported: false`, which says nothing about how it pays.

Source: the government's Check payment practices service (Department for Business and Trade), https://check-payment-practices.service.gov.uk/. Contains public sector information licensed under the Open Government Licence v3.0. CompanyStack reloads the published data weekly; `report_source.checked_at` is the last check.

Every plan, API Free included, gets the latest report (`level: summary`). API Starter and above, and web-app Pro and Team, also get `history`: every report the company has filed, newest period first (`level: full`). Reports are never removed from the history: when a company reports again on a period both reports are listed (`reports_for_period`), and a report the government no longer lists is kept with `listed: false`. No Companies House request is made.

## Path parameters

- `number` string, required

## Response `200`

The latest report (and, on level full, the history), or reported: false

- object
  - `company_number` string, required
  - `company_name` string
  - `company_status` string, nullable
  - `reported` boolean, required: false: no report from this company is in the government data held
  - `level` 'summary' | 'full', required
  - `message` string: reported: false only. Why having no report says nothing about the company
  - `checked_at` string, date-time, nullable: reported: false only. When the government's data was last checked
  - `title` 'Reported payment practices'
  - `statement` string: One sentence: who reported what, for which period, filed when
  - `latest` object: The report for the period that ended most recently (where the company filed more than one for it, the one filed last)
    - `report_id` string: The government's id for the report
    - `period_start` string, date
    - `period_end` string, date
    - `filed_on` string, date, nullable: The date the company filed the report with the government
    - `dates_plausible` boolean: false: the period's dates cannot be right as entered in the report (a typing slip in the report); they are given as entered
    - `figures` 'reported' | 'no_payments' | 'no_qualifying_contracts' | 'not_given': reported: the report gives payment figures. no_payments and no_qualifying_contracts: the company reported that it made no payments, or had no qualifying contracts, in the period. not_given: the report gives no usable figures
    - `average_days_to_pay` number, nullable: Average number of days taken to pay, as reported. null when not reported, or when the report gives a figure above 365 days (a placeholder)
    - `pct_within_30_days` number, nullable: Percentage of invoices paid within 30 days
    - `pct_31_to_60_days` number, nullable: Percentage of invoices paid in 31 to 60 days
    - `pct_later_than_60_days` number, nullable: Percentage of invoices paid later than 60 days
    - `pct_not_within_terms` number, nullable: Percentage of invoices not paid within the agreed terms
    - `pct_not_paid_due_to_dispute` number, nullable: Percentage of invoices not paid within the agreed terms because of a dispute (reports from 2025)
    - `shortest_standard_payment_period` number, nullable: Days: the shortest (or only) standard payment period
    - `longest_standard_payment_period` number, nullable: Days: the longest standard payment period
    - `maximum_contractual_payment_period` number, nullable: Days: the longest payment period the company agreed in a contract
    - `standard_payment_terms` string, nullable: The company's description of its standard payment terms (cut at 2,000 characters)
    - `payment_codes` string, nullable: The payment codes the company says it follows; null when it says none
    - `e_invoicing_offered` boolean, nullable
    - `supply_chain_finance_offered` boolean, nullable
    - `company_name_reported` string, nullable: The company's name as the report gives it
    - `url` string, uri: The report on the government's Check payment practices service
    - `listed` boolean: false: the government's published data no longer lists the report; it is kept as it was
    - `not_listed_since` string, date, nullable
    - `reports_for_period` integer: How many reports the company filed for this same period, this one included. The government's data does not say which replaces which
  - `facts` object[]: The latest report as labels and values, in display order
    - `label` string
    - `value` string
  - `caveats` string[]
  - `reports_held` integer: Every report held for the company, the latest included
  - `first_period_start` string, date, nullable
  - `history` object[]: Level full only: every report, newest period first, the latest included. Reports are never removed: one the government no longer lists has listed: false
    - `report_id` string: The government's id for the report
    - `period_start` string, date
    - `period_end` string, date
    - `filed_on` string, date, nullable: The date the company filed the report with the government
    - `dates_plausible` boolean: false: the period's dates cannot be right as entered in the report (a typing slip in the report); they are given as entered
    - `figures` 'reported' | 'no_payments' | 'no_qualifying_contracts' | 'not_given': reported: the report gives payment figures. no_payments and no_qualifying_contracts: the company reported that it made no payments, or had no qualifying contracts, in the period. not_given: the report gives no usable figures
    - `average_days_to_pay` number, nullable: Average number of days taken to pay, as reported. null when not reported, or when the report gives a figure above 365 days (a placeholder)
    - `pct_within_30_days` number, nullable: Percentage of invoices paid within 30 days
    - `pct_31_to_60_days` number, nullable: Percentage of invoices paid in 31 to 60 days
    - `pct_later_than_60_days` number, nullable: Percentage of invoices paid later than 60 days
    - `pct_not_within_terms` number, nullable: Percentage of invoices not paid within the agreed terms
    - `pct_not_paid_due_to_dispute` number, nullable: Percentage of invoices not paid within the agreed terms because of a dispute (reports from 2025)
    - `shortest_standard_payment_period` number, nullable: Days: the shortest (or only) standard payment period
    - `longest_standard_payment_period` number, nullable: Days: the longest standard payment period
    - `maximum_contractual_payment_period` number, nullable: Days: the longest payment period the company agreed in a contract
    - `standard_payment_terms` string, nullable: The company's description of its standard payment terms (cut at 2,000 characters)
    - `payment_codes` string, nullable: The payment codes the company says it follows; null when it says none
    - `e_invoicing_offered` boolean, nullable
    - `supply_chain_finance_offered` boolean, nullable
    - `company_name_reported` string, nullable: The company's name as the report gives it
    - `url` string, uri: The report on the government's Check payment practices service
    - `listed` boolean: false: the government's published data no longer lists the report; it is kept as it was
    - `not_listed_since` string, date, nullable
    - `reports_for_period` integer: How many reports the company filed for this same period, this one included. The government's data does not say which replaces which
  - `history_on` string: Level summary only: what the full answer adds
  - `note` string: That these are the company's own figures
  - `report_source` object: Where the report is published, its licence and when CompanyStack last checked its copy
    - `name` string
    - `publisher` string
    - `url` string, uri
    - `licence` string
    - `licence_url` string, uri
    - `attribution` string
    - `checked_at` string, date-time, nullable: When CompanyStack's copy was last checked against the government's published data (weekly)
    - `line` string
  - `upgrade` object: Level summary, when the company has earlier reports
    - `message` string
    - `adds` string[]
    - `upgrade_url` string, uri
  - `notice` string
  - `plan` object
    - `name` string
    - `product` 'api' | 'app'
    - `level` 'summary' | 'full'

## Other responses

- `401`: API key missing, malformed or revoked
- `403`: The key's plan does not include this endpoint (`code: plan_upgrade_required`, with `upgrade_url`), the key may not call it, or the key is beyond the plan's key limit after a downgrade (`code: key_limit_exceeded`: the newest keys are paused until keys are deleted or the plan upgraded)
- `404`: Not on the register held, or Can They Pay? is not switched on (code not_enabled)
- `429`: Per-minute or per-day limit reached (`code: rate_limited`, `window: minute|day`). Wait `Retry-After` seconds; when both windows are full the day is reported. A refused request does not count against either limit. A bulk lookup (`POST /company/bulk`) counts each company number in it as one request, so one that is more than you have left is refused whole, and the body adds `requested` and `fits`.

---

[API](https://skmtc.dev/companystack/apis/companystack-api.md) · [All operations](https://skmtc.dev/companystack/apis/companystack-api/llms.txt) · [OpenAPI document](https://skmtc.dev/companystack/apis/companystack-api/revisions/8f3234237d2d?raw)
