CFR Annual Editions API: Point-in-Time Regulations with corpusType=CFR_ANNUAL

The CFR you query today tells you what a regulation says now. It does not tell you what it said when the conduct happened, which is the version an enforcement action, an audit, or a contract dispute is actually about. corpusType=CFR_ANNUAL serves the Government Publishing Office's own printed annual editions of the Code of Federal Regulations, 31 editions from 1996 to 2026, all 49 titles. asOf=YYYY-MM-DD on a section body resolves a date through the CFR revision calendar to one of those editions and returns that edition's text as printed. This post covers how the resolution works, what each field of the asOf block claims, and the three limits that matter before you cite anything it returns.

Reviewed and corrected on 12 October 2026. This is general information, not legal advice.

TL;DR

  • 312,132 distinct sections, held as 886,066 section versions. The section count is what enters the federal total; the version count is depth in time. They are not additive.
  • This is not extra breadth. It is the same body of regulation as corpusType=CFR (222,311 sections), observed at published dates.
  • asOf runs over two engines and says which answered. asOf.engine is stored_edition for CFR_ANNUAL (and for the few other sources where we hold the publisher's own printed editions), meaning a published edition held verbatim, and observed_change for the corpora without held editions, meaning a reconstruction.
  • A title revises on a fixed quarter day. Titles 1 to 16 on January 1, 17 to 27 on April 1, 28 to 41 on July 1, 42 to 50 on October 1. So 40 C.F.R. on 2024-05-01 is answered by the 2023 edition.
  • editionsObserved is an enumeration, never a range. A year missing from it is an edition nobody parsed, and a date landing there is reported out of coverage rather than answered from a neighboring year.
  • The citation year is the volume's own revision statement, not the year it was printed. Publishers can reprint unchanged volumes forward without re-dating them.
  • Every point in this corpus is superseded law by construction. All 312,132 sections carry actStatus: "superseded", and none is certified good law.

Why the date matters: a rule applied backwards

Courts care which version of a rule was in force. The Supreme Court stated the default in Bowen v. Georgetown University Hospital, decided December 12, 1988: "Retroactivity is not favored in the law. Thus, congressional enactments and administrative rules will not be construed to have retroactive effect unless their language requires this result."

The facts are a tidy example of what goes wrong with the wrong version. In 1981 the Secretary of Health and Human Services issued a Medicare cost-limit schedule. A federal district court invalidated it, and the Secretary settled hospitals' reimbursement reports using the earlier method. In 1984 the Secretary reissued the 1981 rule and set out to recoup what had already been paid. The Court held the 1984 reinstatement invalid, because a grant of rulemaking power is not read to include retroactive rules unless Congress says so in express terms. You can read the full opinion at Cornell's Legal Information Institute.

For anyone building on regulations, that means "the text that applied" is a question about a date. A tool that can only show today's wording can't answer it.

What CFR_ANNUAL is, and what it is not

Two corpora carry federal regulations, and they answer different questions.

CFRCFR_ANNUAL
What it holdsThe CFR as it stands todayGPO's published annual editions
Sections222,311312,132
Versions per sectionOne current text886,066 versions across 31 editions
Coverage windowCurrent1996 to 2026
actStatusin_force on over 222,000 sectionssuperseded on all 312,132
asOf.engineobserved_changestored_edition
Cite it asCurrent lawThe text as printed on a stated revision date

The section counts do not sum, and the gap between them is not extra regulation. CFR_ANNUAL counts section addresses across 31 published editions, while CFR counts only what stands today, so the two answer different questions about the same body of law. Figures are from GET /us/statutes/coverage as read on 12 October 2026, which is free and authoritative over anything published here. For how fresh the current CFR corpus is, GET /boards carries a daily cadence and a lastRetrievedAt for it.

The storage model matters when you read a count. A section is stored once per distinct run of text across editions rather than once per edition, so a regulation reprinted unchanged for six years is one document that names all six years. That is why 886,066 versions cover 31 editions of 312,132 sections rather than the up to 9.7 million rows (312,132 sections times 31 editions) that storing every edition separately would produce.

The revision calendar

The CFR is not revised all at once. Each title has a fixed annual revision day, and asOf resolves your date against the day for the title you asked about.

TitlesRevised as of
1 to 16January 1
17 to 27April 1
28 to 41July 1
42 to 50October 1

A date of 2024-05-01 against title 40 lands after the 2023-07-01 revision and before the 2024-07-01 one, so the 2023 edition answers it. The same date against title 17 lands after 2024-04-01, so the 2024 edition answers it. Two sections cited in the same memo, on the same date, can therefore resolve to different edition years, and that is correct rather than a bug.

Loading diagram...

A short history: a yearly book that learned to go back in time

The CFR is old (the 1930s story of how it began is in the CFR API post), so here is the part that matters for dates. The National Archives lists the CFR as first published in 1938, with online availability from 1996 forward and a yearly issue. The same page says all titles are on Govinfo from 1997 to the current year, with some records back to 1996, and that when revised volumes are added "the prior editions remain on Govinfo as a historical set." It also calls these annual editions the official ones, as sanctioned by the Administrative Committee of the Federal Register (National Archives, About the CFR).

The daily-updated eCFR changed what "current" means, but not what "official" means. The eCFR, its publisher says, "provides a way of exploring the Code of Federal Regulations as it exists today and at points in time back to January 2017" (eCFR reader aids). That leaves a plain division of labor. For a date after January 2017 you have two government options, the printed edition and the daily compilation. For a date before that, the annual editions are the main published record, and GovInfo's holdings start in 1996 and 1997.

The asOf block, field by field

Every asOf answer carries a provenance block whose whole purpose is to stop the text being over-read. Read engine first, because isBounded does not make the same claim on both engines.

FieldWhat it carries
requestedThe date you asked for, echoed back
enginestored_edition or observed_change. Which backend answered
sourceOn stored_edition: published or unavailable. On observed_change: live, reconstructed or unavailable
existedOn observed_change, false when the section demonstrably did not exist yet on your date. On stored_edition, our out-of-coverage responses (1994 and 2002 below) also carried existed: false, so read available and source first
resolvedEditionYearThe revision year actually served, read from the edition's own printed revision statement
scheduledEditionYearThe year the calendar says should cover your date. Exposed so a disagreement is auditable
editionsObservedEvery edition year in which this text was observed, enumerated
outOfCoverageReasonA sentence explaining why no text was returned. Null when text was returned
basisChangeIdobserved_change only. The change event whose before-side supplied the text
observedFromobserved_change only. The earliest change ever captured for this section
isBoundedOn stored_edition, true means your date falls inside editions actually parsed. On observed_change, true means we observed no change affecting your date, which is not the same as there having been none
coverageA prose statement of the same limit, safe to show a reader verbatim

The two source values you will see on this corpus are published and unavailable. published means an edition we hold answered, verbatim. unavailable means the date is out of coverage for that section, and outOfCoverageReason says which of the three ways. reconstructed never appears on CFR_ANNUAL, because nothing here is reconstructed; it belongs to the observed_change engine that answers the corpora where we hold no printed editions, and it is the value you should treat with the most care when you see it elsewhere.

A worked resolution

Search the corpus first. Section ids are assigned at ingest, so take them from a response rather than building them from a citation.

curl -s https://api.vaquill.ai/api/v1/us/statutes/search \
  -H "Authorization: Bearer vq_key_..." \
  -H "Content-Type: application/json" \
  -d '{
    "query": "hazardous waste generator testing and recordkeeping",
    "corpusType": "CFR_ANNUAL",
    "limit": 3
  }'

