Streaming API timepoints and endpoints

Hello, I have a few questions and would appreciate your help in clarifying them.

  1. I need some assistance with understanding a few things related to StreamingAPI:

    1.1 The API’s different endpoints seem to have different starting points for timepoints. For example, in filing-history the timepoint is 168511966, but in company it’s 82025317.
    Is this normal? Are they supposed to be different? And do these timepoints differ across different accounts? (I’m using two accounts, one primary and one backup.)

    1.2 What should we do if the last event we received was more than 3 days ago? Our connector was intentionally disconnected from StreamingAPI due to technical reasons.
    Is there a way to retrieve events older than 3 days? Is this even possible?

    1.3 Are timepoints counted in seconds starting from a certain DateTime? And is that DateTime in UTC (i.e., UTC+0)?

    1.4 According to the documentation, the oldest retrievable timepoint is “3 days ago,” but when trying to fetch events from that time range, we receive a 416 response code.
    Does this mean we’re requesting a timepoint that exceeds the 3-day limit? Here’s an example of the last event we received:

{
   "resource_kind": "company-profile",
   "resource_uri": "/company/15893094",
   "resource_id": "15893094",
   "data": {
   "accounts": {
   "accounting_reference_date": {
   "day": "31",
   "month": "08"
   },
   "next_accounts": {
   "due_on": "2026-05-12",
   "period_end_on": "2025-08-31",
   "period_start_on": "2024-08-12"
   },
   "next_due": "2026-05-12",
   "next_made_up_to": "2025-08-31"
   },
   "can_file": true,
   "company_name": "VAPEBOX LTD",
   "company_number": "15893094",
   "company_status": "active",
   "confirmation_statement": {
   "next_due": "2025-08-25",
   "next_made_up_to": "2025-08-11"
   },
   "date_of_creation": "2024-08-12",
   "etag": "b845162ed5d8824907607daf6ccc939cd2dc76f9",
   "jurisdiction": "england-wales",
   "links": {
   "filing_history": "/company/15893094/filing-history",
   "officers": "/company/15893094/officers",
   "persons_with_significant_control": "/company/15893094/persons-with-significant-control",
   "self": "/company/15893094"
   },
   "registered_office_address": {
   "address_line_1": "83 Chelford Road",
   "address_line_2": "Eccleston",
   "country": "England",
   "locality": "St. Helens",
   "postal_code": "WA10 5PL"
   },
   "sic_codes": [
   "46170"
   ],
   "type": "ltd"
   },
   "event": {
   "timepoint": 82025317,
   "published_at": "2024-08-12T19:28:02",
   "type": "changed"
   }
}

Based on the logic, the timepoint 82025317 represents 82025317 seconds from 2024-08-12T19:28:02, which means to avoid a 416 error in the request, I would need to calculate the difference in seconds between 2024-08-12T19:28:02 and the current time (e.g., 2024-09-05 09:09:49), then add this difference to the original timepoint and use the result in the request.
However, I still receive a 416 error. Here’s an example of my calculations:

[2024-09-05 09:09:49.798389][][][DEBUG] Original timepoint: 82025317. Original datetime: 2024-08-12 19:28:02  
[2024-09-05 09:09:49.798468][][][DEBUG] Modified timepoint: 83802655
[2024-09-05 09:09:49.799231][][][DEBUG] StreamingAPI called endpoint: https://stream.companieshouse.gov.uk/companies?timepoint=83802655

I’ve tried the same approach for a timepoint “2 days ago” but still get the same 416 error. Meanwhile, the same logic works fine with the filing-history endpoint.
Is it possible that some endpoints allow fetching historical events with different time ranges (1 day, 2 days, 3 days)? The documentation doesn’t mention this. What am I doing wrong?

  1. Is there a more up-to-date version of the documentation?
    In the current documentation available at developer-specs.company-information.service.gov.uk/companies-house-public-data-api/reference,
    the object schemas and descriptions (e.g., mandatory/optional fields) don’t match the actual data I’m receiving from the API.

  2. From what I understand, the officer_id from the endpoint developer-specs.company-information.service.gov.uk/companies-house-public-data-api/reference/officer-disqualifications/get-natural-officer
    doesn’t match the officer_id from developer-specs.company-information.service.gov.uk/companies-house-public-data-api/reference/officer-appointments/list.
    How can I retrieve disqualifications for an officer using the ID I get from your data (e.g., BZVJHIlegGkpm_1w4bT4HnZ4Ekk)?
    When I request data from both disqualified-officers endpoints, I get the response {"timestamp":"2024-09-05T09:27:54.254069593","message":"Resource not found."}
    Could you clarify for which officers this request is valid? Is it specific to a certain type or status of officers?

