[{"data":1,"prerenderedAt":3365},["ShallowReactive",2],{"docs-navigation":3,"docs-page:\u002Fdocs\u002Fapi\u002Fcomponents":401},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,12,44,64,254,300,349,375],{"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],{"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},"Components API","\u002Fdocs\u002Fapi\u002Fcomponents","docs\u002Fapi\u002Fcomponents",4,{"title":35,"path":36,"stem":37,"order":38},"Error Handling","\u002Fdocs\u002Fapi\u002Ferrors","docs\u002Fapi\u002Ferrors",5,{"title":40,"path":41,"stem":42,"order":43},"Games API","\u002Fdocs\u002Fapi\u002Fgames","docs\u002Fapi\u002Fgames",2,{"title":45,"path":46,"stem":47,"children":48,"order":38},"Automation","\u002Fdocs\u002Fautomation","docs\u002Fautomation\u002Findex",[49,50,60],{"title":45,"path":46,"stem":47,"order":38},{"title":51,"path":52,"stem":53,"children":54,"order":43},"Sequences","\u002Fdocs\u002Fautomation\u002Fsequences","docs\u002Fautomation\u002Fsequences\u002Findex",[55,56],{"title":51,"path":52,"stem":53,"order":43},{"title":57,"path":58,"stem":59},"Steps","\u002Fdocs\u002Fautomation\u002Fsequences\u002Fsteps","docs\u002Fautomation\u002Fsequences\u002Fsteps",{"title":61,"path":62,"stem":63,"order":28},"Triggers","\u002Fdocs\u002Fautomation\u002Ftriggers","docs\u002Fautomation\u002Ftriggers",{"title":65,"path":66,"stem":67,"children":68,"order":33},"Entities","\u002Fdocs\u002Fentities","docs\u002Fentities\u002Findex",[69,70,160,202],{"title":65,"path":66,"stem":67,"order":33},{"title":71,"path":72,"stem":73,"children":74},"Pieces","\u002Fdocs\u002Fentities\u002Fpieces","docs\u002Fentities\u002F01.pieces\u002Findex",[75,76,90,104,138],{"title":71,"path":72,"stem":73},{"title":77,"path":78,"stem":79,"children":80},"Dice","\u002Fdocs\u002Fentities\u002Fpieces\u002Fdice","docs\u002Fentities\u002F01.pieces\u002Fdice\u002Findex",[81,82,86],{"title":77,"path":78,"stem":79},{"title":83,"path":84,"stem":85},"Polyhedral Die","\u002Fdocs\u002Fentities\u002Fpieces\u002Fdice\u002Fpolyhedral-die","docs\u002Fentities\u002F01.pieces\u002Fdice\u002Fpolyhedral-die",{"title":87,"path":88,"stem":89},"Spinner","\u002Fdocs\u002Fentities\u002Fpieces\u002Fdice\u002Fspinner","docs\u002Fentities\u002F01.pieces\u002Fdice\u002Fspinner",{"title":91,"path":92,"stem":93,"children":94},"Tiles and Stacks","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftiles-and-stacks","docs\u002Fentities\u002F01.pieces\u002Ftiles-and-stacks\u002Findex",[95,96,100],{"title":91,"path":92,"stem":93},{"title":97,"path":98,"stem":99},"Stack","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftiles-and-stacks\u002Fstack","docs\u002Fentities\u002F01.pieces\u002Ftiles-and-stacks\u002Fstack",{"title":101,"path":102,"stem":103},"Tile","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftiles-and-stacks\u002Ftile","docs\u002Fentities\u002F01.pieces\u002Ftiles-and-stacks\u002Ftile",{"title":105,"path":106,"stem":107,"children":108},"Tokens","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftokens","docs\u002Fentities\u002F01.pieces\u002Ftokens\u002Findex",[109,110,114,118,122,126,130,134],{"title":105,"path":106,"stem":107},{"title":111,"path":112,"stem":113},"Block","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftokens\u002Fblock","docs\u002Fentities\u002F01.pieces\u002Ftokens\u002Fblock",{"title":115,"path":116,"stem":117},"Disc","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftokens\u002Fdisc","docs\u002Fentities\u002F01.pieces\u002Ftokens\u002Fdisc",{"title":119,"path":120,"stem":121},"Image Token","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftokens\u002Fimage-token","docs\u002Fentities\u002F01.pieces\u002Ftokens\u002Fimage-token",{"title":123,"path":124,"stem":125},"Model Token","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftokens\u002Fmodel-token","docs\u002Fentities\u002F01.pieces\u002Ftokens\u002Fmodel-token",{"title":127,"path":128,"stem":129},"Pawn","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftokens\u002Fpawn","docs\u002Fentities\u002F01.pieces\u002Ftokens\u002Fpawn",{"title":131,"path":132,"stem":133},"Pyramid","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftokens\u002Fpyramid","docs\u002Fentities\u002F01.pieces\u002Ftokens\u002Fpyramid",{"title":135,"path":136,"stem":137},"Ring","\u002Fdocs\u002Fentities\u002Fpieces\u002Ftokens\u002Fring","docs\u002Fentities\u002F01.pieces\u002Ftokens\u002Fring",{"title":139,"path":140,"stem":141,"children":142},"Utility Pieces","\u002Fdocs\u002Fentities\u002Fpieces\u002Futility-pieces","docs\u002Fentities\u002F01.pieces\u002Futility-pieces\u002Findex",[143,144,148,152,156],{"title":139,"path":140,"stem":141},{"title":145,"path":146,"stem":147},"Bag","\u002Fdocs\u002Fentities\u002Fpieces\u002Futility-pieces\u002Fbag","docs\u002Fentities\u002F01.pieces\u002Futility-pieces\u002Fbag",{"title":149,"path":150,"stem":151},"Counter","\u002Fdocs\u002Fentities\u002Fpieces\u002Futility-pieces\u002Fcounter","docs\u002Fentities\u002F01.pieces\u002Futility-pieces\u002Fcounter",{"title":153,"path":154,"stem":155},"Timer","\u002Fdocs\u002Fentities\u002Fpieces\u002Futility-pieces\u002Ftimer","docs\u002Fentities\u002F01.pieces\u002Futility-pieces\u002Ftimer",{"title":157,"path":158,"stem":159},"Token Bowl","\u002Fdocs\u002Fentities\u002Fpieces\u002Futility-pieces\u002Ftoken-bowl","docs\u002Fentities\u002F01.pieces\u002Futility-pieces\u002Ftoken-bowl",{"title":161,"path":162,"stem":163,"children":164},"Spaces","\u002Fdocs\u002Fentities\u002Fspaces","docs\u002Fentities\u002F02.spaces\u002Findex",[165,166,180],{"title":161,"path":162,"stem":163},{"title":167,"path":168,"stem":169,"children":170},"Layouts","\u002Fdocs\u002Fentities\u002Fspaces\u002Flayouts","docs\u002Fentities\u002F02.spaces\u002Flayouts\u002Findex",[171,172,176],{"title":167,"path":168,"stem":169},{"title":173,"path":174,"stem":175},"Hex Grid","\u002Fdocs\u002Fentities\u002Fspaces\u002Flayouts\u002Fhex-grid","docs\u002Fentities\u002F02.spaces\u002Flayouts\u002Fhex-grid",{"title":177,"path":178,"stem":179},"Square Grid","\u002Fdocs\u002Fentities\u002Fspaces\u002Flayouts\u002Fsquare-grid","docs\u002Fentities\u002F02.spaces\u002Flayouts\u002Fsquare-grid",{"title":181,"path":182,"stem":183,"children":184},"Placement Spaces","\u002Fdocs\u002Fentities\u002Fspaces\u002Fplacement-spaces","docs\u002Fentities\u002F02.spaces\u002Fplacement-spaces\u002Findex",[185,186,190,194,198],{"title":181,"path":182,"stem":183},{"title":187,"path":188,"stem":189},"Box Space","\u002Fdocs\u002Fentities\u002Fspaces\u002Fplacement-spaces\u002Fbox-space","docs\u002Fentities\u002F02.spaces\u002Fplacement-spaces\u002Fbox-space",{"title":191,"path":192,"stem":193},"Hex Space","\u002Fdocs\u002Fentities\u002Fspaces\u002Fplacement-spaces\u002Fhex-space","docs\u002Fentities\u002F02.spaces\u002Fplacement-spaces\u002Fhex-space",{"title":195,"path":196,"stem":197},"Orb Space","\u002Fdocs\u002Fentities\u002Fspaces\u002Fplacement-spaces\u002Forb-space","docs\u002Fentities\u002F02.spaces\u002Fplacement-spaces\u002Forb-space",{"title":199,"path":200,"stem":201},"Point Space","\u002Fdocs\u002Fentities\u002Fspaces\u002Fplacement-spaces\u002Fpoint-space","docs\u002Fentities\u002F02.spaces\u002Fplacement-spaces\u002Fpoint-space",{"title":203,"path":204,"stem":205,"children":206},"Annotations","\u002Fdocs\u002Fentities\u002Fannotations","docs\u002Fentities\u002F03.annotations\u002Findex",[207,208,218,244],{"title":203,"path":204,"stem":205},{"title":209,"path":210,"stem":211,"children":212},"Freehand Annotations","\u002Fdocs\u002Fentities\u002Fannotations\u002Ffreehand-annotations","docs\u002Fentities\u002F03.annotations\u002Ffreehand-annotations\u002Findex",[213,214],{"title":209,"path":210,"stem":211},{"title":215,"path":216,"stem":217},"Freehand Annotation","\u002Fdocs\u002Fentities\u002Fannotations\u002Ffreehand-annotations\u002Ffreehand-annotation","docs\u002Fentities\u002F03.annotations\u002Ffreehand-annotations\u002Ffreehand-annotation",{"title":219,"path":220,"stem":221,"children":222},"Shape Annotations","\u002Fdocs\u002Fentities\u002Fannotations\u002Fshape-annotations","docs\u002Fentities\u002F03.annotations\u002Fshape-annotations\u002Findex",[223,224,228,232,236,240],{"title":219,"path":220,"stem":221},{"title":225,"path":226,"stem":227},"Arrow Annotation","\u002Fdocs\u002Fentities\u002Fannotations\u002Fshape-annotations\u002Farrow-annotation","docs\u002Fentities\u002F03.annotations\u002Fshape-annotations\u002Farrow-annotation",{"title":229,"path":230,"stem":231},"Box Annotation","\u002Fdocs\u002Fentities\u002Fannotations\u002Fshape-annotations\u002Fbox-annotation","docs\u002Fentities\u002F03.annotations\u002Fshape-annotations\u002Fbox-annotation",{"title":233,"path":234,"stem":235},"Hex Annotation","\u002Fdocs\u002Fentities\u002Fannotations\u002Fshape-annotations\u002Fhex-annotation","docs\u002Fentities\u002F03.annotations\u002Fshape-annotations\u002Fhex-annotation",{"title":237,"path":238,"stem":239},"Orb Annotation","\u002Fdocs\u002Fentities\u002Fannotations\u002Fshape-annotations\u002Forb-annotation","docs\u002Fentities\u002F03.annotations\u002Fshape-annotations\u002Forb-annotation",{"title":241,"path":242,"stem":243},"Triangle Annotation","\u002Fdocs\u002Fentities\u002Fannotations\u002Fshape-annotations\u002Ftriangle-annotation","docs\u002Fentities\u002F03.annotations\u002Fshape-annotations\u002Ftriangle-annotation",{"title":245,"path":246,"stem":247,"children":248},"Text Annotations","\u002Fdocs\u002Fentities\u002Fannotations\u002Ftext-annotations","docs\u002Fentities\u002F03.annotations\u002Ftext-annotations\u002Findex",[249,250],{"title":245,"path":246,"stem":247},{"title":251,"path":252,"stem":253},"Text Annotation","\u002Fdocs\u002Fentities\u002Fannotations\u002Ftext-annotations\u002Ftext-annotation","docs\u002Fentities\u002F03.annotations\u002Ftext-annotations\u002Ftext-annotation",{"title":255,"path":256,"stem":257,"children":258,"order":28},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002Fgetting-started\u002Findex",[259,260,264,268,296],{"title":255,"path":256,"stem":257,"order":28},{"title":261,"path":262,"stem":263,"order":43},"Tutorial 2: Build a Deck of Cards","\u002Fdocs\u002Fgetting-started\u002Fbuild-a-deck-of-cards","docs\u002Fgetting-started\u002Fbuild-a-deck-of-cards",{"title":265,"path":266,"stem":267,"order":23},"Tutorial 3: Use Your Own Images","\u002Fdocs\u002Fgetting-started\u002Fcustom-images","docs\u002Fgetting-started\u002Fcustom-images",{"title":269,"path":270,"stem":271,"children":272,"order":274},"Why Playtest Parlor?","\u002Fdocs\u002Fgetting-started\u002Fwhy-playtest-parlor","docs\u002Fgetting-started\u002Fwhy-playtest-parlor\u002Findex",[273,275,279,283,287,291],{"title":269,"path":270,"stem":271,"order":274},-2,{"title":276,"path":277,"stem":278,"order":33},"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":280,"path":281,"stem":282,"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":284,"path":285,"stem":286,"order":43},"Compared to Screentop.gg","\u002Fdocs\u002Fgetting-started\u002Fwhy-playtest-parlor\u002Fcompared-to-screentop","docs\u002Fgetting-started\u002Fwhy-playtest-parlor\u002Fcompared-to-screentop",{"title":288,"path":289,"stem":290,"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":292,"path":293,"stem":294,"order":295},"Platform Comparison","\u002Fdocs\u002Fgetting-started\u002Fwhy-playtest-parlor\u002Fcomparison-matrix","docs\u002Fgetting-started\u002Fwhy-playtest-parlor\u002Fcomparison-matrix",0,{"title":297,"path":298,"stem":299,"order":28},"Tutorial 1: Your First Game","\u002Fdocs\u002Fgetting-started\u002Fyour-first-game","docs\u002Fgetting-started\u002Fyour-first-game",{"title":301,"path":302,"stem":303,"children":304,"order":43},"Interface","\u002Fdocs\u002Finterface","docs\u002Finterface\u002Findex",[305,306,310,315,319,323,328,332,336,341,345],{"title":301,"path":302,"stem":303,"order":43},{"title":307,"path":308,"stem":309,"order":33},"The Action Dock","\u002Fdocs\u002Finterface\u002Faction-dock","docs\u002Finterface\u002Faction-dock",{"title":311,"path":312,"stem":313,"order":314},"Finding Your Discord User ID","\u002Fdocs\u002Finterface\u002Fdiscord-id","docs\u002Finterface\u002Fdiscord-id",10,{"title":316,"path":317,"stem":318,"order":18},"The Entity Browser","\u002Fdocs\u002Finterface\u002Fentity-browser","docs\u002Finterface\u002Fentity-browser",{"title":320,"path":321,"stem":322,"order":38},"The Minimap","\u002Fdocs\u002Finterface\u002Fminimap","docs\u002Finterface\u002Fminimap",{"title":324,"path":325,"stem":326,"order":327},"The Player Hand","\u002Fdocs\u002Finterface\u002Fplayer-hand","docs\u002Finterface\u002Fplayer-hand",6,{"title":329,"path":330,"stem":331,"order":23},"The Players Panel","\u002Fdocs\u002Finterface\u002Fplayers-panel","docs\u002Finterface\u002Fplayers-panel",{"title":333,"path":334,"stem":335},"Sequences Panel","\u002Fdocs\u002Finterface\u002Fsequences-panel","docs\u002Finterface\u002Fsequences-panel",{"title":337,"path":338,"stem":339,"order":340},"Session Notebook","\u002Fdocs\u002Finterface\u002Fsession-notebook","docs\u002Finterface\u002Fsession-notebook",8,{"title":342,"path":343,"stem":344,"order":28},"The Table","\u002Fdocs\u002Finterface\u002Ftable","docs\u002Finterface\u002Ftable",{"title":346,"path":347,"stem":348,"order":43},"The Toolbar","\u002Fdocs\u002Finterface\u002Ftoolbar","docs\u002Finterface\u002Ftoolbar",{"title":350,"path":351,"stem":352,"children":353,"order":23},"Playtests","\u002Fdocs\u002Fplaytests","docs\u002Fplaytests\u002Findex",[354,355,359,363,367,371],{"title":350,"path":351,"stem":352,"order":23},{"title":356,"path":357,"stem":358,"order":43},"Inviting players","\u002Fdocs\u002Fplaytests\u002Finviting-players","docs\u002Fplaytests\u002Finviting-players",{"title":360,"path":361,"stem":362,"order":38},"Player count guidelines","\u002Fdocs\u002Fplaytests\u002Fplayer-count-guidelines","docs\u002Fplaytests\u002Fplayer-count-guidelines",{"title":364,"path":365,"stem":366,"order":33},"Reviewing outcomes","\u002Fdocs\u002Fplaytests\u002Freviewing-outcomes","docs\u002Fplaytests\u002Freviewing-outcomes",{"title":368,"path":369,"stem":370,"order":28},"Starting a playtest","\u002Fdocs\u002Fplaytests\u002Fstarting-a-playtest","docs\u002Fplaytests\u002Fstarting-a-playtest",{"title":372,"path":373,"stem":374,"order":23},"Surveys","\u002Fdocs\u002Fplaytests\u002Fsurveys","docs\u002Fplaytests\u002Fsurveys",{"title":376,"path":377,"stem":378,"children":379,"order":43},"Setting up a Table","\u002Fdocs\u002Fsetting-up-a-table","docs\u002Fsetting-up-a-table\u002Findex",[380,381,385,389,393,397],{"title":376,"path":377,"stem":378,"order":43},{"title":382,"path":383,"stem":384,"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":386,"path":387,"stem":388,"order":43},"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":390,"path":391,"stem":392,"order":33},"Importing from The Game Crafter","\u002Fdocs\u002Fsetting-up-a-table\u002Fimporting-from-the-game-crafter","docs\u002Fsetting-up-a-table\u002Fimporting-from-the-game-crafter",{"title":394,"path":395,"stem":396,"order":38},"Importing with manual uploads","\u002Fdocs\u002Fsetting-up-a-table\u002Fimporting-with-manual-uploads","docs\u002Fsetting-up-a-table\u002Fimporting-with-manual-uploads",{"title":398,"path":399,"stem":400,"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":402,"title":30,"body":403,"description":3359,"extension":3360,"meta":3361,"navigation":3362,"path":31,"seo":3363,"stem":32,"__hash__":3364},"docs\u002Fdocs\u002Fapi\u002Fcomponents.md",{"type":404,"value":405,"toc":3341},"minimark",[406,410,427,432,435,560,564,571,637,650,654,666,671,976,981,1114,1119,1128,1284,1287,1292,1318,1323,1351,1355,1358,1362,1799,1803,1833,1836,1840,1907,1911,1931,1935,1938,1942,1962,1966,2244,2249,2368,2372,2382,2386,2389,2393,2414,2422,2426,2448,2452,2455,2459,2478,2482,2505,2509,2535,2539,2549,2553,2556,2560,2563,3112,3116,3119,3123,3126,3178,3182,3185,3317,3321,3329,3337],[407,408,409],"p",{},"The Components API lets you create, update, list, and delete game pieces. Components are the building blocks of your game - tiles, stacks (decks), tokens, boards, and more.",[407,411,412,413,417,418,422,423,426],{},"All component creation uses ",[414,415,416],"strong",{},"upsert semantics",": if a component with the same ",[419,420,421],"code",{},"kind"," and ",[419,424,425],{},"externalKey"," already exists, it is updated in place. This means re-exporting is always safe -- you never create duplicates, and existing components retain their identity across updates so they keep their positions on tables.",[428,429,431],"h2",{"id":430},"component-kinds","Component Kinds",[407,433,434],{},"Playtest Parlor supports these component kinds:",[436,437,438,451],"table",{},[439,440,441],"thead",{},[442,443,444,448],"tr",{},[445,446,447],"th",{},"Kind",[445,449,450],{},"Description",[452,453,454,465,480,490,500,510,520,530,540,550],"tbody",{},[442,455,456,462],{},[457,458,459],"td",{},[419,460,461],{},"tile",[457,463,464],{},"A single game piece (card, token, etc.)",[442,466,467,477],{},[457,468,469,472,473,476],{},[419,470,471],{},"deck"," (alias: ",[419,474,475],{},"stack",")",[457,478,479],{},"A collection of tiles, typically for drawing",[442,481,482,487],{},[457,483,484],{},[419,485,486],{},"board",[457,488,489],{},"A play surface with positions and zones",[442,491,492,497],{},[457,493,494],{},[419,495,496],{},"tokenSprite",[457,498,499],{},"A visual representation for player pieces",[442,501,502,507],{},[457,503,504],{},[419,505,506],{},"tokenModel",[457,508,509],{},"A 3D or complex token definition",[442,511,512,517],{},[457,513,514],{},[419,515,516],{},"die",[457,518,519],{},"A die with numbered faces",[442,521,522,527],{},[457,523,524],{},[419,525,526],{},"dieFace",[457,528,529],{},"A single face of a die",[442,531,532,537],{},[457,533,534],{},[419,535,536],{},"container",[457,538,539],{},"A holding area for game pieces",[442,541,542,547],{},[457,543,544],{},[419,545,546],{},"counter",[457,548,549],{},"A numerical tracker",[442,551,552,557],{},[457,553,554],{},[419,555,556],{},"bundle",[457,558,559],{},"A group of related components",[428,561,563],{"id":562},"parent-child-relationships","Parent-Child Relationships",[407,565,566,567,570],{},"Components can be nested using ",[419,568,569],{},"parentExternalKey",". Only certain kinds are allowed as children:",[436,572,573,586],{},[439,574,575],{},[442,576,577,580,583],{},[445,578,579],{},"Parent Kind",[445,581,582],{},"Valid Child Kinds",[445,584,585],{},"Notes",[452,587,588,611,624],{},[442,589,590,594,602],{},[457,591,592],{},[419,593,471],{},[457,595,596,599,600],{},[419,597,598],{},"card",", ",[419,601,461],{},[457,603,604,605,607,608,610],{},"Both are treated as deck cards. ",[419,606,461],{}," is accepted as a synonym for ",[419,609,598],{}," when nested under a deck.",[442,612,613,617,621],{},[457,614,615],{},[419,616,556],{},[457,618,619],{},[419,620,461],{},[457,622,623],{},"Tiles grouped into a two-sided set.",[442,625,626,630,634],{},[457,627,628],{},[419,629,516],{},[457,631,632],{},[419,633,526],{},[457,635,636],{},"Individual faces of a die.",[407,638,639,640,642,643,599,645,599,647,649],{},"Providing ",[419,641,569],{}," on any other kind (e.g., ",[419,644,471],{},[419,646,486],{},[419,648,496],{},") will return a validation error.",[428,651,653],{"id":652},"create-or-update-single-component","Create or Update Single Component",[407,655,656,657,422,659,661,662,665],{},"Create or update one component at a time. If a component with the same ",[419,658,421],{},[419,660,425],{}," already exists, it is updated in place. Assets are upserted by ",[419,663,664],{},"sideKey"," -- uploading a new image for the same side replaces the previous one.",[407,667,668],{},[414,669,670],{},"Request:",[672,673,678],"pre",{"className":674,"code":675,"language":676,"meta":677,"style":677},"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\": \"tile\",\n  \"name\": \"Fighter Card\",\n  \"externalKey\": \"fighter-card\",\n  \"count\": 12,\n  \"widthMm\": 88.9,\n  \"heightMm\": 127,\n  \"assets\": [\n    {\n      \"sideKey\": \"front\",\n      \"key\": \"uploads\u002Ffighter-front.png\",\n      \"sourceUrl\": \"https:\u002F\u002Fassets.playtestparlor.com\u002Fuploads\u002Ffighter-front.png\",\n      \"contentType\": \"image\u002Fpng\",\n      \"widthPx\": 750,\n      \"heightPx\": 1050,\n      \"sourcePixelsPerInch\": 300\n    },\n    {\n      \"sideKey\": \"back\",\n      \"key\": \"uploads\u002Ffighter-back.png\",\n      \"sourceUrl\": \"https:\u002F\u002Fassets.playtestparlor.com\u002Fuploads\u002Ffighter-back.png\",\n      \"contentType\": \"image\u002Fpng\",\n      \"widthPx\": 750,\n      \"heightPx\": 1050,\n      \"sourcePixelsPerInch\": 300\n    }\n  ]\n}\n","bash","",[419,679,680,692,703,711,717,723,735,745,755,766,776,787,798,804,815,826,837,848,859,870,881,887,892,902,912,922,931,940,949,958,964,970],{"__ignoreMap":677},[681,682,684,688],"span",{"class":683,"line":28},"line",[681,685,687],{"class":686},"sScJk","POST",[681,689,691],{"class":690},"sZZnC"," \u002Fapi\u002Fv1\u002Fgames\u002F:gameId\u002Fcomponents\n",[681,693,694,697,700],{"class":683,"line":43},[681,695,696],{"class":686},"Authorization:",[681,698,699],{"class":690}," Bearer",[681,701,702],{"class":690}," pp_your_token\n",[681,704,705,708],{"class":683,"line":23},[681,706,707],{"class":686},"Content-Type:",[681,709,710],{"class":690}," application\u002Fjson\n",[681,712,713],{"class":683,"line":33},[681,714,716],{"emptyLinePlaceholder":715},true,"\n",[681,718,719],{"class":683,"line":38},[681,720,722],{"class":721},"sVt8B","{\n",[681,724,725,728,732],{"class":683,"line":327},[681,726,727],{"class":686},"  \"kind\"",[681,729,731],{"class":730},"sj4cs",":",[681,733,734],{"class":690}," \"tile\",\n",[681,736,737,740,742],{"class":683,"line":18},[681,738,739],{"class":686},"  \"name\"",[681,741,731],{"class":730},[681,743,744],{"class":690}," \"Fighter Card\",\n",[681,746,747,750,752],{"class":683,"line":340},[681,748,749],{"class":686},"  \"externalKey\"",[681,751,731],{"class":730},[681,753,754],{"class":690}," \"fighter-card\",\n",[681,756,758,761,763],{"class":683,"line":757},9,[681,759,760],{"class":686},"  \"count\"",[681,762,731],{"class":730},[681,764,765],{"class":690}," 12,\n",[681,767,768,771,773],{"class":683,"line":314},[681,769,770],{"class":686},"  \"widthMm\"",[681,772,731],{"class":730},[681,774,775],{"class":690}," 88.9,\n",[681,777,779,782,784],{"class":683,"line":778},11,[681,780,781],{"class":686},"  \"heightMm\"",[681,783,731],{"class":730},[681,785,786],{"class":690}," 127,\n",[681,788,790,793,795],{"class":683,"line":789},12,[681,791,792],{"class":686},"  \"assets\"",[681,794,731],{"class":730},[681,796,797],{"class":721}," [\n",[681,799,801],{"class":683,"line":800},13,[681,802,803],{"class":721},"    {\n",[681,805,807,810,812],{"class":683,"line":806},14,[681,808,809],{"class":686},"      \"sideKey\"",[681,811,731],{"class":730},[681,813,814],{"class":690}," \"front\",\n",[681,816,818,821,823],{"class":683,"line":817},15,[681,819,820],{"class":686},"      \"key\"",[681,822,731],{"class":730},[681,824,825],{"class":690}," \"uploads\u002Ffighter-front.png\",\n",[681,827,829,832,834],{"class":683,"line":828},16,[681,830,831],{"class":686},"      \"sourceUrl\"",[681,833,731],{"class":730},[681,835,836],{"class":690}," \"https:\u002F\u002Fassets.playtestparlor.com\u002Fuploads\u002Ffighter-front.png\",\n",[681,838,840,843,845],{"class":683,"line":839},17,[681,841,842],{"class":686},"      \"contentType\"",[681,844,731],{"class":730},[681,846,847],{"class":690}," \"image\u002Fpng\",\n",[681,849,851,854,856],{"class":683,"line":850},18,[681,852,853],{"class":686},"      \"widthPx\"",[681,855,731],{"class":730},[681,857,858],{"class":690}," 750,\n",[681,860,862,865,867],{"class":683,"line":861},19,[681,863,864],{"class":686},"      \"heightPx\"",[681,866,731],{"class":730},[681,868,869],{"class":690}," 1050,\n",[681,871,873,876,878],{"class":683,"line":872},20,[681,874,875],{"class":686},"      \"sourcePixelsPerInch\"",[681,877,731],{"class":730},[681,879,880],{"class":730}," 300\n",[681,882,884],{"class":683,"line":883},21,[681,885,886],{"class":721},"    },\n",[681,888,890],{"class":683,"line":889},22,[681,891,803],{"class":721},[681,893,895,897,899],{"class":683,"line":894},23,[681,896,809],{"class":686},[681,898,731],{"class":730},[681,900,901],{"class":690}," \"back\",\n",[681,903,905,907,909],{"class":683,"line":904},24,[681,906,820],{"class":686},[681,908,731],{"class":730},[681,910,911],{"class":690}," \"uploads\u002Ffighter-back.png\",\n",[681,913,915,917,919],{"class":683,"line":914},25,[681,916,831],{"class":686},[681,918,731],{"class":730},[681,920,921],{"class":690}," \"https:\u002F\u002Fassets.playtestparlor.com\u002Fuploads\u002Ffighter-back.png\",\n",[681,923,925,927,929],{"class":683,"line":924},26,[681,926,842],{"class":686},[681,928,731],{"class":730},[681,930,847],{"class":690},[681,932,934,936,938],{"class":683,"line":933},27,[681,935,853],{"class":686},[681,937,731],{"class":730},[681,939,858],{"class":690},[681,941,943,945,947],{"class":683,"line":942},28,[681,944,864],{"class":686},[681,946,731],{"class":730},[681,948,869],{"class":690},[681,950,952,954,956],{"class":683,"line":951},29,[681,953,875],{"class":686},[681,955,731],{"class":730},[681,957,880],{"class":730},[681,959,961],{"class":683,"line":960},30,[681,962,963],{"class":721},"    }\n",[681,965,967],{"class":683,"line":966},31,[681,968,969],{"class":721},"  ]\n",[681,971,973],{"class":683,"line":972},32,[681,974,975],{"class":721},"}\n",[407,977,978],{},[414,979,980],{},"Request Body:",[436,982,983,998],{},[439,984,985],{},[442,986,987,990,993,996],{},[445,988,989],{},"Field",[445,991,992],{},"Type",[445,994,995],{},"Required",[445,997,450],{},[452,999,1000,1015,1029,1042,1058,1072,1086,1099],{},[442,1001,1002,1006,1009,1012],{},[457,1003,1004],{},[419,1005,421],{},[457,1007,1008],{},"string",[457,1010,1011],{},"yes",[457,1013,1014],{},"Component type (see table above)",[442,1016,1017,1022,1024,1026],{},[457,1018,1019],{},[419,1020,1021],{},"name",[457,1023,1008],{},[457,1025,1011],{},[457,1027,1028],{},"Display name (max 256 characters)",[442,1030,1031,1035,1037,1039],{},[457,1032,1033],{},[419,1034,425],{},[457,1036,1008],{},[457,1038,1011],{},[457,1040,1041],{},"Unique identifier for this component within the game (used for deduplication and parent references)",[442,1043,1044,1049,1052,1055],{},[457,1045,1046],{},[419,1047,1048],{},"count",[457,1050,1051],{},"number",[457,1053,1054],{},"no",[457,1056,1057],{},"Number of instances (min 1)",[442,1059,1060,1065,1067,1069],{},[457,1061,1062],{},[419,1063,1064],{},"widthMm",[457,1066,1051],{},[457,1068,1054],{},[457,1070,1071],{},"Width in millimeters",[442,1073,1074,1079,1081,1083],{},[457,1075,1076],{},[419,1077,1078],{},"heightMm",[457,1080,1051],{},[457,1082,1054],{},[457,1084,1085],{},"Height in millimeters",[442,1087,1088,1092,1094,1096],{},[457,1089,1090],{},[419,1091,569],{},[457,1093,1008],{},[457,1095,1054],{},[457,1097,1098],{},"External key of the parent component (e.g., for cards belonging to a deck)",[442,1100,1101,1106,1109,1111],{},[457,1102,1103],{},[419,1104,1105],{},"assets",[457,1107,1108],{},"array",[457,1110,1054],{},[457,1112,1113],{},"Asset objects to attach to this component (see Asset Object below)",[1115,1116,1118],"h3",{"id":1117},"asset-object","Asset Object",[407,1120,1121,1122,1124,1125,1127],{},"Each entry in the ",[419,1123,1105],{}," array maps an uploaded image to a specific face of the component using the ",[419,1126,664],{}," field.",[436,1129,1130,1142],{},[439,1131,1132],{},[442,1133,1134,1136,1138,1140],{},[445,1135,989],{},[445,1137,992],{},[445,1139,995],{},[445,1141,450],{},[452,1143,1144,1164,1184,1202,1222,1236,1250,1264],{},[442,1145,1146,1150,1152,1154],{},[457,1147,1148],{},[419,1149,664],{},[457,1151,1008],{},[457,1153,1011],{},[457,1155,1156,1157,1160,1161],{},"Which face this image belongs to: ",[419,1158,1159],{},"\"front\""," or ",[419,1162,1163],{},"\"back\"",[442,1165,1166,1171,1173,1175],{},[457,1167,1168],{},[419,1169,1170],{},"key",[457,1172,1008],{},[457,1174,1011],{},[457,1176,1177,1178,1180,1181,476],{},"The ",[419,1179,1170],{}," from the presign response (also accepts ",[419,1182,1183],{},"r2ObjectKey",[442,1185,1186,1191,1193,1195],{},[457,1187,1188],{},[419,1189,1190],{},"sourceUrl",[457,1192,1008],{},[457,1194,1011],{},[457,1196,1177,1197,1180,1200,476],{},[419,1198,1199],{},"publicUrl",[419,1201,1199],{},[442,1203,1204,1209,1211,1213],{},[457,1205,1206],{},[419,1207,1208],{},"contentType",[457,1210,1008],{},[457,1212,1011],{},[457,1214,1215,1216,599,1219,476],{},"MIME type (e.g., ",[419,1217,1218],{},"image\u002Fpng",[419,1220,1221],{},"image\u002Fjpeg",[442,1223,1224,1229,1231,1233],{},[457,1225,1226],{},[419,1227,1228],{},"widthPx",[457,1230,1051],{},[457,1232,1011],{},[457,1234,1235],{},"Image width in pixels",[442,1237,1238,1243,1245,1247],{},[457,1239,1240],{},[419,1241,1242],{},"heightPx",[457,1244,1051],{},[457,1246,1011],{},[457,1248,1249],{},"Image height in pixels",[442,1251,1252,1257,1259,1261],{},[457,1253,1254],{},[419,1255,1256],{},"sourcePixelsPerInch",[457,1258,1051],{},[457,1260,1054],{},[457,1262,1263],{},"DPI of the source image (default: 300)",[442,1265,1266,1271,1273,1275],{},[457,1267,1268],{},[419,1269,1270],{},"bleedMode",[457,1272,1008],{},[457,1274,1054],{},[457,1276,1277,1280,1281],{},[419,1278,1279],{},"\"bleed\""," (default) or ",[419,1282,1283],{},"\"noBleed\"",[407,1285,1286],{},"Image derivation is handled automatically. There is no separate derivation step.",[407,1288,1289],{},[414,1290,1291],{},"Response:",[672,1293,1297],{"className":1294,"code":1295,"language":1296,"meta":677,"style":677},"language-json shiki shiki-themes github-light github-dark","{\n  \"id\": \"j57a...\"\n}\n","json",[419,1298,1299,1303,1314],{"__ignoreMap":677},[681,1300,1301],{"class":683,"line":28},[681,1302,722],{"class":721},[681,1304,1305,1308,1311],{"class":683,"line":43},[681,1306,1307],{"class":730},"  \"id\"",[681,1309,1310],{"class":721},": ",[681,1312,1313],{"class":690},"\"j57a...\"\n",[681,1315,1316],{"class":683,"line":23},[681,1317,975],{"class":721},[407,1319,1320],{},[414,1321,1322],{},"Errors:",[1324,1325,1326,1333,1339,1345],"ul",{},[1327,1328,1329,1332],"li",{},[419,1330,1331],{},"VALIDATION_ERROR",": Invalid component data",[1327,1334,1335,1338],{},[419,1336,1337],{},"GAME_NOT_FOUND",": The game does not exist",[1327,1340,1341,1344],{},[419,1342,1343],{},"PERMISSION_DENIED",": You do not own this game",[1327,1346,1347,1350],{},[419,1348,1349],{},"RATE_LIMITED",": You have exceeded component creation limits",[428,1352,1354],{"id":1353},"batch-create-or-update-components","Batch Create or Update Components",[407,1356,1357],{},"Create or update up to 200 components in a single request. Same upsert semantics as the single endpoint.",[407,1359,1360],{},[414,1361,670],{},[672,1363,1365],{"className":674,"code":1364,"language":676,"meta":677,"style":677},"POST \u002Fapi\u002Fv1\u002Fgames\u002F:gameId\u002Fcomponents\u002Fbatch\nAuthorization: Bearer pp_your_token\nContent-Type: application\u002Fjson\n\n{\n  \"components\": [\n    {\n      \"kind\": \"deck\",\n      \"name\": \"Main Deck\",\n      \"externalKey\": \"main-deck\",\n      \"count\": 1,\n      \"widthMm\": 88.9,\n      \"heightMm\": 127\n    },\n    {\n      \"kind\": \"tile\",\n      \"name\": \"Basic Card\",\n      \"externalKey\": \"basic-card\",\n      \"count\": 50,\n      \"widthMm\": 88.9,\n      \"heightMm\": 127,\n      \"parentExternalKey\": \"main-deck\",\n      \"assets\": [\n        {\n          \"sideKey\": \"front\",\n          \"key\": \"uploads\u002Fbasic-front.png\",\n          \"sourceUrl\": \"https:\u002F\u002Fassets.playtestparlor.com\u002Fuploads\u002Fbasic-front.png\",\n          \"contentType\": \"image\u002Fpng\"\n        }\n      ]\n    },\n    {\n      \"kind\": \"tile\",\n      \"name\": \"Special Card\",\n      \"externalKey\": \"special-card\",\n      \"count\": 10,\n      \"widthMm\": 88.9,\n      \"heightMm\": 127,\n      \"parentExternalKey\": \"main-deck\",\n      \"assets\": [\n        {\n          \"sideKey\": \"front\",\n          \"key\": \"uploads\u002Fspecial-front.png\",\n          \"sourceUrl\": \"https:\u002F\u002Fassets.playtestparlor.com\u002Fuploads\u002Fspecial-front.png\",\n          \"contentType\": \"image\u002Fpng\"\n        },\n        {\n          \"sideKey\": \"back\",\n          \"key\": \"uploads\u002Fspecial-back.png\",\n          \"sourceUrl\": \"https:\u002F\u002Fassets.playtestparlor.com\u002Fuploads\u002Fspecial-back.png\",\n          \"contentType\": \"image\u002Fpng\"\n        }\n      ]\n    }\n  ]\n}\n",[419,1366,1367,1374,1382,1388,1392,1396,1405,1409,1419,1429,1439,1449,1458,1468,1472,1476,1484,1493,1502,1511,1519,1527,1536,1545,1550,1559,1569,1579,1589,1594,1599,1603,1607,1616,1626,1636,1646,1655,1664,1673,1682,1687,1696,1706,1716,1725,1731,1736,1745,1755,1765,1774,1779,1784,1789,1794],{"__ignoreMap":677},[681,1368,1369,1371],{"class":683,"line":28},[681,1370,687],{"class":686},[681,1372,1373],{"class":690}," \u002Fapi\u002Fv1\u002Fgames\u002F:gameId\u002Fcomponents\u002Fbatch\n",[681,1375,1376,1378,1380],{"class":683,"line":43},[681,1377,696],{"class":686},[681,1379,699],{"class":690},[681,1381,702],{"class":690},[681,1383,1384,1386],{"class":683,"line":23},[681,1385,707],{"class":686},[681,1387,710],{"class":690},[681,1389,1390],{"class":683,"line":33},[681,1391,716],{"emptyLinePlaceholder":715},[681,1393,1394],{"class":683,"line":38},[681,1395,722],{"class":721},[681,1397,1398,1401,1403],{"class":683,"line":327},[681,1399,1400],{"class":686},"  \"components\"",[681,1402,731],{"class":730},[681,1404,797],{"class":721},[681,1406,1407],{"class":683,"line":18},[681,1408,803],{"class":721},[681,1410,1411,1414,1416],{"class":683,"line":340},[681,1412,1413],{"class":686},"      \"kind\"",[681,1415,731],{"class":730},[681,1417,1418],{"class":690}," \"deck\",\n",[681,1420,1421,1424,1426],{"class":683,"line":757},[681,1422,1423],{"class":686},"      \"name\"",[681,1425,731],{"class":730},[681,1427,1428],{"class":690}," \"Main Deck\",\n",[681,1430,1431,1434,1436],{"class":683,"line":314},[681,1432,1433],{"class":686},"      \"externalKey\"",[681,1435,731],{"class":730},[681,1437,1438],{"class":690}," \"main-deck\",\n",[681,1440,1441,1444,1446],{"class":683,"line":778},[681,1442,1443],{"class":686},"      \"count\"",[681,1445,731],{"class":730},[681,1447,1448],{"class":690}," 1,\n",[681,1450,1451,1454,1456],{"class":683,"line":789},[681,1452,1453],{"class":686},"      \"widthMm\"",[681,1455,731],{"class":730},[681,1457,775],{"class":690},[681,1459,1460,1463,1465],{"class":683,"line":800},[681,1461,1462],{"class":686},"      \"heightMm\"",[681,1464,731],{"class":730},[681,1466,1467],{"class":730}," 127\n",[681,1469,1470],{"class":683,"line":806},[681,1471,886],{"class":721},[681,1473,1474],{"class":683,"line":817},[681,1475,803],{"class":721},[681,1477,1478,1480,1482],{"class":683,"line":828},[681,1479,1413],{"class":686},[681,1481,731],{"class":730},[681,1483,734],{"class":690},[681,1485,1486,1488,1490],{"class":683,"line":839},[681,1487,1423],{"class":686},[681,1489,731],{"class":730},[681,1491,1492],{"class":690}," \"Basic Card\",\n",[681,1494,1495,1497,1499],{"class":683,"line":850},[681,1496,1433],{"class":686},[681,1498,731],{"class":730},[681,1500,1501],{"class":690}," \"basic-card\",\n",[681,1503,1504,1506,1508],{"class":683,"line":861},[681,1505,1443],{"class":686},[681,1507,731],{"class":730},[681,1509,1510],{"class":690}," 50,\n",[681,1512,1513,1515,1517],{"class":683,"line":872},[681,1514,1453],{"class":686},[681,1516,731],{"class":730},[681,1518,775],{"class":690},[681,1520,1521,1523,1525],{"class":683,"line":883},[681,1522,1462],{"class":686},[681,1524,731],{"class":730},[681,1526,786],{"class":690},[681,1528,1529,1532,1534],{"class":683,"line":889},[681,1530,1531],{"class":686},"      \"parentExternalKey\"",[681,1533,731],{"class":730},[681,1535,1438],{"class":690},[681,1537,1538,1541,1543],{"class":683,"line":894},[681,1539,1540],{"class":686},"      \"assets\"",[681,1542,731],{"class":730},[681,1544,797],{"class":721},[681,1546,1547],{"class":683,"line":904},[681,1548,1549],{"class":721},"        {\n",[681,1551,1552,1555,1557],{"class":683,"line":914},[681,1553,1554],{"class":686},"          \"sideKey\"",[681,1556,731],{"class":730},[681,1558,814],{"class":690},[681,1560,1561,1564,1566],{"class":683,"line":924},[681,1562,1563],{"class":686},"          \"key\"",[681,1565,731],{"class":730},[681,1567,1568],{"class":690}," \"uploads\u002Fbasic-front.png\",\n",[681,1570,1571,1574,1576],{"class":683,"line":933},[681,1572,1573],{"class":686},"          \"sourceUrl\"",[681,1575,731],{"class":730},[681,1577,1578],{"class":690}," \"https:\u002F\u002Fassets.playtestparlor.com\u002Fuploads\u002Fbasic-front.png\",\n",[681,1580,1581,1584,1586],{"class":683,"line":942},[681,1582,1583],{"class":686},"          \"contentType\"",[681,1585,731],{"class":730},[681,1587,1588],{"class":690}," \"image\u002Fpng\"\n",[681,1590,1591],{"class":683,"line":951},[681,1592,1593],{"class":721},"        }\n",[681,1595,1596],{"class":683,"line":960},[681,1597,1598],{"class":721},"      ]\n",[681,1600,1601],{"class":683,"line":966},[681,1602,886],{"class":721},[681,1604,1605],{"class":683,"line":972},[681,1606,803],{"class":721},[681,1608,1610,1612,1614],{"class":683,"line":1609},33,[681,1611,1413],{"class":686},[681,1613,731],{"class":730},[681,1615,734],{"class":690},[681,1617,1619,1621,1623],{"class":683,"line":1618},34,[681,1620,1423],{"class":686},[681,1622,731],{"class":730},[681,1624,1625],{"class":690}," \"Special Card\",\n",[681,1627,1629,1631,1633],{"class":683,"line":1628},35,[681,1630,1433],{"class":686},[681,1632,731],{"class":730},[681,1634,1635],{"class":690}," \"special-card\",\n",[681,1637,1639,1641,1643],{"class":683,"line":1638},36,[681,1640,1443],{"class":686},[681,1642,731],{"class":730},[681,1644,1645],{"class":690}," 10,\n",[681,1647,1649,1651,1653],{"class":683,"line":1648},37,[681,1650,1453],{"class":686},[681,1652,731],{"class":730},[681,1654,775],{"class":690},[681,1656,1658,1660,1662],{"class":683,"line":1657},38,[681,1659,1462],{"class":686},[681,1661,731],{"class":730},[681,1663,786],{"class":690},[681,1665,1667,1669,1671],{"class":683,"line":1666},39,[681,1668,1531],{"class":686},[681,1670,731],{"class":730},[681,1672,1438],{"class":690},[681,1674,1676,1678,1680],{"class":683,"line":1675},40,[681,1677,1540],{"class":686},[681,1679,731],{"class":730},[681,1681,797],{"class":721},[681,1683,1685],{"class":683,"line":1684},41,[681,1686,1549],{"class":721},[681,1688,1690,1692,1694],{"class":683,"line":1689},42,[681,1691,1554],{"class":686},[681,1693,731],{"class":730},[681,1695,814],{"class":690},[681,1697,1699,1701,1703],{"class":683,"line":1698},43,[681,1700,1563],{"class":686},[681,1702,731],{"class":730},[681,1704,1705],{"class":690}," \"uploads\u002Fspecial-front.png\",\n",[681,1707,1709,1711,1713],{"class":683,"line":1708},44,[681,1710,1573],{"class":686},[681,1712,731],{"class":730},[681,1714,1715],{"class":690}," \"https:\u002F\u002Fassets.playtestparlor.com\u002Fuploads\u002Fspecial-front.png\",\n",[681,1717,1719,1721,1723],{"class":683,"line":1718},45,[681,1720,1583],{"class":686},[681,1722,731],{"class":730},[681,1724,1588],{"class":690},[681,1726,1728],{"class":683,"line":1727},46,[681,1729,1730],{"class":721},"        },\n",[681,1732,1734],{"class":683,"line":1733},47,[681,1735,1549],{"class":721},[681,1737,1739,1741,1743],{"class":683,"line":1738},48,[681,1740,1554],{"class":686},[681,1742,731],{"class":730},[681,1744,901],{"class":690},[681,1746,1748,1750,1752],{"class":683,"line":1747},49,[681,1749,1563],{"class":686},[681,1751,731],{"class":730},[681,1753,1754],{"class":690}," \"uploads\u002Fspecial-back.png\",\n",[681,1756,1758,1760,1762],{"class":683,"line":1757},50,[681,1759,1573],{"class":686},[681,1761,731],{"class":730},[681,1763,1764],{"class":690}," \"https:\u002F\u002Fassets.playtestparlor.com\u002Fuploads\u002Fspecial-back.png\",\n",[681,1766,1768,1770,1772],{"class":683,"line":1767},51,[681,1769,1583],{"class":686},[681,1771,731],{"class":730},[681,1773,1588],{"class":690},[681,1775,1777],{"class":683,"line":1776},52,[681,1778,1593],{"class":721},[681,1780,1782],{"class":683,"line":1781},53,[681,1783,1598],{"class":721},[681,1785,1787],{"class":683,"line":1786},54,[681,1788,963],{"class":721},[681,1790,1792],{"class":683,"line":1791},55,[681,1793,969],{"class":721},[681,1795,1797],{"class":683,"line":1796},56,[681,1798,975],{"class":721},[407,1800,1801],{},[414,1802,980],{},[436,1804,1805,1817],{},[439,1806,1807],{},[442,1808,1809,1811,1813,1815],{},[445,1810,989],{},[445,1812,992],{},[445,1814,995],{},[445,1816,450],{},[452,1818,1819],{},[442,1820,1821,1826,1828,1830],{},[457,1822,1823],{},[419,1824,1825],{},"components",[457,1827,1108],{},[457,1829,1011],{},[457,1831,1832],{},"Array of component objects (max 200)",[407,1834,1835],{},"Each component object has the same fields as the single create endpoint.",[407,1837,1838],{},[414,1839,1291],{},[672,1841,1843],{"className":1294,"code":1842,"language":1296,"meta":677,"style":677},"{\n  \"components\": [\n    { \"id\": \"j57a...\" },\n    { \"id\": \"k82b...\" },\n    { \"id\": \"m93c...\" }\n  ]\n}\n",[419,1844,1845,1849,1856,1872,1885,1899,1903],{"__ignoreMap":677},[681,1846,1847],{"class":683,"line":28},[681,1848,722],{"class":721},[681,1850,1851,1853],{"class":683,"line":43},[681,1852,1400],{"class":730},[681,1854,1855],{"class":721},": [\n",[681,1857,1858,1861,1864,1866,1869],{"class":683,"line":23},[681,1859,1860],{"class":721},"    { ",[681,1862,1863],{"class":730},"\"id\"",[681,1865,1310],{"class":721},[681,1867,1868],{"class":690},"\"j57a...\"",[681,1870,1871],{"class":721}," },\n",[681,1873,1874,1876,1878,1880,1883],{"class":683,"line":33},[681,1875,1860],{"class":721},[681,1877,1863],{"class":730},[681,1879,1310],{"class":721},[681,1881,1882],{"class":690},"\"k82b...\"",[681,1884,1871],{"class":721},[681,1886,1887,1889,1891,1893,1896],{"class":683,"line":38},[681,1888,1860],{"class":721},[681,1890,1863],{"class":730},[681,1892,1310],{"class":721},[681,1894,1895],{"class":690},"\"m93c...\"",[681,1897,1898],{"class":721}," }\n",[681,1900,1901],{"class":683,"line":327},[681,1902,969],{"class":721},[681,1904,1905],{"class":683,"line":18},[681,1906,975],{"class":721},[407,1908,1909],{},[414,1910,1322],{},[1324,1912,1913,1918,1922,1926],{},[1327,1914,1915,1917],{},[419,1916,1331],{},": Invalid component data or too many components (max 200)",[1327,1919,1920,1338],{},[419,1921,1337],{},[1327,1923,1924,1344],{},[419,1925,1343],{},[1327,1927,1928,1930],{},[419,1929,1349],{},": You have exceeded component creation limits (120 per minute, 10 batch requests per minute)",[428,1932,1934],{"id":1933},"list-components","List Components",[407,1936,1937],{},"Retrieve all components your app has created for a game. Only returns components from your app's import source.",[407,1939,1940],{},[414,1941,670],{},[672,1943,1945],{"className":674,"code":1944,"language":676,"meta":677,"style":677},"GET \u002Fapi\u002Fv1\u002Fgames\u002F:gameId\u002Fcomponents\nAuthorization: Bearer pp_your_token\n",[419,1946,1947,1954],{"__ignoreMap":677},[681,1948,1949,1952],{"class":683,"line":28},[681,1950,1951],{"class":686},"GET",[681,1953,691],{"class":690},[681,1955,1956,1958,1960],{"class":683,"line":43},[681,1957,696],{"class":686},[681,1959,699],{"class":690},[681,1961,702],{"class":690},[407,1963,1964],{},[414,1965,1291],{},[672,1967,1969],{"className":1294,"code":1968,"language":1296,"meta":677,"style":677},"{\n  \"components\": [\n    {\n      \"id\": \"j57a...\",\n      \"kind\": \"deck\",\n      \"name\": \"Main Deck\",\n      \"externalKey\": \"main-deck\",\n      \"count\": 1,\n      \"widthMm\": 88.9,\n      \"heightMm\": 127,\n      \"parentExternalKey\": null,\n      \"payload\": {}\n    },\n    {\n      \"id\": \"k82b...\",\n      \"kind\": \"tile\",\n      \"name\": \"Basic Card\",\n      \"externalKey\": \"basic-card\",\n      \"count\": 50,\n      \"widthMm\": 88.9,\n      \"heightMm\": 127,\n      \"parentExternalKey\": \"main-deck\",\n      \"payload\": {\n        \"imageFaces\": [\n          { \"sideKey\": \"front\", \"assetId\": \"a1b2...\", \"derivedAssetId\": \"c3d4...\" }\n        ]\n      }\n    }\n  ]\n}\n",[419,1970,1971,1975,1981,1985,1997,2008,2019,2030,2041,2052,2063,2074,2082,2086,2090,2100,2111,2122,2133,2144,2154,2164,2174,2181,2188,2222,2227,2232,2236,2240],{"__ignoreMap":677},[681,1972,1973],{"class":683,"line":28},[681,1974,722],{"class":721},[681,1976,1977,1979],{"class":683,"line":43},[681,1978,1400],{"class":730},[681,1980,1855],{"class":721},[681,1982,1983],{"class":683,"line":23},[681,1984,803],{"class":721},[681,1986,1987,1990,1992,1994],{"class":683,"line":33},[681,1988,1989],{"class":730},"      \"id\"",[681,1991,1310],{"class":721},[681,1993,1868],{"class":690},[681,1995,1996],{"class":721},",\n",[681,1998,1999,2001,2003,2006],{"class":683,"line":38},[681,2000,1413],{"class":730},[681,2002,1310],{"class":721},[681,2004,2005],{"class":690},"\"deck\"",[681,2007,1996],{"class":721},[681,2009,2010,2012,2014,2017],{"class":683,"line":327},[681,2011,1423],{"class":730},[681,2013,1310],{"class":721},[681,2015,2016],{"class":690},"\"Main Deck\"",[681,2018,1996],{"class":721},[681,2020,2021,2023,2025,2028],{"class":683,"line":18},[681,2022,1433],{"class":730},[681,2024,1310],{"class":721},[681,2026,2027],{"class":690},"\"main-deck\"",[681,2029,1996],{"class":721},[681,2031,2032,2034,2036,2039],{"class":683,"line":340},[681,2033,1443],{"class":730},[681,2035,1310],{"class":721},[681,2037,2038],{"class":730},"1",[681,2040,1996],{"class":721},[681,2042,2043,2045,2047,2050],{"class":683,"line":757},[681,2044,1453],{"class":730},[681,2046,1310],{"class":721},[681,2048,2049],{"class":730},"88.9",[681,2051,1996],{"class":721},[681,2053,2054,2056,2058,2061],{"class":683,"line":314},[681,2055,1462],{"class":730},[681,2057,1310],{"class":721},[681,2059,2060],{"class":730},"127",[681,2062,1996],{"class":721},[681,2064,2065,2067,2069,2072],{"class":683,"line":778},[681,2066,1531],{"class":730},[681,2068,1310],{"class":721},[681,2070,2071],{"class":730},"null",[681,2073,1996],{"class":721},[681,2075,2076,2079],{"class":683,"line":789},[681,2077,2078],{"class":730},"      \"payload\"",[681,2080,2081],{"class":721},": {}\n",[681,2083,2084],{"class":683,"line":800},[681,2085,886],{"class":721},[681,2087,2088],{"class":683,"line":806},[681,2089,803],{"class":721},[681,2091,2092,2094,2096,2098],{"class":683,"line":817},[681,2093,1989],{"class":730},[681,2095,1310],{"class":721},[681,2097,1882],{"class":690},[681,2099,1996],{"class":721},[681,2101,2102,2104,2106,2109],{"class":683,"line":828},[681,2103,1413],{"class":730},[681,2105,1310],{"class":721},[681,2107,2108],{"class":690},"\"tile\"",[681,2110,1996],{"class":721},[681,2112,2113,2115,2117,2120],{"class":683,"line":839},[681,2114,1423],{"class":730},[681,2116,1310],{"class":721},[681,2118,2119],{"class":690},"\"Basic Card\"",[681,2121,1996],{"class":721},[681,2123,2124,2126,2128,2131],{"class":683,"line":850},[681,2125,1433],{"class":730},[681,2127,1310],{"class":721},[681,2129,2130],{"class":690},"\"basic-card\"",[681,2132,1996],{"class":721},[681,2134,2135,2137,2139,2142],{"class":683,"line":861},[681,2136,1443],{"class":730},[681,2138,1310],{"class":721},[681,2140,2141],{"class":730},"50",[681,2143,1996],{"class":721},[681,2145,2146,2148,2150,2152],{"class":683,"line":872},[681,2147,1453],{"class":730},[681,2149,1310],{"class":721},[681,2151,2049],{"class":730},[681,2153,1996],{"class":721},[681,2155,2156,2158,2160,2162],{"class":683,"line":883},[681,2157,1462],{"class":730},[681,2159,1310],{"class":721},[681,2161,2060],{"class":730},[681,2163,1996],{"class":721},[681,2165,2166,2168,2170,2172],{"class":683,"line":889},[681,2167,1531],{"class":730},[681,2169,1310],{"class":721},[681,2171,2027],{"class":690},[681,2173,1996],{"class":721},[681,2175,2176,2178],{"class":683,"line":894},[681,2177,2078],{"class":730},[681,2179,2180],{"class":721},": {\n",[681,2182,2183,2186],{"class":683,"line":904},[681,2184,2185],{"class":730},"        \"imageFaces\"",[681,2187,1855],{"class":721},[681,2189,2190,2193,2196,2198,2200,2202,2205,2207,2210,2212,2215,2217,2220],{"class":683,"line":914},[681,2191,2192],{"class":721},"          { ",[681,2194,2195],{"class":730},"\"sideKey\"",[681,2197,1310],{"class":721},[681,2199,1159],{"class":690},[681,2201,599],{"class":721},[681,2203,2204],{"class":730},"\"assetId\"",[681,2206,1310],{"class":721},[681,2208,2209],{"class":690},"\"a1b2...\"",[681,2211,599],{"class":721},[681,2213,2214],{"class":730},"\"derivedAssetId\"",[681,2216,1310],{"class":721},[681,2218,2219],{"class":690},"\"c3d4...\"",[681,2221,1898],{"class":721},[681,2223,2224],{"class":683,"line":924},[681,2225,2226],{"class":721},"        ]\n",[681,2228,2229],{"class":683,"line":933},[681,2230,2231],{"class":721},"      }\n",[681,2233,2234],{"class":683,"line":942},[681,2235,963],{"class":721},[681,2237,2238],{"class":683,"line":951},[681,2239,969],{"class":721},[681,2241,2242],{"class":683,"line":960},[681,2243,975],{"class":721},[407,2245,2246],{},[414,2247,2248],{},"Response Fields:",[436,2250,2251,2261],{},[439,2252,2253],{},[442,2254,2255,2257,2259],{},[445,2256,989],{},[445,2258,992],{},[445,2260,450],{},[452,2262,2263,2275,2286,2297,2308,2319,2329,2339,2351],{},[442,2264,2265,2270,2272],{},[457,2266,2267],{},[419,2268,2269],{},"id",[457,2271,1008],{},[457,2273,2274],{},"Unique component identifier",[442,2276,2277,2281,2283],{},[457,2278,2279],{},[419,2280,421],{},[457,2282,1008],{},[457,2284,2285],{},"Component type",[442,2287,2288,2292,2294],{},[457,2289,2290],{},[419,2291,1021],{},[457,2293,1008],{},[457,2295,2296],{},"Display name",[442,2298,2299,2303,2305],{},[457,2300,2301],{},[419,2302,425],{},[457,2304,1008],{},[457,2306,2307],{},"Your external identifier for this component",[442,2309,2310,2314,2316],{},[457,2311,2312],{},[419,2313,1048],{},[457,2315,1051],{},[457,2317,2318],{},"Number of instances",[442,2320,2321,2325,2327],{},[457,2322,2323],{},[419,2324,1064],{},[457,2326,1051],{},[457,2328,1071],{},[442,2330,2331,2335,2337],{},[457,2332,2333],{},[419,2334,1078],{},[457,2336,1051],{},[457,2338,1085],{},[442,2340,2341,2345,2348],{},[457,2342,2343],{},[419,2344,569],{},[457,2346,2347],{},"string or null",[457,2349,2350],{},"Parent component's external key",[442,2352,2353,2358,2361],{},[457,2354,2355],{},[419,2356,2357],{},"payload",[457,2359,2360],{},"object",[457,2362,2363,2364,2367],{},"Component metadata including ",[419,2365,2366],{},"imageFaces"," for attached assets",[407,2369,2370],{},[414,2371,1322],{},[1324,2373,2374,2378],{},[1327,2375,2376,1338],{},[419,2377,1337],{},[1327,2379,2380,1344],{},[419,2381,1343],{},[428,2383,2385],{"id":2384},"delete-component","Delete Component",[407,2387,2388],{},"Delete a single component and all of its associated assets. Only works on components in a draft revision.",[407,2390,2391],{},[414,2392,670],{},[672,2394,2396],{"className":674,"code":2395,"language":676,"meta":677,"style":677},"DELETE \u002Fapi\u002Fv1\u002Fgames\u002F:gameId\u002Fcomponents\u002F:componentId\nAuthorization: Bearer pp_your_token\n",[419,2397,2398,2406],{"__ignoreMap":677},[681,2399,2400,2403],{"class":683,"line":28},[681,2401,2402],{"class":686},"DELETE",[681,2404,2405],{"class":690}," \u002Fapi\u002Fv1\u002Fgames\u002F:gameId\u002Fcomponents\u002F:componentId\n",[681,2407,2408,2410,2412],{"class":683,"line":43},[681,2409,696],{"class":686},[681,2411,699],{"class":690},[681,2413,702],{"class":690},[407,2415,2416,2418,2419],{},[414,2417,1291],{}," ",[419,2420,2421],{},"204 No Content",[407,2423,2424],{},[414,2425,1322],{},[1324,2427,2428,2434,2440,2444],{},[1327,2429,2430,2433],{},[419,2431,2432],{},"COMPONENT_NOT_FOUND",": The component does not exist or belongs to a different app",[1327,2435,2436,2439],{},[419,2437,2438],{},"REVISION_FINALIZED",": The component belongs to a finalized revision and cannot be deleted",[1327,2441,2442,1338],{},[419,2443,1337],{},[1327,2445,2446,1344],{},[419,2447,1343],{},[428,2449,2451],{"id":2450},"batch-delete-components","Batch Delete Components",[407,2453,2454],{},"Delete all components (and their assets) your app has created for a game. This removes everything from the current draft revision, providing a clean slate for re-export.",[407,2456,2457],{},[414,2458,670],{},[672,2460,2462],{"className":674,"code":2461,"language":676,"meta":677,"style":677},"DELETE \u002Fapi\u002Fv1\u002Fgames\u002F:gameId\u002Fcomponents\u002Fbatch\nAuthorization: Bearer pp_your_token\n",[419,2463,2464,2470],{"__ignoreMap":677},[681,2465,2466,2468],{"class":683,"line":28},[681,2467,2402],{"class":686},[681,2469,1373],{"class":690},[681,2471,2472,2474,2476],{"class":683,"line":43},[681,2473,696],{"class":686},[681,2475,699],{"class":690},[681,2477,702],{"class":690},[407,2479,2480],{},[414,2481,1291],{},[672,2483,2485],{"className":1294,"code":2484,"language":1296,"meta":677,"style":677},"{\n  \"deleted\": 15\n}\n",[419,2486,2487,2491,2501],{"__ignoreMap":677},[681,2488,2489],{"class":683,"line":28},[681,2490,722],{"class":721},[681,2492,2493,2496,2498],{"class":683,"line":43},[681,2494,2495],{"class":730},"  \"deleted\"",[681,2497,1310],{"class":721},[681,2499,2500],{"class":730},"15\n",[681,2502,2503],{"class":683,"line":23},[681,2504,975],{"class":721},[407,2506,2507],{},[414,2508,2248],{},[436,2510,2511,2521],{},[439,2512,2513],{},[442,2514,2515,2517,2519],{},[445,2516,989],{},[445,2518,992],{},[445,2520,450],{},[452,2522,2523],{},[442,2524,2525,2530,2532],{},[457,2526,2527],{},[419,2528,2529],{},"deleted",[457,2531,1051],{},[457,2533,2534],{},"Number of components that were deleted",[407,2536,2537],{},[414,2538,1322],{},[1324,2540,2541,2545],{},[1327,2542,2543,1338],{},[419,2544,1337],{},[1327,2546,2547,1344],{},[419,2548,1343],{},[428,2550,2552],{"id":2551},"units","Units",[407,2554,2555],{},"All dimensions (widthMm, heightMm) are in millimeters. This is the canonical storage format in Playtest Parlor. When you retrieve components from the app or other APIs, they will always be in millimeters.",[428,2557,2559],{"id":2558},"typical-deck-workflow","Typical Deck Workflow",[407,2561,2562],{},"Here is a typical workflow for creating a deck with multiple card types:",[672,2564,2566],{"className":674,"code":2565,"language":676,"meta":677,"style":677},"# 1. Upload card images (front and back) via the Assets API\n#    For each image: presign -> upload to signed URL -> confirm upload\n#    You'll get key, publicUrl, and displayPlan from the presign response\n\n# 2. Create the deck and its cards in one batch request\n#    Cards reference the deck via parentExternalKey\n#    Each asset's sideKey (\"front\" or \"back\") maps the image to a tile face\nPOST \u002Fapi\u002Fv1\u002Fgames\u002F:gameId\u002Fcomponents\u002Fbatch\n{\n  \"components\": [\n    {\n      \"kind\": \"deck\",\n      \"name\": \"Main Deck\",\n      \"externalKey\": \"main-deck\",\n      \"widthMm\": 88.9,\n      \"heightMm\": 127\n    },\n    {\n      \"kind\": \"tile\",\n      \"name\": \"Basic Card\",\n      \"externalKey\": \"basic-card\",\n      \"count\": 40,\n      \"widthMm\": 88.9,\n      \"heightMm\": 127,\n      \"parentExternalKey\": \"main-deck\",\n      \"assets\": [\n        {\n          \"sideKey\": \"front\",\n          \"key\": \"uploads\u002Fbasic-front.png\",\n          \"sourceUrl\": \"https:\u002F\u002Fassets.playtestparlor.com\u002Fuploads\u002Fbasic-front.png\",\n          \"contentType\": \"image\u002Fpng\",\n          \"widthPx\": 750,\n          \"heightPx\": 1050,\n          \"sourcePixelsPerInch\": 300\n        },\n        {\n          \"sideKey\": \"back\",\n          \"key\": \"uploads\u002Fcard-back.png\",\n          \"sourceUrl\": \"https:\u002F\u002Fassets.playtestparlor.com\u002Fuploads\u002Fcard-back.png\",\n          \"contentType\": \"image\u002Fpng\",\n          \"widthPx\": 750,\n          \"heightPx\": 1050,\n          \"sourcePixelsPerInch\": 300\n        }\n      ]\n    },\n    {\n      \"kind\": \"tile\",\n      \"name\": \"Special Card\",\n      \"externalKey\": \"special-card\",\n      \"count\": 10,\n      \"widthMm\": 88.9,\n      \"heightMm\": 127,\n      \"parentExternalKey\": \"main-deck\",\n      \"assets\": [\n        {\n          \"sideKey\": \"front\",\n          \"key\": \"uploads\u002Fspecial-front.png\",\n          \"sourceUrl\": \"https:\u002F\u002Fassets.playtestparlor.com\u002Fuploads\u002Fspecial-front.png\",\n          \"contentType\": \"image\u002Fpng\",\n          \"widthPx\": 750,\n          \"heightPx\": 1050,\n          \"sourcePixelsPerInch\": 300\n        },\n        {\n          \"sideKey\": \"back\",\n          \"key\": \"uploads\u002Fcard-back.png\",\n          \"sourceUrl\": \"https:\u002F\u002Fassets.playtestparlor.com\u002Fuploads\u002Fcard-back.png\",\n          \"contentType\": \"image\u002Fpng\",\n          \"widthPx\": 750,\n          \"heightPx\": 1050,\n          \"sourcePixelsPerInch\": 300\n        }\n      ]\n    }\n  ]\n}\n",[419,2567,2568,2574,2579,2584,2588,2593,2598,2603,2609,2613,2621,2625,2633,2641,2649,2657,2665,2669,2673,2681,2689,2697,2706,2714,2722,2730,2738,2742,2750,2758,2766,2774,2783,2792,2801,2805,2809,2817,2826,2835,2843,2851,2859,2867,2871,2875,2879,2883,2891,2899,2907,2915,2923,2931,2939,2947,2951,2960,2969,2978,2987,2996,3005,3014,3019,3024,3033,3042,3051,3060,3069,3078,3087,3092,3097,3102,3107],{"__ignoreMap":677},[681,2569,2570],{"class":683,"line":28},[681,2571,2573],{"class":2572},"sJ8bj","# 1. Upload card images (front and back) via the Assets API\n",[681,2575,2576],{"class":683,"line":43},[681,2577,2578],{"class":2572},"#    For each image: presign -> upload to signed URL -> confirm upload\n",[681,2580,2581],{"class":683,"line":23},[681,2582,2583],{"class":2572},"#    You'll get key, publicUrl, and displayPlan from the presign response\n",[681,2585,2586],{"class":683,"line":33},[681,2587,716],{"emptyLinePlaceholder":715},[681,2589,2590],{"class":683,"line":38},[681,2591,2592],{"class":2572},"# 2. Create the deck and its cards in one batch request\n",[681,2594,2595],{"class":683,"line":327},[681,2596,2597],{"class":2572},"#    Cards reference the deck via parentExternalKey\n",[681,2599,2600],{"class":683,"line":18},[681,2601,2602],{"class":2572},"#    Each asset's sideKey (\"front\" or \"back\") maps the image to a tile face\n",[681,2604,2605,2607],{"class":683,"line":340},[681,2606,687],{"class":686},[681,2608,1373],{"class":690},[681,2610,2611],{"class":683,"line":757},[681,2612,722],{"class":721},[681,2614,2615,2617,2619],{"class":683,"line":314},[681,2616,1400],{"class":686},[681,2618,731],{"class":730},[681,2620,797],{"class":721},[681,2622,2623],{"class":683,"line":778},[681,2624,803],{"class":721},[681,2626,2627,2629,2631],{"class":683,"line":789},[681,2628,1413],{"class":686},[681,2630,731],{"class":730},[681,2632,1418],{"class":690},[681,2634,2635,2637,2639],{"class":683,"line":800},[681,2636,1423],{"class":686},[681,2638,731],{"class":730},[681,2640,1428],{"class":690},[681,2642,2643,2645,2647],{"class":683,"line":806},[681,2644,1433],{"class":686},[681,2646,731],{"class":730},[681,2648,1438],{"class":690},[681,2650,2651,2653,2655],{"class":683,"line":817},[681,2652,1453],{"class":686},[681,2654,731],{"class":730},[681,2656,775],{"class":690},[681,2658,2659,2661,2663],{"class":683,"line":828},[681,2660,1462],{"class":686},[681,2662,731],{"class":730},[681,2664,1467],{"class":730},[681,2666,2667],{"class":683,"line":839},[681,2668,886],{"class":721},[681,2670,2671],{"class":683,"line":850},[681,2672,803],{"class":721},[681,2674,2675,2677,2679],{"class":683,"line":861},[681,2676,1413],{"class":686},[681,2678,731],{"class":730},[681,2680,734],{"class":690},[681,2682,2683,2685,2687],{"class":683,"line":872},[681,2684,1423],{"class":686},[681,2686,731],{"class":730},[681,2688,1492],{"class":690},[681,2690,2691,2693,2695],{"class":683,"line":883},[681,2692,1433],{"class":686},[681,2694,731],{"class":730},[681,2696,1501],{"class":690},[681,2698,2699,2701,2703],{"class":683,"line":889},[681,2700,1443],{"class":686},[681,2702,731],{"class":730},[681,2704,2705],{"class":690}," 40,\n",[681,2707,2708,2710,2712],{"class":683,"line":894},[681,2709,1453],{"class":686},[681,2711,731],{"class":730},[681,2713,775],{"class":690},[681,2715,2716,2718,2720],{"class":683,"line":904},[681,2717,1462],{"class":686},[681,2719,731],{"class":730},[681,2721,786],{"class":690},[681,2723,2724,2726,2728],{"class":683,"line":914},[681,2725,1531],{"class":686},[681,2727,731],{"class":730},[681,2729,1438],{"class":690},[681,2731,2732,2734,2736],{"class":683,"line":924},[681,2733,1540],{"class":686},[681,2735,731],{"class":730},[681,2737,797],{"class":721},[681,2739,2740],{"class":683,"line":933},[681,2741,1549],{"class":721},[681,2743,2744,2746,2748],{"class":683,"line":942},[681,2745,1554],{"class":686},[681,2747,731],{"class":730},[681,2749,814],{"class":690},[681,2751,2752,2754,2756],{"class":683,"line":951},[681,2753,1563],{"class":686},[681,2755,731],{"class":730},[681,2757,1568],{"class":690},[681,2759,2760,2762,2764],{"class":683,"line":960},[681,2761,1573],{"class":686},[681,2763,731],{"class":730},[681,2765,1578],{"class":690},[681,2767,2768,2770,2772],{"class":683,"line":966},[681,2769,1583],{"class":686},[681,2771,731],{"class":730},[681,2773,847],{"class":690},[681,2775,2776,2779,2781],{"class":683,"line":972},[681,2777,2778],{"class":686},"          \"widthPx\"",[681,2780,731],{"class":730},[681,2782,858],{"class":690},[681,2784,2785,2788,2790],{"class":683,"line":1609},[681,2786,2787],{"class":686},"          \"heightPx\"",[681,2789,731],{"class":730},[681,2791,869],{"class":690},[681,2793,2794,2797,2799],{"class":683,"line":1618},[681,2795,2796],{"class":686},"          \"sourcePixelsPerInch\"",[681,2798,731],{"class":730},[681,2800,880],{"class":730},[681,2802,2803],{"class":683,"line":1628},[681,2804,1730],{"class":721},[681,2806,2807],{"class":683,"line":1638},[681,2808,1549],{"class":721},[681,2810,2811,2813,2815],{"class":683,"line":1648},[681,2812,1554],{"class":686},[681,2814,731],{"class":730},[681,2816,901],{"class":690},[681,2818,2819,2821,2823],{"class":683,"line":1657},[681,2820,1563],{"class":686},[681,2822,731],{"class":730},[681,2824,2825],{"class":690}," \"uploads\u002Fcard-back.png\",\n",[681,2827,2828,2830,2832],{"class":683,"line":1666},[681,2829,1573],{"class":686},[681,2831,731],{"class":730},[681,2833,2834],{"class":690}," \"https:\u002F\u002Fassets.playtestparlor.com\u002Fuploads\u002Fcard-back.png\",\n",[681,2836,2837,2839,2841],{"class":683,"line":1675},[681,2838,1583],{"class":686},[681,2840,731],{"class":730},[681,2842,847],{"class":690},[681,2844,2845,2847,2849],{"class":683,"line":1684},[681,2846,2778],{"class":686},[681,2848,731],{"class":730},[681,2850,858],{"class":690},[681,2852,2853,2855,2857],{"class":683,"line":1689},[681,2854,2787],{"class":686},[681,2856,731],{"class":730},[681,2858,869],{"class":690},[681,2860,2861,2863,2865],{"class":683,"line":1698},[681,2862,2796],{"class":686},[681,2864,731],{"class":730},[681,2866,880],{"class":730},[681,2868,2869],{"class":683,"line":1708},[681,2870,1593],{"class":721},[681,2872,2873],{"class":683,"line":1718},[681,2874,1598],{"class":721},[681,2876,2877],{"class":683,"line":1727},[681,2878,886],{"class":721},[681,2880,2881],{"class":683,"line":1733},[681,2882,803],{"class":721},[681,2884,2885,2887,2889],{"class":683,"line":1738},[681,2886,1413],{"class":686},[681,2888,731],{"class":730},[681,2890,734],{"class":690},[681,2892,2893,2895,2897],{"class":683,"line":1747},[681,2894,1423],{"class":686},[681,2896,731],{"class":730},[681,2898,1625],{"class":690},[681,2900,2901,2903,2905],{"class":683,"line":1757},[681,2902,1433],{"class":686},[681,2904,731],{"class":730},[681,2906,1635],{"class":690},[681,2908,2909,2911,2913],{"class":683,"line":1767},[681,2910,1443],{"class":686},[681,2912,731],{"class":730},[681,2914,1645],{"class":690},[681,2916,2917,2919,2921],{"class":683,"line":1776},[681,2918,1453],{"class":686},[681,2920,731],{"class":730},[681,2922,775],{"class":690},[681,2924,2925,2927,2929],{"class":683,"line":1781},[681,2926,1462],{"class":686},[681,2928,731],{"class":730},[681,2930,786],{"class":690},[681,2932,2933,2935,2937],{"class":683,"line":1786},[681,2934,1531],{"class":686},[681,2936,731],{"class":730},[681,2938,1438],{"class":690},[681,2940,2941,2943,2945],{"class":683,"line":1791},[681,2942,1540],{"class":686},[681,2944,731],{"class":730},[681,2946,797],{"class":721},[681,2948,2949],{"class":683,"line":1796},[681,2950,1549],{"class":721},[681,2952,2954,2956,2958],{"class":683,"line":2953},57,[681,2955,1554],{"class":686},[681,2957,731],{"class":730},[681,2959,814],{"class":690},[681,2961,2963,2965,2967],{"class":683,"line":2962},58,[681,2964,1563],{"class":686},[681,2966,731],{"class":730},[681,2968,1705],{"class":690},[681,2970,2972,2974,2976],{"class":683,"line":2971},59,[681,2973,1573],{"class":686},[681,2975,731],{"class":730},[681,2977,1715],{"class":690},[681,2979,2981,2983,2985],{"class":683,"line":2980},60,[681,2982,1583],{"class":686},[681,2984,731],{"class":730},[681,2986,847],{"class":690},[681,2988,2990,2992,2994],{"class":683,"line":2989},61,[681,2991,2778],{"class":686},[681,2993,731],{"class":730},[681,2995,858],{"class":690},[681,2997,2999,3001,3003],{"class":683,"line":2998},62,[681,3000,2787],{"class":686},[681,3002,731],{"class":730},[681,3004,869],{"class":690},[681,3006,3008,3010,3012],{"class":683,"line":3007},63,[681,3009,2796],{"class":686},[681,3011,731],{"class":730},[681,3013,880],{"class":730},[681,3015,3017],{"class":683,"line":3016},64,[681,3018,1730],{"class":721},[681,3020,3022],{"class":683,"line":3021},65,[681,3023,1549],{"class":721},[681,3025,3027,3029,3031],{"class":683,"line":3026},66,[681,3028,1554],{"class":686},[681,3030,731],{"class":730},[681,3032,901],{"class":690},[681,3034,3036,3038,3040],{"class":683,"line":3035},67,[681,3037,1563],{"class":686},[681,3039,731],{"class":730},[681,3041,2825],{"class":690},[681,3043,3045,3047,3049],{"class":683,"line":3044},68,[681,3046,1573],{"class":686},[681,3048,731],{"class":730},[681,3050,2834],{"class":690},[681,3052,3054,3056,3058],{"class":683,"line":3053},69,[681,3055,1583],{"class":686},[681,3057,731],{"class":730},[681,3059,847],{"class":690},[681,3061,3063,3065,3067],{"class":683,"line":3062},70,[681,3064,2778],{"class":686},[681,3066,731],{"class":730},[681,3068,858],{"class":690},[681,3070,3072,3074,3076],{"class":683,"line":3071},71,[681,3073,2787],{"class":686},[681,3075,731],{"class":730},[681,3077,869],{"class":690},[681,3079,3081,3083,3085],{"class":683,"line":3080},72,[681,3082,2796],{"class":686},[681,3084,731],{"class":730},[681,3086,880],{"class":730},[681,3088,3090],{"class":683,"line":3089},73,[681,3091,1593],{"class":721},[681,3093,3095],{"class":683,"line":3094},74,[681,3096,1598],{"class":721},[681,3098,3100],{"class":683,"line":3099},75,[681,3101,963],{"class":721},[681,3103,3105],{"class":683,"line":3104},76,[681,3106,969],{"class":721},[681,3108,3110],{"class":683,"line":3109},77,[681,3111,975],{"class":721},[428,3113,3115],{"id":3114},"re-export-workflow","Re-export Workflow",[407,3117,3118],{},"Component creation uses upsert semantics, so re-exporting is straightforward. There are two common patterns:",[1115,3120,3122],{"id":3121},"partial-re-export-only-changed-tiles","Partial re-export (only changed tiles)",[407,3124,3125],{},"If only some tiles in a deck changed, just upload the new assets and upsert those tiles. Unchanged tiles are left alone.",[672,3127,3131],{"className":3128,"code":3129,"language":3130,"meta":677,"style":677},"language-javascript shiki shiki-themes github-light github-dark","\u002F\u002F 1. Upload new\u002Fchanged assets via the Assets API\n\u002F\u002F 2. Upsert only the changed tiles\nawait fetch(`https:\u002F\u002Fplaytestparlor.com\u002Fapi\u002Fv1\u002Fgames\u002F${gameId}\u002Fcomponents\u002Fbatch`, {\n  method: \"POST\",\n  headers: { \"Authorization\": `Bearer ${token}`, \"Content-Type\": \"application\u002Fjson\" },\n  body: JSON.stringify({ components: changedTiles })\n});\n\u002F\u002F Existing tiles with the same externalKey are updated in place.\n\u002F\u002F Other tiles in the deck are untouched.\n","javascript",[419,3132,3133,3138,3143,3148,3153,3158,3163,3168,3173],{"__ignoreMap":677},[681,3134,3135],{"class":683,"line":28},[681,3136,3137],{},"\u002F\u002F 1. Upload new\u002Fchanged assets via the Assets API\n",[681,3139,3140],{"class":683,"line":43},[681,3141,3142],{},"\u002F\u002F 2. Upsert only the changed tiles\n",[681,3144,3145],{"class":683,"line":23},[681,3146,3147],{},"await fetch(`https:\u002F\u002Fplaytestparlor.com\u002Fapi\u002Fv1\u002Fgames\u002F${gameId}\u002Fcomponents\u002Fbatch`, {\n",[681,3149,3150],{"class":683,"line":33},[681,3151,3152],{},"  method: \"POST\",\n",[681,3154,3155],{"class":683,"line":38},[681,3156,3157],{},"  headers: { \"Authorization\": `Bearer ${token}`, \"Content-Type\": \"application\u002Fjson\" },\n",[681,3159,3160],{"class":683,"line":327},[681,3161,3162],{},"  body: JSON.stringify({ components: changedTiles })\n",[681,3164,3165],{"class":683,"line":18},[681,3166,3167],{},"});\n",[681,3169,3170],{"class":683,"line":340},[681,3171,3172],{},"\u002F\u002F Existing tiles with the same externalKey are updated in place.\n",[681,3174,3175],{"class":683,"line":757},[681,3176,3177],{},"\u002F\u002F Other tiles in the deck are untouched.\n",[1115,3179,3181],{"id":3180},"full-re-export-complete-deck-sync","Full re-export (complete deck sync)",[407,3183,3184],{},"If tiles may have been added or removed, compare the current state in PP with the full tile list from your design tool and delete any tiles that no longer exist.",[672,3186,3188],{"className":3128,"code":3187,"language":3130,"meta":677,"style":677},"\u002F\u002F 1. Get what's currently in PP\nconst { components } = await fetch(\n  `https:\u002F\u002Fplaytestparlor.com\u002Fapi\u002Fv1\u002Fgames\u002F${gameId}\u002Fcomponents`,\n  { headers: { \"Authorization\": `Bearer ${token}` } }\n).then(r => r.json());\n\n\u002F\u002F 2. Find tiles that no longer exist in the design\nconst deckKey = \"deck-my-deck-id\";\nconst currentTileKeys = new Set(myDesignTiles.map(t => t.externalKey));\nconst orphanedTiles = components.filter(c =>\n  c.parentExternalKey === deckKey && !currentTileKeys.has(c.externalKey)\n);\n\n\u002F\u002F 3. Delete orphaned tiles\nfor (const tile of orphanedTiles) {\n  await fetch(\n    `https:\u002F\u002Fplaytestparlor.com\u002Fapi\u002Fv1\u002Fgames\u002F${gameId}\u002Fcomponents\u002F${tile.id}`,\n    { method: \"DELETE\", headers: { \"Authorization\": `Bearer ${token}` } }\n  );\n}\n\n\u002F\u002F 4. Upload assets and upsert all current tiles\nawait fetch(`https:\u002F\u002Fplaytestparlor.com\u002Fapi\u002Fv1\u002Fgames\u002F${gameId}\u002Fcomponents\u002Fbatch`, {\n  method: \"POST\",\n  headers: { \"Authorization\": `Bearer ${token}`, \"Content-Type\": \"application\u002Fjson\" },\n  body: JSON.stringify({ components: allCurrentTiles })\n});\n",[419,3189,3190,3195,3200,3205,3210,3215,3219,3224,3229,3234,3239,3244,3249,3253,3258,3263,3268,3273,3278,3283,3287,3291,3296,3300,3304,3308,3313],{"__ignoreMap":677},[681,3191,3192],{"class":683,"line":28},[681,3193,3194],{},"\u002F\u002F 1. Get what's currently in PP\n",[681,3196,3197],{"class":683,"line":43},[681,3198,3199],{},"const { components } = await fetch(\n",[681,3201,3202],{"class":683,"line":23},[681,3203,3204],{},"  `https:\u002F\u002Fplaytestparlor.com\u002Fapi\u002Fv1\u002Fgames\u002F${gameId}\u002Fcomponents`,\n",[681,3206,3207],{"class":683,"line":33},[681,3208,3209],{},"  { headers: { \"Authorization\": `Bearer ${token}` } }\n",[681,3211,3212],{"class":683,"line":38},[681,3213,3214],{},").then(r => r.json());\n",[681,3216,3217],{"class":683,"line":327},[681,3218,716],{"emptyLinePlaceholder":715},[681,3220,3221],{"class":683,"line":18},[681,3222,3223],{},"\u002F\u002F 2. Find tiles that no longer exist in the design\n",[681,3225,3226],{"class":683,"line":340},[681,3227,3228],{},"const deckKey = \"deck-my-deck-id\";\n",[681,3230,3231],{"class":683,"line":757},[681,3232,3233],{},"const currentTileKeys = new Set(myDesignTiles.map(t => t.externalKey));\n",[681,3235,3236],{"class":683,"line":314},[681,3237,3238],{},"const orphanedTiles = components.filter(c =>\n",[681,3240,3241],{"class":683,"line":778},[681,3242,3243],{},"  c.parentExternalKey === deckKey && !currentTileKeys.has(c.externalKey)\n",[681,3245,3246],{"class":683,"line":789},[681,3247,3248],{},");\n",[681,3250,3251],{"class":683,"line":800},[681,3252,716],{"emptyLinePlaceholder":715},[681,3254,3255],{"class":683,"line":806},[681,3256,3257],{},"\u002F\u002F 3. Delete orphaned tiles\n",[681,3259,3260],{"class":683,"line":817},[681,3261,3262],{},"for (const tile of orphanedTiles) {\n",[681,3264,3265],{"class":683,"line":828},[681,3266,3267],{},"  await fetch(\n",[681,3269,3270],{"class":683,"line":839},[681,3271,3272],{},"    `https:\u002F\u002Fplaytestparlor.com\u002Fapi\u002Fv1\u002Fgames\u002F${gameId}\u002Fcomponents\u002F${tile.id}`,\n",[681,3274,3275],{"class":683,"line":850},[681,3276,3277],{},"    { method: \"DELETE\", headers: { \"Authorization\": `Bearer ${token}` } }\n",[681,3279,3280],{"class":683,"line":861},[681,3281,3282],{},"  );\n",[681,3284,3285],{"class":683,"line":872},[681,3286,975],{},[681,3288,3289],{"class":683,"line":883},[681,3290,716],{"emptyLinePlaceholder":715},[681,3292,3293],{"class":683,"line":889},[681,3294,3295],{},"\u002F\u002F 4. Upload assets and upsert all current tiles\n",[681,3297,3298],{"class":683,"line":894},[681,3299,3147],{},[681,3301,3302],{"class":683,"line":904},[681,3303,3152],{},[681,3305,3306],{"class":683,"line":914},[681,3307,3157],{},[681,3309,3310],{"class":683,"line":924},[681,3311,3312],{},"  body: JSON.stringify({ components: allCurrentTiles })\n",[681,3314,3315],{"class":683,"line":933},[681,3316,3167],{},[428,3318,3320],{"id":3319},"rate-limits","Rate Limits",[1324,3322,3323,3326],{},[1327,3324,3325],{},"Component create: 120 per minute",[1327,3327,3328],{},"Batch create: 10 per minute",[407,3330,3331,3332,3336],{},"See ",[3333,3334,3335],"a",{"href":36},"Errors"," for all rate limits.",[3338,3339,3340],"style",{},"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);}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 pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}",{"title":677,"searchDepth":43,"depth":43,"links":3342},[3343,3344,3345,3348,3349,3350,3351,3352,3353,3354,3358],{"id":430,"depth":43,"text":431},{"id":562,"depth":43,"text":563},{"id":652,"depth":43,"text":653,"children":3346},[3347],{"id":1117,"depth":23,"text":1118},{"id":1353,"depth":43,"text":1354},{"id":1933,"depth":43,"text":1934},{"id":2384,"depth":43,"text":2385},{"id":2450,"depth":43,"text":2451},{"id":2551,"depth":43,"text":2552},{"id":2558,"depth":43,"text":2559},{"id":3114,"depth":43,"text":3115,"children":3355},[3356,3357],{"id":3121,"depth":23,"text":3122},{"id":3180,"depth":23,"text":3181},{"id":3319,"depth":43,"text":3320},"Create, list, and delete game components (tiles, decks, tokens, etc.) in Playtest Parlor.","md",{},{"order":33},{"title":30,"description":3359},"8t2igolH9S5sQPNDieOLuNPZLUF7LaZtJ29_oz0vX2s",1778263810621]