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

# Every recorded amendment to one provision

> The amendment record for a single provision: what changed, which Act changed it,
which of that Act's sections did so, when it took effect where the publisher
records a date, and the wording it replaced where the publisher quotes it.

**Cost: 2 credits.** An empty history for a provision we hold IS the answer and
is charged; the `coverage` block tells you whether it is empty because nothing
changed or because we hold no parsed record.

**Read `appliedStatus` on every event.** It is `not_applied` throughout, because
the text this API serves is the publisher's published text and we do not edit
it. That is a deliberate, stated position rather than an omission: you should
never have to infer currency from silence.

**`asOf` returns a TIMELINE, not text.** We hold amendment events and no
versioned text, so there is no honest way to render this provision as it stood
on a date. Passing `asOf` tells you how many recorded amendments had taken
effect by then, how many had not, and how many carry no date at all. `isBounded`
true means we hold no recorded event affecting that date, which is not the same
as there having been none.

Coverage is real and uneven. Across the corpus, 1,061 acts carry parsed
amendment records and a further 840 carry a non-zero amendment count with no
parseable footnote behind it. Of 32,808 records held, 52.8% carry an effective
date and 35.3% quote the original wording.



## OpenAPI

````yaml https://api.vaquill.ai/in/openapi.json get /api/v1/in/acts/{act_id}/sections/{section_number}/history
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}/history:
    get:
      tags:
        - Indian Acts & Legislation
      summary: Every recorded amendment to one provision
      description: >-
        The amendment record for a single provision: what changed, which Act
        changed it,

        which of that Act's sections did so, when it took effect where the
        publisher

        records a date, and the wording it replaced where the publisher quotes
        it.


        **Cost: 2 credits.** An empty history for a provision we hold IS the
        answer and

        is charged; the `coverage` block tells you whether it is empty because
        nothing

        changed or because we hold no parsed record.


        **Read `appliedStatus` on every event.** It is `not_applied` throughout,
        because

        the text this API serves is the publisher's published text and we do not
        edit

        it. That is a deliberate, stated position rather than an omission: you
        should

        never have to infer currency from silence.


        **`asOf` returns a TIMELINE, not text.** We hold amendment events and no

        versioned text, so there is no honest way to render this provision as it
        stood

        on a date. Passing `asOf` tells you how many recorded amendments had
        taken

        effect by then, how many had not, and how many carry no date at all.
        `isBounded`

        true means we hold no recorded event affecting that date, which is not
        the same

        as there having been none.


        Coverage is real and uneven. Across the corpus, 1,061 acts carry parsed

        amendment records and a further 840 carry a non-zero amendment count
        with no

        parseable footnote behind it. Of 32,808 records held, 52.8% carry an
        effective

        date and 35.3% quote the original wording.
      operationId: >-
        get_section_history_api_v1_in_acts__act_id__sections__section_number__history_get
      parameters:
        - name: act_id
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 200
            pattern: ^[a-zA-Z0-9_-]+$
            examples:
              - IND_state_20326
            title: Act Id
        - name: section_number
          in: path
          required: true
          schema:
            type: string
            minLength: 1
            maxLength: 40
            pattern: ^[A-Za-z0-9().\- ]{1,40}$
            examples:
              - '23'
            title: Section Number
        - name: limit
          in: query
          required: false
          schema:
            type: integer
            maximum: 500
            minimum: 1
            description: Events per page.
            examples:
              - 50
            default: 100
            title: Limit
          description: Events per page.
        - name: offset
          in: query
          required: false
          schema:
            type: integer
            minimum: 0
            description: Zero-based offset.
            examples:
              - 0
            default: 0
            title: Offset
          description: Zero-based offset.
        - name: asOf
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: >-
              Split the recorded amendments around a date (YYYY-MM-DD). Returns
              a timeline, never reconstructed text.
            examples:
              - '2019-03-12'
            title: Asof
          description: >-
            Split the recorded amendments around a date (YYYY-MM-DD). Returns a
            timeline, never reconstructed text.
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ActSectionHistoryResponse'
              example:
                actId: IND_state_20326
                sectionNumber: '23'
                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.
                events:
                  - effectId: AMD_14b4a64b60_0013
                    action: substituted
                    amendingAct: Mah. 6 of 2011
                    amendingActKind: state_act
                    amendingActYear: 2011
                    amendingSection: '3'
                    effectiveDate: '2005-04-01'
                    effectiveDateSource: publisher
                    originalText: four years
                    publisherNote: >-
                      These words were substituted for the words "four years" by
                      Mah. 6 of 2011, s. 3(b)(ii), w.e.f. 1st April 2005.
                    appliedStatus: not_applied
                    appliedNote: >-
                      The text this API serves is the publisher's published
                      text. We do not edit it, so this amendment is not applied
                      to it.
                  - effectId: AMD_0421a7f328_0015
                    action: substituted
                    amendingAct: Mah. 6 of 2011
                    amendingActKind: state_act
                    amendingActYear: 2011
                    amendingSection: '3'
                    effectiveDate: '2005-04-01'
                    effectiveDateSource: publisher
                    publisherNote: >-
                      Sub-section (3A) was substituted by Mah. 6 of 2011, w.e.f.
                      1st April 2005, s. 3(c).
                    appliedStatus: not_applied
                    appliedNote: >-
                      The text this API serves is the publisher's published
                      text. We do not edit it, so this amendment is not applied
                      to it.
                total: 43
                hasMore: false
                offset: 0
                coverage:
                  publisherClaimsAmendments: true
                  structuredEventsHeld: 43
                  eventsWithDate: 9
                meta:
                  processingTimeMs: 597.2
                  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: Malformed request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
        '429':
          description: Rate limited
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ApiDetailError'
components:
  schemas:
    ActSectionHistoryResponse:
      properties:
        actId:
          type: string
          title: Actid
        sectionNumber:
          anyOf:
            - type: string
            - type: 'null'
          title: Sectionnumber
        citation:
          $ref: '#/components/schemas/Citation'
        events:
          items:
            $ref: '#/components/schemas/AmendmentEvent'
          type: array
          title: Events
        total:
          type: integer
          title: Total
          description: Events on THIS page.
        hasMore:
          type: boolean
          title: Hasmore
          description: >-
            True when more events exist beyond this page. The list was
            previously unbounded by contract: bounded in practice, but with
            nothing telling a caller so.
          default: false
        offset:
          type: integer
          title: Offset
          description: Zero-based offset of this page.
          default: 0
        coverage:
          $ref: '#/components/schemas/HistoryCoverage'
        asOf:
          anyOf:
            - $ref: '#/components/schemas/AsOfAnswer'
            - type: 'null'
        meta:
          $ref: '#/components/schemas/Meta'
      type: object
      required:
        - actId
        - citation
        - events
        - total
        - coverage
        - meta
      title: ActSectionHistoryResponse
    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.
    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.
    AmendmentEvent:
      properties:
        effectId:
          type: string
          title: Effectid
          description: >-
            Stable identifier for this recorded effect, so a change can be cited
            and diffed rather than only read.
        action:
          anyOf:
            - type: string
            - type: 'null'
          title: Action
        amendingAct:
          anyOf:
            - type: string
            - type: 'null'
          title: Amendingact
        amendingActKind:
          anyOf:
            - type: string
            - type: 'null'
          title: Amendingactkind
        amendingActYear:
          anyOf:
            - type: integer
            - type: 'null'
          title: Amendingactyear
        amendingSection:
          anyOf:
            - type: string
            - type: 'null'
          title: Amendingsection
        effectiveDate:
          anyOf:
            - type: string
            - type: 'null'
          title: Effectivedate
          description: ISO date the amendment took effect, where the publisher records one.
        effectiveDateSource:
          type: string
          title: Effectivedatesource
          description: >-
            `publisher` when a date is recorded, `not_recorded` when it is not.
            Measured over all 32,808 held records, 52.83% carry a date, so an
            absent date is ordinary and is named rather than nulled.
        originalText:
          anyOf:
            - type: string
            - type: 'null'
          title: Originaltext
          description: >-
            The wording replaced, quoted by the publisher. Present on 35.26% of
            records.
        publisherNote:
          anyOf:
            - type: string
            - type: 'null'
          title: Publishernote
        appliedStatus:
          type: string
          title: Appliedstatus
          description: >-
            Whether this amendment is reflected in the text we serve: `applied`,
            `not_applied` or `unknown`. Today it is `not_applied` on every
            record, because we serve the publisher's text as published and do
            not edit it. The field exists so that a consumer never has to infer
            currency from silence.
        appliedNote:
          anyOf:
            - type: string
            - type: 'null'
          title: Appliednote
      type: object
      required:
        - effectId
        - effectiveDateSource
        - appliedStatus
      title: AmendmentEvent
    HistoryCoverage:
      properties:
        publisherClaimsAmendments:
          type: boolean
          title: Publisherclaimsamendments
        structuredEventsHeld:
          type: integer
          title: Structuredeventsheld
        eventsWithDate:
          type: integer
          title: Eventswithdate
        note:
          anyOf:
            - type: string
            - type: 'null'
          title: Note
      type: object
      required:
        - publisherClaimsAmendments
        - structuredEventsHeld
        - eventsWithDate
      title: HistoryCoverage
    AsOfAnswer:
      properties:
        requested:
          type: string
          title: Requested
        inForceByDate:
          type: integer
          title: Inforcebydate
        afterDate:
          type: integer
          title: Afterdate
        undated:
          type: integer
          title: Undated
        textReflectsEvents:
          type: integer
          title: Textreflectsevents
          description: >-
            How many of these events the served text incorporates. Currently
            always 0.
          default: 0
        isBounded:
          type: boolean
          title: Isbounded
          description: >-
            True means we hold no recorded event affecting this date, which is
            NOT the same as there having been none. Amendment capture is
            per-publisher and began long after the law did.
        note:
          type: string
          title: Note
      type: object
      required:
        - requested
        - inForceByDate
        - afterDate
        - undated
        - isBounded
        - note
      title: AsOfAnswer
      description: >-
        A dated question answered with a TIMELINE, never with reconstructed
        text.


        We hold amendment EVENTS and no versioned text, so there is no honest
        way

        to render this provision as it stood on a date. Returning current text

        under a date parameter would be a wrong answer shaped like a right one.
    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
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: vq_key_*
      description: >-
        API key issued from the developer dashboard. Pass as `Authorization:
        Bearer vq_key_...`

````