Federal Register Scraper: Rules, Notices & Executive Orders avatar

Federal Register Scraper: Rules, Notices & Executive Orders

Pricing

from $0.56 / 1,000 document scrapeds

Go to Apify Store
Federal Register Scraper: Rules, Notices & Executive Orders

Federal Register Scraper: Rules, Notices & Executive Orders

Track every document in the Federal Register: proposed rules, final rules, notices and presidential documents, with agency, docket, effective dates and comment deadlines.

Pricing

from $0.56 / 1,000 document scrapeds

Rating

0.0

(0)

Developer

Arman Hossain

Arman Hossain

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

2 days ago

Last modified

Share

Federal Register Scraper: Proposed rules, final rules, notices and executive orders, with agency, docket IDs, RIN and comment deadlines attached

Federal Register Scraper tracks every document the US government publishes in the Federal Register, proposed rules, final rules, agency notices and presidential documents, with the agency, docket IDs, RIN, effective date and comment deadline attached to each one.

The Federal Register is the daily journal of the US government, and the day a rule appears in it is the day the clock starts on your comment window. This Actor reads the official API directly: no proxy setup, no browser, no credentials to manage.

Agent skill: SKILL.md

https://api.apify.com/v2/key-value-stores/t7YoTxpZEJOWvw4Ug/records/federal-register-scraper.md

What you get

Output fieldMeaning
documentNumberThe Federal Register document number, e.g. 2026-16083, the stable identifier
titleFull document title
typeRule, Proposed Rule, Notice or Presidential Document
abstractThe agency's own summary, or null for document types that have none
agencies, agencySlugsIssuing agency names, and the slugs you feed back into the agencies input
publicationDateDate it appeared in the Federal Register
effectiveOnDate the rule takes effect, when the document sets one
commentsCloseOnComment deadline, the field that matters most on proposed rules
docketIdsAgency docket identifiers, e.g. EPA-R09-OAR-2026-3797
regulationIdNumbersRINs linking the document to the Unified Agenda
htmlUrl, pdfUrlCanonical page on federalregister.gov and the govinfo.gov PDF
significanttrue when flagged significant under EO 12866
scrapedAtRun timestamp

A RUN_SUMMARY record in the key-value store holds per-query counts, duplicates skipped, the filters used, and any query that failed.

Common use cases

  • Alert compliance teams to new rules in your sector. A daily sweep of one agency's rulemaking.
{
"agencies": ["environmental-protection-agency"],
"documentTypes": ["RULE", "PRORULE"],
"fromDate": "2026-08-01"
}
  • Track comment deadlines for lobbying. Proposed rules only, so every record carries a commentsCloseOn to diary.
{
"searchTerms": ["pfas", "per- and polyfluoroalkyl"],
"documentTypes": ["PRORULE"],
"fromDate": "2026-01-01"
}
  • Build a RegTech monitoring product. The economically significant subset across every agency.
{
"documentTypes": ["RULE", "PRORULE"],
"significantOnly": true,
"fromDate": "2026-01-01",
"maxResults": 5000
}

Quick start

Everything the EPA published this month:

{
"agencies": ["environmental-protection-agency"],
"fromDate": "2026-08-01"
}

Two topics across all agencies, de-duplicated, capped:

{
"searchTerms": ["carbon capture", "artificial intelligence"],
"documentTypes": ["RULE", "PRORULE", "NOTICE"],
"fromDate": "2026-01-01",
"maxResults": 500
}

Executive orders and other presidential documents for a quarter:

{
"documentTypes": ["PRESDOCU"],
"fromDate": "2026-04-01",
"toDate": "2026-06-30"
}

Input

