CoolFace
Datasetpublic

incrediblecrab/crs-research-papers

US Congressional Research Service Products Every product of the Congressional Research Service (CRS), the research service of the United States Congress, that the Congress.gov API lists, active and archived, with full text and metadata: Reports, Posts, Resources, Testimony and Infographics, as the API names them. CRS writes them for Members of Congress; Congress.gov publishes them. Nothing here is edited by hand. The pipeline, its tests and its schedule are in… See the full description on the dataset page: https://huggingface.co/datasets/incrediblecrab/crs-research-papers.

sourceHugging Faceotherupdated 3h agoView on Hugging Face
1likes1.4kdownloads
Dataset Card

US Congressional Research Service Products

Every product of the Congressional Research Service (CRS), the research service of the United States Congress, that the Congress.gov API lists, active and archived, with full text and metadata: Reports, Posts, Resources, Testimony and Infographics, as the API names them. CRS writes them for Members of Congress; Congress.gov publishes them.

Nothing here is edited by hand. The pipeline, its tests and its schedule are in github.com/incrediblecrab/crs-service-products, and this card is rendered from manifest.json in the same commit.

Status

14,145 of 14,145 products (100.0%) as of 2026-09-26T16:14:07Z UTC, when the API last listed 14,145. 14,137 rows have text. 0 products failed 3 times and are retried every 24 hours; their errors are in manifest.json.

Last complete sync: 2026-09-26T16:14:07Z UTC.

SeriesRowsWith textListedPartitions complete
R5,5645,5585,56410 of 10
IF3,2053,2043,2054 of 4
IN1,9731,9731,9733 of 3
LSB1,4171,4171,4172 of 2
RL1,0791,0781,0795 of 5
RS4884884883 of 3
numeric2242242241 of 1
TE9898981 of 1
IG9797971 of 1

Listed counts the products in partitions a sync has reached; partitions not reached yet are not in the table.

Use

python
from datasets import load_dataset
crs = load_dataset("incrediblecrab/crs-research-papers", split="train")
sql
-- DuckDB, straight from the Hub
SELECT id, title, publish_date FROM 'hf://datasets/incrediblecrab/crs-research-papers/data/*.parquet' WHERE status = 'Active' ORDER BY publish_date DESC LIMIT 10;

Files

  • —data/{partition}.parquet: one row per product. A partition is the series letters plus the thousands of the number (R49 holds R49000 to R49999); ids numbered by year, like 98-684, are in numeric. Rows are sorted by id.
  • —manifest.json: per partition, the row count, SHA-256, rows with text and whether it is complete; failed products with their errors; the last listing; the last 20 runs.

Schema

ColumnTypeDescription
idstringCRS product number, for example R49359, IN12740 or 98-684
content_typestringReports, Posts, Resources, Testimony or Infographics, as the API names them
statusstringActive or Archived
versionint32The API's currentVersion; only the current version is kept
titlestringTitle
authorslist<item: string>Distinct author names, in the API's order
topicslist<item: string>CRS topic names, in no fixed order (the API's order varies between requests); often empty
publish_datestringPublication date (YYYY-MM-DD)
updated_atstringThe listing's updateDate when this row was written. A changed value triggers a re-fetch; one that finds the product unchanged keeps the row and records the new value in manifest.json instead, so this can be older than the listing's
urlstringThe product's page on congress.gov
summarylarge_stringThe API's summary, as plain text
textlarge_stringFull text of the current version: the PDF's text layer, else the HTML rendition's text; null when neither gave text
text_sourcestringpdf or html; null when text is null
text_urlstringThe URL the text was extracted from; for a record that lists only HTML, possibly the PDF at the path the HTML implies
text_sha256stringSHA-256 of the bytes fetched from text_url
metadatalarge_stringThe API's detail record as JSON: formats, related bills and laws, authors as listed
fetched_atstringWhen the fetch that wrote this row ran (UTC); a later fetch that found the product unchanged is not recorded

How it stays current

A GitHub Actions job is scheduled at 00:00 and 12:00 UTC. It asks the API for its product count and its most recently updated product: one request. When either changed, or the last full listing is a day old, the job lists every product and fetches the ones that are new or whose updateDate changed, removes the ones the API no longer has, and commits the changed partitions with this card. A job that runs out of time while still fetching starts the next one itself.

A product whose updateDate changed while its record and text did not keeps its row, its partition is not rewritten, and manifest.json records the new updateDate, so the product is not fetched again until its updateDate next changes. Congress.gov re-stamps some products about every hour without changing them: on September 25, 2026, 26 of 26 such re-fetches of 13 products returned the same record and the same PDF or HTML file, 3 of them with topics in another order, and each rewrite of their 10 partitions added about 100 MB to this repository's history.

The check reads who wrote last and which partitions are incomplete from crs_products_probe in this card's metadata rather than downloading manifest.json. The Hub counts file downloads, so checks stay out of the download count; syncs, which download files, are in it.

GitHub starts scheduled jobs late, or drops them, when it is busy, and its documentation names the start of every hour, when this job is scheduled, as a busy time. On September 24, 2026, from 06:01 to 15:26 UTC, it started 1 of the 113 jobs an earlier 5-minute schedule asked for. So a new product can take more than 12 hours to appear, and the delay is not fixed. A dropped job loses nothing, because the next one reads whatever changed.

The job writes with Hugging Face Trusted Publishing, so no write token is stored anywhere. Only one writer fetches at a time, because www.congress.gov asks for at most 10 requests a minute in total: the manifest records who wrote last and when, a writer waits while another's record is under 45 minutes old, and every commit names its parent commit, so a second writer's commit is refused instead of merged. manifest.json names each run's writer: github-actions for this job, local for the same pipeline run from a computer.

Known gaps

  • —Only the current version of each product. Earlier versions are not kept.
  • —text is the PDF's text layer, so it keeps line breaks, page headers and footers, and has no figures or table structure. When the API lists only an HTML rendition, the PDF is tried at the path the HTML implies before falling back to the HTML.
  • —www.congress.gov sometimes answers CRS HTML with a Cloudflare bot challenge, which this pipeline does not try to get past. A product whose only rendition was challenged has null text, and products without text are fetched again every 7 days.
  • —The API's updateDate values end in Z but appear to be US Eastern time. updated_at keeps them as given; they are compared, not converted.
  • —A partition may lag a live listing by up to 10 products between syncs.

License

CRS products are works of the United States Government and are not subject to copyright in the United States (17 U.S.C. § 105). The notice in the products themselves adds: "However, as a CRS Report may include copyrighted images or material from a third party, you may need to obtain the permission of the copyright holder if you wish to copy or otherwise use copyrighted material."