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

# Browse and discover acts

> Browse Indian acts, regulations and legislation with filters.

Use this endpoint to **discover act IDs** for the other routes here.

It enumerates **every served act** (64,179 as of the index build) and pages
over a total order, so walking the offsets returns each act exactly once with
a `total` that does not move underneath you.

The listing is a dated **snapshot**, rebuilt on the ingest cadence. An act
ingested after that build is served by `POST /acts/search` and the act routes
before it appears here; every response states the build date in `note`. If the
index is ever unavailable the response falls back to a smaller legacy listing
and says so, prefixed `DEGRADED:`, rather than quietly returning less.

**Authentication**: API key via `Authorization: Bearer vq_key_...`

**Cost**: 1 credit

Filter by category (central, state, regulatory, repealed, spent), state,
department, year range, and act status. Sort by year or title. Rows carry
`sectionCount` and `citation`, so a caller can size and cite an act without a
second request.



## OpenAPI

````yaml https://api.vaquill.ai/in/openapi.json get /api/v1/in/acts/list
openapi: 3.1.0
info:
  title: Vaquill India API
  description: >-
    Public API for Indian primary law: Central and State Acts, the instruments
    of the principal regulators, and their individual sections.


    **Authentication**: Pass your API key via the `Authorization: Bearer
    vq_key_...` header. The same key works against the US API; the two share one
    credit balance.


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


    ## Coverage


    | Layer | Volume |

    |---|---|

    | Enactments (Central, State and UT) | 22,265 |

    | Individually addressable provisions | 1,098,577 |

    | Regulator instruments | roughly half the corpus |


    Regulators covered include SEBI, RBI, MCA, IRDAI, TRAI, DGFT, MOEFCC and
    CPCB.


    `sourceUrl` points at the publisher's own document where we hold a live one,
    and is `null` otherwise. India Code migrated hosts in August 2026 and
    re-minted its identifiers, so links into the old site no longer resolve; we
    return nothing rather than a link that 404s. `pdfUrl` and `textUrl` are
    served from our own mirror and are unaffected.


    ## Scope


    This document describes the **India** surface only. US statutes are a
    separate document at `/external/openapi.json`, so an MCP client configured
    here sees Indian tools and nothing else.
  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: []
