> ## 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 Indian legislation

> Search 23,000+ Indian acts, regulations, and legislation.

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

**Cost**: 2 credits

Returns relevant act sections with full metadata: category, state, department,
provision type, legal subject, acts referenced, enactment date, and more.
Filter by category (central, state, regulatory), state, department, and year range.



## OpenAPI

````yaml https://api.vaquill.ai/in/openapi.json post /api/v1/in/acts/search
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/search:
    post:
      tags:
        - Indian Acts & Legislation
      summary: Search Indian legislation
      description: >-
        Search 23,000+ Indian acts, regulations, and legislation.


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


        **Cost**: 2 credits


        Returns relevant act sections with full metadata: category, state,
        department,

        provision type, legal subject, acts referenced, enactment date, and
        more.

        Filter by category (central, state, regulatory), state, department, and
        year range.
      operationId: search_acts_api_v1_in_acts_search_post
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ActSearchRequest'
        required: true
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActSearchResponse'
              example:
                data:
                  results:
                    - actId: IND_state_20326
                      title: The Maharashtra Value Added Tax Act, 2002.
                      sectionNumber: '23'
                      sectionTitle: Assessment
                      chapter: V
                      chapterTitle: RETURNS AND ASSESSMENT, ETC.
                      year: 2002
                      category: state
                      state: maharashtra
                      department: Finance Department
                      jurisdiction: state
                      actStatus: in_force
                      provisionType: overriding
                      legalSubject:
                        - tax_law
                      content: >-
                        Act: The Maharashtra Value Added Tax Act, 2002. (Act 9
                        of 2002) | India | State | In Force

                        Chapter V: RETURNS AND ASSESSMENT, ETC. | Section 23:
                        Assessment


                        ( _2_ )[1] [Where the return in respect of any period]
                        is filed by a registered dealer, by the prescri…
                      enactmentDate: 9-Mar-2005
                      pdfUrl: https://acts-india.vaquill.ai/IND_state_20326/act.pdf
                      textUrl: >-
                        https://acts-india.vaquill.ai/IND_state_20326/act.normalized.txt
                      sourceUrl: https://indiacode.gov.in/handle/123456789/568111
                      relevanceScore: 0.8555
                      citation:
                        citation: The Maharashtra Value Added Tax Act, 2002., s. 23
                        citationShort: Maharashtra Value Added Tax Act, 2002., s. 23
                        displayPath: >-
                          The Maharashtra Value Added Tax Act, 2002. / Chapter
                          V. RETURNS AND ASSESSMENT, ETC. / s. 23
                        breadcrumb:
                          - type: chapter
                            num: V
                            label: Chapter V
                            name: RETURNS AND ASSESSMENT, ETC.
                    - actId: IND_state_20326
                      title: The Maharashtra Value Added Tax Act, 2002.
                      sectionNumber: '20'
                      sectionTitle: Returns and self-assessment
                      chapter: V
                      chapterTitle: RETURNS AND ASSESSMENT, ETC.
                      year: 2002
                      category: state
                      state: maharashtra
                      department: Finance Department
                      jurisdiction: state
                      actStatus: in_force
                      provisionType: overriding
                      legalSubject:
                        - tax_law
                      content: >-
                        Act: The Maharashtra Value Added Tax Act, 2002. (Act 9
                        of 2002) | India | State | In Force

                        Chapter V: RETURNS AND ASSESSMENT, ETC. | Section 20:
                        Returns and self-assessment


                        CHAPTER V


                        RETURNS AND ASSESSMENT, ETC.


                        > 3[20. Returns and self-assessment.— ( _1_ …
                      enactmentDate: 9-Mar-2005
                      pdfUrl: https://acts-india.vaquill.ai/IND_state_20326/act.pdf
                      textUrl: >-
                        https://acts-india.vaquill.ai/IND_state_20326/act.normalized.txt
                      sourceUrl: https://indiacode.gov.in/handle/123456789/568111
                      relevanceScore: 0.7734
                      citation:
                        citation: The Maharashtra Value Added Tax Act, 2002., s. 20
                        citationShort: Maharashtra Value Added Tax Act, 2002., s. 20
                        displayPath: >-
                          The Maharashtra Value Added Tax Act, 2002. / Part.
                          RETURNS AND ASSESSMENT, ETC. / Chapter V. RETURNS AND
                          ASSESSMENT, ETC. / s. 20
                        breadcrumb:
                          - type: part
                            label: Part
                            name: RETURNS AND ASSESSMENT, ETC.
                          - type: chapter
                            num: V
                            label: Chapter V
                            name: RETURNS AND ASSESSMENT, ETC.
                  totalReturned: 3
                meta:
                  processingTimeMs: 3296
                  creditsConsumed: 2
                  creditsRemaining: 86761
                  page: 1
                  pageSize: 3
                  total: 79320
                  totalPages: 34
        '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:
    ActSearchRequest:
      properties:
        query:
          type: string
          maxLength: 1000
          minLength: 2
          title: Query
          description: Search query.
          examples:
            - assessment of a registered dealer
        category:
          anyOf:
            - type: string
            - type: 'null'
          enum:
            - central
            - state
            - regulatory
            - repealed
            - spent
          title: Category
          description: >-
            Jurisdictional class. `repealed` and `spent` are accepted for
            backward compatibility and resolve against `actStatus` instead.
          examples:
            - central
        state:
          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
        department:
          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
        actStatus:
          anyOf:
            - type: string
            - items:
                type: string
              type: array
            - type: 'null'
          enum:
            - in_force
            - repealed
            - superseded
            - spent
          title: Actstatus
          description: >-
            Filter by the publisher's lifecycle status: `in_force`, `repealed`,
            `superseded`, `spent`. Accepts one value or a list. This is the
            publisher's claim, not our verdict: see GET /acts/{actId}/status.
          examples:
            - repealed
        excludeRepealed:
          type: boolean
          title: Excluderepealed
          description: >-
            Drop provisions whose act the publisher records as repealed or
            spent. Off by default, because repealed law is still law that was in
            force and is routinely the thing being researched.
          default: false
          examples:
            - true
        isSubordinate:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Issubordinate
          description: >-
            True for subordinate instruments only (rules, notifications,
            circulars, orders); false for principal acts only. Omit for both.
          examples:
            - false
        provisionType:
          anyOf:
            - type: string
            - items:
                type: string
              type: array
            - type: 'null'
          enum:
            - mandatory
            - general
            - prohibitory
            - overriding
            - discretionary
            - declaratory
          title: Provisiontype
          description: >-
            Filter by what the provision DOES: `definitional`, `prohibitory`,
            `procedural`, `penal`, `overriding` and others. Accepts a value or a
            list.
          examples:
            - mandatory
        sectionType:
          anyOf:
            - type: string
            - items:
                type: string
              type: array
            - type: 'null'
          enum:
            - amendment_provision
            - article
            - body
            - chapter_heading
            - definition_clause
            - definitions
            - part_heading
            - preamble
            - schedule
            - section
            - short_title
            - sub_section
          title: Sectiontype
          description: >-
            Filter by structural kind: `section`, `sub_section`, `definitions`,
            `preamble`, `schedule`, `short_title`.
          examples:
            - definitions
        legalSubject:
          anyOf:
            - type: string
            - items:
                type: string
              type: array
            - type: 'null'
          enum:
            - administrative_law
            - banking_finance
            - civil_procedure
            - constitutional_law
            - corporate_law
            - criminal_law
            - environmental_law
            - family_law
            - general
            - information_technology
            - intellectual_property
            - labour_law
            - property_law
            - tax_law
          title: Legalsubject
          description: >-
            Filter by subject area, e.g. `tax_law`, `criminal_law`,
            `environmental_law`, `company_law`.
          examples:
            - tax_law
        matchType:
          type: string
          enum:
            - any
            - all
            - phrase
          title: Matchtype
          description: >-
            How query terms must appear in the provision text. `any` (the
            default) leaves hybrid ranking to do the work; `all` keeps only
            provisions containing EVERY query term; `phrase` keeps only those
            containing the exact phrase.


            ⚠️ It narrows the ranked candidate pool rather than re-querying the
            index, so a `phrase` search returns phrase matches WITHIN the top
            candidates, not every phrase match in the corpus. For an exhaustive
            phrase search, narrow with the structured filters first.
          default: any
          examples:
            - phrase
        page:
          type: integer
          minimum: 1
          title: Page
          description: >-
            1-based page number. `page * pageSize` may not exceed 100; narrow
            the query with filters to reach deeper matches.
          default: 1
        yearFrom:
          anyOf:
            - type: integer
            - type: 'null'
          title: Yearfrom
          description: Minimum year (inclusive)
          examples:
            - 2015
        yearTo:
          anyOf:
            - type: integer
            - type: 'null'
          title: Yearto
          description: Maximum year (inclusive)
          examples:
            - 2024
        sectionNumber:
          anyOf:
            - type: string
            - type: 'null'
          title: Sectionnumber
          description: >-
            Filter by exact section number. The publisher's own numbering, which
            is not an integer: `498A`, `376DA` and `2-A` all occur, and the
            alphabetic suffix is part of the number rather than a sub-provision.
          examples:
            - 498A
        actTitle:
          anyOf:
            - type: string
            - type: 'null'
          title: Acttitle
          description: >-
            Filter by words in the act's title. Each word must appear, so
            `Bharatiya Nyaya` narrows to the Sanhita.
          examples:
            - Bharatiya Nyaya Sanhita
        pageSize:
          type: integer
          maximum: 50
          minimum: 1
          title: Pagesize
          description: Results per page (1-50)
          default: 10
      additionalProperties: false
      type: object
      required:
        - query
      title: ActSearchRequest
      description: Search Indian legislation by semantic query.
    ActSearchResponse:
      properties:
        data:
          $ref: '#/components/schemas/ActSearchData'
        meta:
          $ref: '#/components/schemas/ActSearchMeta'
      type: object
      required:
        - data
        - meta
      title: ActSearchResponse
    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.
    ActSearchData:
      properties:
        results:
          items:
            $ref: '#/components/schemas/ActSearchResult'
          type: array
          title: Results
        totalReturned:
          type: integer
          title: Totalreturned
      type: object
      required:
        - results
        - totalReturned
      title: ActSearchData
    ActSearchMeta:
      properties:
        processingTimeMs:
          type: integer
          title: Processingtimems
        creditsConsumed:
          type: number
          title: Creditsconsumed
        creditsRemaining:
          type: number
          title: Creditsremaining
        page:
          type: integer
          title: Page
        pageSize:
          type: integer
          title: Pagesize
        total:
          type: integer
          title: Total
          description: >-
            Passages in the corpus matching the filters. This is the size of the
            haystack, not the number of results you can page through: a single
            section spans several passages, and relevance gating plus
            act+section dedup run after retrieval. Treat it as an upper bound
            and a signal to narrow your filters, not as a result count.
        totalPages:
          type: integer
          title: Totalpages
          description: >-
            Pages actually reachable, derived from the result window rather than
            from `total`.
      type: object
      required:
        - processingTimeMs
        - creditsConsumed
        - creditsRemaining
        - page
        - pageSize
        - total
        - totalPages
      title: ActSearchMeta
    ActSearchResult:
      properties:
        actId:
          type: string
          title: Actid
        title:
          type: string
          title: Title
        sectionNumber:
          anyOf:
            - type: string
            - type: 'null'
          title: Sectionnumber
        sectionTitle:
          anyOf:
            - type: string
            - type: 'null'
          title: Sectiontitle
        chapter:
          anyOf:
            - type: string
            - type: 'null'
          title: Chapter
        chapterTitle:
          anyOf:
            - type: string
            - type: 'null'
          title: Chaptertitle
        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
        jurisdiction:
          anyOf:
            - type: string
            - type: 'null'
          title: Jurisdiction
        actStatus:
          anyOf:
            - type: string
            - type: 'null'
          title: Actstatus
        provisionType:
          anyOf:
            - type: string
            - type: 'null'
          title: Provisiontype
        legalSubject:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Legalsubject
        actsReferenced:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Actsreferenced
        content:
          type: string
          title: Content
          description: Relevant text excerpt
        longTitle:
          anyOf:
            - type: string
            - type: 'null'
          title: Longtitle
        enactmentDate:
          anyOf:
            - type: string
            - type: 'null'
          title: Enactmentdate
        pdfUrl:
          anyOf:
            - type: string
            - type: 'null'
          title: Pdfurl
        textUrl:
          anyOf:
            - type: string
            - type: 'null'
          title: Texturl
        sourceUrl:
          anyOf:
            - type: string
            - type: 'null'
          title: Sourceurl
        relevanceScore:
          anyOf:
            - type: number
            - type: 'null'
          title: Relevancescore
          description: >-
            Ranking score for this result against the query, after hybrid fusion
            and cross-encoder reranking. Comparable WITHIN one response and not
            across responses: it is a rank artifact, not a probability, and not
            a statement about legal relevance.
          examples:
            - 0.87
        sourceUrlNote:
          anyOf:
            - type: string
            - type: 'null'
          title: Sourceurlnote
          description: >-
            Why `sourceUrl` is absent, when it is. A named reason, because a
            bare null cannot be told apart from 'not applicable'.
        citation:
          $ref: '#/components/schemas/Citation'
          description: How to cite this provision. Present on 99.90% of served acts.
      type: object
      required:
        - actId
        - title
        - content
      title: ActSearchResult
      description: A single legislation search result with full metadata.
    Citation:
      properties:
        citation:
          anyOf:
            - type: string
            - type: 'null'
          title: Citation
        citationShort:
          anyOf:
            - type: string
            - type: 'null'
          title: Citationshort
        displayPath:
          anyOf:
            - type: string
            - type: 'null'
          title: Displaypath
        breadcrumb:
          anyOf:
            - items:
                additionalProperties: true
                type: object
              type: array
            - type: 'null'
          title: Breadcrumb
      type: object
      title: Citation
      description: >-
        How to cite the thing this response is about.


        Present on 99.90% of served acts. Where the publisher's own title
        carries a

        defect, so does the citation: 10.4% of titles end in a period, which
        reads

        as `... Act., s. 3`, and 4.7% carry no year at all. Both are recorded

        defects rather than reasons to withhold the field.
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: vq_key_*
      description: >-
        API key issued from the developer dashboard. Pass as `Authorization:
        Bearer vq_key_...`

````