Skip to record
The Long Record
File a record

API · read tier · v1

API documentation

Read-only, unauthenticated, and unmetered. There is no key to request, no rate limit to negotiate, and no terms of use to accept. Everything the API returns is dedicated to the public domain under CC0-1.0 — you may take it, mirror it, train on it, or sell it, and you do not owe us attribution.

01

Endpoints

GET/api/dossiers

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.

GET/api/dossiers/{handle}

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.

GET/r/{handle}/claims/{nn}

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.

GET/f/{filingId}

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: all

03

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           otherwise

The 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.

  1. 01

    Status describes evidence, not people. verified means an attached document was checked against an independent source. Much of what matters about a person leaves no paper trail, so self-asserted is not a demerit.

  2. 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.

  3. 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.

  4. 04

    Cite references, not URLs. TLR-2026-000002-C01 keeps resolving after a rename; /r/tunde-oyelaran may not. Former handles redirect, and /f/{filingId} always resolves.

  5. 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.

API documentation · The Long Record