> ## Documentation Index
> Fetch the complete documentation index at: https://vaquill.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Search the text of state session laws

> Find state session laws by what they SAY. Send a question in plain words, words from a title, a quoted
phrase, a citation (`63-3004`), a code section or a bill number (`S.F.No. 1552`). You get the laws, best
first, each with the passage of its text that matched and a snippet around your words.

**Cost**: 4 credits per page, each page a new search. An empty result is an answer ("nothing
matches") and is charged. A request that fails validation (422) is never charged; a failure on our side
(500, 503) is refunded. To read a law you found, use `GET /us/session-laws/{sessionLawId}` (record) or
its `/body` (text), which are priced on their own.

**What is searched.** The ENACTED text: the law as it reads once the act takes effect. Language an act
strikes out is not searched and never appears in a snippet, so a repealed word cannot match as if it were
law. Only laws we serve with text are searched (see `GET /us/statutes/coverage`, `sessionLaws`, for what
each state holds). Laws whose text we withhold are not returned.

**How it ranks.** Keyword relevance (BM25), not meaning. Words are matched as written and stemmed
(`licensing` finds `licensed`), so a question has to share vocabulary with the act:
`teeth cleaning professional` does not find an act that says `dental hygienist`. A law matched by its
title AND its text, or by an exact part of your query, ranks above one matched a single way. Quote a
phrase to require it verbatim.

**What a result says about itself.** `matchType` is `exact` when a quoted phrase, citation, code
section or bill number you typed matched, otherwise `text`; `matchedBy` lists every way. Neither says
the law is the right one: a question with no true answer still returns its closest words, and there is no
"no good match" flag because keyword scores do not separate the two cases. Read the snippet.

**Paging.** `limit` is 1 to 25. `offset` plus `limit` reaches at most the 60 best matches; narrow with
`jurisdiction`, `session`, `series`, `instrumentType` or the approval dates rather than paging deeper.

```bash
curl -X POST "https://api.vaquill.ai/api/v1/us/session-laws/search" \
  -H "Authorization: Bearer vq_key_..." \
  -H "Content-Type: application/json" \
  -d '{"query": "can the sheriff pay with a debit card", "jurisdiction": "al", "limit": 5}'
```

```javascript
const res = await fetch("https://api.vaquill.ai/api/v1/us/session-laws/search", {
  method: "POST",
  headers: { Authorization: "Bearer vq_key_...", "Content-Type": "application/json" },
  body: JSON.stringify({ query: '"credit card or debit card"', jurisdiction: "al", limit: 5 }),
});
const { results } = await res.json();
```

**Related.** `GET /us/session-laws/list` filters one state's laws by session, series and date;
`POST /us/session-laws/batch` reads up to 50 laws by id; `GET /us/statutes/section/{actId}/enactments`
lists the acts a publisher's own tables tie to a code section.



## OpenAPI

````yaml https://api.vaquill.ai/external/openapi.json post /api/v1/us/session-laws/search
openapi: 3.1.0
info:
  title: Vaquill Developer API
  description: >-
    Public API for legal statutes and legislation.


    **Authentication**: Pass your API key as `Authorization: Bearer vq_key_...`
    (preferred) or in the `X-API-Key` header. The `api_key` query parameter also
    works where a header cannot be set, but a URL ends up in logs and browser
    history. Sending two different keys in one request is rejected with a 401.


    **Credits**: Each call costs API credits. See `GET
    /api/v1/api-credits/pricing` for the full pricing matrix.


    ## Jurisdictions


    | Jurisdiction | Coverage | `countryCode` |

    |---|---|---|

    | **United States** | USC and the Statutes at Large, the CFR and its annual
    editions, all 52 state and territory statutory codes (50 states plus DC and
    Puerto Rico), state administrative regulations, court rules, federal and
    state constitutions, federal agency guidance and adjudications, the Federal
    Register, the Sentencing Guidelines and US tax treaties. | `US` |


    See the full [Coverage page](https://www.vaquill.ai/docs/api-guide/coverage)
    for the jurisdiction-by-jurisdiction breakdown, or call
    `/us/statutes/coverage` for live counts. Coverage is per (jurisdiction,
    corpusType) pair, so treat that endpoint as the authoritative list rather
    than this summary.


    ## Endpoints


    - **US Statutes**: Search and retrieve any of the corpora above with full
    text, resolve a citation to its exact section, browse the statutory
    hierarchy, read a section as it stood on a past date, and follow its change
    history, cross-references and defined terms

    - **Board Watches**: Subscribe to a corpus source and get a webhook or email
    when it refreshes with real changes (free, API key required)

    - **Pricing**: Credit costs per endpoint (no auth required)


    ## Rate limits


    Limits are enforced per API key and scale with your plan. A `429` response
    includes a `Retry-After` header.


    | Plan | Per minute | Per hour | Per day |

    |---|---|---|---|

    | Vaquill API Pro | 60 | 1,000 | 2,000 |

    | Vaquill API Business | 150 | 2,500 | 10,000 |


    For full documentation, visit the [API
    Reference](https://www.vaquill.ai/docs/api-reference/).
  version: 1.0.0
  contact:
    name: Vaquill API Support
    url: https://www.vaquill.ai
    email: support@vaquill.ai
  license:
    name: Proprietary
    url: https://www.vaquill.ai/terms
  termsOfService: https://www.vaquill.ai/terms
servers:
  - url: https://api.vaquill.ai
    description: Production
security:
  - ApiKeyAuth: []
  - ApiKeyHeader: []
  - ApiKeyQuery: []
tags:
  - name: US Statutes
    description: >-
      Search and retrieve US primary law. Covers the United States Code and the
      Statutes at Large, the Code of Federal Regulations and its annual
      editions, state statutory codes and administrative regulations, federal
      and state constitutions, court rules, Federal Register rules and
      Presidential documents, federal and state agency guidance, agency
      adjudications, state Attorney General opinions, the Sentencing Guidelines
      and US tax treaties. Scope a search with the `corpusType` filter, and call
      `/us/statutes/coverage` for the live jurisdiction-by-corpusType list.


      - **Search**: Search across all USC, CFR, state, and regulatory sections

      - **Section**: Get metadata, citation, hierarchy, and source links for a
      specific section

      - **Body**: Get the full text of a section

      - **Enactments**: Which state session laws a publisher's own tables list
      against a section (supported jurisdictions only, never a complete history)
  - name: US Session Laws
    description: >-
      State session laws: the acts of each legislature as they were enacted,
      chapter by chapter, before they are folded into a code. A session law is
      what the governor signs. It carries the act's own text, including the
      language it strikes and inserts, its approval and effective dates, and,
      where the publisher prints one, the code sections it changes. That makes
      it the source for "which act changed this section, and when did it take
      effect".


      Every act has a permanent `sessionLawId` (for example
      `SSL_MN_2025R_G_Y2025_C1`, Minnesota Laws 2025, regular session, chapter
      1) whether or not we hold its text, and a citation or bill number such as
      `S.F.No. 1552` is accepted where an id goes. v1 serves STATE acts only.
      Federal session laws (the Statutes at Large, `SAL_` ids) are served by
      `/us/statutes/section`, and `/us/statutes/resolve` points a session-law
      citation here.


      **Start here**: check `/us/statutes/coverage` (free) for what we hold per
      state: each jurisdiction's `sessionLaws` block lists its sessions, which
      are complete or only partly collected, and the `series` and
      `instrumentTypes` that exist. Then **List** a session or a date range to
      get ids, **Get** one act for its record, then **Body** for its text. A law
      missing from a partly collected session is a free 404
      (`session_not_fully_collected`), not proof it does not exist.


      - **List**: everything enacted in a state's session, approved in a window,
      or taking effect on a date

      - **Get**: one act by id or by citation; dates (`effectiveDates` is always
      a list), sources and the code sections it affects

      - **Body**: the act's text as printed, paged by cursor, with amendatory
      markup preserved where the publisher printed it

      - **Batch**: up to 50 ids or citations in one call, the same record as
      Get, billed per law served, with every miss listed and its reason

      - **Changes**: a sync feed of the registry over an integer cursor
      (`sinceId`): what began to be served, was corrected, withdrawn or merged


      The reverse link, from a code section to the acts a publisher's own tables
      list against it, is `GET /us/statutes/section/{actId}/enactments`.
  - name: Board Watches
    description: >-
      Law-change alerts. Subscribe to a **board** (a tracked corpus source,
      identified by `corpusType` plus an optional `state`) and get a webhook or
      email whenever it refreshes with real changes, naming the exact sections
      that changed. Fetch old-vs-new text for any amended section via the change
      diff.


      Boards refresh on their own existing cadence; watching one does not change
      how often it refreshes. Every endpoint here is **free**: authenticated by
      API key and rate-limited, but not credit-metered.


      See the [Law Change Alerts
      guide](https://www.vaquill.ai/docs/api-guide/alerts) for the full
      walkthrough.
  - name: Pricing
    description: >-
      Credit pricing and conversion rates. No authentication required. 1 credit
      = $0.01 USD.
  - name: Credits
    description: >-
      Your own credit balance: what is spendable right now, where it came from,
      and what is about to expire.


      Free and never charged, so it is safe to poll for low-balance alerting or
      to pre-flight a batch job.
externalDocs:
  description: Full API Reference
  url: https://www.vaquill.ai/docs/api-reference/
paths:
  /api/v1/us/session-laws/search:
    post:
      tags:
        - US Session Laws
      summary: Search the text of state session laws
      description: >-
        Find state session laws by what they SAY. Send a question in plain
        words, words from a title, a quoted

        phrase, a citation (`63-3004`), a code section or a bill number
        (`S.F.No. 1552`). You get the laws, best

        first, each with the passage of its text that matched and a snippet
        around your words.


        **Cost**: 4 credits per page, each page a new search. An empty result is
        an answer ("nothing

        matches") and is charged. A request that fails validation (422) is never
        charged; a failure on our side

        (500, 503) is refunded. To read a law you found, use `GET
        /us/session-laws/{sessionLawId}` (record) or

        its `/body` (text), which are priced on their own.


        **What is searched.** The ENACTED text: the law as it reads once the act
        takes effect. Language an act

        strikes out is not searched and never appears in a snippet, so a
        repealed word cannot match as if it were

        law. Only laws we serve with text are searched (see `GET
        /us/statutes/coverage`, `sessionLaws`, for what

        each state holds). Laws whose text we withhold are not returned.


        **How it ranks.** Keyword relevance (BM25), not meaning. Words are
        matched as written and stemmed

        (`licensing` finds `licensed`), so a question has to share vocabulary
        with the act:

        `teeth cleaning professional` does not find an act that says `dental
        hygienist`. A law matched by its

        title AND its text, or by an exact part of your query, ranks above one
        matched a single way. Quote a

        phrase to require it verbatim.


        **What a result says about itself.** `matchType` is `exact` when a
        quoted phrase, citation, code

        section or bill number you typed matched, otherwise `text`; `matchedBy`
        lists every way. Neither says

        the law is the right one: a question with no true answer still returns
        its closest words, and there is no

        "no good match" flag because keyword scores do not separate the two
        cases. Read the snippet.


        **Paging.** `limit` is 1 to 25. `offset` plus `limit` reaches at most
        the 60 best matches; narrow with

        `jurisdiction`, `session`, `series`, `instrumentType` or the approval
        dates rather than paging deeper.


        ```bash

        curl -X POST "https://api.vaquill.ai/api/v1/us/session-laws/search" \
          -H "Authorization: Bearer vq_key_..." \
          -H "Content-Type: application/json" \
          -d '{"query": "can the sheriff pay with a debit card", "jurisdiction": "al", "limit": 5}'
        ```


        ```javascript

        const res = await
        fetch("https://api.vaquill.ai/api/v1/us/session-laws/search", {
          method: "POST",
          headers: { Authorization: "Bearer vq_key_...", "Content-Type": "application/json" },
          body: JSON.stringify({ query: '"credit card or debit card"', jurisdiction: "al", limit: 5 }),
        });

        const { results } = await res.json();

        ```


        **Related.** `GET /us/session-laws/list` filters one state's laws by
        session, series and date;

        `POST /us/session-laws/batch` reads up to 50 laws by id; `GET
        /us/statutes/section/{actId}/enactments`

        lists the acts a publisher's own tables tie to a code section.
      operationId: search_session_laws_api_v1_us_session_laws_search_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SessionLawSearchRequest'
        required: true
      responses:
        '200':
          description: >-
            The laws that matched, best first. An empty `results` is a charged
            answer.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SessionLawSearchResponse'
              examples:
                words:
                  summary: A plain question, scoped to one state
                  value:
                    query: can the sheriff pay with a debit card
                    parsed:
                      text: can the sheriff pay with a debit card
                      phrases: []
                      citationTokens: []
                      billNumbers: []
                    results:
                      - sessionLawId: SSL_AL_2025R_G_Y2025_C2025-127
                        jurisdiction: al
                        session: 2025R
                        series: general
                        instrumentType: act
                        citation: Act 2025-127
                        title: >-
                          Relating to Houston County; to authorize the sheriff
                          to establish procedures for using a credit card or
                          debit card to make purchases.
                        approvedDate: '2025-04-15'
                        enactmentOutcome: signed
                        matchType: text
                        matchedBy:
                          - title
                          - text
                        passage:
                          seq: 0
                          ownStart: 0
                          ownEnd: 1820
                          heading: Section 1.
                          snippet: >-
                            Section 1. The sheriff of Houston County may
                            establish procedures for using a credit card…
                          highlights:
                            - - 15
                              - 22
                            - - 85
                              - 89
                          bodyHref: >-
                            https://api.vaquill.ai/api/v1/us/session-laws/SSL_AL_2025R_G_Y2025_C2025-127/body?startChar=0
                        href: >-
                          https://api.vaquill.ai/api/v1/us/session-laws/SSL_AL_2025R_G_Y2025_C2025-127
                    count: 1
                    offset: 0
                    limit: 5
                    hasMore: false
                    creditsConsumed: 4
                    processingTimeMs: 38.6
                noMatch:
                  summary: 'Nothing matches: an empty list, charged'
                  value:
                    query: xylophone excise levy
                    parsed:
                      text: xylophone excise levy
                      phrases: []
                      citationTokens: []
                      billNumbers: []
                    results: []
                    count: 0
                    offset: 0
                    limit: 10
                    hasMore: false
                    creditsConsumed: 4
                    processingTimeMs: 21.4
        '401':
          description: Missing, invalid or revoked API key. Not charged.
          content:
            application/json:
              example:
                detail: Invalid or expired API key
              schema:
                $ref: '#/components/schemas/ApiDetailError'
        '402':
          description: >-
            Insufficient credits for this call. Nothing was done and nothing was
            charged. Read your balance, free, at `GET /credits/balance`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
              example:
                detail: Insufficient credits
        '403':
          description: The API key lacks the `research:read` scope. Not charged.
          content:
            application/json:
              example:
                detail: Insufficient permissions for this operation
              schema:
                $ref: '#/components/schemas/ApiDetailError'
        '422':
          description: >-
            A parameter failed validation: `query` shorter than 2 characters or
            with control characters, `jurisdiction` not a state, an unknown
            `series` or `instrumentType`, a date that is not a real calendar
            date, `approvedTo` before `approvedFrom`, or `offset` past the 60
            best matches. Never charged. `errors[].loc` names the parameter
            exactly as you send it.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
              examples:
                queryTooShort:
                  summary: '`query` of one character'
                  value:
                    detail: Invalid request parameters
                    errors:
                      - loc:
                          - body
                          - query
                        msg: String should have at least 2 characters
                        type: string_too_short
                offsetTooDeep:
                  summary: '`offset` past the 60 best matches'
                  value:
                    detail: Invalid request parameters
                    errors:
                      - loc:
                          - body
                          - offset
                        msg: Input should be less than or equal to 59
                        type: less_than_equal
        '429':
          description: >-
            Rate limit exceeded for your key. Not charged. Wait `Retry-After`
            seconds.
          headers:
            Retry-After:
              description: Seconds to wait before retrying.
              schema:
                type: integer
                examples:
                  - 12
            X-RateLimit-Limit:
              description: Requests per minute your key is allowed.
              schema:
                type: integer
                examples:
                  - 60
            X-RateLimit-Remaining:
              description: Requests left in the current minute. 0 on a 429.
              schema:
                type: integer
                examples:
                  - 0
            X-RateLimit-Reset:
              description: Unix time at which the minute window resets.
              schema:
                type: integer
                examples:
                  - 1791194460
          content:
            application/json:
              example:
                detail: Rate limit exceeded. Try again in 12 seconds.
              schema:
                $ref: '#/components/schemas/ApiDetailError'
        '500':
          description: An unexpected failure on our side. The charge is refunded.
          content:
            application/json:
              example:
                detail: Internal server error
              schema:
                $ref: '#/components/schemas/ApiDetailError'
        '503':
          description: >-
            The session-laws database is temporarily unavailable. The charge is
            refunded; retry.
          content:
            application/json:
              example:
                detail: >-
                  The US session-laws database is temporarily unavailable.
                  Please retry.
              schema:
                $ref: '#/components/schemas/ApiDetailError'
components:
  schemas:
    SessionLawSearchRequest:
      properties:
        query:
          type: string
          maxLength: 300
          minLength: 2
          title: Query
          description: >-
            What to look for: a question in plain words (`can a sheriff pay with
            a debit card`), words from a title, a quoted phrase (`"credit card
            or debit card"`), a citation (`63-3004`), a code section or a bill
            number (`S.F.No. 1552`). Quoted parts must appear verbatim;
            everything else is matched on its words, stemmed, so `licensing`
            finds `licensed`. Words are matched as the legislature wrote them:
            `teeth cleaning professional` does not find an act that says `dental
            hygienist`. 2 to 300 characters.
          examples:
            - can the sheriff pay with a debit card
        jurisdiction:
          anyOf:
            - type: string
              enum:
                - 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
            - type: 'null'
          title: Jurisdiction
          description: >-
            Limit to one state, `dc` or `pr`. Two-letter code, case-insensitive.
            Omit to search every jurisdiction we hold. `federal` and an unknown
            code are a 422, never charged.
          examples:
            - al
        session:
          anyOf:
            - type: string
              maxLength: 32
              minLength: 1
              pattern: ^[A-Za-z0-9._-]+$
            - type: 'null'
          title: Session
          description: >-
            Limit to one session, by the code `session.code` reports (`2025R`,
            `2025S1`). Case-sensitive. Matches the act's own session, so it
            narrows the TITLE, citation and bill signals; the passage text of an
            act carries its session year and type but not the code.
          examples:
            - 2025R
        series:
          anyOf:
            - items:
                type: string
                enum:
                  - 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
              type: array
            - type: 'null'
          title: Series
          description: >-
            Limit to these numbering series, one or more (they combine with OR).
            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`. Any other
            value is a 422, never charged.
          examples:
            - - general
        instrumentType:
          anyOf:
            - items:
                type: string
                enum:
                  - act
                  - joint_resolution
                  - concurrent_resolution
                  - resolution
                  - resolve
                  - memorial
                  - other
              type: array
            - type: 'null'
          title: Instrumenttype
          description: >-
            Limit to these kinds of measure, one or more (OR). One of `act`,
            `joint_resolution`, `concurrent_resolution`, `resolution`,
            `resolve`, `memorial`, `other`. Any other value is a 422, never
            charged.
          examples:
            - - act
              - joint_resolution
        approvedFrom:
          anyOf:
            - type: string
              pattern: ^\d{4}-\d{2}-\d{2}$
            - type: 'null'
          format: date
          title: Approvedfrom
          description: >-
            Only laws approved on or after this date, `YYYY-MM-DD`, inclusive; a
            real calendar date (`2025-02-30` is a 422). A law with no printed
            approval date never matches.
          examples:
            - '2025-03-01'
        approvedTo:
          anyOf:
            - type: string
              pattern: ^\d{4}-\d{2}-\d{2}$
            - type: 'null'
          format: date
          title: Approvedto
          description: >-
            Only laws approved on or before this date, `YYYY-MM-DD`, inclusive.
            An end before `approvedFrom` is a 422, never charged.
          examples:
            - '2025-06-30'
        limit:
          type: integer
          maximum: 25
          minimum: 1
          title: Limit
          description: >-
            Laws per page, 1 to 25. A page costs the same however many laws it
            holds, so a larger `limit` is cheaper per law.
          default: 10
          examples:
            - 5
        offset:
          type: integer
          maximum: 59
          minimum: 0
          title: Offset
          description: >-
            Laws to skip, for the next page: `offset` plus `limit` can reach at
            most the 60 best matches. Each page is a new search and is charged.
            Deeper than 60 is a 422, never charged: narrow the search with a
            filter instead.
          default: 0
          examples:
            - 5
      additionalProperties: false
      type: object
      required:
        - query
      title: SessionLawSearchRequest
      description: Body of `POST /us/session-laws/search`.
    SessionLawSearchResponse:
      properties:
        query:
          type: string
          title: Query
          description: The query as read, whitespace collapsed.
          examples:
            - can the sheriff pay with a debit card
        parsed:
          $ref: '#/components/schemas/SessionLawSearchParsed'
          description: >-
            How the query was split into words, phrases, citations and bill
            numbers.
        results:
          items:
            $ref: '#/components/schemas/SessionLawSearchResult'
          type: array
          title: Results
          description: >-
            The laws, best first. Empty when nothing matched, which is an answer
            and is charged.
        count:
          type: integer
          title: Count
          description: Laws on this page.
          default: 0
          examples:
            - 5
        offset:
          type: integer
          title: Offset
          description: The `offset` this page was read from.
          default: 0
          examples:
            - 0
        limit:
          type: integer
          title: Limit
          description: The `limit` this page was read with.
          default: 10
          examples:
            - 5
        hasMore:
          type: boolean
          title: Hasmore
          description: >-
            True when more laws follow: call again with `offset` raised by
            `limit` (within the 60 best).
          default: false
          examples:
            - true
        creditsConsumed:
          type: integer
          title: Creditsconsumed
          description: >-
            Credits actually charged for this call, never the list price. 0 when
            the call was refunded.
          default: 0
          examples:
            - 4
        processingTimeMs:
          type: number
          title: Processingtimems
          description: >-
            Server-side time for this request in milliseconds, excluding network
            transit. Not billed on.
          default: 0
          examples:
            - 38.6
      type: object
      required:
        - query
        - parsed
      title: SessionLawSearchResponse
      description: Response for `POST /us/session-laws/search`.
    ApiDetailError:
      properties:
        detail:
          type: string
          title: Detail
          description: >-
            Human-readable reason, safe to surface to an end user. Branch on the
            HTTP status rather than on this string: the wording is not part of
            the contract and may be reworded, but 401 (bad key), 402 (out of
            credits), 403 (missing scope), 404 (no such resource) and 429 (rate
            limited) are stable.
          examples:
            - Insufficient API credits.
        errors:
          anyOf:
            - items:
                $ref: '#/components/schemas/ApiFieldError'
              type: array
            - type: 'null'
          title: Errors
          description: 'Present on 422 only: every field that failed validation.'
      type: object
      required:
        - detail
      title: ApiDetailError
      description: >-
        Error envelope the API actually returns.


        Every error (400/401/402/403/404/405/422/429/5xx) carries a `detail`

        string, e.g. `{"detail": "Insufficient API credits."}`, on every mount
        of

        the API. A 422 adds `errors`, one entry per rejected field. Some 404s
        add

        endpoint-specific diagnosis beside `detail` (the statutes section routes

        add `actId`, `reason` and `didYouMean`); treat unknown keys as optional.
    SessionLawSearchParsed:
      properties:
        text:
          type: string
          title: Text
          description: The free words, quoted parts removed.
          examples:
            - sheriff debit card
        phrases:
          items:
            type: string
          type: array
          title: Phrases
          description: Quoted phrases, matched verbatim.
          examples:
            - - debit card
        citationTokens:
          items:
            type: string
          type: array
          title: Citationtokens
          description: >-
            Citation-shaped tokens found in the query (`63-3004`), matched
            exactly.
          examples:
            - - 63-3004
        billNumbers:
          items:
            type: string
          type: array
          title: Billnumbers
          description: Bill numbers found in the query (`S.F.No. 1552`), matched exactly.
          examples:
            - - HB 145
      type: object
      required:
        - text
      title: SessionLawSearchParsed
      description: How the query was read, so a caller can see why a result matched.
    SessionLawSearchResult:
      properties:
        sessionLawId:
          type: string
          title: Sessionlawid
          description: >-
            The law's permanent id. Read the whole law at `GET
            /us/session-laws/{sessionLawId}`.
          examples:
            - SSL_AL_2025R_G_Y2025_C2025-127
        jurisdiction:
          type: string
          title: Jurisdiction
          description: Lowercase two-letter code of the state, `dc` or `pr`.
          examples:
            - al
        session:
          type: string
          title: Session
          description: The session's code, as `session.code` reports it.
          examples:
            - 2025R
        series:
          type: string
          title: Series
          description: The numbering series the law sits in.
          examples:
            - general
        instrumentType:
          type: string
          title: Instrumenttype
          description: 'The kind of measure: `act`, `joint_resolution` and so on.'
          examples:
            - act
        citation:
          type: string
          title: Citation
          description: The law's canonical citation, as the registry holds it.
          examples:
            - Act 2025-127
        title:
          anyOf:
            - type: string
            - type: 'null'
          title: Title
          description: >-
            The act's title as the publisher prints it; null where the publisher
            printed none.
          examples:
            - >-
              Relating to Houston County; to authorize the sheriff to establish
              procedures for using a credit card.
        approvedDate:
          anyOf:
            - type: string
            - type: 'null'
          title: Approveddate
          description: >-
            The date the governor approved it, `YYYY-MM-DD`, where the publisher
            printed one; else null.
          examples:
            - '2025-04-15'
        enactmentOutcome:
          type: string
          title: Enactmentoutcome
          description: >-
            How it became law: `signed`, `became_law_without_signature`,
            `veto_overridden` and so on.
          examples:
            - signed
        matchType:
          type: string
          enum:
            - exact
            - text
          title: Matchtype
          description: >-
            `exact` when a quoted phrase, a citation, a code section or a bill
            number you typed matched this law; `text` when it matched on words
            alone. It says HOW it matched and makes no claim that this is the
            right law: a question with no true answer still returns its closest
            words.
          examples:
            - text
        matchedBy:
          items:
            type: string
            enum:
              - title
              - text
              - phrase
              - citation
              - codeSection
              - billNumber
          type: array
          title: Matchedby
          description: >-
            Every way this law matched, strongest context first. `title`: the
            words are in the act's title. `text`: they are in its enacted text.
            `phrase`: your quoted phrase appears verbatim. `citation`: a
            citation you typed (`63-3004`) appears in the text. `codeSection`:
            the act's own table lists that code section. `billNumber`: the act's
            bill number is the one you typed. A law matched by several ranks
            above one matched by a single way.
          examples:
            - - title
              - text
        passage:
          anyOf:
            - $ref: '#/components/schemas/SessionLawSearchPassage'
            - type: 'null'
          description: >-
            The passage of the law's text that matched best, with a snippet.
            Null when this law matched only by title, citation, code section or
            bill number and no passage did.
        href:
          type: string
          title: Href
          description: 'The law''s record: `GET /us/session-laws/{sessionLawId}`.'
          examples:
            - >-
              https://api.vaquill.ai/api/v1/us/session-laws/SSL_AL_2025R_G_Y2025_C2025-127
      type: object
      required:
        - sessionLawId
        - jurisdiction
        - session
        - series
        - instrumentType
        - citation
        - enactmentOutcome
        - matchType
        - matchedBy
        - href
      title: SessionLawSearchResult
      description: One law in the ranking.
    ApiFieldError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Loc
          description: >-
            Where the bad value is: `body`, `query` or `path`, then the
            parameter name exactly as you send it (camelCase), then list
            indexes. A bare `["body"]` means the body as a whole was not a JSON
            object.
          examples:
            - - body
              - corpusType
        msg:
          type: string
          title: Msg
          description: What is wrong with the value, in plain English.
          examples:
            - Input should be 'USC', 'CFR' or 'STATE'
        type:
          type: string
          title: Type
          description: >-
            Machine-readable error kind, e.g. `missing`, `literal_error`,
            `json_invalid`.
          examples:
            - literal_error
      type: object
      required:
        - loc
        - msg
        - type
      title: ApiFieldError
      description: One rejected field in a 422 response.
    SessionLawSearchPassage:
      properties:
        seq:
          type: integer
          title: Seq
          description: Position of this passage within the law, from 0.
          examples:
            - 2
        ownStart:
          type: integer
          title: Ownstart
          description: >-
            Character offset in the law's stored text where this passage begins.
            Pass it as `startChar` to `GET /us/session-laws/{sessionLawId}/body`
            to read the law from here.
          examples:
            - 8120
        ownEnd:
          type: integer
          title: Ownend
          description: >-
            Character offset where this passage ends, in the same scale as
            `ownStart`.
          examples:
            - 11940
        pageStart:
          anyOf:
            - type: integer
            - type: 'null'
          title: Pagestart
          description: >-
            The printed page the passage starts on, 1-based, where the
            publisher's pages are known; else null.
          examples:
            - 3
        heading:
          anyOf:
            - type: string
            - type: 'null'
          title: Heading
          description: >-
            The section heading the passage sits under (`Section 3.`), where one
            was found; else null.
          examples:
            - Section 3.
        snippet:
          type: string
          title: Snippet
          description: >-
            About 280 characters of the ENACTED text around your words, plain
            text, with `…` where it was cut. Language the act strikes out is
            never shown here.
          examples:
            - >-
              …the sheriff may establish procedures for using a credit card or
              debit card to make purchases…
        highlights:
          items:
            items:
              type: integer
            type: array
          type: array
          title: Highlights
          description: >-
            `[start, end]` character offsets INSIDE `snippet` (end exclusive) of
            each word that matched, so you can draw the highlight yourself. The
            snippet carries no markup.
          examples:
            - - - 13
                - 18
              - - 58
                - 64
        bodyHref:
          type: string
          title: Bodyhref
          description: >-
            Where to read the text from this passage: the law's `/body` with
            `startChar` set.
          examples:
            - >-
              https://api.vaquill.ai/api/v1/us/session-laws/SSL_AL_2025R_G_Y2025_C2025-127/body?startChar=8120
      type: object
      required:
        - seq
        - ownStart
        - ownEnd
        - snippet
        - bodyHref
      title: SessionLawSearchPassage
      description: The passage of the law that matched best, with a cut of its text.
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: vq_key_*
      description: >-
        API key issued from the developer dashboard. Pass as `Authorization:
        Bearer vq_key_...` (preferred).
    ApiKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key
      description: >-
        The same API key as a bare header value: `X-API-Key: vq_key_...`.
        Equivalent to the Bearer form.
    ApiKeyQuery:
      type: apiKey
      in: query
      name: api_key
      description: >-
        The same API key as a query parameter: `?api_key=vq_key_...`. Use only
        where you cannot set a header. A URL can end up in proxy and server
        logs, browser history and shared links, so prefer either header form,
        and rotate a key that has leaked.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.