[{"data":1,"prerenderedAt":447},["ShallowReactive",2],{"navigation_docs":3,"-oauth-clients":224,"-oauth-clients-surround":442},[4,157,184],{"title":5,"path":6,"stem":7,"children":8,"page":156},"Interface","\u002Finterface","1.interface",[9,53,61,68,75,82,90,97,104,111,132,139,145],{"title":10,"path":11,"stem":12,"children":13,"icon":15},"Courts","\u002Finterface\u002Fcourts","1.interface\u002F01.courts\u002F1.index",[14,16],{"title":10,"path":11,"stem":12,"icon":15},"sporty-court-sport",{"title":17,"path":18,"stem":19,"children":20,"icon":22},"Access control and lights","\u002Finterface\u002Fcourts\u002Fintegrations","1.interface\u002F01.courts\u002F5.integrations\u002F1.index",[21,23,28,33],{"title":17,"path":18,"stem":19,"icon":22},"sporty-toggle-large-on",{"title":24,"path":25,"stem":26,"icon":27},"Weblock","\u002Finterface\u002Fcourts\u002Fintegrations\u002Fweblock","1.interface\u002F01.courts\u002F5.integrations\u002F2.weblock","sporty-door-open",{"title":29,"path":30,"stem":31,"icon":32},"Shelly","\u002Finterface\u002Fcourts\u002Fintegrations\u002Fshelly","1.interface\u002F01.courts\u002F5.integrations\u002F3.shelly","sporty-bolt",{"title":34,"path":35,"stem":36,"children":37,"icon":27},"UniFi Access","\u002Finterface\u002Fcourts\u002Fintegrations\u002Funifi-access","1.interface\u002F01.courts\u002F5.integrations\u002F4.unifi-access\u002F1.index",[38,40,44,49],{"title":39,"path":35,"stem":36,"icon":27},"Overview",{"title":41,"path":42,"stem":43,"icon":22},"Connect the VPN","\u002Finterface\u002Fcourts\u002Fintegrations\u002Funifi-access\u002Fvpn","1.interface\u002F01.courts\u002F5.integrations\u002F4.unifi-access\u002F2.vpn",{"title":45,"path":46,"stem":47,"icon":48},"Create an API token","\u002Finterface\u002Fcourts\u002Fintegrations\u002Funifi-access\u002Fapi-token","1.interface\u002F01.courts\u002F5.integrations\u002F4.unifi-access\u002F3.api-token","sporty-gear",{"title":50,"path":51,"stem":52,"icon":15},"Set it up in Club Admin","\u002Finterface\u002Fcourts\u002Fintegrations\u002Funifi-access\u002Fclub-admin","1.interface\u002F01.courts\u002F5.integrations\u002F4.unifi-access\u002F4.club-admin",{"title":54,"path":55,"stem":56,"children":57,"icon":60},"Members","\u002Finterface\u002Fmembers","1.interface\u002F02.members\u002F1.index",[58],{"title":59,"path":55,"stem":56,"icon":60},"Member management","sporty-user-group",{"title":62,"path":63,"stem":64,"children":65,"icon":67},"Memberships","\u002Finterface\u002Fmemberships","1.interface\u002F03.memberships\u002F1.index",[66],{"title":62,"path":63,"stem":64,"icon":67},"sporty-id-card",{"title":69,"path":70,"stem":71,"children":72,"icon":74},"Leagues","\u002Finterface\u002Fleagues","1.interface\u002F04.leagues\u002F1.index",[73],{"title":69,"path":70,"stem":71,"icon":74},"sporty-ranking-star",{"title":76,"path":77,"stem":78,"children":79,"icon":81},"Tournaments","\u002Finterface\u002Ftournaments","1.interface\u002F05.tournaments\u002F1.index",[80],{"title":76,"path":77,"stem":78,"icon":81},"sporty-trophy",{"title":83,"path":84,"stem":85,"children":86,"icon":89},"Payments and subscriptions","\u002Finterface\u002Fpayments","1.interface\u002F06.payments\u002F1.index",[87],{"title":88,"path":84,"stem":85,"icon":89},"Payments","sporty-credit-card",{"title":91,"path":92,"stem":93,"children":94,"icon":96},"Shop","\u002Finterface\u002Fshop","1.interface\u002F07.shop\u002F1.index",[95],{"title":91,"path":92,"stem":93,"icon":96},"sporty-bag-shopping",{"title":98,"path":99,"stem":100,"children":101,"icon":103},"Schools and coaches","\u002Finterface\u002Fschools","1.interface\u002F08.schools\u002F1.index",[102],{"title":98,"path":99,"stem":100,"icon":103},"sporty-graduation-cap",{"title":105,"path":106,"stem":107,"children":108,"icon":110},"Emails","\u002Finterface\u002Femails","1.interface\u002F09.emails\u002F1.index",[109],{"title":105,"path":106,"stem":107,"icon":110},"sporty-envelope",{"title":112,"path":113,"stem":114,"children":115,"icon":117},"Video and cameras","\u002Finterface\u002Fvideo","1.interface\u002F10.video\u002F1.index",[116,118,122,127],{"title":112,"path":113,"stem":114,"icon":117},"sporty-camera-cctv",{"title":119,"path":120,"stem":121,"icon":117},"Dahua cameras","\u002Finterface\u002Fvideo\u002Fdahua","1.interface\u002F10.video\u002F2.dahua",{"title":123,"path":124,"stem":125,"icon":126},"Other RTMP cameras","\u002Finterface\u002Fvideo\u002Frtmp","1.interface\u002F10.video\u002F3.rtmp","sporty-video",{"title":128,"path":129,"stem":130,"icon":131},"Match analytics","\u002Finterface\u002Fvideo\u002Fanalytics","1.interface\u002F10.video\u002F4.analytics","sporty-chart-simple",{"title":133,"path":134,"stem":135,"children":136,"icon":138},"Reports","\u002Finterface\u002Freports","1.interface\u002F11.reports\u002F1.index",[137],{"title":133,"path":134,"stem":135,"icon":138},"sporty-chart-mixed",{"title":140,"path":141,"stem":142,"children":143,"icon":48},"Settings","\u002Finterface\u002Fsettings","1.interface\u002F12.settings\u002F1.index",[144],{"title":140,"path":141,"stem":142,"icon":48},{"title":146,"path":147,"stem":148,"children":149,"icon":151},"Social publishing","\u002Finterface\u002Fsocial","1.interface\u002F13.social\u002F1.index",[150,152],{"title":146,"path":147,"stem":148,"icon":151},"sporty-newspaper",{"title":153,"path":154,"stem":155,"icon":22},"Connecting channels","\u002Finterface\u002Fsocial\u002Fchannels","1.interface\u002F13.social\u002F2.channels",false,{"title":158,"path":159,"stem":160,"children":161,"icon":164},"Website","\u002Fwebsite","2.website\u002F1.index",[162,165,170,174,179],{"title":163,"path":159,"stem":160,"icon":164},"Website builder","sporty-browser",{"title":166,"path":167,"stem":168,"icon":169},"Pages, hero and footer","\u002Fwebsite\u002Fpages","2.website\u002F2.pages","sporty-file-lines",{"title":171,"path":172,"stem":173,"icon":151},"News and events","\u002Fwebsite\u002Fnews-and-events","2.website\u002F3.news-and-events",{"title":175,"path":176,"stem":177,"icon":178},"Coaches and gallery","\u002Fwebsite\u002Fcoaches-and-gallery","2.website\u002F4.coaches-and-gallery","sporty-images",{"title":180,"path":181,"stem":182,"icon":183},"FAQ and sponsors","\u002Fwebsite\u002Ffaq-and-sponsors","2.website\u002F5.faq-and-sponsors","sporty-circle-question",{"title":185,"path":186,"stem":187,"children":188,"icon":190},"OAuth & Sign in with Sporty","\u002Foauth","4.oauth\u002F1.index",[189,191,195,199,203,207,211,215,219],{"title":185,"path":186,"stem":187,"icon":190},"sporty-brackets-curly",{"title":192,"path":193,"stem":194,"icon":190},"Registering an application","\u002Foauth\u002Fclients","4.oauth\u002F2.clients",{"title":196,"path":197,"stem":198,"icon":190},"The authorization code flow","\u002Foauth\u002Fauthorization-code","4.oauth\u002F3.authorization-code",{"title":200,"path":201,"stem":202,"icon":190},"Scopes","\u002Foauth\u002Fscopes","4.oauth\u002F4.scopes",{"title":204,"path":205,"stem":206,"icon":190},"Sign in with Sporty","\u002Foauth\u002Fsign-in-with-sporty","4.oauth\u002F5.sign-in-with-sporty",{"title":208,"path":209,"stem":210,"icon":190},"The partner API","\u002Foauth\u002Fpartner-api","4.oauth\u002F6.partner-api",{"title":212,"path":213,"stem":214,"icon":190},"Syncing bookings","\u002Foauth\u002Fbooking-sync","4.oauth\u002F7.booking-sync",{"title":216,"path":217,"stem":218,"icon":190},"MCP and AI clients","\u002Foauth\u002Fmcp-and-ai-clients","4.oauth\u002F8.mcp-and-ai-clients",{"title":220,"path":221,"stem":222,"icon":223},"Agent checkout","\u002Foauth\u002Fagent-checkout","4.oauth\u002F9.agent-checkout","sporty-cart-shopping",{"id":225,"title":192,"body":226,"description":433,"extension":434,"links":435,"meta":436,"navigation":437,"path":193,"seo":438,"stem":194,"__hash__":441},"docs\u002F4.oauth\u002F2.clients.md",{"type":227,"value":228,"toc":425},"minimark",[229,233,296,301,304,342,363,367,374,381,384,388,391,398,401,405,408,422],[230,231,232],"p",{},"There are three ways to get a client id.",[234,235,236,252],"table",{},[237,238,239],"thead",{},[240,241,242,246,249],"tr",{},[243,244,245],"th",{},"How",[243,247,248],{},"Who",[243,250,251],{},"What you get",[253,254,255,271,282],"tbody",{},[240,256,257,265,268],{},[258,259,260,261],"td",{},"A club administrator registers it in the Sporty admin, under ",[262,263,264],"strong",{},"Settings → API clients",[258,266,267],{},"Anyone building for one club",[258,269,270],{},"A confidential client, already approved, tied to that club",[240,272,273,276,279],{},[258,274,275],{},"We register it for you",[258,277,278],{},"Partners integrating across many clubs",[258,280,281],{},"A confidential client, plus a per-club grant for each club that agrees",[240,283,284,290,293],{},[258,285,286],{},[287,288,289],"a",{"href":217},"Dynamic registration",[258,291,292],{},"Agents and MCP clients",[258,294,295],{},"A public client, pending review",[297,298,300],"h2",{"id":299},"redirect-uris","Redirect URIs",[230,302,303],{},"The authorization code is delivered to whatever you register here, so this is the one setting\nworth getting exactly right. We enforce:",[305,306,307,318,328,336],"ul",{},[308,309,310,317],"li",{},[262,311,312,316],{},[313,314,315],"code",{},"https"," only"," — with one exception below",[308,319,320,323,324,327],{},[262,321,322],{},"no wildcards"," — ",[313,325,326],{},"https:\u002F\u002F*.example.com\u002Fcb"," is refused",[308,329,330,323,333,327],{},[262,331,332],{},"no fragments",[313,334,335],{},"https:\u002F\u002Fexample.com\u002Fcb#anything",[308,337,338,341],{},[262,339,340],{},"exact match"," at authorization time; a URI that is merely similar is not accepted",[230,343,344,345,347,348,351,352,355,356,362],{},"The exception is the loopback address. A desktop, CLI or native application has no ",[313,346,315],{},"\naddress of its own, so ",[313,349,350],{},"http:\u002F\u002F127.0.0.1\u002Fcallback"," and ",[313,353,354],{},"http:\u002F\u002Flocalhost\u002Fcallback"," are\nallowed, and the port is ignored when matching (",[287,357,361],{"href":358,"rel":359},"https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc8252",[360],"nofollow","RFC 8252",").",[297,364,366],{"id":365},"client-secrets","Client secrets",[230,368,369,370,373],{},"A confidential client gets a secret ",[262,371,372],{},"once",", in the response that creates it. It is stored\nhashed, so nobody — including us — can read it back. If it is lost, rotate it and update your\napplication.",[230,375,376,377,380],{},"Rotating a secret does ",[262,378,379],{},"not"," revoke existing tokens. Sessions your application already holds\nkeep working; only new token requests need the new secret.",[230,382,383],{},"A public client (anything that cannot keep a secret: a browser app, a mobile app, a CLI) has\nno secret at all. PKCE is what protects it, and PKCE is required for every client regardless.",[297,385,387],{"id":386},"approval","Approval",[230,389,390],{},"A client registered by a club administrator, or by us, is approved from the start.",[230,392,393,394,397],{},"A client that registered itself is ",[262,395,396],{},"pending",". It works — but only for the account that\nregistered it. That is deliberate: you can build and test an integration end to end before\nanyone at Sporty has spoken to you, and until we have reviewed it nobody else's account is\nexposed. When you are ready, contact us and we will review it.",[230,399,400],{},"A member is told, on the consent screen, when an application has not been reviewed.",[297,402,404],{"id":403},"being-removed","Being removed",[230,406,407],{},"Two things can end an integration:",[305,409,410,416],{},[308,411,412,415],{},[262,413,414],{},"Deleting"," the application (its owner) revokes every token immediately.",[308,417,418,421],{},[262,419,420],{},"Banning"," it (Sporty staff) does the same and refuses new ones. Reserved for applications\ndoing something they should not.",[230,423,424],{},"Neither is reversible from your side, and neither is a surprise — we will have talked to you\nfirst unless something is actively going wrong.",{"title":426,"searchDepth":427,"depth":427,"links":428},"",2,[429,430,431,432],{"id":299,"depth":427,"text":300},{"id":365,"depth":427,"text":366},{"id":386,"depth":427,"text":387},{"id":403,"depth":427,"text":404},"How to get a client id, what a redirect URI may look like, and what \"pending review\" means.","md",null,{},{"icon":190},{"title":439,"description":440},"Registering an OAuth application with Sporty","Client ids, secrets, redirect URIs and the approval step.","giik2uSH58gFB-75ji_j59vUU84sCbLj48_wnz22Ja4",[443,445],{"title":185,"path":186,"stem":187,"description":444,"icon":190,"children":-1},"Let people connect your application to their Sporty account, with their permission and nothing more.",{"title":196,"path":197,"stem":198,"description":446,"icon":190,"children":-1},"The whole flow with real requests, from sending someone to Sporty to refreshing a token.",1790691909306]