> ## 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.

# Coverage matrix by jurisdiction and corpusType

> Self-describing coverage matrix. Returns a legend of every `corpusType` token (what it contains and whether it is federal or state-scoped) plus, for each jurisdiction, the per-corpusType ingested DOCUMENT counts in `corpora` (one per section or document, not per retrieval passage; `totalPassages` in the same response IS the passage count). Use it to learn exactly what is queryable where before calling /us/statutes/search: read a jurisdiction's `corpora` keys, then pass one as `corpusType` (paired with `state` for state-scoped corpora). Each legend entry's `browsable` says whether `GET /us/statutes/divisions` can also walk that corpus as a tree.

It reports what we hold, not how recently it was refreshed. For the age of any source, call `GET /boards`: it is free, needs no credits, and carries `lastRetrievedAt`, `cadence` and `retrievalStatus` (`current`, `stale`, `failing`, `unconfirmed`, `never_retrieved`) for every tracked source. Read it alongside the counts here so a section count carries an age. It records when we last CHECKED, not when the law last changed, and it is not a claim that the law is current as of that date. Where a publisher states its own currency, that rides on each section as `currentThrough`.

**Free.** Requires an API key and is rate-limited, but costs no credits.

State session laws (acts as enacted) are at /us/session-laws. Where we hold any for a jurisdiction, its `sessionLaws` block says which sessions are `complete` or `partial`, how many laws we serve, the expected total and open gaps, and the `series`, `instrumentTypes` and approval-date span that exist (the values `GET /us/session-laws/list` accepts). A jurisdiction we hold none for has no block, for example IN and TN at launch. This is the one place session-law coverage is served: check it before you list, then read the laws at `/us/session-laws`.



## OpenAPI

````yaml https://api.vaquill.ai/external/openapi.json get /api/v1/us/statutes/coverage
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/statutes/coverage:
    get:
      tags:
        - US Statutes
      summary: Coverage matrix by jurisdiction and corpusType
      description: >-
        Self-describing coverage matrix. Returns a legend of every `corpusType`
        token (what it contains and whether it is federal or state-scoped) plus,
        for each jurisdiction, the per-corpusType ingested DOCUMENT counts in
        `corpora` (one per section or document, not per retrieval passage;
        `totalPassages` in the same response IS the passage count). Use it to
        learn exactly what is queryable where before calling
        /us/statutes/search: read a jurisdiction's `corpora` keys, then pass one
        as `corpusType` (paired with `state` for state-scoped corpora). Each
        legend entry's `browsable` says whether `GET /us/statutes/divisions` can
        also walk that corpus as a tree.


        It reports what we hold, not how recently it was refreshed. For the age
        of any source, call `GET /boards`: it is free, needs no credits, and
        carries `lastRetrievedAt`, `cadence` and `retrievalStatus` (`current`,
        `stale`, `failing`, `unconfirmed`, `never_retrieved`) for every tracked
        source. Read it alongside the counts here so a section count carries an
        age. It records when we last CHECKED, not when the law last changed, and
        it is not a claim that the law is current as of that date. Where a
        publisher states its own currency, that rides on each section as
        `currentThrough`.


        **Free.** Requires an API key and is rate-limited, but costs no credits.


        State session laws (acts as enacted) are at /us/session-laws. Where we
        hold any for a jurisdiction, its `sessionLaws` block says which sessions
        are `complete` or `partial`, how many laws we serve, the expected total
        and open gaps, and the `series`, `instrumentTypes` and approval-date
        span that exist (the values `GET /us/session-laws/list` accepts). A
        jurisdiction we hold none for has no block, for example IN and TN at
        launch. This is the one place session-law coverage is served: check it
        before you list, then read the laws at `/us/session-laws`.
      operationId: list_statutes_coverage_api_v1_us_statutes_coverage_get
      responses:
        '200':
          description: Coverage legend plus per-jurisdiction corpusType counts.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UsStatutesCoverageEnvelope'
              example:
                data:
                  corpusTypes:
                    - token: USC
                      description: United States Code (federal statutes)
                      scope: federal
                      browsable: true
                    - token: REGULATION
                      description: State administrative regulations
                      scope: state
                      browsable: true
                    - token: AGENCY_GUIDANCE
                      description: Sub-regulatory agency guidance across named sources
                      scope: federal
                      browsable: false
                      sourceScopeNotes:
                        cms_iom: >-
                          Held: the 204 chapter, appendix and exhibit documents
                          CMS publishes across its Medicare Internet-Only
                          Manuals ... Not held, and these are the publisher's
                          own gaps rather than ours: Pub. 100-12 (State Medicaid
                          Manual), Pub. 100-13 (Medicaid CHIP) and Pub. 100-23
                          (Payment Error Rate Measurement) publish no chapters
                          at all ...
                  jurisdictions:
                    - code: federal
                      name: Federal (USC + CFR)
                      kind: federal
                      sectionCount: 812553
                      hasData: true
                      corpora:
                        CFR: 491612
                        USC: 212042
                        FEDERAL_REGISTER: 102861
                        EXECUTIVE_ACTION: 3599
                        AGENCY_GUIDANCE: 2510
                        FEDERAL_RULES: 526
                        CONSTITUTION: 74
                    - code: wa
                      name: Washington
                      kind: state
                      sectionCount: 140326
                      hasData: true
                      corpora:
                        STATE: 89005
                        REGULATION: 51142
                        STATE_CONSTITUTION: 179
                  totalSections: 2937552
                  stateCountWithData: 49
                meta:
                  processingTimeMs: 5401.2
                  creditsConsumed: 0
        '401':
          description: Invalid or missing API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
              example:
                detail: Invalid or missing API key.
        '403':
          description: API key lacks `research:read` scope.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
        '429':
          description: Rate limit exceeded.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
