Skip to main content
GET
Get a state session law's text, current or a past version

Authorizations

Authorization
string
header
required

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

Headers

Idempotency-Key
string | null

Optional. 16 to 255 visible ASCII characters (a UUIDv4 works). Repeating the same request with the same key replays the original 2xx response for 24 hours without charging again. The same key on a different request is rejected. With the account's cacheQueryDerivedData retention setting off, no body is stored and a retry answers 409 idempotency_replay_unavailable, still without a second charge.

Required string length: 16 - 255
Pattern: ^[\x21-\x7e]+$
Example:

"3f9c2a1e-7b44-4d0a-9c1e-5a6b7c8d9e0f"

Path Parameters

session_law_id
string
required

A state session law's id, for example SSL_MN_2025S1_G_Y2025_C1, from a /us/session-laws/list result.

A citation also works here on GET /us/session-laws/{sessionLawId}, and resolvedFrom says what your input matched. Name the state in the citation: Minn. Laws 2025, ch. 1, 2025 Minn. Laws ch. 1, Ch. 1, Laws of Minnesota 2025, Ch. 2025-12, Laws of Fla., 2025 Wash. Sess. Laws ch. 12, La. Acts 2025, No. 12, Pa. Act 12 of 2025, Minn. S.F. 1552 (2025), MN: Laws 2025, ch. 1. A form only one state uses needs no state: P.A. 104-0001 (Illinois), Pub. Act No. 26-151 (Connecticut), S.L. 2025-12 (North Carolina), Stats. 2025, ch. 12 (California), D.C. Law 25-713. The publisher's printed form (CHAPTER 2025-12, S.F.No. 1552) and the citation we print on every law also work. A form several states share (Laws 2025, ch. 1, HB 123, Act 12 of 2025) is a 404 with reason: needs_jurisdiction, the states it exists in and one candidate per state: we never guess the state. A citation naming several laws of one state (Minnesota 2025 has two Chapter 1s) is a 404 listing all of them, candidateCount and truncated saying whether the list is complete, and defaultSessionLawId the regular session's law where there is exactly one conventional reading. An id or citation that matches nothing in a session we have only partly collected is a 404 with reason: session_not_fully_collected and that session's coverage: the law may exist and not be held yet, so it is never charged, the resolve price included. A citation costs the route's price PLUS the /us/statutes/resolve price (2 credits), the second kept whether or not it resolves (an unresolved citation is a charged verdict) and refunded on an ambiguous citation (several laws carry it and none is chosen, so nothing resolved), on a partly collected session, on a citation we could not read as a state session-law citation at all (its detail lists the accepted forms) or on a failure. URL-encode the citation; one containing / cannot travel in a path segment.

Federal session laws (SAL_..., Pub. L. 118-5, the Statutes at Large) are served by /us/statutes/section, not here, and code citations (26 U.S.C. § 1) by /us/statutes/resolve.

Required string length: 1 - 300
Example:

"SSL_MN_2025S1_G_Y2025_C1"

Query Parameters

cursor
string | null

Where to resume: the previous page's nextCursor, unchanged. Omit for the first page. It is opaque, signed and tied to the exact text it was cut from: a value we did not issue (reason: invalid_cursor), from an older cursor format (cursor_expired) or past the end of the text (cursor_past_end) is a 422, and one from before the text was re-collected is a 409 (start again without it). None is charged. Send either cursor or startChar, never both (a 422, never charged).

Maximum string length: 600
Example:

"eyJ2IjoyLCJvIjoyOTk4NywiaCI6IjAyNjkzZDViNTVkNDcwOWIifQ.stWHVSgGqJPIElcTLfAGHA"

startChar
integer | null

Start the page at this character offset into the text (0-based, the same scale as pageStart and totalChars): an alternative to cursor for jumping to a place you already know, such as where a section begins. The page is the same size and price as any other and its nextCursor is a normal signed cursor. Send either startChar or cursor, never both (a 422, never charged). 0 to 100,000,000; a value at or beyond the end of the text is a 422 and is refunded. There is no page-size parameter: the price per page is fixed. A short law is one page whatever you pass, so jumping into it saves no credit.

Required range: 0 <= x <= 100000000
Example:

29987

expectTextSha256
string | null

