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 theisSubordinate 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 thestate filter.
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. AnasOf 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, includingcommencementVerified.
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.
10.7% of acts carry no link to the publisher’s document
We servesourceUrl 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.
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 arecategory, 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 underhttps://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 theregulatory 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.
