Display Kept in this browser only

The record for programs

Everything a page shows is also data at the same address. There are no keys, no accounts and no rate limits; there is a licence, a stability promise and a request to be reasonable. The whole record in one file is on the data page.

What answers

AddressReturns
/d/FD-36873.json
/d/FD-36873/sub/1.json
That address's sheet as JSON: caption, sub-dockets, every filing and decision with the Board's dates as printed, each attachment with its content hash and the Board's own URL. Since shape 2 the JSON covers what the page at that address covers — a sub-docket answers for itself and names its series, and a series number answers with its index and no entries, because each proceeding keeps its own. Any case of the number resolves; one spelling is served, the rest 301 to it.
/filing/<id>.json
/decision/<id>.json
One record with its docket. The ids are the Board's own.
/document/<sha256>.pdfThe bytes of a file the record holds, by their SHA-256 — the suffix says what they are (.pdf, .jpg, .zip, .xlsx, .docx). Range requests, a year's cache, the hash as ETag. Permanent by construction: the same bytes always answer at the same address.
/d/FD-36873/feed
/d/AB-55/sub/794X/feed
/p/<id>/feed
/feed
Atom: a docket, a proceeding, a party, or the agency. An AB sub-docket has its own feed; elsewhere a sub-docket’s feed redirects to its family’s, which is what following it follows. Webhooks carry the same payload, signed — see methodology.
/d?q=<citation>
/cite?q=<citation>
The citation resolver: a docket or decision in any of the Board's printed forms — STB Finance Docket No. 36873, Ex Parte No. 711, AB 55 (Sub-No. 785X), FD 36873 (STB served Aug. 25, 2026), Decision 53210 — answers 303 to the permanent address (/d) or JSON naming it (/cite). Never a guess: a date two decisions share resolves to the sheet, and says so.
/court
/protective
Registers: every Notice of Court Action, and every motion for a protective order, by docket — projections of a type the Board printed.
/search?q=Search, as an HTML page: results grouped by proceeding. Filters are parameters, repeatable where it says so: prefix (AB, FD…), from and to (ISO dates the Board printed), in (captions, decisions, filings, comments, text, parties), ftype and dtype (the Board's filing and decision types), sort (best or newest), page, docket (within one proceeding) and view=documents (every match once). Not indexed, never cached, and nothing typed is kept.
/suggest?q=Search-as-you-type over docket numbers, captions and party names: a JSON list of hits. Nothing typed is kept.
/sitemap.xmlEvery address the record has, paginated by kind, with lastmod; the cheapest way to learn what exists.
/healthThe store's freshness, as the heartbeat reads it.
/openapi.jsonThe machine description of every public route this site serves, HTML pages included, generated from the code that serves them; the gated reviewer surface is not described in it. There is no separate API: the pages are the API.
/llms.txtA plain-text account of what this record is and is not, for an assistant that reads it — the same caveats a reader gets.

An example

curl -H "User-Agent: my-tool/1.0 (hello@example.org)" https://docketyard.org/filing/311981.json
{
  "source": "https://docketyard.org/",
  "licence": "CC0-1.0",
  "licence_url": "https://creativecommons.org/publicdomain/zero/1.0/",
  "shape_version": 3,
  "held": {"enriched": "…"},
  "generated_at": "2026-08-27T14:40:00+00:00",
  "filing": {
    "kind": "filing",
    "date": "2026-08-25",
    "date_printed": "8/25/2026",
    "docket_raw": "FD_36873",
    "record_id": "311981",
    "type": "Motion",
    "filed_for_raw": "Union Pacific Railroad Company",
    "attachments": [{"url": "https://dcms-external.s3.amazonaws.com/…/311981.pdf",
                     "label": "311981.pdf",
                     "document_sha256": "9bbce28b…",
                     "media_type": "pdf"}],
    "url": "https://docketyard.org/filing/311981",
    "docket": {"raw_docket": "FD_36873", "printed": "FD 36873", "url": "https://docketyard.org/d/FD-36873"}
  }
}

Illustrative: the dates and attachment are shaped like the real ones, not copied from them. A field the Board left blank is null, never guessed.

Licence

The raw index — the compilation of every docket, filing, decision, date and document hash, with its provenance, and the fields that are the Board's own work — is dedicated to the public domain under CC0 1.0; every JSON response says so in its licence field. The words of filings and environmental comments are in the public record because their authors filed them, and are reproduced as the Board publishes them; they are not ours to dedicate. The enriched layer (the party module: who filed for whom, resolved to entities; and the machine-read text of documents) is held out of the JSON and the snapshot until its licence is reviewed; the held field says so on every response. The code that serves all of this is AGPL.

For an assistant

Setting one up for the first time? Connect an AI assistant walks through it. A read-only MCP server answers at /mcp (Streamable HTTP, no key, no session): search the record, read a docket sheet, read an environmental comment, read a page of a document's text on a user's question, count filings by the Board's own filing type, list the proceedings behind such a count, and ask what is not covered. Nothing on that surface writes, subscribes or spends on a reader's behalf, and every answer carries the caveats this page carries — coverage is not uniform, every date and caption is quoted rather than computed, and nothing here says what any party argued. /llms.txt is the same thing in prose. robots.txt says what AI crawlers may do, in place of leaving them to guess.

What is stable

  • Addresses are permanent. A docket, filing, decision, party or document address, once served, answers forever — the same record, or a 301 to where it now lives (never a 404 for something that existed). This is a written commitment, not a habit: ADR 0013.
  • Shapes are versioned. Every JSON response carries shape_version (now 3). It is raised — and announced on the data page — when a field changes name or meaning. New fields may appear without a bump; read by name, not by position.
  • Releases are dated. The software is released as vYYYY.MM.N; this response came from v2026.10.4. Nothing about a release is a promise beyond the two lines above.
  • A miss says so, as data. An address that holds nothing answers 404; at a .json address the body is JSON — {"error": "not_found", "detail": …, "shape_version": 3} — never an HTML page.
  • Blanks are blanks. A date is the one the Board printed, in ISO form beside the printed form; nothing is computed from context. Nothing here says what any party's position is.

What is asked of a client

  • Send a User-Agent that names your tool and a way to reach you.
  • Honour Cache-Control and ETag: pages are good for 5 minutes, JSON for 30, a document for 365 days; a matching If-None-Match is a 304 and costs nothing.
  • For anything that walks the whole record, take the nightly snapshot instead of a hundred thousand requests. For what changed, take a feed.
  • Reading is anonymous by design (privacy): no cookie is set, no address is logged, only counts by kind of page are kept. There is nothing to sign up for and nothing to authenticate.
  • Quote the caveats with the data. What this record covers and when it began is on the coverage page; how it is made is in the methodology. Every record links the Board's own file, which remains the authority.

Something wrong in the data? Corrections. Something missing from this surface? Contribute.