Skip to main content
64,179 served acts and 745,970 distinct sections, covering Union legislation, the legislation of every State and Union Territory we hold, and instruments issued by statutory regulators. Act-level figures were measured by a full distinct-act scan on 2026-09-06.
This is a separate corpus, a separate OpenAPI document and a separate set of routes from the US statutes API. Nothing on this page describes the US surface, and no corpusType token from the US API applies here.
Two different units, measured two different ways. A section is one distinct (act, section) pair, and it is the unit a lawyer thinks in. A passage is one retrieval chunk, and a section spans about 3.4 of them, so the collection holds far more passages than sections. Act and section counts on this page come from a dated scan; passage counts on GET /acts/coverage are faceted live. Divide passages by sections if you must, never multiply sections by anything, and never read a passage count as a section count.

What the corpus holds

Distinct acts and distinct (act, section) pairs, measured 2026-09-06. Served acts are indexed as 2,461,060 retrieval passages, inside a collection of 2,532,537 points that also carries the retired records.

By category

category is the top-level split, and it is what you filter on when you want a whole class of instrument rather than one jurisdiction. repealed and spent are also accepted as category values for backward compatibility. They resolve against act_status rather than category, so they select acts the publisher records as repealed or spent in any jurisdiction. GET /acts/coverage publishes this same legend as categoryLegend, and GET /acts/filters returns the live vocabulary with counts, free.

By publisher status

Read Status is a claim, not our verdict before treating any of these as a currency judgement.

Subordinate instruments

37,013 of the 64,179 served acts are subordinate instruments: rules, regulations, notifications and orders made under a parent act rather than enacted by a legislature. Include or exclude them with the isSubordinate filter on search. Every response that names a parent resolves it by title match, not by a stored key, and says so in matchBasis. Title matching resolves a parent for 85.8% of the instruments that name one. The stored parent_act_id field is not usable for this: all 35,502 values are the publisher’s own identifiers, not ours, so a hard link would resolve to nothing.

Jurisdictions

Distinct acts and sections per jurisdiction, measured 2026-09-06, sorted by act volume. The middle column is the literal value to pass to the state filter.
These rows sum to 45,578 acts and 574,399 sections, not to the corpus total. 18,601 served acts carry no jurisdiction value at all and cannot appear here. Most of them are the 11,946 regulator instruments, which are filed under category=regulatory with no state, and the rest are central legislation that carries no jurisdiction key. Reach those with category, not with state.
[split] marks three jurisdictions that are stored under two slugs each, and a single-slug filter will silently miss the other half. Jammu and Kashmir is jammu-kashmir (128 acts) and jammu-and-kashmir (79). The Andaman and Nicobar Islands are andaman-and-nicobar-islands (201) and andaman-nicobar (37). Dadra and Nagar Haveli is dadra-and-nagar-haveli-and-daman-and-diu (298) and dadra-nagar-haveli (146). Pass both slugs, or use search without a state filter and read the value off each result, until this is fixed at ingest.

Depth: what we hold about an act, not just the act

This is the part of the page to read before you build on this API. “We hold the text of this act” and “we hold the record of what amended it” are different claims, and only the first is true for most of the corpus. GET /acts/coverage publishes the same four columns as a depth block so your code can read them rather than trusting this page. A further 840 acts carry a non-zero amendment count with no parseable amendment record behind them. Those acts return an empty event list, and the response says so in its own coverage block rather than leaving the emptiness to be read as “nothing ever changed”. 1,901 acts claim an amendment; we hold the events for 1,061 of them.

Inside the amendment record

About 3.15% of those records (1,035) are exact duplicates of another record on the same section, so a count of events on one provision can overstate the number of distinct amendments. Every event carries an appliedStatus. It is not_applied on all of them, because of the next point.

Limits you would otherwise find in production

We do not apply amendments to the text we serve

We serve the publisher’s text as published. We do not rewrite it to incorporate the amendments we list. Every amendment event states this on itself, so currency never has to be inferred from silence. There is consequently no point-in-time text reconstruction on this API. An asOf parameter over unversioned text would be a wrong answer shaped like a right one, so it is not offered. The US statutes API does offer point-in-time reconstruction; that is a different corpus with versioned editions behind it.

Status is a claim, not our verdict

actStatus, repealedBy and repealedByYear are the publisher’s statements. We do not verify that a repealing Act was ever brought into force, and at least one repeal on record involves an Act that never commenced. GET /acts/{actId}/status keeps three vocabularies apart on purpose:
  • publisherStatus, which is India Code’s claim;
  • servedStatus, which is our own serving decision;
  • repealClaim, which is the repeal record plus our caveat, including commencementVerified.
A derived goodLawStatus maps an unverified repeal claim to unknown, not to not_good_law. The Factories Act, 1948 is the worked example: its recorded repeal is by the Industrial Relations Code, 2020, which has never been brought into force.

GET /acts/list is a dated snapshot, not a live query

GET /acts/list enumerates every served act, 64,179 of them, and pages over a total order, so walking the offsets returns each act exactly once with a total that does not move underneath you. It answers from an act index rebuilt on the ingest cadence rather than from the live collection, so it is a snapshot with a date. An act ingested after that build is returned by POST /acts/search and by the act routes before it appears here. Every response states the build date in note. Until 2026-09-08 this route read a legacy table that predated the corpus and saw about 22,000 acts, roughly a third. If you built against that limitation, you can drop the workaround.

