Developers
Build on the Voxpla API
Create events, launch polls, moderate questions and pull results into your own systems. A JSON REST API with keys and an OpenAPI 3.1 description.
The API is part of the Enterprise plan. Keys stop working when the plan no longer includes it.
Quick start
- In Voxpla, open Settings and then API keys (owners and admins).
- Create a key, choose its permissions and copy it. It is shown only once.
- Send it in the Authorization header of every request.
- Load the OpenAPI description into Postman, Insomnia or your code generator.
curl https://voxpla.eu/api/v1/key \
-H "Authorization: Bearer vx_live_..."
Authentication
Every request needs the header Authorization: Bearer followed by the key. Keys start with vx_live_ (vx_test_ outside production). Voxpla stores only a fingerprint of the key and its first characters for display. A lost key cannot be recovered: create a new one and revoke the old one.
Authorization: Bearer vx_live_3kQ9...- A missing, unknown, expired or revoked key returns 401.
- When the organization's plan no longer includes the API, keys return 402 plan_required.
- The API does not accept browser sessions, and keys do not work in the web app.
- Every write call is recorded in the audit log together with the key that made it.
Scopes
Every key can read. Give a key more permissions only when an integration needs them.
read- List and read events, sessions, questions, polls, results, analytics and CSV exports.
write- Create and edit events, change their status, create, launch and close polls.
moderate- Moderate questions: approve, hide, highlight, mark as answered, pin, archive and delete.
A call outside the key's scopes returns 403 insufficient_scope.
Rate limits
Each key may send 600 requests per minute. Above the limit the API answers 429 rate_limited with a Retry-After header in seconds. Wait that long, then try again.
HTTP/1.1 429 Too Many Requests
Retry-After: 12
{"error":"rate_limited","retryAfter":12}
Pagination
Lists return items and next_cursor. Ask for up to 100 items with limit (default 25) and pass next_cursor as cursor to get the next page. On the last page next_cursor is null. Cursors are opaque, do not build them yourself.
curl "https://voxpla.eu/api/v1/events?limit=100&cursor=djE6Y2x4..." \
-H "Authorization: Bearer $VOXPLA_API_KEY"
{ "items": [ ... ], "next_cursor": null }
Errors
Errors are JSON objects with a stable code in the error field. Base your logic on the code, not on the HTTP reason text.
400 invalid- The request body or a parameter is invalid; issues lists the fields.
401 invalid_api_key- The key is missing, unknown or revoked (api_key_expired for an expired key).
402 plan_required- The organization's plan does not include the API.
403 insufficient_scope- The key does not have the permission this call needs.
404 not_found- The object does not exist in your organization.
429 rate_limited- Too many requests; wait for the number of seconds in Retry-After.
Endpoints
All paths are relative to https://voxpla.eu/api/v1
-
GET/keyread
The calling key, its permissions and organization.
-
GET/eventsread
Events of your organization, newest first, optionally filtered by status.
-
POST/eventswrite
Creates an event with one session. The join code is generated.
-
GET/events/{id}read
One event with its join code, participant link and settings.
-
PATCH/events/{id}write
Changes the name, time, time zone, language or settings.
-
POST/events/{id}/statuswrite
Switches the event to draft, live, ended or archived.
-
GET/events/{id}/sessionsread
Sessions (rooms, program blocks) of an event.
-
GET/sessions/{id}/questionsread
Questions of a session with votes and replies, optionally filtered by status.
-
POST/questions/{id}/actionsmoderate
Approves, hides, highlights, answers, pins, archives or deletes a question.
-
GET/sessions/{id}/pollsread
Polls of a session in their order.
-
POST/sessions/{id}/pollswrite
Creates a poll, word cloud, rating, quiz question or another poll type.
-
POST/polls/{id}/activatewrite
Launches a poll. The running poll of the session closes.
-
POST/polls/{id}/closewrite
Closes a poll.
-
GET/polls/{id}/resultsread
Aggregated results of a poll.
-
GET/events/{id}/analyticsread
Participants, engagement, timeline, top questions and poll results.
-
GET/events/{id}/export.csvread
CSV export of questions, polls, participants or survey answers.
Responses contain what a moderator sees. Anonymous participants stay anonymous: no response contains participant identities, tokens or projector links.
Webhooks
Instead of asking the API again and again, let Voxpla call you. Set up a webhook in Settings and then Integrations for event.started, question.approved, poll.closed and event.ended.
- Each delivery is an HTTPS POST signed in the X-Voxpla-Signature header (HMAC-SHA256 of the timestamp and the raw body).
- Reject deliveries older than 5 minutes and use X-Voxpla-Delivery to ignore duplicates.
- Failed deliveries are retried twice. After 10 failures in a row the webhook pauses until you switch it on again.
X-Voxpla-Event: poll.closed
X-Voxpla-Delivery: dlv_6b0c3f...
X-Voxpla-Signature: t=1793390000,v1=5f0c1a...
Examples
List live events
curl https://voxpla.eu/api/v1/events?status=live&limit=50 \
-H "Authorization: Bearer $VOXPLA_API_KEY"Create an event
curl -X POST https://voxpla.eu/api/v1/events \
-H "Authorization: Bearer $VOXPLA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name":"All hands","startsAt":"2026-11-20T09:00:00Z","locale":"en"}'Create and launch a poll
curl -X POST https://voxpla.eu/api/v1/sessions/$SESSION_ID/polls \
-H "Authorization: Bearer $VOXPLA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"type":"multiple_choice","title":"Lunch?","options":[{"label":"Pizza"},{"label":"Salad"}]}'
curl -X POST https://voxpla.eu/api/v1/polls/$POLL_ID/activate -H "Authorization: Bearer $VOXPLA_API_KEY"Read the results
curl https://voxpla.eu/api/v1/polls/$POLL_ID/results -H "Authorization: Bearer $VOXPLA_API_KEY"Approve a question
curl -X POST https://voxpla.eu/api/v1/questions/$QUESTION_ID/actions \
-H "Authorization: Bearer $VOXPLA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"action":"approve"}'
Give your audience a voice at the next event
Set up an event in under a minute. Participants join from any browser with a QR code or a six character code.
Free forever plan, no credit card, data stored in the EU.