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

# Resolve a citation to a provision

> Turn a citation a lawyer would type into the provision it names.

**Cost: 2 credits.** A malformed citation is a 422 and is NOT charged. Every
other outcome is, including `not_found`: a confident negative is the answer.

Accepts what Indian practice actually writes, not what a style guide prescribes.
Three published standards exist and they disagree about element order, while the
most common real form, `u/s 302 IPC`, appears in none of them. So order does not
matter, and all of these work:

    u/s 302 IPC
    Section 302 of the Indian Penal Code, 1860
    s.302 IPC
    S. 376(2)(g), IPC
    clause (a) of sub-section (1) of section 302 IPC
    O. 39 R. 1 CPC
    Art. 21 of the Constitution
    Regulation 24 of the SEBI (LODR) Regulations, 2015
    Maharashtra Act No. LXXVII of 2018

🔴 **Read `status` before reading `candidates`.** `ambiguous` is a real answer
and it is charged, because narrowing a citation to two named enactments is the
work. The commonest cause is the 2023 recodification: after 1 July 2024,
`s. 302` names both IPC 302 (murder) and BNS 302 (uttering words to wound
religious feelings), while BNS 103 is murder. Both codes are live law
simultaneously for the lifetime of pending trials, so this endpoint will not
choose for you. Send `asAtDate` and it will.

`r/w` ("read with") is split into separate citations and each is resolved.



## OpenAPI

