Skip to main content
Glama

capabilities

List UK company beneficial owners (PSC) from Companies House

company_uk_owners
Read-onlyIdempotent

An empty items list is never the same as "no owner": ownership_status and the filed PSC statements/exemptions explain why the register discloses none. Use when: Who owns this UK company? Not for: You need directors/officers rather than owners — use company.uk.directors. Related: company_uk_directors; company_uk_profile; company_uk_status. Price: USD 0.008/call (x402), 0.006 (account key).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum PSCs to return per page (1-100). Default 10. Eckari reads up to three register pages of 100 entries to fill this after the ceased filter is applied; if the limit is still unmet, page.has_more is true and page.next_offset says where to resume.
offsetNoZero-based index into the register's own PSC list (not into the filtered result). Pass back page.next_offset from the previous response to page.
company_numberYesCompanies House company number. Accepted shapes are the register's own — 1-8 digits (zero-padded to 8, e.g. 445790 → 00445790), one letter + 7 digits (R0000001), two letters + 6 digits (SC002180, NI000001, OC123456, OE000001), or the registered-society suffix forms (two letters + 5 digits + 1 letter; two letters + 4 digits + 2 letters). Case-insensitive; surrounding whitespace is ignored (which is why maxLength is 10); internal spaces and punctuation are not accepted. Any other value (for example PROBE) is rejected as INVALID_INPUT before payment and before any upstream call.
include_ceasedNoInclude PSCs whose control has ceased. Default false.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
dataYesCapability output; full JSON Schema at https://api.eckari.com/v1/capabilities/company.uk.owners
metaYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed2 schema fields changed
    • changedInput schema / properties / company_number / description
      Previous value: -"Companies House company number. The identifier itself is 1-8 letters/digits; surrounding whitespace is ignored (which is why maxLength is 10), but the value must not contain internal spaces. Short numeric values are zero-padded to 8 characters. A whitespace-only or over-long value is rejected as INVALID_INPUT before any payment or upstream call."New value: +"Companies House company number. Accepted shapes are the register's own — 1-8 digits (zero-padded to 8, e.g. 445790 → 00445790), one letter + 7 digits (R0000001), two letters + 6 digits (SC002180, NI000001, OC123456, OE000001), or the registered-society suffix forms (two letters + 5 digits + 1 letter; two letters + 4 digits + 2 letters). Case-insensitive; surrounding whitespace is ignored (which is why maxLength is 10); internal spaces and punctuation are not accepted. Any other value (for example PROBE) is rejected as INVALID_INPUT before payment and before any upstream call."
    • changedInput schema / properties / company_number / pattern
      Previous value: -"^\\s*[A-Za-z0-9]{1,8}\\s*$"New value: +"^\\s*(?:[0-9]{1,8}|[A-Za-z][0-9]{7}|[A-Za-z]{2}[0-9]{6}|[A-Za-z]{2}[0-9]{5}[A-Za-z]|[A-Za-z]{2}[0-9]{4}[A-Za-z]{2})\\s*$"
  2. Changed3 schema fields changed
    • removedInput schema / properties / companyNumber
      Removed value: -{
      -  "description": "Companies House company number. The identifier itself is 1-8 letters/digits; surrounding whitespace is ignored (which is why maxLength is 10), but the value must not contain internal spaces. Short numeric values are zero-padded to 8 characters. A whitespace-only or over-long value is rejected as INVALID_INPUT before any payment or upstream call.",
      -  "maxLength": 10,
      -  "minLength": 1,
      -  "pattern": "^\\s*[A-Za-z0-9]{1,8}\\s*$",
      -  "type": "string"
      -}
    • addedInput schema / properties / company_number
      Added value: +{
      +  "description": "Companies House company number. The identifier itself is 1-8 letters/digits; surrounding whitespace is ignored (which is why maxLength is 10), but the value must not contain internal spaces. Short numeric values are zero-padded to 8 characters. A whitespace-only or over-long value is rejected as INVALID_INPUT before any payment or upstream call.",
      +  "maxLength": 10,
      +  "minLength": 1,
      +  "pattern": "^\\s*[A-Za-z0-9]{1,8}\\s*$",
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "companyNumber"
      -]New value: +[
      +  "company_number"
      +]
  3. Changed9 schema fields changed
    • changedInput schema / properties / limit / description
      Previous value: -"Maximum PSCs to return per page (1-100). Default 25. Eckari reads up to three register pages of 100 entries to fill this after the ceased filter is applied; if the limit is still unmet, has_more is true and next_offset says where to resume."New value: +"Maximum PSCs to return per page (1-100). Default 10. Eckari reads up to three register pages of 100 entries to fill this after the ceased filter is applied; if the limit is still unmet, page.has_more is true and page.next_offset says where to resume."
    • changedInput schema / properties / offset / description
      Previous value: -"Zero-based index into the register's own PSC list (not into the filtered result). Pass back the next_offset from the previous response to page."New value: +"Zero-based index into the register's own PSC list (not into the filtered result). Pass back page.next_offset from the previous response to page."
    • removedOutput schema / properties / data / additionalProperties
      Removed value: -false
    • changedOutput schema / properties / data / description
      Previous value: -"Contains public sector information licensed under the Open Government Licence v3.0 (Companies House)."New value: +"Capability output; full JSON Schema at https://api.eckari.com/v1/capabilities/company.uk.owners"
    • removedOutput schema / properties / data / properties
      Removed value: -{
      -  "active_count": {
      -    "description": "Register-wide count of PSC entries with no cessation date. Not a count of the returned page.",
      -    "type": "integer"
      -  },
      -  "active_statement_count": {
      -    "description": "Number of statements with no cessation date. Unaffected by include_ceased.",
      -    "type": "integer"
      -  },
      -  "ceased_count": {
      -    "description": "Register-wide count of ceased PSC entries. Not a count of the returned page.",
      -    "type": "integer"
      -  },
      -  "company_number": {
      -    "type": "string"
      -  },
      -  "exemptions": {
      -    "description": "PSC exemptions recorded against the company. This is where the register records a listed company's exemption from the PSC regime (DTR5 / voting shares admitted to a regulated market) — it is a separate register collection from statements, and it is the reason a listed PLC discloses no PSC. Historic (closed) exemptions are returned too, flagged by is_current false.",
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "description": {
      -          "description": "Official exemption text from the Companies House exemption_descriptions enumeration. Falls back to the raw key when unknown; never invented.",
      -          "type": "string"
      -        },
      -        "exempt_from": {
      -          "format": "date",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "exempt_to": {
      -          "description": "Date the exemption ended; null while it remains in force.",
      -          "format": "date",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "exemption_type": {
      -          "description": "Companies House exemption key (e.g. psc-exempt-as-trading-on-uk-regulated-market, disclosure-transparency-rules-chapter-five-applies).",
      -          "type": "string"
      -        },
      -        "is_current": {
      -          "description": "Derived; true when the register records no end date for the exemption.",
      -          "type": "boolean"
      -        }
      -      },
      -      "required": [
      -        "exemption_type",
      -        "description",
      -        "exempt_from",
      -        "exempt_to",
      -        "is_current"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  "has_more": {
      -    "description": "Derived; true when PSC entries matching the current filter remain beyond this page — either because more matches were read than limit allows, or because the register list was not exhausted within the three-page read budget. owners.length < limit is NOT a valid end-of-list test, and neither is comparing against total_results or active_count, which are register-wide.",
      -    "type": "boolean"
      -  },
      -  "next_offset": {
      -    "description": "Derived; the offset to pass to the next request to continue after the last PSC returned. Null when has_more is false.",
      -    "type": [
      -      "integer",
      -      "null"
      -    ]
      -  },
      -  "offset": {
      -    "description": "The register index this page started at (the requested offset).",
      -    "type": "integer"
      -  },
      -  "owners": {
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "address": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "address_line_1": {
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "address_line_2": {
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "care_of": {
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "country": {
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "locality": {
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "po_box": {
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "postal_code": {
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "premises": {
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "region": {
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            }
      -          },
      -          "type": [
      -            "object",
      -            "null"
      -          ]
      -        },
      -        "ceased_on": {
      -          "format": "date",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "country_of_residence": {
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "date_of_birth": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "month": {
      -              "type": "integer"
      -            },
      -            "year": {
      -              "type": "integer"
      -            }
      -          },
      -          "required": [
      -            "month",
      -            "year"
      -          ],
      -          "type": [
      -            "object",
      -            "null"
      -          ]
      -        },
      -        "identification": {
      -          "additionalProperties": false,
      -          "description": "Corporate/legal-person identification where applicable.",
      -          "properties": {
      -            "country_registered": {
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "legal_authority": {
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "legal_form": {
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "place_registered": {
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            },
      -            "registration_number": {
      -              "type": [
      -                "string",
      -                "null"
      -              ]
      -            }
      -          },
      -          "type": [
      -            "object",
      -            "null"
      -          ]
      -        },
      -        "is_active": {
      -          "description": "Derived; true when the register records no cessation date for this PSC entry. It describes the entry, not the company — a dissolved company can still carry a PSC entry with no cessation date, so check company.uk.status for the company's own state.",
      -          "type": "boolean"
      -        },
      -        "is_sanctioned": {
      -          "description": "Register-declared flag, passed through unchanged. Companies House only ever populates it for beneficial owners on the Register of Overseas Entities, where the filer declares whether the person is designated under UK sanctions legislation; it is null for every other PSC entry and null does NOT mean 'not sanctioned'. This is NOT a sanctions screening result: Eckari runs no screening, checks no list and infers nothing. Screen against an authoritative sanctions source before relying on it.",
      -          "type": [
      -            "boolean",
      -            "null"
      -          ]
      -        },
      -        "kind": {
      -          "description": "PSC kind (e.g. individual-person-with-significant-control, corporate-entity-person-with-significant-control, legal-person-with-significant-control, super-secure-person-with-significant-control, or the *-beneficial-owner variants for registered overseas entities).",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "name": {
      -          "description": "PSC name as published. Null only for super-secure entries, where the register withholds the individual's particulars.",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "nationality": {
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "natures_of_control": {
      -          "description": "Companies House natures_of_control codes exactly as published (e.g. ownership-of-shares-75-to-100-percent, voting-rights-25-to-50-percent, right-to-appoint-and-remove-directors, significant-influence-or-control). Stable keys for machine matching.",
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "natures_of_control_descriptions": {
      -          "description": "Official Companies House text for each natures_of_control code, from the register's published psc_descriptions enumeration, in the same order and of the same length as natures_of_control (e.g. \"The person holds, directly or indirectly, more than 75% of the shares in the company.\"). An unrecognised future code echoes back as itself; never invented.",
      -          "items": {
      -            "type": "string"
      -          },
      -          "type": "array"
      -        },
      -        "notified_on": {
      -          "format": "date",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        }
      -      },
      -      "required": [
      -        "name",
      -        "kind",
      -        "is_active",
      -        "notified_on",
      -        "ceased_on",
      -        "natures_of_control",
      -        "natures_of_control_descriptions",
      -        "is_sanctioned"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  "ownership_status": {
      -    "description": "Single derived answer to \"does this company disclose owners, and if not, why not?\". Precedence, highest first. (1) pscs_listed — at least one active PSC entry is listed (this also covers the Register of Overseas Entities statement all-beneficial-owners-identified, which is meaningful only alongside listed entries). (2) exempt_listed_company — a current PSC exemption, or an active statement whose key starts psc-exempt-. (3) no_psc_declared — an active statement no-individual-or-entity-with-signficant-control (or its -partnership form), or the Register of Overseas Entities statement no-beneficial-owner-identified: the entity positively declares it has no registrable person. (4) psc_not_identified — an active statement saying an owner exists but the register does not (yet) identify them: psc-exists-but-not-identified, psc-details-not-confirmed, steps-to-find-psc-not-yet-completed, psc-contacted-but-no-response, psc-has-failed-to-confirm-changed-details, restrictions-notice-issued-to-psc, awaiting-confirmation-from-psc, their -partnership forms, the Register of Overseas Entities keys at-least-one-beneficial-owner-unidentified and information-not-provided-for-at-least-one-beneficial-owner (and the combined form), and all-beneficial-owners-identified filed with no PSC entry on the register. (5) super_secure — an active super-secure statement, or an active PSC entry the register marks super-secure, where the individual's particulars are withheld. (6) no_information — the register holds no PSC entry, no active statement and no exemption at all. Any other active statement key, including one the register publishes in future, is reported as psc_not_identified, so no_information is never returned while the register is explaining itself. An empty owners list never on its own means the company has no owner. Paging caveat: for a company whose every active PSC entry is super-secure, a page that skips past those entries reports pscs_listed rather than super_secure — both are truthful (the entry is listed), and no page can turn a company with disclosed PSCs into super_secure.",
      -    "enum": [
      -      "pscs_listed",
      -      "exempt_listed_company",
      -      "no_psc_declared",
      -      "psc_not_identified",
      -      "super_secure",
      -      "no_information"
      -    ],
      -    "type": "string"
      -  },
      -  "statements": {
      -    "description": "PSC statements filed against the company — the register's own explanation of why a PSC entry is absent or incomplete (no registrable person, PSC not identified, restrictions notice, super-secure, and the Register of Overseas Entities beneficial-owner statements). Ceased statements are omitted unless include_ceased is true. This collection is fetched whole, not paged by limit/offset, so ownership_status does not drift between pages.",
      -    "items": {
      -      "additionalProperties": false,
      -      "properties": {
      -        "ceased_on": {
      -          "format": "date",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "description": {
      -          "description": "Official statement text from the Companies House psc_descriptions enumeration. Falls back to the raw key when the register publishes a key we do not yet carry; never invented.",
      -          "type": "string"
      -        },
      -        "linked_psc_name": {
      -          "description": "Name of the PSC the statement refers to",
      -          "type": [
      -            "string",
      -            "null"
      -          ],
      -          "where the register links one.": null
      -        },
      -        "notified_on": {
      -          "format": "date",
      -          "type": [
      -            "string",
      -            "null"
      -          ]
      -        },
      -        "statement": {
      -          "description": "Companies House statement key (e.g. no-individual-or-entity-with-signficant-control, psc-exists-but-not-identified, restrictions-notice-issued-to-psc, no-beneficial-owner-identified).",
      -          "type": "string"
      -        }
      -      },
      -      "required": [
      -        "statement",
      -        "description",
      -        "notified_on",
      -        "ceased_on",
      -        "linked_psc_name"
      -      ],
      -      "type": "object"
      -    },
      -    "type": "array"
      -  },
      -  "total_results": {
      -    "description": "Register-wide count of PSC entries for this company. Not a count of the returned page.",
      -    "type": "integer"
      -  }
      -}
    • removedOutput schema / properties / data / required
      Removed value: -[
      -  "company_number",
      -  "total_results",
      -  "active_count",
      -  "ceased_count",
      -  "offset",
      -  "owners",
      -  "has_more",
      -  "next_offset",
      -  "statements",
      -  "active_statement_count",
      -  "exemptions",
      -  "ownership_status"
      -]
    • addedOutput schema / properties / meta / properties / attribution_url
      Added value: +{
      +  "format": "uri",
      +  "type": "string"
      +}
    • addedOutput schema / properties / meta / properties / retrieved_at / format
      Added value: +"date-time"
    • addedOutput schema / properties / meta / required
      Added value: +[
      +  "capability",
      +  "version",
      +  "retrieved_at",
      +  "source",
      +  "freshness",
      +  "request_id"
      +]
  4. First observed

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, open-world, non-destructive behavior. The description adds a valuable non-obvious semantic: an empty items list does not mean no owner, and ownership_status/PSC statements explain why. This goes beyond the schema and helps the agent interpret response data correctly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loads the most important interpretive caveat before routing guidance and pricing. Every line earns its place, and the use/not-for/related structure makes it easy for an agent to scan and act on.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich input schema, output schema, and annotations, the description covers the remaining critical context: when to use it, when not to, how to interpret empty results, and related tools. Nothing essential for selecting and invoking the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% coverage, with thorough descriptions for company_number, limit, offset, and include_ceased. The tool description itself adds no parameter-level guidance, but with full schema coverage it does not need to. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly identifies the tool as a beneficial-owner lookup for UK companies via the title and 'Use when: Who owns this UK company?' This is a specific verb-plus-resource statement that distinguishes it from director, profile, and status lookups. It also names the relevant PSC concept, so there is no ambiguity about what the tool returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit 'Use when' and 'Not for' guidance, and directly names the alternative director-focused tool. Listing related tools further helps an agent route to the correct sibling. This is concrete, actionable usage guidance rather than a vague hint.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources