Pepvote Support Center
Pepvote API

Positions

Read and manage positions in a voting event.

Endpoints

MethodPathScopeDescription
GET/voting-events/:code/positionsreadList positions.
POST/voting-events/:code/positionswriteCreate a position.
GET/voting-events/:code/positions/:idreadGet a position.
PATCH/voting-events/:code/positions/:idwriteUpdate a position.
DELETE/voting-events/:code/positions/:idwriteDelete a position.

Query parameters

NameTypeRequiredDescription
groupIdstringNoList positions in one group.

Request fields

title is required on create. Send at least one field on update. tallyRule is an object with a required type. Use seatCount and stvQuota only for ranked_stv. Use bordaSchema only for ranked_borda.

FieldTypeRequired on createDescription
titlestringYes1 to 200 characters.
descstringNoUp to 2,000 characters.
groupIdstringNoGroup ID.
minSelectionsintegerNoMinimum 0.
maxSelectionsintegerNoMinimum 1.
votingMethodstringNoAn implemented Pepvote voting method.
tallyRuleobjectNotype: plurality, approval, score, cumulative, quadratic, referendum, ranked IRV, STV, or Borda total.
scoreMin, scoreMaxintegerNoScore voting bounds.
cumulativePointBudgetintegerNoMinimum 1.
quadraticBaseCreditBudgetintegerNoMinimum 1.
quadraticAllowCreditTopUpsbooleanNoAllow paid top-ups.
quadraticMaxPurchasedCreditsPerVoterintegerNoMinimum 0.

Example

curl -X POST "https://api.pepvote.com/voting-events/BOARD26/positions" \
  -H "Authorization: Bearer $PEPVOTE_API_KEY" -H "Content-Type: application/json" \
  -H "Idempotency-Key: chair-001" -d '{"title":"Board chair","maxSelections":1}'
{ "data": { "id": "j57position01", "votingEventId": "j57event01", "groupId": null, "title": "Board chair", "desc": null, "votingMethod": "plurality", "tallyRule": { "type": "plurality_total" }, "minSelections": 0, "maxSelections": 1, "scoreMin": null, "scoreMax": null, "cumulativePointBudget": null, "quadraticBaseCreditBudget": null, "quadraticAllowCreditTopUps": null, "quadraticMaxPurchasedCreditsPerVoter": null, "createdAt": 1776900100000 } }

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