Skip to main content
Every section in the Vaquill AI corpus has one canonical identifier: its actId. It is stable, unique, and the key you use to fetch a section’s metadata and full text. You never construct an actId by hand. You get it from search results and pass it back to the section endpoints.

What an actId looks like

actId values encode the section’s place in the source hierarchy. A few examples: State sections follow the same idea, encoding the state’s code and section structure. Treat the whole string as an opaque key: read it from a result, store it, and pass it back unchanged.

The workflow

1

Search to get an actId

POST /us/statutes/search returns result objects, each with an actId.
2

Fetch section metadata

GET /us/statutes/section/{actId} returns the full result object for that one section (citation, hierarchy, source URLs).
3

Fetch full text

GET /us/statutes/section/{actId}/body returns the section’s full text. Returned only when text is available.
4

Optional: fetch its neighbors

GET /us/statutes/section/{actId}/related returns the section’s immediate statutory neighbors - the previous and next section within the same container (chapter, part, or code). This is not numeric adjacency; it’s what a lawyer would actually turn to next when reading a section in context.

Result and hierarchy fields

Search results and the section object share the same shape. Alongside actId, these fields describe where a section sits and how to cite it:
titleNumber can be alphanumeric (some states use ids like 13A), so treat it as a string, not an integer.

Example: search, then fetch

This walks the full path: run a search, take the first actId, fetch its metadata, then fetch its body.
A 404 on either section endpoint means no section was found, and the /body endpoint returns text only when it is available. Check available before reading html or plain.

When an actId misses

The batch route POST /us/statutes/sections takes up to 50 actIds and tells you WHY each one missed, which is the difference between a bug in your code and a gap in ours. Alongside sections it returns notFound (the bare ids) and notFoundDetail, one entry per missed id: reason: "assembled_id" means this id does not exist, but the section does, under the ids in didYouMean. That is almost always an id built from a citation. The chapter, article and part segments are not derivable from a citation, so Tex. Property Code § 93.005 is STATE_TX_Cpr_C93_S93.005, not STATE_TX_C93_S93.005. Send one of the suggested ids back and you get the section. reason: "not_in_corpus" means nothing matching was found: either the id is malformed beyond recovery, or the section is genuinely absent. Check GET /us/statutes/coverage for that jurisdiction before reading it as missing coverage.
Ids in notFound are not charged, so a batch with misses costs less than 50 times the per-section rate. notFoundDetail is diagnostic only and never charged. It can come back empty if the suggestion lookup is unavailable, so treat it as a hint rather than a contract.
If you are starting from a citation rather than a search result, use GET /us/statutes/resolve instead of assembling an id. That is what it is for.

Finding a section’s neighbors

GET /us/statutes/section/{actId}/related returns the sections immediately before and after the one you already have, within the same container:
cURL
The response carries previous and next arrays (each a full section object, same shape as a search result) plus a container label naming what they’re neighbors within (e.g. the enclosing chapter or part). Useful for “show me the surrounding sections” without a second search call - reading § 1983 alongside §§ 1981-1982 and 1985 in one request, for example.

Response Formats

The text formats and source URLs a section can carry.

Corpus Types

The corpusType tokens you filter a search by.
Last modified on September 6, 2026