Thats a lot of post there…

  1. They are not timepoints you can calculate. Think of them as indexes. Store the last index you received from each stream and supply the same index when you re-connect.
    Yes the ‘timepoints’ are all different as the number of events or the amount of traffic, varys across the streams.
  2. If you have a specific example of the data not matching the specs, please provide that so we can investigate.
  3. officer id and disqualified officer id are not related.
    ‘Both’ disqualified-officers endpoints ?

Thanks for the prompt response Mark and sorry for the wall of text!

  1. I haven’t connected to the Streaming API for 5 days. When I try to reconnect using the last received timepoint, I get a 416 Range Not Satisfiable error.
    I’d like to understand how I can retrieve the events I missed while I was disconnected from the Streaming API.

  2. According to the documentation on this page: Streaming API:,
    if the requested timepoint is too old, it returns a 416 error. This brings up the question: what’s the correct timepoint to use in such cases?
    Should I make a request without a timepoint? How can I fetch the events I missed?

  3. It seems like most sections of the CompanyHouse Public Data API haven’t been updated for at least 2 years, but the response data has changed quite a bit.
    For example, in the filing history section (Companies House Public Data API: filingHistoryList),
    a lot of fields aren’t documented, like items[].description_values, annotations[].category, annotations[].type, and associated_filing[].description_values. Here’s an example:

{
  "filing_history_status": "filing-history-available",
  "items": [
    {
      "transaction_id": "MzQyODkxODk5OWFkaXF6a2N4",
      "barcode": "XD7GELAI",
      "type": "RP10",
      "date": "2024-07-16",
      "category": "address",
      "description": "default-companies-house-service-address-applied-psc",
      "description_values": {
        "change_date": "2024-07-16",
        "default_address": "Companies House Default Address, PO Box 4385, Cardiff, CF14 8LH",
        "company_number": "15589529",
        "psc_name": "Sajid Saeed"
      },
      "pages": 1,
      "links": {
        "self": "/company/15589529/filing-history/MzQyODkxODk5OWFkaXF6a2N4",
        "document_metadata": "https://document-api.company-information.service.gov.uk/document/n2rjdYLHtGQJoSNZh_JtRdxsrp2heJ350HrTRcechj8"
      }
    },
    {
      "transaction_id": "MzQyODkxODkwNmFkaXF6a2N4",
      "barcode": "XD7GEKLE",
      "type": "RP09",
      "date": "2024-07-16",
      "category": "address",
      "description": "default-companies-house-service-address-applied-officer",
      "description_values": {
        "change_date": "2024-07-16",
        "officer_name": "Sajid Saeed",
        "default_address": "Companies House Default Address, PO Box 4385, Cardiff, CF14 8LH",
        "company_number": "15589529"
      },
      "pages": 1,
      "links": {
        "self": "/company/15589529/filing-history/MzQyODkxODkwNmFkaXF6a2N4",
        "document_metadata": "https://document-api.company-information.service.gov.uk/document/T8nESN6FdLqvHMyvTuBxmelkrY0dtg-kjzbRO7IIkCc"
      }
    },
    {
      "transaction_id": "MzQyODkxODI2NWFkaXF6a2N4",
      "barcode": "RD7HCLAY",
      "type": "RP05",
      "date": "2024-07-16",
      "category": "address",
      "description": "default-companies-house-registered-office-address-applied",
      "description_values": {
        "change_date": "2024-07-16",
        "default_address": "PO Box 4385, 15589529 - Companies House Default Address, Cardiff, CF14 8LH"
      },
      "pages": 1,
      "action_date": "2024-07-16",
      "paper_filed": true,
      "links": {
        "self": "/company/15589529/filing-history/MzQyODkxODI2NWFkaXF6a2N4",
        "document_metadata": "https://document-api.company-information.service.gov.uk/document/tGdB_5aeW8_YXzr9gyNMuXqVmQUARXLSmsuO4W6Bc08"
      }
    },
    {
      "transaction_id": "MzQxNTg3NjMyNmFkaXF6a2N4",
      "barcode": "XCZI724P",
      "type": "NEWINC",
      "date": "2024-03-23",
      "category": "incorporation",
      "annotations": [
        {
          "annotation": "Part Admin Removed The registered office, director, person with significant control and shareholder address details on the IN01 were administratively removed from the public register on 16/07/2024 as the material was not properly delivered.",
          "date": "2024-07-16",
          "description": "annotation",
          "category": "annotation",
          "type": "ANNOTATION",
          "description_values": {
            "description": "Part Admin Removed The registered office, director, person with significant control and shareholder address details on the IN01 were administratively removed from the public register on 16/07/2024 as the material was not properly delivered."
          }
        }
      ],
      "associated_filings": [
        {
          "category": "incorporation",
          "date": "2024-03-23",
          "description": "model-articles-adopted",
          "type": "MODEL ARTICLES"
        },
        {
          "category": "capital",
          "date": "2024-03-23",
          "description": "statement-of-capital",
          "type": "SH01",
          "description_values": {
            "date": "2024-03-23",
            "capital": [
              {
                "currency": "GBP",
                "figure": "1"
              }
            ]
          },
          "action_date": "2024-03-23"
        }
      ],
      "description": "incorporation-company",
      "pages": 11,
      "paper_filed": true,
      "links": {
        "self": "/company/15589529/filing-history/MzQxNTg3NjMyNmFkaXF6a2N4",
        "document_metadata": "https://document-api.company-information.service.gov.uk/document/9WFrn8HmHupmOsLEUX1Nc_1Vzlag6Thz-SICDa4QOoQ"
      }
    }
  ],
  "items_per_page": 100,
  "start_index": 0,
  "total_count": 4
}