Hits come back with an id of the form CFRANN_2017_T40_P268_S268_7 and a citation that names the edition. (The curl calls in this section need a key, so we did not run them as written. We ran the same requests through our MCP client on 12 October 2026. That search returned other 40 C.F.R. sections and editions among its first three hits, so the id below is shown as an example of the shape.)

{
  "actId": "CFRANN_2017_T40_P268_S268_7",
  "citation": "40 C.F.R. § 268.7 (2017 ed.)",
  "corpusType": "CFR_ANNUAL",
  "year": 2017,
  "titleNumber": "40",
  "sectionNumber": "268.7"
}

Now ask that section for a date. This response is trimmed: the full one also carries the printed text in plain.

curl -s "https://api.vaquill.ai/api/v1/us/statutes/section/CFRANN_2017_T40_P268_S268_7/body?asOf=2024-05-01" \
  -H "Authorization: Bearer vq_key_..."

The response returns the text of a different run than the one you started from, and says so:

{
  "actId": "CFRANN_2020_T40_P268_S268_7",
  "available": true,
  "source": "cfr_annual_edition",
  "asOf": {
    "requested": "2024-05-01",
    "engine": "stored_edition",
    "source": "published",
    "existed": true,
    "resolvedEditionYear": 2023,
    "scheduledEditionYear": 2023,
    "editionsObserved": [2020, 2021, 2022, 2023, 2024, 2025],
    "isBounded": true,
    "outOfCoverageReason": null
  }
}

