# Federal Register Scraper – Agency, Type & Comment Deadlines (`fetchsmith/federal-register-scraper`) Actor

Scrape the US Federal Register from its official government API: rules, proposed rules, notices and presidential documents. 30 flat fields incl. comment-close deadline, EO 12866 significance, RIN, docket IDs and CFR refs. Cursor paging past the 10,000-row wall. $0.0008/result, no start fee.

- **URL**: https://apify.com/fetchsmith/federal-register-scraper.md
- **Developed by:** [Fetch Smith](https://apify.com/fetchsmith) (community)
- **Categories:** Business, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.80 / 1,000 result items

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Federal Register Scraper – Agency, Type & Comment Deadlines

Pulls US **Federal Register** documents — final rules, proposed rules, notices and presidential documents — from the Federal Register's own official public API (federalregister.gov, run by NARA and the GPO) and returns them as one flat, typed dataset.

No API key, no login, no proxy. Public government data only.

### What you get

30 flat fields per document, including the ones most Federal Register Actors leave out:

| Field | Why it matters |
| --- | --- |
| `commentsCloseOn` | The public-comment deadline — **when you have to act by**. Present on 92% of proposed rules and about a third of notices (measured on a live 200-row sample per type). |
| `significant` | The Executive Order 12866 "significant rule" flag. Set on final and proposed rules only (~40% of them); always null on notices and presidential documents. |
| `regulationIdNumbers` | RIN — joins a document to its entry in reginfo.gov's Unified Agenda. |
| `docketIds` | Regulations.gov docket IDs, so you can pull the comment file. |
| `cfrReferences` | Flattened to readable strings like `40 CFR 257`. |
| `agencyNames` / `agencySlugs` / `parentAgencyNames` | One document usually lists a department *and* the bureau that wrote it; both are kept, split by level. |
| `fullTextUrl` | Public URL of the complete document body as plain text. Free to fetch yourself — we don't charge you a second row for it. |
| `url`, `pdfUrl`, `citation`, `startPage`, `endPage`, `pageLength` | Cite it in a memo without a second lookup. |

Plus `documentNumber`, `type`, `subtype`, `title`, `abstract`, `action`, `datesText`, `publicationDate`, `effectiveOn`, `signingDate`, `topics`, `president`, `executiveOrderNumber`, `excerpt`, `jsonUrl`.

### Who uses this

- **Regulatory-affairs and compliance teams** tracking every rule touching their sector, with the comment deadline attached.
- **Trade and customs consultancies** watching tariff, AD/CVD and export-control notices.
- **Law firms and lobbyists** monitoring a docket or RIN from proposed rule to final rule.
- **Industry associations** building a weekly "what changed" digest for members.

### Input

```json
{
  "documentTypes": ["RULE", "PRORULE"],
  "agencies": ["Environmental Protection Agency"],
  "commentsOpenOnly": true,
  "maxResults": 100
}
```

| Input | Notes |
| --- | --- |
| `documentTypes` | `RULE`, `PRORULE`, `NOTICE`, `PRESDOCU`. All four by default. |
| `agencies` | Slug (`environmental-protection-agency`) **or** full name — both are resolved against the official 472-agency list, and anything unrecognised is reported in the log instead of silently returning zero rows. **Filtering by a parent agency includes its sub-agencies**: `homeland-security-department` also returns Coast Guard, FEMA, CBP, TSA and USCIS documents. |
| `publicationDateFrom` / `publicationDateTo` | `YYYY-MM-DD`. Defaults to the last 90 days; the archive goes back to **1994-01-03**. |
| `searchQuery` | Full-text search across title and body. |
| `significantOnly` | EO 12866 significant rules only. |
| `commentsOpenOnly` | Only documents whose comment period closes today or later. |
| `order` | `newest`, `oldest` or `relevance`. |
| `maxResults` | Up to 50,000. |

### Sample output

```json
{
  "documentNumber": "2026-18552",
  "type": "Proposed Rule",
  "title": "Wisconsin: Approval of State Coal Combustion Residuals Permit Program",
  "publicationDate": "2026-09-11",
  "commentsCloseOn": "2026-11-10",
  "agencyNames": ["Environmental Protection Agency"],
  "docketIds": ["EPA-HQ-OLEM-2026-4324", "FRL-13374-01-OLEM"],
  "cfrReferences": ["40 CFR 257"],
  "citation": "91 FR 57842",
  "url": "https://www.federalregister.gov/documents/2026/09/11/2026-18552/wisconsin-approval-of-state-coal-combustion-residuals-permit-program",
  "fullTextUrl": "https://www.federalregister.gov/documents/full_text/text/2026/09/11/2026-18552.txt"
}
```

### No 10,000-row wall

The Federal Register API's page-based paging stops hard at 10,000 rows (`page=11` at `per_page=1000` is an HTTP 400), and its `count` field is clamped at 10,000 even when far more documents match. This Actor pages with the API's own `search_after_cursor` instead, which walks straight past that limit — verified by pulling 14,000 consecutive rows in one run. Set `maxResults` to what you actually want; you will not hit a hidden ceiling at 10,000.

### Pricing

**$0.0008 per result, no Actor-start fee** — the cheapest per-row price of any Federal Register Actor in the Store at the time of writing (the rest run $0.001–$0.005 per row, most with a start fee on top). 1,000 documents costs $0.80.

### FAQ

**Why did I get zero rows?**
The filters are ANDed. A `searchQuery` plus an agency plus `significantOnly` over a short date window often genuinely matches nothing — drop one filter. Also note `significantOnly` only ever matches rules and proposed rules, so pairing it with `documentTypes: ["NOTICE"]` always returns nothing. The run log spells out which cause applies.

**Is `significant` reliable?**
It is reliable where it exists — on final and proposed rules. It is `null` by design on notices and presidential documents, so don't read null as "not significant" outside rules.

**Does it fetch the full document text?**
No. Each row carries `fullTextUrl`, the public plain-text URL, so you fetch bodies only for the documents you care about instead of paying for text on every row.

**Is this legal?**
Yes. federalregister.gov publishes this API for public reuse, the content is US-government work in the public domain, and no row contains personal data.

### Related guides

- [The Federal Register API says it has 10,000 documents. It doesn't — and the fix is already in the response](https://fetchsmith.com/blog/federal-register-documents-json-api) — the full write-up of the clamped `count`, the 10,000-row offset wall and the `search_after_cursor` that walks past it, the per-document-type field-population table, and why a mistyped agency slug 400s the whole query.
- [The FDA publishes every product recall as JSON — but you can't page past row 25,000](https://fetchsmith.com/blog/fda-openfda-recall-json-api) — the same "US government publishes it as keyless JSON" pattern, with a pagination wall that has no cursor escape hatch.
- [All FetchSmith tools](https://fetchsmith.com/tools)
- [Source code](https://github.com/Fetchsmith/fetchsmith/tree/main/actors/federal-register-scraper)

# Actor input Schema

## `documentTypes` (type: `array`):

Which Federal Register document types to return. All four by default.

## `publicationDateFrom` (type: `string`):

Earliest publication date, YYYY-MM-DD. Defaults to 90 days ago. The archive reaches back to 1994-01-03 if you widen it.

## `publicationDateTo` (type: `string`):

Latest publication date, YYYY-MM-DD. Defaults to today.

## `agencies` (type: `array`):

Agency slugs (from a federalregister.gov/agencies/<slug> URL) or full agency names — both are accepted and resolved against the official 472-agency list. Filtering by a parent agency includes its sub-agencies: "homeland-security-department" also returns Coast Guard, FEMA, CBP, TSA and USCIS documents. Leave empty for all agencies.

## `searchQuery` (type: `string`):

Full-text search across the document title and body. Leave empty to return everything matching the other filters.

## `significantOnly` (type: `boolean`):

Only documents flagged significant under Executive Order 12866 (economically or policy significant). This flag only exists on final and proposed rules, so combining it with notices or presidential documents returns nothing.

## `commentsOpenOnly` (type: `boolean`):

Only documents whose public comment period closes today or later — the deadline set a buyer still has time to act on. Mostly proposed rules (92% carry a comment-close date) plus about a third of notices.

## `order` (type: `string`):

Sort by publication date, or by full-text relevance to the search query.

## `maxResults` (type: `integer`):

Stop after this many documents. Deep paging is cursor-based, so there is no 10,000-row wall.

## Actor input object example

```json
{
  "documentTypes": [
    "RULE",
    "PRORULE",
    "NOTICE",
    "PRESDOCU"
  ],
  "agencies": [
    "environmental-protection-agency"
  ],
  "significantOnly": false,
  "commentsOpenOnly": false,
  "order": "newest",
  "maxResults": 100
}
```

# Actor output Schema

## `dataset` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "agencies": [
        "environmental-protection-agency"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("fetchsmith/federal-register-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "agencies": ["environmental-protection-agency"] }

# Run the Actor and wait for it to finish
run = client.actor("fetchsmith/federal-register-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "agencies": [
    "environmental-protection-agency"
  ]
}' |
apify call fetchsmith/federal-register-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fetchsmith/federal-register-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/0SxkO5SMgcu0M6xv5/builds/HE3Ihv0rkzev1jghN/openapi.json