You can also compare the documentation here: Document API: documentMetadata
with the API response. For example:

{
  "company_number": "13498402",
  "barcode": "XD7LY2LM",
  "significant_date": null,
  "significant_date_type": "",
  "category": "annual-returns",
  "pages": 3,
  "filename": "13498402_cs01_2024-07-18",
  "created_at": "2024-07-18T16:36:44.14154645Z",
  "etag": "",
  "links": {
    "self": "https://document-api.company-information.service.gov.uk/document/lDtTHCKxs0MUsjFxYPWerq_2e14_RbNGeuMIgRvy-b0",
    "document": "https://document-api.company-information.service.gov.uk/document/lDtTHCKxs0MUsjFxYPWerq_2e14_RbNGeuMIgRvy-b0/content"
  },
  "resources": {
    "application/pdf": {
      "content_length": 86155
    }
  }
}

From what I’ve seen, there are quite a few differences between the actual API responses and the documentation. I can’t provide a list of every object with undocumented fields, but I can share schemas that include as many fields as possible, based on what I’ve compiled from the API responses, if it helps at all.

Sorry, it’s unclear how to avoid/work around the 416.

Has anyone had the same problem and would share a solution?

Once a stream timepoint becomes unavailable, there’s nothing you can do to get that stream message, as far as I’m aware. The best approach that I can offer would be to use some method (informed trial and error) to determine the oldest available timepoint, and connect to the stream from there. If there are any companies that you happen to know that you’ve missed updates for then you can request the data via the REST API.

I hope this helps

If you’re keeping track of timepoints for each stream (each stream has a separate counter) you should be able to get data from 5 days back. That isn’t too far. You can usually get up to a weeks worth of events back.
If you don’t have a valid timepoint stored for a stream (the one you’ve got is too old), then you’ll need to connect without a timepoint to get the latest events, and then as tyreseba suggests you could calculate roughly a few days timepoints ago by subtracting from it the average daily amount of events on that stream.
You can see typical volumes of how many events get sent per stream per day at Statistics of Companies House Streaming API (JSON download of those stats also available).

Thanks for your response, they were very helpful.