Results API

Newsrooms and researchers can pull live and licensed historical results as JSON.

Get a key

Email [email protected] with who you are and how you will use the results. Each key is for one organisation. Keep it secret and send it only in the Authorization header—never put it in a link. The tester below can make a one-off browser request without storing the key.

Test or download a request

Your key stays in this page's memory and is sent only to Poliwave. Reloading clears it.

A 403 scope response means the key does not include that endpoint. Ask Poliwave for a historical key before using an archive preset.

Make a request

Send the key in the Authorization header.

curl -H "Authorization: Bearer pwk_..." https://www.poliwave.com/api/v1/live
curl -H "Authorization: Bearer pwk_..." https://www.poliwave.com/api/v1/live/ca/election-2026
curl -H "Authorization: Bearer pwk_..." "https://www.poliwave.com/api/v1/historical/pe/gen/2021?office=president"
GET /api/v1/live
Every election the API serves, with its results URL.
GET /api/v1/live/{country}/{slug}
One election now: counts, winners and calls, as its live page shows them.
GET /api/v1/historical/{country}/{district}/{year}
Licensed historical results by unit. This endpoint needs a key with the historical scope.
?unit=CODE
One riding, state or region; on a municipal night, one municipality (Toronto is amo-15614).
?office=president
Select presidential results when legislative results share the year.
?stage=VALUE
Rehearsals only: that point of the night (listed in stages).
?units=1
US midterms only: add county results.

What you get back

available
false until the first count of this election is published.
fetchedAt, sourceTime
When we read the count, and the time the source put on it.
units
Ridings, states or regions. Each has status (awaiting, tied, leading, won), winner, leader, counted (% of polls reported) and candidates in vote order.
contests, places
Municipal nights and referendums: every race or question, with seats, status (awaiting, counting, final, acclaimed) and who is elected.
national, seats
Totals and seats won and led, counted the way the page counts them.
calls
Every race called. basis is final (count complete), projected (a Poliwave call) or source (declared by the source or our desk).
candidates, projected_percentages_round1
Historical runoff elections retain every first-round candidate and vote count. projected_percentages is the runoff; projected_percentages_round1 is round one.
attribution
A ready credit line naming Poliwave and the official source.

The numbers are the ones on the live page, from the same snapshot. Forecasts, model estimates and candidate photos are not included.

Limits and testing

Each key allows 120 requests a minute unless we agree a different limit. Counts change about every 20 to 30 seconds, so polling every 15 to 30 seconds is plenty. A refused request answers 401 (key), 403 (scope) or 429 (limit) with a JSON error.

Elections marked rehearsal: true serve made-up or replayed counts, so you can build and test before the night.

Credit

Credit Poliwave when you publish these results, with a link to the election's page (the page field). Official counts stay credited to their source, named in sources. Use of the API falls under our terms, and a key can be withdrawn.