---
title: "Screen a company against sanctions lists"
method: GET
path: "/sanctions/company/{number}"
tags: ["Sanctions"]
---

# Screen a company against sanctions lists

`GET /sanctions/company/{number}`

## Request

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

Screens the company's registered name and previous names, its current persons with significant control (people and corporate owners) and its current officers (read live from Companies House) against every sanctions list CompanyStack loads, each downloaded from its official publisher and checked for changes every hour (the French register every three hours): UK Sanctions List (Foreign, Commonwealth & Development Office (FCDO)); EU Consolidated Financial Sanctions List (European Commission (Financial Sanctions Files)); OFAC Specially Designated Nationals (SDN) List (US Treasury, Office of Foreign Assets Control); OFAC Consolidated Sanctions List (non-SDN) (US Treasury, Office of Foreign Assets Control); Consolidated Canadian Autonomous Sanctions List (Global Affairs Canada); Australian Sanctions Consolidated List (Department of Foreign Affairs and Trade (DFAT), Australia); New Zealand Russia Sanctions Register (Ministry of Foreign Affairs and Trade (MFAT), New Zealand); Japan Ministry of Finance Asset Freeze List (Ministry of Finance, Japan); French National Register of Asset Freezes (Direction générale du Trésor, France); US Consolidated Screening List (Commerce and State lists) (International Trade Administration, US Department of Commerce). There is no separate UN list: the UK Sanctions List includes the UN designations the UK gives effect to. A list is screened only when we hold a copy of it: one that could not be loaded (for example because its download failed) has status `not_loaded` in `lists` and was not screened.

Names are compared after removing case, accents, punctuation, titles and legal forms, in any word order, and each close name is checked against birth month and year (people; Companies House publishes no more), nationality or country, and registration numbers (companies). Each potential match lists the fields that agreed and disagreed, the reasons in plain English and a link to the official entry. **A name match is not a finding that anyone is sanctioned**: nothing is a close name match without date of birth or nationality / country corroboration, every match needs human review, and no name match is not a clearance. `lists` shows which list versions (and their own dates) were screened; a list that was not loaded is named in `lists_not_screened`. Also run by POST /kyb/check (the `sanctions_screening` check and the `sanctions` field). API Starter and above; web-app Pro and Team.

## Path parameters

- `number` string, required

## Response `200`

Screening result (not stored; a KYB check stores it)

