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 whenever we gave a verdict on the citation (a served law, an unresolved or ambiguous citation), so creditsConsumed is then 4 when it is served. It is refunded when the session the citation points into is only partly collected, and on a failure on our side (500, 503). A 404 never keeps this route's own price. 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 names this law; where a special session restarts the numbering (Minnesota 2025 has two Chapter 1s) it is the conventional reading, so sending it is a 404 ambiguous_citation that lists both laws and marks this one defaultSessionLawId. Send that id to read it. 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/resolve answers a citation that names a state session law rather than a code section with a sessionLaw block (matched, or ambiguous with every candidate), pointing here. It never changes resolved or section.
- GET /us/statutes/coverage lists, per jurisdiction under sessionLaws, which sessions we hold session laws for and whether each is complete or partial. Read it first: a law missing from a partial session is not evidence that it does not exist.
- Federal session laws (the Statutes at Large, SAL_ ids) are not served here. Read them with GET /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.
Request
- Base URLhttps://api.vaquill.ai
- Auth
- HTTP bearer
- or API key in header X-API-Key
- TypeScriptA function with typed inputs. Its response is checked against the schema.
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 kept whether or not it resolves (an unresolved or ambiguous citation is a charged verdict) and refunded only on a partly collected session or 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.
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.
Headers
Optional. 16 to 255 visible ASCII characters (a UUIDv4 is ideal). A retry with the same key and the same request replays the original 2xx response for 24 hours without charging again. The same key with a different request is rejected. Scope is the API key, method, path and body. The stored response body is a query-derived cache controlled by the account's data retention setting cacheQueryDerivedData: when it is false the body is never stored and a retry answers 409 idempotency_replay_unavailable, without charging again.
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.
Example response
{
"processingTimeMs": 747.5,
"creditsConsumed": 2,
"sessionLawId": "SSL_MN_2025R_G_Y2025_C1",
"jurisdiction": "mn",
"citation": "CHAPTER 1--S.F.No. 1552",
"citableAs": "Minn. Laws 2025, ch. 1",
"citationShort": "MN ch. 1 (2025)",
"session": {
"code": "2025R",
"label": "2025 Regular Session",
"type": "regular",
"year": 2025,
"coverageStatus": "complete"
},
"series": "general",
"instrumentType": "act",
"number": "1",
"billKey": "HB2",
"billNumber": "S.F.No. 1552",
"numberingYear": 2025,
"title": "An act relating to agriculture; modifying financial reporting requirements for grain buyers; amending Minnesota Statutes 2024, section 223.17, subdivision 6.",
"shortTitle": "Enact Advance Ohio Higher Education Act",
"approvedDate": "2025-03-17",
"effectiveFirst": "2025-09-01",
"effectiveLast": "2026-01-01",
"enactmentOutcome": "signed",
"isLaw": true,
"textStatus": "held",
"withheldReason": "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.",
"charCount": 5470,
"estimatedBodyPages": 1,
"textSha256": "55c7a8d08647e41f87e23fc2016881a6583911a1d5cfa8687403442e9096451b",
"versionNo": 1,
"amendatoryMarkup": "preserved",
"markupConvention": "publisher_literal",
"documentKind": "session_law_print",
"identityConfidence": "single_source",
"officialUrl": "https://www.nysenate.gov/legislation/bills/2025/A414",
"officialUrlBasis": "bill_page",
"licenseNote": "Government public: published by a government body with no restrictive terms, so the text may be reused, including commercially.",
"updatedAt": "2026-10-05T09:06:39.998043+00:00",
"citationAsPrinted": "CHAPTER 1--S.F.No. 1552",
"vetoStatusAsPrinted": "Signed by the governor March 17, 2025, 10:54 a.m.",
"pageCount": 162,
"sourceUrl": "https://www.revisor.mn.gov/laws/2025/0/Session+Law/Chapter/1/",
"effectiveDates": [
{
"date": "2024-12-05",
"dateAsPrinted": "December 5, 2024"
}
],
"otherDates": [
{
"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"
}
],
"codeSectionsAffected": [
{
"actSectionAsPrinted": "6",
"actionAsPrinted": "AMD",
"codeAsPrinted": "RCW",
"sectionAsPrinted": "19.27A.020"
}
],
"sources": [
{
"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/"
}
],
"publisher": {
"legislatureNumber": 94,
"sessionLastYear": 2025,
"printedPageStart": "1",
"printedPageEnd": "1",
"documentKindAsPrinted": "Enrolled version",
"publisherIds": [
{
"name": "RAT#",
"value": "5"
}
],
"otherCitations": [
"Act No. 1"
],
"publisherFields": {
"Actions": [
{
"Action Chamber": "E",
"Action Comment": "",
"Action Date": "04/23/2025",
"Action Description": "Effective on 9/1/25",
"Action Time": "",
"Journal Page Number": ""
},
{
"Action Chamber": "E",
"Action Comment": "",
"Action Date": "04/23/2025",
"Action Description": "Signed by the Governor",
"Action Time": "",
"Journal Page Number": "1441"
},
{
"Action Chamber": "E",
"Action Comment": "",
"Action Date": "04/14/2025",
"Action Description": "Sent to the Governor",
"Action Time": "",
"Journal Page Number": "1265"
}
],
"Bill": "14",
"Caption Version": "Enrolled",
"Chapter": "1",
"Last Action": "04/23/2025 E Effective on 9/1/25"
},
"publisherFieldsOmitted": []
},
"provenance": {
"textMethod": "pdf_text_layer",
"pagesWithText": 3,
"volume": {
"url": "https://static.legmt.gov/Laws/MCA-Supplements/2025SessionLaws_VOL1_Updated.pdf",
"pageStart": 135,
"pageEnd": 135,
"boundaryHeading": "CHAPTER NO. 1"
},
"caveats": [
"Chapter number is from the publisher's Passed Legislation index ('Current Status'); the enrolled PDF prints a blank 'Chapter No. ____' field.",
"The 1-25 line-number column printed on every page is stripped."
]
},
"extrasUnavailable": true,
"resolvedFrom": {
"input": "S.F.No. 1552",
"sessionLawId": "SSL_MN_2025R_G_Y2025_C1",
"via": "citation",
"matchedForm": "bill"
}
}Changes
No recorded changes to this operation across all 1 revision of this API.