The citation graph matches on titles, so it under-reports

GET /{actId}/cited-by and GET /{actId}/subordinate find edges by matching the act’s TITLE as the publisher wrote it, because that is what the corpus stores. Citing provisions are inconsistent about the leading article, so we try several spellings, but a citing document that names an act differently again is not found. total is the count of distinct provisions matched, not of passages, and totalIsExact tells you whether the scan reached its ceiling. Treat a count as a floor. We serve sourceUrl for 57,316 acts, which is 89.3%. The remaining 6,863 return a named reason rather than a bare null, so “we have no link” is distinguishable from “not applicable”. The main cause is that India Code migrated from indiacode.nic.in to indiacode.gov.in around 2026-08-19 and re-minted every item handle with no redirect map. The stored deep links are not merely stale, they 404. They are blanked rather than rewritten, because pointing an old handle at the new host produces a different 404 that merely looks current. An empty provenance URL is allowed; a broken one would be a false statement. Only live official Indian publishers are served in this field: .gov.in and .nic.in hosts, plus rbi.org.in, the Reserve Bank of India. No commercial legal database is a source or a link target.

703 acts are retired and are not served

They are held and deliberately withheld: 305 as duplicates of an act we kept, 190 as withdrawn by the publisher, and 208 with no reason recorded. Nothing was deleted. A retired act returns 404 with a reason from the text and amendment routes, and is refunded. GET /acts/{actId}/status answers it rather than 404ing, with servedStatus: retired and the reason, because “we withdrew this” is a more useful answer than “no such thing”.

Citation strings are served with known cosmetic defects

citation is present on 99.9% of served acts and is what you would paste into a brief, so these are worth knowing about before you render it verbatim:
  • 6,646 acts (10.4%) have a title ending in a period, so the citation reads The Maharashtra Value Added Tax Act, 2002., s. 23.
  • 3,003 acts (4.7%) carry no year in the title and no year field, so the citation identifies no edition.
Both are ingest repairs, not serving bugs, and neither affects which provision you get back.

The IPC to BNS mapping is official, and still not exhaustive

GET /acts/corresponding-provisions/{actCode} serves 534 IPC to BNS pairs and 518 CrPC to BNSS pairs, transcribed from the correspondence tables the Bureau of Police Research and Development publishes under the Ministry of Home Affairs. The response carries the publication and its URL in a source block, and coverage.basis reads official-publication. numberedSectionsMapped is derived, not asserted: 477 of the IPC’s 511 numbered sections and 469 of the CrPC’s 484. isComplete stays false, because the official tables themselves do not pair every section. A section absent from the mapping is not necessarily unchanged. Some offences were dropped rather than renumbered, and at least one has no counterpart the publisher is willing to name: BPRD lists BNS 152 as a new provision rather than as the successor to IPC 124A, so we do not serve it as one. Both codes remain live law simultaneously for the lifetime of pending trials, so a mapping is a research aid and not a substitution rule. Before 2026-09-08 this route served 30 curated IPC pairs and 18 CrPC pairs, and five of those CrPC pairs named the wrong BNSS section. If you cached any of it, re-fetch.

An unmatchable filter value is now refused, not charged

A filter value outside the published vocabulary returns 422 and costs nothing. Until 2026-09-08 it returned HTTP 200 with an empty result set and a full charge, so a request that could never match anything was billed as a legitimate no-results answer. The enforced vocabularies are category, actStatus, provisionType, sectionType, legalSubject, state and sort. An inverted year range (yearFrom greater than yearTo) is refused the same way. department and ministry are not enforced and never will be. department has 943 distinct values and GET /acts/filters truncates its own list at 256, so a closed list would reject values we actually hold. The enforced vocabularies are faceted from the corpus rather than read from a fixed list, so a value a future ingest introduces is served immediately rather than starting to 422. If your integration relied on an empty 200 for an invalid filter, it will now see a 422 naming the parameter and the values it accepts.

Endpoints and what they cost

Eighteen routes, all under https://api.vaquill.ai/api/v1/in/acts, plus GET /api/v1/in/api-credits/pricing which is free and needs no key. Costs are in API credits, taken from the live pricing matrix; GET /api-credits/pricing is authoritative. Full request and response shapes are in the India API Reference.
GET /acts/coverage is free for the same reason the US coverage endpoint is: a consumer who cannot see what the corpus holds cannot tell a gap from a bad query, and charging for that answer compounds the confusion.

Sources and refresh

The corpus is built from India Code, the Government of India’s official repository of Central and State legislation, and from statutory regulators’ own sites for the regulatory category. No commercial database is a source. India Code is re-swept on a weekly cadence, and each sweep is diffed against the previous one to produce added, changed and withdrawn sets. Act-level counts on this page move only when a new census scan is run, which is why every figure here is stamped with the date it was measured.

US coverage

The separate US statutes corpus: federal, all 56 state and territory jurisdictions, and agency guidance.

Authentication

One vq_key_ credential and one credit ledger serve both jurisdictions.
Last modified on October 9, 2026