---
title: "Screen a UK company and everyone recorded in its ownership at Companies House (one check)"
method: GET
path: "/ownership/{companyNumber}"
---

# Screen a UK company and everyone recorded in its ownership at Companies House (one check)

`GET /ownership/{companyNumber}`

## Request

- Base URL: `https://api.stratumapis.com/v1/export-screening`
- URL: `https://api.stratumapis.com/v1/export-screening/ownership/{companyNumber}`
- Auth: API key in header `X-Stratum-Key`

Screens the company by its registered name, then every owner and controller recorded at Companies House
(people, UK companies, and foreign companies by name, walking up through UK holding companies up to five
levels) against the same ten lists, and reads the result against the US rule that extends Entity List and
Military End User List restrictions to companies those parties own 50% or more of, directly or indirectly,
individually or together.

Companies House records holdings as bands, not exact figures, so the result says what the bands allow. More than
75% of the shares, or more than 50% but not more than 75%, is read as owning 50% or more. More than 25% but not
more than 50% could be exactly 50%, so it is a possible 50% owner, never a certain one. Voting rights, the right to appoint
directors or significant influence, with no share band, means the holder controls the company but owns 25% of
the shares or less.

Ownership is followed as a chain: a company 50% or more owned by a listed party is itself covered, and so is a
company it owns 50% or more of. `ownership.level` is one of `listed_owner_50_percent`,
`listed_owners_may_reach_50_percent`, `listed_party_in_ownership` (any list, any holding, including control)
or `nothing_found`. The 50% levels need a strong name match (0.85 or more); weaker possible matches are still
listed per owner. Every match is a possible match by name, to be checked.

This covers ownership recorded at Companies House only: owners above a foreign company are not recorded there,
and `ownership.limits` names each place the check could not see past. It is not a determination under the US
rule.

Counts as one check, only when the ownership was read: an unknown company (404) or a Companies House failure
(503) is not charged and never reads as "nothing found".

## Path parameters

- `companyNumber` string, required

## Query parameters

- `reference` string
- `rules` string

## Response `200`

The company's screen (the same shape as `/screen`) with its ownership