FieldTypeDefaultNotes
searchTermsarray[]Full-text terms over title, abstract and body. Each runs as its own query; results are de-duplicated by documentNumber. Empty = no text search.
agenciesarray[]Agency slugs. Names and federalregister.gov/agencies/. URLs are slugified automatically. Multiple agencies are OR-ed.
documentTypesarray[]Any of RULE, PRORULE, NOTICE, PRESDOCU. Empty = all four.
fromDatestring""Publication date lower bound, YYYY-MM-DD.
toDatestring""Publication date upper bound, YYYY-MM-DD.
significantOnlybooleanfalseKeep only documents significant under EO 12866.
maxResultsinteger1000Total documents for the whole run, across every search term. 0 = no limit. Must be a whole number of 0 or more: anything else (-5, 0.5, "abc") is rejected before the run starts rather than read as "no limit".

Which combinations make sense. Every filter is applied by the API before anything is downloaded, and they combine with AND, except multiple values inside one filter, which are OR-ed. So agencies: ["a", "b"] with documentTypes: ["RULE"] means final rules from either agency. searchTerms is the exception: each term is a separate query and the results are unioned, which is what you want for synonyms.

The one combination to be deliberate about is a broad query with no date bound. The API will not page past roughly 10,000 documents for a single query, so if you are backfilling history, walk it in date windows, a month or a quarter at a time, rather than asking for everything at once.

Output example

A real record, an EPA proposed rule:

{
"documentNumber": "2026-16083",
"title": "Partial Approval and Partial Disapproval of Air Quality State Implementation Plans; Arizona; Prevention of Significant Deterioration Infrastructure Requirements for the 2012 Fine Particulate Matter National Ambient Air Quality Standard",
"type": "Proposed Rule",
"abstract": "The Environmental Protection Agency (EPA) is proposing to partially approve and partially disapprove a revision to the Arizona State implementation plan (SIP) …",
"agencies": ["Environmental Protection Agency"],
"agencySlugs": ["environmental-protection-agency"],
"publicationDate": "2026-08-06",
"effectiveOn": "2026-09-08",
"commentsCloseOn": "2024-06-13",
"docketIds": ["EPA-R09-OAR-2026-3797", "FRL-13389-01-R9"],
"regulationIdNumbers": [],
"htmlUrl": "https://www.federalregister.gov/documents/2026/08/06/2026-16083/partial-approval-and-partial-disapproval-of-air-quality-state-implementation-plans-arizona",
"pdfUrl": "https://www.govinfo.gov/content/pkg/FR-2026-08-06/pdf/2026-16083.pdf",
"significant": null,
"scrapedAt": "2026-08-06T11:42:18.559Z"
}

RUN_SUMMARY looks like this:

{
"queriesRequested": 2,
"queriesFailed": 0,
"queriesSkippedAtCap": [],
"failures": [],
"documentsSaved": 119,
"duplicatesSkipped": 4,
"documentsWithoutNumber": 0,
"capReached": false,
"perQuery": [
{ "term": "pfas", "reported": 119, "fetched": 119, "saved": 115, "truncated": null, "error": null }
],
"filters": {
"searchTerms": ["pfas"],
"agencies": ["environmental-protection-agency"],
"documentTypes": ["RULE", "PRORULE"],
"fromDate": "2026-01-01",
"toDate": "",
"significantOnly": false,
"maxResults": 1000
},
"finishedAt": "2026-08-06T11:42:18.559Z"
}

truncated is non-null whenever a query stopped short of its own reported count, either because maxResults was hit or because the query exceeded what the API will page through. error is non-null when a query stopped because it failed, and the rows it had already delivered are still counted in saved. queriesSkippedAtCap lists the terms that were never run because the run-wide cap was already spent, so a query that never ran is never mistaken for one that matched nothing.

Finding an agency slug

Open federalregister.gov/agencies and click any agency. The slug is the last path segment:

URL you seeSlug
federalregister.gov/agencies/environmental-protection-agencyenvironmental-protection-agency
federalregister.gov/agencies/securities-and-exchange-commissionsecurities-and-exchange-commission
federalregister.gov/agencies/food-and-drug-administrationfood-and-drug-administration

You can paste the whole URL, or the agency's display name, the Actor slugifies it. An unrecognised slug is rejected by the API with a clear error rather than being silently ignored, and every returned document carries its own agencySlugs, so one exploratory run tells you the exact strings to use.

