---
title: "Officer history: one officer's appointments across companies"
method: GET
path: "/officers/{officer_id}/appointments"
tags: ["Officers"]
---

# Officer history: one officer's appointments across companies

`GET /officers/{officer_id}/appointments`

## Request

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

Every appointment of one officer, current and resigned, across all companies, from the Companies House officer appointments register (cached for up to 3 days), with what happened to each company: in insolvency, dissolved with its accounts overdue (consistent with compulsory strike-off), dissolved, or active. The summary counts companies that failed in the last 5 years while the officer was appointed or within 12 months of leaving, as the health score does. Take officer_id from the officers lists (officer_id in GET /live/officers/{number} and GET /officers/company/{number}). No addresses are returned and the date of birth is month and year only; appointments withheld at the request of the person named are left out. Up to 500 appointments are read (truncated: true beyond that).

## Path parameters

- `officer_id` string, required

## Response `200`

The officer's appointments with each company's outcome

- OfficerAppointments: One officer across companies: counts and the summary sentence. Appointments withheld at the request of the person named are left out of every count.
  - `officer_id` string, required
  - `name` string, nullable
  - `date_of_birth` object, nullable: Month and year only, as Companies House publishes; null when withheld
    - `month` integer
    - `year` integer
  - `is_corporate_officer` boolean
  - `total_appointments` integer, required
  - `active_appointments` integer
  - `resigned_appointments` integer
  - `companies` integer: Distinct companies
  - `failed_companies` integer: Companies that went into insolvency (liquidation, administration, receivership, or dissolved after a Gazette insolvency notice) or were dissolved with their accounts overdue, at any time
  - `recent_insolvencies` integer: Companies in insolvency in the last lookback_years while this officer was appointed or within 12 months of leaving
  - `recent_strike_offs` integer: Companies dissolved with accounts overdue (consistent with compulsory strike-off) in the last lookback_years, on the same terms
  - `lookback_years` integer
  - `summary` string, required
  - `truncated` boolean: true when the officer has more appointments than were read (500)
  - `_source` 'cache' | 'companies_house'
  - `_fetched_at` string
  - `_stale` boolean: Present (true) when Companies House was unavailable and an older copy was served
  - `items` OfficerAppointment[]
    - `company_number` string
    - `company_name` string, nullable
    - `company_status` string, nullable: From the register we hold where we have the company, else as Companies House gives it with the appointment
    - `officer_role` string, nullable
    - `appointed_on` string, date, nullable
    - `resigned_on` string, date, nullable: null while the appointment is current
    - `active` boolean
    - `outcome` 'active' | 'insolvency' | 'struck_off_overdue' | 'dissolved' | 'other'
    - `failure` object, nullable
      - `kind` 'insolvency' | 'dissolved_with_overdue_filings'
      - `date` string, date, nullable
      - `date_basis` 'gazette_notice' | 'dissolution_date' | 'last_accounts_made_up' | 'incorporation_date' | 'null', nullable
      - `within_lookback` boolean
      - `while_appointed` boolean: Still appointed, or left less than 12 months before the failure

## Other responses

- `400`: Not a Companies House officer id
- `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`: No officer with this id
- `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`: Companies House is busy or unavailable and nothing is cached; retry after the Retry-After seconds

---

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