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

# Discover valid filter values

> List every value accepted by the `category`, `state`, and `department` filters
on `POST /acts/search`, with the number of sections behind each.

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

**Cost**: free.

Values are lowercase and hyphenated (`madhya-pradesh`, `law-commission`).
`POST /acts/search` rejects anything not listed here with HTTP 422, so read
this rather than guessing. Counts are read from the corpus and refresh as
ingest runs land, so treat the list as live rather than caching it in your app.



## OpenAPI

````yaml https://api.vaquill.ai/in/openapi.json get /api/v1/in/acts/filters
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/filters:
    get:
      tags:
        - Indian Acts & Legislation
      summary: Discover valid filter values
      description: >-
        List every value accepted by the `category`, `state`, and `department`
        filters

        on `POST /acts/search`, with the number of sections behind each.


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


        **Cost**: free.


        Values are lowercase and hyphenated (`madhya-pradesh`,
        `law-commission`).

        `POST /acts/search` rejects anything not listed here with HTTP 422, so
        read

        this rather than guessing. Counts are read from the corpus and refresh
        as

        ingest runs land, so treat the list as live rather than caching it in
        your app.
      operationId: list_act_filters_api_v1_in_acts_filters_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActFiltersResponse'
              example:
                data:
                  categories:
                    - value: state
                      count: 1219846
                    - value: central
                      count: 686388
                  states:
                    - value: central
                      count: 703310
                    - value: chhattisgarh
                      count: 93069
                  departments:
                    - value: sebi
                      count: 130384
                    - value: moefcc
                      count: 120426
                  truncated:
                    - department
                meta:
                  processingTimeMs: 2.4
                  creditsConsumed: 0
        '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:
    ActFiltersResponse:
      properties:
        data:
          $ref: '#/components/schemas/ActFiltersData'
        meta:
          $ref: '#/components/schemas/ActMeta'
      type: object
      required:
        - data
      title: ActFiltersResponse
    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.
    ActFiltersData:
      properties:
        categories:
          items:
            $ref: '#/components/schemas/ActFilterValue'
          type: array
          title: Categories
        states:
          items:
            $ref: '#/components/schemas/ActFilterValue'
          type: array
          title: States
        departments:
          items:
            $ref: '#/components/schemas/ActFilterValue'
          type: array
          title: Departments
        truncated:
          items:
            type: string
          type: array
          title: Truncated
          description: >-
            Fields whose list below is INCOMPLETE. `department` holds 943
            distinct values against a 256-value facet ceiling, so most of them
            are not shown. A value absent from a truncated list is NOT invalid,
            and search no longer rejects one: until 2026-09-06 it did, refusing
            filters on data the corpus holds.
      type: object
      required:
        - categories
        - states
        - departments
      title: ActFiltersData
    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.
    ActFilterValue:
      properties:
        value:
          type: string
          title: Value
        count:
          type: integer
          title: Count
          description: Sections in the corpus carrying this value
      type: object
      required:
        - value
        - count
      title: ActFilterValue
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: vq_key_*
      description: >-
        API key issued from the developer dashboard. Pass as `Authorization:
        Bearer vq_key_...`

````