Pepvote Support Center
Pepvote API

Candidates

Read and manage candidates in a voting event.

Endpoints

MethodPathScopeDescription
GET/voting-events/:code/candidatesreadList candidates.
POST/voting-events/:code/candidateswriteCreate a candidate.
GET/voting-events/:code/candidates/:idreadGet a candidate.
PATCH/voting-events/:code/candidates/:idwriteUpdate a candidate.
DELETE/voting-events/:code/candidates/:idwriteDelete a candidate.

Query parameters

NameTypeRequiredDescription
positionIdstringNoFilter by position.
groupIdstringNoFilter by group.
statusnot_approved, pending, or approvedNoFilter by registration status.

Request fields

name is required on create. Send at least one field on update. On update, groupId and referendumRole accept null to clear them.

FieldTypeRequired on createDescription
namestringYes1 to 200 characters.
emailstringNoUp to 320 characters.
positionIdsstring arrayNoPosition IDs.
groupIdstring or nullNoGroup ID.
statusenumNonot_approved, pending, or approved.
referendumRoleenum or nullNofor, against, or abstain.

Example

curl -X POST "https://api.pepvote.com/voting-events/BOARD26/candidates" \
  -H "Authorization: Bearer $PEPVOTE_API_KEY" -H "Content-Type: application/json" \
  -H "Idempotency-Key: candidate-amina-001" \
  -d '{"name":"Amina Bello","email":"amina@example.com","positionIds":["j57position01"],"status":"approved"}'
{ "data": { "id": "j57candidate01", "votingEventId": "j57event01", "groupId": null, "positionIds": ["j57position01"], "name": "Amina Bello", "email": "amina@example.com", "status": "approved", "selfRegistered": false, "referendumRole": null, "avatarUrl": null, "createdAt": 1776900200000 } }

A successful 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