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

# One provision, as a resource

> A single provision with its citation, its position in the act, the structural
features its text carries, and what it points at.

**Cost: 2 credits.**

This does not return the provision's text. `GET /acts/{actId}/sections/{n}/body`
does, and is priced separately because it reads the act document.

`wordCount` is summed across every passage of the provision. `actsReferenced`
is whitespace-normalised before deduplication, because the publisher's line
breaks otherwise make one cited act look like two.



## OpenAPI

````yaml https://api.vaquill.ai/in/openapi.json get /api/v1/in/acts/{act_id}/sections/{section_number}
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/{act_id}/sections/{section_number}:
    get:
      tags:
        - Indian Acts & Legislation
      summary: One provision, as a resource
      description: >-
        A single provision with its citation, its position in the act, the
        structural

        features its text carries, and what it points at.


        **Cost: 2 credits.**


        This does not return the provision's text. `GET
        /acts/{actId}/sections/{n}/body`

        does, and is priced separately because it reads the act document.


        `wordCount` is summed across every passage of the provision.
        `actsReferenced`

        is whitespace-normalised before deduplication, because the publisher's
        line

        breaks otherwise make one cited act look like two.
      operationId: get_act_section_api_v1_in_acts__act_id__sections__section_number__get
      parameters:
        - name: act_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 200
            pattern: ^[a-zA-Z0-9_-]+$
            description: Act identifier, as returned by search, /list or /resolve.
            examples:
              - IND_state_20326
            title: Act Id
          description: Act identifier, as returned by search, /list or /resolve.
        - name: section_number
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 40
            pattern: ^[A-Za-z0-9().\- ]{1,40}$
            description: >-
              Section number exactly as the publisher writes it. Alphanumeric
              suffixes are part of the number, not a sub-provision: `498A` is
              one section, not section 498 clause A.
            examples:
              - '23'
            title: Section Number
          description: >-
            Section number exactly as the publisher writes it. Alphanumeric
            suffixes are part of the number, not a sub-provision: `498A` is one
            section, not section 498 clause A.
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActSectionResponse'
              example:
                section:
                  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
                  ministry: Govt of Maharashtra
                  actStatus: in_force
                  sectionStatus: in_force
                  provisionType: overriding
                  sectionType: section
                  legalSubject:
                    - tax_law
                  isSubordinate: false
                  goodLawStatus: good_law
                  amendmentCount: 44
                  lastAmendedYear: 2019
                  lastAmendedDate: '2019-03-06'
                  amendmentYears:
                    - 2005
                    - 2006
                  sectionsReferenced:
                    - '21'
                    - '20'
                  wordCount: 4449
                  shape:
                    hasProviso: true
                    hasExplanation: false
                    hasIllustration: false
                    hasNonObstante: true
                    hasSavingClause: false
                    hasPenalty: false
                  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.
                  provenance:
                    sourceUrl: https://indiacode.gov.in/handle/123456789/568111
                    textUrl: >-
                      https://acts-india.vaquill.ai/IND_state_20326/act.normalized.txt
                    pdfUrl: https://acts-india.vaquill.ai/IND_state_20326/act.pdf
                meta:
                  processingTimeMs: 367.4
                  creditsConsumed: 2
        '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: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
        '429':
          description: Rate limited
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
components:
  schemas:
    ActSectionResponse:
      properties:
        section:
          $ref: '#/components/schemas/ActSection'
        meta:
          $ref: '#/components/schemas/Meta'
      type: object
      required:
        - section
        - meta
      title: ActSectionResponse
    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.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    ActSection:
      properties:
        actId:
          type: string
          title: Actid
        title:
          anyOf:
            - type: string
            - type: 'null'
          title: Title
        sectionNumber:
          anyOf:
            - type: string
            - type: 'null'
          title: Sectionnumber
        sectionTitle:
          anyOf:
            - type: string
            - type: 'null'
          title: Sectiontitle
        subSection:
          anyOf:
            - type: string
            - type: 'null'
          title: Subsection
          description: The sub-provision marker this passage sits under, e.g. `(8)`.
          examples:
            - (2)
        titleRegional:
          anyOf:
            - type: string
            - type: 'null'
          title: Titleregional
          description: >-
            The instrument's title in its regional language, where the publisher
            gives one. Held for about 3% of the corpus.
        chapter:
          anyOf:
            - type: string
            - type: 'null'
          title: Chapter
        chapterTitle:
          anyOf:
            - type: string
            - type: 'null'
          title: Chaptertitle
        part:
          anyOf:
            - type: string
            - type: 'null'
          title: Part
        partTitle:
          anyOf:
            - type: string
            - type: 'null'
          title: Parttitle
        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
        ministry:
          anyOf:
            - type: string
            - type: 'null'
          title: Ministry
        actStatus:
          anyOf:
            - type: string
            - type: 'null'
          title: Actstatus
        sectionStatus:
          anyOf:
            - type: string
            - type: 'null'
          title: Sectionstatus
        provisionType:
          anyOf:
            - type: string
            - type: 'null'
          title: Provisiontype
        sectionType:
          anyOf:
            - type: string
            - type: 'null'
          title: Sectiontype
        legalSubject:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Legalsubject
        isSubordinate:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Issubordinate
        parent:
          anyOf:
            - $ref: '#/components/schemas/ParentAct'
            - type: 'null'
          description: >-
            For a subordinate instrument, the act it was made under. We serve
            37,013 such instruments and, before this, no way to walk up to the
            parent.
        goodLawStatus:
          anyOf:
            - type: string
            - type: 'null'
          title: Goodlawstatus
          description: >-
            Derived currency verdict for the ACT this provision belongs to:
            `good_law`, `not_good_law` or `unknown`. See GET
            /acts/{actId}/status for the reason and the underlying claims.
          examples:
            - good_law
        amendmentCount:
          anyOf:
            - type: integer
            - type: 'null'
          title: Amendmentcount
          description: >-
            The publisher's own amendment count for this provision. ⚠️ It does
            NOT always agree with what we hold: measured corpus-wide, 840 of
            1,901 acts (44.2%) carry a non-zero count with no parseable
            amendment record behind it. Read GET
            /acts/{actId}/sections/{n}/history for the events we actually hold,
            and its `coverage` block for the difference.
        lastAmendedYear:
          anyOf:
            - type: integer
            - type: 'null'
          title: Lastamendedyear
        lastAmendedDate:
          anyOf:
            - type: string
            - type: 'null'
          title: Lastamendeddate
        amendmentYears:
          anyOf:
            - items:
                type: integer
              type: array
            - type: 'null'
          title: Amendmentyears
          description: Distinct years in which this provision was amended.
        limitationPeriods:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Limitationperiods
          description: >-
            Time limits stated in the provision's own text, e.g. `90 days`.
            Extracted, not adjudicated: read the text before relying on one.
        effectiveDates:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Effectivedates
          description: Dates the provision's text names as taking effect.
        definedTerms:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Definedterms
        actsReferenced:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Actsreferenced
        sectionsReferenced:
          anyOf:
            - items:
                type: string
              type: array
            - type: 'null'
          title: Sectionsreferenced
        wordCount:
          anyOf:
            - type: integer
            - type: 'null'
          title: Wordcount
          description: >-
            Summed across every passage of this provision. The stored field is
            per passage, so one passage's value would understate a long section.
        shape:
          $ref: '#/components/schemas/SectionShape'
        citation:
          $ref: '#/components/schemas/Citation'
        provenance:
          $ref: '#/components/schemas/Provenance'
      type: object
      required:
        - actId
        - shape
        - citation
        - provenance
      title: ActSection
    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
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
    ParentAct:
      properties:
        name:
          type: string
          title: Name
          description: The parent act's title, as the publisher records it.
        actId:
          anyOf:
            - type: string
            - type: 'null'
          title: Actid
          description: >-
            Resolved parent, when its title matches an act we serve. Null
            otherwise.
        matchBasis:
          type: string
          title: Matchbasis
          description: >-
            How the link was made. `parent_act_name` means an exact title match,
            which resolves for about 85.8% of instruments carrying a parent
            name.
          default: parent_act_name
        resolved:
          type: boolean
          title: Resolved
          description: False when the publisher names a parent we do not hold.
      type: object
      required:
        - name
        - resolved
      title: ParentAct
      description: >-
        The act a subordinate instrument was made under, and how to fetch it.


        🔴 Resolved by TITLE, not by `parent_act_id`. All 35,502 stored

        `parent_act_id` values are India Code's own opaque ids and none of them
        is

        an `act_id` in this corpus, so the obvious join resolves nothing. The

        indexed `parent_act_name` matches a served act title on 85.8% of the
        27,318

        acts that carry one, and `matchBasis` says so on every response rather
        than

        letting a caller assume a hard link.
    SectionShape:
      properties:
        hasProviso:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Hasproviso
        hasExplanation:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Hasexplanation
        hasIllustration:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Hasillustration
        hasNonObstante:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Hasnonobstante
        hasSavingClause:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Hassavingclause
        hasPenalty:
          anyOf:
            - type: boolean
            - type: 'null'
          title: Haspenalty
      type: object
      title: SectionShape
      description: Structural flags the publisher's text carries, on 100% of passages.
    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.
    Provenance:
      properties:
        sourceUrl:
          anyOf:
            - type: string
            - type: 'null'
          title: Sourceurl
          description: The publisher's own page for this document, when it resolves.
        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'.
        textUrl:
          anyOf:
            - type: string
            - type: 'null'
          title: Texturl
        pdfUrl:
          anyOf:
            - type: string
            - type: 'null'
          title: Pdfurl
      type: object
      title: Provenance
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: vq_key_*
      description: >-
        API key issued from the developer dashboard. Pass as `Authorization:
        Bearer vq_key_...`

````