[{"data":1,"prerenderedAt":842},["ShallowReactive",2],{"docs-navigation":3,"docs-page:\u002Fdocs\u002Fapi\u002Fauthentication":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":25,"body":403,"description":836,"extension":837,"meta":838,"navigation":839,"path":26,"seo":840,"stem":27,"__hash__":841},"docs\u002Fdocs\u002Fapi\u002Fauthentication.md",{"type":404,"value":405,"toc":824},"minimark",[406,410,415,418,443,447,452,455,465,471,491,495,501,507,510,514,517,584,589,646,651,705,716,721,747,751,758,784,788,791,795,809,813,820],[407,408,409],"p",{},"Playtest Parlor uses OAuth2 to authenticate API requests. Users authorize your app once, and you receive a long-lived token to make API calls on their behalf.",[411,412,414],"h2",{"id":413},"register-your-app","Register Your App",[407,416,417],{},"Before you can authenticate users, register your application:",[419,420,421,430,433,436],"ol",{},[422,423,424,425],"li",{},"Go to ",[426,427,429],"a",{"href":428},"\u002Fsettings\u002Fdeveloper-apps","Settings > Developer Apps",[422,431,432],{},"Click \"Create New Application\"",[422,434,435],{},"Enter your app name and redirect URI (where you want users returned after approval)",[422,437,438,439],{},"Submit to receive your ",[440,441,442],"code",{},"client_id",[411,444,446],{"id":445},"authorization-flow","Authorization Flow",[448,449,451],"h3",{"id":450},"step-1-redirect-user-to-authorize-page","Step 1: Redirect User to Authorize Page",[407,453,454],{},"Build this URL and redirect your user to it:",[456,457,462],"pre",{"className":458,"code":460,"language":461},[459],"language-text","https:\u002F\u002Fplaytestparlor.com\u002Fauthorize?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&state=STATE\n","text",[440,463,460],{"__ignoreMap":464},"",[407,466,467],{},[468,469,470],"strong",{},"Parameters:",[472,473,474,479,485],"ul",{},[422,475,476,478],{},[440,477,442],{}," (required): Your app's client ID from the developer portal",[422,480,481,484],{},[440,482,483],{},"redirect_uri"," (required): Must match exactly the redirect URI registered for your app",[422,486,487,490],{},[440,488,489],{},"state"," (recommended): An opaque string you generate to prevent CSRF attacks. Playtest Parlor will return it unchanged; verify it matches your original value",[448,492,494],{"id":493},"step-2-user-approves","Step 2: User Approves",[407,496,497,498,500],{},"The user sees a page asking them to approve access. If they approve, their browser redirects to your ",[440,499,483],{}," with these parameters:",[456,502,505],{"className":503,"code":504,"language":461},[459],"https:\u002F\u002Fyour-app.example.com\u002Fcallback?code=AUTH_CODE&state=STATE\n",[440,506,504],{"__ignoreMap":464},[407,508,509],{},"If they deny, they are returned without a code.",[448,511,513],{"id":512},"step-3-exchange-code-for-token","Step 3: Exchange Code for Token",[407,515,516],{},"On your server, make this POST request:",[456,518,522],{"className":519,"code":520,"language":521,"meta":464,"style":464},"language-bash shiki shiki-themes github-light github-dark","curl -X POST https:\u002F\u002Fplaytestparlor.com\u002Fapi\u002Fv1\u002Ftoken \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"client_id\": \"YOUR_CLIENT_ID\",\n    \"code\": \"AUTH_CODE\",\n    \"redirect_uri\": \"YOUR_REDIRECT_URI\"\n  }'\n","bash",[440,523,524,546,556,564,569,574,579],{"__ignoreMap":464},[525,526,528,532,536,540,543],"span",{"class":527,"line":28},"line",[525,529,531],{"class":530},"sScJk","curl",[525,533,535],{"class":534},"sj4cs"," -X",[525,537,539],{"class":538},"sZZnC"," POST",[525,541,542],{"class":538}," https:\u002F\u002Fplaytestparlor.com\u002Fapi\u002Fv1\u002Ftoken",[525,544,545],{"class":534}," \\\n",[525,547,548,551,554],{"class":527,"line":43},[525,549,550],{"class":534},"  -H",[525,552,553],{"class":538}," \"Content-Type: application\u002Fjson\"",[525,555,545],{"class":534},[525,557,558,561],{"class":527,"line":23},[525,559,560],{"class":534},"  -d",[525,562,563],{"class":538}," '{\n",[525,565,566],{"class":527,"line":33},[525,567,568],{"class":538},"    \"client_id\": \"YOUR_CLIENT_ID\",\n",[525,570,571],{"class":527,"line":38},[525,572,573],{"class":538},"    \"code\": \"AUTH_CODE\",\n",[525,575,576],{"class":527,"line":327},[525,577,578],{"class":538},"    \"redirect_uri\": \"YOUR_REDIRECT_URI\"\n",[525,580,581],{"class":527,"line":18},[525,582,583],{"class":538},"  }'\n",[407,585,586],{},[468,587,588],{},"Request Body:",[590,591,592,608],"table",{},[593,594,595],"thead",{},[596,597,598,602,605],"tr",{},[599,600,601],"th",{},"Field",[599,603,604],{},"Type",[599,606,607],{},"Description",[609,610,611,624,635],"tbody",{},[596,612,613,618,621],{},[614,615,616],"td",{},[440,617,442],{},[614,619,620],{},"string",[614,622,623],{},"Your app's client ID",[596,625,626,630,632],{},[614,627,628],{},[440,629,440],{},[614,631,620],{},[614,633,634],{},"The authorization code from step 2",[596,636,637,641,643],{},[614,638,639],{},[440,640,483],{},[614,642,620],{},[614,644,645],{},"Must match the registered redirect URI and the one used in step 1",[407,647,648],{},[468,649,650],{},"Response:",[456,652,656],{"className":653,"code":654,"language":655,"meta":464,"style":464},"language-json shiki shiki-themes github-light github-dark","{\n  \"token\": \"pp_1a2b3c4d5e6f7g8h\",\n  \"token_type\": \"bearer\",\n  \"expires_in\": null\n}\n","json",[440,657,658,664,678,690,700],{"__ignoreMap":464},[525,659,660],{"class":527,"line":28},[525,661,663],{"class":662},"sVt8B","{\n",[525,665,666,669,672,675],{"class":527,"line":43},[525,667,668],{"class":534},"  \"token\"",[525,670,671],{"class":662},": ",[525,673,674],{"class":538},"\"pp_1a2b3c4d5e6f7g8h\"",[525,676,677],{"class":662},",\n",[525,679,680,683,685,688],{"class":527,"line":23},[525,681,682],{"class":534},"  \"token_type\"",[525,684,671],{"class":662},[525,686,687],{"class":538},"\"bearer\"",[525,689,677],{"class":662},[525,691,692,695,697],{"class":527,"line":33},[525,693,694],{"class":534},"  \"expires_in\"",[525,696,671],{"class":662},[525,698,699],{"class":534},"null\n",[525,701,702],{"class":527,"line":38},[525,703,704],{"class":662},"}\n",[407,706,707,708,711,712,715],{},"The ",[440,709,710],{},"token"," is a long-lived bearer token. Store it securely (encrypted in a database). The ",[440,713,714],{},"expires_in"," field is currently null; your token is valid until the user revokes it.",[407,717,718],{},[468,719,720],{},"Errors:",[472,722,723,729,735,741],{},[422,724,725,728],{},[440,726,727],{},"INVALID_CODE",": The code is invalid or has expired (valid for 10 minutes)",[422,730,731,734],{},[440,732,733],{},"CODE_EXPIRED",": The authorization code has expired",[422,736,737,740],{},[440,738,739],{},"REDIRECT_URI_MISMATCH",": The redirect_uri doesn't match the registered value",[422,742,743,746],{},[440,744,745],{},"CLIENT_ID_MISMATCH",": The client_id is invalid or doesn't match the code",[411,748,750],{"id":749},"using-your-token","Using Your Token",[407,752,753,754,757],{},"Include the token in the ",[440,755,756],{},"Authorization"," header for all API requests:",[456,759,761],{"className":519,"code":760,"language":521,"meta":464,"style":464},"curl -X GET https:\u002F\u002Fplaytestparlor.com\u002Fapi\u002Fv1\u002Fgames \\\n  -H \"Authorization: Bearer pp_1a2b3c4d5e6f7g8h\"\n",[440,762,763,777],{"__ignoreMap":464},[525,764,765,767,769,772,775],{"class":527,"line":28},[525,766,531],{"class":530},[525,768,535],{"class":534},[525,770,771],{"class":538}," GET",[525,773,774],{"class":538}," https:\u002F\u002Fplaytestparlor.com\u002Fapi\u002Fv1\u002Fgames",[525,776,545],{"class":534},[525,778,779,781],{"class":527,"line":43},[525,780,550],{"class":534},[525,782,783],{"class":538}," \"Authorization: Bearer pp_1a2b3c4d5e6f7g8h\"\n",[411,785,787],{"id":786},"token-management","Token Management",[407,789,790],{},"Tokens are long-lived and do not expire automatically. Users can revoke tokens from their account Settings at any time. If a request returns a 401 UNAUTHORIZED error, the token may have been revoked; prompt the user to authorize again.",[411,792,794],{"id":793},"token-security","Token Security",[472,796,797,800,803,806],{},[422,798,799],{},"Store tokens encrypted in your database",[422,801,802],{},"Never expose tokens in logs, error messages, or client-side code",[422,804,805],{},"Transmit tokens only over HTTPS",[422,807,808],{},"Treat tokens with the same care as passwords",[411,810,812],{"id":811},"rate-limits","Rate Limits",[407,814,815,816,819],{},"Token exchange requests are rate limited to 5 per minute per user. See ",[426,817,818],{"href":36},"Errors"," for all rate limits.",[821,822,823],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}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 .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}",{"title":464,"searchDepth":43,"depth":43,"links":825},[826,827,832,833,834,835],{"id":413,"depth":43,"text":414},{"id":445,"depth":43,"text":446,"children":828},[829,830,831],{"id":450,"depth":23,"text":451},{"id":493,"depth":23,"text":494},{"id":512,"depth":23,"text":513},{"id":749,"depth":43,"text":750},{"id":786,"depth":43,"text":787},{"id":793,"depth":43,"text":794},{"id":811,"depth":43,"text":812},"Register your app, get authorization from users, and exchange codes for bearer tokens to access the Playtest Parlor API.","md",{},{"order":28},{"title":25,"description":836},"Njl5LiivdrzWQ_K10GWJmIoPhfiAMD4KTSqmrdS3qPw",1778263810617]