[{"data":1,"prerenderedAt":720},["ShallowReactive",2],{"navigation_docs":3,"-oauth-mcp-and-ai-clients":224,"-oauth-mcp-and-ai-clients-surround":715},[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":216,"body":226,"description":706,"extension":707,"links":708,"meta":709,"navigation":710,"path":217,"seo":711,"stem":218,"__hash__":714},"docs\u002F4.oauth\u002F8.mcp-and-ai-clients.md",{"type":227,"value":228,"toc":701},"minimark",[229,245,255,260,354,551,558,568,572,575,677,681,691,694,697],[230,231,232,233,240,241,244],"p",{},"An agent connecting to Sporty has no human available to fill in a registration form first, so\nSporty supports ",[234,235,239],"a",{"href":236,"rel":237},"https:\u002F\u002Fwww.rfc-editor.org\u002Frfc\u002Frfc7591",[238],"nofollow","RFC 7591"," dynamic client\nregistration. A client registers itself, then runs the ordinary\n",[234,242,243],{"href":197},"authorization code flow",".",[246,247,249,250,254],"callout",{"icon":248},"i-heroicons-information-circle","Dynamic registration is not enabled on every environment. If it is off you get ",[251,252,253],"code",{},"403 access_denied",", and the way in is a client registered by a club administrator instead.",[256,257,259],"h2",{"id":258},"registering","Registering",[261,262,267],"pre",{"className":263,"code":264,"language":265,"meta":266,"style":266},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -X POST https:\u002F\u002Fapi.sporty.plus\u002Foauth2\u002Fregister \\\n  -H 'Content-Type: application\u002Fjson' \\\n  -d '{\n    \"client_name\": \"My Agent\",\n    \"redirect_uris\": [\"http:\u002F\u002F127.0.0.1:8976\u002Fcallback\"],\n    \"client_uri\": \"https:\u002F\u002Fmyagent.example\",\n    \"contacts\": [\"you@example.com\"]\n  }'\n","bash","",[251,268,269,292,310,321,327,333,339,345],{"__ignoreMap":266},[270,271,274,278,282,285,288],"span",{"class":272,"line":273},"line",1,[270,275,277],{"class":276},"sBMFI","curl",[270,279,281],{"class":280},"sfazB"," -X",[270,283,284],{"class":280}," POST",[270,286,287],{"class":280}," https:\u002F\u002Fapi.sporty.plus\u002Foauth2\u002Fregister",[270,289,291],{"class":290},"sTEyZ"," \\\n",[270,293,295,298,302,305,308],{"class":272,"line":294},2,[270,296,297],{"class":280},"  -H",[270,299,301],{"class":300},"sMK4o"," '",[270,303,304],{"class":280},"Content-Type: application\u002Fjson",[270,306,307],{"class":300},"'",[270,309,291],{"class":290},[270,311,313,316,318],{"class":272,"line":312},3,[270,314,315],{"class":280},"  -d",[270,317,301],{"class":300},[270,319,320],{"class":280},"{\n",[270,322,324],{"class":272,"line":323},4,[270,325,326],{"class":280},"    \"client_name\": \"My Agent\",\n",[270,328,330],{"class":272,"line":329},5,[270,331,332],{"class":280},"    \"redirect_uris\": [\"http:\u002F\u002F127.0.0.1:8976\u002Fcallback\"],\n",[270,334,336],{"class":272,"line":335},6,[270,337,338],{"class":280},"    \"client_uri\": \"https:\u002F\u002Fmyagent.example\",\n",[270,340,342],{"class":272,"line":341},7,[270,343,344],{"class":280},"    \"contacts\": [\"you@example.com\"]\n",[270,346,348,351],{"class":272,"line":347},8,[270,349,350],{"class":280},"  }",[270,352,353],{"class":300},"'\n",[261,355,359],{"className":356,"code":357,"language":358,"meta":266,"style":266},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"client_id\": \"01a09ad5-1469-7260-8157-bba3655a2fdf\",\n  \"client_id_issued_at\": 1789304059,\n  \"client_name\": \"My Agent\",\n  \"redirect_uris\": [\"http:\u002F\u002F127.0.0.1:8976\u002Fcallback\"],\n  \"grant_types\": [\"authorization_code\", \"refresh_token\"],\n  \"response_types\": [\"code\"],\n  \"token_endpoint_auth_method\": \"none\",\n  \"scope\": \"openid profile email me.read me.reservations.read\"\n}\n","json",[251,360,361,365,391,408,428,452,484,505,525,545],{"__ignoreMap":266},[270,362,363],{"class":272,"line":273},[270,364,320],{"class":300},[270,366,367,370,374,377,380,383,386,388],{"class":272,"line":294},[270,368,369],{"class":300},"  \"",[270,371,373],{"class":372},"spNyl","client_id",[270,375,376],{"class":300},"\"",[270,378,379],{"class":300},":",[270,381,382],{"class":300}," \"",[270,384,385],{"class":280},"01a09ad5-1469-7260-8157-bba3655a2fdf",[270,387,376],{"class":300},[270,389,390],{"class":300},",\n",[270,392,393,395,398,400,402,406],{"class":272,"line":312},[270,394,369],{"class":300},[270,396,397],{"class":372},"client_id_issued_at",[270,399,376],{"class":300},[270,401,379],{"class":300},[270,403,405],{"class":404},"sbssI"," 1789304059",[270,407,390],{"class":300},[270,409,410,412,415,417,419,421,424,426],{"class":272,"line":323},[270,411,369],{"class":300},[270,413,414],{"class":372},"client_name",[270,416,376],{"class":300},[270,418,379],{"class":300},[270,420,382],{"class":300},[270,422,423],{"class":280},"My Agent",[270,425,376],{"class":300},[270,427,390],{"class":300},[270,429,430,432,435,437,439,442,444,447,449],{"class":272,"line":329},[270,431,369],{"class":300},[270,433,434],{"class":372},"redirect_uris",[270,436,376],{"class":300},[270,438,379],{"class":300},[270,440,441],{"class":300}," [",[270,443,376],{"class":300},[270,445,446],{"class":280},"http:\u002F\u002F127.0.0.1:8976\u002Fcallback",[270,448,376],{"class":300},[270,450,451],{"class":300},"],\n",[270,453,454,456,459,461,463,465,467,470,472,475,477,480,482],{"class":272,"line":335},[270,455,369],{"class":300},[270,457,458],{"class":372},"grant_types",[270,460,376],{"class":300},[270,462,379],{"class":300},[270,464,441],{"class":300},[270,466,376],{"class":300},[270,468,469],{"class":280},"authorization_code",[270,471,376],{"class":300},[270,473,474],{"class":300},",",[270,476,382],{"class":300},[270,478,479],{"class":280},"refresh_token",[270,481,376],{"class":300},[270,483,451],{"class":300},[270,485,486,488,491,493,495,497,499,501,503],{"class":272,"line":341},[270,487,369],{"class":300},[270,489,490],{"class":372},"response_types",[270,492,376],{"class":300},[270,494,379],{"class":300},[270,496,441],{"class":300},[270,498,376],{"class":300},[270,500,251],{"class":280},[270,502,376],{"class":300},[270,504,451],{"class":300},[270,506,507,509,512,514,516,518,521,523],{"class":272,"line":347},[270,508,369],{"class":300},[270,510,511],{"class":372},"token_endpoint_auth_method",[270,513,376],{"class":300},[270,515,379],{"class":300},[270,517,382],{"class":300},[270,519,520],{"class":280},"none",[270,522,376],{"class":300},[270,524,390],{"class":300},[270,526,528,530,533,535,537,539,542],{"class":272,"line":527},9,[270,529,369],{"class":300},[270,531,532],{"class":372},"scope",[270,534,376],{"class":300},[270,536,379],{"class":300},[270,538,382],{"class":300},[270,540,541],{"class":280},"openid profile email me.read me.reservations.read",[270,543,544],{"class":300},"\"\n",[270,546,548],{"class":272,"line":547},10,[270,549,550],{"class":300},"}\n",[230,552,553,554,557],{},"There is no ",[251,555,556],{},"client_secret",": a self-registered client is public, and PKCE is what protects it.\nLoopback redirect URIs are allowed precisely for this case, and the port is ignored when\nmatching.",[230,559,560,561,564,565,244],{},"Discovery for a plain OAuth client is at\n",[251,562,563],{},"https:\u002F\u002Fapi.sporty.plus\u002F.well-known\u002Foauth-authorization-server",", and the resource you are\nreaching for is described at ",[251,566,567],{},"\u002F.well-known\u002Foauth-protected-resource",[256,569,571],{"id":570},"what-a-self-registered-client-is-limited-to","What a self-registered client is limited to",[230,573,574],{},"All of this is deliberate, and none of it is negotiable per client:",[576,577,578,586,601,659,665,671],"ul",{},[579,580,581,585],"li",{},[582,583,584],"strong",{},"Public and PKCE-only."," No secret exists to leak.",[579,587,588,596,597,600],{},[582,589,590,592,593,595],{},[251,591,469],{}," and ",[251,594,479],{}," only."," Never ",[251,598,599],{},"client_credentials"," — an agent\nnever acts with no member present.",[579,602,603,618,619,622,623,625,626,629,630,636,637,651,654,655,658],{},[582,604,605,608,609,608,612,592,615,595],{},[251,606,607],{},"openid",", ",[251,610,611],{},"profile",[251,613,614],{},"email",[251,616,617],{},"me.*"," It can never ask for a club's data. An\nintegration that needs ",[251,620,621],{},"club.*"," is one a club administrator registers. All of the ",[251,624,617],{}," scopes\n",[234,627,628],{"href":201},"are available"," (on ",[234,631,633],{"href":632},"\u002Foauth\u002Fpartner-api#get-me",[251,634,635],{},"\u002Fme","):",[576,638,639,642,645,648],{},[579,640,641],{},"the member's profile;",[579,643,644],{},"their bookings, and booking or cancelling a court for them;",[579,646,647],{},"their match results;",[579,649,650],{},"their clubs and memberships.",[652,653],"br",{},"An agent booking for a member should show them the price. When ",[251,656,657],{},"needs_payment"," is true, it\nshould tell them they pay in the Sporty app.",[579,660,661,664],{},[582,662,663],{},"Consent is never skipped",", even for a member who has approved it before.",[579,666,667,670],{},[582,668,669],{},"Short-lived tokens"," — fifteen minutes, refreshable for a day.",[579,672,673,676],{},[582,674,675],{},"Rate-limited registration",", a handful per hour per address.",[256,678,680],{"id":679},"pending-review","Pending review",[230,682,683,684,687,688,244],{},"A self-registered client is ",[582,685,686],{},"pending",", and a pending client works ",[582,689,690],{},"only for the account\nthat registered it",[230,692,693],{},"That is what makes open registration safe rather than alarming: you can build and test the\nwhole flow immediately, and until we have looked at your application nobody else's account\nis reachable by it. The member is also told on the consent screen that the application has\nnot been reviewed.",[230,695,696],{},"When you want it available to other people, get in touch. Review is a conversation about what\nyour agent does and which scopes it genuinely needs, not a form.",[698,699,700],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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 .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":266,"searchDepth":294,"depth":294,"links":702},[703,704,705],{"id":258,"depth":294,"text":259},{"id":570,"depth":294,"text":571},{"id":679,"depth":294,"text":680},"Dynamic client registration, and what a self-registered client can and cannot do.","md",null,{},{"icon":190},{"title":712,"description":713},"Sporty dynamic client registration for MCP and AI agents","RFC 7591 registration, the limits on a self-registered client, and the review step.","pw4n6PC5U57IIEIVbeEaTL9qFGJwHkpbQTcuvBrnCkM",[716,718],{"title":212,"path":213,"stem":214,"description":717,"icon":190,"children":-1},"Keep your booking system and a club's Sporty diary in agreement, in both directions.",{"title":220,"path":221,"stem":222,"description":719,"icon":223,"children":-1},"Let an AI agent find free court time at a club and pay for it, through the Agentic Commerce Protocol or MCP.",1790691909306]