curl --request GET \
--url https://api.vaquill.ai/api/v1/us/session-laws/{session_law_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.vaquill.ai/api/v1/us/session-laws/{session_law_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.vaquill.ai/api/v1/us/session-laws/{session_law_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.vaquill.ai/api/v1/us/session-laws/{session_law_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Get a state session law, by id or by citation
Everything we hold about one STATE session law except its text: identity and
citation, session, approval date, every printed effective date (effectiveDates,
always a list), other printed dates, the code sections the publisher’s own table
lists the act as affecting (codeSectionsAffected), its sources with hashes, and
whether its text is held. Fetch the text itself, paged, from
/us/session-laws/{sessionLawId}/body.
Cost: 2 credits. Pass a citation where the id goes and it adds the
/us/statutes/resolve price (2 credits), kept whether or not the citation
resolves, so creditsConsumed is then 4. A 404 never keeps this
route’s own price; a failure on our side (500, 503) is refunded in full. A 422
is never charged.
Id or citation. Send a sessionLawId from a list result, or a citation or
bill number (S.F.No. 1552); the sessionLawId path parameter says which forms
are matched and how. resolvedFrom tells you what your input matched, and the
sessionLawId to send next time. A citation matching several laws is a 404 with
reason: ambiguous_citation, every candidate in didYouMean, and none chosen for you.
Prefer the id: it is free of the resolve fee and unambiguous. When a citation names no
state (Laws 2025, ch. 1), pass the optional jurisdiction (mn) to scope it: it
supplies the state, and it vetoes a conflicting one (Minn. Laws 2025, ch. 1 with
jurisdiction=tx is a 404 unresolved_citation). It has no effect on an id.
Citing and sourcing. citableAs is the law in the form a lawyer writes
(Minn. Laws 2025, ch. 1), and citationShort a compact label for tables
(MN ch. 1 (2025)); either is null where we do not know the state’s form, never a
guess, and citableAs resolves back to this law. sourceUrl is the official page
the text was collected from, on a government host, and is present on a withheld
law too. licenseNote says what the law’s licence class permits.
What the dates mean. approvedDate is when the act was signed and is never an
effective date. Where the registry holds none but the publisher dates the governor’s
signature among its other milestones (South Dakota’s Signed by the Governor), we
fill it from that label and say so with approvedDateDerived: true; a presented or
passed date is never read as an approval, and a derived date is not matched by the
list’s approvedFrom and approvedTo. effectiveDates holds the dates the publisher prints as effective
and is empty, not guessed, when none is printed or it is printed as a rule (“the
day following final enactment”); empty does not mean the act is not in force.
otherDates holds the rest (approval, filing, presentment) each with its kind.
codeSectionsAffected is the publisher’s table as printed and is empty when the
publisher prints none, though title usually names the sections in prose.
What the publisher printed. publisher carries what the publisher itself
states about the act: publisherFields, its own structured fields verbatim (Texas gives the
bill’s full action history with journal pages, Maryland the committees and reading dates,
North Carolina and New Mexico a history that can include vote counts, most states little
more than a bill number and a sponsor), plus publisherIds, otherCitations,
legislatureNumber, sessionLastYear, printedPageStart and printedPageEnd and the
label the document carries for its own kind (documentKindAsPrinted). The keys of
publisherFields differ by state and are the publisher’s words, not ours: nothing is
normalised, and a key that is absent is not a fact about the act. provenance says how the
text was obtained (textMethod, pagesWithText, and the bound volume and pages it was
cut from) and lists the collector’s own caveats on the record, verbatim: most say
something about the act or its text a reader should know, and some are working notes about
how the record was assembled. session.coverageStatus says whether we hold the whole
session (complete) or only part of it (partial, so a missing neighbour may exist).
These three are omitted, not null, if they cannot be read; the rest of the answer and its
price are the same.
Withheld text. A law whose text has a measured defect is still returned in
full, with textStatus: withheld and the withheldReason; only its text is held
back (/body answers available: false, free). Check amendatoryMarkup before
quoting an amending act: where it is lost, deleted words can read as law.
Cost of reading a law. Reading a whole law is estimatedBodyPages times the price
of one body page (6 credits). Both are on the record: charCount is its length
in characters and estimatedBodyPages is that divided by the page size (about
30,000 characters), rounded up, and null unless the text is served. Most acts
take a page or two. The longest we hold, Ohio’s 2025 budget act (HB 96, 9,571,132
characters), takes about 320 pages, 1,920 credits to read in
full, so check estimatedBodyPages before you page through an omnibus act. Each body
response then carries pagePrice (what that page cost) and estimatedRemainingCredits
(the pages still to come times the price) so you can stop whenever you have enough.
Example
curl "https://api.vaquill.ai/api/v1/us/session-laws/SSL_MN_2025R_G_Y2025_C1" \
-H "Authorization: Bearer $VAQUILL_API_KEY"
# the same law by bill number (URL-encode the citation)
curl "https://api.vaquill.ai/api/v1/us/session-laws/S.F.No.%201552" -H "Authorization: Bearer $VAQUILL_API_KEY"
# a citation that names no state, scoped to one
curl "https://api.vaquill.ai/api/v1/us/session-laws/Laws%202025,%20ch.%201?jurisdiction=mn" -H "Authorization: Bearer $VAQUILL_API_KEY"
const id = "SSL_MN_2025R_G_Y2025_C1";
const res = await fetch(`https://api.vaquill.ai/api/v1/us/session-laws/${encodeURIComponent(id)}`, {
headers: { Authorization: `Bearer ${process.env.VAQUILL_API_KEY}` },
});
const law = await res.json();
Related endpoints
GET /us/statutes/resolveanswers a citation that names a state session law rather than a code section with asessionLawblock (matched, orambiguouswith every candidate), pointing here. It never changesresolvedorsection.GET /us/statutes/coveragelists, per jurisdiction undersessionLaws, which sessions we hold session laws for and whether each iscompleteorpartial. Read it first: a law missing from apartialsession is not evidence that it does not exist.- Federal session laws (the Statutes at Large,
SAL_ids) are not served here. Read them withGET /us/statutes/section/{actId}.
Nulls. Every field of a response is always present: one with no value is null
(or [] for a list). The examples on this page leave the nulls out for brevity. The
exceptions are blocks that exist only when they apply and are OMITTED otherwise, never
null: publisher, provenance and session.coverageStatus on a law, and coverage on a
list page that has rows.
Rate limits. Calls count against your key’s per-minute budget like every Data
API route; a 429 carries Retry-After.
curl --request GET \
--url https://api.vaquill.ai/api/v1/us/session-laws/{session_law_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.vaquill.ai/api/v1/us/session-laws/{session_law_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.vaquill.ai/api/v1/us/session-laws/{session_law_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.vaquill.ai/api/v1/us/session-laws/{session_law_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}Authorizations
API key issued from the developer dashboard. Pass as Authorization: Bearer vq_key_... (preferred).
Path Parameters
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 charged whether or not it resolves. 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.
1 - 300"SSL_MN_2025R_G_Y2025_C1"
Query Parameters
Optional two-letter state code that scopes how a CITATION sent in place of the id is read. It supplies the state a citation does not name (Laws 2025, ch. 1 with jurisdiction=mn is Minnesota's) and it vetoes a state the citation does name or whose form belongs to another: Minn. Laws 2025, ch. 1 with jurisdiction=tx is a 404 unresolved_citation (the resolution fee is kept), never answered from Minnesota. Ignored, with no effect, when you send an id. The same codes as the list's jurisdiction: the 50 states, dc and pr, case-insensitive; federal or an unknown code is a 422 and is never charged.
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 "mn"
Response
The law's record. textStatus says whether its text is served; resolvedFrom is present when a citation was sent in place of an id.
Response for GET /us/session-laws/{sessionLawId}.
Permanent identifier of the law, the key to use everywhere. Shape SSL_{state}_{session code}_{series}[_Y{numberingYear}]_{C<chapter>|B<billKey>}. It never changes: a correction to our reading of a law keeps the old id working. Pass it to GET /us/session-laws/{sessionLawId}.
"SSL_MN_2025R_G_Y2025_C1"
Lowercase two-letter code of the state, dc or pr. Federal acts are not served by this family: they are on /us/statutes/section.
"mn"
The act's citation as its publisher prints it, falling back to {session label}, ch. {number} when none is printed. It is NOT unique: many states print a bare CHAPTER 1 every session. Key on sessionLawId.
"CHAPTER 1--S.F.No. 1552"
"ACT No. 2"
"Chapter 1, Laws of 2025"
The legislative session the law was enacted in, and whether we hold all of it (coverageStatus).
Show child attributes
Show child attributes
The numbering series the law belongs to within its session. Most states have one, general. Others number acts, resolutions or local laws separately (public, act, acts, law, public_act, resolve, resolution_chapter, local, ...). An open list that grows as jurisdictions load. Filter with series on the list.
"general"
What kind of measure this is: act, joint_resolution, concurrent_resolution, resolution, resolve, memorial or other. An open list. A resolution that was numbered and published among the session laws is included, with isLaw saying whether it binds as law.
"act"
How the measure became, or failed to become, law. signed; became_law_without_signature; veto_overridden; line_item_veto (signed with some items vetoed); vetoed and pocket_veto (not law); not_presented (no governor action recorded, usual for resolutions); approved_by_voters; unknown (the publisher does not say).
"signed"
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.
held, withheld, not_held, pending "held"
How firmly the law's identity (session and number) is established. single_source: read from one publisher source, which is every state law at launch. confirmed: agreed by a second independent source, the level at which a lawId can be minted. inferred: derived by us rather than printed. disputed: sources disagree. The sessionLawId is the same at every level.
"single_source"
Server-side time for this request in milliseconds, excluding network transit. Not billed on.
747.5
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).
2
The law's identifier in the open us1 scheme. Null until its identity is confirmed by a second source and the us1 state shape is minted, so it is null on every state law today. Use sessionLawId, which is always present.
null
The law cited the way a lawyer writes it, from the state's own form: Minn. Laws 2025, ch. 1, 2025 Fla. Laws ch. 3, Ill. Pub. Act 104-0001, S.L. 2025-12 (North Carolina), Stats. 2025, ch. 12 (California), Ohio S.B. 1 (2025) for a state that numbers no chapters. A law in a special or extraordinary session carries it (Minn. Laws 2025, 1st Spec. Sess., ch. 1). Every value is read back through the grammar that GET /us/session-laws/{sessionLawId} accepts a citation in, and must name this law; one that would not is null, never guessed. Null where the state's form is not known, for a series with no standard form (resolutions, memorials), or for a law with neither a chapter nor a bill key. Where a regular and a special session each have a chapter 1, the bare form is the regular session's law and resolves with that law flagged as the default; the special session's carries its session. Distinct from citation, which is the publisher's printed form.
"Minn. Laws 2025, ch. 1"
A compact label for tables and badges: MN ch. 1 (2025), IL P.A. 104-0001, OH S.B. 1 (2025). Not a form to send back: use citableAs or the sessionLawId. Null exactly when citableAs is null.
"MN ch. 1 (2025)"
The chapter or act number exactly as printed, as a string. It is not always an integer: 1, 2025-12 (Florida), 104-0001 (Illinois), 1A. Null where the state does not number its acts (see billKey).
"1"
Normalised bill identifier (chamber and type letters plus the number) that stands in for a chapter number in states that do not number their acts (Missouri, Ohio, Nebraska). House Bill 2 is HB2. Null whenever number is set. Part of the sessionLawId as B<billKey>.
"HB2"
The bill the act originated as, as the publisher prints it. Matches as a citation on GET /us/session-laws/{sessionLawId}.
"S.F.No. 1552"
The year of the numbering sequence the chapter number belongs to, where the state numbers by year (Minnesota, Florida, Texas). It appears in the sessionLawId as _Y2025. A chapter number is only unique within a session and numbering year: Minnesota's regular and first special sessions of 2025 each have a Chapter 1. Null where one sequence runs across the session (Louisiana).
2025
The act's long title as printed, usually beginning An act relating to. It names the code sections the act amends in prose.
"An act relating to agriculture; modifying financial reporting requirements for grain buyers; amending Minnesota Statutes 2024, section 223.17, subdivision 6."
The act's short title when the publisher gives one (Ohio, New York, the District of Columbia and a few others do), otherwise null.
"Enact Advance Ohio Higher Education Act"
Date the governor (or the equivalent authority) approved the act, ISO 8601. Never an effective date: an act is usually in force on a different day, which is effectiveDates. Null when the publisher prints no approval date. Where the registry holds none but the publisher's own dated label on otherDates names the governor's signature, it is filled from that label and approvedDateDerived is true. The approvedFrom and approvedTo filters do NOT match a derived date: they read the registry's own approval date.
"2025-03-17"
True only when approvedDate was not held as an approval date and we filled it from a dated label printed on the act (today South Dakota's Signed by the Governor, listed under otherDates), on an act whose enactmentOutcome is signed or line_item_veto. False when approvedDate is null or is the registry's own. We never read a presented or passed date as an approval, nor a signing label on an act that became law without signature.
false
true
Earliest of the act's effective dates we hold. Null when we hold none: a date the publisher does not print, or prints as a relative rule (the day following final enactment), is not guessed. The full list is effectiveDates on GET /us/session-laws/{sessionLawId}.
"2025-09-01"
Latest of the act's effective dates we hold. Equal to effectiveFirst for an act with one date; null when we hold none.
"2026-01-01"
True for an act that is law. False for a numbered measure that is not: a vetoed bill, a pocket veto. Null when enactmentOutcome does not settle it (not_presented, unknown).
true
Present only when textStatus is withheld: a plain sentence saying what is wrong with the text we hold and what would release it. Free text, not an enum: show it, do not branch on it. The record itself (dates, sources, title) is still served and still correct.
"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."
Length of the law's full text in characters, the same as totalChars on the body. Null when there is no text. It is reported for a withheld law too (a fact about the text we hold), though that text is not served.
5470
How many body pages the text takes: charCount divided by the page size (30,000 characters), rounded up. Pages are cut back to a paragraph break, so a long act can run a few percent over. Null unless textStatus is held: there is nothing to read. Reading a whole law costs estimatedBodyPages times the price of one body page (6 credits per page on GET /us/session-laws/{sessionLawId}/body). Ohio's 2025 budget act (HB 96) is 9,571,132 characters, about 320 pages or 1,920 credits to read in full; most acts are a page or two.
1
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.
"55c7a8d08647e41f87e23fc2016881a6583911a1d5cfa8687403442e9096451b"
Revision counter of our record of this law: 1 for the first collection, higher after a re-collection changed the text or the metadata. Not a legislative version.
1
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.
"preserved"
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.
"publisher_literal"
What kind of document the text was taken from: session_law_print (the publisher's printed chapter), enrolled_bill, slip_law, volume_extract (carved out of a bound volume) or other. An open list. Null when there is no text.
"session_law_print"
What the law's licence class is and what it means for reuse, in a plain sentence: Government public: published by a government body with no restrictive terms, so the text may be reused, including commercially. Every law served with text is of a class that permits reuse; a note saying otherwise describes a record whose text is held back. Free text to show, not an enum to branch on: branch on textStatus.
"Government public: published by a government body with no restrictive terms, so the text may be reused, including commercially."
When this law's record last changed in our registry, ISO 8601 UTC with a +00:00 offset, the same form as the statutes routes. Use it with updatedSince on the list to sync only what changed.
"2026-10-05T09:06:39.998043+00:00"
The citation exactly as the publisher prints it. Null when none is printed.
"CHAPTER 1--S.F.No. 1552"
The publisher's own words on the governor's action. enactmentOutcome is our normalised reading of it.
"Signed by the governor March 17, 2025, 10:54 a.m."
Pages in the source document when it is a PDF. Null for HTML sources.
162
The official page or file the act's text was collected from, on a government publisher's host: the first sources entry whose role is text and whose hostClass is gov. Open it to verify the text against the publisher. Null when we hold no such source (a law we know exists and have not collected) or when the text source is not a government host. Present on a withheld law too: the official copy is always where to go when we hold the text back.
"https://www.revisor.mn.gov/laws/2025/0/Session+Law/Chapter/1/"
Every effective date the publisher prints for the act, in printed order. Always a list, never null; empty when none is held. Empty does NOT mean the act is not in force: a date printed as a rule (the day following final enactment) or not printed in the publisher's metadata is not guessed, and the approval date is never substituted for it. An act can take effect in parts, so a date may carry a scopeAsPrinted.
Show child attributes
Show child attributes
[ { "date": "2024-12-05", "dateAsPrinted": "December 5, 2024" } ]
[ { "date": "2025-04-02", "dateAsPrinted": "2025-04-02 00:00:00", "scopeAsPrinted": "CCP §871.20." } ]
[]
Every other date printed on the act, each with its kind: the approval date, filing dates and the publisher's own milestones (presentment to the governor).
Show child attributes
Show child attributes
[ { "date": "2025-03-17", "dateAsPrinted": "March 17, 2025, 10:54 a.m.", "kind": "approved" }, { "date": "2025-03-14", "dateAsPrinted": "March 14, 2025", "kind": "other", "kindAsPrinted": "Presentment Date" } ]
The code sections the publisher's own table lists the act as affecting, as printed. Always a list. Empty when the publisher prints no such table, which is common: the title still names sections in prose. We do not read sections out of the act text into this list.
Show child attributes
Show child attributes
[ { "actSectionAsPrinted": "6", "actionAsPrinted": "AMD", "codeAsPrinted": "RCW", "sectionAsPrinted": "19.27A.020" } ]
[]
The publisher documents the record was collected from, with the hash and fetch time of each: the audit trail from this response back to the official copy.
Show child attributes
Show child attributes
[ { "byteLength": 69907, "contentType": "text/html; charset=utf-8", "fetchedAt": "2026-09-29T00:41:01Z", "hostClass": "gov", "role": "text", "sha256": "6c83d9c109c1ec61fcd96cea92c8c48414df7ae7dfda7452ebcfbddc181b6b45", "sourceIndex": 0, "url": "https://www.revisor.mn.gov/laws/2025/0/Session+Law/Chapter/1/" } ]
What the publisher itself printed or published about the act, beyond the dates and citation above: its own structured fields verbatim (publisherFields: the bill's action history, committees, sponsors, and vote counts where the publisher gives them), its own identifiers, the legislature number and the printed pages. Omitted, not null, when it cannot be read or we only know the act exists.
Show child attributes
Show child attributes
How we came by the text (the extraction method, the bound volume it was cut from) and the collector's own caveats on the record. Omitted, not null, when it cannot be read or we only know the act exists.
Show child attributes
Show child attributes
Present only when your input did not match an id as sent: it says what was matched and how. Null when you sent an exact id.
Show child attributes
Show child attributes
Was this page helpful?

