> ## 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 up to 50 citations

> The same resolver over a list, for when you would otherwise loop.

**Cost: 2 credits per DISTINCT citation.** Batching buys a round trip, never a
discount. Duplicates are collapsed before pricing, so sending the same citation
twice is charged once. Each citation is refunded individually when we fail on
it; one citation failing never refunds or voids the others.

Up to 50 distinct citations, and up to 500 before deduplication. Unknown fields
on the body are refused rather than ignored.



## OpenAPI

````yaml https://api.vaquill.ai/in/openapi.json post /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:
    post:
      tags:
        - Indian Acts & Legislation
      summary: Resolve up to 50 citations
      description: >-
        The same resolver over a list, for when you would otherwise loop.


        **Cost: 2 credits per DISTINCT citation.** Batching buys a round trip,
        never a

        discount. Duplicates are collapsed before pricing, so sending the same
        citation

        twice is charged once. Each citation is refunded individually when we
        fail on

        it; one citation failing never refunds or voids the others.


        Up to 50 distinct citations, and up to 500 before deduplication. Unknown
        fields

        on the body are refused rather than ignored.
      operationId: resolve_india_citations_batch
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ResolveBatchRequest'
      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:
    ResolveBatchRequest:
      properties:
        citations:
          items:
            type: string
          type: array
          minItems: 1
          title: Citations
          description: Citation strings, as a lawyer would type them.
          examples:
            - - u/s 302 IPC
              - Section 138 of the Negotiable Instruments Act
              - Art. 21 Constitution
        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: Narrow to one jurisdiction. Required for a State-universal title.
          examples:
            - maharashtra
        asAtDate:
          anyOf:
            - type: string
            - type: 'null'
          title: Asatdate
          description: >-
            The date the conduct or document belongs to, as YYYY-MM-DD. This is
            how a caller says which side of the 2023 recodification they mean:
            without it, a criminal section number resolves to BOTH the old code
            and its replacement, because both are live law.
          examples:
            - '2019-05-01'
      additionalProperties: false
      type: object
      required:
        - citations
      title: ResolveBatchRequest
      description: Up to 50 citations, priced per citation.
    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_...`

````