Technical writing

Federal Register: The Official Rulemaking Journal Behind 90,000 Pages of Annual US Regulatory Activity

· AI Analytics
Federal RegisterRulemakingRegulationsAPAFederal Data

Every federal business day since March 16, 1936 the US Government Publishing Office has released the Federal Register—the official daily journal of the federal government. In any given year it runs 85,000 to 95,000 pages and contains every proposed rule an agency wants public comment on, every final rule that will become binding law, every executive order signed by the president, and thousands of notices ranging from grant deadlines to public meeting announcements. The Federal Register is the authoritative record of how the administrative state operates, and understanding how to read, search, and query it programmatically is essential for anyone working with US regulatory data.

What the Federal Register contains

The Federal Register is divided into four main document categories. Proposed rules—formally called Notices of Proposed Rulemaking (NPRMs)—announce a regulatory action an agency is considering and open a public comment period. Final rules are the legally binding outcome of the rulemaking process; once published in the Federal Register they are incorporated into the Code of Federal Regulations. Presidential documents include executive orders, presidential proclamations, presidential memoranda, and administrative orders. Notices are everything else: public meeting announcements, grant availability notices, agency policy statements, environmental impact statement notices, and miscellaneous administrative communications.

The Code of Federal Regulations (CFR) is the annual codification of all final rules organized into 50 titles. Unlike the Federal Register, which is a chronological journal, the CFR is a topical compilation: each title corresponds to a broad subject area and each agency's regulations are compiled under the appropriate title. The printed CFR runs to approximately 200 volumes. The Electronic Code of Federal Regulations (eCFR), maintained at ecfr.gov, is continuously updated within days of final rule publication and is fully searchable. The eCFR is not itself legally authoritative—the official CFR is published once per year in print—but it is the practical reference for regulatory compliance.

Representative CFR titles illustrate the scope:

  • Title 2: Grants and Agreements—OMB guidance on federal grants
  • Title 12: Banks and Banking—OCC, Federal Reserve, FDIC, CFPB
  • Title 21: Food and Drugs—FDA regulations for drugs, devices, and food safety
  • Title 26: Internal Revenue—IRS tax regulations implementing the Internal Revenue Code
  • Title 29: Labor—OSHA workplace safety, DOL wage and hour, NLRB
  • Title 40: Protection of Environment—EPA air, water, waste, and chemical regulations
  • Title 47: Telecommunication—FCC rules for broadcast, cable, and spectrum
  • Title 48: Federal Acquisition Regulations System—procurement rules

Volume and page counts vary significantly by administration and policy agenda. The Federal Register ran to approximately 97,000 pages in 2016 near the end of the Obama administration, then dropped to roughly 61,000 pages in 2017 under the Trump deregulatory push before climbing again. Final rules number roughly 3,500 to 4,500 per year across all agencies; NPRMs number approximately 2,000 to 2,500. “Midnight rules”—final rules published in the last 60 days of a presidential term—spike at administration transitions. In the Obama-to-Trump transition alone, approximately 145 final rules were published in the last 60 days of the Obama administration, some of which were subsequently repealed under the Congressional Review Act.

The Administrative Procedure Act and notice-and-comment rulemaking

The legal framework governing federal rulemaking is the Administrative Procedure Act of 1946 (APA). The APA divides agency actions into two categories: legislative rules, which have the force of law and require the full notice-and-comment process, and interpretive rules and policy statements, which do not. The line between these categories is frequently litigated.

For legislative rulemaking, the APA mandates a specific procedural sequence. An agency must publish an NPRM in the Federal Register providing notice of the proposed rule, its legal basis, and its substance. The agency must accept written public comments for at least 30 days, though 60 to 90 days is the norm for significant rules. After the comment period closes the agency must review all comments received and respond substantively to significant comments in the preamble of the final rule. Failure to respond to a significant comment is a procedural ground for courts to vacate the rule. The agency must then publish the final rule in the Federal Register with at least a 30-day delay before the effective date, giving regulated entities time to prepare for compliance.