Three things to notice. The returned actId is the run's own id, first observed in the 2020 edition, so the id you get back is not the id you asked with. editionsObserved says this exact text stood unchanged through six editions, which is a stronger statement than the single year in the citation. resolvedEditionYear and scheduledEditionYear agree here, which is the ordinary case and not the guaranteed one.

editionsObserved is an enumeration, not a range

This is the field most likely to be misread, and misreading it produces a confident wrong answer rather than an error.

Ask the same section for a date before coverage starts (we ran this on 12 October 2026 and the note and editionsObserved below are what came back):

{
  "available": false,
  "note": "1994-01-01 resolves to the 1993 edition of title 40, earlier than the first edition we hold (1999)",
  "asOf": {
    "requested": "1994-01-01",
    "engine": "stored_edition",
    "source": "unavailable",
    "scheduledEditionYear": 1993,
    "resolvedEditionYear": null,
    "editionsObserved": [1999, 2000, 2001, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025],
    "isBounded": false
  }
}

2002 is absent from that list. It sits between the first and last year held, so anything that treats the array as a span would report 2002 as covered. It is not. On 12 October 2026 we asked for asOf=2002-08-01, which resolves to the 2002 edition of title 40, and the response came back with available: false and the note "Nobody read the 2002 print, so we do not know what it said." It did not fall back to 2001 or 2003. A date of 2002-06-01 resolved to the 2001 edition instead, because title 40 is revised on July 1. Treat the array as a set membership test, never as a minimum and a maximum.

The printing year is not the revision year

A publisher can reprint an unchanged volume into the next year without re-dating it. So the year a volume was printed is not always the revision year of the text inside it. The API reference's own example is 4 C.F.R.: the 2024 printing is the January 1 2019 revision.

That is why two year fields exist. resolvedEditionYear is read from the volume's own printed revision statement and is the one to render. scheduledEditionYear is what the calendar computed, and it is exposed so the disagreement is auditable rather than so it can be displayed. Rendering the scheduled year would publish a citation to an edition that does not say what you claim it says.

Honest limits

State these to your users before they find them.

LimitWhat it means for you
Everything here is supersededAll 312,132 sections carry actStatus: "superseded" and none is certified good law. Use corpusType=CFR for what is in force
Coverage starts at 1996, and later for some titlesThe first edition held varies by title. A title 40 request for 1994 reports the first edition held as 1999, not 1996
Unobserved editions are gaps, not interpolationsA date landing on an unparsed edition returns no text and an outOfCoverageReason
Quarterly granularity, not dailyAn amendment effective in March of a title 40 section is not visible until the July 1 edition
Not additional regulationsThe same body of regulation as CFR, observed at published dates. Never add the two section counts
ChargesPer the API reference, an out-of-coverage date on stored_edition is an answer about what we hold and is charged (our 1994 and 2002 requests reported creditsConsumed: 6). An impossible calendar date such as 2026-02-30 is a 422 (we confirmed the 422, and the reference says it is not charged)

The quarterly granularity is the one that surprises people. If you need to know the day a rule changed rather than the edition it first appeared in, the annual editions are the wrong tool and the Federal Register API is the right one, because that is where the effective dates and the amendatory instructions live.

What developers ask for

The request this corpus exists to answer shows up in the public issue tracker for GovInfo's API. In April 2019 a developer asked: "Is their any API endpoint output that gives us the difference in old regulation text and new within the code of Federal Regulations, for any rule changes published in the federal register." The GovInfo reply was candid: "we do not currently have any functionality that would provide a diff of old vs. new regulation text within the CFR," along with a pointer to comparing a previous edition of the eCFR with a new one (GitHub, April 2019).

The thread was updated in December 2025. The newer answer points to ecfr.gov, "which includes the ability to see differences in CFR sections between dates," and adds that "the ecfr.gov API also provides access to CFR content on a specific date, which could enable this (with local diffing of two different dates." So the government's own answer to "what changed" is a compare view on the eCFR, plus dated snapshots you can diff yourself. That is a fair answer, and it is why the two ends of any diff, the printed edition and the Federal Register amendment that moved it, matter so much.

Where this sits against the rest of the corpus

Point-in-time law comes in two forms with different guarantees, and this corpus is one of them. A published edition is text a government printed on a date and you can cite it as such. A reconstruction is assembled from changes we observed, reaches back only as far as capture began for that source, and cannot be cited the same way. Amendment history and point-in-time law works through when each applies and what to build when neither is available.

