Developers
A FOIA pipeline you can put behind your own buttons.
Aletheca is built to be embedded. Reading the archive needs no key at all; originating requests needs one, and everything your site originates carries its attribution — publicly, permanently, and with a revenue share attached.
Start here
Every read endpoint is open. This is a deliberate position rather than an oversight: an archive that publishes documents and then locks its metadata behind an API key has not really published anything, and the fee-waiver argument that makes the whole operation viable rests on the claim that everything we receive is genuinely free to the public.
curl https://aletheca.com/api/v1/requests?disposition=glomar curl https://aletheca.com/api/v1/agencies/nro
Write access
Originating requests needs a key, issued when an integration is set up. Keys are scoped to a partner, carry the agreed revenue share, and are the mechanism by which attribution is recorded — there is no separate attribution parameter to forget.
curl -X POST https://aletheca.com/api/v1/proposals \
-H "Authorization: Bearer ak_live_..." \
-H "Idempotency-Key: case-2026-03-11-radar" \
-H "Content-Type: application/json" \
-d '{
"agency": "faa",
"title": "Radar and ATC audio, SLC sector, 11 Mar 2026",
"scope": "All radar data (NTAP or equivalent), controller audio ...",
"rationale": "Three witness reports describe the same object ...",
"date_range": { "from": "2026-03-11", "to": "2026-03-11" },
"channel": "portal",
"fee_waiver": true,
"campaign": "aaro-resolution-record",
"external_ref": "uapnexus:case:8812"
}'Resources
Read the archive
No key, no signup, no rate limit worth mentioning. Everything the website shows a visitor is available as JSON, because an archive that publishes documents and hides its metadata behind a key has not really published anything.
- GET/api/v1/requestsEvery filed request, filtered.public
- GET/api/v1/requests/{id}One request with its cost, correspondence and documents.public
- GET/api/v1/requests/{id}/eventsThe full public ledger for one request.public
- GET/api/v1/eventsThe firehose — every public event, newest first.public
- GET/api/v1/documentsReleased documents with pages, exemptions and OCR state.public
- GET/api/v1/agenciesThe register — 1,343 federal and state bodies with statute, deadline and intake routes.public
- GET/api/v1/agencies/{slug}One body: register entry, components, and a scorecard where Aletheca has filed.public
- GET/api/v1/lawsAll 57 public-records statutes with deadlines, appeal paths and fee-waiver standards.public
- GET/api/v1/laws/{id}One statute in full, with the bodies that answer to it.public
- GET/api/v1/coverageWhat Aletheca can file against, with the confidence of each layer.public
- GET/api/v1/docketOpen proposals with votes, funding and quorum.public
- GET/api/v1/dispositionsThe controlled vocabulary, with tones and clock semantics.public
Originate requests
The half that makes Aletheca a foundation rather than a website. A partner site can put a proposal on the Docket, commission a request outright, or open a hosted checkout — and everything it originates is attributed to it, publicly and permanently.
- POST/api/v1/proposalsPut a drafted request on the Docket, attributed to your site.key
- POST/api/v1/requestsCommission a request immediately. Returns a payment intent unless prepaid.key
- POST/api/v1/checkoutsA hosted checkout session for a commission or a contribution.key
- POST/api/v1/contributionsContribute to an existing proposal on behalf of your user.key + user
- POST/api/v1/campaignsGroup requests into a campaign with a shared funding target.key
- GET/api/v1/estimatesPrice a request before showing it to a user: channel, class, add-ons.key
Your integration
Attribution, revenue share and delivery.
- GET/api/v1/partnerYour integration: share rate, surfaces, originated requests.key
- GET/api/v1/partner/ledgerAccrued revenue share, per request, with payout state.key
- GET/api/v1/partner/webhooksYour webhook endpoints and their delivery health.key
- POST/api/v1/partner/webhooksRegister an endpoint and the event types it wants.key
Idempotency
Every POST accepts an Idempotency-Key header and replays the original response for 24 hours. Filing a duplicate request costs money and irritates a records officer, so the safe retry is the default path.
Pagination
Cursor-based. `next` is an opaque string; pass it back as `cursor`. Offsets would drift as the ledger grows, which on a feed that appends constantly is a guarantee of missed rows.
Versioning
The path carries the major version. Fields are added without a bump; a field is never removed or re-meant inside a version. Deprecations are announced on the changelog feed and by webhook.
For agents
The same surface is exposed as an MCP server at /mcp, so an assistant can search the archive, price a request and put one on the Docket for its user to approve. Write tools require the same key and the same human confirmation step as the web composer — an agent may draft and price a letter to the government, and a person authorises it.