The APA process creates a public record that is the basis for judicial review. Courts reviewing agency rules apply the “arbitrary and capricious” standard under APA Section 706: a rule will be vacated if the agency failed to consider relevant factors, relied on factors Congress did not intend it to consider, failed to offer a reasoned explanation for its choices, or reached a conclusion so implausible it could not be ascribed to a difference in view or the product of agency expertise. For decades, the Chevron doctrine (Chevron USA v. NRDC, 1984) required courts to defer to an agency's reasonable interpretation of an ambiguous statute. The Supreme Court overruled Chevron in Loper Bright Enterprises v. Raimondo (2024), holding that courts must independently determine the best reading of a statute rather than deferring to agency interpretations. This decision significantly increases judicial scrutiny of agency rulemaking authority and is expected to result in more rules being vacated on statutory grounds.

OIRA review and major rule designation

Before publication, significant and major rules are subject to review by the Office of Information and Regulatory Affairs (OIRA) within the Office of Management and Budget. OIRA review was established under Executive Order 12291 (Reagan, 1981), modernized under Executive Order 12866 (Clinton, 1993), and expanded under Executive Order 13563 (Obama, 2011). EO 12866 remains the primary governing order.

Under EO 12866, OIRA reviews “significant regulatory actions” defined as rules with an annual economic effect of $100 million or more, rules that raise novel legal or policy issues, or rules that materially alter the budgetary impact of entitlement programs. Rules meeting the $100 million threshold are additionally designated “major rules” under the Congressional Review Act and require a Regulatory Impact Analysis (RIA)—a formal cost-benefit analysis prepared by the agency quantifying estimated compliance costs, economic benefits, transfers, and distributional effects. OIRA reviews approximately 500 to 700 rules per year; of these, roughly 100 to 150 meet the economically significant or major threshold and receive full cost-benefit scrutiny.

OIRA review can result in changes to a proposed or final rule, and OIRA can return a rule to the agency for further consideration. The review process is not public in real time, but OIRA maintains a public database of all rules under review and the date review concluded. When a rule goes to OIRA for review, it enters a “reginfo.gov” entry with timestamps for submission, any extensions, and conclusion. The reginfo.gov database also records OIRA public meetings— required under EO 12866's “3.1 meetings” provision, which requires OIRA to disclose meetings with outside parties about a rule under review.

Executive Order 13771 (Trump, 2017) imposed the “one-in, two-out” deregulatory requirement: for every new significant rule finalized, agencies were required to identify two existing significant rules for elimination, and the total incremental cost of new regulation had to be zero or negative for the fiscal year. Biden revoked EO 13771 through Executive Order 13990 (January 2021) and reinstated the Obama-era framework emphasizing cost-benefit analysis without the offsetting elimination requirement. The Trump administration reinstated deregulatory executive orders in January 2025.

The Unified Regulatory Agenda

OIRA publishes the Unified Regulatory Agenda twice per year (spring and fall) via reginfo.gov. The Agenda compiles entries from every federal regulatory agency describing all rules currently in the regulatory pipeline. Each entry is classified by stage: pre-rule (considering an Advance Notice of Proposed Rulemaking), proposed rule stage (NPRM has been or is about to be published), final rule stage (final rule under development), or long-term actions (rules not expected within the next 12 months). The Agenda is the most comprehensive advance warning system for upcoming regulatory activity and is used by industry, advocacy groups, and congressional staff to anticipate and plan for regulatory changes.

The Regulatory Plan, published alongside the fall Unified Agenda, identifies the most economically or policy-significant regulatory priorities each agency expects to pursue in the coming year. Combined with the Agenda, the Regulatory Plan provides a forward-looking view of where major regulatory action is expected across the executive branch. Both documents are available as structured data at reginfo.gov and can be downloaded in XML format for programmatic analysis.

The Congressional Review Act

Congress enacted the Congressional Review Act (CRA) in 1996 as a mechanism for legislative oversight of agency rulemaking. Under the CRA, agencies must submit major rules to Congress before they take effect. Congress then has 60 legislative days to pass a joint resolution of disapproval, which the president can sign or veto. If disapproved and enacted, the rule is invalidated and the agency is prohibited from issuing a “substantially similar” rule without explicit congressional authorization.

The CRA was used only once in its first 20 years (against an OSHA ergonomics rule in 2001). Then in early 2017, the Republican-controlled Congress and newly inaugurated Trump administration used it 14 times in the first few months, invalidating Obama-era rules on stream protection, gun-purchase background checks for Social Security disability recipients, internet service provider privacy, methane emissions on federal lands, teacher preparation programs, drug testing for unemployment insurance recipients, and others. The CRA has been used 16 times in total as of 2024. Its most significant practical effect is the “substantially similar” prohibition: agencies whose rules are disapproved under the CRA cannot reissue equivalent regulations without new statutory authority, potentially locking in the deregulatory outcome even under subsequent administrations.

