Dataset metadata
/datasets returns coverage, releases, checksums, source dates and download links.
Endpoints, authentication, query examples and bulk downloads for the datasets in the catalog.
Beta. No account or API key required.
The appropriations API covers Senate community project requests, House community project records, and funding account guidance. Responses retain source links, dates and coverage notes.
Find Senate requests in Maryland
curl --fail-with-body \
'https://popvox.com/api/explorer/appropriations/v1/records?chamber=senate&state=MD&limit=5'/datasets returns coverage, releases, checksums, source dates and download links.
/records filters the collection. /record retrieves a record and its source evidence.
/aggregates computes totals for a filter; /funding-lines provides account and program references.
Requests and bill inclusions are different stages. Neither establishes an enacted appropriation or an award. House request coverage is incomplete, and Senate bill-inclusion tables are not included.
Base URL: https://popvox.com/api/explorer/appropriations/v1. Up to 200 records per page and 120 requests per minute per client IP. Public CORS supports browser applications. Bulk downloads are listed below.
The appropriations bundle contains the three published datasets as source-linked JSON and flat CSV, plus source-check results, field definitions and a checksum manifest.
File sizes and SHA-256 checksums identify the release. Preserve the separate record stages when analyzing it.
Other catalog entries link to their published Explorer snapshots. These are not all complete row-level exports: spending snapshots include summaries and selected transactions. Read each entry’s coverage notes.
These endpoints require approved dataset permissions and a bearer key. Access requests and key management are handled through the POPVOX Hub.
Base URL: https://popvox.com/api/data/v1. An invitation alone does not grant every dataset; each key is limited to its approved scopes.
| Dataset / scope | Endpoints | Coverage limitations |
|---|---|---|
Staffstaff:read | /staff-profiles/staff-observations/sources?kind=payroll | Payroll reporting periods do not establish current employment. Office/name identities remain provisional. |
Membersmembers:read | /members/member-roles/sources?kind=member_api | Source snapshots and roles, including roster fallbacks; not a historical census. |
Committeescommittees:read | /committees/committee-assignments/sources?kind=committee_api | Bodies observed through assignments; not a complete committee census. Dates may reflect synchronization. |
Member historymember-history:read | /historical-members/historical-service/historical-sources | Primarily 1973 onward, some earlier service; year precision. Missing end years do not establish current service. |
Hearings and witnesseshearings:read | /meetings/meeting-committees/witness-appearances/meeting-documents/hearing-publications/hearing-sources | Partial source listings and publications. Witness identities are provisional. Listings do not verify attendance, and linked documents may not have indexed content. |
Store your key in a server-side secret named POPVOX_API_KEY. Send it in the Authorization header, never in a URL or public browser code. This example requires hearings:read.
curl --fail-with-body \
-H "Authorization: Bearer ${POPVOX_API_KEY}" \
'https://popvox.com/api/data/v1/meetings?chamber=House&event_type=Hearing&limit=5'The OpenAPI file describes request parameters, response fields, required scopes and error responses. Preserve meta.freshness, source identifiers and coverage gaps when storing results. API freshness is independent of the Explorer build dates in the catalog.
Use the source endpoint for your approved family. Unfiltered /sources requires all three original scopes: staff, Members and committees. Lobbying and FARA currently have Explorer snapshots, not partner API endpoints.
Both APIs return data and meta. Begin with your filters and a limit of up to 200. Carry meta.snapshot and meta.next_offset into subsequent requests, retaining the original filters. Stop when next_offset is null.
Public API example · JavaScript
const base = 'https://popvox.com/api/explorer/appropriations/v1/records';
const params = new URLSearchParams({ chamber: 'senate', state: 'MD', limit: '200' });
const records = [];
for (;;) {
const response = await fetch(`${base}?${params}`);
if (!response.ok) throw new Error(`HTTP ${response.status}; see the error guide`);
const { data, meta } = await response.json();
records.push(...data);
if (meta.next_offset === null) break;
params.set('snapshot', meta.snapshot);
params.set('offset', meta.next_offset);
}For a partner endpoint, use the same pagination pattern from your server, with its approved filters and Authorization header. Partner offsets are bounded at 200,000; narrow your filters for larger result sets.
| Status | Meaning | What to do |
|---|---|---|
| 400 | Invalid query | Check the parameters and required filters in the appropriate OpenAPI file. |
| 401 / 403 | Authentication / scope | Check key validity for 401 and approved dataset permissions for 403. |
| 409 | Snapshot changed | Discard the partial collection and restart pagination without the old snapshot token. |
| 429 | Rate limit reached | Wait for the duration in Retry-After. Partner quotas are assigned with access. |
| 503 | Service temporarily unavailable | Back off and retry later; persistent errors can be reported through the contact form. |
Credit POPVOX and the original publisher, preserve source links and dates, and make clear which conclusions are yours. Public access does not establish a blanket license for source documents, data compilations or software. Partner use follows the terms accepted when access is issued.
To report a correction, include the record URL or ID, the proposed change and supporting evidence. Corrections are reviewed; a submission does not immediately change the published data.