curl --request GET \
--url https://gdeltcloud.com/api/v2/offices/{office_id}/holders \
--header 'Authorization: Bearer <token>'import requests
url = "https://gdeltcloud.com/api/v2/offices/{office_id}/holders"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://gdeltcloud.com/api/v2/offices/{office_id}/holders', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"success": true,
"data": []
}List Office Holders
The valid-time roster of one office: every (holder, term) the publishers assert, ordered current → ended → unknown and most recent start first. Two datasets asserting one term are ONE row naming both sources. Holders are terminal spine ids collapsed through the arbiter; a holder the binder did not mint is served with entity_id: null and its holder_source_ref, never dropped. Pages by an opaque keyset cursor; a token from a different sort or filter set is refused with 400 CURSOR_STALE rather than answered plausibly.
curl --request GET \
--url https://gdeltcloud.com/api/v2/offices/{office_id}/holders \
--header 'Authorization: Bearer <token>'import requests
url = "https://gdeltcloud.com/api/v2/offices/{office_id}/holders"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://gdeltcloud.com/api/v2/offices/{office_id}/holders', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"success": true,
"data": []
}Authorizations
GDELT Cloud API key. Send as Authorization: Bearer gdelt_sk_....
Path Parameters
The office id.
Query Parameters
Number of records to return on this page; use the returned continuation to request the next page. Note: validation is owned by the endpoint service because it depends on composed or cross-parameter state; the published error semantics above still apply.
1 <= x <= 200Continuation from pagination.next_cursor in the previous response. Keep the other filters unchanged; null means no next page. Also accepts: offset. Note: validation is owned by the endpoint service because it depends on composed or cross-parameter state; the published error semantics above still apply.
Restrict to office-holders the PUBLISHER asserts as current, ended or unknown. unknown is a real bucket, not a synonym for current: the source did not say, and nothing here infers currency from a missing end_date. Combine with as_of to ask "current AND in office on that date" — the two are independent predicates. Matched case-insensitively. Full value list: https://docs.gdeltcloud.com/reference/enums#office_holder_status
current, ended, unknown VALID TIME — who HELD the office on this date (YYYY-MM-DD), read from the start/end dates the publisher states. This is NOT knowledge-time replay: it is not routed through the can_use_asof gate and does not answer "what did we know then". An office-holder with no published start date cannot be placed on a date and is EXCLUDED rather than guessed — meta.undated_office_holders counts how many the date could not see. A future date is accepted and reads as "still in office as far as the source has published".

