Start a room
presentUrl to the person presenting: it opens the presenter view and claims the host key from the fragment, so the person can take over from the agent at any point. joinUrl is what the audience opens.
A deck with slide pages starts here too. The server draws every page of the attached PDF first, the same way the editor does, so the call takes a few seconds longer. A deck whose slides point at pages without a PDF behind them answers
409; attach the slides with attach_pdf first.rooms:start scope, which the Pro plan sells. The room needs every poll to pass readiness; otherwise 400 names the first problem.
Drive it
room_action does what the presenter’s buttons do, and answers with where the room is.
next before start for example, answers 409 with a sentence.
A multiple-choice poll with a correctIndex is a quiz. Closing it reveals that answer on the big screen and on every phone, and gives a point to each person whose one pick was the answer. room_results names the answer in correctOptionId and the standings in leaderboard.
Set quizView to standings on a multiple-choice poll to show the scoreboard instead of a question. It takes no answers, lists everyone who has answered a quiz question with their points and an arrow for whoever moved since the last question, and adds a podium once the last quiz question has closed. room_results lists it as the board.

The standings board mid-quiz, the leader outlined and an arrow for whoever moved since the last question. Drawn by get_screenshot.
Read the results
room_results returns every poll’s results so far, live or ended, as JSON and as a markdown summary ready to paste into a follow-up.
Every session of a deck at once
deck_results answers for a whole deck: every session it has run, oldest first, each with the same numbers and markdown as room_results. Send answers for every answer as a row too, with the name the person joined under, what they answered, whether a quiz answer was right and how many seconds it took. Those are the rows the app’s spreadsheet download holds. Send sessions with ids from list_rooms, comma separated, to read only some of them.
A live room is held in memory on one server. Its results are saved whenever a poll closes and when the room ends, so
room_results still answers after a restart, from what was saved. A room nobody touches for 24 hours ends by itself.List rooms
list_rooms returns the team’s rooms, newest first, fifty at most, with each room’s code, status, how many people joined, its name and when it ended. A room the app no longer holds reads ended.
Run one deck for several sessions
A deck you present every week, to a different class each time, runs as one session per class. Start it withstart_room and a label, such as "Class 3B, Tuesday", and with askName when you need to know who answered what: people then type their own name to join instead of getting a nickname, and a name already in the room is refused. Each session gets its own code, its own people and its own results, and the deck itself never changes. list_rooms with deckId lists the sessions that deck has run, each with its name, room_results reads any of them, also days later, and deck_results reads them all in one call. list_decks counts them per deck in sessionCount, and the presenter finds the same list under the deck’s menu in the app, as Sessions.