Pepvote API
Voters
Read and manage voters, including batch creation.
Endpoints
| Method | Path | Scope | Description |
|---|---|---|---|
GET | /voting-events/:code/voters | read | List voters. |
POST | /voting-events/:code/voters | write | Create one voter. |
POST | /voting-events/:code/voters/batch | write | Create up to 100 voters. |
GET | /voting-events/:code/voters/:id | read | Get a voter. |
PATCH | /voting-events/:code/voters/:id | write | Update a voter. |
DELETE | /voting-events/:code/voters/:id | write | Delete a voter. |
List query parameters
| Name | Type | Required | Description |
|---|---|---|---|
limit | integer | No | Page size from 1 to 200. Default: 50. |
cursor | string | No | Cursor from nextCursor. |
status | enum | No | not_approved, pending, or approved. |
groupId | string | No | Filter by group. |
voted | boolean | No | true or false. |
search | string | No | Search voter fields. |
Voter request fields
No fields are required for a single create at the HTTP layer. Pepvote applies its event rules. Send at least one field on update. On update, groupId and weight can be null to clear them.
| Field | Type | Required | Description |
|---|---|---|---|
voterId | string | No | Up to 200 characters. |
name | string | No | Up to 200 characters. |
email | string | No | Up to 320 characters. |
groupId | string or null | No | Group ID. |
weight | number or null | No | Minimum 0. |
status | enum | No | not_approved, pending, or approved. |
Batch create
Send { "voters": [...] }. The array must contain 1 to 100 voter objects. Each object uses the fields above. The batch has its own limit of 10 requests per minute.
curl -X POST "https://api.pepvote.com/voting-events/BOARD26/voters/batch" \
-H "Authorization: Bearer $PEPVOTE_API_KEY" -H "Content-Type: application/json" \
-H "Idempotency-Key: voters-board-001" \
-d '{"voters":[{"voterId":"M-1042","name":"Amina Bello","email":"amina@example.com","status":"approved"},{"voterId":"M-1043","name":"Omar Khan","status":"approved"}]}'{
"data": {
"created": [{ "id": "j57voter01", "votingEventId": "j57event01", "groupId": null, "voterId": "M-1042", "name": "Amina Bello", "email": "amina@example.com", "weight": null, "status": "approved", "selfRegistered": false, "voted": false, "createdAt": 1776900400000 }],
"skipped": [{ "index": 1, "reason": "A voter with this voter ID already exists." }]
}
}Use index to identify the zero-based input row. A successful single or batch create returns 201. Delete returns 202 with { "data": { "id": "...", "deletion": "queued" } }. The row is removed by the same scheduled batch the dashboard uses, so a read right after the delete can still return it for a moment.
Was this helpful?
Last updated September 5, 2026