The textSha256 you read the text under, in lowercase hex (the whole 64 characters, or any prefix of 16 or more). When this law's text no longer has that hash (it was re-collected), the answer is a 409 and nothing is charged, exactly as for a cursor cut from an earlier version: use it with startChar, which otherwise has no version binding of its own. Anything that is not 16 to 64 lowercase hex characters is a 422.

Pattern: ^[0-9a-f]{16,64}$
Example:

"02693d5b55d4709bdd36fdccee4a9737d2655a3988a90daeb6b7c486ce50260b"

version
integer | null

Read this version of the act's text instead of the current one: a version from GET /us/session-laws/{sessionLawId}/versions. Omit for the current version. The page, its nextCursor and textSha256 belong to that version's text, so a cursor from one version is a 409 on another. A number that is not one of the law's listed versions is a 404 and is refunded; a value below 1 is a 422 and is never charged. Priced as any body page. On a law we hold back, an older version is readable only with includeUnverified=true, exactly as its current text is.

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

1

includeUnverified
boolean
default:false

Opt in to the TEXT of a law we hold but do not serve (textStatus: withheld). Default false: such a law answers available: false, as before, and nothing else changes. With true its text is returned when the reason it is held back is one we can label, and every page then carries textReliability (unverified or known_issue), reasonCode and a notice to show beside the text: the text may show deleted or vetoed law as if it were enacted. A law whose licence bars use, or whose text failed our own validation, is never served, opted in or not (available: false with a reasonCode). Priced as any body page. A served law answers as usual, with textReliability: verified.

Example:

true

Response

One page of the act's text, or available: false (not charged) when we do not serve it.

Response for GET /us/session-laws/{sessionLawId}/body.

sessionLawId
string
required

The law this page belongs to.

Example:

"SSL_MN_2025S1_G_Y2025_C1"

citation
string
required

The act's citation as its publisher prints it, the same as citation on GET /us/session-laws/{sessionLawId}. Carried here so a page is attributable on its own, with no second call.

Example:

"CHAPTER 1--S.F.No. 3"

jurisdiction
string
required

Lowercase two-letter code of the state, dc or pr.

Example:

"mn"

session
SessionLawSession · object
required

The legislative session the law was enacted in.

available
boolean
required

False when we do not serve this law's text; reason says why. A page with available: false is not charged.

Example:

true

textStatus
enum<string>
required

Whether we serve this law's text. held: the text is served by /us/session-laws/{sessionLawId}/body. withheld: we hold the text but a measured defect keeps it from being served, and withheldReason says what. not_held: we know the act exists and do not hold its text. pending: collected and not yet verified.

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

"held"

processingTimeMs
number
default:0

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

Example:

747.5

creditsConsumed
number
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

approvedDate
string<date> | null

Date the governor approved the act, ISO 8601, as on GET /us/session-laws/{sessionLawId}: never an effective date. Null when none is held. See approvedDateDerived.

Example:

"2025-06-14"

approvedDateDerived
boolean
default:false

True only when approvedDate was filled from the publisher's dated signature label rather than held as the approval date. See the same field on GET /us/session-laws/{sessionLawId}.

Example:

false

sourceUrl
string | null

The official page or file this text was collected from, on a government publisher's host. Present on EVERY outcome, a withheld or not-held law included, so a reader is never at a dead end: where we do not serve the text, this is where to read it. Null only when we hold no government text source for the law.

Example:

"https://www.revisor.mn.gov/laws/2025/1/Session+Law/Chapter/1/"

officialUrl
string | null

The publisher's page for this act (never a Vaquill URL): the legislature's page for the bill where it keeps one, else sourceUrl. See the same field on GET /us/session-laws/{sessionLawId}.

Example:

"https://www.nysenate.gov/legislation/bills/2025/A414"

reason
string | null

Why available is false: not_held, withheld, pending or empty_text. Null when the text is served.

Example:

"withheld"

withheldReason
string | null

Present only when textStatus is withheld: what is wrong with the text we hold. A plain sentence to show, not an enum to branch on.

Example:

"LA: struck (deleted) law is merged into the text as if current while the record declares the markup preserved or absent (audit 2026-10-03). Awaiting a re-run with strike and underline recovery."

text
string | null

This page of the act's text, exactly as printed, in reading order. Concatenating every page's text in order reproduces the whole text. Where amendatoryMarkup is preserved, struck and inserted language is in the text in the convention markupConvention names. Null when available is false.

Example:

"CHAPTER 1--S.F.No. 1552\n\nAn act\n\nrelating to agriculture; ..."

pageStart
integer | null

Character offset in the full text where this page starts (0-based). Pages are contiguous: the next page's pageStart equals this page's pageEnd.

Example:

0

pageEnd
integer | null

Character offset just past this page. A page is about 30,000 characters, cut back to a paragraph break where one is near, so the length varies.

Example:

29987

totalChars
integer | null

Length of the whole text in characters. This page is the last when pageEnd equals it.

Example:

310454

totalPages
integer | null

The most pages the whole text can take: a page holds up to the page size but is cut back to a paragraph break, so every page but the last is counted at its shortest size. A long act usually takes fewer pages and never more. Null when no text is served.

Example:

11

pagePrice
integer
default:0

Credits charged for the page in this response, the same as creditsConsumed on this route: the price of one page when a page was served, 0 when none was (available is false). Each further page costs the same.

Example:

6

estimatedRemainingCredits
integer | null

The most credits to read the rest of the text from pageEnd: the most pages still to come (counted at the shortest size a page can be cut back to) times the price of a page. 0 on the last page. Null when no text is served. An upper bound that is never below what reading the rest costs. Reading a whole law costs estimatedBodyPages times the price of one body page (6 credits per page on GET /us/session-laws/{sessionLawId}/body); most acts are a page or two.

Example:

60

textSha256
string | null

SHA-256 (hex) of the full text of this law. It changes only when the text does, so it is the cheap way to tell whether a copy you hold is current. Body pages carry the same value.

Example:

"02693d5b55d4709bdd36fdccee4a9737d2655a3988a90daeb6b7c486ce50260b"

amendatoryMarkup
string | null

Whether the language an amending act strikes and inserts survives in the text. preserved: it is in text, in the convention markupConvention names. lost: the publisher printed it and our text does not keep it, so deleted words can read as law: check the source before quoting. absent: the act carries no such markup that we found. not_applicable: there is no text to carry it.

Example:

"preserved"

markupConvention
string | null

How preserved markup is written, set only when amendatoryMarkup is preserved. wdiff: deleted language is [-like this-] and inserted language {+like this+}. publisher_literal: the publisher's own words are left as printed (Minnesota prints new text begin / new text end and deleted text begin / deleted text end markers). mixed: both in one text.

Example:

"publisher_literal"

nextCursor
string | null

Opaque cursor for the next page: send it as cursor on the same path. Null on the last page. It is tied to this exact text, so a cursor from before the text was re-collected is a 409.

Example:

"eyJ2IjoxLCJvIjoyOTk4NywiaCI6IjAyNjkzZDViNTVkNDcwOWIifQ"

hasMore
boolean
default:false

True when more pages follow; fetch them with nextCursor. Each page is charged.

Example:

true

version
integer | null

Which version of the act this page belongs to, the version of GET /us/session-laws/{sessionLawId}/versions. Present only when you sent version or includeUnverified; absent otherwise (the current version).

Example:

2

isCurrentVersion
boolean | null

True when version is the version GET /us/session-laws/{sessionLawId} serves now. Present with version.

Example:

false

textReliability
enum<string> | null

How far to trust this text. Present when you sent includeUnverified=true, and on every read whose text is not verified. verified: the text passed our strike-through check. unverified: a check has not been completed, so the text MAY show deleted or vetoed law as if enacted. known_issue: we have evidence it does. A served law can be any of the three and its text is served either way. Branch on reasonCode, show notice.

Available options:
verified,
unverified,
known_issue
Example:

"unverified"

reasonCode
string | null

Present when the text is not verified, or when includeUnverified=true refuses it: a stable token, one of markup_unverified, strike_unchecked, struck_text_shown_as_current, struck_text_merged, veto_unchecked, licence_unconfirmed, markup_contradicted, struck_text_evidenced, markup_lost, strike_unconfirmed (the text is served with a flag) or validation_failed, session_unresolved, collector_unaudited, licence_barred, unclassified (the text is not served). The sentence in withheldReason is for people; branch on this.

Example:

"strike_unchecked"

notice
string | null

One plain sentence saying what is uncertain about this text and what to do about it. Present exactly when textReliability is unverified or known_issue. Show it beside the text.

Example:

"Deleted (struck) language in the source has not yet been checked against this text, so it may read as enacted law. Do not rely on this text without checking the printed act."