DEV Community

VASP Tracker
VASP Tracker

Posted on

Tracking GENIUS Act rulemaking with the Federal Register API (and why a naive search lies to you)

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
Enter fullscreen mode Exit fullscreen mode

Useful parameters:

  • conditions[term] for full-text search
  • fields[] (repeatable) to choose which fields come back
  • per_page (up to 100) and order
  • the response's next_page_url for 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))
Enter fullscreen mode Exit fullscreen mode

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))
Enter fullscreen mode Exit fullscreen mode

Output on 27 October 2026:

23 Counter({'Proposed Rule': 16, 'Notice': 5, 'Rule': 2})
Enter fullscreen mode Exit fullscreen mode

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"])
Enter fullscreen mode Exit fullscreen mode
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
Enter fullscreen mode Exit fullscreen mode

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:

  1. 18 months after enactment, or
  2. 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
Enter fullscreen mode Exit fullscreen mode

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_number as the primary key. It is stable.
  • Diff each run against yesterday's set and alert on new rows where type == "Rule". Also alert on any action containing "final".
  • Keep the raw JSON. effective_on can 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)

Collapse
 
fintechrailsdigest profile image
Fintech Rails Digest •

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.