Skip to main content
GET
Get this section's change history

Authorizations

Authorization
string
header
required

API key issued from the developer dashboard. Pass as Authorization: Bearer vq_key_... (preferred).

Path Parameters

act_id
string
required

Section identifier, e.g. USC_T42_C21_S1983 (Title 42, Chapter 21, Section 1983, which a lawyer writes as 42 U.S.C. § 1983). Take it from a /us/statutes/search or /us/statutes/resolve result.

A citation also works here: 26 U.S.C. § 1, 42 USC 1983 or Cal. Civ. Code § 1950.5 is resolved with the same resolver /resolve uses, and the section is served. A citation costs this endpoint's price PLUS the /resolve price (2 credits), charged as its own line whether or not it resolves, exactly as /resolve charges; that is the same total as calling /resolve and then this endpoint, in one round trip. An exact act_id costs only this endpoint's price. When a citation resolves, or when the id only matched after surrounding whitespace, quotes or a trailing period were removed, the response carries resolvedFrom saying what your input was matched as. Check it the way you would check a /resolve answer. A citation containing / cannot travel in a URL path segment; resolve it with GET /us/statutes/resolve instead.

Do not assemble an id from a citation: the title and section are derivable, but the CHAPTER is not, so USC_T26_S1 misses. A miss returns 404 with reason and, where the section exists under another id, didYouMean.

State session laws (acts as enacted, ids starting SSL_) are not code sections: read them at /us/session-laws/{sessionLawId}.

Required string length: 3 - 200
Example:

"CFR_T21_P314_S314_50"

Query Parameters

limit
integer
default:50

Max changes to return on this page.

Required range: 1 <= x <= 200
Example:

50

sinceId
integer | null

Return only changes with an id greater than this: the cursor for polling forward into new changes. Ids are a monotonic sequence, so this is exact, immune to clock skew, and cannot drop two changes that share a timestamp. Carry cursor forward.

Required range: x >= 0
beforeId
integer | null

Return only changes with an id less than this: the cursor for walking BACK through history, which is what a newest-first reader needs. Pass the smallest id on your last page.

Required range: x >= 0
changeKind
enum<string>[] | null

Filter to these kinds. Repeat the parameter to pass several (?changeKind=amended&changeKind=removed). Omit for all three.

Available options:
added,
amended,
removed
order
enum<string>
default:desc

desc (default) is newest first, the natural reading order for a history. Use asc to replay a section's life forward, or when catching up from a cursor.

Available options:
asc,
desc

Response

The section's captured change history, newest first.

Response for GET /us/statutes/section/{act_id}/changes.

actId
string
required

The act_id of the section served. Equal to your request unless resolvedFrom is set, in which case it is the id your citation or cleaned-up input resolved to.

Example:

"CFR_T21_P314_S314_50"

coverage
string
required

What this history can and cannot tell you, in one sentence. Change capture began well after the corpus itself did and is swept on a retention window, so this endpoint reports the changes we OBSERVED in that window, never the section's full legislative history. Read it before treating an empty list as 'unchanged'.

Example:

"Observed changes only, from when capture began for this source through today, retained 24 months. Not a full legislative history."

section
StatuteResult · object | null

The section as it stands today. NULL is meaningful and not an error: it means the section is no longer in the corpus, which is exactly the case when the newest change is a removed. The history below is still the answer.

changes
StatuteChangeEvent · object[]

Observed changes, newest first by default. Empty is a real answer, and it means NO CAPTURED CHANGE, not that the section has never been amended. See coverage.

total
integer
default:0

Size of changes on this page, not a corpus-wide count: it is capped by limit.

Example:

3

hasMore
boolean
default:false

True when the page filled to limit, so more may sit behind it. Page with beforeId (walking back) or sinceId (walking forward) rather than by raising limit.

cursor
integer | null

Highest id on this page, or null when the page is empty. Carry it into sinceId to poll for what is new; keep the one you hold when a page comes back empty.

Example:

91

observedFrom
string | null

The earliest change we ever captured for this section: the OBSERVATION HORIZON this history sits on. Read it before treating an empty or short list as the section's full history.

Null means we have never captured a change for this section, so an empty changes list is not evidence that it is stable. A non-null value with an empty list means your filters or cursor excluded everything we hold, which is a different answer.

coverage states the same caveat in prose. This is the fact behind it, and it is the same field, meaning the same thing, as asOf.observedFrom on GET /section/{actId}/body.

Example:

"2026-08-14T04:10:00Z"

resolvedFrom
SectionIdentifierResolution · object | null

Null when the section is exactly the act_id you sent. Otherwise how your input was matched: a citation, or an act_id with transport damage (whitespace, quotes, a trailing period) removed.

processingTimeMs
number
default:0

Server-side time for this request in milliseconds, excluding network transit. Useful for spotting a slow query; not billed on.

Example:

18.4

creditsConsumed
number
default:0

Credits actually charged for this call. Read it rather than assuming the list price: failed and refunded work bills 0.

Example:

1

Last modified on October 9, 2026