Pepvote API
Voting events
Read, update, and inspect voting events.
Use a voting event's short code in event URLs. All endpoints except health require a bearer API key.
Endpoints
| Method | Path | Scope | Description |
|---|---|---|---|
GET | /voting-events | read | List accessible voting events. |
GET | /voting-events/:code | read | Get one voting event. |
PATCH | /voting-events/:code | write | Update allowed event settings. |
GET | /voting-events/:code/stats | read | Get event counts and turnout. |
List query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Page size from 1 to 200. Default: 50. |
cursor | string | No | Cursor from nextCursor. |
type | election or poll | No | Filter by event type. |
status | unscheduled, upcoming, live, or ended | No | Filter by lifecycle. |
Update request fields
Send at least one field. Send null to clear desc, startsAt, endsAt, or resultDisplayLimit.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | No | 1 to 200 characters. |
desc | string or null | No | Up to 5,000 characters. |
startsAt | integer or null | No | Unix milliseconds. |
endsAt | integer or null | No | Unix milliseconds. |
liveResult | boolean | No | Show results while voting is live. |
publishedResult | boolean | No | Publish results. |
voterCanRegister | boolean | No | Allow public voter registration. |
candidateCanRegister | boolean | No | Allow public candidate registration. |
resultDisplayLimit | integer or null | No | Minimum 1. |
Example
curl -X PATCH "https://api.pepvote.com/voting-events/BOARD26" \
-H "Authorization: Bearer $PEPVOTE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Board election 2026","liveResult":true}'{
"data": {
"id": "j57event01", "code": "BOARD26", "type": "election", "title": "Board election 2026",
"desc": null, "startsAt": 1777003200000, "endsAt": 1777089600000, "status": "upcoming",
"locked": false, "liveResult": true, "publishedResult": false, "resultDisplayLimit": null,
"groupMode": false, "votingFormat": "single", "shuffleCandidates": false, "multiStepVoting": false,
"canContestMultiplePositions": false, "enableWeightedVoting": false, "enablePayToVote": false,
"enablePayToRegisterCandidate": false,
"registration": { "voterCanRegister": false, "voterPublicRegistrationClosesAt": null, "candidateCanRegister": false, "candidatePublicRegistrationClosesAt": null, "requireVoterId": false, "voterIdValidationLogic": null, "voterIdValidatingValue": null },
"aliases": { "votingEvent": null, "votingCenter": null, "position": null, "group": null, "positionGroup": null, "candidateGroup": null, "voterGroup": null, "candidate": null, "voter": null, "voterId": null, "sponsor": null, "weight": null },
"plan": { "name": "Starter", "maxVoters": 500 }, "logoUrl": null, "createdAt": 1776900000000
}
}The stats response has votingEventId, positionCount, candidateCount, approvedCandidateCount, sponsorCount, groupCount, voterCount, approvedVoterCount, pendingVoterCount, votedVoterCount, votesCast, votesConfirmed, and turnoutPercent.
Was this helpful?
Last updated September 5, 2026