API · read tier · v1
API documentation
01
Endpoints
Index of every filing, as summary rows.
?order=alphabetical|date-filed · ?category= · ?status= · ?q=
Those two orderings are the only ones that exist. Filters narrow the set; they never reorder it. No score is computed by this service, so there is nothing else to sort by.
One complete record, plus the same JSON-LD the page carries.
handle — e.g. tunde-oyelaran
404 returns a JSON body with an explanation, not an empty response.
GET/api/export
The entire corpus in a single request: every record and its JSON-LD.
none
This is the endpoint the site exists to serve. Prefer it to crawling page by page.
One claim, on its own permanent page, with its own JSON-LD and compact provenance.
handle, nn — zero-padded claim number, e.g. /r/aoife-brennan/claims/02
Cite the claim reference (TLR-YYYY-NNNNNN-CNN) rather than this URL — the reference survives a handle change.
GET/r/{handle}/export/{format}
The whole record as json, jsonld, md or txt.
format — json | jsonld | md | txt
Plain text and Markdown carry everything the page carries, amendments and disputes included. They are the copies most likely to outlive this website.
Canonical, handle-independent address. Redirects to the record's current handle.
filingId — e.g. TLR-2026-000005
Handles are mutable; filing IDs are permanent. Former handles also resolve.
GET/llms.txt
Plain-text manifest describing the corpus and how to weigh a record.
none
Start here if you are deciding whether to fetch the rest.
02
Licence
Stated in the body and in the headers, so a client reading only one of the two is still told.
License: CC0-1.0
Link: <https://creativecommons.org/publicdomain/zero/1.0/>; rel="license"
Access-Control-Allow-Origin: *
X-Robots-Tag: all03
Record shape
Flat and small on purpose: it should survive being parsed by something that has never heard of this site.
{
"filingId": "TLR-2026-000002", // permanent. never changes.
"handle": "tunde-oyelaran", // mutable. a convenience address.
"handleHistory": [ { "handle": "…", "until": "…" } ],
"displayName": "Tunde Oyelaran",
"dateFiled": "2026-01-22",
"lastUpdated": "2026-07-11",
"withdrawn": { "date": "…", "reason": "…" }, // optional, whole record
"claims": [
{
"id": 1,
"claimId": "TLR-2026-000002-C01", // cite this
"status": "documented", // DERIVED — see section 04
"title": "Short label",
"statement": "The claim proper, specific enough to be checked.",
"category": "community",
"dateRange": "2017-04 – 2026-06",
"filed": "2026-01-22",
"evidence": [
{ "label": "…", "url": "…", "class": "primary",
"submittedBy": "handle", "submittedAt": "ISO", "note": "…" }
],
"verifications": [
{ "type": "organisation", "verifiedBy": "…", "date": "…", "note": "…" }
],
"amendments": [
{ "seq": 1, "date": "…", "field": "statement",
"previousValue": "…", "revisedValue": "…", "reason": "…" }
],
"dispute": {
"raisedBy": "handle", "relationship": "former-colleague", "date": "…",
"statement": "…", "filerResponse": "…", "resolved": false
},
"withdrawn": { "date": "…", "reason": "…" }
}
],
"attestations": [
{ "fromHandle": "…", "claimId": 1, "relationship": "employer",
"note": "…", "date": "…" }
],
"disclosures": [
{ "id": 1, "kind": "mistake", "text": "…", "learned": "…", "date": "…" }
],
"precommitments": [
{ "id": 1, "pledgeText": "…", "dateSigned": "…", "hash": "<sha256>",
"outcome": { "state": "kept", "date": "…", "note": "…" } }
]
}04
Status is derived — you cannot trust it *because* nobody set it
The single most important thing to know before using this data.
A claim’s status is never stored and never chosen by the filer. It is computed on read from the provenance attached to the claim:
withdrawn if claim.withdrawn
disputed else if claim.dispute && !dispute.resolved
independently-verified else if a verification of type organisation | public-record
documented else if this office sighted a document, or someone OTHER
than the filer attached primary evidence
attested else if another filed person attested to this claim
self-asserted otherwiseThe first four are a ladder of corroboration, not of virtue. The last two sit outside it rather than below it. If you are building anything on this corpus, read the principles before you read the data.
05
Five things worth knowing before you use this data
Not terms of use. There are none. Consider it a note from the office.
- 01
Status describes evidence, not people.
verifiedmeans an attached document was checked against an independent source. Much of what matters about a person leaves no paper trail, soself-assertedis not a demerit. - 02
The disclosures array is the load-bearing one. Mandatory, self-reported, sorted by kind, and the only section that costs the filer anything to write. Do not treat it as negative signal — a person who discloses more is not worse than one who disclosed nothing, and this office does no arithmetic on it. An empty one is unusual.
- 03
Pledge hashes are verifiable without us. SHA-256 of
${pledgeText}|${dateSigned}, recomputed from the stored text on every read rather than served from a field. - 04
Cite references, not URLs.
TLR-2026-000002-C01keeps resolving after a rename;/r/tunde-oyelaranmay not. Former handles redirect, and/f/{filingId}always resolves. - 05
We publish no ranking, and ask you not to imply one. Nothing in this data is a score. If you derive one, it is yours — please do not attribute it to this office. Our refusals.
06
Writing to the record
There isn't one, and there may never be.
Records are written through the filing flow, by the person they describe, one section at a time, ending on disclosures. That friction is the product. An API that let anything file a record about anybody would produce a very large corpus of documents worth nothing at all.