components:
  schemas:
    UsStatutesCoverageEnvelope:
      properties:
        data:
          $ref: '#/components/schemas/UsStatutesCoverageResponse'
        meta:
          $ref: '#/components/schemas/UsFreeCallMeta'
      type: object
      required:
        - data
        - meta
      title: UsStatutesCoverageEnvelope
      description: >-
        What `GET /us/statutes/coverage` returns: the matrix under `data`.


        Declared because the route used to return a hand-built dict with no

        `response_model`, so its published schema was `{}`. Every field was

        discoverable only if the example happened to show it, and the MCP tool
        and

        generated clients built from the document got no types at all for the
        one

        endpoint that exists to be read before anything else.
    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.
    UsStatutesCoverageResponse:
      properties:
        corpusTypes:
          items:
            $ref: '#/components/schemas/UsCorpusTypeInfo'
          type: array
          title: Corpustypes
          description: Legend of every corpusType token, its meaning, and its scope.
        jurisdictions:
          items:
            $ref: '#/components/schemas/UsJurisdictionCoverage'
          type: array
          title: Jurisdictions
          description: >-
            One row per jurisdiction (federal first, then states and
            territories), each carrying its per-corpusType counts in `corpora`.
        totalSections:
          type: integer
          title: Totalsections
          description: >-
            Count of distinct sections (one per provision or document) across
            the corpus. This is the deduplicated legal-document total, not the
            raw index size; see `totalPassages`.
        totalPassages:
          type: integer
          title: Totalpassages
          description: >-
            Total indexed retrieval passages across the corpus. Longer sections
            and documents are split into several passages for retrieval, so this
            runs well above `totalSections`. The Federal Register (long agency
            rules) accounts for over half.
          default: 0
        stateCountWithData:
          type: integer
          title: Statecountwithdata
        measuredAt:
          anyOf:
            - type: string
            - type: 'null'
          title: Measuredat
          description: >-
            When these counts were last measured against the index, as the
            OLDEST per-jurisdiction measurement in this response. This is OUR
            measurement's age, not the publisher's currency: for what a section
            is current THROUGH, read `currentThrough` on the section, and for
            when a source was last checked, read `GET /boards`.\n\nIt exists
            because a jurisdiction whose measurement keeps failing is served
            from the last value we knew to be correct, which is the right trade
            (a stale count is accurate, a degraded one reports a real corpus as
            absent) and used to be indistinguishable from a fresh one. Null
            means nothing in this response has been successfully measured yet.
      type: object
      required:
        - corpusTypes
        - jurisdictions
        - totalSections
        - stateCountWithData
      title: UsStatutesCoverageResponse
      description: >-
        Response for `GET /us/statutes/coverage`.


        A self-describing matrix: a legend of every `corpusType` token plus, for

        each jurisdiction, the per-corpusType ingested-document counts. Use it
        to learn

        exactly what is queryable where before calling `/us/statutes/search`.
    UsFreeCallMeta:
      properties:
        processingTimeMs:
          type: number
          title: Processingtimems
          description: Server-side time to build the response, in milliseconds.
          examples:
            - 142.7
        creditsConsumed:
          type: number
          title: Creditsconsumed
          description: 'Always 0: this endpoint is free.'
          default: 0
          examples:
            - 0
      type: object
      required:
        - processingTimeMs
      title: UsFreeCallMeta
      description: '`meta` on a free discovery endpoint.'
    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.
    UsCorpusTypeInfo:
      properties:
        token:
          type: string
          title: Token
          description: The `corpusType` value to pass to `/us/statutes/search`.
          examples:
            - REGULATION
        description:
          type: string
          title: Description
          description: What this corpus contains.
        scope:
          type: string
          enum:
            - federal
            - state
          title: Scope
          description: >-
            `federal` corpora appear under the `federal` jurisdiction; `state`
            corpora are scoped per state (pair with the `state` filter).
        browsable:
          type: boolean
          title: Browsable
          description: >-
            Whether `GET /us/statutes/divisions` can walk this corpus level by
            level (titles, chapters, parts, codes, articles, rule sets). False
            for dated series such as the Federal Register and executive actions,
            and for corpora with no shared tree such as agency guidance. Every
            corpus is searchable either way; this only says whether you can
            NAVIGATE it instead of querying it.
          default: false
          examples:
            - true
        scopeNote:
          anyOf:
            - type: string
            - type: 'null'
          title: Scopenote
          description: >-
            Present ONLY when we hold part of a corpus rather than all of it,
            and then it names both what is held and what is not. Null means no
            class-level exclusion applies. It is a STRUCTURED completeness
            claim, deliberately separate from `description` (prose a caller
            cannot act on). It says nothing about how recently the corpus was
            refreshed, a different fact: a filtered corpus can be, and
            `FEDERAL_REGISTER_NOTICE` is, refreshed weekly. `GET /boards`
            answers that one.
          examples:
            - >-
              Held: notices withdrawing a proposed rule ... About 2.4% of
              Federal Register notices. Not held: Paperwork Reduction Act
              information collections ...
        sourceScopeNotes:
          additionalProperties:
            type: string
          type: object
          title: Sourcescopenotes
          description: >-
            Scope statements for INDIVIDUAL sources inside this token, keyed by
            the `source` value you can filter on. `scopeNote` is the right unit
            for a token that is one corpus; it is the wrong unit for
            `AGENCY_GUIDANCE`, which fans out to more than thirty unrelated
            sources, so a partial source declares its own coverage here rather
            than describing every sibling. Empty when every source under this
            token is held whole.
          examples:
            - cms_iom: >-
                Held: the 204 chapter, appendix and exhibit documents ... Not
                held ... Pub. 100-12 (State Medicaid Manual) ... publish no
                chapters at all ...
      type: object
      required:
        - token
        - description
        - scope
      title: UsCorpusTypeInfo
      description: 'One entry in the coverage legend: what a `corpusType` token means.'
    UsJurisdictionCoverage:
      properties:
        code:
          type: string
          title: Code
          description: 2-letter state ISO code (lowercase) or `federal` for USC/CFR.
          examples:
            - tx
        name:
          type: string
          title: Name
          description: Display name.
          examples:
            - Texas
        kind:
          type: string
          enum:
            - federal
            - state
            - territory
          title: Kind
          description: >-
            `federal` for USC/CFR, `state` for the 50 states, `territory` for
            non-state jurisdictions (DC, Puerto Rico).
        sectionCount:
          type: integer
          minimum: 0
          title: Sectioncount
          description: >-
            Distinct sections held for this jurisdiction, summed across its
            `corpora`. 0 means not yet covered.


            One per provision or document, NOT per retrieval passage (see
            `totalPassages` for those). Repealed, transferred and reserved
            sections ARE counted: a legal research corpus serves them and a
            customer researching a historical question needs them. A SUPERSEDED
            prior version is not counted a second time when the section it
            supersedes is also served, because that is the same section twice --
            but one with no current counterpart IS counted, since it is the only
            text we hold for that provision. Read `statusBreakdown` to see the
            split.
        hasData:
          type: boolean
          title: Hasdata
          description: True when section_count > 0.
        statusBreakdown:
          additionalProperties:
            additionalProperties:
              type: integer
            type: object
          type: object
          title: Statusbreakdown
          description: >-
            Per-corpusType `act_status` split over the same sections `corpora`
            counts, e.g. `{"REGULATION": {"inForce": 12151, "repealed": 10640,
            "transferred": 5426}}`.


            Published so a large section count can be read as maintained law
            plus retained history rather than as an undifferentiated total:
            Montana holds 28,217 regulation sections of which 12,151 are in
            force, and without this split that reads either as 28,217 current
            rules or as a coverage problem, and it is neither.


            ⚠️ `inForce` is what the ingester recorded, and it is NOT a complete
            census of current law: a zero means the status was never determined,
            never that the corpus is entirely inoperative. Absent when a
            jurisdiction has not been measured exactly.
        corpora:
          additionalProperties:
            type: integer
          type: object
          title: Corpora
          description: >-
            Per-corpusType ingested-DOCUMENT counts for this jurisdiction, keyed
            by the `corpusType` token (e.g. `{"STATE": 176778, "REGULATION":
            51142}`). Only corpora with data are included. Pass a key as
            `corpusType` to `/us/statutes/search` to scope a query.
        sessionLaws:
          anyOf:
            - $ref: '#/components/schemas/SessionLawJurisdictionCoverage'
            - type: 'null'
          description: >-
            State session laws (acts as enacted) held for this jurisdiction, by
            legislative session, with each session's coverage status (`complete`
            or `partial`), how many laws we serve, withhold or know without
            text, the expected total (`denominator`), `openGaps` and when it was
            `measuredAt`. Beside the sessions it carries the `series` and
            `instrumentTypes` that exist (the values `GET /us/session-laws/list`
            accepts) and the span of approval dates held
            (`earliestApprovedDate`, `latestApprovedDate`); each of those four
            is omitted when it cannot be read. A separate corpus: read and list
            the laws with `/us/session-laws`, not `/us/statutes/search`, and
            resolve their citations with `/us/statutes/resolve`. The whole block
            is absent when we hold no session laws for the jurisdiction (for
            example IN and TN at launch, whose publishers we cannot yet collect
            from), and whenever session-law coverage cannot be read; absence is
            a gap in our collection, not a statement that the jurisdiction
            enacts none.
      type: object
      required:
        - code
        - name
        - kind
        - sectionCount
        - hasData
      title: UsJurisdictionCoverage
      description: One row of the /us/statutes/states response.
    SessionLawJurisdictionCoverage:
      properties:
        sessions:
          items:
            $ref: '#/components/schemas/SessionLawSessionCoverage'
          type: array
          title: Sessions
          description: Oldest session first.
          examples:
            - - code: 2025R
                collectedCount: 43
                denominator:
                  derivation: >-
                    The publisher's complete listing of this session names 296
                    measures. We hold 43 of them; the rest are not yet
                    collected.
                  kind: complete_listing
                  value: 296
                label: 153rd General Assembly
                notHeldCount: 0
                openGaps: 253
                registryCount: 43
                servedCount: 43
                status: partial
                type: regular
                withheldCount: 0
                year: 2025
        sessionCount:
          type: integer
          minimum: 0
          title: Sessioncount
          description: Sessions of this jurisdiction we hold session laws for.
          examples:
            - 2
        completeSessionCount:
          type: integer
          minimum: 0
          title: Completesessioncount
          description: How many of those sessions are `complete`.
          examples:
            - 2
        servedCount:
          type: integer
          minimum: 0
          title: Servedcount
          description: Laws served across every session listed.
          examples:
            - 54
        series:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Series
          description: >-
            The numbering series that exist among this jurisdiction's session
            laws: the values `series` accepts on `GET /us/session-laws/list`.
            `general` is the ordinary chapter sequence. Omitted when it cannot
            be read, which is not the same as no series existing.
          examples:
            - - general
        instrumentTypes:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Instrumenttypes
          description: >-
            The kinds of measure we hold for this jurisdiction: the values
            `instrumentType` accepts on `GET /us/session-laws/list`. Omitted
            when it cannot be read.
          examples:
            - - act
              - joint_resolution
        earliestApprovedDate:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Earliestapproveddate
          description: >-
            The earliest approval date among this jurisdiction's session laws,
            ISO 8601: the start of what the approval-date filters on `GET
            /us/session-laws/list` can match. Omitted when no law prints an
            approval date or the span cannot be read.
          examples:
            - '2025-02-10'
        latestApprovedDate:
          anyOf:
            - type: string
              format: date
            - type: 'null'
          title: Latestapproveddate
          description: >-
            The latest approval date among this jurisdiction's session laws, ISO
            8601: the end of what the approval-date filters on `GET
            /us/session-laws/list` can match. Omitted when no law prints an
            approval date or the span cannot be read.
          examples:
            - '2025-06-14'
      type: object
      required:
        - sessionCount
        - completeSessionCount
        - servedCount
      title: SessionLawJurisdictionCoverage
      description: A jurisdiction's state session laws (acts as enacted), by session.
    SessionLawSessionCoverage:
      properties:
        code:
          type: string
          title: Code
          description: Session code, for example `2025R`.
          examples:
            - 2025R
        label:
          anyOf:
            - type: string
            - type: 'null'
          title: Label
          description: The session's canonical label.
          examples:
            - 2025 Regular Session
        type:
          anyOf:
            - type: string
            - type: 'null'
          title: Type
          description: >-
            `regular`, `special`, `extraordinary`, `fiscal`, `veto` or
            `unknown`.
          examples:
            - regular
        year:
          anyOf:
            - type: integer
            - type: 'null'
          title: Year
          description: The year the session convened, the year `code` starts with.
          examples:
            - 2025
        status:
          type: string
          enum:
            - complete
            - partial
          title: Status
          description: >-
            `complete` when every law the publisher lists for the session is
            accounted for. Anything less is `partial`: a law missing from a
            partial session is not evidence that it does not exist, and asking
            for one by id or citation answers `session_not_fully_collected`,
            free of charge, rather than a plain not found.
          examples:
            - complete
        servedCount:
          type: integer
          minimum: 0
          title: Servedcount
          description: >-
            Laws from this session we serve: every one we answer for by id,
            citation or list, whether or not we hold its text (`notHeldCount` of
            them have none). Laws whose text is withheld are not counted here,
            they are `withheldCount`. `servedCount + withheldCount` is
            `registryCount`, less any law still being verified.
          examples:
            - 39
        withheldCount:
          type: integer
          minimum: 0
          title: Withheldcount
          description: >-
            Laws from this session we hold and list but whose text is withheld
            for a measured defect (`textStatus: withheld`). They are real laws:
            their records are served, their text is not.
          default: 0
          examples:
            - 0
        notHeldCount:
          type: integer
          minimum: 0
          title: Notheldcount
          description: >-
            Of the laws counted in `servedCount`, how many have no text held
            (`textStatus: not_held` or `pending`). A subset of `servedCount`,
            not an addition to it: do not add it to `servedCount` or
            `withheldCount`.
          default: 0
          examples:
            - 0
        registryCount:
          type: integer
          minimum: 0
          title: Registrycount
          description: >-
            Every law of this session in our registry, whether or not its text
            is held: `servedCount + withheldCount`. Any difference is a law
            still being verified, which is neither.
          default: 0
          examples:
            - 39
        collectedCount:
          type: integer
          minimum: 0
          title: Collectedcount
          description: >-
            Laws from this session whose text we have collected, served or
            withheld. Compare it with `denominator.value` to see how much of the
            session we hold.
          default: 0
          examples:
            - 39
        denominator:
          anyOf:
            - $ref: '#/components/schemas/SessionLawDenominator'
            - type: 'null'
          description: >-
            How many laws the session is expected to hold, and where that figure
            comes from. Null when it could not be read.
          examples:
            - derivation: >-
                The publisher's complete listing of this session names 296
                measures. We hold 43 of them; the rest are not yet collected.
              kind: complete_listing
              value: 296
        openGaps:
          type: integer
          minimum: 0
          title: Opengaps
          description: >-
            Laws the publisher lists for this session that we could not collect
            and have not yet. 0 on a `complete` session.
          default: 0
          examples:
            - 0
        measuredAt:
          anyOf:
            - type: string
            - type: 'null'
          title: Measuredat
          description: When this session's coverage was last measured, ISO 8601 UTC.
          examples:
            - '2026-10-05T09:07:12+00:00'
      type: object
      required:
        - code
        - status
        - servedCount
      title: SessionLawSessionCoverage
      description: One legislative session's session-law coverage.
    SessionLawDenominator:
      properties:
        kind:
          type: string
          enum:
            - stated_count
            - complete_listing
            - max_number
            - feed_total
            - our_recount
            - registry_union
            - none
          title: Kind
          description: >-
            Where the total comes from. `stated_count`: the publisher states how
            many measures the session enacted. `complete_listing`: the
            publisher's own complete list of the session's acts, which we
            counted. `max_number`: the highest chapter number the publisher
            printed. `feed_total`: the total a publisher feed reports.
            `our_recount`: we counted the publisher's pages ourselves.
            `registry_union`: the measures we know of from several sources.
            `none`: no total is available, so completeness cannot be judged.
          examples:
            - complete_listing
        value:
          anyOf:
            - type: integer
              minimum: 0
            - type: 'null'
          title: Value
          description: >-
            The number of laws the session is expected to hold. Null when `kind`
            is `none`. Compare it with `registryCount` and `servedCount`.
          examples:
            - 296
        derivation:
          type: string
          title: Derivation
          description: >-
            One plain sentence saying what `value` counts and where it comes
            from. Written for customers: it never contains our internal audit or
            collection notes.
          examples:
            - The publisher's complete listing of this session names 296 acts.
      type: object
      required:
        - kind
        - derivation
      title: SessionLawDenominator
      description: >-
        How many laws a session is supposed to hold, and where that number comes
        from.
  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.