[{"data":1,"prerenderedAt":1009},["ShallowReactive",2],{"/api/overview/authentication":3,"/api/overview/authentication-surround":999},{"id":4,"title":5,"body":6,"description":991,"extension":992,"links":993,"meta":994,"navigation":484,"path":995,"seo":996,"stem":997,"__hash__":998},"docs/api/1.overview/authentication.md","Authentication",{"type":7,"value":8,"toc":972},"minimark",[9,18,28,33,40,45,48,80,85,97,113,117,128,132,146,149,153,160,173,180,190,198,293,299,303,332,336,339,347,366,370,373,414,418,423,429,433,439,449,459,463,516,525,530,575,579,582,613,620,627,631,634,643,649,653,663,670,680,683,688,711,770,774,781,786,843,864,868,876,968],[10,11,12,13,17],"p",{},"The Capacities API uses ",[14,15,16],"strong",{},"Bearer authentication"," (token-based, OAuth 2.0 RFC 6750). Which method to use depends on who you are building for.",[19,20,21],"warning",{},[10,22,23,24,27],{},"Always use ",[14,25,26],{},"HTTPS",". Never expose your access token in client-side code or public repositories.",[29,30,32],"h2",{"id":31},"personal-api-token","Personal API token",[10,34,35,36,39],{},"Use a personal token when you are building something ",[14,37,38],{},"for yourself",": a local script, a personal automation, a CLI tool, or a private integration that will only ever access your own Capacities account.",[41,42,44],"h3",{"id":43},"obtaining-a-token","Obtaining a token",[10,46,47],{},"Generate a personal token inside the Capacities desktop app:",[49,50,51,58,64,70,77],"ol",{},[52,53,54,55],"li",{},"Open ",[14,56,57],{},"Settings",[52,59,60,61],{},"Navigate to ",[14,62,63],{},"Capacities API",[52,65,66,67],{},"Click ",[14,68,69],{},"Generate new token",[52,71,72,73,76],{},"Choose the ",[14,74,75],{},"space"," this token should access",[52,78,79],{},"Select if the token should be read-only or allow writing",[19,81,82],{},[10,83,84],{},"A personal token grants access to data in the selected space. Do not share it with anyone you do not trust. If you believe your token has been compromised, revoke it immediately and generate a new one.",[10,86,87,88,92,93,96],{},"Personal tokens are prefixed with ",[89,90,91],"code",{},"cap-api-",". Pass the full string in the ",[89,94,95],{},"Authorization"," header:",[98,99,104],"pre",{"className":100,"code":101,"language":102,"meta":103,"style":103},"language-http shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Authorization: Bearer cap-api-…\n","http","",[89,105,106],{"__ignoreMap":103},[107,108,111],"span",{"class":109,"line":110},"line",1,[107,112,101],{},[41,114,116],{"id":115},"space-binding","Space binding",[10,118,119,120,123,124,127],{},"Each personal token is tied to ",[14,121,122],{},"one space"," — there is no ",[89,125,126],{},"spaceId"," field in request bodies for those routes.",[41,129,131],{"id":130},"revoking-a-personal-token","Revoking a personal token",[10,133,54,134,137,138,141,142,145],{},[14,135,136],{},"Settings > Capacities API"," and delete the token. Requests using that token immediately receive ",[89,139,140],{},"401 Unauthorized"," (",[89,143,144],{},"cap_not_authenticated",").",[147,148],"hr",{},[29,150,152],{"id":151},"oauth-20","OAuth 2.0",[10,154,155,156,159],{},"Use OAuth when you are building an integration, app, or service that ",[14,157,158],{},"other users will connect to their Capacities account",". OAuth lets users authorise your integration without sharing their personal credentials with you.",[161,162,163],"info",{},[10,164,165,166,145],{},"If you are building something other people will install or connect, do not ask users to paste their personal token into your app. Use OAuth instead. For community integrations, we require OAuth authentication (",[167,168,172],"a",{"href":169,"rel":170},"https://docs.capacities.io/reference/integrations/community/contribute",[171],"nofollow","Learn more",[41,174,176,177],{"id":175},"getting-a-client_id","Getting a ",[89,178,179],{},"client_id",[181,182,183],"note",{},[10,184,185,186,189],{},"OAuth access is available to ",[14,187,188],{},"verified clients only",".",[10,191,192,193,197],{},"The Capacities OAuth registry is curated. ",[167,194,196],{"href":195},"mailto:team@capacities.io?subject=OAuth%20client%20registration&body=Hi%2C%0A%0AI%27d%20like%20to%20register%20an%20OAuth%20integration.%0A%0AIntegration%20name%3A%20%0AShort%20description%3A%20%0AIcon%20URL%3A%20%0AHomepage%20URL%3A%20%0ARedirect%20URI%28s%29%3A%20%0AScopes%20needed%3A%20%0A%0AAbout%20the%20integration%3A%0A%28What%20you%27re%20building%20and%20how%20it%20uses%20Capacities%20data.%29%0A%0ATesting%20instructions%3A%0A%28A%20link%20to%20a%20staging%20environment%20or%20steps%20the%20Capacities%20team%20can%20follow%20to%20verify%20the%20integration%20works.%29%0A%0AThanks","Submit via email"," to register and include the following:",[199,200,201,214],"table",{},[202,203,204],"thead",{},[205,206,207,211],"tr",{},[208,209,210],"th",{},"Field",[208,212,213],{},"Description",[215,216,217,226,234,242,250,258,277,285],"tbody",{},[205,218,219,223],{},[220,221,222],"td",{},"Integration name",[220,224,225],{},"Displayed to users on the consent screen",[205,227,228,231],{},[220,229,230],{},"Short description",[220,232,233],{},"What your integration does",[205,235,236,239],{},[220,237,238],{},"Icon URL",[220,240,241],{},"Square image used on the consent screen",[205,243,244,247],{},[220,245,246],{},"Homepage URL",[220,248,249],{},"Public page for your integration or product",[205,251,252,255],{},[220,253,254],{},"Redirect URI(s)",[220,256,257],{},"Exact URI(s) your OAuth flow will redirect to",[205,259,260,263],{},[220,261,262],{},"Scopes needed",[220,264,265,266,269,270,269,273,276],{},"Which of ",[89,267,268],{},"api:read",", ",[89,271,272],{},"api:write",[89,274,275],{},"offline_access"," you require",[205,278,279,282],{},[220,280,281],{},"About the integration",[220,283,284],{},"What you're building and how it uses Capacities data",[205,286,287,290],{},[220,288,289],{},"Testing instructions",[220,291,292],{},"A link to a staging environment or steps we can follow to verify the integration works",[10,294,295,296,298],{},"We will reply with a stable ",[89,297,179],{},". No client secret is issued.",[41,300,302],{"id":301},"how-it-works","How it works",[49,304,305,311,317,323],{},[52,306,307,310],{},[14,308,309],{},"User initiates the connection",": \"Connect to Capacities\" from within your integration",[52,312,313,316],{},[14,314,315],{},"Consent screen",": the user is redirected to the Capacities authorisation page, where they choose which space to grant access to and approve the requested scopes.",[52,318,319,322],{},[14,320,321],{},"Your integration receives a token",": after approval, Capacities issues an access token scoped to exactly what the user granted. You never see their personal token or credentials.",[52,324,325,328,329,189],{},[14,326,327],{},"The user stays in control",": users can review all active connections and revoke access at any time under ",[14,330,331],{},"Settings > Capacities API > Connections",[41,333,335],{"id":334},"discovery","Discovery",[10,337,338],{},"Fetch server metadata to get all endpoint URLs before hard-coding any of them:",[98,340,345],{"className":341,"code":343,"language":344},[342],"language-text","GET https://api.capacities.io/.well-known/oauth-authorization-server\n","text",[89,346,343],{"__ignoreMap":103},[10,348,349,350,355,356,269,359,269,362,365],{},"This returns a standard ",[167,351,354],{"href":352,"rel":353},"https://www.rfc-editor.org/rfc/rfc8414",[171],"RFC 8414"," document listing ",[89,357,358],{},"authorization_endpoint",[89,360,361],{},"token_endpoint",[89,363,364],{},"scopes_supported",", and more.",[41,367,369],{"id":368},"scopes","Scopes",[10,371,372],{},"Request only the permissions your integration actually needs.",[199,374,375,385],{},[202,376,377],{},[205,378,379,382],{},[208,380,381],{},"Scope",[208,383,384],{},"What it allows",[215,386,387,396,405],{},[205,388,389,393],{},[220,390,391],{},[89,392,268],{},[220,394,395],{},"Read the user's content (objects, pages, properties, space info)",[205,397,398,402],{},[220,399,400],{},[89,401,272],{},[220,403,404],{},"Create and modify content in the user's space",[205,406,407,411],{},[220,408,409],{},[89,410,275],{},[220,412,413],{},"Obtain a refresh token to stay connected without requiring re-authorisation",[41,415,417],{"id":416},"authorization-code-flow-pkce","Authorization Code Flow (PKCE)",[419,420,422],"h4",{"id":421},"_1-generate-a-pkce-pair","1. Generate a PKCE pair",[98,424,427],{"className":425,"code":426,"language":344},[342],"code_verifier  = 43–128 random URL-safe characters\ncode_challenge = BASE64URL(SHA-256(code_verifier))\n",[89,428,426],{"__ignoreMap":103},[419,430,432],{"id":431},"_2-redirect-the-user-to-the-authorisation-endpoint","2. Redirect the user to the authorisation endpoint",[98,434,437],{"className":435,"code":436,"language":344},[342],"GET https://api.capacities.io/oauth/authorize\n  ?response_type=code\n  &client_id=\u003Cyour_client_id>\n  &redirect_uri=\u003Cyour_redirect_uri>\n  &scope=api:read%20api:write%20offline_access\n  &resource=https://api.capacities.io\n  &code_challenge=\u003CS256_code_challenge>\n  &code_challenge_method=S256\n  &state=\u003Crandom_state>\n",[89,438,436],{"__ignoreMap":103},[10,440,441,442,445,446,189],{},"The ",[89,443,444],{},"resource"," parameter is required and must be ",[89,447,448],{},"https://api.capacities.io",[10,450,451,452,455,456,189],{},"The user logs in (if not already) and selects a Capacities space to authorise. After consent, the browser redirects to your ",[89,453,454],{},"redirect_uri"," with ",[89,457,458],{},"?code=…&state=…",[419,460,462],{"id":461},"_3-exchange-the-code-for-tokens","3. Exchange the code for tokens",[98,464,466],{"className":100,"code":465,"language":102,"meta":103,"style":103},"POST https://api.capacities.io/oauth/token\nContent-Type: application/x-www-form-urlencoded\n\ngrant_type=authorization_code\n&code=\u003Cauthorization_code>\n&redirect_uri=\u003Cyour_redirect_uri>\n&client_id=\u003Cyour_client_id>\n&code_verifier=\u003Cyour_code_verifier>\n",[89,467,468,473,479,486,492,498,504,510],{"__ignoreMap":103},[107,469,470],{"class":109,"line":110},[107,471,472],{},"POST https://api.capacities.io/oauth/token\n",[107,474,476],{"class":109,"line":475},2,[107,477,478],{},"Content-Type: application/x-www-form-urlencoded\n",[107,480,482],{"class":109,"line":481},3,[107,483,485],{"emptyLinePlaceholder":484},true,"\n",[107,487,489],{"class":109,"line":488},4,[107,490,491],{},"grant_type=authorization_code\n",[107,493,495],{"class":109,"line":494},5,[107,496,497],{},"&code=\u003Cauthorization_code>\n",[107,499,501],{"class":109,"line":500},6,[107,502,503],{},"&redirect_uri=\u003Cyour_redirect_uri>\n",[107,505,507],{"class":109,"line":506},7,[107,508,509],{},"&client_id=\u003Cyour_client_id>\n",[107,511,513],{"class":109,"line":512},8,[107,514,515],{},"&code_verifier=\u003Cyour_code_verifier>\n",[10,517,518,519,521,522,524],{},"Do not send an ",[89,520,95],{}," header. These are public clients with no client secret. Send ",[89,523,179],{}," in the request body only.",[10,526,527],{},[14,528,529],{},"Response",[98,531,535],{"className":532,"code":533,"language":534,"meta":103,"style":103},"language-jsonc shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"access_token\": \"eyJ…\",\n  \"token_type\": \"Bearer\",\n  \"expires_in\": 3600,\n  \"refresh_token\": \"…\", // present when offline_access was granted\n  \"scope\": \"api:read api:write offline_access\",\n}\n","jsonc",[89,536,537,542,547,552,557,565,570],{"__ignoreMap":103},[107,538,539],{"class":109,"line":110},[107,540,541],{},"{\n",[107,543,544],{"class":109,"line":475},[107,545,546],{},"  \"access_token\": \"eyJ…\",\n",[107,548,549],{"class":109,"line":481},[107,550,551],{},"  \"token_type\": \"Bearer\",\n",[107,553,554],{"class":109,"line":488},[107,555,556],{},"  \"expires_in\": 3600,\n",[107,558,559,562],{"class":109,"line":494},[107,560,561],{},"  \"refresh_token\": \"…\",",[107,563,564],{}," // present when offline_access was granted\n",[107,566,567],{"class":109,"line":500},[107,568,569],{},"  \"scope\": \"api:read api:write offline_access\",\n",[107,571,572],{"class":109,"line":506},[107,573,574],{},"}\n",[41,576,578],{"id":577},"refreshing-a-token","Refreshing a token",[10,580,581],{},"When an access token expires, use the refresh token to obtain a new one without user interaction:",[98,583,585],{"className":100,"code":584,"language":102,"meta":103,"style":103},"POST https://api.capacities.io/oauth/token\nContent-Type: application/x-www-form-urlencoded\n\ngrant_type=refresh_token\n&refresh_token=\u003Crefresh_token>\n&client_id=\u003Cyour_client_id>\n",[89,586,587,591,595,599,604,609],{"__ignoreMap":103},[107,588,589],{"class":109,"line":110},[107,590,472],{},[107,592,593],{"class":109,"line":475},[107,594,478],{},[107,596,597],{"class":109,"line":481},[107,598,485],{"emptyLinePlaceholder":484},[107,600,601],{"class":109,"line":488},[107,602,603],{},"grant_type=refresh_token\n",[107,605,606],{"class":109,"line":494},[107,607,608],{},"&refresh_token=\u003Crefresh_token>\n",[107,610,611],{"class":109,"line":500},[107,612,509],{},[10,614,615,616,619],{},"Refresh tokens rotate on every use. Store the new ",[89,617,618],{},"refresh_token"," from the response immediately; the previous one is revoked.",[10,621,622,623,626],{},"Refresh tokens expire after 6 months of inactivity or when the user removes the connection from ",[14,624,625],{},"Settings > Connected Apps",". You then need to prompt the user to re-authorise.",[41,628,630],{"id":629},"using-the-access-token","Using the access token",[10,632,633],{},"Pass the access token as a Bearer token on every API request:",[98,635,637],{"className":100,"code":636,"language":102,"meta":103,"style":103},"Authorization: Bearer eyJ…\n",[89,638,639],{"__ignoreMap":103},[107,640,641],{"class":109,"line":110},[107,642,636],{},[10,644,645,646,189],{},"Access tokens are short-lived JWTs that expire after ",[14,647,648],{},"1 hour",[41,650,652],{"id":651},"revoking-access","Revoking access",[10,654,655,656,658,659,662],{},"Users can remove a connection at any time from ",[14,657,625],{},". Your application should handle a ",[89,660,661],{},"401"," response gracefully and prompt the user to re-authorise.",[10,664,665,666,669],{},"You can revoke a token programmatically using the ",[89,667,668],{},"POST /oauth/revoke"," endpoint.",[10,671,672,674,675],{},[89,673,668],{}," — ",[167,676,679],{"href":677,"rel":678},"https://datatracker.ietf.org/doc/html/rfc7009",[171],"RFC 7009",[10,681,682],{},"Immediately invalidates a refresh token or access token and removes the connection from the user's Connected Apps. Use this when the user disconnects your integration from within your own UI.",[10,684,685],{},[14,686,687],{},"Request",[98,689,691],{"className":100,"code":690,"language":102,"meta":103,"style":103},"POST https://api.capacities.io/oauth/revoke\nContent-Type: application/x-www-form-urlencoded\n\ntoken=\u003Crefresh_token_or_access_token>&client_id=\u003Cyour_client_id>\n",[89,692,693,698,702,706],{"__ignoreMap":103},[107,694,695],{"class":109,"line":110},[107,696,697],{},"POST https://api.capacities.io/oauth/revoke\n",[107,699,700],{"class":109,"line":475},[107,701,478],{},[107,703,704],{"class":109,"line":481},[107,705,485],{"emptyLinePlaceholder":484},[107,707,708],{"class":109,"line":488},[107,709,710],{},"token=\u003Crefresh_token_or_access_token>&client_id=\u003Cyour_client_id>\n",[199,712,713,725],{},[202,714,715],{},[205,716,717,720,723],{},[208,718,719],{},"Parameter",[208,721,722],{},"Required",[208,724,213],{},[215,726,727,740,759],{},[205,728,729,734,737],{},[220,730,731],{},[89,732,733],{},"token",[220,735,736],{},"Yes",[220,738,739],{},"The refresh token or access token to revoke",[205,741,742,747,750],{},[220,743,744],{},[89,745,746],{},"token_type_hint",[220,748,749],{},"No",[220,751,752,754,755,758],{},[89,753,618],{}," or ",[89,756,757],{},"access_token"," — helps resolve the token faster",[205,760,761,765,767],{},[220,762,763],{},[89,764,179],{},[220,766,736],{},[220,768,769],{},"Your OAuth client ID",[10,771,772],{},[14,773,529],{},[10,775,776,777,780],{},"Always ",[89,778,779],{},"200 OK"," with an empty body, even if the token was already expired or not found (RFC 7009 §2.2 — prevents token enumeration).",[10,782,783],{},[14,784,785],{},"Example — revoke a refresh token",[98,787,791],{"className":788,"code":789,"language":790,"meta":103,"style":103},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","curl -X POST https://api.capacities.io/oauth/revoke \\\n  -H \"Content-Type: application/x-www-form-urlencoded\" \\\n  -d \"token=\u003Crefresh_token>&token_type_hint=refresh_token&client_id=\u003Cyour_client_id>\"\n","bash",[89,792,793,813,830],{"__ignoreMap":103},[107,794,795,799,803,806,809],{"class":109,"line":110},[107,796,798],{"class":797},"sBMFI","curl",[107,800,802],{"class":801},"sfazB"," -X",[107,804,805],{"class":801}," POST",[107,807,808],{"class":801}," https://api.capacities.io/oauth/revoke",[107,810,812],{"class":811},"sTEyZ"," \\\n",[107,814,815,818,822,825,828],{"class":109,"line":475},[107,816,817],{"class":801},"  -H",[107,819,821],{"class":820},"sMK4o"," \"",[107,823,824],{"class":801},"Content-Type: application/x-www-form-urlencoded",[107,826,827],{"class":820},"\"",[107,829,812],{"class":811},[107,831,832,835,837,840],{"class":109,"line":481},[107,833,834],{"class":801},"  -d",[107,836,821],{"class":820},[107,838,839],{"class":801},"token=\u003Crefresh_token>&token_type_hint=refresh_token&client_id=\u003Cyour_client_id>",[107,841,842],{"class":820},"\"\n",[10,844,845,846,849,850,853,854,856,857,860,861,189],{},"Revoking a ",[14,847,848],{},"refresh token"," revokes the entire connection (all associated access tokens become invalid immediately). Revoking only an ",[14,851,852],{},"access token"," has the same effect — the connection row is removed and future requests with that access token will return ",[89,855,661],{},". The endpoint is also discoverable via the AS metadata at ",[89,858,859],{},"/.well-known/oauth-authorization-server"," under ",[89,862,863],{},"revocation_endpoint",[41,865,867],{"id":866},"error-reference","Error reference",[10,869,870,871,189],{},"Errors follow ",[167,872,875],{"href":873,"rel":874},"https://www.rfc-editor.org/rfc/rfc6749#section-5.2",[171],"RFC 6749 §5.2",[199,877,878,890],{},[202,879,880],{},[205,881,882,887],{},[208,883,884],{},[89,885,886],{},"error",[208,888,889],{},"Likely cause",[215,891,892,906,918,932,944,958],{},[205,893,894,899],{},[220,895,896],{},[89,897,898],{},"invalid_request",[220,900,901,902,905],{},"Missing or malformed parameter (for example, ",[89,903,904],{},"client_secret"," sent when not expected)",[205,907,908,913],{},[220,909,910],{},[89,911,912],{},"invalid_client",[220,914,915,917],{},[89,916,179],{}," unknown or not registered",[205,919,920,925],{},[220,921,922],{},[89,923,924],{},"invalid_grant",[220,926,927,928,931],{},"Code already used, expired, or ",[89,929,930],{},"code_verifier"," mismatch",[205,933,934,939],{},[220,935,936],{},[89,937,938],{},"invalid_scope",[220,940,941,942],{},"Scope not permitted for your ",[89,943,179],{},[205,945,946,951],{},[220,947,948],{},[89,949,950],{},"invalid_target",[220,952,953,955,956],{},[89,954,444],{}," parameter missing or not ",[89,957,448],{},[205,959,960,965],{},[220,961,962],{},[89,963,964],{},"unauthorized_client",[220,966,967],{},"Redirect URI not in your registered allow-list",[969,970,971],"style",{},"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 .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}",{"title":103,"searchDepth":110,"depth":475,"links":973},[974,979],{"id":31,"depth":475,"text":32,"children":975},[976,977,978],{"id":43,"depth":481,"text":44},{"id":115,"depth":481,"text":116},{"id":130,"depth":481,"text":131},{"id":151,"depth":475,"text":152,"children":980},[981,983,984,985,986,987,988,989,990],{"id":175,"depth":481,"text":982},"Getting a client_id",{"id":301,"depth":481,"text":302},{"id":334,"depth":481,"text":335},{"id":368,"depth":481,"text":369},{"id":416,"depth":481,"text":417},{"id":577,"depth":481,"text":578},{"id":629,"depth":481,"text":630},{"id":651,"depth":481,"text":652},{"id":866,"depth":481,"text":867},"How to authenticate requests to the Capacities API using personal tokens or OAuth 2.0.","md",null,{},"/api/overview/authentication",{"title":5,"description":991},"api/1.overview/authentication","L5y1s_14xAgXPCIA4y6SaK4igFSVKJPL6VaTjrIHz6o",[1000,1005],{"title":1001,"path":1002,"stem":1003,"icon":1004,"children":-1},"Overview","/api/overview","api/1.overview/index","i-ph-house-duotone",{"title":1006,"path":1007,"stem":1008,"children":-1},"Concurrency","/api/overview/concurrency","api/1.overview/concurrency",1781012285071]