Data dictionaries

Stream event

One endorsement change as the Endorsement Stream delivers it, by Server-Sent Events, polling, email, file or postback.

Returned by
GET /v1/stream, GET /v1/events

How it connects

  • The same changes as GET /v1/changes, with more of the contest and choice in each one.

Good to know

  • id increases and is unique: use it to drop an event you have already seen.

Fields

FieldTypeMeaningExample
idstringThe change’s id: increasing and unique. Use it to drop repeats.18342
typestringWhat happened: an endorsement created, updated or deleted.endorsement.created, endorsement.updated, endorsement.deleted meaningsendorsement.created
occurred_atstringISO 8601 date and time with time zoneWhen the change was made.2026-10-14T21:07:33.512Z
endorsementobjectThe endorsement as it is now (for endorsement.deleted, as it was).—
endorsement.idintegerEndorsement id.90211
endorsement.rankintegeror nullRanked choice: the rank the endorser gave; null otherwise.1
endorsement.statementstringor nullWhat the endorser said.—
endorsement.source_urlstringor nullURLWhere it was published.https://sflaborcouncil.org/endorsements
endorsement.published_onstringor nullYYYY-MM-DDWhen it was published.2026-09-18
endorsement.added_bystringHow the endorsement got here: automatic (added by our automatic watch of the endorser’s own page), staff (entered by hand by BallotData staff) or data_load (loaded in a researched data pass).automatic, staff, data_load meaningsdata_load
changedarray of stringFor endorsement.updated: the fields that changed. Empty for other events.choice_id, rank, statement, source_url, published_on meanings—
previousobjector nullFor endorsement.updated: the values before the change. null for other events.—
previous.choice_idintegerThe choice endorsed before.—
previous.rankintegeror nullThe rank before.—
previous.statementstringor nullThe statement before.—
previous.source_urlstringor nullURLThe source URL before.—
previous.published_onstringor nullYYYY-MM-DDThe publication date before.—
endorserobjectWho made the endorsement.—
endorser.idintegerEndorser id.512
endorser.slugstringor nullEndorser slug; null if the endorser has since been removed.sf-labor-council
endorser.namestringor nullEndorser name; null if the endorser has since been removed.San Francisco Labor Council
endorser.categoryEndorser categoryor nullThe endorser’s category.—
endorser.statestringor nullHome state, or null for a national endorser.CA
contestobjectThe contest.—
contest.idintegerContest id.4410
contest.titlestringor nullTitle as printed on the ballot.Member, Board of Supervisors, District 8
contest.short_titlestringor nullShorter title.Supervisor, D8
contest.kindstringor nullcandidate (an office), measure (a proposition) or retention (keep a judge?).candidate, measure, retention meaningscandidate
contest.vote_methodstringor nullHow votes are cast.plurality, multi_seat, ranked_choice, approval, yes_no meaningsranked_choice
contest.votes_allowedintegeror nullHow many choices a voter may mark (vote for N).1
contest.ranks_allowedintegeror nullRanked choice: how many choices a voter may rank.10
contest.measure_codestringor nullThe measure’s letter or number.—
contest.districtobjector nullThe district the contest is voted in.—
contest.district.idintegerDistrict id.77
contest.district.namestringDistrict name.San Francisco Supervisorial District 8
contest.district.levelstringLevel of government.federal, state, county, city, school, special meaningscounty
contest.district.ocd_idstringor nullOpen Civic Data division id.ocd-division/country:us/state:ca/county:san_francisco/council_district:8
contest.district.statestringor nullUSPS state code.CA
electionobjector nullThe contest’s election.—
election.idintegerElection id.3
election.slugstringElection slug.ca-2026-11-03-general
election.namestringElection name.California General Election
election.datestringYYYY-MM-DDElection day.2026-11-03
election.statestringor nullUSPS state code; null for a multi-state election.CA
election.typestringKind of election.general, primary, special, special_primary, runoff, consolidated meaningsgeneral
choiceobjectThe choice endorsed.—
choice.idintegerChoice id.20931
choice.labelstringor nullAs printed: the candidate’s ballot name, or Yes / No.Jane Doe
choice.measure_answerstringor nullyes or no for a measure; null for a candidate.yes, no meanings—
choice.candidateobjector nullThe candidate; null for a measure answer.—
choice.candidate.idintegerCandidate id.8811
choice.candidate.full_namestringFull name.Jane Doe
choice.partyobjector nullThe party printed beside the name.—
choice.party.slugstringParty slug.—
choice.party.namestringParty name.—
choice.withdrawnbooleanor nullThe candidate withdrew but is still printed on the ballot.false
choice.incumbentbooleanor nullThe candidate holds this seat now: true or false where we know, null where we don’t (and for a measure answer).true

Download every dictionary as CSV or JSON.

Stream event data dictionary · BallotData API