Pepvote Support Center

Positions

Read and manage positions in a voting event.

Endpoints

MethodPathScopeDescription
GET/voting-events/:idOrCode/positionsreadList positions.
POST/voting-events/:idOrCode/positionswriteCreate a position.
POST/voting-events/:idOrCode/positions/batchwriteCreate up to 100 positions.
GET/voting-events/:idOrCode/positions/:idreadGet a position.
PATCH/voting-events/:idOrCode/positions/:idwriteUpdate a position.
DELETE/voting-events/:idOrCode/positions/:idwriteDelete a position.

Query parameters

NameTypeRequiredDescription
groupIdstringNoList positions in one group.
searchstringNoSearch position titles and descriptions.

Request fields

title is required on a single create. Send at least one field on update. A batch row accepts the same fields, but its title is optional at the HTTP layer and Pepvote applies event rules. tallyRule has a required type. Use seatCount and stvQuota only for ranked_stv. Use bordaSchema only for ranked_borda.

FieldTypeDescription
titlestring1 to 200 characters.
descstringUp to 2,000 characters.
groupIdstringGroup ID.
minSelectionsintegerMinimum 0.
maxSelectionsintegerMinimum 1.
votingMethodstringAn implemented Pepvote voting method.
tallyRuleobjectA total, ranked, or referendum rule.
scoreMin, scoreMaxintegerScore voting bounds.
cumulativePointBudgetintegerMinimum 1.
quadraticBaseCreditBudgetintegerMinimum 1.
quadraticAllowCreditTopUpsbooleanAllow paid top-ups.
quadraticMaxPurchasedCreditsPerVoterintegerMinimum 0.

Create example

curl -X POST "https://api.pepvote.com/voting-events/BOARD26/positions" \
  -H "Authorization: Bearer $PEPVOTE_API_KEY" -H "User-Agent: my-app/1.0" \
  -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
  }
}

Batch create

Send { "positions": [...] }. The array must have 1 to 100 rows. This endpoint uses the batch rate limit bucket.

curl -X POST "https://api.pepvote.com/voting-events/BOARD26/positions/batch" \
  -H "Authorization: Bearer $PEPVOTE_API_KEY" -H "User-Agent: my-app/1.0" \
  -H "Content-Type: application/json" -d '{"positions":[{"title":"Chair"},{"title":"Secretary"}]}'
{
  "data": {
    "created": [
      {
        "id": "j57position01",
        "title": "Chair"
      }
    ],
    "skipped": [
      {
        "index": 1,
        "reason": "A position with this title already exists."
      }
    ]
  }
}

Use index to identify the zero-based input row. A successful create returns 201. Delete returns 202 with { "data": { "id": "...", "deletion": "queued" } }.

Was this helpful?

Last updated September 6, 2026

On this page