API example

curl -X POST "https://api.apify.com/v2/acts/arman-bd~federal-register-scraper/run-sync-get-dataset-items?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"agencies": ["environmental-protection-agency"],
"documentTypes": ["RULE", "PRORULE"],
"fromDate": "2026-01-01",
"maxResults": 200
}'

JavaScript example

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_TOKEN' });
const run = await client.actor('arman-bd/federal-register-scraper').call({
searchTerms: ['pfas'],
documentTypes: ['PRORULE'],
fromDate: '2026-01-01',
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const doc of items) {
if (doc.commentsCloseOn) console.log(`${doc.commentsCloseOn}, ${doc.title} (${doc.agencies.join(', ')})`);
}

Limits and behaviour

  • maxResults bounds the whole run, not each term. Five terms with maxResults: 100 return at most 100 documents in total, and you are charged for at most 100. Terms that never ran because the budget was spent are listed in RUN_SUMMARY.queriesSkippedAtCap rather than reported as having matched nothing. Put the most important term first.
  • An unusable maxResults stops the run instead of removing the cap. 0 is the only value that means "no limit". A negative, fractional or non-numeric cap is an error raised before the first request, because reading it as "everything" is how a run intended to return five documents returns hundreds of billable ones.
  • A single query tops out near 10,000 documents. The API stops issuing further pages past that point, and asking for a page beyond total_pages silently re-serves page one rather than erroring. The Actor stops at the reported page count instead of walking into that trap, and records the shortfall in RUN_SUMMARY.perQuery[].truncated. Use date windows to go deeper.
  • Search terms are separate queries, unioned. Each term is fetched independently, so a term that errors is recorded in RUN_SUMMARY.failures while the others continue. Documents matching more than one term are written once; the count is in duplicatesSkipped.
  • A bad filter value is reported, not swallowed. An unknown agency slug returns HTTP 400 with the offending field named, which is passed straight through to the failure record.
  • Zero matches is not an error. A query that matches nothing returns a count of zero and no results block at all; the Actor treats that as an empty result, not a malformed response.
  • Abstracts keep the source's inline markup. The Federal Register embeds tags such as <INF>2.5</INF> for subscripts in agency abstracts. These are left exactly as published rather than stripped, because removing them naively would destroy chemical and standards notation.
  • Transient errors are retried. 429 and 5xx get three attempts with linear backoff. 400 and 404 are not retried, because they will never succeed.
  • Comment deadlines can be in the past. Some documents reuse a deadline from an earlier related notice. The Actor reports commentsCloseOn exactly as the API gives it and does not second-guess the agency.

FAQ

Do I need a proxy? No. Proxy configuration is not required to run this Actor.

Do I need an account or API key? No. You supply no credentials.

What happens if one query fails? It is logged, added to RUN_SUMMARY.failures, and the run continues with the remaining queries. The Actor only errors out if every query fails.

How do I backfill several years? Run it once per quarter with fromDate and toDate, or schedule a rolling window. Any single query is capped near 10,000 documents by the API.

Can I get the full document text? Not in this Actor's output, it returns the agency's abstract plus htmlUrl and pdfUrl. The full text lives behind those links and is often hundreds of pages.

What is the difference between RULE and PRORULE? PRORULE is a proposed rule open for comment; RULE is the final rule that follows. Track PRORULE for commentsCloseOn, RULE for effectiveOn.

Why is significant sometimes null? The flag comes from the Unified Agenda linkage under EO 12866 and is only populated where that linkage exists. null means unknown, not "not significant", use significantOnly if you want just the confirmed ones.

Can I schedule it? Yes, the Federal Register publishes every business day. A daily run with fromDate set to yesterday keeps a feed current.

Can I integrate it with something else? Yes, Apify API, client libraries, webhooks, scheduled runs, dataset exports (JSON/CSV/Excel) or MCP. Output is structured JSON.