paths:
  /api/v1/in/acts/list:
    get:
      tags:
        - Indian Acts and Legislation
      summary: Browse and discover acts
      description: >-
        Browse Indian acts, regulations and legislation with filters.


        Use this endpoint to **discover act IDs** for the other routes here.


        It enumerates **every served act** (64,179 as of the index build) and
        pages

        over a total order, so walking the offsets returns each act exactly once
        with

        a `total` that does not move underneath you.


        The listing is a dated **snapshot**, rebuilt on the ingest cadence. An
        act

        ingested after that build is served by `POST /acts/search` and the act
        routes

        before it appears here; every response states the build date in `note`.
        If the

        index is ever unavailable the response falls back to a smaller legacy
        listing

        and says so, prefixed `DEGRADED:`, rather than quietly returning less.


        **Authentication**: API key via `Authorization: Bearer vq_key_...`


        **Cost**: 1 credit


        Filter by category (central, state, regulatory, repealed, spent), state,

        department, year range, and act status. Sort by year or title. Rows
        carry

        `sectionCount` and `citation`, so a caller can size and cite an act
        without a

        second request.
      operationId: list_acts_api_v1_in_acts_list_get
      parameters:
        - name: category
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Jurisdictional class of the instrument. `repealed` and `spent` are
              accepted for backward compatibility and resolve against the act's
              status instead. Values: `central`, `state`, `regulatory`,
              `repealed`, `spent`.
            examples:
              - central
            enum:
              - central
              - state
              - regulatory
              - repealed
              - spent
            title: Category
          description: >-
            Jurisdictional class of the instrument. `repealed` and `spent` are
            accepted for backward compatibility and resolve against the act's
            status instead. Values: `central`, `state`, `regulatory`,
            `repealed`, `spent`.
        - name: state
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            enum:
              - andaman-and-nicobar-islands
              - andaman-nicobar
              - andhra-pradesh
              - arunachal-pradesh
              - assam
              - bihar
              - central
              - chandigarh
              - chhattisgarh
              - dadra-and-nagar-haveli-and-daman-and-diu
              - dadra-nagar-haveli
              - delhi
              - goa
              - gujarat
              - haryana
              - himachal-pradesh
              - jammu-and-kashmir
              - jammu-kashmir
              - jharkhand
              - karnataka
              - kerala
              - ladakh
              - lakshadweep
              - madhya-pradesh
              - maharashtra
              - manipur
              - meghalaya
              - mizoram
              - nagaland
              - odisha
              - puducherry
              - punjab
              - rajasthan
              - sikkim
              - tamil-nadu
              - telangana
              - tripura
              - uttar-pradesh
              - uttarakhand
              - west-bengal
            title: State
            description: >-
              Jurisdiction slug. `central` is a value here, for Union
              legislation. Live counts per jurisdiction are on GET
              /acts/coverage.
            examples:
              - maharashtra
          description: >-
            Jurisdiction slug. `central` is a value here, for Union legislation.
            Live counts per jurisdiction are on GET /acts/coverage.
        - name: department
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            title: Department
            description: >-
              Issuing body. Deliberately NOT an enumerated list: this field
              holds 943 distinct values and mixes clean regulator slugs (`sebi`,
              `rbi`, `moefcc`) with free-text state department names (`Law
              Department`). Read GET /acts/filters for the values with the most
              data behind them.
            examples:
              - sebi
          description: >-
            Issuing body. Deliberately NOT an enumerated list: this field holds
            943 distinct values and mixes clean regulator slugs (`sebi`, `rbi`,
            `moefcc`) with free-text state department names (`Law Department`).
            Read GET /acts/filters for the values with the most data behind
            them.
        - name: yearFrom
          in: query
          required: false
          schema:
            anyOf:
              - type: integer
                maximum: 2100
              - type: 'null'
            title: Yearfrom
            description: >-
              Earliest year of enactment to include, inclusive. Matched against
              the publisher's own year field, which is occasionally corrupt, so
              there is no lower bound and a value below 1800 is a legitimate way
              to find those rows.
            examples:
              - 2015
          description: >-
            Earliest year of enactment to include, inclusive. Matched against
            the publisher's own year field, which is occasionally corrupt, so
            there is no lower bound and a value below 1800 is a legitimate way
            to find those rows.
        - name: yearTo
          in: query
          required: false
          schema:
            anyOf:
              - type: integer
                maximum: 2100
              - type: 'null'
            title: Yearto
            description: Latest year of enactment to include, inclusive.
            examples:
              - 2024
          description: Latest year of enactment to include, inclusive.
        - name: status
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              The publisher's lifecycle status for the act. Their claim, not our
              verdict: see GET /acts/{actId}/status. Values: `in_force`,
              `repealed`, `superseded`, `spent`.
            examples:
              - repealed
            enum:
              - in_force
              - repealed
              - superseded
              - spent
            title: Status
          description: >-
            The publisher's lifecycle status for the act. Their claim, not our
            verdict: see GET /acts/{actId}/status. Values: `in_force`,
            `repealed`, `superseded`, `spent`.
        - name: search
          in: query
          required: false
          schema:
            anyOf:
              - type: string
                minLength: 2
                maxLength: 200
              - type: 'null'
            description: >-
              Keep only acts whose title contains this substring, matched
              case-insensitively. A title filter, not a search over the text:
              use POST /acts/search for that.
            examples:
              - income tax
            title: Search
          description: >-
            Keep only acts whose title contains this substring, matched
            case-insensitively. A title filter, not a search over the text: use
            POST /acts/search for that.
        - name: sort
          in: query
          required: false
          schema:
            type: string
            description: >-
              Sort order. `popular` is DEPRECATED and behaves as `year_desc`: it
              ordered by a read counter held only in the retired store. Values:
              `year_desc`, `year_asc`, `title_asc`, `title_desc`, `popular`.
            examples:
              - title_asc
            enum:
              - year_desc
              - year_asc
              - title_asc
              - title_desc
              - popular
            default: year_desc
            title: Sort
          description: >-
            Sort order. `popular` is DEPRECATED and behaves as `year_desc`: it
            ordered by a read counter held only in the retired store. Values:
            `year_desc`, `year_asc`, `title_asc`, `title_desc`, `popular`.
        - name: page
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            description: 1-based page number.
            examples:
              - 1
            default: 1
            title: Page
          description: 1-based page number.
        - name: pageSize
          in: query
          required: false
          schema:
            type: integer
            maximum: 100
            minimum: 1
            description: Results per page (1-100).
            examples:
              - 50
            default: 50
            title: Pagesize
          description: Results per page (1-100).
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActListResponse'
              example:
                results:
                  - actId: INC_619586
                    title: The Kerala (Alteration of Name) Act, 2026
                    year: 2026
                    category: central
                    actNumber: '18'
                    actStatus: in_force
                    enactmentDate: '2026-08-14'
                    citation: The Kerala (Alteration of Name) Act, 2026
                    sectionCount: 1
                  - actId: INC_619582
                    title: The Tribunals Reforms Act, 2026
                    year: 2026
                    category: central
                    department: Department of Legal Affairs
                    actNumber: '17'
                    actStatus: in_force
                    enactmentDate: '2026-08-13'
                    citation: The Tribunals Reforms Act, 2026
                    sectionCount: 3
                total: 32
                page: 1
                pageSize: 3
                hasMore: true
                meta:
                  processingTimeMs: 591.4
                  creditsConsumed: 1
                note: >-
                  This listing enumerates every served act, from an act index
                  built 2026-09-07T11:53:52Z. An act ingested after that date is
                  available from search and the act routes before it appears
                  here.
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
        '402':
          description: Insufficient credits
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
        '403':
          description: Key lacks the research:read scope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
        '404':
          description: No such act or provision
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
        '422':
          description: Malformed or unknown request field
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
        '429':
          description: Rate limited
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
components:
  schemas:
    ActListResponse:
      properties:
        results:
          items:
            $ref: '#/components/schemas/ActListItem'
          type: array
          title: Results
        total:
          type: integer
          title: Total
        page:
          type: integer
          title: Page
        pageSize:
          type: integer
          title: Pagesize
        hasMore:
          type: boolean
          title: Hasmore
        meta:
          $ref: '#/components/schemas/ActMeta'
        note:
          anyOf:
            - type: string
            - type: 'null'
          title: Note
          description: >-
            Always set on this endpoint, naming the source that answered. On the
            normal path it carries the act index's BUILD DATE, because the
            listing is a snapshot and an act ingested after that date reaches
            search before it reaches here. If the index is unavailable the note
            is prefixed `DEGRADED:` and states the shortfall. A gap a caller can
            see is not the same as one they cannot.
      type: object
      required:
        - results
        - total
        - page
        - pageSize
        - hasMore
      title: ActListResponse
    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.
      type: object
      required:
        - detail
      title: ApiDetailError
      description: |-
        Error envelope the API actually returns.

        All errors (401/402/403/404/422/429/5xx) come back as a single
        `detail` string (FastAPI default), e.g. `{"detail": "Insufficient API
        credits."}`. Documenting the real shape so client code can rely on it.
    ActListItem:
      properties:
        actId:
          type: string
          title: Actid
        title:
          type: string
          title: Title
        year:
          anyOf:
            - type: integer
            - type: 'null'
          title: Year
        category:
          anyOf:
            - type: string
            - type: 'null'
          title: Category
        state:
          anyOf:
            - type: string
            - type: 'null'
          title: State
        department:
          anyOf:
            - type: string
            - type: 'null'
          title: Department
        actNumber:
          anyOf:
            - type: string
            - type: 'null'
          title: Actnumber
        actStatus:
          anyOf:
            - type: string
            - type: 'null'
          title: Actstatus
        enactmentDate:
          anyOf:
            - type: string
            - type: 'null'
          title: Enactmentdate
          description: Enactment date as `YYYY-MM-DD`, or null. See `enactmentDateRaw`.
        enactmentDateRaw:
          anyOf:
            - type: string
            - type: 'null'
          title: Enactmentdateraw
          description: The publisher's own string, when it differs from `enactmentDate`.
        citation:
          anyOf:
            - type: string
            - type: 'null'
          title: Citation
          description: >-
            How to cite the act, as the publisher titles it. Present only on
            index-backed listings.
        sectionCount:
          anyOf:
            - type: integer
            - type: 'null'
          title: Sectioncount
          description: >-
            Sections we hold for this act, so a caller can size a fetch before
            making it. Present only on index-backed listings.
      type: object
      required:
        - actId
        - title
      title: ActListItem
      description: Lightweight act summary for browsing and discovery.
    ActMeta:
      properties:
        processingTimeMs:
          type: number
          title: Processingtimems
          description: >-
            Server-side time in milliseconds, excluding network transit. Not
            billed on.
          default: 0
          examples:
            - 315
        creditsConsumed:
          type: number
          title: Creditsconsumed
          description: >-
            Credits ACTUALLY charged for this call. Read this rather than
            assuming the list price: refunded work bills 0.
          default: 0
          examples:
            - 3
      type: object
      title: ActMeta
      description: >-
        What this call cost and how long it took.


        🔴 Added 2026-09-06. Five of the six original routes returned NO
        statement

        of what they billed: `/text` (3 credits), `/amendments` (5), `/list`
        (1),

        `/filters` (0) and `/corresponding-provisions` (1). The house rule on
        the

        US surface is that `creditsConsumed` is the CONTRACT and the list price
        is

        not, and it matters most exactly where refunds happen -- `/text` refunds
        on

        a missing act, `/corresponding-provisions` refunds when a mapping does
        not

        exist yet. Without this field a caller cannot tell a refunded call from
        a

        charged one, and has to reconcile against the ledger to find out.
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: vq_key_*
      description: >-
        API key issued from the developer dashboard. Pass as `Authorization:
        Bearer vq_key_...`

````