Skip to main content
GET
List a state's session laws

Authorizations

Authorization
string
header
required

API key issued from the developer dashboard. Pass as Authorization: Bearer vq_key_... (preferred).

Query Parameters

jurisdiction
enum<string>
required

Two-letter code of the state whose session laws to list: the 50 states, dc and pr. Case-insensitive (MN works). Required: the list is scoped to one jurisdiction at a time. federal and any unknown code is a 422; federal session laws are on /us/statutes/section. A jurisdiction we hold no session laws for yet (Indiana and Tennessee at launch) returns an empty page, which is charged: see sessionLaws on /us/statutes/coverage for what is held.

Available options:
al,
ak,
as,
az,
ar,
ca,
co,
ct,
de,
dc,
fl,
ga,
gu,
hi,
id,
il,
in,
ia,
ks,
ky,
la,
me,
md,
ma,
mi,
mn,
ms,
mo,
mt,
ne,
nv,
nh,
nj,
nm,
ny,
nc,
nd,
mp,
oh,
ok,
or,
pa,
pr,
ri,
sc,
sd,
tn,
tx,
ut,
vt,
vi,
va,
wa,
wv,
wi,
wy
Example:

"mn"

session
string | null

Only laws enacted in this session. Use the code exactly as session.code reports it: 2025R is the 2025 regular session, 2025S1 the first special session of 2025. Case-sensitive, so 2025r matches nothing. A code that matches no session returns an empty page (charged), not an error; characters other than letters, digits, ., _ and - are a 422. Omit to list every session.

Required string length: 1 - 32
Pattern: ^[A-Za-z0-9._-]+$
Example:

"2025R"

series
enum<string>[] | null

Only laws in one of these numbering series. Repeat the parameter for several (series=resolve&series=resolves); they combine with OR. general is the ordinary chapter sequence of most states; others number acts, resolutions or local laws apart. One of general, public, public_act, special_act, private_and_special, act, acts, law, local, municipal, appropriation, resolve, resolves, resolution, resolution_chapter, joint_resolution, concurrent_resolution, memorial, initiated_bill, constitutional_amendment, as a result's series reports it. Not every jurisdiction uses every series: sessionLaws on /us/statutes/coverage lists each one's. Any other value is a 422, never charged; a valid series nothing matches returns an empty page (charged). Omit for every series.

Available options:
general,
public,
public_act,
special_act,
private_and_special,
act,
acts,
law,
local,
municipal,
appropriation,
resolve,
resolves,
resolution,
resolution_chapter,
joint_resolution,
concurrent_resolution,
memorial,
initiated_bill,
constitutional_amendment
Example:
instrumentType
enum<string>[] | null

Only these kinds of measure. Repeat the parameter for several (instrumentType=joint_resolution&instrumentType=concurrent_resolution); they combine with OR. One of act, joint_resolution, concurrent_resolution, resolution, resolve, memorial, other (act is an ordinary law), as instrumentType reports it. Any other value is a 422, never charged; a valid kind nothing matches returns an empty page (charged). Omit for every kind.

Available options:
act,
joint_resolution,
concurrent_resolution,
resolution,
resolve,
memorial,
other
Example:
approvedFrom
string<date>

Only laws approved (signed) on or after this date. Format YYYY-MM-DD, inclusive; it must be a real calendar date (2025-02-30 is a 422). A law with no printed approval date never matches, and neither does one whose approvedDate we derived (approvedDateDerived: true): this filter reads the registry's own approval date, so South Dakota's derived dates are not found by it. Pair with approvedTo for a range; an end before the start is a 422 (never charged).

Pattern: ^\d{4}-\d{2}-\d{2}$
Example:

"2025-04-01"

approvedTo
string<date>

Only laws approved (signed) on or before this date. Format YYYY-MM-DD, inclusive; it must be a real calendar date (2025-02-30 is a 422). Like approvedFrom, it does not match a derived approvedDate.

Pattern: ^\d{4}-\d{2}-\d{2}$
Example:

"2025-05-31"

effectiveFrom
string<date>

Only laws with an effective date on or after this date. Format YYYY-MM-DD, inclusive; it must be a real calendar date (2025-02-30 is a 422). A law matches when the span from its first to its last effective date (effectiveFirst to effectiveLast) overlaps your window, so one whose dates straddle your day is returned even though none falls exactly on it: read effectiveDates on the law for the dates themselves. Only laws with a held effective date can match, and not every state's publisher prints them (Texas, Washington and Iowa do; Minnesota does not yet): a law with no effective date is never returned by this filter, though it may well be in force. To get everything taking effect on one day, send the same date to both effectiveFrom and effectiveTo; for example jurisdiction=tx, effectiveFrom=2025-09-01, effectiveTo=2025-09-01 lists the Texas acts effective September 1, 2025.

Pattern: ^\d{4}-\d{2}-\d{2}$
Example:

"2025-09-01"

effectiveTo
string<date>

Only laws with an effective date on or before this date. Format YYYY-MM-DD, inclusive; it must be a real calendar date (2025-02-30 is a 422). Overlap rule as for effectiveFrom. An end before effectiveFrom is a 422 (never charged).

Pattern: ^\d{4}-\d{2}-\d{2}$
Example:

"2025-09-30"

hasText
boolean | null

true: only laws whose text is served (textStatus: held), the ones /{sessionLawId}/body will return. false: only laws whose text is not served (withheld, not_held or pending). Omit for both. Combined with textStatus by AND, so hasText=true&textStatus=withheld is always empty. Anything but a boolean is a 422.

