openapi: 3.2.0 info: title: Vaquill Ai Indian Acts and Legislation API 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 description: 'Operations tagged Indian Acts and Legislation across 2 of this provider''s published API definitions: vaquill-ai-india-openapi.json, vaquill-ai-india-openapi.yml. Each path carries the servers of the definition it was published in.' servers: - url: https://api.vaquill.ai description: Production security: - ApiKeyAuth: [] - ApiKeyHeader: [] - ApiKeyQuery: [] tags: - name: Indian Acts and Legislation paths: /api/v1/in/acts/search: post: tags: - Indian Acts and Legislation summary: Search Indian legislation description: 'Search every Indian act, regulation and item of legislation we serve. `GET /acts/filters` is free and carries the live section count behind each category, state and department. **Authentication**: API key via `Authorization: Bearer vq_key_...` **Cost**: 2 credits Returns relevant act sections with full metadata: category, state, department, provision type, legal subject, acts referenced, enactment date, and more. Filter by category (central, state, regulatory), state, department, and year range.' operationId: search_acts_api_v1_in_acts_search_post requestBody: content: application/json: schema: $ref: '#/components/schemas/ActSearchRequest' required: true responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActSearchResponse' example: data: results: - 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 jurisdiction: state actStatus: in_force provisionType: overriding legalSubject: - tax_law content: 'Act: The Maharashtra Value Added Tax Act, 2002. (Act 9 of 2002) | India | State | In Force Chapter V: RETURNS AND ASSESSMENT, ETC. | Section 23: Assessment ( _2_ )[1] [Where the return in respect of any period] is filed by a registered dealer, by the prescri…' enactmentDate: '2005-03-09' enactmentDateRaw: 9-Mar-2005 pdfUrl: https://acts-india.vaquill.ai/IND_state_20326/act.pdf textUrl: https://acts-india.vaquill.ai/IND_state_20326/act.normalized.txt sourceUrl: https://indiacode.gov.in/handle/123456789/568111 relevanceScore: 0.8555 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. - actId: IND_state_20326 title: The Maharashtra Value Added Tax Act, 2002. sectionNumber: '20' sectionTitle: Returns and self-assessment chapter: V chapterTitle: RETURNS AND ASSESSMENT, ETC. year: 2002 category: state state: maharashtra department: Finance Department jurisdiction: state actStatus: in_force provisionType: overriding legalSubject: - tax_law content: 'Act: The Maharashtra Value Added Tax Act, 2002. (Act 9 of 2002) | India | State | In Force Chapter V: RETURNS AND ASSESSMENT, ETC. | Section 20: Returns and self-assessment CHAPTER V RETURNS AND ASSESSMENT, ETC. > 3[20. Returns and self-assessment.— ( _1_ …' enactmentDate: '2005-03-09' enactmentDateRaw: 9-Mar-2005 pdfUrl: https://acts-india.vaquill.ai/IND_state_20326/act.pdf textUrl: https://acts-india.vaquill.ai/IND_state_20326/act.normalized.txt sourceUrl: https://indiacode.gov.in/handle/123456789/568111 relevanceScore: 0.7734 citation: citation: The Maharashtra Value Added Tax Act, 2002., s. 20 citationShort: Maharashtra Value Added Tax Act, 2002., s. 20 displayPath: The Maharashtra Value Added Tax Act, 2002. / Part. RETURNS AND ASSESSMENT, ETC. / Chapter V. RETURNS AND ASSESSMENT, ETC. / s. 20 breadcrumb: - type: part label: Part name: RETURNS AND ASSESSMENT, ETC. - type: chapter num: V label: Chapter V name: RETURNS AND ASSESSMENT, ETC. totalReturned: 3 meta: processingTimeMs: 3405.0 creditsConsumed: 2.0 creditsRemaining: 84864.0 page: 1 pageSize: 3 total: 79320 totalPages: 34 '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 or unknown request field content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' '429': description: Rate limited content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' servers: - url: https://api.vaquill.ai description: Production /api/v1/in/acts/filters: get: tags: - Indian Acts and Legislation summary: Discover valid filter values description: 'List every value accepted by the `category`, `state`, and `department` filters on `POST /acts/search`, with the number of sections behind each. **Authentication**: API key via `Authorization: Bearer vq_key_...` **Cost**: free. Values are lowercase and hyphenated (`madhya-pradesh`, `law-commission`). `POST /acts/search` rejects anything not listed here with HTTP 422, so read this rather than guessing. Counts are read from the corpus and refresh as ingest runs land, so treat the list as live rather than caching it in your app. The remaining filters are small enough to publish in full, so their values are listed in this document rather than here: `actStatus`, `provisionType`, `sectionType` and `legalSubject` each carry their own `enum`. Those are enforced the same way, and an unrecognised value is a 422 that costs no credits, never an empty page you are charged for.' operationId: list_act_filters_api_v1_in_acts_filters_get responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActFiltersResponse' example: data: categories: - value: state count: 1219846 - value: central count: 686388 states: - value: central count: 703310 - value: chhattisgarh count: 93069 departments: - value: sebi count: 130384 - value: moefcc count: 120426 truncated: - department meta: processingTimeMs: 1282.1 creditsConsumed: 0.0 '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 or unknown request field content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' '429': description: Rate limited content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' servers: - url: https://api.vaquill.ai description: Production /api/v1/in/acts/{act_id}/text: get: tags: - Indian Acts and Legislation summary: Get act text URLs description: 'Get URLs for the full text, PDF, and HTML versions of an act. **Authentication**: API key via `Authorization: Bearer vq_key_...` **Cost**: 3 credits' operationId: get_act_text_api_v1_in_acts__act_id__text_get parameters: - name: act_id in: path required: true schema: type: string minLength: 1 maxLength: 200 pattern: ^[^/\\\x00-\x1f]+$ 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. responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActTextResponse' example: actId: IND_state_20326 title: The Maharashtra Value Added Tax Act, 2002. year: 2002 category: state textUrl: https://acts-india.vaquill.ai/IND_state_20326/act.normalized.txt pdfUrl: https://acts-india.vaquill.ai/IND_state_20326/act.pdf htmlUrl: https://acts-india.vaquill.ai/IND_state_20326/act.html chunksCount: 345 isSubordinate: false issuedDate: '2005-03-09' meta: processingTimeMs: 246.3 creditsConsumed: 3.0 currencyStatus: repeal_tracked '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 or unknown request field content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' '429': description: Rate limited content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' servers: - url: https://api.vaquill.ai description: Production /api/v1/in/acts/{act_id}/amendments: get: tags: - Indian Acts and Legislation summary: Get amendment history description: 'Get the amendment history (footnotes) for an act. **Authentication**: API key via `Authorization: Bearer vq_key_...` **Cost**: 5 credits Returns footnotes including substitutions, insertions, omissions, and notes. Paginated — max 200 per request.' operationId: get_act_amendments_api_v1_in_acts__act_id__amendments_get parameters: - name: act_id in: path required: true schema: type: string minLength: 1 maxLength: 200 pattern: ^[^/\\\x00-\x1f]+$ description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' examples: - IND_state_20326 title: Act Id description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' - name: section in: query required: false schema: anyOf: - type: string maxLength: 40 pattern: ^[A-Za-z0-9().\- ]{1,40}$ - type: 'null' description: 'Keep only footnotes attached to this section, written exactly as the publisher does. Alphanumeric suffixes are part of the number, not a sub-provision: `498A` is one section, not section 498 clause A.' examples: - '23' title: Section description: 'Keep only footnotes attached to this section, written exactly as the publisher does. Alphanumeric suffixes are part of the number, not a sub-provision: `498A` is one section, not section 498 clause A.' - name: type in: query required: false schema: anyOf: - type: string enum: - substitution - insertion - omission - renumbering - addition - repeal - deletion - adaptation - amendment - note - type: 'null' description: 'Amendment action class. Served in the NOMINAL spelling; the corpus stores the verbal form (`substituted`) and either is accepted. Values: `substitution`, `insertion`, `omission`, `renumbering`, `addition`, `repeal`, `deletion`, `adaptation`, `amendment`, `note`.' examples: - substitution title: Type description: 'Amendment action class. Served in the NOMINAL spelling; the corpus stores the verbal form (`substituted`) and either is accepted. Values: `substitution`, `insertion`, `omission`, `renumbering`, `addition`, `repeal`, `deletion`, `adaptation`, `amendment`, `note`.' - name: page in: query required: false schema: type: integer minimum: 1 description: 1-based page number. examples: - 1 default: 1 title: Page description: 1-based page number. - name: pageSize in: query required: false schema: type: integer maximum: 200 minimum: 1 description: Results per page (1-200). examples: - 100 default: 100 title: Pagesize description: Results per page (1-200). responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActAmendmentsResponse' example: actId: IND_state_20326 title: The Maharashtra Value Added Tax Act, 2002. totalFootnotes: 3 footnotes: - sectionNumber: '1' sectionTitle: Short title, extent and commencement footnoteId: 1 footnoteText: This sub-section was substituted by Mah. 14 of 2005, s. 2. footnoteType: substitution byAct: Mah. 14 of 2005 - sectionNumber: '10' sectionTitle: Sales Tax Authorities footnoteId: 1 footnoteText: These words were substituted for the words "State Government may appoint" by Mah. 8 of 2021, s. 22(1). footnoteType: substitution byAct: Mah. 8 of 2021 originalText: State Government may appoint typeCounts: substitution: 3 page: 1 pageSize: 3 hasMore: true meta: processingTimeMs: 448.9 creditsConsumed: 5.0 '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 or unknown request field content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' '429': description: Rate limited content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' servers: - url: https://api.vaquill.ai description: Production /api/v1/in/acts/list: get: tags: - Indian Acts and Legislation summary: Browse and discover acts description: 'Browse Indian acts, regulations and legislation with filters. Use this endpoint to **discover act IDs** for the other routes here. It enumerates **every served act** and pages over a total order, so walking the offsets returns each act exactly once with a `total` that does not move underneath you. Read that `total` for how many there are. The listing is a dated **snapshot**, rebuilt on the ingest cadence. An act ingested after that build is served by `POST /acts/search` and the act routes before it appears here; every response states the build date in `note`. If the index is ever unavailable the response falls back to a smaller legacy listing and says so, prefixed `DEGRADED:`, rather than quietly returning less. **Authentication**: API key via `Authorization: Bearer vq_key_...` **Cost**: 1 credit Filter by category (central, state, regulatory, repealed, spent), state, department, year range, and act status. Sort by year or title. Rows carry `sectionCount` and `citation`, so a caller can size and cite an act without a second request.' operationId: list_acts_api_v1_in_acts_list_get parameters: - name: category in: query required: false schema: anyOf: - type: string enum: - central - state - regulatory - repealed - spent - type: 'null' description: 'Jurisdictional class of the instrument. `repealed` and `spent` are accepted for backward compatibility and resolve against the act''s status instead. Values: `central`, `state`, `regulatory`, `repealed`, `spent`.' examples: - central title: Category description: 'Jurisdictional class of the instrument. `repealed` and `spent` are accepted for backward compatibility and resolve against the act''s status instead. Values: `central`, `state`, `regulatory`, `repealed`, `spent`.' - name: state in: query required: false schema: anyOf: - type: string 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 - type: 'null' description: Jurisdiction slug. `central` is a value here, for Union legislation. Live counts per jurisdiction are on GET /acts/coverage. examples: - maharashtra title: State description: Jurisdiction slug. `central` is a value here, for Union legislation. Live counts per jurisdiction are on GET /acts/coverage. - name: department in: query required: false schema: anyOf: - type: string - type: 'null' description: 'Issuing body. Deliberately NOT an enumerated list: this field holds 943 distinct values and mixes clean regulator slugs (`sebi`, `rbi`, `moefcc`) with free-text state department names (`Law Department`). Read GET /acts/filters for the values with the most data behind them.' examples: - sebi title: Department description: 'Issuing body. Deliberately NOT an enumerated list: this field holds 943 distinct values and mixes clean regulator slugs (`sebi`, `rbi`, `moefcc`) with free-text state department names (`Law Department`). Read GET /acts/filters for the values with the most data behind them.' - name: yearFrom in: query required: false schema: anyOf: - type: integer maximum: 2100 - type: 'null' description: Earliest year of enactment to include, inclusive. Matched against the publisher's own year field, which is occasionally corrupt, so there is no lower bound and a value below 1800 is a legitimate way to find those rows. examples: - 2015 title: Yearfrom description: Earliest year of enactment to include, inclusive. Matched against the publisher's own year field, which is occasionally corrupt, so there is no lower bound and a value below 1800 is a legitimate way to find those rows. - name: yearTo in: query required: false schema: anyOf: - type: integer maximum: 2100 - type: 'null' description: Latest year of enactment to include, inclusive. examples: - 2024 title: Yearto description: Latest year of enactment to include, inclusive. - name: status in: query required: false schema: anyOf: - type: string enum: - in_force - repealed - superseded - spent - type: 'null' description: 'The publisher''s lifecycle status for the act. Their claim, not our verdict: see GET /acts/{actId}/status. Values: `in_force`, `repealed`, `superseded`, `spent`.' examples: - repealed title: Status description: 'The publisher''s lifecycle status for the act. Their claim, not our verdict: see GET /acts/{actId}/status. Values: `in_force`, `repealed`, `superseded`, `spent`.' - name: search in: query required: false schema: anyOf: - type: string minLength: 2 maxLength: 200 - type: 'null' description: 'Keep only acts whose title contains this substring, matched case-insensitively. A title filter, not a search over the text: use POST /acts/search for that.' examples: - income tax title: Search description: 'Keep only acts whose title contains this substring, matched case-insensitively. A title filter, not a search over the text: use POST /acts/search for that.' - name: sort in: query required: false schema: type: string description: 'Sort order. `popular` is DEPRECATED and behaves as `year_desc`: it ordered by a read counter held only in the retired store. Values: `year_desc`, `year_asc`, `title_asc`, `title_desc`, `popular`.' examples: - title_asc enum: - year_desc - year_asc - title_asc - title_desc - popular default: year_desc title: Sort description: 'Sort order. `popular` is DEPRECATED and behaves as `year_desc`: it ordered by a read counter held only in the retired store. Values: `year_desc`, `year_asc`, `title_asc`, `title_desc`, `popular`.' - name: page in: query required: false schema: type: integer minimum: 1 description: 1-based page number. examples: - 1 default: 1 title: Page description: 1-based page number. - name: pageSize in: query required: false schema: type: integer maximum: 100 minimum: 1 description: Results per page (1-100). examples: - 50 default: 50 title: Pagesize description: Results per page (1-100). responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActListResponse' example: results: - actId: INC_619586 title: The Kerala (Alteration of Name) Act, 2026 year: 2026 category: central actNumber: '18' actStatus: in_force enactmentDate: '2026-08-14' citation: The Kerala (Alteration of Name) Act, 2026 sectionCount: 1 - actId: INC_619582 title: The Tribunals Reforms Act, 2026 year: 2026 category: central department: Department of Legal Affairs actNumber: '17' actStatus: in_force enactmentDate: '2026-08-13' citation: The Tribunals Reforms Act, 2026 sectionCount: 3 total: 32 page: 1 pageSize: 3 hasMore: true meta: processingTimeMs: 591.4 creditsConsumed: 1.0 note: This listing enumerates every served act, from an act index built 2026-09-07T11:53:52Z. An act ingested after that date is available from search and the act routes before it appears here. '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 or unknown request field content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' '429': description: Rate limited content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' servers: - url: https://api.vaquill.ai description: Production /api/v1/in/acts/corresponding-provisions/{act_code}: get: tags: - Indian Acts and Legislation summary: Map a repealed code to its replacement description: 'Section-by-section mapping from a repealed Indian criminal code to the 2023 code that replaced it, in force from 1 July 2024. Pass either side of the pair: `ipc` and `bns` both return the IPC to BNS mapping, `crpc` and `bnss` both return CrPC to BNSS. **Coverage**: `ipc`/`bns` and `crpc`/`bnss`. `iea`/`bsa` are accepted but return 404 until the Evidence Act mapping lands, rather than an empty list that would read as "nothing changed". **Source**: transcribed from the correspondence tables published by the Bureau of Police Research and Development, an attached office of India''s Ministry of Home Affairs. The `coverage.source` block on every response names the exact document and links to it. **Both codes are live law at once.** The repealed code still governs offences committed before 1 July 2024, for the lifetime of pending trials, so this is a correspondence and not a redirect. **Authentication**: API key via `Authorization: Bearer vq_key_...` **Cost**: 1 credit' operationId: get_corresponding_provisions_api_v1_in_acts_corresponding_provisions__act_code__get parameters: - name: act_code in: path required: true schema: type: string pattern: ^(?i:ipc|crpc|iea|bns|bnss|bsa)$ description: 'Either side of a recodification pair, matched case-insensitively so `IPC` and `ipc` are the same request. `ipc`/`bns` and `crpc`/`bnss` each return the same mapping; `iea`/`bsa` are accepted and 404 until that mapping lands. Values: `ipc`, `crpc`, `iea`, `bns`, `bnss`, `bsa`.' examples: - ipc enum: - ipc - crpc - iea - bns - bnss - bsa title: Act Code description: 'Either side of a recodification pair, matched case-insensitively so `IPC` and `ipc` are the same request. `ipc`/`bns` and `crpc`/`bnss` each return the same mapping; `iea`/`bsa` are accepted and 404 until that mapping lands. Values: `ipc`, `crpc`, `iea`, `bns`, `bnss`, `bsa`.' responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/CorrespondingProvisionsResponse' example: oldAct: Indian Penal Code, 1860 newAct: Bharatiya Nyaya Sanhita, 2023 effectiveDate: '2024-07-01' provisions: - oldAct: IPC oldSection: '1' newAct: BNS newSection: 1(1) subject: Short title, commencement and application. effectiveDate: '2024-07-01' - oldAct: IPC oldSection: '2' newAct: BNS newSection: 1(3) subject: Punishment of offences committed within India. effectiveDate: '2024-07-01' total: 534 coverage: mappedProvisions: 534 numberedSectionsMapped: 477 numberedSectionsInOldCode: 511 numberedSectionCoverage: 0.933 oldCode: IPC source: publisher: Bureau of Police Research and Development, Ministry of Home Affairs title: Correspondence Table and Comparison Summary of the Bharatiya Nyaya Sanhita, 2023 (BNS) to the Indian Penal Code, 1860 (IPC) url: https://bprd.nic.in/uploads/pdf/COMPARISON%20SUMMARY%20BNS%20to%20IPC%20.pdf basis: official-publication isComplete: false note: 'Transcribed from the correspondence table the Bureau of Police Research and Development (Ministry of Home Affairs) publishes for this pair, named in `source`. `isComplete` is false and stays false: the publisher''s table omits sections the new code dropped out…' bothCodesAreLiveLaw: The old code still applies to offences committed before 2024-07-01, so both codes are live law simultaneously for the lifetime of pending trials. This mapping is a correspondence, not a redirect. meta: processingTimeMs: 54.0 creditsConsumed: 1.0 '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 or unknown request field content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' '429': description: Rate limited content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' servers: - url: https://api.vaquill.ai description: Production /api/v1/in/acts/coverage: get: tags: - Indian Acts and 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: 1118.9 creditsConsumed: 0.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' servers: - url: https://api.vaquill.ai description: Production /api/v1/in/acts/resolve: get: tags: - Indian Acts and 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 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 - type: 'null' description: Narrow to one jurisdiction. Required for a State-universal title, where the same short title names a different act in each State. examples: - maharashtra title: State description: Narrow to one jurisdiction. Required for a State-universal title, where the same short title names a different act in each State. - name: asAtDate in: query required: false schema: anyOf: - type: string - type: 'null' 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' format: date 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.' 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 - input: Art. 21 Constitution status: resolved candidates: - actId: INC_492360 citation: The Constitution of India, 1950, s. 21 title: The Constitution of India sectionNumber: '21' sectionTitle: 'No person shall be deprived of his life or personal liberty except according to procedure established by law. THE CONSTITUTION OF INDIA (Part III' year: 1950 actStatus: in_force category: state state: andaman-and-nicobar-islands note: Has no act number, and is addressed by Article rather than section. parsed: unit: article section: '21' subProvisions: [] actToken: Constitution pinpoint: '21' duplicatesCollapsed: 2 count: 2 resolvedCount: 1 meta: processingTimeMs: 865.1 creditsConsumed: 4.0 '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' post: tags: - Indian Acts and 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 - input: Art. 21 Constitution status: resolved candidates: - actId: INC_492360 citation: The Constitution of India, 1950, s. 21 title: The Constitution of India sectionNumber: '21' sectionTitle: 'No person shall be deprived of his life or personal liberty except according to procedure established by law. THE CONSTITUTION OF INDIA (Part III' year: 1950 actStatus: in_force category: state state: andaman-and-nicobar-islands note: Has no act number, and is addressed by Article rather than section. parsed: unit: article section: '21' subProvisions: [] actToken: Constitution pinpoint: '21' duplicatesCollapsed: 2 count: 2 resolvedCount: 1 meta: processingTimeMs: 865.1 creditsConsumed: 4.0 '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' servers: - url: https://api.vaquill.ai description: Production /api/v1/in/acts/{act_id}/structure: get: tags: - Indian Acts and Legislation summary: An act's table of contents description: 'The act''s own shape: its chapters and parts where the publisher gives any, and the provisions under each. **Cost: 2 credits.** `hasHierarchy` is false for most acts and that is not an error: the publisher gives many acts no chapter or part divisions at all, and for those `nodes` is a flat list of sections. The free `GET /acts/coverage` publishes how many acts do carry a hierarchy, as `depth.actsWithStructure`. Section numbers are sorted numerically with their alphabetic suffixes kept attached, so `498A` follows `498` and `10` follows `2`.' operationId: get_act_structure_api_v1_in_acts__act_id__structure_get parameters: - name: act_id in: path required: true schema: type: string minLength: 1 maxLength: 200 pattern: ^[^/\\\x00-\x1f]+$ description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' examples: - IND_state_20326 title: Act Id description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActStructureResponse' example: actId: IND_state_20326 title: The Maharashtra Value Added Tax Act, 2002. citation: The Maharashtra Value Added Tax Act, 2002. nodes: - kind: chapter identifier: I label: Chapter I title: PRELIMINARY sectionCount: 2 children: - kind: section identifier: '1' label: s. 1 title: Short title, extent and commencement - kind: section identifier: '2' label: s. 2 title: Definitions - kind: chapter identifier: II label: Chapter II title: INCIDENCE AND LEVY OF TAX sectionCount: 6 children: - kind: section identifier: '3' label: s. 3 title: Incidence of Tax - kind: section identifier: '4' label: s. 4 title: Taxes payable sectionCount: 95 hasHierarchy: true truncated: false meta: processingTimeMs: 506.9 creditsConsumed: 2.0 '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' '429': description: Rate limited content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' servers: - url: https://api.vaquill.ai description: Production /api/v1/in/acts/{act_id}/sections/{section_number}: get: tags: - Indian Acts and 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: ^[^/\\\x00-\x1f]+$ description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' examples: - IND_state_20326 title: Act Id description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' - name: section_number in: path required: true schema: type: string minLength: 1 maxLength: 40 pattern: ^[^/\\\x00-\x1f]{1,40}$ description: 'Section number as the publisher writes it, e.g. `302` or `498A`. Alphanumeric suffixes are part of the number, not a sub-provision: `498A` is one section, not section 498 clause A. When the number as sent matches nothing, common spellings are tried: a `s.` / `Sec.` / `Section` prefix, `498-A` or `498 A` or `498a` for `498A`, and a trailing sub-provision such as `302(1)`, which serves the whole section. A match is served only when exactly one stored number fits, and the response carries `resolvedFrom`. A miss returns 404 with `reason` and the act''s nearest numbers in `didYouMean`.' examples: - '23' title: Section Number description: 'Section number as the publisher writes it, e.g. `302` or `498A`. Alphanumeric suffixes are part of the number, not a sub-provision: `498A` is one section, not section 498 clause A. When the number as sent matches nothing, common spellings are tried: a `s.` / `Sec.` / `Section` prefix, `498-A` or `498 A` or `498a` for `498A`, and a trailing sub-provision such as `302(1)`, which serves the whole section. A match is served only when exactly one stored number fits, and the response carries `resolvedFrom`. A miss returns 404 with `reason` and the act''s nearest numbers in `didYouMean`.' 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: 321.5 creditsConsumed: 2.0 '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' '429': description: Rate limited content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' servers: - url: https://api.vaquill.ai description: Production /api/v1/in/acts/{act_id}/sections/{section_number}/body: get: tags: - Indian Acts and Legislation summary: A provision's full text description: 'The publisher''s own text for one provision. **Cost: 3 credits.** Refunded when we hold the provision and cannot reproduce its text, because you asked for text and did not get it. The text is sliced out of the act document by the character offsets stored with each passage. It is never assembled by concatenating search passages: those carry a retrieval header that we synthesized (`Act: ... | India | State | In Force`), and serving that as statute would put our words inside a quotation of the law. **This text is as the publisher published it.** We do not apply amendments to it. `GET /acts/{actId}/sections/{n}/history` lists every amendment we hold for the provision, each with an `appliedStatus` saying whether it is reflected here. It is not.' operationId: get_act_section_body_api_v1_in_acts__act_id__sections__section_number__body_get parameters: - name: act_id in: path required: true schema: type: string minLength: 1 maxLength: 200 pattern: ^[^/\\\x00-\x1f]+$ description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' examples: - IND_state_20326 title: Act Id description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' - name: section_number in: path required: true schema: type: string minLength: 1 maxLength: 40 pattern: ^[^/\\\x00-\x1f]{1,40}$ description: 'Section number as the publisher writes it, e.g. `302` or `498A`. Alphanumeric suffixes are part of the number, not a sub-provision: `498A` is one section, not section 498 clause A. When the number as sent matches nothing, common spellings are tried: a `s.` / `Sec.` / `Section` prefix, `498-A` or `498 A` or `498a` for `498A`, and a trailing sub-provision such as `302(1)`, which serves the whole section. A match is served only when exactly one stored number fits, and the response carries `resolvedFrom`. A miss returns 404 with `reason` and the act''s nearest numbers in `didYouMean`.' examples: - '23' title: Section Number description: 'Section number as the publisher writes it, e.g. `302` or `498A`. Alphanumeric suffixes are part of the number, not a sub-provision: `498A` is one section, not section 498 clause A. When the number as sent matches nothing, common spellings are tried: a `s.` / `Sec.` / `Section` prefix, `498-A` or `498 A` or `498a` for `498A`, and a trailing sub-provision such as `302(1)`, which serves the whole section. A match is served only when exactly one stored number fits, and the response carries `resolvedFrom`. A miss returns 404 with `reason` and the act''s nearest numbers in `didYouMean`.' responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActSectionBodyResponse' 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. text: 23. Assessment.—[6] [( _1_ ) Where a registered dealer fails to file a return in respect of any period by the prescribed date, the Commissioner may assess the dealer in respect of the said period to the best of his judgment without serving a notice for assess… available: true wordCount: 4449 currency: textIs: as_published amendmentsApplied: false amendmentEventsHeld: 44 note: This is the publisher's published text. We do not apply amendments to it, so it may not reflect changes recorded against this provision. See GET /acts/{actId}/sections/{n}/history. bodyProvenance: chunksHeld: 16 contiguous: true source: act_document chunkIndexRange: - 120 - 135 actTextUrl: https://acts-india.vaquill.ai/IND_state_20326/act.normalized.txt charStart: 128276 charEnd: 149776 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: 276.7 creditsConsumed: 3.0 '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' '429': description: Rate limited content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' '422': description: Validation Error content: application/json: schema: $ref: '#/components/schemas/HTTPValidationError' servers: - url: https://api.vaquill.ai description: Production /api/v1/in/acts/{act_id}/sections/{section_number}/history: get: tags: - Indian Acts and 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: many acts carry a non-zero amendment count with no parseable footnote behind it, and about half the records we do hold carry no effective date. Read the `coverage` block on this response for the provision you asked about, and the free `GET /acts/coverage` for the corpus-wide split (`depth.actsWithAmendmentEvents` against `depth.actsClaimingAmendmentsWithoutEvents`).' 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: ^[^/\\\x00-\x1f]+$ description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' examples: - IND_state_20326 title: Act Id description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' - name: section_number in: path required: true schema: type: string minLength: 1 maxLength: 40 pattern: ^[^/\\\x00-\x1f]{1,40}$ description: 'Section number as the publisher writes it, e.g. `302` or `498A`. Alphanumeric suffixes are part of the number, not a sub-provision: `498A` is one section, not section 498 clause A. When the number as sent matches nothing, common spellings are tried: a `s.` / `Sec.` / `Section` prefix, `498-A` or `498 A` or `498a` for `498A`, and a trailing sub-provision such as `302(1)`, which serves the whole section. A match is served only when exactly one stored number fits, and the response carries `resolvedFrom`. A miss returns 404 with `reason` and the act''s nearest numbers in `didYouMean`.' examples: - '23' title: Section Number description: 'Section number as the publisher writes it, e.g. `302` or `498A`. Alphanumeric suffixes are part of the number, not a sub-provision: `498A` is one section, not section 498 clause A. When the number as sent matches nothing, common spellings are tried: a `s.` / `Sec.` / `Section` prefix, `498-A` or `498 A` or `498a` for `498A`, and a trailing sub-provision such as `302(1)`, which serves the whole section. A match is served only when exactly one stored number fits, and the response carries `resolvedFrom`. A miss returns 404 with `reason` and the act''s nearest numbers in `didYouMean`.' - 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' format: date 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: 284.4 creditsConsumed: 2.0 '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' servers: - url: https://api.vaquill.ai description: Production /api/v1/in/acts/{act_id}/status: get: tags: - Indian Acts and Legislation summary: Is this act still law, and who says so description: 'Everything we know about an act''s standing, kept in three separate vocabularies that are deliberately never collapsed into one verdict. **Cost: 1 credit.** - `publisherStatus` is `act_status` exactly as India Code records it. Their word. - `servedStatus` is ours: whether this API answers for the act, or has retired it as withdrawn by the publisher or as a duplicate of one we kept. - `repealClaim` is the publisher''s repeal record WITH its source, and with the caveat that we do not verify whether the repealing instrument was itself brought into force. That last distinction is not pedantry. India Code lists the Industrial Disputes Act, 1947 as repealed by Act 37 of 2020, the Industrial Relations Code, which has never been commenced. Serving that as flatly "repealed" would be wrong, so this endpoint does not. A retired act answers here with `servedStatus: retired` and the reason, rather than 404ing, because "we deliberately withdrew this" is a more useful answer than "no such thing".' operationId: get_act_status_api_v1_in_acts__act_id__status_get parameters: - name: act_id in: path required: true schema: type: string minLength: 1 maxLength: 200 pattern: ^[^/\\\x00-\x1f]+$ description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' examples: - IND_state_20326 title: Act Id description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActStatusResponse' example: actId: IND_state_20326 title: The Maharashtra Value Added Tax Act, 2002. citation: citation: The Maharashtra Value Added Tax Act, 2002. citationShort: Maharashtra Value Added Tax Act, 2002. goodLawStatus: good_law goodLawReason: The publisher records this act as in force and no repeal is on the record. We have not independently verified it. publisherStatus: in_force servedStatus: served isSubordinate: false enactmentDate: '2005-03-09' enactmentDateRaw: 9-Mar-2005 lastAmendedYear: 2019 subordinateCount: 0 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: 282.3 creditsConsumed: 1.0 '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' servers: - url: https://api.vaquill.ai description: Production /api/v1/in/acts/{act_id}/sections/{section_number}/references: get: tags: - Indian Acts and Legislation summary: What this provision points at description: 'Outbound citations: the other enactments this provision names, and the sections of its own act it cross-refers to. **Cost: 2 credits.** An empty result for a provision we hold IS the answer and is charged; a provision we do not hold is refunded. Act references are resolved to an `actId` where the title names something we serve, and returned with `resolved: false` where it does not. That is the honest split: the publisher names acts we may not hold, and a null id is a coverage fact rather than a parse failure. This route takes no query parameters and is not paged: one provision''s own outbound edges are a short list. `totalActs` and `totalSections` are the full counts, and `truncated` says whether the row cap cut either list.' operationId: india_section_references parameters: - name: act_id in: path required: true schema: type: string minLength: 1 maxLength: 200 pattern: ^[^/\\\x00-\x1f]+$ description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' examples: - IND_state_17068 title: Act Id description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' - name: section_number in: path required: true schema: type: string minLength: 1 maxLength: 40 pattern: ^[^/\\\x00-\x1f]{1,40}$ description: 'Section number as the publisher writes it, e.g. `302` or `498A`. Alphanumeric suffixes are part of the number, not a sub-provision: `498A` is one section, not section 498 clause A. When the number as sent matches nothing, common spellings are tried: a `s.` / `Sec.` / `Section` prefix, `498-A` or `498 A` or `498a` for `498A`, and a trailing sub-provision such as `302(1)`, which serves the whole section. A match is served only when exactly one stored number fits, and the response carries `resolvedFrom`. A miss returns 404 with `reason` and the act''s nearest numbers in `didYouMean`.' examples: - '79' title: Section Number description: 'Section number as the publisher writes it, e.g. `302` or `498A`. Alphanumeric suffixes are part of the number, not a sub-provision: `498A` is one section, not section 498 clause A. When the number as sent matches nothing, common spellings are tried: a `s.` / `Sec.` / `Section` prefix, `498-A` or `498 A` or `498a` for `498A`, and a trailing sub-provision such as `302(1)`, which serves the whole section. A match is served only when exactly one stored number fits, and the response carries `resolvedFrom`. A miss returns 404 with `reason` and the act''s nearest numbers in `didYouMean`.' responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActReferencesResponse' example: actId: IND_state_17068 sectionNumber: '79' citation: citation: The Factories Act, 1948, s. 79 citationShort: Factories Act, s. 79 displayPath: The Factories Act, 1948 / Chapter VI. ``` / s. 79 breadcrumb: - type: chapter num: VI label: Chapter VI name: '```' acts: - title: Industrial Disputes Act, 1947 actId: INC_554437 resolved: true sections: - sectionNumber: '2' - sectionNumber: '81' totalActs: 1 totalSections: 4 truncated: false matchBasis: publisher_title note: 'Edges are matched on the act''s TITLE as the publisher wrote it, because that is what the corpus stores. A citing document that spelled the title differently is not found, and the publisher''s own line breaks make this measurable: one act can appear as two dist…' meta: processingTimeMs: 3905.5 creditsConsumed: 2.0 '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' '429': description: Rate limited content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' '422': description: Unrecognised query parameter content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' servers: - url: https://api.vaquill.ai description: Production /api/v1/in/acts/{act_id}/cited-by: get: tags: - Indian Acts and Legislation summary: What points at this act description: 'Inbound citations: provisions elsewhere in the corpus that name this act. **Cost: 2 credits.** A confident "nothing cites this" is the answer and is charged. 🔴 **Matched on the act''s TITLE, not on an identifier**, because that is what the corpus stores. A citing document that wrote the title differently is missed, and the publisher''s own line breaks make that measurable. Read `matchBasis` and treat the result as a floor rather than a complete set. A foundational act can be cited by thousands of provisions, so the answer is PAGED with `page` + `pageSize`, the same as the rest of this API. `total` is the number of distinct citing PROVISIONS across all pages, not the size of the page you were served (`returned`) and not the number of matching passages: one provision is stored as many passages, so `total` is the smaller number. `totalIsExact` goes false only if the corpus scan behind that count hits its ceiling, which no act in the corpus currently reaches.' operationId: india_act_cited_by parameters: - name: act_id in: path required: true schema: type: string minLength: 1 maxLength: 200 pattern: ^[^/\\\x00-\x1f]+$ description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' examples: - IND_state_17068 title: Act Id description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' - name: page in: query required: false schema: type: integer minimum: 1 description: 1-based page number. examples: - 1 default: 1 title: Page description: 1-based page number. - name: pageSize in: query required: false schema: anyOf: - type: integer maximum: 100 minimum: 1 - type: 'null' description: Rows per page (1-100). Defaults to 25. examples: - 25 title: Pagesize description: Rows per page (1-100). Defaults to 25. - name: limit in: query required: false schema: anyOf: - type: integer maximum: 100 minimum: 1 - type: 'null' description: DEPRECATED alias for `pageSize`, kept working for clients written against the original shape. Send one or the other, not both. deprecated: true examples: - 25 title: Limit description: DEPRECATED alias for `pageSize`, kept working for clients written against the original shape. Send one or the other, not both. deprecated: true responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActCitedByResponse' example: actId: IND_state_17068 title: The Factories Act, 1948 citation: The Factories Act, 1948 citers: - actId: INC_597400 title: The Tamil Nadu Lifts and Escalators Rules,1997 citation: The Tamil Nadu Lifts and Escalators Rules,1997, s. 3 sectionNumber: '3' sectionTitle: 'Documents to be enclosed herewith along with renewal application:' - actId: IND_state_12592 title: The C.G. SHOPS & ESTABLISHMENTS ACT, 1958 citation: The C.G. SHOPS & ESTABLISHMENTS ACT, 1958, s. 3 sectionNumber: '3' sectionTitle: Act not applicable to certain persons and establishment — (1) Nothing in this Act total: 884 totalIsExact: true returned: 3 page: 1 pageSize: 3 hasMore: true truncated: true matchBasis: publisher_title note: 'Edges are matched on the act''s TITLE as the publisher wrote it, because that is what the corpus stores. A citing document that spelled the title differently is not found, and the publisher''s own line breaks make this measurable: one act can appear as two dist…' meta: processingTimeMs: 1390.7 creditsConsumed: 2.0 '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' '429': description: Rate limited content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' '422': description: Unrecognised or conflicting parameter content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' servers: - url: https://api.vaquill.ai description: Production /api/v1/in/acts/{act_id}/subordinate: get: tags: - Indian Acts and Legislation summary: Rules and notifications made under this act description: 'Subordinate instruments the publisher records as made under this act: rules, regulations, notifications and orders. **Cost: 2 credits.** An act with no subordinate instruments on record is the answer and is charged. 🔴 Resolved by the parent''s TITLE. The stored `parent_act_id` is India Code''s own identifier and does not address this corpus, so a hard link would resolve to nothing. Title matching reaches a served parent for most instruments that name one, and `matchBasis` says so on every response. Paged with `page` + `pageSize`. `total` counts distinct INSTRUMENTS across all pages, not the rows on this page (`returned`) and not matching passages.' operationId: india_act_subordinate parameters: - name: act_id in: path required: true schema: type: string minLength: 1 maxLength: 200 pattern: ^[^/\\\x00-\x1f]+$ description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' examples: - IND_state_17068 title: Act Id description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' - name: page in: query required: false schema: type: integer minimum: 1 description: 1-based page number. examples: - 1 default: 1 title: Page description: 1-based page number. - name: pageSize in: query required: false schema: anyOf: - type: integer maximum: 100 minimum: 1 - type: 'null' description: Rows per page (1-100). Defaults to 25. examples: - 25 title: Pagesize description: Rows per page (1-100). Defaults to 25. - name: limit in: query required: false schema: anyOf: - type: integer maximum: 100 minimum: 1 - type: 'null' description: DEPRECATED alias for `pageSize`, kept working for clients written against the original shape. Send one or the other, not both. deprecated: true examples: - 25 title: Limit description: DEPRECATED alias for `pageSize`, kept working for clients written against the original shape. Send one or the other, not both. deprecated: true responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActSubordinateResponse' example: actId: IND_state_17068 title: The Factories Act, 1948 citation: The Factories Act, 1948 children: - actId: INC_570455 title: The Maharashtra Factories Rules, 1963 citation: The Maharashtra Factories Rules, 1963, s. 3 year: 1948 actStatus: in_force - actId: INC_601336 title: Tripura Factories Rules, 2007 citation: Tripura Factories Rules, 2007, s. 11 year: 1948 actStatus: in_force total: 12 totalIsExact: true returned: 3 page: 1 pageSize: 3 hasMore: true truncated: true matchBasis: parent_act_name note: Resolved by the parent act's title. The stored parent identifier is the publisher's own and does not address this corpus, so an instrument whose parent name differs from the act's title is not found. Measured, title matching reaches a served parent for 85.8% … meta: processingTimeMs: 528.5 creditsConsumed: 2.0 '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' '429': description: Rate limited content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' '422': description: Unrecognised or conflicting parameter content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' servers: - url: https://api.vaquill.ai description: Production /api/v1/in/acts/{act_id}/definitions: get: tags: - Indian Acts and Legislation summary: Terms this act defines description: 'The terms an act defines, and the provision that defines them. **Cost: 2 credits.** Refunded when the act holds no extracted definitions, because the caller asked for definitions and did not get any. ⚠️ Coverage is thin and stated rather than implied: extracted defined terms exist for a minority of served acts. An empty answer here means we did not extract them, NOT that the act defines nothing. `definitionSections` is returned separately so you can read the defining provision directly even when no terms were extracted from it. `terms` is paged with `page` + `pageSize`, because a long definitions clause can run to thousands of entries. `definitionSections` is short and is NOT paged, so it repeats in full on every page.' operationId: india_act_definitions parameters: - name: act_id in: path required: true schema: type: string minLength: 1 maxLength: 200 pattern: ^[^/\\\x00-\x1f]+$ description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' examples: - IND_central_2114 title: Act Id description: 'Act identifier, as returned by /acts/search, /acts/list or /acts/resolve, e.g. `IND_central_20062` (the Bharatiya Nyaya Sanhita, 2023). Surrounding whitespace, quotes, backticks, invisible characters, a trailing period and double percent-encoding are removed when the id as sent matches nothing; the response then carries `resolvedFrom`. An act NAME or citation (`Indian Penal Code`, `IPC`, `The Companies Act, 2013`) is not resolved here. It returns 404 with `reason: "act_name_or_citation"` and `suggestedRequest`, the call that finds the id. A misspelt id returns 404 with the real ids in `didYouMean`.' - name: page in: query required: false schema: type: integer minimum: 1 description: 1-based page number. examples: - 1 default: 1 title: Page description: 1-based page number. - name: pageSize in: query required: false schema: anyOf: - type: integer maximum: 100 minimum: 1 - type: 'null' description: Rows per page (1-100). Defaults to 25. examples: - 25 title: Pagesize description: Rows per page (1-100). Defaults to 25. - name: limit in: query required: false schema: anyOf: - type: integer maximum: 100 minimum: 1 - type: 'null' description: DEPRECATED alias for `pageSize`, kept working for clients written against the original shape. Send one or the other, not both. deprecated: true examples: - 25 title: Limit description: DEPRECATED alias for `pageSize`, kept working for clients written against the original shape. Send one or the other, not both. deprecated: true responses: '200': description: Successful Response content: application/json: schema: $ref: '#/components/schemas/ActDefinitionsResponse' example: actId: IND_state_20326 citation: The Maharashtra Value Added Tax Act, 2002. terms: - term: certificate of entitlement sectionNumber: '88' - term: eligibility certificate sectionNumber: '88' total: 36 returned: 3 page: 1 pageSize: 3 hasMore: true definitionSections: [] totalDefinitionSections: 0 meta: processingTimeMs: 530.6 creditsConsumed: 2.0 '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' '429': description: Rate limited content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' '422': description: Unrecognised or conflicting parameter content: application/json: schema: $ref: '#/components/schemas/ApiDetailError' servers: - url: https://api.vaquill.ai description: Production components: schemas: ApiFieldError: properties: loc: items: anyOf: - type: string - type: integer type: array title: Loc description: 'Where the bad value is: `body`, `query` or `path`, then the parameter name exactly as you send it (camelCase), then list indexes. A bare `["body"]` means the body as a whole was not a JSON object.' examples: - - body - corpusType msg: type: string title: Msg description: What is wrong with the value, in plain English. examples: - Input should be 'USC', 'CFR' or 'STATE' type: type: string title: Type description: Machine-readable error kind, e.g. `missing`, `literal_error`, `json_invalid`. examples: - literal_error type: object required: - loc - msg - type title: ApiFieldError description: One rejected field in a 422 response. ActSearchResponse: properties: data: $ref: '#/components/schemas/ActSearchData' meta: $ref: '#/components/schemas/ActSearchMeta' type: object required: - data - meta title: ActSearchResponse CategoryLegend: properties: value: type: string title: Value meaning: type: string title: Meaning type: object required: - value - meaning title: CategoryLegend ActStructureResponse: properties: actId: type: string title: Actid title: anyOf: - type: string - type: 'null' title: Title citation: anyOf: - type: string - type: 'null' title: Citation nodes: items: $ref: '#/components/schemas/StructureNode' type: array title: Nodes sectionCount: type: integer title: Sectioncount hasHierarchy: type: boolean title: Hashierarchy description: False when the publisher gives this act no chapter or part divisions, in which case `nodes` is a flat section list. Most served acts carry no hierarchy, so a flat answer is the common case and not an error. `GET /acts/coverage` publishes how many do, as `depth.actsWithStructure`. truncated: type: boolean title: Truncated description: True when the act has more sections than one call returns. default: false resolvedFrom: anyOf: - $ref: '#/components/schemas/IdentifierResolution' - type: 'null' description: How your act_id or section number was matched, when it did not match exactly as sent. Null when it did. meta: $ref: '#/components/schemas/Meta' type: object required: - actId - nodes - sectionCount - hasHierarchy - meta title: ActStructureResponse 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 features found in the provision's own text. ActSearchResult: properties: actId: type: string title: Actid title: type: string title: Title sectionNumber: anyOf: - type: string - type: 'null' title: Sectionnumber sectionTitle: anyOf: - type: string - type: 'null' title: Sectiontitle chapter: anyOf: - type: string - type: 'null' title: Chapter chapterTitle: anyOf: - type: string - type: 'null' title: Chaptertitle 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 jurisdiction: anyOf: - type: string - type: 'null' title: Jurisdiction actStatus: anyOf: - type: string - type: 'null' title: Actstatus provisionType: anyOf: - type: string - type: 'null' title: Provisiontype legalSubject: anyOf: - items: type: string type: array - type: 'null' title: Legalsubject actsReferenced: anyOf: - items: type: string type: array - type: 'null' title: Actsreferenced content: type: string title: Content description: Relevant text excerpt longTitle: anyOf: - type: string - type: 'null' title: Longtitle enactmentDate: anyOf: - type: string - type: 'null' title: Enactmentdate description: Enactment date as `YYYY-MM-DD`, or null when the publisher's stored value is not a date we can state without guessing. See `enactmentDateRaw`. enactmentDateRaw: anyOf: - type: string - type: 'null' title: Enactmentdateraw description: The publisher's own string, present only when it differs from `enactmentDate`. 21% of the corpus stores `23-Nov-2001`, and a small tail stores values that are not dates at all. pdfUrl: anyOf: - type: string - type: 'null' title: Pdfurl textUrl: anyOf: - type: string - type: 'null' title: Texturl sourceUrl: anyOf: - type: string - type: 'null' title: Sourceurl relevanceScore: anyOf: - type: number - type: 'null' title: Relevancescore description: 'Ranking score for this result against the query, after hybrid fusion and cross-encoder reranking. Comparable WITHIN one response and not across responses: it is a rank artifact, not a probability, and not a statement about legal relevance.' examples: - 0.87 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'. citation: $ref: '#/components/schemas/Citation' description: How to cite this provision. Present on 99.90% of served acts. type: object required: - actId - title - content title: ActSearchResult description: A single legislation search result with full metadata. ActSectionBodyResponse: properties: actId: type: string title: Actid sectionNumber: anyOf: - type: string - type: 'null' title: Sectionnumber citation: $ref: '#/components/schemas/Citation' text: anyOf: - type: string - type: 'null' title: Text description: 'The publisher''s text for this provision, sliced from the act document by the stored character offsets. Never a concatenation of retrieval passages: those carry a synthesized header that is ours, not the publisher''s.' available: type: boolean title: Available description: Whether the provision's text could be reproduced. False with a `note` when we hold the provision and cannot serve its text; a null `text` alone cannot be told apart from an empty provision. A false answer here is refunded. examples: - true note: anyOf: - type: string - type: 'null' title: Note description: Why `available` is false, when it is. wordCount: anyOf: - type: integer - type: 'null' title: Wordcount currency: additionalProperties: true type: object title: Currency description: What this text is and is not. It is the publisher's published text; we do NOT apply amendments to it. See GET /acts/{actId}/sections/{n}/history. bodyProvenance: additionalProperties: true type: object title: Bodyprovenance provenance: $ref: '#/components/schemas/Provenance' resolvedFrom: anyOf: - $ref: '#/components/schemas/IdentifierResolution' - type: 'null' description: How your act_id or section number was matched, when it did not match exactly as sent. Null when it did. meta: $ref: '#/components/schemas/Meta' type: object required: - actId - citation - available - currency - bodyProvenance - provenance - meta title: ActSectionBodyResponse 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 a small fraction 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. 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: many acts 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. The corpus-wide gap is `depth.actsClaimingAmendmentsWithoutEvents` on the free GET /acts/coverage.' 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 ActSectionResponse: properties: section: $ref: '#/components/schemas/ActSection' resolvedFrom: anyOf: - $ref: '#/components/schemas/IdentifierResolution' - type: 'null' description: How your act_id or section number was matched, when it did not match exactly as sent. Null when it did. meta: $ref: '#/components/schemas/Meta' type: object required: - section - meta title: ActSectionResponse 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: a section spans several passages and an act many sections. Act-level figures live in `totals` and carry their own measurement date.' 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. Built from the publisher''s own title, so where that title carries a defect so does the citation: some titles end in a period, which reads as `... Act., s. 3`, and some carry no year at all. Those are recorded defects rather than reasons to withhold the field. `GET /acts/coverage` publishes how many served acts carry a citation, as `depth.actsWithCitation`.' IdentifierResolution: properties: input: type: string title: Input description: The act identifier exactly as you sent it. examples: - ' IND_central_20062.' actId: type: string title: Actid description: The act_id it matched. Send this next time. examples: - IND_central_20062 sectionInput: anyOf: - type: string - type: 'null' title: Sectioninput description: The section number exactly as you sent it, on a section route. examples: - s. 498-A sectionNumber: anyOf: - type: string - type: 'null' title: Sectionnumber description: The section number as the publisher writes it. Send this next time. examples: - 498A via: items: type: string type: array title: Via description: 'What was done to your input, in order. `normalized_id`: the act_id carried surrounding whitespace, quotes, backticks, an invisible character, a trailing period or double percent-encoding, which were removed. `normalized_section`: the section number was written differently from the publisher (a `s.` / `Sec.` / `Section` prefix, a hyphen or space before an alphabetic suffix, a lowercase suffix, or a trailing sub-provision), and matched one stored number and only one.' examples: - - normalized_section subProvision: anyOf: - type: string - type: 'null' title: Subprovision description: 'The sub-provision your section number carried, e.g. `(1)(a)` for `302(1)(a)`. The WHOLE section is served: sub-provisions are not addressed separately.' examples: - (1) type: object required: - input - actId title: IdentifierResolution description: 'How the act_id or section number you sent was matched, when not as sent. Present only when the input did NOT match exactly. Absent (null) means the response is about exactly the act_id and section number in your request. Same idea, and the same field name, as `resolvedFrom` on the US surface.' 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 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 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 - type: 'null' title: State description: Narrow to one jurisdiction. Required for a State-universal title. examples: - maharashtra asAtDate: anyOf: - type: string - type: 'null' format: date 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. ActSubordinateResponse: properties: actId: type: string title: Actid title: anyOf: - type: string - type: 'null' title: Title citation: anyOf: - type: string - type: 'null' title: Citation children: items: $ref: '#/components/schemas/SubordinateRow' type: array title: Children total: type: integer title: Total description: Distinct subordinate instruments across all pages, not rows on this page (that is `returned`). Counted per instrument, so an instrument stored as many passages counts once. totalIsExact: type: boolean title: Totalisexact description: False when the corpus scan behind `total` hit its ceiling, which makes `total` a floor. The ceiling sits above the largest parent in the corpus, so this is true today. returned: type: integer title: Returned description: Rows in `children` on THIS page. page: type: integer title: Page description: 1-based page this response answers. pageSize: type: integer title: Pagesize description: Rows per page requested. hasMore: type: boolean title: Hasmore description: True when a further page of instruments exists. truncated: type: boolean title: Truncated description: DEPRECATED. True when `hasMore` is true or `totalIsExact` is false. Read those two instead. matchBasis: type: string title: Matchbasis note: anyOf: - type: string - type: 'null' title: Note resolvedFrom: anyOf: - $ref: '#/components/schemas/IdentifierResolution' - type: 'null' description: How your act_id or section number was matched, when it did not match exactly as sent. Null when it did. meta: $ref: '#/components/schemas/Meta' type: object required: - actId - total - totalIsExact - returned - page - pageSize - hasMore - truncated - matchBasis - meta title: ActSubordinateResponse FootnoteItem: properties: sectionNumber: anyOf: - type: string - type: 'null' title: Sectionnumber sectionTitle: anyOf: - type: string - type: 'null' title: Sectiontitle footnoteId: anyOf: - type: integer - type: 'null' title: Footnoteid footnoteText: type: string title: Footnotetext footnoteType: type: string title: Footnotetype description: substitution, insertion, omission, note, renumbering byAct: anyOf: - type: string - type: 'null' title: Byact originalText: anyOf: - type: string - type: 'null' title: Originaltext effectiveDate: anyOf: - type: string - type: 'null' title: Effectivedate description: Date the amendment took effect, as `YYYY-MM-DD`, or null when the publisher's footnote does not state one we can read without guessing. See `effectiveDateRaw`. effectiveDateRaw: anyOf: - type: string - type: 'null' title: Effectivedateraw description: The date exactly as the footnote gives it, present when it differs from `effectiveDate`. Footnotes carry prose ('1st April 2017') and day-first numerals ('24-10-2019'). type: object required: - footnoteText - footnoteType title: FootnoteItem ActStatusResponse: properties: actId: type: string title: Actid title: anyOf: - type: string - type: 'null' title: Title citation: $ref: '#/components/schemas/Citation' goodLawStatus: type: string title: Goodlawstatus description: 'Our DERIVED verdict: `good_law`, `not_good_law` or `unknown`. Conservative by construction -- an unverified repeal claim maps to `unknown`, NEVER to `not_good_law`, because we do not check whether a repealing instrument was brought into force and at least one repeal on this record involves an Act that never commenced. One field to filter on; the three raw fields below remain if you want to judge it yourself.' default: unknown examples: - good_law goodLawReason: type: string title: Goodlawreason description: Why the verdict above is what it is. Always present. default: '' publisherStatus: anyOf: - type: string - type: 'null' title: Publisherstatus description: '`act_status` exactly as the publisher records it. Their word, not our verdict.' servedStatus: type: string title: Servedstatus description: '`served` or `retired`. OUR word about whether this API answers for it.' isSubordinate: anyOf: - type: boolean - type: 'null' title: Issubordinate delegationType: anyOf: - type: string - type: 'null' title: Delegationtype parentActName: anyOf: - type: string - type: 'null' title: Parentactname commencementInfo: anyOf: - type: string - type: 'null' title: Commencementinfo territorialExtent: anyOf: - type: string - type: 'null' title: Territorialextent enactmentDate: anyOf: - type: string - type: 'null' title: Enactmentdate description: 'The date the act was enacted, as `YYYY-MM-DD`, or null when the stored value is not a date we can state without guessing. 🔴 This is NOT the year in the act''s short title: ''The Biswa Bangla Biswabidyalay Act, 2017'' was enacted 2018-01-09, and on a subordinate instrument `year` is often the PARENT act''s year. Use `year` for the title year and this field for the date.' examples: - '2018-01-09' enactmentDateRaw: anyOf: - type: string - type: 'null' title: Enactmentdateraw description: 'What the publisher stored, present only when it differs from `enactmentDate`. When `enactmentDate` is null this carries the reason it is null, by showing you the value: a bare year (''1963''), an era year (''15-Oct-1349'', from an act titled in the Fasli calendar), or a corrupt one (''0032-03-05'').' examples: - 9-Mar-2005 dateOfAssent: anyOf: - type: string - type: 'null' title: Dateofassent description: The date of assent as `YYYY-MM-DD`, or null when the stored value is not a date. Some records store an act NUMBER here ('15 of 1992'); those return null with the value in `dateOfAssentRaw`. examples: - '1952-09-01' dateOfAssentRaw: anyOf: - type: string - type: 'null' title: Dateofassentraw description: What the publisher stored, when it differs from `dateOfAssent`. examples: - 15 of 1992 lastAmendedYear: anyOf: - type: integer - type: 'null' title: Lastamendedyear repeals: anyOf: - items: type: string type: array - type: 'null' title: Repeals description: 'Acts this one repeals, as the publisher names them. The inverse of `repealClaim`, and subject to the same caveat: it is their record, and we do not verify commencement.' supersededBy: anyOf: - type: string - type: 'null' title: Supersededby description: A later consolidation that replaced this version, where one is recorded. subordinateCount: anyOf: - type: integer - type: 'null' title: Subordinatecount description: Subordinate instruments the publisher records under this act. repealClaim: anyOf: - $ref: '#/components/schemas/RepealClaim' - type: 'null' retirement: anyOf: - $ref: '#/components/schemas/Retirement' - type: 'null' currencyNote: anyOf: - type: string - type: 'null' title: Currencynote provenance: $ref: '#/components/schemas/Provenance' resolvedFrom: anyOf: - $ref: '#/components/schemas/IdentifierResolution' - type: 'null' description: How your act_id or section number was matched, when it did not match exactly as sent. Null when it did. meta: $ref: '#/components/schemas/Meta' type: object required: - actId - citation - servedStatus - provenance - meta title: ActStatusResponse StructureNode: properties: kind: type: string title: Kind description: '`chapter`, `part` or `section`.' identifier: anyOf: - type: string - type: 'null' title: Identifier label: anyOf: - type: string - type: 'null' title: Label title: anyOf: - type: string - type: 'null' title: Title sectionCount: anyOf: - type: integer - type: 'null' title: Sectioncount children: anyOf: - items: $ref: '#/components/schemas/StructureNode' type: array - type: 'null' title: Children type: object required: - kind title: StructureNode CorrespondingProvisionItem: properties: oldAct: type: string title: Oldact oldSection: type: string title: Oldsection newAct: type: string title: Newact newSection: type: string title: Newsection subject: type: string title: Subject description: The NEW provision's own heading, as printed in the publisher's correspondence table. It is not the repealed section's heading, and where the recodification changed the offence the two differ. effectiveDate: type: string title: Effectivedate type: object required: - oldAct - oldSection - newAct - newSection - subject - effectiveDate title: CorrespondingProvisionItem CorrespondingProvisionsResponse: properties: oldAct: type: string title: Oldact newAct: type: string title: Newact effectiveDate: type: string title: Effectivedate provisions: items: $ref: '#/components/schemas/CorrespondingProvisionItem' type: array title: Provisions total: type: integer title: Total coverage: additionalProperties: true type: object title: Coverage description: 'How much of the old code this mapping covers, where it came from, and how it was checked. `source` names the government publication the table is transcribed from, so a caller can go and read it. 🔴 It is still not a complete concordance: a section absent here is NOT thereby unchanged, and the correspondence is many-to-many in places. Read `numberedSectionsMapped` before treating an absent section as unmapped-because-unchanged.' meta: $ref: '#/components/schemas/ActMeta' type: object required: - oldAct - newAct - effectiveDate - provisions - total title: CorrespondingProvisionsResponse 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. ActFiltersResponse: properties: data: $ref: '#/components/schemas/ActFiltersData' meta: $ref: '#/components/schemas/ActMeta' type: object required: - data title: ActFiltersResponse ActCitedByResponse: properties: actId: type: string title: Actid title: anyOf: - type: string - type: 'null' title: Title citation: anyOf: - type: string - type: 'null' title: Citation citers: items: $ref: '#/components/schemas/CitedByRow' type: array title: Citers total: type: integer title: Total description: Distinct citing PROVISIONS across all pages, not rows on this page (that is `returned`) and not matching passages. One provision can be stored as many passages, so this is always the smaller of the two. totalIsExact: type: boolean title: Totalisexact description: False when the corpus scan behind `total` hit its ceiling, which makes `total` a floor rather than a count. The ceiling sits above the largest citing set in the corpus, so this is true today. returned: type: integer title: Returned description: Rows in `citers` on THIS page. page: type: integer title: Page description: 1-based page this response answers. pageSize: type: integer title: Pagesize description: Rows per page requested. hasMore: type: boolean title: Hasmore description: True when a further page of citing provisions exists. truncated: type: boolean title: Truncated description: 'DEPRECATED, kept so an existing client does not break. True when `hasMore` is true or `totalIsExact` is false. Read those two instead: this one field cannot tell ''there is a page 2'' apart from ''we stopped counting''.' matchBasis: type: string title: Matchbasis description: '`publisher_title`: edges are matched on the act''s title as the publisher wrote it, so treat the result as a floor.' note: anyOf: - type: string - type: 'null' title: Note resolvedFrom: anyOf: - $ref: '#/components/schemas/IdentifierResolution' - type: 'null' description: How your act_id or section number was matched, when it did not match exactly as sent. Null when it did. meta: $ref: '#/components/schemas/Meta' type: object required: - actId - total - totalIsExact - returned - page - pageSize - hasMore - truncated - matchBasis - meta title: ActCitedByResponse ActMeta: properties: processingTimeMs: type: number title: Processingtimems description: Server-side time in milliseconds, excluding network transit. Not billed on. default: 0.0 examples: - 315.0 creditsConsumed: type: number title: Creditsconsumed description: 'Credits ACTUALLY charged for this call. Read this rather than assuming the list price: refunded work bills 0.' default: 0.0 examples: - 3 type: object title: ActMeta description: 'What this call cost and how long it took. 🔴 Added 2026-09-06. Five of the six original routes returned NO statement of what they billed: `/text` (3 credits), `/amendments` (5), `/list` (1), `/filters` (0) and `/corresponding-provisions` (1). The house rule on the US surface is that `creditsConsumed` is the CONTRACT and the list price is not, and it matters most exactly where refunds happen -- `/text` refunds on a missing act, `/corresponding-provisions` refunds when a mapping does not exist yet. Without this field a caller cannot tell a refunded call from a charged one, and has to reconcile against the ledger to find out.' RepealClaim: properties: repealedBy: anyOf: - type: string - type: 'null' title: Repealedby repealedByYear: anyOf: - type: integer - type: 'null' title: Repealedbyyear source: anyOf: - type: string - type: 'null' title: Source sourceHandle: anyOf: - type: string - type: 'null' title: Sourcehandle commencementVerified: type: boolean title: Commencementverified description: 'Whether we checked that the repealing instrument was brought into force. Always false: we do not verify this, and at least one repeal on record involves an Act that never commenced.' default: false note: type: string title: Note type: object required: - note title: RepealClaim description: 'The publisher''s claim about repeal, with our caveat attached. Never flattened into a verdict. India Code lists the Industrial Disputes Act, 1947 as repealed by Act 37 of 2020, the Industrial Relations Code, which has never been brought into force. Serving that as flatly "repealed" would be wrong.' 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, so treat an unresolved parent as a spelling miss or a coverage gap rather than as the instrument having no parent. 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`. The 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 link is made by matching `parent_act_name` against a served act title, which misses where the publisher spelled the title differently, and `matchBasis` says so on every response rather than letting a caller assume a hard link.' CoverageResponse: properties: data: $ref: '#/components/schemas/CoverageData' meta: $ref: '#/components/schemas/Meta' type: object required: - data - meta title: CoverageResponse 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. Text held, structure held, amendments recorded and repeals recorded are INDEPENDENT columns. A single "we have it" number would hide which of them is true for a given act.' 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 SubordinateRow: properties: actId: type: string title: Actid title: anyOf: - type: string - type: 'null' title: Title citation: anyOf: - type: string - type: 'null' title: Citation delegationType: anyOf: - type: string - type: 'null' title: Delegationtype description: '`rules`, `regulations`, `notification` or `order`.' year: anyOf: - type: integer - type: 'null' title: Year actStatus: anyOf: - type: string - type: 'null' title: Actstatus type: object required: - actId title: SubordinateRow 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, so `passages` is the larger number.' 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 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.' ActSearchData: properties: results: items: $ref: '#/components/schemas/ActSearchResult' type: array title: Results totalReturned: type: integer title: Totalreturned type: object required: - results - totalReturned title: ActSearchData ActFilterValue: properties: value: type: string title: Value count: type: integer title: Count description: Sections in the corpus carrying this value type: object required: - value - count title: ActFilterValue 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 HTTPValidationError: properties: detail: items: $ref: '#/components/schemas/ValidationError' type: array title: Detail type: object title: HTTPValidationError ReferencedSection: properties: sectionNumber: anyOf: - type: string - type: 'null' title: Sectionnumber sectionTitle: anyOf: - type: string - type: 'null' title: Sectiontitle type: object title: ReferencedSection ActReferencesResponse: properties: actId: type: string title: Actid sectionNumber: anyOf: - type: string - type: 'null' title: Sectionnumber citation: $ref: '#/components/schemas/Citation' acts: items: $ref: '#/components/schemas/ReferencedAct' type: array title: Acts description: Other enactments this provision names. sections: items: $ref: '#/components/schemas/ReferencedSection' type: array title: Sections description: Sections of this act it cross-refers to. totalActs: type: integer title: Totalacts description: Distinct enactments this provision names, before the cap on rows. `acts` is shorter than this when the provision names more than the cap; `truncated` says so. totalSections: type: integer title: Totalsections description: Distinct own-act sections cross-referred, before the cap on rows. truncated: type: boolean title: Truncated description: 'True when either list was cut to the row cap. This route is not paged: one provision''s own outbound edges are a short list, and the cap exists only so a malformed passage cannot return unbounded output.' matchBasis: type: string title: Matchbasis note: anyOf: - type: string - type: 'null' title: Note resolvedFrom: anyOf: - $ref: '#/components/schemas/IdentifierResolution' - type: 'null' description: How your act_id or section number was matched, when it did not match exactly as sent. Null when it did. meta: $ref: '#/components/schemas/Meta' type: object required: - actId - citation - totalActs - totalSections - truncated - matchBasis - meta title: ActReferencesResponse ActListItem: properties: actId: type: string title: Actid title: type: string title: Title 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 actNumber: anyOf: - type: string - type: 'null' title: Actnumber actStatus: anyOf: - type: string - type: 'null' title: Actstatus enactmentDate: anyOf: - type: string - type: 'null' title: Enactmentdate description: Enactment date as `YYYY-MM-DD`, or null. See `enactmentDateRaw`. enactmentDateRaw: anyOf: - type: string - type: 'null' title: Enactmentdateraw description: The publisher's own string, when it differs from `enactmentDate`. citation: anyOf: - type: string - type: 'null' title: Citation description: How to cite the act, as the publisher titles it. Present only on index-backed listings. sectionCount: anyOf: - type: integer - type: 'null' title: Sectioncount description: Sections we hold for this act, so a caller can size a fetch before making it. Present only on index-backed listings. type: object required: - actId - title title: ActListItem description: Lightweight act summary for browsing and discovery. Meta: properties: processingTimeMs: type: number title: Processingtimems description: Server-side time for this request in milliseconds, excluding network transit. Not billed on. default: 0.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.0 examples: - 2 type: object title: Meta ActAmendmentsResponse: properties: actId: type: string title: Actid resolvedFrom: anyOf: - $ref: '#/components/schemas/IdentifierResolution' - type: 'null' description: Null when the act is exactly the `actId` you sent. Otherwise how your input was matched after copy damage (whitespace, quotes, a trailing period) was removed. title: type: string title: Title totalFootnotes: type: integer title: Totalfootnotes description: Footnotes on THIS page, not in the act. Paging is by `page`/`pageSize`, so this equals `pageSize` on a full page. footnotes: items: $ref: '#/components/schemas/FootnoteItem' type: array title: Footnotes typeCounts: additionalProperties: type: integer type: object title: Typecounts page: type: integer title: Page default: 1 pageSize: type: integer title: Pagesize default: 100 hasMore: type: boolean title: Hasmore description: True when a further page of footnotes exists. default: false meta: $ref: '#/components/schemas/ActMeta' type: object required: - actId - title - totalFootnotes - footnotes - typeCounts title: ActAmendmentsResponse Retirement: properties: reason: anyOf: - type: string - type: 'null' title: Reason duplicateOf: anyOf: - type: string - type: 'null' title: Duplicateof observedOn: anyOf: - type: string - type: 'null' title: Observedon type: object title: Retirement ReferencedAct: properties: title: type: string title: Title description: The act's title as the publisher wrote it. actId: anyOf: - type: string - type: 'null' title: Actid description: Resolved id, when the title names an act we serve. resolved: type: boolean title: Resolved description: False when the publisher names an act we do not hold. A coverage fact, not a parse failure. type: object required: - title - resolved title: ReferencedAct ActSearchRequest: properties: query: type: string maxLength: 1000 minLength: 2 title: Query description: Search query. examples: - assessment of a registered dealer category: anyOf: - type: string enum: - central - state - regulatory - repealed - spent - type: 'null' title: Category description: 'Jurisdictional class. `repealed` and `spent` are accepted for backward compatibility and resolve against `actStatus` instead. Values: `central`, `state`, `regulatory`, `repealed`, `spent`.' examples: - central state: anyOf: - type: string 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 - type: 'null' title: State description: Jurisdiction slug. `central` is a value here, for Union legislation. Live counts per jurisdiction are on GET /acts/coverage. examples: - maharashtra department: anyOf: - type: string - type: 'null' title: Department description: 'Issuing body. Deliberately NOT an enumerated list: this field holds 943 distinct values and mixes clean regulator slugs (`sebi`, `rbi`, `moefcc`) with free-text state department names (`Law Department`). Read GET /acts/filters for the values with the most data behind them.' examples: - sebi actStatus: anyOf: - type: string enum: - in_force - repealed - superseded - spent - items: type: string enum: - in_force - repealed - superseded - spent type: array - type: 'null' title: Actstatus description: 'Filter by the publisher''s lifecycle status. Accepts one value or a list. This is the publisher''s claim, not our verdict: see GET /acts/{actId}/status. Values: `in_force`, `repealed`, `superseded`, `spent`.' examples: - repealed excludeRepealed: type: boolean title: Excluderepealed description: Drop provisions whose act the publisher records as repealed or spent. Off by default, because repealed law is still law that was in force and is routinely the thing being researched. default: false examples: - true isSubordinate: anyOf: - type: boolean - type: 'null' title: Issubordinate description: True for subordinate instruments only (rules, notifications, circulars, orders); false for principal acts only. Omit for both. examples: - false provisionType: anyOf: - type: string enum: - mandatory - general - prohibitory - overriding - discretionary - declaratory - items: type: string enum: - mandatory - general - prohibitory - overriding - discretionary - declaratory type: array - type: 'null' title: Provisiontype description: 'Filter by what the provision DOES. Accepts one value or a list. Values: `mandatory`, `general`, `prohibitory`, `overriding`, `discretionary`, `declaratory`.' examples: - mandatory sectionType: anyOf: - type: string enum: - amendment_provision - article - body - chapter_heading - definition_clause - definitions - part_heading - preamble - schedule - section - short_title - sub_section - items: type: string enum: - amendment_provision - article - body - chapter_heading - definition_clause - definitions - part_heading - preamble - schedule - section - short_title - sub_section type: array - type: 'null' title: Sectiontype description: 'Filter by structural kind of the passage. Accepts one value or a list. Values: `amendment_provision`, `article`, `body`, `chapter_heading`, `definition_clause`, `definitions`, `part_heading`, `preamble`, `schedule`, `section`, `short_title`, `sub_section`.' examples: - definitions legalSubject: anyOf: - type: string enum: - administrative_law - banking_finance - civil_procedure - constitutional_law - corporate_law - criminal_law - environmental_law - family_law - general - information_technology - intellectual_property - labour_law - property_law - tax_law - items: type: string enum: - administrative_law - banking_finance - civil_procedure - constitutional_law - corporate_law - criminal_law - environmental_law - family_law - general - information_technology - intellectual_property - labour_law - property_law - tax_law type: array - type: 'null' title: Legalsubject description: 'Filter by subject area, classified at ingest. Accepts one value or a list. Values: `administrative_law`, `banking_finance`, `civil_procedure`, `constitutional_law`, `corporate_law`, `criminal_law`, `environmental_law`, `family_law`, `general`, `information_technology`, `intellectual_property`, `labour_law`, `property_law`, `tax_law`.' examples: - tax_law matchType: type: string enum: - any - all - phrase title: Matchtype description: 'How query terms must appear in the provision text. `any` (the default) leaves hybrid ranking to do the work; `all` keeps only provisions containing EVERY query term; `phrase` keeps only those containing the exact phrase. ⚠️ It narrows the ranked candidate pool rather than re-querying the index, so a `phrase` search returns phrase matches WITHIN the top candidates, not every phrase match in the corpus. For an exhaustive phrase search, narrow with the structured filters first. Values: `any`, `all`, `phrase`.' default: any examples: - phrase page: type: integer minimum: 1.0 title: Page description: 1-based page number. `page * pageSize` may not exceed 100; narrow the query with filters to reach deeper matches. default: 1 examples: - 1 yearFrom: anyOf: - type: integer maximum: 2100.0 - type: 'null' title: Yearfrom description: Earliest year of enactment to include, inclusive. Matched against the publisher's own year field, which is occasionally corrupt, so there is no lower bound and a value below 1800 is a legitimate way to find those rows. examples: - 2015 yearTo: anyOf: - type: integer maximum: 2100.0 - type: 'null' title: Yearto description: Latest year of enactment to include, inclusive. examples: - 2024 sectionNumber: anyOf: - type: string - type: 'null' title: Sectionnumber description: 'Filter by exact section number. The publisher''s own numbering, which is not an integer: `498A`, `376DA` and `2-A` all occur, and the alphabetic suffix is part of the number rather than a sub-provision.' examples: - 498A actTitle: anyOf: - type: string - type: 'null' title: Acttitle description: Filter by words in the act's title. Each word must appear, so `Bharatiya Nyaya` narrows to the Sanhita. examples: - Bharatiya Nyaya Sanhita pageSize: type: integer maximum: 50.0 minimum: 1.0 title: Pagesize description: Results per page (1-50). default: 10 examples: - 10 additionalProperties: false type: object required: - query title: ActSearchRequest description: Search Indian legislation by semantic query. CitedByRow: properties: actId: type: string title: Actid title: anyOf: - type: string - type: 'null' title: Title citation: anyOf: - type: string - type: 'null' title: Citation sectionNumber: anyOf: - type: string - type: 'null' title: Sectionnumber sectionTitle: anyOf: - type: string - type: 'null' title: Sectiontitle type: object required: - actId title: CitedByRow 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 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 ActDefinitionsResponse: properties: actId: type: string title: Actid citation: anyOf: - type: string - type: 'null' title: Citation terms: items: $ref: '#/components/schemas/DefinedTerm' type: array title: Terms total: type: integer title: Total description: 'Distinct terms this act defines, across all pages. Not rows on this page: that is `returned`.' returned: type: integer title: Returned description: Rows in `terms` on THIS page. page: type: integer title: Page description: 1-based page this response answers. pageSize: type: integer title: Pagesize description: Rows per page requested. hasMore: type: boolean title: Hasmore description: True when a further page of terms exists. definitionSections: items: $ref: '#/components/schemas/ReferencedSection' type: array title: Definitionsections description: 'Provisions identified as definition clauses. Returned separately so a defining provision is reachable even when no terms were extracted from it. NOT paged: this list is short, and `page` moves `terms` only, so it is repeated in full on every page.' totalDefinitionSections: type: integer title: Totaldefinitionsections description: Definition clauses found, before the cap on rows. Larger than `len(definitionSections)` only in the pathological case. note: anyOf: - type: string - type: 'null' title: Note resolvedFrom: anyOf: - $ref: '#/components/schemas/IdentifierResolution' - type: 'null' description: How your act_id or section number was matched, when it did not match exactly as sent. Null when it did. meta: $ref: '#/components/schemas/Meta' type: object required: - actId - total - returned - page - pageSize - hasMore - totalDefinitionSections - meta title: ActDefinitionsResponse ActTextResponse: properties: actId: type: string title: Actid resolvedFrom: anyOf: - $ref: '#/components/schemas/IdentifierResolution' - type: 'null' description: Null when the act is exactly the `actId` you sent. Otherwise how your input was matched after copy damage (whitespace, quotes, a trailing period) was removed. title: type: string title: Title year: anyOf: - type: integer - type: 'null' title: Year category: anyOf: - type: string - type: 'null' title: Category textUrl: type: string title: Texturl pdfUrl: anyOf: - type: string - type: 'null' title: Pdfurl htmlUrl: anyOf: - type: string - type: 'null' title: Htmlurl chunksCount: type: integer title: Chunkscount default: 0 isSubordinate: type: boolean title: Issubordinate description: 'True for subordinate legislation: notifications, rules, circulars, orders. False for principal acts.' default: false issuedDate: anyOf: - type: string - type: 'null' title: Issueddate description: Date the instrument was issued by the publisher, where known. meta: $ref: '#/components/schemas/ActMeta' currencyStatus: type: string title: Currencystatus description: 'How far the currency of this document can be vouched for. `repeal_tracked`: the publisher records a repeal flag for this document, so a repealed instrument is identifiable. `as_issued`: served as issued on `issuedDate`, and it MAY HAVE BEEN SUPERSEDED since. India Code publishes no supersession status for subordinate legislation, and a superseding instrument names its predecessor only in prose, so this API cannot tell you whether a notification is still in force. Treat `as_issued` documents as evidence of what was issued on a date, not as a statement of current law.' default: unknown type: object required: - actId - title - textUrl title: ActTextResponse 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. errors: anyOf: - items: $ref: '#/components/schemas/ApiFieldError' type: array - type: 'null' title: Errors description: 'Present on 422 only: every field that failed validation.' type: object required: - detail title: ApiDetailError description: 'Error envelope the API actually returns. Every error (400/401/402/403/404/405/422/429/5xx) carries a `detail` string, e.g. `{"detail": "Insufficient API credits."}`, on every mount of the API. A 422 adds `errors`, one entry per rejected field. Some 404s add endpoint-specific diagnosis beside `detail` (the statutes section routes add `actId`, `reason` and `didYouMean`); treat unknown keys as optional.' 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 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 ActListResponse: properties: results: items: $ref: '#/components/schemas/ActListItem' type: array title: Results total: type: integer title: Total page: type: integer title: Page pageSize: type: integer title: Pagesize hasMore: type: boolean title: Hasmore meta: $ref: '#/components/schemas/ActMeta' note: anyOf: - type: string - type: 'null' title: Note description: Always set on this endpoint, naming the source that answered. On the normal path it carries the act index's BUILD DATE, because the listing is a snapshot and an act ingested after that date reaches search before it reaches here. If the index is unavailable the note is prefixed `DEGRADED:` and states the shortfall. A gap a caller can see is not the same as one they cannot. type: object required: - results - total - page - pageSize - hasMore title: ActListResponse ActSearchMeta: properties: processingTimeMs: type: integer title: Processingtimems creditsConsumed: type: number title: Creditsconsumed creditsRemaining: type: number title: Creditsremaining page: type: integer title: Page pageSize: type: integer title: Pagesize total: type: integer title: Total description: 'Passages in the corpus matching the filters. This is the size of the haystack, not the number of results you can page through: a single section spans several passages, and relevance gating plus act+section dedup run after retrieval. Treat it as an upper bound and a signal to narrow your filters, not as a result count.' totalPages: type: integer title: Totalpages description: Pages actually reachable, derived from the result window rather than from `total`. type: object required: - processingTimeMs - creditsConsumed - creditsRemaining - page - pageSize - total - totalPages title: ActSearchMeta 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.' 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. Roughly half of held records carry no date, so an absent date is ordinary and is named rather than nulled. The `coverage` block counts the dated events for THIS provision.' originalText: anyOf: - type: string - type: 'null' title: Originaltext description: The wording replaced, quoted by the publisher. Present on a minority of records, because most footnotes do not quote it. 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 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. 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' resolvedFrom: anyOf: - $ref: '#/components/schemas/IdentifierResolution' - type: 'null' description: How your act_id or section number was matched, when it did not match exactly as sent. Null when it did. meta: $ref: '#/components/schemas/Meta' type: object required: - actId - citation - events - total - coverage - meta title: ActSectionHistoryResponse ActFiltersData: properties: categories: items: $ref: '#/components/schemas/ActFilterValue' type: array title: Categories states: items: $ref: '#/components/schemas/ActFilterValue' type: array title: States departments: items: $ref: '#/components/schemas/ActFilterValue' type: array title: Departments truncated: items: type: string type: array title: Truncated description: 'Fields whose list below is INCOMPLETE. `department` holds 943 distinct values against a 256-value facet ceiling, so most of them are not shown. A value absent from a truncated list is NOT invalid, and search no longer rejects one: until 2026-09-06 it did, refusing filters on data the corpus holds.' type: object required: - categories - states - departments title: ActFiltersData DefinedTerm: properties: term: type: string title: Term sectionNumber: anyOf: - type: string - type: 'null' title: Sectionnumber description: Where the term is defined, when known. type: object required: - term title: DefinedTerm securitySchemes: ApiKeyAuth: type: http scheme: bearer bearerFormat: vq_key_* description: 'API key issued from the developer dashboard. Pass as `Authorization: Bearer vq_key_...` (preferred).' ApiKeyHeader: type: apiKey in: header name: X-API-Key description: 'The same API key as a bare header value: `X-API-Key: vq_key_...`. Equivalent to the Bearer form.' ApiKeyQuery: type: apiKey in: query name: api_key description: 'The same API key as a query parameter: `?api_key=vq_key_...`. Use only where you cannot set a header. A URL can end up in proxy and server logs, browser history and shared links, so prefer either header form, and rotate a key that has leaked.' x-refined-from: - vaquill-ai-india-openapi.json - vaquill-ai-india-openapi.yml