curl --request PUT \
--url https://test.polltheroom.com/api/v1/decks/{id}/source \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"pdf": "<string>",
"pages": 30,
"revision": "2023-11-07T05:31:56Z"
}
'import requests
url = "https://test.polltheroom.com/api/v1/decks/{id}/source"
payload = {
"pdf": "<string>",
"pages": 30,
"revision": "2023-11-07T05:31:56Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({pdf: '<string>', pages: 30, revision: '2023-11-07T05:31:56Z'})
};
fetch('https://test.polltheroom.com/api/v1/decks/{id}/source', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://test.polltheroom.com/api/v1/decks/{id}/source",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'pdf' => '<string>',
'pages' => 30,
'revision' => '2023-11-07T05:31:56Z'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://test.polltheroom.com/api/v1/decks/{id}/source"
payload := strings.NewReader("{\n \"pdf\": \"<string>\",\n \"pages\": 30,\n \"revision\": \"2023-11-07T05:31:56Z\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://test.polltheroom.com/api/v1/decks/{id}/source")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"pdf\": \"<string>\",\n \"pages\": 30,\n \"revision\": \"2023-11-07T05:31:56Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://test.polltheroom.com/api/v1/decks/{id}/source")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"pdf\": \"<string>\",\n \"pages\": 30,\n \"revision\": \"2023-11-07T05:31:56Z\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"slides": 0,
"ready": true,
"problems": [
{
"step": 0,
"path": "<string>",
"message": "<string>",
"overlay": 0
}
],
"warnings": [
{
"element": "<string>",
"message": "<string>",
"step": 0,
"with": "<string>"
}
],
"revision": "<string>"
}{
"error": "<string>",
"fix": "<string>"
}{
"error": "<string>",
"fix": "<string>"
}{
"error": "<string>",
"fix": "<string>"
}{
"error": "<string>",
"fix": "<string>"
}{
"error": "<string>",
"fix": "<string>"
}{
"error": "<string>",
"fix": "<string>"
}Attach the slides as a PDF
Put the presenter’s own slides behind the deck. The editor renders the pages when the deck is opened, so polls can float on the real slides. With pages, and while no slide has a page yet, the blank slides are replaced by one slide per page, in order, after the join screen; polls and paged slides already there are kept. PDF only for now.
Needs the decks:write scope.
curl --request PUT \
--url https://test.polltheroom.com/api/v1/decks/{id}/source \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"pdf": "<string>",
"pages": 30,
"revision": "2023-11-07T05:31:56Z"
}
'import requests
url = "https://test.polltheroom.com/api/v1/decks/{id}/source"
payload = {
"pdf": "<string>",
"pages": 30,
"revision": "2023-11-07T05:31:56Z"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({pdf: '<string>', pages: 30, revision: '2023-11-07T05:31:56Z'})
};
fetch('https://test.polltheroom.com/api/v1/decks/{id}/source', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://test.polltheroom.com/api/v1/decks/{id}/source",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'pdf' => '<string>',
'pages' => 30,
'revision' => '2023-11-07T05:31:56Z'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://test.polltheroom.com/api/v1/decks/{id}/source"
payload := strings.NewReader("{\n \"pdf\": \"<string>\",\n \"pages\": 30,\n \"revision\": \"2023-11-07T05:31:56Z\"\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.put("https://test.polltheroom.com/api/v1/decks/{id}/source")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"pdf\": \"<string>\",\n \"pages\": 30,\n \"revision\": \"2023-11-07T05:31:56Z\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://test.polltheroom.com/api/v1/decks/{id}/source")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"pdf\": \"<string>\",\n \"pages\": 30,\n \"revision\": \"2023-11-07T05:31:56Z\"\n}"
response = http.request(request)
puts response.read_body{
"ok": true,
"slides": 0,
"ready": true,
"problems": [
{
"step": 0,
"path": "<string>",
"message": "<string>",
"overlay": 0
}
],
"warnings": [
{
"element": "<string>",
"message": "<string>",
"step": 0,
"with": "<string>"
}
],
"revision": "<string>"
}{
"error": "<string>",
"fix": "<string>"
}{
"error": "<string>",
"fix": "<string>"
}{
"error": "<string>",
"fix": "<string>"
}{
"error": "<string>",
"fix": "<string>"
}{
"error": "<string>",
"fix": "<string>"
}{
"error": "<string>",
"fix": "<string>"
}Authorizations
An API key from Settings › API, sent as Authorization: Bearer ptr_…. Shown once when made; only a hash is stored.
Path Parameters
The deck's id
1Body
The PDF file, base64 encoded (24 MB at most)
8 - 32000000How many pages the PDF has; makes one slide step per page when the deck has none yet
1 <= x <= 60The deck's revision you read (from get_deck or the last write). Sent, the write lands only if nobody changed the deck since; left out, it goes through regardless
^(?:(?:\d\d[2468][048]|\d\d[13579][26]|\d\d0[48]|[02468][048]00|[13579][26]00)-02-29|\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\d|30)|(?:02)-(?:0[1-9]|1\d|2[0-8])))T(?:(?:[01]\d|2[0-3]):[0-5]\d(?::[0-5]\d(?:\.\d+)?)?(?:Z))$Response
OK
Slide steps with a page behind them, now
-9007199254740991 <= x <= 9007199254740991Every poll passes the readiness check, so a room can start
What stops it, by step; empty when ready
Show child attributes
Show child attributes
Placements that will not read well on stage, by step: a card smaller than a fifth of the slide either way, or a card or text box over another card or text box. They do not stop a room; fix them anyway
Show child attributes
Show child attributes
The deck's revision after this write; send it as revision with the next write to be sure nobody changed the deck in between