Officer Id vs Disqualified officer Id and how to link the two?


The officerId used to get an officer’s appointment appears to be totally different to the officer id for disqualified officers, even if they are both the same person.

For example, for this person ( picked randomly )

Mubasher TAHIR,

The officer id for appointments is (HX2gL3WrEoUaFbb6XgqFZ8UOyAE)

But for disqualifications, for the same person , the id is (tF4JHa6LsgNcjB200HPsbZE7uVI)

In the app that I have built, the users need to be able to view the disqualifications for an officer listed along with the appointments. But as the two ids are totally different, is there a way to find out an officer’s disqualifications based on his/her id which I used to get his/her appointments?

Ideally, we’d like to avoid two separate searches:
First search to search for ‘Mubasher Tahir’, to view his appointments.
Another separate search for ‘Mubasher Tahir’, to view the disqualifications.

This seems a bit odd. If I can get an officer’s appointments using their Id, shouldn’t I be able to get their disqualifications using the same Id ? Because otherwise I have no way of knowing if two Mubasher Tahir’s are the same person or different.


Hello @hello,

I’d await the definitive answer from CH but when search disqualified functionality was brought in there was the following exchange in thread New Disqualified Officer functionality . This seems to explain that the appointments and disqualified datasets are distinct and so the answer to the question “is there a way to find out an officer’s disqualifications based on his/her id which I used to get his/her appointments?” will be “no”:

Will this be a separate call, or will disqualified officers be returned with the existing officer search?
Why we need to search again for disqualification ?
Can’t we do an Officer search and then use the self id (person id) to retrieve both the appointments and disqualifications ?
XMLGateway delivers both appointments and disqualifications combined in OfficerDetail response.

…of course, you can search for both at once by name (using /search?q=…) but of course that will also find companies (although you can then filter them out based on the kind member) and you’re then got to decide if matching names are matching persons…

General info about scoping and the limits of matching individuals in the following threads (spoiler - no simple way to do this although some more functionality may be available via the [paid] XML gateway API) :

  • Director identification - may be several appointment entries per person and IDs for officers (within a company), PSCs and officer appointments seem to be unrelated.
  • How is officer_id scoped? - some information about scoping of identifiers (I’m not certain where the quoted information here comes from though).
1 Like

Thanks for your answer ( apologies for late reply). So it seems there is no way to do this. I’ll look into the paid xml gateway , if that provides this functionality.

Update: it looks (on a brief read of ) as if this will offer what you want. You can query the officers for a given company and get a PersonID:

2.5 Company Appointments
PersonID - Unique identifier for the individual director, may be used on future functions to request further details

If you then request the
2.10 Company Officer Details
…providing the
Person ID - Retrieved from Company Officer Search
…it seems the data set returned includes all appointments for that ID, including disqualifications - there are fields:

  • NumDisqualOrders
  • OfficerDisq

The document is a bit old (April 2014) and clearly missing some more recent changes but think it’s basically valid - we were using this when we were utilising the XML Gateway.

Probably the place to start research is:

…links from there give you the XML Schemas, costs, terms of use etc.

To bring things up to date or answer queries there’s a forum for the XML gateway like this one at

Overall it seems that you get most of the functionality of the data set via the REST API. Companies House people frequently state that the direction of travel is towards the REST API being the main (only?) means of accessing the data. Not seen any dates or even “coming soon” however so I think the XML Gateway will still be there tomorrow.

1 Like

I am trying using the REST APIs to get the company and company director’s data. I tried the officer appointments link from the response of the API but it includes neither the PersonId nor the Offier Id. Can you please guide me from where can I get that?
Ultimately, I want to display the Company Details, The Directors of the company and the Disqualifications of the Directors. If have found this Companies House Public Data API: Get a corporate officers disqualifications API to list the officers’s disqualifications but I didn’t get the officer_id to be used in the API. Can you please guide me in that?


You are quite correct - what the appointment link returns is something like:


This is a separate ID - neither the company or an officer ID. The link to the appointments endpoint just allows you to relate an officer to their appointments. Effectively that allows you to link officers to other companies. (Note that there are limitations to that however e.g. due to data issues it’s not a perfect “one appointment = everything for that person” - search around on the forum for details.)

I find browsing around the Companies House online register helps me understand the system best. The API follows this quite closely.

Basically the data flow is normally:

  • Find a company (by name or number) - get the company number (company numbers are “static” and publicly available).
  • From company you can find all the officers and PSCs for that company. Both have separate IDs but I don’t think they relate to other data (that we can access via the REST API).
  • For an officer you can find (via the appointments link) all the company numbers that they have been appointed to (with caveats above). You could then branch over those and repeat.
  • For officers or PSCs that are companies (Companies House uses the terms “corporate entities” or “RLEs”) you may be able to get their company numbers (from the identification data structure, the registration_number field) and repeat the process to get their officers. However this appears to be user-entered data and is neither required nor validated as far as I know.

In the REST API there is not a direct link between the above data sets and the Disqualifications - you’re just fuzzy-matching strings.

For more on you ultimate task, see: