Introduction
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.
Authentication
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.
Pagination
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.
Filtering by Date
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')
Retrieving Legislation
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
Legislative Details
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
Member Activity
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.
Committee Work
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.
Executive Business
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
Congressional Record
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
Summary
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.