Voters
Read and manage voters, including batch creation.
Endpoints
| Method | Path | Scope | Description |
|---|---|---|---|
GET | /voting-events/:idOrCode/voters | read | List voters. |
POST | /voting-events/:idOrCode/voters | write | Create one voter. |
POST | /voting-events/:idOrCode/voters/batch | write | Create up to 100 voters. |
POST | /voting-events/:idOrCode/voters/approve | write | Approve up to 100 voters. |
POST | /voting-events/:idOrCode/voters/unapprove | write | Remove approval from up to 100 voters. |
GET | /voting-events/:idOrCode/voters/:id | read | Get a voter. |
PATCH | /voting-events/:idOrCode/voters/:id | write | Update a voter. |
DELETE | /voting-events/:idOrCode/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. |
Approval
Send { "ids": [...] } with 1 to 100 voter IDs. POST /voters/approve returns { "data": { "approvedCount": 2, "errors": [] } }. POST /voters/unapprove returns unapprovedCount instead. Each error has id and reason.
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 "User-Agent: my-app/1.0" \
-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.
Last updated September 6, 2026