````yaml https://api.vaquill.ai/in/openapi.json get /api/v1/in/acts/resolve
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/resolve:
    get:
      tags:
        - Indian Acts & Legislation
      summary: Resolve a citation to a provision
      description: >-
        Turn a citation a lawyer would type into the provision it names.


        **Cost: 2 credits.** A malformed citation is a 422 and is NOT charged.
        Every

        other outcome is, including `not_found`: a confident negative is the
        answer.


        Accepts what Indian practice actually writes, not what a style guide
        prescribes.

        Three published standards exist and they disagree about element order,
        while the

        most common real form, `u/s 302 IPC`, appears in none of them. So order
        does not

        matter, and all of these work:

            u/s 302 IPC
            Section 302 of the Indian Penal Code, 1860
            s.302 IPC
            S. 376(2)(g), IPC
            clause (a) of sub-section (1) of section 302 IPC
            O. 39 R. 1 CPC
            Art. 21 of the Constitution
            Regulation 24 of the SEBI (LODR) Regulations, 2015
            Maharashtra Act No. LXXVII of 2018

        🔴 **Read `status` before reading `candidates`.** `ambiguous` is a real
        answer

        and it is charged, because narrowing a citation to two named enactments
        is the

        work. The commonest cause is the 2023 recodification: after 1 July 2024,

        `s. 302` names both IPC 302 (murder) and BNS 302 (uttering words to
        wound

        religious feelings), while BNS 103 is murder. Both codes are live law

        simultaneously for the lifetime of pending trials, so this endpoint will
        not

        choose for you. Send `asAtDate` and it will.


        `r/w` ("read with") is split into separate citations and each is
        resolved.
      operationId: resolve_india_citation
      parameters:
        - name: cite
          in: query
          required: true
          schema:
            type: string
            minLength: 2
            maxLength: 200
            description: One citation string.
            examples:
              - u/s 302 IPC
            title: Cite
          description: One citation string.
        - name: state
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: Narrow to one jurisdiction.
            examples:
              - maharashtra
            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: Narrow to one jurisdiction.
        - name: asAtDate
          in: query
          required: false
          schema:
            anyOf:
              - type: string
              - type: 'null'
            description: Which side of the 2023 recodification you mean, as YYYY-MM-DD.
            examples:
              - '2019-05-01'
            title: Asatdate
          description: Which side of the 2023 recodification you mean, as YYYY-MM-DD.
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResolveResponse'
              example:
                results:
                  - input: u/s 302 IPC
                    status: ambiguous
                    candidates:
                      - actId: IND_central_20062
                        citation: The Bharatiya Nyaya Sanhita, 2023, s. 302
                        title: The Bharatiya Nyaya Sanhita, 2023
                        sectionNumber: '302'
                        sectionTitle: >-
                          Uttering words, etc., with deliberate intent to wound
                          religious feelings of any person
                        year: 2023
                        actStatus: in_force
                        category: central
                        state: central
                      - actId: IND_REP_659_1860
                        citation: >-
                          The Indian Penal Code, 45 of 1860 (Rep., Act 45 of
                          2023), s. 302
                        title: >-
                          The Indian Penal Code, 45 of 1860 (Rep., Act 45 of
                          2023)
                        sectionNumber: '302'
                        sectionTitle: >-
                          Punishment for murder . — Whoever commits murder shall
                          be punished with death, or 1[imprisonment for life],
                          and shall also be liable to fine
                        year: 1860
                        actStatus: in_force
                        category: central
                        state: central
                        note: >-
                          Replaced by the Bharatiya Nyaya Sanhita, 2023 with
                          effect from 1 July 2024, and still governs offences
                          committed before that date.
                    reason: >-
                      This citation matches 2 provisions across 2 enactments,
                      and picking one would be a guess. Both the pre-2024 code
                      and its 2023 replacement are live law for conduct on
                      either side of 1 July 2024; send `asAtDate` to narrow.
                      Send `state` or the act's year to narr…
                    parsed:
                      unit: section
                      section: '302'
                      subProvisions: []
                      actToken: IPC
                      pinpoint: '302'
                    duplicatesCollapsed: 2
                count: 1
                resolvedCount: 0
                meta:
                  processingTimeMs: 835.9
                  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'
        '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:
    ResolveResponse:
      properties:
        results:
          items:
            $ref: '#/components/schemas/ResolveItem'
          type: array
          title: Results
        count:
          type: integer
          title: Count
        resolvedCount:
          type: integer
          title: Resolvedcount
        meta:
          $ref: '#/components/schemas/Meta'
      type: object
      required:
        - results
        - count
        - resolvedCount
        - meta
      title: ResolveResponse
    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.
    ResolveItem:
      properties:
        input:
          type: string
          title: Input
        status:
          type: string
          title: Status
          description: >-
            `resolved` (exactly one provision), `ambiguous` (several, all
            returned), `not_found` (parsed cleanly, matched nothing), or
            `malformed` (could not be parsed, and NOT charged).
          examples:
            - ambiguous
        candidates:
          items:
            $ref: '#/components/schemas/ResolveCandidate'
          type: array
          title: Candidates
        reason:
          anyOf:
            - type: string
            - type: 'null'
          title: Reason
          description: Why the status is what it is. Always present unless resolved.
        parsed:
          $ref: '#/components/schemas/ParsedPinpoint'
        duplicatesCollapsed:
          type: integer
          title: Duplicatescollapsed
          description: >-
            Near-identical copies of an act folded into one candidate. The
            corpus holds several copies of some enactments, which is a known
            ingest defect: published rather than hidden, so a single candidate
            does not conceal that three other records sat behind it.
          default: 0
      type: object
      required:
        - input
        - status
        - parsed
      title: ResolveItem
    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
    ResolveCandidate:
      properties:
        actId:
          type: string
          title: Actid
        citation:
          anyOf:
            - type: string
            - type: 'null'
          title: Citation
        title:
          anyOf:
            - type: string
            - type: 'null'
          title: Title
        sectionNumber:
          anyOf:
            - type: string
            - type: 'null'
          title: Sectionnumber
        sectionTitle:
          anyOf:
            - type: string
            - type: 'null'
          title: Sectiontitle
        year:
          anyOf:
            - type: integer
            - type: 'null'
          title: Year
        actStatus:
          anyOf:
            - type: string
            - type: 'null'
          title: Actstatus
        category:
          anyOf:
            - type: string
            - type: 'null'
          title: Category
        state:
          anyOf:
            - type: string
            - type: 'null'
          title: State
        note:
          anyOf:
            - type: string
            - type: 'null'
          title: Note
          description: Why this candidate is in the list, when that needs saying.
      type: object
      required:
        - actId
      title: ResolveCandidate
    ParsedPinpoint:
      properties:
        unit:
          anyOf:
            - type: string
            - type: 'null'
          title: Unit
        section:
          anyOf:
            - type: string
            - type: 'null'
          title: Section
        subProvisions:
          items:
            type: string
          type: array
          title: Subprovisions
        actToken:
          anyOf:
            - type: string
            - type: 'null'
          title: Acttoken
        actNumber:
          anyOf:
            - type: string
            - type: 'null'
          title: Actnumber
        year:
          anyOf:
            - type: integer
            - type: 'null'
          title: Year
        pinpoint:
          anyOf:
            - type: string
            - type: 'null'
          title: Pinpoint
          description: The provision as one canonical string, e.g. `302(1)(a)`.
      type: object
      title: ParsedPinpoint
      description: What we read out of the citation, so a caller can see our reading.
  securitySchemes:
    ApiKeyAuth:
      type: http
      scheme: bearer
      bearerFormat: vq_key_*
      description: >-
        API key issued from the developer dashboard. Pass as `Authorization:
        Bearer vq_key_...`

````