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

# What the India corpus holds

> Describe the corpus behind this API: how many acts and provisions it holds, how
they break down by jurisdiction, regulator and status, and how DEEP that holding
goes.

**Cost: free.**

Read the `depth` block before building on this API. It answers four independent
questions, because "we hold the act" and "we hold what amended it" are different
claims and only one of them is true for most of the corpus:

- `actsWithText` is every act we serve;
- `actsWithAmendmentEvents` is the much smaller set for which we hold parsed
  amendment records;
- `actsClaimingAmendmentsWithoutEvents` is the known gap between them, published
  so that an empty amendment list is legible as a gap rather than as a claim
  that nothing ever changed.

Two different kinds of count appear here and they are labelled. `passages` in
the breakdown lists is faceted live and exact right now. The act-level numbers
in `totals` and `depth` come from a full distinct-act scan, and `measuredOn`
says when it ran. Do not divide one into the other.



## OpenAPI

````yaml https://api.vaquill.ai/in/openapi.json get /api/v1/in/acts/coverage
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/coverage:
    get:
      tags:
        - Indian Acts & Legislation
      summary: What the India corpus holds
      description: >-
        Describe the corpus behind this API: how many acts and provisions it
        holds, how

        they break down by jurisdiction, regulator and status, and how DEEP that
        holding

        goes.


        **Cost: free.**


        Read the `depth` block before building on this API. It answers four
        independent

        questions, because "we hold the act" and "we hold what amended it" are
        different

        claims and only one of them is true for most of the corpus:


        - `actsWithText` is every act we serve;

        - `actsWithAmendmentEvents` is the much smaller set for which we hold
        parsed
          amendment records;
        - `actsClaimingAmendmentsWithoutEvents` is the known gap between them,
        published
          so that an empty amendment list is legible as a gap rather than as a claim
          that nothing ever changed.

        Two different kinds of count appear here and they are labelled.
        `passages` in

        the breakdown lists is faceted live and exact right now. The act-level
        numbers

        in `totals` and `depth` come from a full distinct-act scan, and
        `measuredOn`

        says when it ran. Do not divide one into the other.
      operationId: get_coverage_api_v1_in_acts_coverage_get
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CoverageResponse'
              example:
                data:
                  totals:
                    acts: 64179
                    actsRetired: 703
                    sections: 745970
                    passages: 2532537
                    measuredOn: '2026-09-06'
                  depth:
                    actsWithText: 64179
                    actsWithAmendmentEvents: 1061
                    actsWithRepealClaim: 655
                    actsWithStructure: 16465
                    actsWithCitation: 64117
                    actsWithSourceUrl: 57316
                    actsClaimingAmendmentsWithoutEvents: 840
                  byCategory:
                    - value: state
                      passages: 1219846
                    - value: central
                      passages: 686388
                  byJurisdiction:
                    - code: central
                      acts: 13514
                      sections: 176900
                      passages: 703310
                    - code: maharashtra
                      acts: 2844
                      sections: 27163
                      passages: 79320
                  categoryLegend:
                    - value: central
                      meaning: >-
                        Legislation of the Union Parliament, and central
                        subordinate instruments made under it.
                    - value: state
                      meaning: >-
                        Legislation of a State or Union Territory legislature,
                        and state subordinate instruments. The `state` filter
                        narrows within this.
                  byRegulator:
                    - value: sebi
                      passages: 130384
                    - value: moefcc
                      passages: 120426
                  byStatus:
                    - value: in_force
                      passages: 2435254
                    - value: repealed
                      passages: 93198
                  caveats:
                    measuredOn: '2026-09-06'
                    actCountsAreDated: >-
                      Act-level counts come from a full distinct-act scan run on
                      2026-09-06. Passage counts in this response are live. The
                      two are measured differently on purpose and should not be
                      divided into each other.
                    sectionsAreDistinctActSectionPairs: >-
                      `sections` counts distinct (act, section) pairs. It is NOT
                      the passage count: a section spans about 3.4 passages, so
                      dividing passages by sections is the only safe direction
                      and multiplying is not.
                    amendmentCoverage: >-
                      Structured amendment events are held for 1061 acts. A
                      further 840 acts carry a non-zero amendment count with no
                      parseable footnote behind it; those return an empty event
                      list and say so in their coverage block. Of 32808 records
                      held, 17333 carry an effective …
                    textCurrency: >-
                      We serve the publisher's text as published. We do NOT
                      apply amendments to it. Every amendment event carries an
                      appliedStatus saying so, so currency never has to be
                      inferred from silence.
                    repealStatusIsAClaim: >-
                      act_status and repealedBy are the publisher's claims. We
                      do not verify that a repealing Act was brought into force,
                      and at least one repeal on record involves an Act that
                      never commenced.
                    retiredActsAreNotDeleted: >-
                      703 acts are retired from the served corpus, either
                      withdrawn by the publisher or duplicates of an act we
                      kept. Nothing was deleted.
                meta:
                  processingTimeMs: 1853.1
                  creditsConsumed: 0
        '401':
          description: Missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
        '403':
          description: Key lacks the research:read scope
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
        '429':
          description: Rate limited
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
components:
  schemas:
    CoverageResponse:
      properties:
        data:
          $ref: '#/components/schemas/CoverageData'
        meta:
          $ref: '#/components/schemas/Meta'
      type: object
      required:
        - data
        - meta
      title: CoverageResponse
    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.
    CoverageData:
      properties:
        totals:
          $ref: '#/components/schemas/CoverageTotals'
        depth:
          $ref: '#/components/schemas/CoverageDepth'
        byCategory:
          items:
            $ref: '#/components/schemas/CoverageCount'
          type: array
          title: Bycategory
        byJurisdiction:
          items:
            $ref: '#/components/schemas/JurisdictionCoverage'
          type: array
          title: Byjurisdiction
        categoryLegend:
          items:
            $ref: '#/components/schemas/CategoryLegend'
          type: array
          title: Categorylegend
          description: What each `category` value means. The vocabulary alone did not say.
        byRegulator:
          items:
            $ref: '#/components/schemas/CoverageCount'
          type: array
          title: Byregulator
        byStatus:
          items:
            $ref: '#/components/schemas/CoverageCount'
          type: array
          title: Bystatus
        caveats:
          additionalProperties: true
          type: object
          title: Caveats
      type: object
      required:
        - totals
        - depth
        - byCategory
        - byJurisdiction
        - categoryLegend
        - byRegulator
        - byStatus
        - caveats
      title: CoverageData
    Meta:
      properties:
        processingTimeMs:
          type: number
          title: Processingtimems
          description: >-
            Server-side time for this request in milliseconds, excluding network
            transit. Not billed on.
          default: 0
          examples:
            - 142.7
        creditsConsumed:
          type: number
          title: Creditsconsumed
          description: >-
            Credits actually charged. Read this rather than assuming the list
            price: refunded work bills 0.
          default: 0
          examples:
            - 2
      type: object
      title: Meta
    CoverageTotals:
      properties:
        acts:
          type: integer
          title: Acts
          description: Distinct served acts. Dated, see `measuredOn`.
        actsRetired:
          type: integer
          title: Actsretired
        sections:
          type: integer
          title: Sections
          description: >-
            Distinct (act, section) pairs. NOT the passage count: a section
            spans several passages and the two differ by a factor of about 3.4.
        passages:
          type: integer
          title: Passages
          description: Live, exact, counted at request time.
        measuredOn:
          type: string
          title: Measuredon
          description: The date the act-level counts in this block were last scanned.
      type: object
      required:
        - acts
        - actsRetired
        - sections
        - passages
        - measuredOn
      title: CoverageTotals
    CoverageDepth:
      properties:
        actsWithText:
          type: integer
          title: Actswithtext
        actsWithAmendmentEvents:
          type: integer
          title: Actswithamendmentevents
        actsWithRepealClaim:
          type: integer
          title: Actswithrepealclaim
        actsWithStructure:
          type: integer
          title: Actswithstructure
        actsWithCitation:
          type: integer
          title: Actswithcitation
        actsWithSourceUrl:
          type: integer
          title: Actswithsourceurl
        actsClaimingAmendmentsWithoutEvents:
          type: integer
          title: Actsclaimingamendmentswithoutevents
          description: >-
            Acts whose stored amendment count is non-zero while no parseable
            amendment record exists. They return an empty event list, and this
            number is published so that emptiness is legible as a known gap
            rather than as an assertion that nothing ever changed.
      type: object
      required:
        - actsWithText
        - actsWithAmendmentEvents
        - actsWithRepealClaim
        - actsWithStructure
        - actsWithCitation
        - actsWithSourceUrl
        - actsClaimingAmendmentsWithoutEvents
      title: CoverageDepth
      description: >-
        The corpus against the four questions worth asking of it.


        Modelled on legislation.gov.uk's "what we have" matrix, which answers
        text

        held, text revised, amendments-by recorded and amendments-to recorded as

        four INDEPENDENT columns. A single "we have it" number hides which of
        them

        is true, and ours has drifted from search twice.
    CoverageCount:
      properties:
        value:
          type: string
          title: Value
        passages:
          type: integer
          title: Passages
      type: object
      required:
        - value
        - passages
      title: CoverageCount
      description: >-
        A live facet hit.


        `passages` is what a Qdrant facet can actually count. It is NOT an act

        count and must not be read as one: there are about 3.4 passages per
        section

        and many sections per act. Act-level figures live in `totals` and carry

        their own measurement date.
    JurisdictionCoverage:
      properties:
        code:
          type: string
          title: Code
        acts:
          type: integer
          title: Acts
        sections:
          type: integer
          title: Sections
        passages:
          anyOf:
            - type: integer
            - type: 'null'
          title: Passages
          description: Live passage count where a facet reported one.
      type: object
      required:
        - code
        - acts
        - sections
      title: JurisdictionCoverage
      description: >-
        Acts and sections held for one jurisdiction, in the unit a lawyer thinks
        in.


        Passage counts answer "how big is the index"; act and section counts
        answer

        "how much law do you hold". Only the second is a question anyone asks.
    CategoryLegend:
      properties:
        value:
          type: string
          title: Value
        meaning:
          type: string
          title: Meaning
      type: object
      required:
        - value
        - meaning
      title: CategoryLegend
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: vq_key_*
      description: >-
        API key issued from the developer dashboard. Pass as `Authorization:
        Bearer vq_key_...`

````