Pepvote Support Center
Pepvote API

Voters

Read and manage voters, including batch creation.

Endpoints

MethodPathScopeDescription
GET/voting-events/:code/votersreadList voters.
POST/voting-events/:code/voterswriteCreate one voter.
POST/voting-events/:code/voters/batchwriteCreate up to 100 voters.
GET/voting-events/:code/voters/:idreadGet a voter.
PATCH/voting-events/:code/voters/:idwriteUpdate a voter.
DELETE/voting-events/:code/voters/:idwriteDelete a voter.

List query parameters

NameTypeRequiredDescription
limitintegerNoPage size from 1 to 200. Default: 50.
cursorstringNoCursor from nextCursor.
statusenumNonot_approved, pending, or approved.
groupIdstringNoFilter by group.
votedbooleanNotrue or false.
searchstringNoSearch 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.

FieldTypeRequiredDescription
voterIdstringNoUp to 200 characters.
namestringNoUp to 200 characters.
emailstringNoUp to 320 characters.
groupIdstring or nullNoGroup ID.
weightnumber or nullNoMinimum 0.
statusenumNonot_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

On this page