The US stablecoin law, the GENIUS Act, was signed on 18 July 2025. Since then the federal banking agencies and Treasury have been publishing proposed rules, notices and, now, final rules. Every one of them lands in the Federal Register, which has a free, keyless JSON API.
This post walks through a short script that builds a clean list of those documents, and through the two traps I hit on the way: a search term that matches far too much, and a "document type" field that does not mean what you think.
The endpoint
GET https://www.federalregister.gov/api/v1/documents.json
Useful parameters:
-
conditions[term]for full-text search -
fields[](repeatable) to choose which fields come back -
per_page(up to 100) andorder - the response's
next_page_urlfor pagination
No API key and no auth. Be polite with request rates anyway.
Version 1: search for "GENIUS"
import requests
API = "https://www.federalregister.gov/api/v1/documents.json"
ENACTED = "2025-07-18" # GENIUS Act signed into law
def fetch(term):
params = {
"conditions[term]": term,
"per_page": 100,
"order": "oldest",
"fields[]": ["document_number", "publication_date", "type",
"action", "title", "effective_on", "citation"],
}
url, docs = API, []
while url:
r = requests.get(url, params=params, timeout=30)
r.raise_for_status()
page = r.json()
docs += page.get("results", [])
# next_page_url already carries the query string
url, params = page.get("next_page_url"), None
return docs
raw = fetch("GENIUS")
print(len(raw))
When I ran this on 27 October 2026 it returned 116 documents. Most of them have nothing to do with stablecoins. The full-text search matches the word anywhere, so you get State Department notices about exhibitions of "culturally significant objects" with "genius" in the exhibition title, and Interior Department notices about the Theodore Roosevelt Genius Prize.
Version 2: filter on title and date
The cheap fix worked well. Keep a document only if it was published on or after the enactment date and its title mentions "stablecoin" or "genius":
def relevant(doc):
t = doc["title"].lower()
return (doc["publication_date"] >= ENACTED
and ("stablecoin" in t or "genius" in t))
docs = [d for d in raw if relevant(d)]
from collections import Counter
print(len(docs), Counter(d["type"] for d in docs))
Output on 27 October 2026:
23 Counter({'Proposed Rule': 16, 'Notice': 5, 'Rule': 2})
Twenty-three documents. That matches the list VASP Tracker keeps on its US stablecoin rulemaking page. I treat that agreement as a sanity check, not proof. If you need completeness, also query by agency and by docket.
Trap 2: "Proposed Rule" doesn't always mean a proposal
The type field is the Federal Register's category, not a description of what the document does. One example is FDIC document 2026-02665, published 11 February 2026. Its type is "Proposed Rule", but it is an extension of a comment period on an earlier proposal.
So if you want to know what a document actually does, read the action field:
for d in docs:
if d["type"] == "Rule":
print(d["publication_date"], d["document_number"], d["citation"],
d["action"], "| effective:", d["effective_on"])
2026-09-30 2026-19966 91 FR 61688 Interim final rule; request for comments. | effective: 2026-09-30
2026-10-23 2026-21706 91 FR 67000 Final rule. | effective: 2027-01-18
The first is a Treasury interim final rule on forms and procedures for the review of state certifications by the Stablecoin Certification Review Committee. Comments close 30 November 2026. The second is the OCC's final rule implementing the Act for issuers under OCC jurisdiction. Its dates section says it "is effective on January 18, 2027."
The "earlier of" rule, in code
Why does a final rule matter so much? Section 20 of the Act says it takes effect on the earlier of:
- 18 months after enactment, or
- 120 days after the primary Federal payment stablecoin regulators issue any final regulations implementing the Act.
That second trigger is why people kept watching for final rules. The arithmetic is easy to check:
from datetime import date, timedelta
enacted = date(2025, 7, 18)
eighteen_months = date(2027, 1, 18) # 18 calendar months later
occ_final = date(2026, 10, 23) # Federal Register publication
via_rule = occ_final + timedelta(days=120) # 2027-02-20
print(min(eighteen_months, via_rule)) # 2027-01-18
Even if you count from the OCC's announcement on 21 October 2026, the 120-day date is 18 February 2027. Both are later than 18 January 2027, so the 18-month limb wins. That is consistent with the OCC's own news release (NR 2026-92), which says "the final rule and the GENIUS Act take effect on January 18, 2027". Treasury's interim final rule also expects the Act to take effect on that date.
Two caveats before you hard-code that date into anything:
- A date in a press release is not a licence. The OCC says applications are not open yet and that it will announce them separately. Its AML/sanctions rules for issuers are coming separately too, coordinated with Treasury.
- Another clock runs longer. Section 3(b)(1) makes it unlawful for a digital asset service provider to offer or sell a payment stablecoin to a person in the United States unless a permitted issuer issued it, starting three years after enactment. By my calculation that is 18 July 2028.
VASP Tracker has a longer write-up of the effective-date question if you want the legal background rather than the code.
Making it a daily job
- Store
document_numberas the primary key. It is stable. - Diff each run against yesterday's set and alert on new rows where
type == "Rule". Also alert on anyactioncontaining "final". - Keep the raw JSON.
effective_oncan be null on rules that set their dates in the text. - Don't trust the term search alone. Log what your filter rejects and skim it now and then, because a document titled "Payment stablecoins..." from a new agency is exactly what you don't want to drop.
The whole thing is about 40 lines and runs in under a second. That makes it one of the cheapest regulatory monitors you can build.
Not legal advice. This post describes public records and code; check the primary sources before relying on any date.
VASP Tracker is an independent tracker. It is not an official source and is not affiliated with any regulator.
Top comments (1)
the trap-2 framing deserves a wider audience. anyone who has scraped regulatory feeds has been burned by a type field that means whatever the publishing agency's workflow meant that day, and the action field being the real signal is exactly the distinction that separates a usable tracker from a weekly manual review. the date filtering against enactment day is also the right call, since pre-enactment commentary documents pollute every naive search for the acronym. would be curious to see the same pipeline pointed at the state-level money transmitter regime changes, where the same documents-vs-rules ambiguity is worse.