I voted · APIApp
API for AI agents
Free, no key. JSON over HTTPS. Read only for AI agents: a tap is a person saying they’re voting or voted, so taps come only from people in the app.
Read
GET /api/voted/summary?city=dc|nyc|sf:{election:{id:"2026-11-03",…},phase:"before"|"day"|"after",taps_open:[…],total:{today,early,voted,people},areas:{area:{today,early,voted,people}},cities:{dc,nyc,sf},small_counts:"lt5 means 1 to 4 taps",hidden_counts:"5+ means …",some_counts:"some means 1 or more …",measure:"self-reported taps on who else?",people_only:true,is_ai_counted:false,writes_open}. Every count is0, a number from 5 up, the string"lt5"for 1 to 4, or the string"5+"for a count of 5 or more that sits in a row or column with a small one. If any count in a row is 1 to 4, that row’s other non-zero counts and its people total are hidden too, and more counts are hidden until no small count (including the unpublished “Rather not say” taps) can be worked out by adding or subtracting published ones. Every view of a city returns the same numbers.
These are self-reported taps on who else?, people only. They are not an official count and say nothing about how many people voted. Areas are coarse and fixed: DC wards 1–8, the five NYC boroughs, and 14 San Francisco neighborhood groups; taps marked “Rather not say” count for the city only. We publish no polling places, hours or results. For those, use the official lookups:
Strictly nonpartisan: there are no parties, candidates or measures anywhere in the data. who else? is not affiliated with any election office.
Writes
POST /api/voted/tap
content-type: application/json
{"city":"nyc","area":"queens","kind":"early","election":"2026-11-03",
"client_id":"my-agent-0123456789","is_ai":true}
→ 403 {"code":"ai_read_only"}
- Every write with
"is_ai": truereturns 403ai_read_only. AI agents never count as people. - People tap in the app after confirming they are 18 or older.
kindisearly(“I voted early or by mail”, open until election day ends), or on Tue Nov 3 only (city time)today(“I’m voting today”) orvoted(“I voted”). One tap per phone per election; the only change allowed istoday→voted. - Allowed fields only: city, area, kind, election, adult, device, client_id, is_ai. Any other field or any value over 64 characters returns 422
no_free_textand nothing is stored. Non-JSON bodies return 415. - Other refusals: 422
bad_city,bad_area,bad_kind,bad_election,adult_required,not_election_day,taps_closed; 409already_tapped; 429 when a daily limit is reached; 503voted_offwhen the kill switch is on (reads keep working,writes_open:false).
Limits
- 4 tap attempts per phone per day, 80 per network per day, 5,000 per day for the app. We send no messages, emails or notifications, and we post nothing anywhere. Stickers are drawn on the phone and never uploaded.
A who else? lab experiment. who else? is not affiliated with any election office.