- object
  - `company_number` string, required
  - `company_name` string, required
  - `verdict` 'no_match' | 'possible_match' | 'strong_match' | 'unable_to_check', required: The strongest match found. `no_match` ("No name matches") covers only the names and lists shown and is not a clearance. `unable_to_check`: nothing matched, but the officers could not be read (Companies House unreachable and no copy held), so no director was screened; screen again later.
  - `verdict_label` string
  - `summary` string, required: What was screened, against which lists, and what was found, in one paragraph. A clear result opens "No name matches on [each list screened, with its date]. This is not a clearance."
  - `screened_at` string, date-time, required
  - `lists` object[], required
    - `id` 'uk_fcdo' | 'un_sc' | 'eu_fsf' | 'us_ofac_sdn' | 'us_ofac_cons' | 'ca_sema' | 'au_dfat' | 'nz_mfat' | 'jp_mof' | 'fr_tresor' | 'us_trade_csl' | 'ch_seco', required: Lists CompanyStack screens when a copy is loaded: uk_fcdo, eu_fsf, us_ofac_sdn, us_ofac_cons, ca_sema, au_dfat, nz_mfat, jp_mof, fr_tresor, us_trade_csl. A list with no copy loaded has status `not_loaded` and was not screened.
    - `name` string, required
    - `short_name` string: Short label (added 2026-10-20)
    - `jurisdiction` string: Who imposes the sanctions (added 2026-10-20)
    - `publisher` string
    - `status` 'current' | 'stale' | 'not_loaded', required: `stale`: loaded, but not checked successfully for 48 hours (the version screened is still shown); `not_loaded`: this list was not screened
    - `published_at` string, date, nullable, required: The list's own date: the publication or generation date the file states; for a file that states none (Canada, New Zealand), the date the publisher last changed it
    - `loaded_at` string, date-time, nullable, required: When CompanyStack loaded the version screened (when the list last changed)
    - `checked_at` string, date-time, nullable, required: When CompanyStack last checked the list for changes successfully (hourly; the French register every three hours)
    - `entries` integer, nullable: People and entities in the version screened (ships and aircraft are not loaded)
    - `info_url` string, uri
    - `licence` string
    - `note` string, nullable: Why the list is stale or not loaded
    - `version_id` integer, nullable
  - `lists_screened` string[]
  - `lists_not_screened` object[]
    - `id` string
    - `name` string
    - `reason` string
  - `officers_source` 'companies_house' | 'cache' | 'null', nullable: `companies_house`: officers read from Companies House for this screening; `cache`: the officers CompanyStack holds (read within the last hour, or older when Companies House did not answer: see officers_stale); null: officers were not screened (see not_screened)
  - `officers_status` 'cached' | 'fetched' | 'unavailable': `unavailable`: the officers could not be read and none are held, so no director was screened
  - `officers_as_of` string, date-time, nullable: When the officers screened were read from Companies House
  - `officers_stale` boolean: True when Companies House could not be reached and an older copy of the officers was screened
  - `subjects` object[], required
    - `role` 'company' | 'previous_name' | 'psc_individual' | 'psc_corporate' | 'officer' | 'officer_corporate'
    - `kind` 'person' | 'entity'
    - `name` string
    - `born` string, nullable
    - `countries` string[]
    - `result` 'no_match' | 'possible_match' | 'strong_match'
    - `matches` integer
  - `not_screened` object[], required: Names we could not screen (withheld names, super-secure PSCs, officers when Companies House did not answer)
    - `role` string
    - `name` string, nullable
    - `reason` string
  - `matches` object[], required
    - `subject` object
      - `role` 'company' | 'previous_name' | 'psc_individual' | 'psc_corporate' | 'officer' | 'officer_corporate'
      - `kind` 'person' | 'entity'
      - `name` string
      - `born` string, nullable: Birth month and year from Companies House
    - `verdict` 'possible_match' | 'strong_match': `strong_match` is shown to people as "Close name match": a close name AND corroboration by date of birth or nationality / country (birth month and year for a person; for an entity, the listed country agrees, with an identical name or a registration number). A name or a registration number alone is never more than `possible_match` ("Possible name match"). Both need human review: neither says the subject is sanctioned. The code `strong_match` is kept for compatibility.
    - `verdict_label` string
    - `score` number: Name similarity adjusted for date of birth, country and registration number, for sorting. Not a probability that the subject is the listed party; CompanyStack does not display it.
    - `name_score` number
    - `list` object
      - `id` string
      - `name` string
      - `published_at` string, date, nullable
    - `entry` object
      - `id` string: The list's own identifier (UK unique ID, EU reference, OFAC uid, CSL id, DFAT reference, MFAT identifier, MOF number, DG Trésor register ID; for Canada, regime/schedule/item)
      - `kind` 'person' | 'entity'
      - `primary_name` string
      - `matched_name` string: The listed name or alias that matched
      - `matched_name_type` 'primary' | 'alias' | 'weak_alias'
      - `programmes` string[]: Regime or programme
      - `listed_on` string, date, nullable: Designation date, where the list gives one (the OFAC files and the French register do not)
      - `dates_of_birth` string[]
      - `nationalities` string[]
      - `countries` string[]: ISO 3166 codes of nationalities and address countries
      - `url` string, uri, nullable: The official entry (UK and OFAC), the legal act (EU), the published list the entry is on (US CSL), or the list's page (Canada, Australia, New Zealand, Japan, France), to search for the entry
      - `references` object
    - `agreed` string[]
    - `disagreed` string[]
    - `reasons` string[]: Plain-English explanation, one line per field compared
  - `ruled_out` object[]: Close names set aside, with the reason (a birth year or month that does not fit, or a short or generic name in another country). Shown so a reviewer can see what was dismissed.
    - `subject` object
    - `list` string
    - `entry_id` string
    - `listed_name` string
    - `name_score` number
    - `reason` string
    - `url` string, nullable
  - `method` string
  - `disclaimer` string
  - `notice` string: Who the data is prepared for and that CompanyStack accepts no responsibility to anyone else who relies on it (Terms 15B). Keep it with the data if you show it to others (Terms 17.5).

## Other responses

- `400`: Invalid company number
- `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`: Company not on the register
- `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`.
- `503`: Sanctions screening is not available yet (`code: sanctions_unavailable`)

---

[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)
