knitr::opts_chunk$set( collapse = TRUE, comment = '#>', eval = congress::has_congress_key() )
The congress
package provides access to the Congress.gov API.
It allows political scientists, journalists, and policy analysts to gather legislative data programmatically.
This includes bills, amendments, member activity, nominations, committee outputs, reports, and more.
All requests can optionally be returned in tidy format.
This vignette introduces core workflows using congress
: how to authenticate, handle pagination, and query the API.
library(congress)
The Congress.gov API requires an access key. After requesting a key from api.congress.gov, use the set_congress_key()
helper to authenticate:
set_congress_key('YOUR-API-KEY', install = TRUE)
This saves the key to your .Renviron
, making it available in future sessions.
If you prefer to keep the key temporary, use:
Sys.setenv(CONGRESS_KEY = 'YOUR-API-KEY')
Once set, congress
handles key usage internally.
No manual headers or tokens are needed.
It is recommended that you authenticate by placing your key in your .Renviron
file to avoid accidentally sharing your person, private key.
By default, the API returns 20 items per request, following the upstream defaults.
The limit can be increased by setting limit = 250
, where 250 is the most items that can be returned in a single request.
To ease larger requests, cong_request_next()
can be used to obtain later paginations of results.
first <- cong_bill(congress = 118, type = 'hr', limit = 250) more <- first |> cong_request_next(max_req = 4)
This retrieves up to 1,250 House bills from the 118th Congress.
max_req
controls how many pages are requested.
Results are combined into one tibble
.
As of writing this vignette, you can make 5,000 requests per hour.
When requesting large datasets, be mindful of the API limits and use limit = 250
to avoid inefficient calls.
All endpoints accept from_date
and to_date
.
This is often misleading, so beware.
It does not filter by the date of the action, but rather the date of the last update.
As such, this is most useful if you are scraping over time.
For example, if you run an analysis monthly, then you can use the from_date
and to_date
arguments to limit the results to the time since your last scrape.
cong_bill(congress = 118, from_date = '2025-04-01', to_date = '2025-05-23')
cong_bill()
retrieves bills, sorted by their most recent action date.
bills <- cong_bill() bills
By default, this returns the 20 most recently updated bills across all chambers and types.
Narrow the scope with the congress
and type
arguments:
bills_118 <- cong_bill(congress = 118, type = 'hr', limit = 5) bills_118
The result is a tibble
with sponsor, title, dates, latest action, and other details.
Each row represents a single bill, with a summary of its most recent action.
To inspect a specific bill by number:
hr1 <- cong_bill(congress = 118, type = 'hr', number = 1) hr1
Each bill can have multiple related pieces of information, including actions, amendments, committees, cosponsors, related bills, subjects, summaries, text (for the full text), and titles.
Access each of these with the item
argument:
actions <- cong_bill(congress = 118, type = 'hr', number = 1, item = 'actions') actions
This returns a tibble
of all actions taken on the bill, including dates and descriptions.
cosponsors <- cong_bill(congress = 118, type = 'hr', number = 1, item = 'cosponsors') cosponsors
Other types of actions taken by Congress can be accessed through other endpoints.
For example, to focus on amendments, use cong_amendment()
.
amendments <- cong_amendment(congress = 118, limit = 50) amendments
Or target a specific one. We do this by specifying that we want the Senate Amendment 2137 from the 117th Congress:
amend_detail <- cong_amendment(congress = 117, type = 'samdt', number = 2137) amend_detail
cong_member()
helps link individual lawmakers to legislative behavior.
Use the bioguide
argument to target a specific member.
sponsored <- cong_member(bioguide = 'W000817', item = 'sponsored-legislation') sponsored
This returns all legislation introduced by Senator Elizabeth Warren in the 118th Congress.
The endpoint tracks various components of a member of Congress's work, such as cosponsored-legislation
.
To look up bioguide information, there is an official site: https://bioguide.congress.gov/.
Responses from cong_member()
also include bioguide IDs, so you can use them to cross-reference with other datasets.
A significant portion of work in Congress is conducted by committee.
We can use cong_committee()
to access committee information:
committees <- cong_committee(congress = 118) committees
To get reports or prints from a committee, use the corresponding functions:
reports <- cong_committee_report(congress = 118, limit = 5) reports
prints <- cong_committee_print(congress = 118, limit = 5) prints
To gather hearing metadata, use cong_hearing()
:
hearings <- cong_hearing(congress = 118, limit = 5) hearings
The results can be refined by chamber or hearing number.
Track presidential nominations with cong_nomination()
:
noms <- cong_nomination(congress = 118, limit = 50) noms
Each row includes name, post, and status (e.g., confirmed, withdrawn).
To go deeper into an individual nomination, such as Val Deming's nomination to the Postal Service Board of Governors, use:
nom_details <- cong_nomination(congress = 118, number = 2005) nom_details
Use cong_daily_record()
to access floor proceedings:
record <- cong_daily_record(volume = 169, issue = 1) record
To view specific speeches or statements:
articles <- cong_daily_record(volume = 169, issue = 1, item = 'articles') articles
congress
provides programmatic access to a rich set of legislative data.
This package aims to enable reproducible workflows for research on Congress.
The functions in this package offer a structured and consistent interface to the Congress.gov API.
For more detail, consult the function reference at https://christophertkenny.com/congress/. If you encounter edge cases or undocumented behavior, consider opening an issue.
DISCLAIMER: This vignette has been written with help from ChatGPT 4o. It has been reviewed for correctness and edited for clarity by the package author. Please note any issues at https://github.com/christopherkenny/congress/issues.
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.