Federal Register API and bulk data access

The Federal Register API at federalregister.gov/api/v1/ provides programmatic JSON access to all Federal Register documents published since 1994. The API requires no API key and is rate-limited to approximately 1,000 requests per day for anonymous access. The primary endpoints are:

  • /documents: search and list FR documents with full filtering support. Key parameters includeconditions[term] (full-text search),conditions[agencies][] (agency slug filter),conditions[type][] (RULE, PRORULE, NOTICE, PRESDOCU),conditions[publication_date][gte] and[lte] for date range,conditions[cfr_references][title] and[part] for CFR section targeting, andper_page (maximum 1,000 per request).
  • /documents/{document_number}: full document detail including raw text, abstract, full preamble, all CFR references, agency names, comment deadline, and Regulations.gov docket link.
  • /agencies: list all agencies with their FR slugs, used in agency filter parameters.
  • /topics: list subject-matter topics used for thematic document classification.
  • /cfr_references: query documents by CFR title and part.

The API returns paginated results with a count field indicating total matching documents. For large queries (hundreds of documents), pagination through all pages with sequentialpage parameter increments is required. The bulk XML download path via govinfo.gov (the Government Publishing Office API) provides complete Federal Register content by year in structured XML format, useful for full-text indexing and corpus-level analysis. govinfo.gov also maintains bulk downloads of the CFR in XML and PDF by title and revision date.

Regulations.gov is the public comment submission portal operated by the EPA on behalf of all federal agencies. Every NPRM that accepts public comments receives a Regulations.gov docket. The docket accumulates all submitted public comments (in PDF, Word, or text form), agency responses, supporting technical documents, and post-comment notices. The Regulations.gov API v4 (api.regulations.gov) requires a free API key and provides JSON access to docket metadata, document listings, and comment counts. Because the Federal Register API includes Regulations.gov docket links for each NPRM, the two APIs can be joined by docket ID to enrich Federal Register metadata with public comment volumes.

The public comment volumes on major rules can be extraordinary. The FCC's 2014 Open Internet (net neutrality) rulemaking received approximately 3.7 million comments—many of them automated or coordinated—making it one of the largest public comment dockets in administrative history. The 2017 net neutrality repeal docket received over 22 million comments, the majority of which were later found to be fraudulent or bot-generated. The volume and authenticity problems in major public comment dockets have prompted ongoing OIRA and congressional debate about the evidentiary weight agencies must give to mass comment campaigns.

CFR structure and the regulatory map

Understanding CFR structure is prerequisite to navigating the Federal Register. The 50 CFR titles are divided into chapters (assigned to specific agencies or sub-agencies), parts (discrete regulatory programs or subject areas), sections (the granular binding rules), and paragraphs. A CFR citation like “40 CFR 63.1” reads as: Title 40 (Protection of Environment), Part 63 (National Emission Standards for Hazardous Air Pollutants), Section 1 (applicability).

Title 40 (EPA) alone contains well over 1,000 parts spanning Clean Air Act regulations, Clean Water Act regulations, RCRA hazardous waste rules, CERCLA Superfund procedures, FIFRA pesticide regulations, and Toxic Substances Control Act chemical regulations. Title 26 (IRS) is similarly vast—the Internal Revenue Code is implemented through thousands of sections of Treasury regulations covering income tax, estate and gift tax, excise taxes, and procedural rules. Title 21 (FDA) covers food safety (Parts 1–199), human drugs (Parts 200–499), biologics (Parts 600–799), animal drugs (Parts 500–599), medical devices (Parts 800–898), and tobacco products (Parts 1100–1143).

The eCFR at ecfr.gov provides the most convenient interface for regulatory research: full-text search across all 50 titles, section-level navigation, version history showing when each section was last amended and by which Federal Register document, and direct links to the underlying rulemaking documents. eCFR also exposes an XML API at ecfr.gov/api/versioner that allows programmatic retrieval of CFR text by title, part, or section, with optional version date parameters to retrieve historical regulatory text as it existed on any given date.

Python example: EPA proposed rules in 2024

The following script queries the Federal Register API for all EPA proposed rules published in 2024. It extracts document title, abstract, comment deadline, and CFR citations; computes the average comment period length; identifies which dockets are linked to Regulations.gov comment counts; and outputs a sorted table of proposed rules by comment deadline and CFR part affected. No API key is required.

