POPVOX Data

API documentation

Endpoints, authentication, query examples and bulk downloads for the datasets in the catalog.

Public appropriations API

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'

Dataset metadata

/datasets returns coverage, releases, checksums, source dates and download links.

Records

/records filters the collection. /record retrieves a record and its source evidence.

Aggregates and guidance

/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.

Bulk downloads

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.

Authenticated API

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.

All endpoints below require a bearer key with the listed scope.
Dataset / scopeEndpointsCoverage limitations
Staff
staff:read
/staff-profiles
/staff-observations
/sources?kind=payroll
Payroll reporting periods do not establish current employment. Office/name identities remain provisional.
Members
members:read
/members
/member-roles
/sources?kind=member_api
Source snapshots and roles, including roster fallbacks; not a historical census.
Committees
committees:read
/committees
/committee-assignments
/sources?kind=committee_api
Bodies observed through assignments; not a complete committee census. Dates may reflect synchronization.
Member history
member-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 witnesses
hearings: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.

Authentication example

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.

Pagination and errors

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.

StatusMeaningWhat to do
400Invalid queryCheck the parameters and required filters in the appropriate OpenAPI file.
401 / 403Authentication / scopeCheck key validity for 401 and approved dataset permissions for 403.
409Snapshot changedDiscard the partial collection and restart pagination without the old snapshot token.
429Rate limit reachedWait for the duration in Retry-After. Partner quotas are assigned with access.
503Service temporarily unavailableBack off and retry later; persistent errors can be reported through the contact form.

Reuse and corrections

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.

Access and reuse · Service terms · API access questions