- object
  - `checkId` string, required: Unique id for this screen. Keep it with your record; we keep no copy of the result.
  - `screenedAt` string, date-time, required: When the screen ran (UTC)
  - `reference` string: Your reference
  - `query` string, required: The name as screened
  - `result` 'no_match' | 'possible_match', required: possible_match when the company or anyone in its ownership is a possible match
  - `count` integer, required: Number of possible matches at or above minScore
  - `matches` union[], required: Best first, from any of the lists screened
    - union
      - ExportMatch
        - `list` 'us_el' | 'us_dpl' | 'us_dtc' | 'us_uvl' | 'us_isn' | 'us_meu', required: `us_el` US Entity List, `us_dpl` Denied Persons List, `us_uvl` Unverified List, `us_meu` Military End User List (all BIS); `us_dtc` ITAR Debarred List, `us_isn` Nonproliferation Sanctions (both State Department)
        - `listLabel` string, required
        - `name` string, required: Name on the list
        - `aliases` string[]
        - `score` number, required: How closely the name matches (1.0 = exact). A possible match is something to review
        - `matchedAlias` string: The listed alias that matched
        - `addresses` object[]
          - `text` string: Street address and postal code
          - `city` string
          - `country` string: ISO 3166 code
        - `countries` string[]: ISO codes of every listed address
        - `countryMatch` 'match' | 'mismatch' | 'not_listed': Present when you sent a country. `not_listed` means the listing gives no address country.
        - `listedOn` string, date: When the party was listed
        - `endsOn` string, date: When a time-limited order ends (mainly Denied Persons orders)
        - `federalRegister` string: The Federal Register notice
        - `licenceRequirement` string: As the list states it
        - `licencePolicy` string: As the list states it, e.g. "Presumption of denial"
        - `programmes` string[]: Nonproliferation Sanctions programmes
        - `listingId` string: The Consolidated Screening List's id for the record
        - `sourceUrl` string, uri: The list's page at its publisher
        - `moreInfoUrl` string, uri
      - SanctionsMatch: The same fields as a match from the Sanctions Screening API, plus `listLabel`
        - `list` 'ofsi' | 'un' | 'eu' | 'ofac', required: `ofsi` is the UK Sanctions List (FCDO)
        - `listLabel` string, required
        - `name` string, required
        - `aliases` string[]
        - `type` 'person' | 'entity', required
        - `score` number, required
        - `matchedAlias` string
        - `dateOfBirth` string
        - `nationality` string
        - `sanctionRegime` string
        - `designationDate` string
        - `listingId` string
        - `sourceUrl` string, uri
  - `screenedWith` object, required: The inputs this screen used
    - `type` 'person' | 'entity' | 'any'
    - `minScore` number
    - `country` string
  - `listsScreened` ListScreened[], required: Each list this check covered, with both dates. Keep this with your record of the check.
    - `list` string, required: A list slug: ofsi, un, eu, ofac, or one of the export list slugs
    - `name` string, required
    - `listUpdated` string, date, nullable, required: When the publisher last changed the list. For the sanctions lists, their daily refresh date. `null` when the publisher's date was not in the file we read (never our own date in its place).
    - `weCheckedOn` string, date, required: When we last fetched the list
  - `listsNotScreened` ListNotScreened[], required: Any of the ten lists this check could not cover, and why. Empty when all ten were covered.
    - `list` string
    - `name` string
    - `why` string
  - `notice` string, required: The screening-record notice, for your record
  - `companyNumber` string, required
  - `ownership` Ownership, required
    - `level` 'listed_owner_50_percent' | 'listed_owners_may_reach_50_percent' | 'listed_party_in_ownership' | 'nothing_found', required: The US export rules reading (kept for existing callers; the same as the `us` verdict). Only a strong name match (0.85 or more) sets a level; weaker matches are listed under their owner with `weak: true`.
    - `message` string, required: What the ownership shows
    - `rulesApplied` string[]
    - `verdicts` object[]: One verdict per rule set asked for (`rules`), in the order uk, us, ofac, eu
      - `rule` 'uk' | 'us' | 'ofac' | 'eu'
      - `level` 'owned_or_controlled' | 'may_reach' | 'holds_over_25' | 'none' | 'not_checked': `owned_or_controlled`: may be owned or controlled under that rule (every match is a possible match by name, to check). `may_reach`: may reach 50% (Companies House records bands). `holds_over_25`: UK only, a listed party holds more than 25% without control. `not_checked`: the test could not run this time.
      - `message` string
      - `owners` string[]: The recorded owners the verdict rests on
      - `source` string: Where the test comes from
    - `owners` object[], required
      - `name` string
      - `kind` 'individual' | 'corporate'
      - `companyNumber` string, nullable: For a UK company owner
      - `through` string[]: The companies between this owner and the company checked
      - `band` 'fifty_plus' | 'over_25_up_to_50' | 'control': This owner's own recorded holding
      - `reach` 'fifty_plus' | 'possible' | 'control': The whole chain read under the 50% rule
      - `holding` string
      - `matches` object[]: The strongest possible matches, at most five
        - `list` string
        - `listLabel` string
        - `name` string
        - `score` number
        - `sdn` boolean: OFAC matches only
        - `weak` boolean: Under 0.85
      - `moreMatches` integer: Further
    - `limits` string[], required: Where the check could not see further (foreign owners
    - `companiesHouseNote` string, required
    - `ownershipReadAt` string, date-time: When the ownership was read from Companies House

## Other responses

- `400`: Not a UK company number (`invalid_company_number`), an unknown rule set (`invalid_rules`) or a reference over 100 characters (`invalid_reference`)
- `401`: Missing, invalid or revoked API key (`missing_key`, `invalid_key`, `revoked_key`)
- `403`: The key belongs to a different Stratum API (`wrong_api`; a Sanctions Screening key does not work here), the account has no Export Controls Screening plan (`no_plan`), or the call came through RapidAPI, where this API is not listed (`not_on_rapidapi`)
- `404`: Companies House has no company with that number (`company_not_found`). Not charged.
- `429`: This month's limit is reached (`monthly_limit_reached`, at twice your plan's allowance) or the free trial's allowance is used (`trial_limit_reached`). Nothing was screened or counted. Treat the names as not screened. Screening resumes on the 1st of next month, on upgrading, or when we raise your limit.
- `503`: The ownership could not be read from Companies House (`ownership_not_checked`), or the export lists are unavailable (`export_lists_unavailable`). Nothing was checked or charged; treat the company as not yet checked, never as clear.

---

[API](https://skmtc.dev/stratumapis/apis/export-controls-screening-api.md) · [All operations](https://skmtc.dev/stratumapis/apis/export-controls-screening-api/llms.txt) · [OpenAPI document](https://skmtc.dev/stratumapis/apis/export-controls-screening-api/revisions/19984f668877?raw)