import requests
import pandas as pd
from datetime import datetime, date

# ---------------------------------------------------------------------------
# Federal Register API: EPA Proposed Rules for 2024
# Base URL: https://www.federalregister.gov/api/v1/
# No API key required. Rate limit: ~1,000 req/day for anonymous access.
# ---------------------------------------------------------------------------

FR_API = "https://www.federalregister.gov/api/v1/documents"

def fetch_epa_proposed_rules_2024(per_page: int = 1000) -> list[dict]:
    """
    Retrieve all EPA proposed rules published in calendar year 2024
    from the Federal Register API.
    Returns a list of document dicts.
    """
    params = {
        "conditions[agencies][]": "environmental-protection-agency",
        "conditions[type][]": "PRORULE",
        "conditions[publication_date][gte]": "2024-01-01",
        "conditions[publication_date][lte]": "2024-12-31",
        "per_page": per_page,
        "page": 1,
        "fields[]": [
            "document_number",
            "title",
            "abstract",
            "publication_date",
            "comment_date",
            "comments_close_on",
            "regulations_dot_gov_info",
            "cfr_references",
            "agency_names",
            "html_url",
        ],
        "order": "oldest",
    }
    results = []
    while True:
        resp = requests.get(FR_API, params=params, timeout=60)
        resp.raise_for_status()
        data = resp.json()
        batch = data.get("results", [])
        results.extend(batch)
        count = data.get("count", 0)
        print(f"  Page {params['page']}: fetched {len(batch)} docs "
              f"(total so far: {len(results)} / {count})")
        if len(results) >= count or not batch:
            break
        params["page"] += 1
    return results

def parse_comment_period(doc: dict) -> int | None:
    """
    Compute comment period length in days from publication_date to
    comments_close_on. Returns None if either date is missing.
    """
    pub_str = doc.get("publication_date")
    close_str = doc.get("comments_close_on")
    if not pub_str or not close_str:
        return None
    try:
        pub = datetime.strptime(pub_str, "%Y-%m-%d").date()
        close = datetime.strptime(close_str, "%Y-%m-%d").date()
        return max(0, (close - pub).days)
    except ValueError:
        return None

def extract_cfr_parts(doc: dict) -> list[str]:
    """
    Extract CFR title/part strings from cfr_references field.
    Returns a sorted deduplicated list like ['40 CFR 52', '40 CFR 63'].
    """
    refs = doc.get("cfr_references") or []
    parts = set()
    for ref in refs:
        title = ref.get("title")
        part = ref.get("part")
        if title and part:
            parts.add(f"{title} CFR {part}")
    return sorted(parts)

def build_dataframe(docs: list[dict]) -> pd.DataFrame:
    """Build analysis DataFrame from raw API document list."""
    rows = []
    for doc in docs:
        comment_days = parse_comment_period(doc)
        cfr_parts = extract_cfr_parts(doc)
        regs_info = doc.get("regulations_dot_gov_info") or {}
        docket_id = regs_info.get("docket_id", "")
        comment_count = regs_info.get("comments_count")
        rows.append({
            "document_number": doc.get("document_number", ""),
            "publication_date": doc.get("publication_date", ""),
            "title": (doc.get("title") or "")[:90],
            "comment_deadline": doc.get("comments_close_on", ""),
            "comment_days": comment_days,
            "cfr_parts": ", ".join(cfr_parts) if cfr_parts else "",
            "primary_cfr_part": cfr_parts[0] if cfr_parts else "",
            "docket_id": docket_id,
            "comment_count": comment_count,
            "url": doc.get("html_url", ""),
        })
    df = pd.DataFrame(rows)
    if "comment_days" in df.columns:
        df["comment_days"] = pd.to_numeric(df["comment_days"], errors="coerce")
    if "comment_count" in df.columns:
        df["comment_count"] = pd.to_numeric(df["comment_count"], errors="coerce")
    return df

