PollIt
New poll

The PollIt API

Everything the app does goes through a JSON API that you can use too. No key is needed to make or answer polls; an account's API key lets scripts see the polls of that account.

Keys and headers

  • X-Admin-Key: … – the organizer key you get when you make a poll (it is also in the organizer link)
  • X-Participant-Keys: id.key,… – keys of answers, to change or withdraw them
  • X-Poll-Pass: … – for polls with a password: the token from POST /api/polls/{id}/unlock
  • X-Browser-Key: … – any random string of 16-64 letters, for polls that take one answer per browser
  • Authorization: Bearer … – an API key (Account > API keys) or a session

Make a poll

curl -X POST https://poll-it-quick.com/api/polls -H "Content-Type: application/json" -d '{
  "poll": {
    "type": "date", "title": "Team lunch", "tz": "Europe/Prague",
    "options": [ { "start": "2026-11-12T12:00", "end": "2026-11-12T13:00" }, { "date": "2026-11-13" } ],
    "settings": { "mode": "ynm", "deadline": "2026-11-10T18:00:00Z" }
  }
}'
# -> { "id": "…", "key": "<organizer key>", "poll": {…} }

Types: date, grid, choice, rank, score, signup, booking, open. Options: a label (and image, note, capacity), or a date, or start/end as YYYY-MM-DDTHH:mm in the poll's tz. grid takes "grid": { days | weekdays, from, to, step }; booking takes "booking": { duration, weekly, … }.

Read and answer

curl https://poll-it-quick.com/api/polls/{id}                       # the poll, answers, comments (as its settings allow)
curl https://poll-it-quick.com/api/polls/{id}?v=12                  # { "unchanged": true } when nothing changed since version 12
curl -X POST https://poll-it-quick.com/api/polls/{id}/participants -H "Content-Type: application/json" \
     -d '{ "name": "Ann", "answers": { "sel": { "o1": "y", "o2": "m" } } }'
# answers: date/choice/signup { sel: { optionId: "y" | "m" } }, rank { order: [ids] }, score { scores: { id: n } },
#          grid { cells, maybe } (base64url bits), booking { slot: startMs }, open { text }
curl -X PATCH  https://poll-it-quick.com/api/polls/{id}/participants/{pid} -H "X-Participant-Keys: {pid}.{key}" ...
curl -X DELETE https://poll-it-quick.com/api/polls/{id}/participants/{pid} -H "X-Participant-Keys: {pid}.{key}"
curl -X POST   https://poll-it-quick.com/api/polls/{id}/comments -d '{ "name": "Ann", "text": "…" }'

Organizer

PATCH  /api/polls/{id}            { "poll": {…}, "password": "…" | null, "private": { "email", "webhook" } }
POST   /api/polls/{id}/close  |  /reopen
POST   /api/polls/{id}/final      { "options": ["o2"], "note": "…", "notify": true }
GET    /api/polls/{id}/final.ics
GET    /api/polls/{id}/invites  ·  POST /api/polls/{id}/invites { "invites": [{ "name", "email" }] }
GET    /api/polls/{id}/events     (activity log)
POST   /api/polls/{id}/pin        (six-digit join code)
DELETE /api/polls/{id}
GET    /api/me/polls              (with an API key: the account's polls)

Webhooks

A poll with a webhook address gets a POST for every answer, change, comment, new option and decision:

POST <your address>
X-PollIt-Event: vote
X-PollIt-Signature: sha256=<HMAC-SHA256 of the body with the poll's webhook secret, hex>
{ "event": "vote", "at": "…", "poll": { "id", "title", "type", "url" }, "participant": { "id", "name", "answers" }, "text": "Ann answered." }

Events: vote, update, withdraw, comment, option, final, closed, reopened, booking, rebooking, cancel. The secret is in the organizer tools.

Limits

Requests are limited per internet address (for example 60 new polls an hour and 120 answers in 10 minutes). Errors come as { "error": "…", "key": "…" } with an HTTP status.