Skip to main content
state accepts 52 US jurisdictions: all 50 states, plus the District of Columbia and Puerto Rico. Federal law lives under its own federal jurisdiction, separate from the states. Accepting a jurisdiction is not the same as holding every corpus for it, so read GET /us/statutes/coverage before you scope a search.

How jurisdictions are keyed

  • State codes are 2-letter strings: ca, tx, ny, fl, and so on. They are case-insensitive, and an unrecognized value is rejected with a 422 rather than silently matching nothing.
  • Pass a list to search several at once ("state": ["ca", "ny", "tx"]), which is one call instead of one per jurisdiction.
  • federal is the jurisdiction for the federal corpora. A federal search needs only a corpusType, no state.
  • Each jurisdiction row from /us/statutes/coverage carries a kind: federal, state, or territory. DC and Puerto Rico are territory.
Not every corpus type exists for every jurisdiction. A state may have its statutory code (STATE) and constitution (STATE_CONSTITUTION) but no administrative regulations (REGULATION) or court rules (STATE_RULES) yet.Check coverage before you scope a search. Do not assume.

The two discovery endpoints

GET /us/statutes/coverage

Which corpora exist in which jurisdiction, with document counts, freshness notices and retrieval status. Free, no credits.

GET /us/statutes/divisions

Walk the hierarchy one level at a time: a state’s codes, then its chapters, then its sections. 1 credit, refunded on an empty level.
Coverage expands weekly. Read it at request time rather than baking counts into your app.

Reading a jurisdiction’s corpora

GET /us/statutes/coverage returns a wrapped { "data": ..., "meta": ... } response. Each jurisdiction in data.jurisdictions has a corpora object whose keys are the corpusType tokens that actually have data, mapped to the ingested document count. Read those keys to know which searches you can scope. The same response carries data.corpusTypes, a legend naming every token and whether it is federal or state-scoped, so you never need a hardcoded list.
A count is not an age. data.freshness names statute corpora that are no longer being refreshed, and data.retrieval carries lastRetrievedAt and cadence per source, so a count can be read as maintained or frozen.Each notice names a (jurisdiction, corpusType) pair, never a whole jurisdiction: a state can be frozen in one corpus and current in another.

Listing a state’s codes

state=tx alone searches every Texas code at once. To scope below a jurisdiction, browse its codes with /us/statutes/divisions and pass one back as the code filter on search.
Each node’s identifier is what code on POST /us/statutes/search takes, so browse output feeds straight back in. Drill one level further by passing it back to /us/statutes/divisions (corpusType=STATE&state=tx&code=tx_pe returns that code’s chapters), and keep going until isLeaf is true, where each node carries an actId. Browse supports USC, CFR, STATE and REGULATION. The other corpora are flatter, so reach those with /us/statutes/search.
The discovery pattern is: /us/statutes/coverage to see which corpora a jurisdiction has, /us/statutes/divisions to see how that jurisdiction is structured, then POST /us/statutes/search with the corpusType, state and code you confirmed.

Corpus Types

The corpusType tokens and how to pair them with a state.

API Coverage

The full jurisdiction matrix with current section counts.
Last modified on September 6, 2026