Pepvote Support Center

API changelog

Every change to the Pepvote API, newest first.

This page lists every change to the Pepvote API. Changes are additive: new fields, values, and endpoints appear here when they ship, and nothing existing changes shape without notice.

Check this page before you upgrade an integration. For the full reference, see the API overview.

September 2026

  • Event paths accept the voting event's id as well as its code: /voting-events/{idOrCode} and everything beneath it.
  • Voting event status now uses the dashboard's names: draft, upcoming, ongoing, ended (previously unscheduled, upcoming, live, ended). The status filter on GET /voting-events takes the same values. Status is computed by the same rule as the dashboard, so an event whose end time has passed is ended even without a start time.
  • Added the API reference with one page per endpoint, code samples in seven languages, and a playground that sends real requests with your key. The API and webhook docs now live in the Developers section of the support center.
  • Launched the Pepvote API at https://api.pepvote.com with bearer API keys created under Profile → API keys. Keys carry read or read and write scopes.
  • Added read and write endpoints for voting events, positions, candidates, groups, and voters, including a batch voter create endpoint of up to 100 rows per request.
  • Added read endpoints for sponsors, event stats, results, and votes. Listing votes requires a plan with data export.
  • Added webhook endpoint management so automation platforms can subscribe to events over REST.
  • Added GET /health for uptime monitoring and GET /me for connection tests.
  • Added an unauthenticated GET / that returns the company name, website, api_doc, and status links, plus GET /docs and GET /docs/<page> redirects into these pages.
  • Added cursor pagination, a uniform error envelope, per-key rate limits with X-RateLimit-* headers, and Idempotency-Key support on POST requests.
  • Added event creation, event deletion, and event logo endpoints.
  • Added the upload flow for event logos, candidate avatars, group logos, and sponsor logos.
  • Added batch create endpoints for positions, candidates, and groups. Each accepts up to 100 rows.
  • Added bulk candidate approval and voter approval endpoints.
  • Added candidate search, external avatar URLs, stored avatars, and optional candidate group and position expansion.
  • Split groups, sponsors, results, and votes into focused references. Added sponsor write and logo endpoints.
  • Added search filters to position, candidate, group, and sponsor lists.
  • Added exports for voters, votes, candidates, positions, groups, sponsors, and result PDFs. Large voter and vote exports are emailed. PDF download links expire after 5 minutes.
  • Added invites for event collaborators.
  • Added plan-gated insights for voting totals, geography, and time series.
  • API requests now require a User-Agent header. Missing headers return 403 user_agent_required.
  • Added a per-API key request log with the last 100 requests and 30-day retention.
  • Added the independent vote API key scope and public voting endpoints for server-to-server voting interfaces. These include voter key requests, ballot previews, eligibility checks, casts, confirmations, public results, and quadratic credits.
  • Added payment business listing and event linking endpoints, organizer and voter payment status endpoints, and provider-shaped checkout responses for paid public flows.
  • Added pricing endpoints for pay-to-vote, paid candidate registration, and quadratic credit top-ups.
  • Changed uploads to accept a multipart file field or a raw image body in one request. Upload responses now include storageId, url, contentType, and size.
  • Changed Stripe checkout responses to a hosted stripe.checkoutUrl and checkoutSessionId, matching paystack.checkoutUrl. The clientSecret, publishableKey, and paymentIntentId fields are gone. Paid public requests accept returnUrl (required for Stripe events) and cancelUrl; the provider redirects the payer there with paymentAttemptId appended.
Was this helpful?

Last updated September 6, 2026

On this page