Changelog
What changed in the API, newest first. New fields and parameters are added without notice, so ignore fields you don’t know. Anything that could break a client is marked Changed or Removed.
November 11, 2026
- Measures:
ballot_text(the wording as printed on the ballot),full_text_url, andvote_meaningon each Yes and No choice. - Candidates:
incumbenton each choice (true,false, ornullwhere we don’t know yet), in the API and in Endorsement Stream events. - Contests:
unopposed, andparty_lines_unverifiedandquestion_wordingindetails. GET /v1/endorsements/{id}/history: every change to an endorsement, with the values before and after, including its deletion.changed_sinceonGET /v1/endorsements, to sync only what’s new.GET /v1/changes: every endorsement added, changed or deleted since a time, with the values before and after.GET /v1/candidatesandGET /v1/candidates/{id}: search candidates, and every endorsement each one received.GET /v1/elections/{slug}/export: a whole election in one download, as JSON or CSV.added_byon every endorsement (automatic,staffordata_load), andendorsement_idon each pick inGET /v1/contests/{id}.- Endorsement Stream:
endorsement.updatedevents carrychangedandprevious(the values before the change), and every event carriesendorsement.added_by. min_endorsementsonGET /v1/endorsers, andendorsement_countonGET /v1/endorsers/{slug}.- Changed: an endorser’s
endorsement_countnow counts contests, so a ranked-choice order or a vote-for-N slate counts once, as on endorsedby.org. It used to count each pick.
October 28, 2026
- Every parameter is described with an example, and each reference entry has a sample using every parameter.
October 26, 2026
- The ballotdata client libraries for JavaScript and Python.
October 24, 2026
- Changed:
GET /v1/endorsementslists the basics of each endorsement;GET /v1/endorsements/{id}has the full record. - No request rate limits.
October 22, 2026
- Removed: the combined per-contest view.
GET /v1/contests/{id}has every endorser’s position in a contest. - Keys and the stream read only what the account bought; asking for a state outside it is a
403 outside_purchase. - Every error carries a
request_id, also sent as theX-Request-Idheader.
October 20, 2026
- The API moved to
api.ballotdata.net.
October 16, 2026
- Removed: address, ZIP, district and representative lookups. Choose contests by state, election or id.
October 15, 2026
- First release: elections, contests, endorsers, endorsements, officeholders, coverage, Spanish ballot text and the Endorsement Stream.