For the current CFR, its title and part hierarchy, and the daily refresh behind it, see the CFR API post. For why every point here comes from GPO rather than a commercial mirror, see legal data provenance. For learning that a section you snapshotted has moved since, see how legal change detection works.

Which version applies?
Question 1 of 4

A company is accused of a violation that happened in March 2022. To check the rule, an associate pulls the regulation from a government site that shows today's text. What is the risk?

FAQ

What is corpusType=CFR_ANNUAL?

It is the token for GPO's officially published annual editions of the Code of Federal Regulations, 31 editions from 1996 to 2026 across all 49 titles. It holds 312,132 distinct sections as 886,066 section versions. It is distinct from corpusType=CFR, which is the CFR as it stands today and is what you should query for current law.

How does asOf pick which edition answers my date?

It looks up the fixed annual revision day for the title you asked about, then selects the most recent edition revised on or before your date. Titles 1 to 16 revise on January 1, 17 to 27 on April 1, 28 to 41 on July 1, and 42 to 50 on October 1. A request for 2024-05-01 against a title 40 section therefore resolves to the 2023 edition, because title 40 revises on July 1.

What is the difference between asOf.engine and asOf.source?

engine names which backend answered and is the field to read first: stored_edition for CFR_ANNUAL and the few other sources where we hold printed editions, observed_change for the corpora where we do not. source is the detail within that engine, so on CFR_ANNUAL it is published when an edition we hold answered and unavailable when the date is out of coverage. reconstructed and live only appear on the observed_change engine, where the earlier text is rebuilt rather than printed.

Why is editionsObserved a list rather than a first and last year?

Because a year between the first and last can be an edition nobody parsed, and treating the array as a range would silently claim coverage of it. A live example: a title 40 section lists 1999, 2000, 2001, then 2003, with 2002 absent. A date resolving to the 2002 edition of that section is reported out of coverage rather than answered from 2001 or 2003.

Can I cite text returned by asOf on this corpus?

You can cite it as the text GPO printed as of the revision date the response names in resolvedEditionYear, which is what the citation string on the section already says, for example "40 C.F.R. section 268.7 (2017 ed.)". Cite that year, never scheduledEditionYear, because GPO reprints unchanged volumes forward and the two can disagree. Do not cite it as current law: every section in this corpus carries actStatus: "superseded".

Does this corpus tell me whether a regulation is still good law?

No, and it is not built to. Every point is superseded by construction, and none carries a certified good-law verdict. For what is in force today, query corpusType=CFR, and for the rulemaking that changed it, query corpusType=FEDERAL_REGISTER.

What happens if I ask for a date before coverage begins?

The response comes back with available: false, asOf.source: "unavailable", asOf.isBounded: false, and an outOfCoverageReason sentence naming the earliest edition held for that title. No text is returned. On stored_edition the API reference treats an out-of-coverage date as an answer about what we hold, so it is charged: our 1994 request reported creditsConsumed: 6. A date that does not exist on a calendar, such as 2026-02-30, is rejected as a 422 (we saw it on 12 October 2026), and the reference says it is not charged.

Why did the response come back with a different actId than the one I sent?

Because a section is stored once per distinct run of text rather than once per edition, and the id names the first edition of the run. Asking a 2017 run for a 2024 date returns the run that actually covered 2024, so CFRANN_2017_T40_P268_S268_7 can answer with CFRANN_2020_T40_P268_S268_7. Both are stable ids for the same citation at different points in time, and the editionsObserved array tells you which years the returned run spans.

Is the section count in CFR_ANNUAL additional coverage?

No. It is the same body of regulation as the CFR corpus, observed at published dates, so the 312,132 sections here and the 222,311 in CFR must never be added together. Depth in time is the 886,066 version count, not a larger section total.

Start here

GET /us/statutes/coverage is free, returns a legend and per-jurisdiction counts for every corpus type including this one, and is authoritative over any figure published on this site. The edition resolution rules and the full field reference live in the point-in-time documentation and the federal coverage page, and the token list is at corpus types.

Connect our US primary law database.
Every US statute, regulation, constitution, and executive order via REST, MCP or SQL. 5.4M+ sections, section-level citations, and links to the official source. Plus a free open dataset.
Updated October 12, 202622 min read

New legal AI guides, weekly.

Priyansh Khodiyar

Priyansh Khodiyar

Co-Founder & CTO

Priyansh leads engineering and AI at Vaquill AI: the pipelines that pull statutes, regulations and court rules from every US jurisdiction's official publisher, and the REST API, MCP server and open dataset that serve them.