Skip to main content
A room is one live session of a deck: a six-digit code, a QR, and the audience answering on their phones. The presenter drives it from the presenter view; an agent can drive it over the API with the same eight actions.

Start a room

The room waits in the lobby. Hand 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.
Starting rooms needs the 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.
An action that does not fit the room’s state, 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.
A quiz standings board with six players in two columns, the leader outlined, arrows on the players who moved, and a live Q3 of 8 pill

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.
See Read results for what each widget puts in its snapshot.

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 with start_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.