Federal Register Monitor: New Rules & Notices to JSON avatar

Federal Register Monitor: New Rules & Notices to JSON

Pricing

Pay per event

Go to Apify Store
Federal Register Monitor: New Rules & Notices to JSON

Federal Register Monitor: New Rules & Notices to JSON

Pricing

Pay per event

Rating

0.0

(0)

Developer

David-Solal Chalmeau

David-Solal Chalmeau

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

9 days ago

Last modified

Categories

Security

Limited permissions

Share

Federal Register Monitor

Watch the US Federal Register — the official daily journal of federal rules, proposed rules, notices and presidential documents — and get one flat, ready-to-use row per published document, with the deadline fields that actually drive decisions (commentsCloseOn, effectiveOn).

It reads the official Federal Register API (https://www.federalregister.gov/api/v1/documents.json): public, keyless, no login, no proxies. You give it keywords and/or agency slugs and a publication window; it gives you documents.

What you get

One dataset row per delivered document:

  • documentNumber, documentTitle, documentType (display), typeCode (RULE / PRORULE / NOTICE / PRESDOCU), subtype
  • abstract, excerpt (the API's match snippet, HTML stripped and bounded), action, dates
  • publicationDate, signingDate, effectiveOn, commentsCloseOn
  • citation (e.g. 91 FR 67565), volume, startPage, endPage, pageLength
  • agencies (slug, name, id, parentId), agencyNames, agencySlugs
  • docketIds, regulationIdNumbers, topics, significant (EO 12866 flag), executiveOrderNumber, presidentialDocumentNumber, proclamationNumber, correctionOf
  • htmlUrl, pdfUrl (govinfo), rawTextUrl, bodyHtmlUrl, jsonUrl — the document itself is one fetch away
  • query, queryType (keyword / agency), matchedKeywords — which watch produced the row
  • totalMatches, truncated — how many documents the query really matched, and whether you are seeing a slice
  • sources, issues, fetchedAt — provenance and a machine-readable account of anything that was not available

Input

{
"keywords": ["ozone", "MOVES6"],
"agencies": ["environmental-protection-agency"],
"documentTypes": ["RULE", "PRORULE"],
"daysBack": 30,
"maxResultsPerKeyword": 5,
"significantOnly": false
}
  • keywords — full-text search terms, max 40. Each term is one query; duplicates (case/space variants) are collapsed.
  • agencies — Federal Register agency slugs, max 20 (e.g. food-and-drug-administration). With keywords they narrow each search; without keywords each agency is watched on its own. Multiple agencies are OR'd by the API.
  • documentTypes — any of RULE, PRORULE, NOTICE, PRESDOCU. Unknown codes are rejected up front (see limits).
  • daysBack (default 7, max 365), or explicit fromDate / toDate in YYYY-MM-DD which override it.
  • maxResultsPerKeyword (default 20, max 100) — newest documents kept per watch. The API ignores (coerces) small per_page values, so the Actor applies this bound itself: you are never delivered or charged for more documents per watch than you asked for.
  • significantOnly — only documents flagged significant under EO 12866.

Values above a hard cap (40 keywords, 20 agencies, 365 days, 100 results) are clamped, never silently: the run's stats carry truncatedInputs and a free INPUT_CLAMPED row names each field, the value you asked for and the value actually used.

Example output

Real, trimmed row from a live run ({"keywords": ["ozone"], "daysBack": 7}):

{
"documentNumber": "2026-21843",
"documentTitle": "Official Release of the MOVES6 Motor Vehicle Emissions Model for SIPs and Transportation Conformity",
"documentType": "Notice",
"typeCode": "NOTICE",
"publicationDate": "2026-10-27",
"effectiveOn": "2026-10-27",
"commentsCloseOn": null,
"citation": "91 FR 67565",
"volume": 91,
"startPage": 67565,
"endPage": 67570,
"pageLength": 6,
"agencies": [{ "slug": "environmental-protection-agency", "name": "Environmental Protection Agency", "id": 145, "parentId": null }],
"agencySlugs": ["environmental-protection-agency"],
"docketIds": ["FRL-13436-01-OAR"],
"regulationIdNumbers": [],
"topics": [],
"significant": null,
"htmlUrl": "https://www.federalregister.gov/documents/2026/10/27/2026-21843/official-release-of-the-moves6-motor-vehicle-emissions-model-for-sips-and-transportation-conformity",
"pdfUrl": "https://www.govinfo.gov/content/pkg/FR-2026-10-27/pdf/2026-21843.pdf",
"rawTextUrl": "https://www.federalregister.gov/documents/full_text/text/2026/10/27/2026-21843.txt",
"query": "ozone",
"queryType": "keyword",
"matchedKeywords": ["ozone"],
"totalMatches": 1,
"truncated": false,
"sources": ["federal-register-api:documents.json"],
"issues": [],
"fetchedAt": "2026-10-28T14:16:55.402Z"
}

A watch that matched nothing, a rejected query, an upstream failure or a page of documents that cannot be turned into rows is still delivered — as a row with error (NO_MATCH, QUERY_REJECTED, UPSTREAM_FAILED, REQUEST_BUDGET_EXHAUSTED, NO_USABLE_DOCUMENTS) — and is not charged. Such a row keeps the watch term and the date window it covered, and carries issues describing the failure. A clamped input produces one INPUT_CLAMPED row (no watch term: it describes the input itself), also free. A document that survives the usable filter but still cannot be mapped into a row becomes a free CHECK_FAILED row: input names the document it failed on (or the watch, when the document has no usable documentNumber) and message carries the reason.

Free rows are not documents and are not covered by the dataset schema. They carry error and message (input too, on a CHECK_FAILED row) — the free-row-only keys, FREE_ROW_FIELDS in src/lib/map.js — plus the watch fields (query, queryType, publicationDateFrom, publicationDateTo, issues, fetchedAt). dataset_schema.json declares only the document fields: Apify validates every declared field against every pushed row, so a free-row-only key must never be declared there.

Pricing

Pay per event: document-returned at $0.0018 per delivered document (plus a $0.00005 Actor start). One charge per document that reaches your dataset, no matter how many of your watch terms matched it. Watches that return nothing, upstream failures and rejected queries are free.

Limits, and what this Actor does not guarantee

  • Newest-first slices, not exhaustive sets. Each watch returns at most maxResultsPerKeyword documents; when the query matched more, every row says truncated: true and totalMatches carries the API's count. There is no deep pagination: the API caps count at 10000 and total_pages at 50.
  • totalMatches can read 10000 when the true number is larger (the API's own ceiling); such rows carry UPSTREAM_COUNT_CAPPED in issues.
  • Document types are validated client-side. The API does not ignore an unknown conditions[type] value: it narrows to nothing ({"count": 0}), so a typo would otherwise be a silent run of empty results. Rejecting it up front turns that into a clear error before anything is fetched or charged.
  • An invalid agency slug is reported by the API as HTTP 400; that watch becomes a free QUERY_REJECTED row carrying the upstream message.
  • excerpt is the API's snippet for the document, HTML-stripped and bounded; null when the API returns none. A keyword watch that gets no snippet carries NO_EXCERPT in issues. Agency-only watches frequently get an excerpt too (the API echoes the opening of the abstract) — do not read excerpt as proof a term matched.
  • significant is null when the API omits the flag — that is "not reported", not "not significant".
  • FederalRegister.gov is a prototype edition of the journal; the official legal text is the govinfo PDF (pdfUrl). Regulations.gov comment links are not resolved by this Actor.
  • Politeness: requests are paced at 2 per second and each run runs at most 30 watches, one upstream request each (a wider input is reported as REQUEST_BUDGET_EXHAUSTED rows, free). No personal data is collected; only published documents.