[{"data":1,"prerenderedAt":1248},["ShallowReactive",2],{"docs-navigation":3,"docs-page:\u002Fdocs\u002Fapi\u002Fbooks":434},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,12,49,69,265,315,364,394],{"title":10,"path":6,"stem":11},"Overview","docs\u002Findex",{"title":13,"path":14,"stem":15,"children":16,"order":18},"API Overview","\u002Fdocs\u002Fapi","docs\u002Fapi\u002Findex",[17,19,24,29,34,39,44],{"title":13,"path":14,"stem":15,"order":18},7,{"title":20,"path":21,"stem":22,"order":23},"Assets API","\u002Fdocs\u002Fapi\u002Fassets","docs\u002Fapi\u002Fassets",3,{"title":25,"path":26,"stem":27,"order":28},"Authentication","\u002Fdocs\u002Fapi\u002Fauthentication","docs\u002Fapi\u002Fauthentication",1,{"title":30,"path":31,"stem":32,"order":33},"Books API","\u002Fdocs\u002Fapi\u002Fbooks","docs\u002Fapi\u002Fbooks",6,{"title":35,"path":36,"stem":37,"order":38},"Components API","\u002Fdocs\u002Fapi\u002Fcomponents","docs\u002Fapi\u002Fcomponents",4,{"title":40,"path":41,"stem":42,"order":43},"Error Handling","\u002Fdocs\u002Fapi\u002Ferrors","docs\u002Fapi\u002Ferrors",5,{"title":45,"path":46,"stem":47,"order":48},"Games API","\u002Fdocs\u002Fapi\u002Fgames","docs\u002Fapi\u002Fgames",2,{"title":50,"path":51,"stem":52,"children":53,"order":43},"Automation","\u002Fdocs\u002Fautomation","docs\u002Fautomation\u002Findex",[54,55,65],{"title":50,"path":51,"stem":52,"order":43},{"title":56,"path":57,"stem":58,"children":59,"order":48},"Sequences","\u002Fdocs\u002Fautomation\u002Fsequences","docs\u002Fautomation\u002Fsequences\u002Findex",[60,61],{"title":56,"path":57,"stem":58,"order":48},{"title":62,"path":63,"stem":64},"Steps","\u002Fdocs\u002Fautomation\u002Fsequences\u002Fsteps","docs\u002Fautomation\u002Fsequences\u002Fsteps",{"title":66,"path":67,"stem":68,"order":28},"Triggers","\u002Fdocs\u002Fautomation\u002Ftriggers","docs\u002Fautomation\u002Ftriggers",{"title":70,"path":71,"stem":72,"children":73,"order":38},"Entities","\u002Fdocs\u002Fentities","docs\u002Fentities\u002Findex",[74,75,171,213],{"title":70,"path":71,"stem":72,"order":38},{"title":76,"path":77,"stem":78,"children":79},"Pieces","\u002Fdocs\u002Fentities\u002Fpieces","docs\u002Fentities\u002F01.pieces\u002Findex",[80,81,87,101,115,149],{"title":76,"path":77,"stem":78},{"title":82,"path":83,"stem":84,"children":85},"Books","\u002Fdocs\u002Fentities\u002Fpieces\u002Fbooks","docs\u002Fentities\u002F01.pieces\u002Fbooks\u002Findex",[86],{"title":82,"path":83,"stem":84},{"title":88,"path":89,"stem":90,"children":91},"Dice","\u002Fdocs\u002Fentities\u002Fpieces\u002Fdice","docs\u002Fentities\u002F01.pieces\u002Fdice\u002Findex",[92,93,97],{"title":88,"path":89,"stem":90},{"title":94,"path":95,"stem":96},"Polyhedral Die","\u002Fdocs\u002Fentities\u002Fpieces\u002Fdice\u002Fpolyhedral-die","docs\u002Fentities\u002F01.pieces\u002Fdice\u002Fpolyhedral-die",{"title":98,"path":99,"stem":100},"Spinner","\u002Fdocs\u002Fentities\u002Fpieces\u002Fdice\u002Fspinner","docs\u002Fentities\u002F01.pieces\u002Fdice\u002Fspinner",{"title":102,"path":103,"stem":104,"children":105},"Tiles and Stacks","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftiles-and-stacks","docs\u002Fentities\u002F01.pieces\u002Ftiles-and-stacks\u002Findex",[106,107,111],{"title":102,"path":103,"stem":104},{"title":108,"path":109,"stem":110},"Stack","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftiles-and-stacks\u002Fstack","docs\u002Fentities\u002F01.pieces\u002Ftiles-and-stacks\u002Fstack",{"title":112,"path":113,"stem":114},"Tile","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftiles-and-stacks\u002Ftile","docs\u002Fentities\u002F01.pieces\u002Ftiles-and-stacks\u002Ftile",{"title":116,"path":117,"stem":118,"children":119},"Tokens","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftokens","docs\u002Fentities\u002F01.pieces\u002Ftokens\u002Findex",[120,121,125,129,133,137,141,145],{"title":116,"path":117,"stem":118},{"title":122,"path":123,"stem":124},"Block","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftokens\u002Fblock","docs\u002Fentities\u002F01.pieces\u002Ftokens\u002Fblock",{"title":126,"path":127,"stem":128},"Disc","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftokens\u002Fdisc","docs\u002Fentities\u002F01.pieces\u002Ftokens\u002Fdisc",{"title":130,"path":131,"stem":132},"Image Token","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftokens\u002Fimage-token","docs\u002Fentities\u002F01.pieces\u002Ftokens\u002Fimage-token",{"title":134,"path":135,"stem":136},"Model Token","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftokens\u002Fmodel-token","docs\u002Fentities\u002F01.pieces\u002Ftokens\u002Fmodel-token",{"title":138,"path":139,"stem":140},"Pawn","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftokens\u002Fpawn","docs\u002Fentities\u002F01.pieces\u002Ftokens\u002Fpawn",{"title":142,"path":143,"stem":144},"Pyramid","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftokens\u002Fpyramid","docs\u002Fentities\u002F01.pieces\u002Ftokens\u002Fpyramid",{"title":146,"path":147,"stem":148},"Ring","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftokens\u002Fring","docs\u002Fentities\u002F01.pieces\u002Ftokens\u002Fring",{"title":150,"path":151,"stem":152,"children":153},"Utility Pieces","\u002Fdocs\u002Fentities\u002Fpieces\u002Futility-pieces","docs\u002Fentities\u002F01.pieces\u002Futility-pieces\u002Findex",[154,155,159,163,167],{"title":150,"path":151,"stem":152},{"title":156,"path":157,"stem":158},"Bag","\u002Fdocs\u002Fentities\u002Fpieces\u002Futility-pieces\u002Fbag","docs\u002Fentities\u002F01.pieces\u002Futility-pieces\u002Fbag",{"title":160,"path":161,"stem":162},"Counter","\u002Fdocs\u002Fentities\u002Fpieces\u002Futility-pieces\u002Fcounter","docs\u002Fentities\u002F01.pieces\u002Futility-pieces\u002Fcounter",{"title":164,"path":165,"stem":166},"Timer","\u002Fdocs\u002Fentities\u002Fpieces\u002Futility-pieces\u002Ftimer","docs\u002Fentities\u002F01.pieces\u002Futility-pieces\u002Ftimer",{"title":168,"path":169,"stem":170},"Token Bowl","\u002Fdocs\u002Fentities\u002Fpieces\u002Futility-pieces\u002Ftoken-bowl","docs\u002Fentities\u002F01.pieces\u002Futility-pieces\u002Ftoken-bowl",{"title":172,"path":173,"stem":174,"children":175},"Spaces","\u002Fdocs\u002Fentities\u002Fspaces","docs\u002Fentities\u002F02.spaces\u002Findex",[176,177,191],{"title":172,"path":173,"stem":174},{"title":178,"path":179,"stem":180,"children":181},"Layouts","\u002Fdocs\u002Fentities\u002Fspaces\u002Flayouts","docs\u002Fentities\u002F02.spaces\u002Flayouts\u002Findex",[182,183,187],{"title":178,"path":179,"stem":180},{"title":184,"path":185,"stem":186},"Hex Grid","\u002Fdocs\u002Fentities\u002Fspaces\u002Flayouts\u002Fhex-grid","docs\u002Fentities\u002F02.spaces\u002Flayouts\u002Fhex-grid",{"title":188,"path":189,"stem":190},"Square Grid","\u002Fdocs\u002Fentities\u002Fspaces\u002Flayouts\u002Fsquare-grid","docs\u002Fentities\u002F02.spaces\u002Flayouts\u002Fsquare-grid",{"title":192,"path":193,"stem":194,"children":195},"Placement Spaces","\u002Fdocs\u002Fentities\u002Fspaces\u002Fplacement-spaces","docs\u002Fentities\u002F02.spaces\u002Fplacement-spaces\u002Findex",[196,197,201,205,209],{"title":192,"path":193,"stem":194},{"title":198,"path":199,"stem":200},"Box Space","\u002Fdocs\u002Fentities\u002Fspaces\u002Fplacement-spaces\u002Fbox-space","docs\u002Fentities\u002F02.spaces\u002Fplacement-spaces\u002Fbox-space",{"title":202,"path":203,"stem":204},"Hex Space","\u002Fdocs\u002Fentities\u002Fspaces\u002Fplacement-spaces\u002Fhex-space","docs\u002Fentities\u002F02.spaces\u002Fplacement-spaces\u002Fhex-space",{"title":206,"path":207,"stem":208},"Orb Space","\u002Fdocs\u002Fentities\u002Fspaces\u002Fplacement-spaces\u002Forb-space","docs\u002Fentities\u002F02.spaces\u002Fplacement-spaces\u002Forb-space",{"title":210,"path":211,"stem":212},"Point Space","\u002Fdocs\u002Fentities\u002Fspaces\u002Fplacement-spaces\u002Fpoint-space","docs\u002Fentities\u002F02.spaces\u002Fplacement-spaces\u002Fpoint-space",{"title":214,"path":215,"stem":216,"children":217},"Annotations","\u002Fdocs\u002Fentities\u002Fannotations","docs\u002Fentities\u002F03.annotations\u002Findex",[218,219,229,255],{"title":214,"path":215,"stem":216},{"title":220,"path":221,"stem":222,"children":223},"Freehand Annotations","\u002Fdocs\u002Fentities\u002Fannotations\u002Ffreehand-annotations","docs\u002Fentities\u002F03.annotations\u002Ffreehand-annotations\u002Findex",[224,225],{"title":220,"path":221,"stem":222},{"title":226,"path":227,"stem":228},"Freehand Annotation","\u002Fdocs\u002Fentities\u002Fannotations\u002Ffreehand-annotations\u002Ffreehand-annotation","docs\u002Fentities\u002F03.annotations\u002Ffreehand-annotations\u002Ffreehand-annotation",{"title":230,"path":231,"stem":232,"children":233},"Shape Annotations","\u002Fdocs\u002Fentities\u002Fannotations\u002Fshape-annotations","docs\u002Fentities\u002F03.annotations\u002Fshape-annotations\u002Findex",[234,235,239,243,247,251],{"title":230,"path":231,"stem":232},{"title":236,"path":237,"stem":238},"Arrow Annotation","\u002Fdocs\u002Fentities\u002Fannotations\u002Fshape-annotations\u002Farrow-annotation","docs\u002Fentities\u002F03.annotations\u002Fshape-annotations\u002Farrow-annotation",{"title":240,"path":241,"stem":242},"Box Annotation","\u002Fdocs\u002Fentities\u002Fannotations\u002Fshape-annotations\u002Fbox-annotation","docs\u002Fentities\u002F03.annotations\u002Fshape-annotations\u002Fbox-annotation",{"title":244,"path":245,"stem":246},"Hex Annotation","\u002Fdocs\u002Fentities\u002Fannotations\u002Fshape-annotations\u002Fhex-annotation","docs\u002Fentities\u002F03.annotations\u002Fshape-annotations\u002Fhex-annotation",{"title":248,"path":249,"stem":250},"Orb Annotation","\u002Fdocs\u002Fentities\u002Fannotations\u002Fshape-annotations\u002Forb-annotation","docs\u002Fentities\u002F03.annotations\u002Fshape-annotations\u002Forb-annotation",{"title":252,"path":253,"stem":254},"Triangle Annotation","\u002Fdocs\u002Fentities\u002Fannotations\u002Fshape-annotations\u002Ftriangle-annotation","docs\u002Fentities\u002F03.annotations\u002Fshape-annotations\u002Ftriangle-annotation",{"title":256,"path":257,"stem":258,"children":259},"Text Annotations","\u002Fdocs\u002Fentities\u002Fannotations\u002Ftext-annotations","docs\u002Fentities\u002F03.annotations\u002Ftext-annotations\u002Findex",[260,261],{"title":256,"path":257,"stem":258},{"title":262,"path":263,"stem":264},"Text Annotation","\u002Fdocs\u002Fentities\u002Fannotations\u002Ftext-annotations\u002Ftext-annotation","docs\u002Fentities\u002F03.annotations\u002Ftext-annotations\u002Ftext-annotation",{"title":266,"path":267,"stem":268,"children":269,"order":28},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002Fgetting-started\u002Findex",[270,271,275,279,283,311],{"title":266,"path":267,"stem":268,"order":28},{"title":272,"path":273,"stem":274,"order":48},"Tutorial 2: Build a Deck of Cards","\u002Fdocs\u002Fgetting-started\u002Fbuild-a-deck-of-cards","docs\u002Fgetting-started\u002Fbuild-a-deck-of-cards",{"title":276,"path":277,"stem":278,"order":23},"Tutorial 3: Use Your Own Images","\u002Fdocs\u002Fgetting-started\u002Fcustom-images","docs\u002Fgetting-started\u002Fcustom-images",{"title":280,"path":281,"stem":282,"order":38},"Frequently Asked Questions","\u002Fdocs\u002Fgetting-started\u002Ffaq","docs\u002Fgetting-started\u002Ffaq",{"title":284,"path":285,"stem":286,"children":287,"order":289},"Why Playtest Parlor?","\u002Fdocs\u002Fgetting-started\u002Fwhy-playtest-parlor","docs\u002Fgetting-started\u002Fwhy-playtest-parlor\u002Findex",[288,290,294,298,302,306],{"title":284,"path":285,"stem":286,"order":289},-2,{"title":291,"path":292,"stem":293,"order":38},"Compared to In-Person Playtesting","\u002Fdocs\u002Fgetting-started\u002Fwhy-playtest-parlor\u002Fcompared-to-in-person","docs\u002Fgetting-started\u002Fwhy-playtest-parlor\u002Fcompared-to-in-person",{"title":295,"path":296,"stem":297,"order":23},"Compared to PlayingCards.io","\u002Fdocs\u002Fgetting-started\u002Fwhy-playtest-parlor\u002Fcompared-to-playingcards-io","docs\u002Fgetting-started\u002Fwhy-playtest-parlor\u002Fcompared-to-playingcards-io",{"title":299,"path":300,"stem":301,"order":48},"Compared to Screentop.gg","\u002Fdocs\u002Fgetting-started\u002Fwhy-playtest-parlor\u002Fcompared-to-screentop","docs\u002Fgetting-started\u002Fwhy-playtest-parlor\u002Fcompared-to-screentop",{"title":303,"path":304,"stem":305,"order":28},"Compared to Tabletop Simulator","\u002Fdocs\u002Fgetting-started\u002Fwhy-playtest-parlor\u002Fcompared-to-tts","docs\u002Fgetting-started\u002Fwhy-playtest-parlor\u002Fcompared-to-tts",{"title":307,"path":308,"stem":309,"order":310},"Platform Comparison","\u002Fdocs\u002Fgetting-started\u002Fwhy-playtest-parlor\u002Fcomparison-matrix","docs\u002Fgetting-started\u002Fwhy-playtest-parlor\u002Fcomparison-matrix",0,{"title":312,"path":313,"stem":314,"order":28},"Tutorial 1: Your First Game","\u002Fdocs\u002Fgetting-started\u002Fyour-first-game","docs\u002Fgetting-started\u002Fyour-first-game",{"title":316,"path":317,"stem":318,"children":319,"order":48},"Interface","\u002Fdocs\u002Finterface","docs\u002Finterface\u002Findex",[320,321,325,330,334,338,342,346,351,356,360],{"title":316,"path":317,"stem":318,"order":48},{"title":322,"path":323,"stem":324,"order":38},"The Action Dock","\u002Fdocs\u002Finterface\u002Faction-dock","docs\u002Finterface\u002Faction-dock",{"title":326,"path":327,"stem":328,"order":329},"Finding Your Discord User ID","\u002Fdocs\u002Finterface\u002Fdiscord-id","docs\u002Finterface\u002Fdiscord-id",11,{"title":331,"path":332,"stem":333,"order":18},"The Entity Browser","\u002Fdocs\u002Finterface\u002Fentity-browser","docs\u002Finterface\u002Fentity-browser",{"title":335,"path":336,"stem":337,"order":43},"The Minimap","\u002Fdocs\u002Finterface\u002Fminimap","docs\u002Finterface\u002Fminimap",{"title":339,"path":340,"stem":341,"order":33},"The Player Hand","\u002Fdocs\u002Finterface\u002Fplayer-hand","docs\u002Finterface\u002Fplayer-hand",{"title":343,"path":344,"stem":345,"order":23},"The Players Panel","\u002Fdocs\u002Finterface\u002Fplayers-panel","docs\u002Finterface\u002Fplayers-panel",{"title":347,"path":348,"stem":349,"order":350},"Sequences Panel","\u002Fdocs\u002Finterface\u002Fsequences-panel","docs\u002Finterface\u002Fsequences-panel",10,{"title":352,"path":353,"stem":354,"order":355},"Session Notebook","\u002Fdocs\u002Finterface\u002Fsession-notebook","docs\u002Finterface\u002Fsession-notebook",8,{"title":357,"path":358,"stem":359,"order":28},"The Table","\u002Fdocs\u002Finterface\u002Ftable","docs\u002Finterface\u002Ftable",{"title":361,"path":362,"stem":363,"order":48},"The Toolbar","\u002Fdocs\u002Finterface\u002Ftoolbar","docs\u002Finterface\u002Ftoolbar",{"title":365,"path":366,"stem":367,"children":368,"order":23},"Playtests","\u002Fdocs\u002Fplaytests","docs\u002Fplaytests\u002Findex",[369,370,374,378,382,386,390],{"title":365,"path":366,"stem":367,"order":23},{"title":371,"path":372,"stem":373,"order":48},"Inviting players","\u002Fdocs\u002Fplaytests\u002Finviting-players","docs\u002Fplaytests\u002Finviting-players",{"title":375,"path":376,"stem":377,"order":43},"Player count guidelines","\u002Fdocs\u002Fplaytests\u002Fplayer-count-guidelines","docs\u002Fplaytests\u002Fplayer-count-guidelines",{"title":379,"path":380,"stem":381,"order":33},"Promoting to communities","\u002Fdocs\u002Fplaytests\u002Fpromoting-to-communities","docs\u002Fplaytests\u002Fpromoting-to-communities",{"title":383,"path":384,"stem":385,"order":38},"Reviewing outcomes","\u002Fdocs\u002Fplaytests\u002Freviewing-outcomes","docs\u002Fplaytests\u002Freviewing-outcomes",{"title":387,"path":388,"stem":389,"order":28},"Starting a playtest","\u002Fdocs\u002Fplaytests\u002Fstarting-a-playtest","docs\u002Fplaytests\u002Fstarting-a-playtest",{"title":391,"path":392,"stem":393,"order":23},"Surveys","\u002Fdocs\u002Fplaytests\u002Fsurveys","docs\u002Fplaytests\u002Fsurveys",{"title":395,"path":396,"stem":397,"children":398,"order":48},"Setting up a Table","\u002Fdocs\u002Fsetting-up-a-table","docs\u002Fsetting-up-a-table\u002Findex",[399,400,404,408,430],{"title":395,"path":396,"stem":397,"order":48},{"title":401,"path":402,"stem":403,"order":28},"Adding pieces to a table","\u002Fdocs\u002Fsetting-up-a-table\u002Fadding-pieces-to-a-table","docs\u002Fsetting-up-a-table\u002Fadding-pieces-to-a-table",{"title":405,"path":406,"stem":407,"order":48},"Building your first table layout","\u002Fdocs\u002Fsetting-up-a-table\u002Fbuilding-your-first-table-layout","docs\u002Fsetting-up-a-table\u002Fbuilding-your-first-table-layout",{"title":409,"path":410,"stem":411,"children":412,"order":38},"Importing Assets","\u002Fdocs\u002Fsetting-up-a-table\u002Fimporting-assets","docs\u002Fsetting-up-a-table\u002Fimporting-assets\u002Findex",[413,414,418,422,426],{"title":409,"path":410,"stem":411,"order":38},{"title":415,"path":416,"stem":417,"order":23},"Importing from Tabletop Simulator","\u002Fdocs\u002Fsetting-up-a-table\u002Fimporting-assets\u002Fimporting-from-tabletop-simulator","docs\u002Fsetting-up-a-table\u002Fimporting-assets\u002Fimporting-from-tabletop-simulator",{"title":419,"path":420,"stem":421,"order":28},"Importing from The Game Crafter","\u002Fdocs\u002Fsetting-up-a-table\u002Fimporting-assets\u002Fimporting-from-the-game-crafter","docs\u002Fsetting-up-a-table\u002Fimporting-assets\u002Fimporting-from-the-game-crafter",{"title":423,"path":424,"stem":425,"order":48},"Manual Uploads","\u002Fdocs\u002Fsetting-up-a-table\u002Fimporting-assets\u002Fimporting-with-manual-uploads","docs\u002Fsetting-up-a-table\u002Fimporting-assets\u002Fimporting-with-manual-uploads",{"title":427,"path":428,"stem":429,"order":38},"Playtest Parlor Archive","\u002Fdocs\u002Fsetting-up-a-table\u002Fimporting-assets\u002Fplaytest-parlor-archive","docs\u002Fsetting-up-a-table\u002Fimporting-assets\u002Fplaytest-parlor-archive",{"title":431,"path":432,"stem":433,"order":23},"Saving a table configuration","\u002Fdocs\u002Fsetting-up-a-table\u002Fsaving-a-table-configuration","docs\u002Fsetting-up-a-table\u002Fsaving-a-table-configuration",{"id":435,"title":30,"body":436,"description":1242,"extension":1243,"meta":1244,"navigation":1245,"path":31,"seo":1246,"stem":32,"__hash__":1247},"docs\u002Fdocs\u002Fapi\u002Fbooks.md",{"type":437,"value":438,"toc":1232},"minimark",[439,447,462,466,469,479,485,489,508,512,527,532,691,696,826,860,872,881,907,912,944,948,954,993,997,1019,1023,1030,1034,1037,1041,1228],[440,441,442,443,446],"p",{},"A book is a game component with an ordered list of pages and an optional cover image. On the table it renders as a 3D book players can read and turn page by page. See ",[444,445,82],"a",{"href":83}," for the player-facing behavior.",[440,448,449,450,452,453,457,458,461],{},"Books are created and updated through the ",[444,451,35],{"href":36}," using ",[454,455,456],"code",{},"kind: \"book\"",", the same game-scoped endpoints as every other component. Like all components, a pushed book lives in your app's import revision for the game: it shows up in the game's entity browser, game editors place it onto tables from there, and re-exporting updates it in place by ",[454,459,460],{},"externalKey"," without creating duplicates.",[463,464,25],"h2",{"id":465},"authentication",[440,467,468],{},"All requests must include an OAuth2 bearer token, the same as every other endpoint:",[470,471,476],"pre",{"className":472,"code":474,"language":475},[473],"language-text","Authorization: Bearer pp_your_token_here\n","text",[454,477,474],{"__ignoreMap":478},"",[440,480,481,482,484],{},"The token's user must have edit access to the game. See ",[444,483,25],{"href":26}," for the full flow.",[463,486,488],{"id":487},"page-keys","Page keys",[440,490,491,492,496,497,500,501,504,505,507],{},"Pages are supplied as ",[493,494,495],"strong",{},"R2 object keys"," (the ",[454,498,499],{},"key"," value from an Assets upload), not full URLs. Each key is validated and must resolve to an object under the configured asset host. A key that points anywhere else is rejected with ",[454,502,503],{},"VALIDATION_ERROR",". Upload page images first with the ",[444,506,20],{"href":21},", then pass their keys here.",[463,509,511],{"id":510},"create-or-update-a-book","Create or Update a Book",[440,513,514,515,518,519,522,523,526],{},"Push a book like any other component. The first key in ",[454,516,517],{},"pages"," is page 1 (shown when the book is closed, unless a separate ",[454,520,521],{},"cover"," is set). A book may have at most ",[493,524,525],{},"200 pages",".",[440,528,529],{},[493,530,531],{},"Request:",[470,533,537],{"className":534,"code":535,"language":536,"meta":478,"style":478},"language-bash shiki shiki-themes github-light github-dark","POST \u002Fapi\u002Fv1\u002Fgames\u002F:gameId\u002Fcomponents\nAuthorization: Bearer pp_your_token\nContent-Type: application\u002Fjson\n\n{\n  \"kind\": \"book\",\n  \"name\": \"Rulebook\",\n  \"externalKey\": \"rulebook\",\n  \"widthMm\": 148,\n  \"heightMm\": 210,\n  \"pages\": [\n    \"uploads\u002Fsh\u002Fsha256-page1...\",\n    \"uploads\u002Fsh\u002Fsha256-page2...\",\n    \"uploads\u002Fsh\u002Fsha256-page3...\"\n  ],\n  \"cover\": \"uploads\u002Fsh\u002Fsha256-cover...\"\n}\n","bash",[454,538,539,551,562,570,576,582,594,604,614,625,635,645,654,662,668,674,685],{"__ignoreMap":478},[540,541,543,547],"span",{"class":542,"line":28},"line",[540,544,546],{"class":545},"sScJk","POST",[540,548,550],{"class":549},"sZZnC"," \u002Fapi\u002Fv1\u002Fgames\u002F:gameId\u002Fcomponents\n",[540,552,553,556,559],{"class":542,"line":48},[540,554,555],{"class":545},"Authorization:",[540,557,558],{"class":549}," Bearer",[540,560,561],{"class":549}," pp_your_token\n",[540,563,564,567],{"class":542,"line":23},[540,565,566],{"class":545},"Content-Type:",[540,568,569],{"class":549}," application\u002Fjson\n",[540,571,572],{"class":542,"line":38},[540,573,575],{"emptyLinePlaceholder":574},true,"\n",[540,577,578],{"class":542,"line":43},[540,579,581],{"class":580},"sVt8B","{\n",[540,583,584,587,591],{"class":542,"line":33},[540,585,586],{"class":545},"  \"kind\"",[540,588,590],{"class":589},"sj4cs",":",[540,592,593],{"class":549}," \"book\",\n",[540,595,596,599,601],{"class":542,"line":18},[540,597,598],{"class":545},"  \"name\"",[540,600,590],{"class":589},[540,602,603],{"class":549}," \"Rulebook\",\n",[540,605,606,609,611],{"class":542,"line":355},[540,607,608],{"class":545},"  \"externalKey\"",[540,610,590],{"class":589},[540,612,613],{"class":549}," \"rulebook\",\n",[540,615,617,620,622],{"class":542,"line":616},9,[540,618,619],{"class":545},"  \"widthMm\"",[540,621,590],{"class":589},[540,623,624],{"class":549}," 148,\n",[540,626,627,630,632],{"class":542,"line":350},[540,628,629],{"class":545},"  \"heightMm\"",[540,631,590],{"class":589},[540,633,634],{"class":549}," 210,\n",[540,636,637,640,642],{"class":542,"line":329},[540,638,639],{"class":545},"  \"pages\"",[540,641,590],{"class":589},[540,643,644],{"class":580}," [\n",[540,646,648,651],{"class":542,"line":647},12,[540,649,650],{"class":545},"    \"uploads\u002Fsh\u002Fsha256-page1...\"",[540,652,653],{"class":545},",\n",[540,655,657,660],{"class":542,"line":656},13,[540,658,659],{"class":545},"    \"uploads\u002Fsh\u002Fsha256-page2...\"",[540,661,653],{"class":545},[540,663,665],{"class":542,"line":664},14,[540,666,667],{"class":545},"    \"uploads\u002Fsh\u002Fsha256-page3...\"\n",[540,669,671],{"class":542,"line":670},15,[540,672,673],{"class":580},"  ],\n",[540,675,677,680,682],{"class":542,"line":676},16,[540,678,679],{"class":545},"  \"cover\"",[540,681,590],{"class":589},[540,683,684],{"class":549}," \"uploads\u002Fsh\u002Fsha256-cover...\"\n",[540,686,688],{"class":542,"line":687},17,[540,689,690],{"class":580},"}\n",[440,692,693],{},[493,694,695],{},"Request Body:",[697,698,699,718],"table",{},[700,701,702],"thead",{},[703,704,705,709,712,715],"tr",{},[706,707,708],"th",{},"Field",[706,710,711],{},"Type",[706,713,714],{},"Required",[706,716,717],{},"Description",[719,720,721,741,755,768,783,797,812],"tbody",{},[703,722,723,729,732,735],{},[724,725,726],"td",{},[454,727,728],{},"kind",[724,730,731],{},"string",[724,733,734],{},"yes",[724,736,737,738],{},"Must be ",[454,739,740],{},"\"book\"",[703,742,743,748,750,752],{},[724,744,745],{},[454,746,747],{},"name",[724,749,731],{},[724,751,734],{},[724,753,754],{},"Display name (max 256 characters)",[703,756,757,761,763,765],{},[724,758,759],{},[454,760,460],{},[724,762,731],{},[724,764,734],{},[724,766,767],{},"Unique identifier for this book within the game, used for upsert deduplication",[703,769,770,774,777,780],{},[724,771,772],{},[454,773,517],{},[724,775,776],{},"array",[724,778,779],{},"yes on create",[724,781,782],{},"Non-empty array of R2 object keys in reading order (maximum 200). May be omitted on an update to leave the existing pages unchanged.",[703,784,785,789,791,794],{},[724,786,787],{},[454,788,521],{},[724,790,731],{},[724,792,793],{},"no",[724,795,796],{},"R2 object key for a dedicated cover image shown on the closed book. When omitted, page 1 acts as the cover.",[703,798,799,804,807,809],{},[724,800,801],{},[454,802,803],{},"widthMm",[724,805,806],{},"number",[724,808,793],{},[724,810,811],{},"Page width in millimeters (default 148, A5 portrait)",[703,813,814,819,821,823],{},[724,815,816],{},[454,817,818],{},"heightMm",[724,820,806],{},[724,822,793],{},[724,824,825],{},"Page height in millimeters (default 210, A5 portrait)",[440,827,828,829,832,833,832,836,832,839,832,842,832,845,832,848,851,852,854,855,857,858,526],{},"The component-asset fields (",[454,830,831],{},"assets",", ",[454,834,835],{},"parentExternalKey",[454,837,838],{},"sides",[454,840,841],{},"shape",[454,843,844],{},"count",[454,846,847],{},"payload",[454,849,850],{},"bleedMode",") do not apply to books and are rejected with ",[454,853,503],{},". A book's content is its ",[454,856,517],{}," and ",[454,859,521],{},[440,861,862,863,867,868,871],{},"Books also work in the ",[444,864,866],{"href":865},"\u002Fdocs\u002Fapi\u002Fcomponents#batch-create-or-update-components","batch endpoint",": include a book object in the ",[454,869,870],{},"components"," array alongside your other components.",[440,873,874,877,878],{},[493,875,876],{},"Response:"," ",[454,879,880],{},"201 Created",[470,882,886],{"className":883,"code":884,"language":885,"meta":478,"style":478},"language-json shiki shiki-themes github-light github-dark","{\n  \"id\": \"j57a...\"\n}\n","json",[454,887,888,892,903],{"__ignoreMap":478},[540,889,890],{"class":542,"line":28},[540,891,581],{"class":580},[540,893,894,897,900],{"class":542,"line":48},[540,895,896],{"class":589},"  \"id\"",[540,898,899],{"class":580},": ",[540,901,902],{"class":549},"\"j57a...\"\n",[540,904,905],{"class":542,"line":23},[540,906,690],{"class":580},[440,908,909],{},[493,910,911],{},"Errors:",[913,914,915,926,932,938],"ul",{},[916,917,918,899,920,922,923,925],"li",{},[454,919,503],{},[454,921,517],{}," is missing on create, empty, over the 200-page limit, or contains a key that does not resolve under the asset host; a disallowed field was supplied; or the ",[454,924,460],{}," is already used by a non-book component",[916,927,928,931],{},[454,929,930],{},"GAME_NOT_FOUND",": The game does not exist",[916,933,934,937],{},[454,935,936],{},"PERMISSION_DENIED",": You do not have permission to edit this game",[916,939,940,943],{},[454,941,942],{},"UNAUTHORIZED",": Your token is invalid or missing",[463,945,947],{"id":946},"update-semantics","Update semantics",[440,949,950,951,953],{},"Re-pushing the same ",[454,952,460],{}," updates the book in place:",[913,955,956,974],{},[916,957,958,963,964,966,967,970,971,973],{},[493,959,960,962],{},[454,961,517],{}," present",": the push is a full content snapshot. The page list is replaced wholesale, and the cover is set to ",[454,965,521],{}," or ",[493,968,969],{},"cleared"," when ",[454,972,521],{}," is omitted. Send the complete desired state each time, the same way you re-export other components.",[916,975,976,981,982,832,984,986,987,989,990,992],{},[493,977,978,980],{},[454,979,517],{}," omitted",": a metadata-only update. ",[454,983,747],{},[454,985,803],{},", and ",[454,988,818],{}," are updated; the existing pages are kept. If ",[454,991,521],{}," is provided, just the cover is updated.",[463,994,996],{"id":995},"reading-books-back","Reading books back",[440,998,999,1002,1003,1005,1006,1008,1009,832,1012,832,1015,1018],{},[454,1000,1001],{},"GET \u002Fapi\u002Fv1\u002Fgames\u002F:gameId\u002Fcomponents"," lists your app's components, and books come back with ",[454,1004,456],{},". The ordered page URLs, page count, and cover URL are in each book's ",[454,1007,847],{}," (",[454,1010,1011],{},"bookPageUrls",[454,1013,1014],{},"pageCount",[454,1016,1017],{},"bookCoverUrl",").",[463,1020,1022],{"id":1021},"placement-and-gameplay-state","Placement and gameplay state",[440,1024,1025,1026,1029],{},"Pushing a book puts it in the game's component library; it does not place it on a table. Game editors place books from the entity browser, the same as decks and tiles. The spread a placed book is currently turned to is ",[493,1027,1028],{},"gameplay state"," owned by the session: players turn pages at the table, and the position stays in sync for everyone. Re-pushing content does not touch books already placed on tables; place the updated book again to use the new content.",[463,1031,1033],{"id":1032},"units","Units",[440,1035,1036],{},"A book's page dimensions are stored in millimeters, the canonical storage format in Playtest Parlor, the same as every other piece.",[463,1038,1040],{"id":1039},"typical-workflow","Typical Workflow",[470,1042,1046],{"className":1043,"code":1044,"language":1045,"meta":478,"style":478},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F 1. Upload each page image via the Assets API (presign -> PUT -> upload-complete).\n\u002F\u002F    Keep the returned `key` for each page.\n\n\u002F\u002F 2. Push the book component from the ordered page keys.\nconst createRes = await fetch(\n  `https:\u002F\u002Fplaytestparlor.com\u002Fapi\u002Fv1\u002Fgames\u002F${gameId}\u002Fcomponents`,\n  {\n    method: \"POST\",\n    headers: { \"Authorization\": `Bearer ${token}`, \"Content-Type\": \"application\u002Fjson\" },\n    body: JSON.stringify({\n      kind: \"book\",\n      name: \"Rulebook\",\n      externalKey: \"rulebook\",\n      pages: pageKeys,\n      cover: coverKey\n    })\n  }\n);\nconst { id: componentId } = await createRes.json();\n\n\u002F\u002F 3. Later, re-export the full desired state to update it in place.\nawait fetch(\n  `https:\u002F\u002Fplaytestparlor.com\u002Fapi\u002Fv1\u002Fgames\u002F${gameId}\u002Fcomponents`,\n  {\n    method: \"POST\",\n    headers: { \"Authorization\": `Bearer ${token}`, \"Content-Type\": \"application\u002Fjson\" },\n    body: JSON.stringify({\n      kind: \"book\",\n      name: \"Rulebook\",\n      externalKey: \"rulebook\",\n      pages: [...pageKeys, newPageKey],\n      cover: newCoverKey\n    })\n  }\n);\n","javascript",[454,1047,1048,1053,1058,1062,1067,1072,1077,1082,1087,1092,1097,1102,1107,1112,1117,1122,1127,1132,1138,1144,1149,1155,1161,1166,1171,1176,1181,1186,1191,1196,1201,1207,1213,1218,1223],{"__ignoreMap":478},[540,1049,1050],{"class":542,"line":28},[540,1051,1052],{},"\u002F\u002F 1. Upload each page image via the Assets API (presign -> PUT -> upload-complete).\n",[540,1054,1055],{"class":542,"line":48},[540,1056,1057],{},"\u002F\u002F    Keep the returned `key` for each page.\n",[540,1059,1060],{"class":542,"line":23},[540,1061,575],{"emptyLinePlaceholder":574},[540,1063,1064],{"class":542,"line":38},[540,1065,1066],{},"\u002F\u002F 2. Push the book component from the ordered page keys.\n",[540,1068,1069],{"class":542,"line":43},[540,1070,1071],{},"const createRes = await fetch(\n",[540,1073,1074],{"class":542,"line":33},[540,1075,1076],{},"  `https:\u002F\u002Fplaytestparlor.com\u002Fapi\u002Fv1\u002Fgames\u002F${gameId}\u002Fcomponents`,\n",[540,1078,1079],{"class":542,"line":18},[540,1080,1081],{},"  {\n",[540,1083,1084],{"class":542,"line":355},[540,1085,1086],{},"    method: \"POST\",\n",[540,1088,1089],{"class":542,"line":616},[540,1090,1091],{},"    headers: { \"Authorization\": `Bearer ${token}`, \"Content-Type\": \"application\u002Fjson\" },\n",[540,1093,1094],{"class":542,"line":350},[540,1095,1096],{},"    body: JSON.stringify({\n",[540,1098,1099],{"class":542,"line":329},[540,1100,1101],{},"      kind: \"book\",\n",[540,1103,1104],{"class":542,"line":647},[540,1105,1106],{},"      name: \"Rulebook\",\n",[540,1108,1109],{"class":542,"line":656},[540,1110,1111],{},"      externalKey: \"rulebook\",\n",[540,1113,1114],{"class":542,"line":664},[540,1115,1116],{},"      pages: pageKeys,\n",[540,1118,1119],{"class":542,"line":670},[540,1120,1121],{},"      cover: coverKey\n",[540,1123,1124],{"class":542,"line":676},[540,1125,1126],{},"    })\n",[540,1128,1129],{"class":542,"line":687},[540,1130,1131],{},"  }\n",[540,1133,1135],{"class":542,"line":1134},18,[540,1136,1137],{},");\n",[540,1139,1141],{"class":542,"line":1140},19,[540,1142,1143],{},"const { id: componentId } = await createRes.json();\n",[540,1145,1147],{"class":542,"line":1146},20,[540,1148,575],{"emptyLinePlaceholder":574},[540,1150,1152],{"class":542,"line":1151},21,[540,1153,1154],{},"\u002F\u002F 3. Later, re-export the full desired state to update it in place.\n",[540,1156,1158],{"class":542,"line":1157},22,[540,1159,1160],{},"await fetch(\n",[540,1162,1164],{"class":542,"line":1163},23,[540,1165,1076],{},[540,1167,1169],{"class":542,"line":1168},24,[540,1170,1081],{},[540,1172,1174],{"class":542,"line":1173},25,[540,1175,1086],{},[540,1177,1179],{"class":542,"line":1178},26,[540,1180,1091],{},[540,1182,1184],{"class":542,"line":1183},27,[540,1185,1096],{},[540,1187,1189],{"class":542,"line":1188},28,[540,1190,1101],{},[540,1192,1194],{"class":542,"line":1193},29,[540,1195,1106],{},[540,1197,1199],{"class":542,"line":1198},30,[540,1200,1111],{},[540,1202,1204],{"class":542,"line":1203},31,[540,1205,1206],{},"      pages: [...pageKeys, newPageKey],\n",[540,1208,1210],{"class":542,"line":1209},32,[540,1211,1212],{},"      cover: newCoverKey\n",[540,1214,1216],{"class":542,"line":1215},33,[540,1217,1126],{},[540,1219,1221],{"class":542,"line":1220},34,[540,1222,1131],{},[540,1224,1226],{"class":542,"line":1225},35,[540,1227,1137],{},[1229,1230,1231],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":478,"searchDepth":48,"depth":48,"links":1233},[1234,1235,1236,1237,1238,1239,1240,1241],{"id":465,"depth":48,"text":25},{"id":487,"depth":48,"text":488},{"id":510,"depth":48,"text":511},{"id":946,"depth":48,"text":947},{"id":995,"depth":48,"text":996},{"id":1021,"depth":48,"text":1022},{"id":1032,"depth":48,"text":1033},{"id":1039,"depth":48,"text":1040},"Create and update book components with ordered pages and an optional cover through the Components API in Playtest Parlor.","md",{},{"order":33},{"title":30,"description":1242},"kH1gRkskKdpQkDLwjn8E0ith_-p57diMf6eOqfgcbSw",1783397109164]