Example:

true

textStatus
enum<string> | null

Only laws with this text status. One of held, withheld, not_held, pending: held is served, withheld is held but kept back for a measured defect, not_held is known to exist without text, pending is collected and not yet verified. Any other value is a 422. Omit for every status.

Available options:
held,
withheld,
not_held,
pending
Example:

"held"

isLaw
boolean | null

true: only measures that are law. false: only numbered measures that are NOT law (a vetoed bill, a pocket veto), the ones isLaw: false marks. Omit for both. A measure whose outcome does not settle it (not_presented, unknown) has a null isLaw, so it matches neither true nor false: use enactmentOutcome for those. Anything but a boolean is a 422.

Example:

false

enactmentOutcome
enum<string>[] | null

Only laws with one of these outcomes. Repeat the parameter for several (enactmentOutcome=vetoed&enactmentOutcome=pocket_veto); they combine with OR. One of signed, became_law_without_signature, veto_overridden, line_item_veto, vetoed, pocket_veto, not_presented, approved_by_voters, unknown, as enactmentOutcome reports it. Any other value is a 422, never charged; a valid outcome nothing matches returns an empty page (charged). The order you send them in does not matter, and a cursor stays valid for the same set.

Available options:
signed,
became_law_without_signature,
veto_overridden,
line_item_veto,
vetoed,
pocket_veto,
not_presented,
approved_by_voters,
unknown
Example:
updatedSince
string<date>

Only laws whose record changed on or after this date, midnight UTC, by updatedAt: the filter for a sync job that pulls only what is new or corrected since its last run. Format YYYY-MM-DD, inclusive; it must be a real calendar date (2025-02-30 is a 422). A day with no change returns an empty page (charged), not an error.

Pattern: ^\d{4}-\d{2}-\d{2}$
Example:

"2026-10-01"

q
string | null

Only laws whose title or printed billNumber contains this text, case-insensitively (grain buyers finds An act relating to agriculture; modifying financial reporting requirements for grain buyers ...). A plain substring, not a search engine: no stemming, no ranking, and % and _ mean themselves. The bill number is matched as the publisher prints it (S.F.No. 1552, not SF 1552): to find a law by citation, use GET /us/session-laws/{sessionLawId}. 3 to 100 characters after trimming and without control characters, else a 422 (never charged); text that matches nothing returns an empty page (charged). Combines with the other filters by AND within the required jurisdiction.

Required string length: 3 - 100
Example:

"grain buyers"

cursor
string | null

Where to resume: the previous page's nextCursor, unchanged. Send it with the same filters that produced it (limit may change). It is opaque, signed and tied to those filters, and is only ever issued by this API: a value we did not issue is a 422 with reason: invalid_cursor, one from an older cursor format is cursor_expired, and one sent with different filters is cursor_query_mismatch (restart without cursor). Never an empty page. Omit for the first page.

Maximum string length: 600
Example:

"eyJ2IjoyLCJqIjoibW4iLCJzIjoiMjAyNVIiLCJpIjoiU1NMX01OXzIwMjVSX0dfWTIwMjVfQzEwIiwicSI6IjYxMjk2NDEzOTE2OTJmOTYifQ.86d0NXnVAJD7j_3d9zoWPQ"

limit
integer
default:50

Rows per page, 1 to 200; default 50. A page costs the same however many rows it holds, so a larger limit is cheaper per law. Outside the range is a 422.

Required range: 1 <= x <= 200
Example:

25

Response

A page of the state's session laws. hasMore and nextCursor say whether another follows; an empty results is a charged answer, unless coverage says the session or state is not fully collected.

Response for GET /us/session-laws/list.

processingTimeMs
number
default:0

Server-side time for this request in milliseconds, excluding network transit. Not billed on.

Example:

747.5

creditsConsumed
integer
default:0

Credits actually charged for this call, never the list price. It includes the /us/statutes/resolve fee when a citation was sent where an id goes. 0 when the call was not charged or was refunded (a body that answers available: false).

Example:

2

results
SessionLawSummary · object[]

The page of laws, by session.code and then sessionLawId, both as text in the database's collation, not chapter order (so ..._C10 comes before ..._C2; sort by number client-side if you need chapter order). The record without its dates list, sources or text: fetch those with GET /us/session-laws/{sessionLawId}.

count
integer
default:0

Rows on this page. Never a total: the list is paged by cursor and has no corpus-wide count.

Example:

25

nextCursor
string | null

Opaque cursor for the next page: send it as cursor, with the same filters. Null on the last page.

Example:

"eyJ2IjoxLCJqIjoibW4iLCJzIjoiMjAyNVIiLCJpIjoiU1NMX01OXzIwMjVSX0dfWTIwMjVfQzEzIn0"

hasMore
boolean
default:false

True when another page follows. Each page is charged, an empty one included, except an empty page that coverage reports as a gap in our collection.

Example:

true

coverage
SessionLawListCoverage · object | null

Present only on an EMPTY page: what we hold of the session (or state) you asked about, so you can tell nothing matches your filters from we have not collected this. status: complete means the first: the page is charged. partial (the collection stopped short) and not_held (we hold nothing of it) mean the second: the page is NOT charged and creditsConsumed is 0. Omitted when the coverage cannot be read, in which case the empty page is charged as before.

Last modified on October 9, 2026