Federal Register
Overview
The Federal Register itself — who changed what, when, and what is still open for comment.
- status
- live
- document id
doc_ide.g.fr:2024-07332- citation
[89 FR 12345]
Common calls
Rules from one agency
POST /v1/fr/search {"query": "PFAS drinking water", "filters": {"doc_type": "Rule"}}Proposed rules still open for comment
POST /v1/fr/search {"query": "出口管制 半导体", "filters": {"doc_type": "Proposed Rule", "comments_close_on": {"gte": "2026-10-09"}}}Read one
GET /v1/fr/read/fr:2024-07332Words, not meaning. This domain has no vectors: mode is keyword and a sentence describing what you want will find nothing — give it the terms. Quoted phrases, OR and -exclusions work; Chinese is segmented, and a mixed query is split into both.
The fine print
- Division of labour with us_law: us_law holds the provisions in force (clause-level CFR / USC); fr holds the notices themselves (who changed what, when).
- doc_type uses the official capitalisation (Rule / Proposed Rule / Notice / Presidential Document / Uncategorized Document / Correction / Sunshine Act Document); lowercase 'rule' matches nothing.
- Rules open for comment: filters.comments_close_on={"gte": "<today>"}; upcoming effect: a range on effective_on.
- subjects is an open model-generated label set and is not filterable before normalisation — filter on fr_topics (the official topics) instead.
- No vectors: the query runs as an English tsvector and a Chinese zhparser pass whose results are unioned; mixed queries are split automatically, and quoted phrases / OR / -exclusion work.
- Model-written fields (summarise, do not quote): action_kind, affected, key_point, one_liner, one_liner_zh, subjects.
- The field table and enumerations are generated from the store's own self-description (search.field), not hand-written; enumeration counts are as of 2026-10-13.
Search
POST
/v1/fr/searchHybrid retrieval, one card per hit. 2 credits. Free sample:
PFAS drinking water.Filter fields
| field | type · ops | meaning |
|---|---|---|
| action_kind | keyword · eq anyinformation_collection · meeting_or_hearing · amendment · approval_or_authorization · determination_or_finding · other … 19 values, /facets lists them all | Action kind (closed set of 19, model-assigned) |
| agencies | keyword · eq any | Issuing agencies (several allowed, any match) |
| doc_type | keyword · eq anyNotice · Rule · Proposed Rule · Uncategorized Document · Presidential Document · Correction · Sunshine Act Document | Document type (official capitalisation: Rule / Proposed Rule / Notice / Presidential Document …) |
| pub_date | datetime · range | Publication date range |
8 more, all usable
| field | type · ops | meaning |
|---|---|---|
| cfr_refs | keyword · eq any | CFR references touched, e.g. 40 CFR 141 |
| comments_close_on | datetime · range | Comment close date range |
| docket_ids | keyword · eq any | Docket ids |
| document_number | keyword · eq any | Document number (exact, e.g. 2024-07332) |
| effective_on | datetime · range | Effective date range |
| fr_topics | keyword · eq any | Official Federal Register topics |
| rins | keyword · eq any | RINs |
| significant | bool · eq | Whether it is a significant regulatory action |
Parameters
| Parameter | Type | Description |
|---|---|---|
| query REQUIRED | string | 1–1000 characters. Or an array of up to 5 (batch; hits become results[]). |
| top_k | integer= 10 | 1–200. |
| fields | brief · head= brief | head costs one more credit and returns the head view per hit. |
| filters | json | Filter DSL object (see Getting started); declared fields are listed above. |
| mode | keyword= keyword | This domain has one mode — keyword matching, not semantics. |
| sort | relevance · date · pub_date= relevance | Order of the hits. |
| offset | integer= 0 | Pagination. |
Example
{ "domain": "fr", "query": "…", "hits": [ { "id": "fr:2024-07332", "score": 0.83, "brief": { … } } ], "total": null, "coverage": …, "warnings": [],
"meta": { "request_id": "req_…", "credits": { "charged": 2, "balance": 1998, "pool": "allowance" }, "latency_ms": 41, "cached": false } } Undeclared filter fields return 400 rather than being ignored silently. Filters combine with AND;
_or / _not are available.Read
GET
/v1/fr/read/{doc_id}Three depths.
detail is the default. Free sample: fr:2024-07332.Levels
| level | credits | returns |
|---|---|---|
| brief | 1 | Card: action_kind, agencies, citation, doc_id, doc_type, html_url, one_liner, one_liner_zh… |
| detail (default) | 2 | Every structured field (card plus the source abstract and detail fields) |
Parameters
| Parameter | Type | Description |
|---|---|---|
| doc_id (path) REQUIRED | string | Document id (doc_id). |
| level | brief · detail= detail | How deep to read. |
| format | json · md · html= json | Response shape. |
Example
{ "domain": "fr", "id": "fr:2024-07332", "level": "detail", "view": "detail", "data": { … } | "text": "…", "token_count": 1834, "meta": { … } } The older
GET /v1/fr/doc/{id}?view=… still works.Read many
POST
/v1/fr/readUp to 50 ids, one level. Missing ids come back with
error: "not_found" and are not charged.Parameters
| Parameter | Type | Description |
|---|---|---|
| ids REQUIRED | string[] | Document ids. |
| level | brief · detail= detail | Level for every id. |
Example
{ "domain": "fr", "level": "detail", "docs": [ { "id": "…", "data": { … } }, { "id": "…", "error": "not_found" } ], "meta": { … } } Facets
GET
/v1/fr/facets?field={field}Legal values for a filter field, so an agent never guesses; precomputed fields carry counts, declared enums come without. Free, no key.
Parameters
| Parameter | Type | Description |
|---|---|---|
| field REQUIRED | action_kind · doc_type | Filter field with facets. |
| limit | integer= 50 | Max values. |
Example
{ "domain": "fr", "field": "…", "values": [ { "value": "…", "count": 3120 } ], "meta": { … } } Askregistered key+ /stream
POST
/v1/fr/askAgentic Q&A over this domain: with no vector layer, the model turns the question into structured filters plus bilingual full-text search, reads the hits and answers with [fr: ] citations; /stream is NDJSON with real token deltas.
effort low / medium / high = 50 / 100 / 200 credits. Append /stream for NDJSON; the first event is always billing. A failure before the first answer_delta is refunded.Parameters
| Parameter | Type | Description |
|---|---|---|
| query REQUIRED | string | 1–2000 characters. Be specific; ask for numbers if you want numbers. |
| effort | low · medium · high= low | Reading rounds, and the price: 50 / 100 / 200 credits. Your plan caps it. |
| verbose | bool= false | Include the tool-call trace (tool_call / tool_result / thinking events when streaming). |
| top_k | integer= 10 | Speculative prefetch size. |
| stream_answer | bool= true | Streaming only: false emits one answer event instead of deltas. |
| max_rounds | integer | 0–8, overrides the effort preset. |
| force_answer_after | number | Seconds; hard cutover into the answer phase. |
| max_answer_tokens | integer= 4096 | Hitting it sets answer_truncated. |
| language | string | Answer language; defaults to the query’s. |
Example
{ "answer": "… [89 FR 12345] …", "sources": [ … ], "stats": { "rounds": 1, "elapsed_s": 6.2, "answer_truncated": false }, "coverage"?: { … }, "meta": { "credits": { "charged": 50, … } } } Citations are real — every id in
answer exists in this domain (format [89 FR 12345]). sources is the retrieval set, not the citation list. answer_truncated means incomplete.