def analyze(df: pd.DataFrame) -> None:
    total = len(df)
    with_deadline = df["comment_deadline"].notna() & (df["comment_deadline"] != "")
    with_period = df["comment_days"].notna()

    print(f"Total EPA proposed rules in 2024: {total}")
    print(f"  With comment deadline:           {with_deadline.sum()}")
    print(f"  With computable comment period:  {with_period.sum()}")
    print()

    # Average comment period length
    if with_period.sum() > 0:
        avg_days = df.loc[with_period, "comment_days"].mean()
        med_days = df.loc[with_period, "comment_days"].median()
        min_days = df.loc[with_period, "comment_days"].min()
        max_days = df.loc[with_period, "comment_days"].max()
        print(f"Comment period length (days):")
        print(f"  Average: {avg_days:.1f}")
        print(f"  Median:  {med_days:.1f}")
        print(f"  Min:     {min_days:.0f}")
        print(f"  Max:     {max_days:.0f}")
        print()

    # Dockets with known comment counts (from Regulations.gov linkage)
    with_count = df["comment_count"].notna() & (df["comment_count"] > 0)
    if with_count.sum() > 0:
        top_commented = (
            df[with_count]
            .nlargest(10, "comment_count")[
                ["document_number", "title", "docket_id", "comment_count"]
            ]
        )
        print("Top 10 most-commented EPA proposed rules (2024):")
        print(f"  {'Doc Number':<20} {'Comments':>10}  {'Docket':<25}  Title")
        print("  " + "-" * 110)
        for _, row in top_commented.iterrows():
            print(
                f"  {row['document_number']:<20} {int(row['comment_count']):>10,}"
                f"  {row['docket_id']:<25}  {row['title'][:60]}"
            )
        print()

    # Sorted table of proposed rules by comment deadline and CFR part
    sorted_df = df.sort_values(
        ["comment_deadline", "primary_cfr_part"],
        na_position="last",
    )
    print("Proposed rules sorted by comment deadline and CFR part:")
    print(f"  {'Pub Date':<12} {'Deadline':<12} {'Days':>5}  {'CFR Part':<20}  Title")
    print("  " + "-" * 105)
    for _, row in sorted_df.iterrows():
        days_str = f"{int(row['comment_days']):3d}" if pd.notna(row["comment_days"]) else "  ?"
        print(
            f"  {row['publication_date']:<12} {row['comment_deadline'] or 'N/A':<12}"
            f" {days_str}  {row['primary_cfr_part']:<20}  {row['title'][:55]}"
        )

def main() -> None:
    print("Fetching EPA proposed rules from Federal Register API (2024)...")
    docs = fetch_epa_proposed_rules_2024()
    print(f"\nTotal documents retrieved: {len(docs)}\n")
    df = build_dataframe(docs)
    analyze(df)

if __name__ == "__main__":
    main()

Typical output for EPA 2024 proposed rules will show 80 to 120 NPRMs depending on agency activity that year. The average comment period for EPA NPRMs runs 45 to 60 days; highly complex or controversial rules (such as those implementing Clean Air Act Section 111 or major RCRA amendments) often carry 60- or 90-day periods. Rules on simpler procedural matters may have only 30-day periods. The CFR part distribution reflects EPA's regulatory portfolio: expect heavy concentration in 40 CFR 52 (state implementation plans), 40 CFR 60 (new source performance standards), 40 CFR 63 (hazardous air pollutants), 40 CFR 122–125 (NPDES water discharge permits), and 40 CFR 261–272 (RCRA hazardous waste). Joining the Regulations.gov comment counts to the Federal Register metadata surfaces which EPA rules attracted the most public engagement— typically major Clean Air Act standards and chemical risk evaluations under TSCA that affect large industrial sectors.

For the CMS rulemaking context—including the annual IPPS Final Rule that sets Medicare DRG base rates and relative weights through the same APA notice-and-comment process described above—see CMS Medicare Inpatient Provider Data: The Hospital-Level Payment Records Behind $170 Billion in Annual DRG Reimbursements, covering the IPPS payment formula, DRG relative weights, and geographic payment variation across hospitals.

For FDA drug regulatory activity that flows through the same Federal Register notice-and-comment pipeline—including Orange Book patent and exclusivity listings that are established through Federal Register rulemaking—see FDA Orange Book: The Drug Patent and Exclusivity Database Behind Generic Drug Competition and Hatch-Waxman Challenges, covering the Hatch-Waxman Act, therapeutic equivalence ratings, and patent cliff analysis.

For FMCSA's Hours of Service regulations in 49 CFR Part 395, the ELD mandate rulemaking, and the underride guard standards that move through the same Federal Register notice-and-comment process, see FMCSA Crash Data: The Federal Database Behind 5,000 Annual Large Truck Fatalities, covering the 5,837 fatalities in 2022, crash causation research, the CSA Safety Measurement System, and how to access FMCSA crash records programmatically.