eCFR Regulations Scraper — Codified Federal Rules
Pricing
Pay per event
eCFR Regulations Scraper — Codified Federal Rules
Extract currently-in-force US federal regulations from the Electronic Code of Federal Regulations (eCFR). Give it Title/Part pairs and get one row per section with citation, heading and full body text as clean JSON.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
17 hours ago
Last modified
Share
🎯 What this scrapes
The eCFR (ecfr.gov, National Archives) is the codified, currently-in-force text of US federal regulations — Title > Chapter > Part > Subpart > Section. Give this Actor a bounded list of {title, part} pairs and it fetches each part's official XML, walks every section, and returns one clean row per section: a well-formed citation like "29 CFR 570.1", its heading, and the full verbatim body text. This is not a change feed — for "what changed today" in the Federal Register's daily journal of rulemaking, see our Federal Register Scraper. This Actor answers a different question: "what is the rule right now, verbatim."
🔥 What we handle for you
- 📄 Section-level parsing — the GPO XML nests sections inside subject groups and part wrappers; we walk every
SECTIONnode regardless of nesting and give you one flat row per provision. - 📅 Date resolution — omit a date and we look up the latest in-force date for that title automatically, instead of you guessing a valid one.
- 🔁 We retry with exponential backoff on
408 / 429 / 503and honourRetry-After. Up to 5 attempts per request. - 🧊 We keep the dataset clean — Pydantic-validated rows, a regex-checked citation on every section, ISO-8601 timestamps.
- 💰 You pay only for results that land. No data → no charge (only the small
actor-startwarm-up fee).
💡 Use cases
- Pull the verbatim text of a regulation for a compliance checklist or GRC platform.
- Feed a legal-ops search index with clean, citation-tagged section text.
- Snapshot a Part's in-force text on a given date for an audit trail.
- Monitor a handful of Parts your industry cares about without downloading an entire Title.
⚙️ How to use it
- Click Try for free at the top of the page.
- List the
{title, part}pairs you need under Title/Part targets — up to 20 per run. - Optionally set As-of date; leave it empty to use the latest in-force date automatically.
- Click Start. Output streams into the run's dataset, one row per section.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
targets | array | yes | [{"title": 1, "part": "1"}] | {title, part} pairs to fetch. 1-20 pairs per run — whole-title fetches are not supported. |
asOfDate | string | no | null | Fetch date as YYYY-MM-DD. Leave empty to resolve the latest in-force date automatically per title. |
proxyConfiguration | object | no | {"useApifyProxy": true} | eCFR is a public, keyless government API and does not fingerprint clients; proxy is wired per org standard. |
Example input
{"targets": [{ "title": 1, "part": "1" }],"asOfDate": null}
📤 Output
Every row is one codified CFR section.
| Field | Type | Notes |
|---|---|---|
citation | string | e.g. "1 CFR 1.1". |
title_number | integer | CFR title number. |
title_name | string | Title name, e.g. "General Provisions". |
part | string | CFR part identifier. |
section_identifier | string | Section number, e.g. "1.1". |
heading | string | Section heading text, whitespace-collapsed. |
body_text | string | Full paragraph text, joined with blank lines. |
as_of_date | string | Resolved fetch date (YYYY-MM-DD). |
scraped_at | string | ISO-8601 UTC fetch timestamp. |
Example output
{"citation": "1 CFR 1.1","title_number": 1,"title_name": "General Provisions","part": "1","section_identifier": "1.1","heading": "§ 1.1 Definitions.","body_text": "As used in this chapter, unless the context requires otherwise—\n\nAdministrative Committee means...","as_of_date": "2026-08-28","scraped_at": "2026-09-01T00:00:00Z"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.20 | One-off warm-up charge per run |
result | $0.002 | Per codified section emitted |
Example: 1 000 sections at the rates above ≈ $2.20 ($0.20 start + $2.00 for 1 000 sections at $0.002 each). No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.
🚧 Limitations
- Whole-title fetches are not supported by design — a single Part can already be tens of megabytes (Title 40 Part 60 alone is over 14 MB / 1,830 sections), so the Actor bounds every run to the Parts you name.
- One
asOfDateper run — point-in-time diffing across two dates isn't a supported mode. - Amendment/version history and agency metadata aren't included — this Actor returns the in-force text as it stands on the resolved date, not a change history.
❓ FAQ
Do I need an API key?
No. The eCFR versioner API is public and keyless, so a run needs no credentials from you.
How is this different from your Federal Register Actor?
Federal Register is the daily journal of rulemaking activity — "what changed." This Actor returns the eCFR's codified, currently-in-force text — "what the rule says right now." Different site, different API, different corpus.
Why can't I just fetch a whole Title?
Some Titles run to tens of megabytes for a single Part. Naming exact {title, part} pairs keeps every run's cost and runtime predictable — list the Parts you actually need.
What happens if a Part has no in-force text?
The run finishes successfully with zero rows for that Part and a status message explaining why — an empty result is not a failure.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.