[{"data":1,"prerenderedAt":3364},["ShallowReactive",2],{"docs:/docs/api-reference":3},{"id":4,"title":5,"body":6,"description":3357,"extension":3358,"meta":3359,"navigation":121,"path":3360,"seo":3361,"stem":3362,"__hash__":3363},"docs/docs/api-reference/index.md","API Reference",{"type":7,"value":8,"toc":3307},"minimark",[9,14,18,23,45,49,52,71,82,89,93,96,101,188,248,252,464,471,476,479,608,613,641,645,659,663,717,760,764,778,787,791,805,812,816,819,823,837,840,844,938,943,976,982,991,1007,1011,1068,1074,1094,1098,1112,1116,1166,1186,1190,1203,1209,1214,1218,1226,1234,1238,1308,1337,1361,1375,1379,1392,1395,1399,1413,1418,1422,1425,1433,1437,1451,1454,1458,1524,1528,1550,1553,1597,1605,1608,1760,1804,1808,1822,1826,1889,1912,1915,1919,1932,1936,1940,1946,1950,2011,2032,2036,2050,2054,2122,2126,2137,2142,2144,2263,2267,2310,2324,2337,2341,2354,2369,2373,2387,2390,2394,2400,2404,2455,2473,2477,2491,2495,2539,2543,2561,2563,2662,2683,2687,2730,2744,2748,2761,2766,2770,2776,2803,2812,2816,2827,3063,3070,3129,3132,3179,3185,3259,3276,3280,3283,3303],[10,11,13],"h1",{"id":12},"rest-api-reference","REST API Reference",[15,16,17],"p",{},"Complete REST API reference for managing NoLag programmatically. API keys are project-scoped, so no organization or project IDs are needed in the URLs.",[19,20,22],"h2",{"id":21},"base-url","Base URL",[24,25,26],"code-tabs",{},[27,28,34],"pre",{"className":29,"code":30,"filename":31,"language":32,"meta":33,"style":33},"language-bash shiki shiki-themes github-light github-dark","https://api.nolag.app/v1\n","Terminal","bash","",[35,36,37],"code",{"__ignoreMap":33},[38,39,42],"span",{"class":40,"line":41},"line",1,[38,43,30],{"class":44},"sScJk",[19,46,48],{"id":47},"authentication","Authentication",[15,50,51],{},"All API requests require a project-scoped API key in the Authorization header:",[24,53,54],{},[27,55,57],{"className":29,"code":56,"filename":31,"language":32,"meta":33,"style":33},"Authorization: Bearer nlg_live_xxx.secret\n",[35,58,59],{"__ignoreMap":33},[38,60,61,64,68],{"class":40,"line":41},[38,62,63],{"class":44},"Authorization:",[38,65,67],{"class":66},"sZZnC"," Bearer",[38,69,70],{"class":66}," nlg_live_xxx.secret\n",[15,72,73,74,77,78,81],{},"API keys are created in the NoLag dashboard and are scoped to a specific project. The API key determines which project's resources you can access. Requests with a key that is not project-scoped return ",[35,75,76],{},"403"," with the message ",[35,79,80],{},"API key must be project-scoped to access this endpoint",".",[15,83,84,85,88],{},"Request bodies are validated strictly: a field that is not listed for an endpoint is rejected with ",[35,86,87],{},"400",", not ignored.",[19,90,92],{"id":91},"apps","Apps",[15,94,95],{},"Apps are containers for rooms and topics within your project.",[97,98,100],"h3",{"id":99},"list-apps","List Apps",[24,102,103],{},[27,104,106],{"className":29,"code":105,"filename":31,"language":32,"meta":33,"style":33},"GET /apps\n\n# Query parameters (optional)\n?page=1&limit=20&orderBy[]=name:ASC&name=chat&blueprintId=xxx&status=active\n",[35,107,108,116,123,130],{"__ignoreMap":33},[38,109,110,113],{"class":40,"line":41},[38,111,112],{"class":44},"GET",[38,114,115],{"class":66}," /apps\n",[38,117,119],{"class":40,"line":118},2,[38,120,122],{"emptyLinePlaceholder":121},true,"\n",[38,124,126],{"class":40,"line":125},3,[38,127,129],{"class":128},"sJ8bj","# Query parameters (optional)\n",[38,131,133,137,141,144,147,150,152,155,158,161,164,167,169,172,175,177,180,183,185],{"class":40,"line":132},4,[38,134,136],{"class":135},"szBVR","?",[38,138,140],{"class":139},"sVt8B","page",[38,142,143],{"class":135},"=",[38,145,146],{"class":66},"1",[38,148,149],{"class":139},"&limit",[38,151,143],{"class":135},[38,153,154],{"class":66},"20",[38,156,157],{"class":139},"&",[38,159,160],{"class":44},"orderBy[]",[38,162,163],{"class":66},"=name:ASC",[38,165,166],{"class":139},"&name",[38,168,143],{"class":135},[38,170,171],{"class":66},"chat",[38,173,174],{"class":139},"&blueprintId",[38,176,143],{"class":135},[38,178,179],{"class":66},"xxx",[38,181,182],{"class":139},"&status",[38,184,143],{"class":135},[38,186,187],{"class":66},"active\n",[15,189,190,191,193,194,196,197,193,200,203,204,206,207,196,210,213,214,217,218,221,222,225,226,229,230,233,234,237,238,233,241,233,244,247],{},"Returns a paginated list of apps in your project. Query parameters: ",[35,192,140],{}," (default ",[35,195,146],{},"), ",[35,198,199],{},"limit",[35,201,202],{},"10",", clamped to ",[35,205,146],{},"-",[35,208,209],{},"100",[35,211,212],{},"orderBy"," (repeatable, array syntax ",[35,215,216],{},"orderBy[]=field:ASC"," or ",[35,219,220],{},"orderBy[]=field:DESC","; a scalar ",[35,223,224],{},"orderBy=name:ASC"," fails validation), ",[35,227,228],{},"name"," (partial match), ",[35,231,232],{},"blueprintId",", ",[35,235,236],{},"status"," (",[35,239,240],{},"active",[35,242,243],{},"disabled",[35,245,246],{},"suspended",").",[97,249,251],{"id":250},"create-app","Create App",[24,253,254],{},[27,255,257],{"className":29,"code":256,"filename":31,"language":32,"meta":33,"style":33},"POST /apps\n\n{\n  \"name\": \"My Chat App\",\n  \"description\": \"A real-time chat application\",\n  \"blueprintId\": \"nolag-chat-sdk\",\n  \"slug\": \"my-chat-app\",\n  \"topics\": [\"messages\", \"typing\"],\n  \"topicConfigs\": {\n    \"messages\": {\n      \"logging\": { \"enabled\": true },\n      \"webhooks\": {\n        \"onSubscribe\": { \"url\": \"https://api.example.com/hydrate\" }\n      }\n    }\n  },\n  \"triggerWebhook\": { \"url\": \"https://api.example.com/on-publish\", \"headers\": { \"Authorization\": \"Bearer xxx\" } }\n}\n",[35,258,259,266,270,275,287,298,309,320,339,350,360,380,390,409,415,421,427,458],{"__ignoreMap":33},[38,260,261,264],{"class":40,"line":41},[38,262,263],{"class":44},"POST",[38,265,115],{"class":66},[38,267,268],{"class":40,"line":118},[38,269,122],{"emptyLinePlaceholder":121},[38,271,272],{"class":40,"line":125},[38,273,274],{"class":139},"{\n",[38,276,277,280,284],{"class":40,"line":132},[38,278,279],{"class":44},"  \"name\"",[38,281,283],{"class":282},"sj4cs",":",[38,285,286],{"class":66}," \"My Chat App\",\n",[38,288,290,293,295],{"class":40,"line":289},5,[38,291,292],{"class":44},"  \"description\"",[38,294,283],{"class":282},[38,296,297],{"class":66}," \"A real-time chat application\",\n",[38,299,301,304,306],{"class":40,"line":300},6,[38,302,303],{"class":44},"  \"blueprintId\"",[38,305,283],{"class":282},[38,307,308],{"class":66}," \"nolag-chat-sdk\",\n",[38,310,312,315,317],{"class":40,"line":311},7,[38,313,314],{"class":44},"  \"slug\"",[38,316,283],{"class":282},[38,318,319],{"class":66}," \"my-chat-app\",\n",[38,321,323,326,328,331,334,336],{"class":40,"line":322},8,[38,324,325],{"class":44},"  \"topics\"",[38,327,283],{"class":282},[38,329,330],{"class":139}," [",[38,332,333],{"class":66},"\"messages\"",[38,335,233],{"class":139},[38,337,338],{"class":66},"\"typing\"],\n",[38,340,342,345,347],{"class":40,"line":341},9,[38,343,344],{"class":44},"  \"topicConfigs\"",[38,346,283],{"class":282},[38,348,349],{"class":66}," {\n",[38,351,353,356,358],{"class":40,"line":352},10,[38,354,355],{"class":44},"    \"messages\"",[38,357,283],{"class":282},[38,359,349],{"class":66},[38,361,363,366,368,371,374,377],{"class":40,"line":362},11,[38,364,365],{"class":44},"      \"logging\"",[38,367,283],{"class":282},[38,369,370],{"class":66}," {",[38,372,373],{"class":66}," \"enabled\":",[38,375,376],{"class":282}," true",[38,378,379],{"class":66}," },\n",[38,381,383,386,388],{"class":40,"line":382},12,[38,384,385],{"class":44},"      \"webhooks\"",[38,387,283],{"class":282},[38,389,349],{"class":66},[38,391,393,396,398,400,403,406],{"class":40,"line":392},13,[38,394,395],{"class":44},"        \"onSubscribe\"",[38,397,283],{"class":282},[38,399,370],{"class":66},[38,401,402],{"class":66}," \"url\":",[38,404,405],{"class":66}," \"https://api.example.com/hydrate\"",[38,407,408],{"class":66}," }\n",[38,410,412],{"class":40,"line":411},14,[38,413,414],{"class":139},"      }\n",[38,416,418],{"class":40,"line":417},15,[38,419,420],{"class":139},"    }\n",[38,422,424],{"class":40,"line":423},16,[38,425,426],{"class":139},"  },\n",[38,428,430,433,435,437,439,442,445,447,450,453,456],{"class":40,"line":429},17,[38,431,432],{"class":44},"  \"triggerWebhook\"",[38,434,283],{"class":282},[38,436,370],{"class":66},[38,438,402],{"class":66},[38,440,441],{"class":66}," \"https://api.example.com/on-publish\",",[38,443,444],{"class":66}," \"headers\":",[38,446,370],{"class":66},[38,448,449],{"class":66}," \"Authorization\":",[38,451,452],{"class":66}," \"Bearer xxx\"",[38,454,455],{"class":66}," }",[38,457,408],{"class":66},[38,459,461],{"class":40,"line":460},18,[38,462,463],{"class":139},"}\n",[15,465,466,467,470],{},"Returns ",[35,468,469],{},"201 Created"," with the app.",[15,472,473,474,81],{},"Required fields: ",[35,475,228],{},[15,477,478],{},"Optional fields:",[480,481,482,488,497,506,522,531,573,596],"ul",{},[483,484,485],"li",{},[35,486,487],{},"description",[483,489,490,493,494,496],{},[35,491,492],{},"slug"," (auto-generated from ",[35,495,228],{}," if omitted; lowercase alphanumeric and hyphens)",[483,498,499,501,502,505],{},[35,500,232],{}," and ",[35,503,504],{},"blueprintVersion"," (semver; defaults to the latest version of the blueprint)",[483,507,508,511,512,515,516,521],{},[35,509,510],{},"config"," (app configuration object; ",[35,513,514],{},"config.autoProvisionRooms: true"," enables ",[517,518,520],"a",{"href":519},"#ensure-room-idempotent","Ensure Room",")",[483,523,524,527,528,521],{},[35,525,526],{},"topics"," (array of topic names, ",[35,529,530],{},"[a-zA-Z0-9_:-]",[483,532,533,536,537,540,541,544,545,233,548,233,551,233,554,233,557,560,561,564,565,568,569,572],{},[35,534,535],{},"topicConfigs"," (per-topic settings, keyed by topic name). Each entry accepts ",[35,538,539],{},"logging: { enabled, retention?, replayEnabled?, maxReplayMessages? }"," where ",[35,542,543],{},"retention"," is one of ",[35,546,547],{},"\"tier\"",[35,549,550],{},"\"1d\"",[35,552,553],{},"\"7d\"",[35,555,556],{},"\"30d\"",[35,558,559],{},"\"90d\"",", and ",[35,562,563],{},"webhooks: { onSubscribe?, onPublish? }"," where each webhook is ",[35,566,567],{},"{ url, headers? }",". Note that ",[35,570,571],{},"logging"," is an object, not a boolean.",[483,574,575,501,578,581,582,584,585,217,588,591,592,81],{},[35,576,577],{},"hydrationWebhook",[35,579,580],{},"triggerWebhook"," (app-level webhooks, each ",[35,583,567],{},"). They apply to every topic in the app; a ",[35,586,587],{},"topicConfigs.\u003Ctopic>.webhooks.onSubscribe",[35,589,590],{},"onPublish"," entry overrides them for that topic. See ",[517,593,595],{"href":594},"/docs/concepts/webhooks","Webhooks",[483,597,598,233,601,233,604,607],{},[35,599,600],{},"dependencies",[35,602,603],{},"files",[35,605,606],{},"framework"," (app builder fields for apps that carry source code; not needed for the broker)",[15,609,610,611,81],{},"Creating an app past your plan's app limit returns ",[35,612,76],{},[614,615,617,631],"callout",{"type":616},"warning",[15,618,619,623,624,627,628,81],{},[620,621,622],"strong",{},"The stored slug is never the slug you sent."," NoLag appends four random hex\ncharacters to every app slug to keep it unique within the project, whether you\nsupplied one or not. A request with ",[35,625,626],{},"\"slug\": \"my-chat-app\""," is stored as something\nlike ",[35,629,630],{},"my-chat-app-a3f9",[15,632,633,634,636,637,640],{},"Read ",[35,635,492],{}," from the response and use that value everywhere afterwards, including\n",[35,638,639],{},"setApp()"," and topic patterns. Room slugs behave differently: they are stored\nexactly as supplied.",[97,642,644],{"id":643},"get-app","Get App",[24,646,647],{},[27,648,650],{"className":29,"code":649,"filename":31,"language":32,"meta":33,"style":33},"GET /apps/{appId}\n",[35,651,652],{"__ignoreMap":33},[38,653,654,656],{"class":40,"line":41},[38,655,112],{"class":44},[38,657,658],{"class":66}," /apps/{appId}\n",[97,660,662],{"id":661},"update-app","Update App",[24,664,665],{},[27,666,668],{"className":29,"code":667,"filename":31,"language":32,"meta":33,"style":33},"PATCH /apps/{appId}\n\n{\n  \"name\": \"Updated Name\",\n  \"description\": \"Updated description\",\n  \"status\": \"active\"\n}\n",[35,669,670,677,681,685,694,703,713],{"__ignoreMap":33},[38,671,672,675],{"class":40,"line":41},[38,673,674],{"class":44},"PATCH",[38,676,658],{"class":66},[38,678,679],{"class":40,"line":118},[38,680,122],{"emptyLinePlaceholder":121},[38,682,683],{"class":40,"line":125},[38,684,274],{"class":139},[38,686,687,689,691],{"class":40,"line":132},[38,688,279],{"class":44},[38,690,283],{"class":282},[38,692,693],{"class":66}," \"Updated Name\",\n",[38,695,696,698,700],{"class":40,"line":289},[38,697,292],{"class":44},[38,699,283],{"class":282},[38,701,702],{"class":66}," \"Updated description\",\n",[38,704,705,708,710],{"class":40,"line":300},[38,706,707],{"class":44},"  \"status\"",[38,709,283],{"class":282},[38,711,712],{"class":66}," \"active\"\n",[38,714,715],{"class":40,"line":311},[38,716,463],{"class":139},[15,718,719,720,233,722,724,725,233,727,237,729,732,733,196,736,233,738,233,740,233,742,233,744,746,747,501,749,196,752,755,756,233,758,81],{},"Updatable fields: ",[35,721,228],{},[35,723,492],{}," (stored as sent; no suffix is added on update, and the app's topic addresses change with it), ",[35,726,487],{},[35,728,236],{},[35,730,731],{},"\"active\""," | ",[35,734,735],{},"\"disabled\"",[35,737,510],{},[35,739,600],{},[35,741,603],{},[35,743,526],{},[35,745,535],{}," (including per-topic ",[35,748,571],{},[35,750,751],{},"webhooks",[35,753,754],{},"pinnedBlueprintVersion"," (boolean), ",[35,757,577],{},[35,759,580],{},[97,761,763],{"id":762},"delete-app","Delete App",[24,765,766],{},[27,767,769],{"className":29,"code":768,"filename":31,"language":32,"meta":33,"style":33},"DELETE /apps/{appId}\n",[35,770,771],{"__ignoreMap":33},[38,772,773,776],{"class":40,"line":41},[38,774,775],{"class":44},"DELETE",[38,777,658],{"class":66},[15,779,466,780,783,784,81],{},[35,781,782],{},"200 OK"," with ",[35,785,786],{},"{ \"success\": true }",[97,788,790],{"id":789},"reset-app-to-blueprint","Reset App to Blueprint",[24,792,793],{},[27,794,796],{"className":29,"code":795,"filename":31,"language":32,"meta":33,"style":33},"POST /apps/{appId}/reset-to-blueprint\n",[35,797,798],{"__ignoreMap":33},[38,799,800,802],{"class":40,"line":41},[38,801,263],{"class":44},[38,803,804],{"class":66}," /apps/{appId}/reset-to-blueprint\n",[15,806,807,808,811],{},"Resets the app's configuration to match its source blueprint. The app must have been created from a blueprint, otherwise the call returns ",[35,809,810],{},"404",". Returns the updated app.",[19,813,815],{"id":814},"rooms","Rooms",[15,817,818],{},"Rooms organize topics within an app. Each room has a unique slug used in topic patterns.",[97,820,822],{"id":821},"list-rooms","List Rooms",[24,824,825],{},[27,826,828],{"className":29,"code":827,"filename":31,"language":32,"meta":33,"style":33},"GET /apps/{appId}/rooms\n",[35,829,830],{"__ignoreMap":33},[38,831,832,834],{"class":40,"line":41},[38,833,112],{"class":44},[38,835,836],{"class":66}," /apps/{appId}/rooms\n",[15,838,839],{},"Returns a plain array containing every room in the app. The endpoint is not paginated and takes no query parameters.",[97,841,843],{"id":842},"create-room","Create Room",[24,845,846],{},[27,847,849],{"className":29,"code":848,"filename":31,"language":32,"meta":33,"style":33},"POST /apps/{appId}/rooms\n\n{\n  \"name\": \"General Chat\",\n  \"slug\": \"general\",\n  \"description\": \"General discussion room\",\n  \"topics\": [\"messages\", \"typing\", \"presence\"],\n  \"metadata\": {\n    \"maxUsers\": 100\n  }\n}\n",[35,850,851,857,861,865,874,883,892,910,919,929,934],{"__ignoreMap":33},[38,852,853,855],{"class":40,"line":41},[38,854,263],{"class":44},[38,856,836],{"class":66},[38,858,859],{"class":40,"line":118},[38,860,122],{"emptyLinePlaceholder":121},[38,862,863],{"class":40,"line":125},[38,864,274],{"class":139},[38,866,867,869,871],{"class":40,"line":132},[38,868,279],{"class":44},[38,870,283],{"class":282},[38,872,873],{"class":66}," \"General Chat\",\n",[38,875,876,878,880],{"class":40,"line":289},[38,877,314],{"class":44},[38,879,283],{"class":282},[38,881,882],{"class":66}," \"general\",\n",[38,884,885,887,889],{"class":40,"line":300},[38,886,292],{"class":44},[38,888,283],{"class":282},[38,890,891],{"class":66}," \"General discussion room\",\n",[38,893,894,896,898,900,902,904,907],{"class":40,"line":311},[38,895,325],{"class":44},[38,897,283],{"class":282},[38,899,330],{"class":139},[38,901,333],{"class":66},[38,903,233],{"class":139},[38,905,906],{"class":66},"\"typing\",",[38,908,909],{"class":66}," \"presence\"],\n",[38,911,912,915,917],{"class":40,"line":322},[38,913,914],{"class":44},"  \"metadata\"",[38,916,283],{"class":282},[38,918,349],{"class":66},[38,920,921,924,926],{"class":40,"line":341},[38,922,923],{"class":44},"    \"maxUsers\"",[38,925,283],{"class":282},[38,927,928],{"class":282}," 100\n",[38,930,931],{"class":40,"line":352},[38,932,933],{"class":139},"  }\n",[38,935,936],{"class":40,"line":362},[38,937,463],{"class":139},[15,939,466,940,942],{},[35,941,469],{}," with the room.",[15,944,473,945,947,948,950,951,233,953,233,955,958,959,962,963,233,966,233,969,501,972,975],{},[35,946,228],{},". Optional fields: ",[35,949,492],{}," (auto-generated from name if omitted), ",[35,952,487],{},[35,954,526],{},[35,956,957],{},"metadata"," (arbitrary JSON object), ",[35,960,961],{},"enableWebRTC"," (boolean; adds the ",[35,964,965],{},"webrtc:offer",[35,967,968],{},"webrtc:answer",[35,970,971],{},"webrtc:candidate",[35,973,974],{},"webrtc:state"," topics to the room).",[15,977,978,979,981],{},"When ",[35,980,526],{}," is omitted or empty the room inherits the app's topic list. Note that authorization is resolved against the app's topics, not the room's, so a topic must be on the app to be usable in any of its rooms.",[15,983,984,985,77,988,81],{},"A duplicate slug within the app returns ",[35,986,987],{},"409",[35,989,990],{},"Room with slug \"\u003Cslug>\" already exists",[614,992,993],{"type":616},[15,994,995,998,999,1002,1003,1006],{},[620,996,997],{},"Rooms must exist before a client uses them."," The broker never creates rooms\nimplicitly. Subscribing or publishing to a room that has not been created returns an\n",[35,1000,1001],{},"unknown_topic"," error (code ",[35,1004,1005],{},"42940",") rather than delivering messages. Unlike app slugs, a room\nslug is stored exactly as you supply it.",[97,1008,1010],{"id":1009},"ensure-room-idempotent","Ensure Room (Idempotent)",[24,1012,1013],{},[27,1014,1016],{"className":29,"code":1015,"filename":31,"language":32,"meta":33,"style":33},"POST /apps/{appId}/rooms/ensure\n\n{\n  \"name\": \"Matter 4821\",\n  \"slug\": \"matter-4821\",\n  \"topics\": [\"messages\"]\n}\n",[35,1017,1018,1025,1029,1033,1042,1051,1064],{"__ignoreMap":33},[38,1019,1020,1022],{"class":40,"line":41},[38,1021,263],{"class":44},[38,1023,1024],{"class":66}," /apps/{appId}/rooms/ensure\n",[38,1026,1027],{"class":40,"line":118},[38,1028,122],{"emptyLinePlaceholder":121},[38,1030,1031],{"class":40,"line":125},[38,1032,274],{"class":139},[38,1034,1035,1037,1039],{"class":40,"line":132},[38,1036,279],{"class":44},[38,1038,283],{"class":282},[38,1040,1041],{"class":66}," \"Matter 4821\",\n",[38,1043,1044,1046,1048],{"class":40,"line":289},[38,1045,314],{"class":44},[38,1047,283],{"class":282},[38,1049,1050],{"class":66}," \"matter-4821\",\n",[38,1052,1053,1055,1057,1059,1061],{"class":40,"line":300},[38,1054,325],{"class":44},[38,1056,283],{"class":282},[38,1058,330],{"class":139},[38,1060,333],{"class":66},[38,1062,1063],{"class":139},"]\n",[38,1065,1066],{"class":40,"line":311},[38,1067,463],{"class":139},[15,1069,1070,1071,1073],{},"Create-if-not-exists, for runtime per-entity rooms such as one room per document,\nmatter, or device id. Returns ",[35,1072,782],{}," with the existing room unchanged when the\nslug already matches, so it is safe to call on every entity creation.",[15,1075,1076,1077,1080,1081,1084,1085,1087,1088,77,1090,1093],{},"Requires the app to have ",[35,1078,1079],{},"config.autoProvisionRooms"," set to ",[35,1082,1083],{},"true",", otherwise the call\nreturns ",[35,1086,76],{},". Auto-provisioned rooms are capped at 1000 per app; past the cap the\ncall returns ",[35,1089,87],{},[35,1091,1092],{},"App \u003CappId> has reached its room cap (1000)",".\nAccepts the same body as Create Room.",[97,1095,1097],{"id":1096},"get-room","Get Room",[24,1099,1100],{},[27,1101,1103],{"className":29,"code":1102,"filename":31,"language":32,"meta":33,"style":33},"GET /apps/{appId}/rooms/{roomId}\n",[35,1104,1105],{"__ignoreMap":33},[38,1106,1107,1109],{"class":40,"line":41},[38,1108,112],{"class":44},[38,1110,1111],{"class":66}," /apps/{appId}/rooms/{roomId}\n",[97,1113,1115],{"id":1114},"update-room","Update Room",[24,1117,1118],{},[27,1119,1121],{"className":29,"code":1120,"filename":31,"language":32,"meta":33,"style":33},"PATCH /apps/{appId}/rooms/{roomId}\n\n{\n  \"name\": \"Updated Room Name\",\n  \"description\": \"Updated description\",\n  \"status\": \"active\"\n}\n",[35,1122,1123,1129,1133,1137,1146,1154,1162],{"__ignoreMap":33},[38,1124,1125,1127],{"class":40,"line":41},[38,1126,674],{"class":44},[38,1128,1111],{"class":66},[38,1130,1131],{"class":40,"line":118},[38,1132,122],{"emptyLinePlaceholder":121},[38,1134,1135],{"class":40,"line":125},[38,1136,274],{"class":139},[38,1138,1139,1141,1143],{"class":40,"line":132},[38,1140,279],{"class":44},[38,1142,283],{"class":282},[38,1144,1145],{"class":66}," \"Updated Room Name\",\n",[38,1147,1148,1150,1152],{"class":40,"line":289},[38,1149,292],{"class":44},[38,1151,283],{"class":282},[38,1153,702],{"class":66},[38,1155,1156,1158,1160],{"class":40,"line":300},[38,1157,707],{"class":44},[38,1159,283],{"class":282},[38,1161,712],{"class":66},[38,1163,1164],{"class":40,"line":311},[38,1165,463],{"class":139},[15,1167,719,1168,233,1170,233,1172,237,1174,732,1176,196,1178,233,1180,1182,1183,1185],{},[35,1169,228],{},[35,1171,487],{},[35,1173,236],{},[35,1175,731],{},[35,1177,735],{},[35,1179,526],{},[35,1181,957],{},". Note: ",[35,1184,492],{}," cannot be changed after creation.",[97,1187,1189],{"id":1188},"delete-room","Delete Room",[24,1191,1192],{},[27,1193,1195],{"className":29,"code":1194,"filename":31,"language":32,"meta":33,"style":33},"DELETE /apps/{appId}/rooms/{roomId}\n",[35,1196,1197],{"__ignoreMap":33},[38,1198,1199,1201],{"class":40,"line":41},[38,1200,775],{"class":44},[38,1202,1111],{"class":66},[15,1204,466,1205,1208],{},[35,1206,1207],{},"204 No Content"," with an empty response body.",[15,1210,1211,1212,81],{},"Note: Only dynamic rooms can be deleted. Static rooms defined in blueprints cannot be deleted; the call returns ",[35,1213,87],{},[19,1215,1217],{"id":1216},"room-access","Room Access",[15,1219,1220,1221,1225],{},"Room-level ACL grants control which actors the broker admits to a room. See\n",[517,1222,1224],{"href":1223},"/docs/concepts/acl","Access Control"," for the model.",[614,1227,1228],{"type":616},[15,1229,1230,1233],{},[620,1231,1232],{},"A room with no grants inherits the app's access mode, which is open by default.","\nIn practice that means every actor in the project can publish and subscribe until\nyou add the first grant. Creating that first grant makes the room private, and from\nthen on only actors with an explicit, unexpired grant are admitted. Adding one grant\ntherefore removes access from everyone else, so provision all of a room's actors\ntogether.",[97,1235,1237],{"id":1236},"grant-actor-access","Grant Actor Access",[24,1239,1240],{},[27,1241,1243],{"className":29,"code":1242,"filename":31,"language":32,"meta":33,"style":33},"POST /apps/{appId}/rooms/{roomId}/actors\n\n{\n  \"actorTokenId\": \"019fd987-a03a-70cf-9420-60538a186bbb\",\n  \"permission\": \"pubSub\",\n  \"topics\": [\"messages\", \"typing\"],\n  \"expiresAt\": \"2026-12-31T23:59:59Z\"\n}\n",[35,1244,1245,1252,1256,1260,1270,1280,1294,1304],{"__ignoreMap":33},[38,1246,1247,1249],{"class":40,"line":41},[38,1248,263],{"class":44},[38,1250,1251],{"class":66}," /apps/{appId}/rooms/{roomId}/actors\n",[38,1253,1254],{"class":40,"line":118},[38,1255,122],{"emptyLinePlaceholder":121},[38,1257,1258],{"class":40,"line":125},[38,1259,274],{"class":139},[38,1261,1262,1265,1267],{"class":40,"line":132},[38,1263,1264],{"class":44},"  \"actorTokenId\"",[38,1266,283],{"class":282},[38,1268,1269],{"class":66}," \"019fd987-a03a-70cf-9420-60538a186bbb\",\n",[38,1271,1272,1275,1277],{"class":40,"line":289},[38,1273,1274],{"class":44},"  \"permission\"",[38,1276,283],{"class":282},[38,1278,1279],{"class":66}," \"pubSub\",\n",[38,1281,1282,1284,1286,1288,1290,1292],{"class":40,"line":300},[38,1283,325],{"class":44},[38,1285,283],{"class":282},[38,1287,330],{"class":139},[38,1289,333],{"class":66},[38,1291,233],{"class":139},[38,1293,338],{"class":66},[38,1295,1296,1299,1301],{"class":40,"line":311},[38,1297,1298],{"class":44},"  \"expiresAt\"",[38,1300,283],{"class":282},[38,1302,1303],{"class":66}," \"2026-12-31T23:59:59Z\"\n",[38,1305,1306],{"class":40,"line":322},[38,1307,463],{"class":139},[15,1309,1310,1311,1314,1315,233,1318,1321,1322,1325,1326,1329,1330,1333,1334,247],{},"Required: ",[35,1312,1313],{},"permission",", one of ",[35,1316,1317],{},"subscribe",[35,1319,1320],{},"publish",", or ",[35,1323,1324],{},"pubSub",", plus exactly one\nof ",[35,1327,1328],{},"actorTokenId"," (grant a single actor) or ",[35,1331,1332],{},"actorType"," (grant every actor of that\ntype, for example ",[35,1335,1336],{},"\"agent\"",[15,1338,1339,1340,1342,1343,1346,1347,1350,1351,1353,1354,1357,1358,1360],{},"Optional: ",[35,1341,526],{}," to limit the grant to named topics rather than the whole room,\n",[35,1344,1345],{},"expiresAt"," (ISO 8601) for a time-limited grant, ",[35,1348,1349],{},"isActive"," (defaults to ",[35,1352,1083],{},"),\n",[35,1355,1356],{},"role"," as a display label, and ",[35,1359,957],{}," (arbitrary JSON object).",[15,1362,466,1363,1365,1366,1368,1369,1371,1372,1374],{},[35,1364,469],{},". A referenced ",[35,1367,1328],{}," must belong to the same project\nas the API key, otherwise the call returns ",[35,1370,810],{},". An actor (or actor type) that\nalready holds a grant on the room returns ",[35,1373,987],{},"; revoke the existing grant first.",[97,1376,1378],{"id":1377},"list-room-grants","List Room Grants",[24,1380,1381],{},[27,1382,1384],{"className":29,"code":1383,"filename":31,"language":32,"meta":33,"style":33},"GET /apps/{appId}/rooms/{roomId}/actors\n",[35,1385,1386],{"__ignoreMap":33},[38,1387,1388,1390],{"class":40,"line":41},[38,1389,112],{"class":44},[38,1391,1251],{"class":66},[15,1393,1394],{},"Returns a plain array of the room's grants.",[97,1396,1398],{"id":1397},"revoke-room-grant","Revoke Room Grant",[24,1400,1401],{},[27,1402,1404],{"className":29,"code":1403,"filename":31,"language":32,"meta":33,"style":33},"DELETE /apps/{appId}/rooms/{roomId}/actors/{roomActorAccessId}\n",[35,1405,1406],{"__ignoreMap":33},[38,1407,1408,1410],{"class":40,"line":41},[38,1409,775],{"class":44},[38,1411,1412],{"class":66}," /apps/{appId}/rooms/{roomId}/actors/{roomActorAccessId}\n",[15,1414,466,1415,1417],{},[35,1416,1207],{},". Removing the last grant returns the room to open access.",[19,1419,1421],{"id":1420},"actors","Actors",[15,1423,1424],{},"Actors represent clients that connect to NoLag (devices, users, services, sessions, agents, orchestrators, or observers). Each actor has an access token used for WebSocket connections.",[614,1426,1427],{"type":616},[15,1428,1429,1432],{},[620,1430,1431],{},"Important:"," The access token is only returned when creating an actor. Save it immediately!",[97,1434,1436],{"id":1435},"list-actors","List Actors",[24,1438,1439],{},[27,1440,1442],{"className":29,"code":1441,"filename":31,"language":32,"meta":33,"style":33},"GET /actors\n",[35,1443,1444],{"__ignoreMap":33},[38,1445,1446,1448],{"class":40,"line":41},[38,1447,112],{"class":44},[38,1449,1450],{"class":66}," /actors\n",[15,1452,1453],{},"Returns a plain array containing every actor in the project, newest first. The endpoint is not paginated and takes no query parameters.",[97,1455,1457],{"id":1456},"create-actor","Create Actor",[24,1459,1460],{},[27,1461,1463],{"className":29,"code":1462,"filename":31,"language":32,"meta":33,"style":33},"POST /actors\n\n{\n  \"name\": \"Web Client\",\n  \"actorType\": \"device\",\n  \"metadata\": {\n    \"platform\": \"web\"\n  }\n}\n",[35,1464,1465,1471,1475,1479,1488,1498,1506,1516,1520],{"__ignoreMap":33},[38,1466,1467,1469],{"class":40,"line":41},[38,1468,263],{"class":44},[38,1470,1450],{"class":66},[38,1472,1473],{"class":40,"line":118},[38,1474,122],{"emptyLinePlaceholder":121},[38,1476,1477],{"class":40,"line":125},[38,1478,274],{"class":139},[38,1480,1481,1483,1485],{"class":40,"line":132},[38,1482,279],{"class":44},[38,1484,283],{"class":282},[38,1486,1487],{"class":66}," \"Web Client\",\n",[38,1489,1490,1493,1495],{"class":40,"line":289},[38,1491,1492],{"class":44},"  \"actorType\"",[38,1494,283],{"class":282},[38,1496,1497],{"class":66}," \"device\",\n",[38,1499,1500,1502,1504],{"class":40,"line":300},[38,1501,914],{"class":44},[38,1503,283],{"class":282},[38,1505,349],{"class":66},[38,1507,1508,1511,1513],{"class":40,"line":311},[38,1509,1510],{"class":44},"    \"platform\"",[38,1512,283],{"class":282},[38,1514,1515],{"class":66}," \"web\"\n",[38,1517,1518],{"class":40,"line":322},[38,1519,933],{"class":139},[38,1521,1522],{"class":40,"line":341},[38,1523,463],{"class":139},[15,1525,466,1526,81],{},[35,1527,469],{},[15,1529,473,1530,233,1532,947,1534,1536,1537,233,1539,1542,1543,1547,1548,247],{},[35,1531,228],{},[35,1533,1332],{},[35,1535,1345],{}," (ISO 8601), ",[35,1538,957],{},[35,1540,1541],{},"accessScopeId"," (bind the actor to an ",[517,1544,1546],{"href":1545},"/docs/scopes","access scope","; the scope must belong to the same project, otherwise the call returns ",[35,1549,87],{},[15,1551,1552],{},"Actor types:",[480,1554,1555,1561,1567,1573,1579,1585,1591],{},[483,1556,1557,1560],{},[35,1558,1559],{},"device"," - Browser, mobile app, IoT device",[483,1562,1563,1566],{},[35,1564,1565],{},"user"," - Authenticated user connection",[483,1568,1569,1572],{},[35,1570,1571],{},"service"," - Backend service, microservice",[483,1574,1575,1578],{},[35,1576,1577],{},"session"," - Browser session, temporary connection",[483,1580,1581,1584],{},[35,1582,1583],{},"agent"," - Autonomous LLM-powered connection",[483,1586,1587,1590],{},[35,1588,1589],{},"orchestrator"," - Coordination actor that dispatches work across agents",[483,1592,1593,1596],{},[35,1594,1595],{},"observer"," - Read-only audit or monitoring connection",[15,1598,1599,1600,501,1602,1604],{},"Only ",[35,1601,1583],{},[35,1603,1589],{}," actors hold a persistent session across disconnects.",[15,1606,1607],{},"Response:",[24,1609,1610],{},[27,1611,1616],{"className":1612,"code":1613,"filename":1614,"language":1615,"meta":33,"style":33},"language-json shiki shiki-themes github-light github-dark","{\n  \"actorTokenId\": \"019fd987-a03a-70cf-9420-60538a186bbb\",\n  \"projectId\": \"019e8d1e-a59b-748b-9f69-dd03a91400f8\",\n  \"accessScopeId\": null,\n  \"keyId\": \"at_live_...\",\n  \"name\": \"Web Client\",\n  \"actorType\": \"device\",\n  \"accessToken\": \"...\",\n  \"status\": \"active\",\n  \"expiresAt\": null,\n  \"lastUsedAt\": null,\n  \"metadata\": null,\n  \"createdAt\": \"2026-08-07T00:03:48.000Z\"\n}\n","JSON","json",[35,1617,1618,1622,1635,1647,1659,1671,1682,1693,1705,1715,1725,1736,1746,1756],{"__ignoreMap":33},[38,1619,1620],{"class":40,"line":41},[38,1621,274],{"class":139},[38,1623,1624,1626,1629,1632],{"class":40,"line":118},[38,1625,1264],{"class":282},[38,1627,1628],{"class":139},": ",[38,1630,1631],{"class":66},"\"019fd987-a03a-70cf-9420-60538a186bbb\"",[38,1633,1634],{"class":139},",\n",[38,1636,1637,1640,1642,1645],{"class":40,"line":125},[38,1638,1639],{"class":282},"  \"projectId\"",[38,1641,1628],{"class":139},[38,1643,1644],{"class":66},"\"019e8d1e-a59b-748b-9f69-dd03a91400f8\"",[38,1646,1634],{"class":139},[38,1648,1649,1652,1654,1657],{"class":40,"line":132},[38,1650,1651],{"class":282},"  \"accessScopeId\"",[38,1653,1628],{"class":139},[38,1655,1656],{"class":282},"null",[38,1658,1634],{"class":139},[38,1660,1661,1664,1666,1669],{"class":40,"line":289},[38,1662,1663],{"class":282},"  \"keyId\"",[38,1665,1628],{"class":139},[38,1667,1668],{"class":66},"\"at_live_...\"",[38,1670,1634],{"class":139},[38,1672,1673,1675,1677,1680],{"class":40,"line":300},[38,1674,279],{"class":282},[38,1676,1628],{"class":139},[38,1678,1679],{"class":66},"\"Web Client\"",[38,1681,1634],{"class":139},[38,1683,1684,1686,1688,1691],{"class":40,"line":311},[38,1685,1492],{"class":282},[38,1687,1628],{"class":139},[38,1689,1690],{"class":66},"\"device\"",[38,1692,1634],{"class":139},[38,1694,1695,1698,1700,1703],{"class":40,"line":322},[38,1696,1697],{"class":282},"  \"accessToken\"",[38,1699,1628],{"class":139},[38,1701,1702],{"class":66},"\"...\"",[38,1704,1634],{"class":139},[38,1706,1707,1709,1711,1713],{"class":40,"line":341},[38,1708,707],{"class":282},[38,1710,1628],{"class":139},[38,1712,731],{"class":66},[38,1714,1634],{"class":139},[38,1716,1717,1719,1721,1723],{"class":40,"line":352},[38,1718,1298],{"class":282},[38,1720,1628],{"class":139},[38,1722,1656],{"class":282},[38,1724,1634],{"class":139},[38,1726,1727,1730,1732,1734],{"class":40,"line":362},[38,1728,1729],{"class":282},"  \"lastUsedAt\"",[38,1731,1628],{"class":139},[38,1733,1656],{"class":282},[38,1735,1634],{"class":139},[38,1737,1738,1740,1742,1744],{"class":40,"line":382},[38,1739,914],{"class":282},[38,1741,1628],{"class":139},[38,1743,1656],{"class":282},[38,1745,1634],{"class":139},[38,1747,1748,1751,1753],{"class":40,"line":392},[38,1749,1750],{"class":282},"  \"createdAt\"",[38,1752,1628],{"class":139},[38,1754,1755],{"class":66},"\"2026-08-07T00:03:48.000Z\"\n",[38,1757,1758],{"class":40,"line":411},[38,1759,463],{"class":139},[614,1761,1763,1791],{"type":1762},"info",[15,1764,1765,1770,1771,1774,1775,1778,1779,1781,1782,237,1785,1788,1789,81],{},[620,1766,1767,1768,81],{},"The actor's id field is ",[35,1769,1328],{}," There is no field literally named\n",[35,1772,1773],{},"actorId"," in any response. The ",[35,1776,1777],{},"{actorId}"," path parameter in the endpoints below\naccepts either the ",[35,1780,1328],{}," UUID or the ",[35,1783,1784],{},"keyId",[35,1786,1787],{},"at_live_...","), so you can\nmanage an actor from whichever identifier you have. Any other value returns ",[35,1790,87],{},[15,1792,1793,1795,1796,1799,1800,81],{},[35,1794,1784],{}," is the actor's public identifier and is also the ",[35,1797,1798],{},"sub"," claim when minting\n",[517,1801,1803],{"href":1802},"/docs/client-tokens","client tokens",[97,1805,1807],{"id":1806},"get-actor","Get Actor",[24,1809,1810],{},[27,1811,1813],{"className":29,"code":1812,"filename":31,"language":32,"meta":33,"style":33},"GET /actors/{actorId}\n",[35,1814,1815],{"__ignoreMap":33},[38,1816,1817,1819],{"class":40,"line":41},[38,1818,112],{"class":44},[38,1820,1821],{"class":66}," /actors/{actorId}\n",[97,1823,1825],{"id":1824},"update-actor","Update Actor",[24,1827,1828],{},[27,1829,1831],{"className":29,"code":1830,"filename":31,"language":32,"meta":33,"style":33},"PATCH /actors/{actorId}\n\n{\n  \"name\": \"Updated Name\",\n  \"status\": \"active\",\n  \"metadata\": {\n    \"platform\": \"mobile\"\n  }\n}\n",[35,1832,1833,1839,1843,1847,1855,1864,1872,1881,1885],{"__ignoreMap":33},[38,1834,1835,1837],{"class":40,"line":41},[38,1836,674],{"class":44},[38,1838,1821],{"class":66},[38,1840,1841],{"class":40,"line":118},[38,1842,122],{"emptyLinePlaceholder":121},[38,1844,1845],{"class":40,"line":125},[38,1846,274],{"class":139},[38,1848,1849,1851,1853],{"class":40,"line":132},[38,1850,279],{"class":44},[38,1852,283],{"class":282},[38,1854,693],{"class":66},[38,1856,1857,1859,1861],{"class":40,"line":289},[38,1858,707],{"class":44},[38,1860,283],{"class":282},[38,1862,1863],{"class":66}," \"active\",\n",[38,1865,1866,1868,1870],{"class":40,"line":300},[38,1867,914],{"class":44},[38,1869,283],{"class":282},[38,1871,349],{"class":66},[38,1873,1874,1876,1878],{"class":40,"line":311},[38,1875,1510],{"class":44},[38,1877,283],{"class":282},[38,1879,1880],{"class":66}," \"mobile\"\n",[38,1882,1883],{"class":40,"line":322},[38,1884,933],{"class":139},[38,1886,1887],{"class":40,"line":341},[38,1888,463],{"class":139},[15,1890,719,1891,233,1893,237,1895,732,1897,196,1899,233,1901,233,1903,1905,1906,1908,1909,1911],{},[35,1892,228],{},[35,1894,236],{},[35,1896,731],{},[35,1898,735],{},[35,1900,1345],{},[35,1902,957],{},[35,1904,1541],{}," (a scope UUID from the same project, or ",[35,1907,1656],{}," to clear the scope). ",[35,1910,1332],{}," cannot be changed; delete and recreate the actor instead.",[15,1913,1914],{},"A scope change takes effect at the actor's next connection, or within about 10 minutes for a live connection when the broker revalidates it.",[97,1916,1918],{"id":1917},"delete-actor","Delete Actor",[24,1920,1921],{},[27,1922,1924],{"className":29,"code":1923,"filename":31,"language":32,"meta":33,"style":33},"DELETE /actors/{actorId}\n",[35,1925,1926],{"__ignoreMap":33},[38,1927,1928,1930],{"class":40,"line":41},[38,1929,775],{"class":44},[38,1931,1821],{"class":66},[15,1933,466,1934,1208],{},[35,1935,1207],{},[19,1937,1939],{"id":1938},"scopes","Scopes",[15,1941,1942,1943,1225],{},"Access scopes isolate tenants within a project. An actor bound to a scope can only reach addresses inside that scope; the broker inserts the scope slug into the topic address on the actor's behalf, so client code is unchanged. See ",[517,1944,1945],{"href":1545},"Access Scopes",[97,1947,1949],{"id":1948},"list-scopes","List Scopes",[24,1951,1952],{},[27,1953,1955],{"className":29,"code":1954,"filename":31,"language":32,"meta":33,"style":33},"GET /scopes\n\n# Query parameters (optional)\n?page=1&limit=20&slug=acme&name=Acme&isActive=true\n",[35,1956,1957,1964,1968,1972],{"__ignoreMap":33},[38,1958,1959,1961],{"class":40,"line":41},[38,1960,112],{"class":44},[38,1962,1963],{"class":66}," /scopes\n",[38,1965,1966],{"class":40,"line":118},[38,1967,122],{"emptyLinePlaceholder":121},[38,1969,1970],{"class":40,"line":125},[38,1971,129],{"class":128},[38,1973,1974,1976,1978,1980,1982,1984,1986,1988,1991,1993,1996,1998,2000,2003,2006,2008],{"class":40,"line":132},[38,1975,136],{"class":135},[38,1977,140],{"class":139},[38,1979,143],{"class":135},[38,1981,146],{"class":66},[38,1983,149],{"class":139},[38,1985,143],{"class":135},[38,1987,154],{"class":66},[38,1989,1990],{"class":139},"&slug",[38,1992,143],{"class":135},[38,1994,1995],{"class":66},"acme",[38,1997,166],{"class":139},[38,1999,143],{"class":135},[38,2001,2002],{"class":66},"Acme",[38,2004,2005],{"class":139},"&isActive",[38,2007,143],{"class":135},[38,2009,2010],{"class":66},"true\n",[15,2012,2013,2014,233,2016,233,2018,233,2020,233,2022,233,2024,237,2026,217,2029,247],{},"Returns a paginated list of scopes. Query parameters: ",[35,2015,140],{},[35,2017,199],{},[35,2019,160],{},[35,2021,492],{},[35,2023,228],{},[35,2025,1349],{},[35,2027,2028],{},"\"true\"",[35,2030,2031],{},"\"false\"",[97,2033,2035],{"id":2034},"get-scope","Get Scope",[24,2037,2038],{},[27,2039,2041],{"className":29,"code":2040,"filename":31,"language":32,"meta":33,"style":33},"GET /scopes/{scopeId}\n",[35,2042,2043],{"__ignoreMap":33},[38,2044,2045,2047],{"class":40,"line":41},[38,2046,112],{"class":44},[38,2048,2049],{"class":66}," /scopes/{scopeId}\n",[97,2051,2053],{"id":2052},"create-scope","Create Scope",[24,2055,2056],{},[27,2057,2059],{"className":29,"code":2058,"filename":31,"language":32,"meta":33,"style":33},"POST /scopes\n\n{\n  \"slug\": \"acme\",\n  \"name\": \"Acme Corporation\",\n  \"description\": \"Isolation scope for the Acme tenant\",\n  \"metadata\": { \"tenantId\": \"tenant-123\" }\n}\n",[35,2060,2061,2067,2071,2075,2084,2093,2102,2118],{"__ignoreMap":33},[38,2062,2063,2065],{"class":40,"line":41},[38,2064,263],{"class":44},[38,2066,1963],{"class":66},[38,2068,2069],{"class":40,"line":118},[38,2070,122],{"emptyLinePlaceholder":121},[38,2072,2073],{"class":40,"line":125},[38,2074,274],{"class":139},[38,2076,2077,2079,2081],{"class":40,"line":132},[38,2078,314],{"class":44},[38,2080,283],{"class":282},[38,2082,2083],{"class":66}," \"acme\",\n",[38,2085,2086,2088,2090],{"class":40,"line":289},[38,2087,279],{"class":44},[38,2089,283],{"class":282},[38,2091,2092],{"class":66}," \"Acme Corporation\",\n",[38,2094,2095,2097,2099],{"class":40,"line":300},[38,2096,292],{"class":44},[38,2098,283],{"class":282},[38,2100,2101],{"class":66}," \"Isolation scope for the Acme tenant\",\n",[38,2103,2104,2106,2108,2110,2113,2116],{"class":40,"line":311},[38,2105,914],{"class":44},[38,2107,283],{"class":282},[38,2109,370],{"class":66},[38,2111,2112],{"class":66}," \"tenantId\":",[38,2114,2115],{"class":66}," \"tenant-123\"",[38,2117,408],{"class":66},[38,2119,2120],{"class":40,"line":322},[38,2121,463],{"class":139},[15,2123,466,2124,81],{},[35,2125,469],{},[15,2127,473,2128,2130,2131,947,2133,233,2135,81],{},[35,2129,492],{}," (lowercase alphanumeric and hyphens, no leading or trailing hyphen, up to 100 characters; immutable after creation because it appears in every topic address the scope's actors resolve to) and ",[35,2132,228],{},[35,2134,487],{},[35,2136,957],{},[15,2138,2139,2140,81],{},"A duplicate slug within the project returns ",[35,2141,987],{},[15,2143,1607],{},[24,2145,2146],{},[27,2147,2149],{"className":1612,"code":2148,"filename":1614,"language":1615,"meta":33,"style":33},"{\n  \"accessScopeId\": \"01939f83-8b57-7c3e-a456-426614174000\",\n  \"projectId\": \"01939f83-8b57-7c3e-a456-426614174001\",\n  \"slug\": \"acme\",\n  \"name\": \"Acme Corporation\",\n  \"description\": \"Isolation scope for the Acme tenant\",\n  \"metadata\": { \"tenantId\": \"tenant-123\" },\n  \"isActive\": true,\n  \"createdAt\": \"2026-01-15T10:30:00.000Z\",\n  \"updatedAt\": \"2026-01-15T10:30:00.000Z\"\n}\n",[35,2150,2151,2155,2166,2177,2188,2199,2210,2227,2238,2249,2259],{"__ignoreMap":33},[38,2152,2153],{"class":40,"line":41},[38,2154,274],{"class":139},[38,2156,2157,2159,2161,2164],{"class":40,"line":118},[38,2158,1651],{"class":282},[38,2160,1628],{"class":139},[38,2162,2163],{"class":66},"\"01939f83-8b57-7c3e-a456-426614174000\"",[38,2165,1634],{"class":139},[38,2167,2168,2170,2172,2175],{"class":40,"line":125},[38,2169,1639],{"class":282},[38,2171,1628],{"class":139},[38,2173,2174],{"class":66},"\"01939f83-8b57-7c3e-a456-426614174001\"",[38,2176,1634],{"class":139},[38,2178,2179,2181,2183,2186],{"class":40,"line":132},[38,2180,314],{"class":282},[38,2182,1628],{"class":139},[38,2184,2185],{"class":66},"\"acme\"",[38,2187,1634],{"class":139},[38,2189,2190,2192,2194,2197],{"class":40,"line":289},[38,2191,279],{"class":282},[38,2193,1628],{"class":139},[38,2195,2196],{"class":66},"\"Acme Corporation\"",[38,2198,1634],{"class":139},[38,2200,2201,2203,2205,2208],{"class":40,"line":300},[38,2202,292],{"class":282},[38,2204,1628],{"class":139},[38,2206,2207],{"class":66},"\"Isolation scope for the Acme tenant\"",[38,2209,1634],{"class":139},[38,2211,2212,2214,2217,2220,2222,2225],{"class":40,"line":311},[38,2213,914],{"class":282},[38,2215,2216],{"class":139},": { ",[38,2218,2219],{"class":282},"\"tenantId\"",[38,2221,1628],{"class":139},[38,2223,2224],{"class":66},"\"tenant-123\"",[38,2226,379],{"class":139},[38,2228,2229,2232,2234,2236],{"class":40,"line":322},[38,2230,2231],{"class":282},"  \"isActive\"",[38,2233,1628],{"class":139},[38,2235,1083],{"class":282},[38,2237,1634],{"class":139},[38,2239,2240,2242,2244,2247],{"class":40,"line":341},[38,2241,1750],{"class":282},[38,2243,1628],{"class":139},[38,2245,2246],{"class":66},"\"2026-01-15T10:30:00.000Z\"",[38,2248,1634],{"class":139},[38,2250,2251,2254,2256],{"class":40,"line":352},[38,2252,2253],{"class":282},"  \"updatedAt\"",[38,2255,1628],{"class":139},[38,2257,2258],{"class":66},"\"2026-01-15T10:30:00.000Z\"\n",[38,2260,2261],{"class":40,"line":362},[38,2262,463],{"class":139},[97,2264,2266],{"id":2265},"update-scope","Update Scope",[24,2268,2269],{},[27,2270,2272],{"className":29,"code":2271,"filename":31,"language":32,"meta":33,"style":33},"PATCH /scopes/{scopeId}\n\n{\n  \"name\": \"Acme Corp\",\n  \"isActive\": false\n}\n",[35,2273,2274,2280,2284,2288,2297,2306],{"__ignoreMap":33},[38,2275,2276,2278],{"class":40,"line":41},[38,2277,674],{"class":44},[38,2279,2049],{"class":66},[38,2281,2282],{"class":40,"line":118},[38,2283,122],{"emptyLinePlaceholder":121},[38,2285,2286],{"class":40,"line":125},[38,2287,274],{"class":139},[38,2289,2290,2292,2294],{"class":40,"line":132},[38,2291,279],{"class":44},[38,2293,283],{"class":282},[38,2295,2296],{"class":66}," \"Acme Corp\",\n",[38,2298,2299,2301,2303],{"class":40,"line":289},[38,2300,2231],{"class":44},[38,2302,283],{"class":282},[38,2304,2305],{"class":282}," false\n",[38,2307,2308],{"class":40,"line":300},[38,2309,463],{"class":139},[15,2311,719,2312,233,2314,233,2316,233,2318,2320,2321,2323],{},[35,2313,228],{},[35,2315,487],{},[35,2317,957],{},[35,2319,1349],{},". ",[35,2322,492],{}," cannot be changed.",[15,2325,2326,2327,2329,2330,2333,2334,81],{},"Setting ",[35,2328,1349],{}," to ",[35,2331,2332],{},"false"," does not unscope the actors bound to the scope: they are denied at their next connection and disconnected at the broker's next revalidation, with the reason ",[35,2335,2336],{},"scope_inactive",[97,2338,2340],{"id":2339},"delete-scope","Delete Scope",[24,2342,2343],{},[27,2344,2346],{"className":29,"code":2345,"filename":31,"language":32,"meta":33,"style":33},"DELETE /scopes/{scopeId}\n",[35,2347,2348],{"__ignoreMap":33},[38,2349,2350,2352],{"class":40,"line":41},[38,2351,775],{"class":44},[38,2353,2049],{"class":66},[15,2355,466,2356,2358,2359,2361,2362,783,2365,2368],{},[35,2357,1207],{},". Deleting a scope that still has actors assigned returns ",[35,2360,987],{},"; move or delete those actors first (",[35,2363,2364],{},"PATCH /actors/{actorId}",[35,2366,2367],{},"\"accessScopeId\": null"," clears the binding).",[97,2370,2372],{"id":2371},"list-actors-in-scope","List Actors in Scope",[24,2374,2375],{},[27,2376,2378],{"className":29,"code":2377,"filename":31,"language":32,"meta":33,"style":33},"GET /scopes/{scopeId}/actors\n",[35,2379,2380],{"__ignoreMap":33},[38,2381,2382,2384],{"class":40,"line":41},[38,2383,112],{"class":44},[38,2385,2386],{"class":66}," /scopes/{scopeId}/actors\n",[15,2388,2389],{},"Returns a plain array of every actor bound to the scope, newest first.",[19,2391,2393],{"id":2392},"signing-keys","Signing Keys",[15,2395,2396,2397,2399],{},"Signing keys let your backend mint short-lived ",[517,2398,1803],{"href":1802}," for browsers and mobile apps instead of shipping actor access tokens.",[97,2401,2403],{"id":2402},"list-signing-keys","List Signing Keys",[24,2405,2406],{},[27,2407,2409],{"className":29,"code":2408,"filename":31,"language":32,"meta":33,"style":33},"GET /signing-keys\n\n# Query parameters (optional)\n?page=1&limit=20&name=backend&status=active\n",[35,2410,2411,2418,2422,2426],{"__ignoreMap":33},[38,2412,2413,2415],{"class":40,"line":41},[38,2414,112],{"class":44},[38,2416,2417],{"class":66}," /signing-keys\n",[38,2419,2420],{"class":40,"line":118},[38,2421,122],{"emptyLinePlaceholder":121},[38,2423,2424],{"class":40,"line":125},[38,2425,129],{"class":128},[38,2427,2428,2430,2432,2434,2436,2438,2440,2442,2444,2446,2449,2451,2453],{"class":40,"line":132},[38,2429,136],{"class":135},[38,2431,140],{"class":139},[38,2433,143],{"class":135},[38,2435,146],{"class":66},[38,2437,149],{"class":139},[38,2439,143],{"class":135},[38,2441,154],{"class":66},[38,2443,166],{"class":139},[38,2445,143],{"class":135},[38,2447,2448],{"class":66},"backend",[38,2450,182],{"class":139},[38,2452,143],{"class":135},[38,2454,187],{"class":66},[15,2456,2457,2458,233,2460,233,2462,233,2464,229,2466,237,2468,732,2470,2472],{},"Returns a paginated list of signing keys. Query parameters: ",[35,2459,140],{},[35,2461,199],{},[35,2463,160],{},[35,2465,228],{},[35,2467,236],{},[35,2469,240],{},[35,2471,243],{},"). The secret is never returned by list or get.",[97,2474,2476],{"id":2475},"get-signing-key","Get Signing Key",[24,2478,2479],{},[27,2480,2482],{"className":29,"code":2481,"filename":31,"language":32,"meta":33,"style":33},"GET /signing-keys/{signingKeyId}\n",[35,2483,2484],{"__ignoreMap":33},[38,2485,2486,2488],{"class":40,"line":41},[38,2487,112],{"class":44},[38,2489,2490],{"class":66}," /signing-keys/{signingKeyId}\n",[97,2492,2494],{"id":2493},"create-signing-key","Create Signing Key",[24,2496,2497],{},[27,2498,2500],{"className":29,"code":2499,"filename":31,"language":32,"meta":33,"style":33},"POST /signing-keys\n\n{\n  \"name\": \"Production backend\",\n  \"environment\": \"live\"\n}\n",[35,2501,2502,2508,2512,2516,2525,2535],{"__ignoreMap":33},[38,2503,2504,2506],{"class":40,"line":41},[38,2505,263],{"class":44},[38,2507,2417],{"class":66},[38,2509,2510],{"class":40,"line":118},[38,2511,122],{"emptyLinePlaceholder":121},[38,2513,2514],{"class":40,"line":125},[38,2515,274],{"class":139},[38,2517,2518,2520,2522],{"class":40,"line":132},[38,2519,279],{"class":44},[38,2521,283],{"class":282},[38,2523,2524],{"class":66}," \"Production backend\",\n",[38,2526,2527,2530,2532],{"class":40,"line":289},[38,2528,2529],{"class":44},"  \"environment\"",[38,2531,283],{"class":282},[38,2533,2534],{"class":66}," \"live\"\n",[38,2536,2537],{"class":40,"line":300},[38,2538,463],{"class":139},[15,2540,466,2541,81],{},[35,2542,469],{},[15,2544,473,2545,947,2547,237,2550,2553,2554,2557,2558,2560],{},[35,2546,228],{},[35,2548,2549],{},"environment",[35,2551,2552],{},"\"live\""," (default) or ",[35,2555,2556],{},"\"sandbox\"","; decides the ",[35,2559,1784],{}," prefix).",[15,2562,1607],{},[24,2564,2565],{},[27,2566,2568],{"className":1612,"code":2567,"filename":1614,"language":1615,"meta":33,"style":33},"{\n  \"signingKeyId\": \"01939f83-8b57-7c3e-a456-426614174001\",\n  \"projectId\": \"01939f83-8b57-7c3e-a456-426614174002\",\n  \"keyId\": \"sk_live_abc123def456\",\n  \"name\": \"Production backend\",\n  \"status\": \"active\",\n  \"lastUsedAt\": null,\n  \"createdAt\": \"2026-01-15T10:30:00.000Z\",\n  \"signingKey\": \"sk_live_abc123def456.dGVzdHNlY3JldGZvcmV4YW1wbGVwdXJwb3Nlcw\"\n}\n",[35,2569,2570,2574,2585,2596,2607,2618,2628,2638,2648,2658],{"__ignoreMap":33},[38,2571,2572],{"class":40,"line":41},[38,2573,274],{"class":139},[38,2575,2576,2579,2581,2583],{"class":40,"line":118},[38,2577,2578],{"class":282},"  \"signingKeyId\"",[38,2580,1628],{"class":139},[38,2582,2174],{"class":66},[38,2584,1634],{"class":139},[38,2586,2587,2589,2591,2594],{"class":40,"line":125},[38,2588,1639],{"class":282},[38,2590,1628],{"class":139},[38,2592,2593],{"class":66},"\"01939f83-8b57-7c3e-a456-426614174002\"",[38,2595,1634],{"class":139},[38,2597,2598,2600,2602,2605],{"class":40,"line":132},[38,2599,1663],{"class":282},[38,2601,1628],{"class":139},[38,2603,2604],{"class":66},"\"sk_live_abc123def456\"",[38,2606,1634],{"class":139},[38,2608,2609,2611,2613,2616],{"class":40,"line":289},[38,2610,279],{"class":282},[38,2612,1628],{"class":139},[38,2614,2615],{"class":66},"\"Production backend\"",[38,2617,1634],{"class":139},[38,2619,2620,2622,2624,2626],{"class":40,"line":300},[38,2621,707],{"class":282},[38,2623,1628],{"class":139},[38,2625,731],{"class":66},[38,2627,1634],{"class":139},[38,2629,2630,2632,2634,2636],{"class":40,"line":311},[38,2631,1729],{"class":282},[38,2633,1628],{"class":139},[38,2635,1656],{"class":282},[38,2637,1634],{"class":139},[38,2639,2640,2642,2644,2646],{"class":40,"line":322},[38,2641,1750],{"class":282},[38,2643,1628],{"class":139},[38,2645,2246],{"class":66},[38,2647,1634],{"class":139},[38,2649,2650,2653,2655],{"class":40,"line":341},[38,2651,2652],{"class":282},"  \"signingKey\"",[38,2654,1628],{"class":139},[38,2656,2657],{"class":66},"\"sk_live_abc123def456.dGVzdHNlY3JldGZvcmV4YW1wbGVwdXJwb3Nlcw\"\n",[38,2659,2660],{"class":40,"line":352},[38,2661,463],{"class":139},[614,2663,2664],{"type":616},[15,2665,2666,2672,2673,2676,2677,2679,2680,81],{},[620,2667,2668,2671],{},[35,2669,2670],{},"signingKey"," is returned once."," Only an encrypted copy is stored, so save it\nimmediately (for example as ",[35,2674,2675],{},"NOLAG_SIGNING_KEY"," on your backend). ",[35,2678,1784],{}," is public\nand goes in the JWT header as ",[35,2681,2682],{},"kid",[97,2684,2686],{"id":2685},"update-signing-key","Update Signing Key",[24,2688,2689],{},[27,2690,2692],{"className":29,"code":2691,"filename":31,"language":32,"meta":33,"style":33},"PATCH /signing-keys/{signingKeyId}\n\n{\n  \"name\": \"Production backend (rotated)\",\n  \"status\": \"disabled\"\n}\n",[35,2693,2694,2700,2704,2708,2717,2726],{"__ignoreMap":33},[38,2695,2696,2698],{"class":40,"line":41},[38,2697,674],{"class":44},[38,2699,2490],{"class":66},[38,2701,2702],{"class":40,"line":118},[38,2703,122],{"emptyLinePlaceholder":121},[38,2705,2706],{"class":40,"line":125},[38,2707,274],{"class":139},[38,2709,2710,2712,2714],{"class":40,"line":132},[38,2711,279],{"class":44},[38,2713,283],{"class":282},[38,2715,2716],{"class":66}," \"Production backend (rotated)\",\n",[38,2718,2719,2721,2723],{"class":40,"line":289},[38,2720,707],{"class":44},[38,2722,283],{"class":282},[38,2724,2725],{"class":66}," \"disabled\"\n",[38,2727,2728],{"class":40,"line":300},[38,2729,463],{"class":139},[15,2731,719,2732,233,2734,237,2736,732,2738,2740,2741,2743],{},[35,2733,228],{},[35,2735,236],{},[35,2737,731],{},[35,2739,735],{},"). Any status other than ",[35,2742,240],{}," stops client tokens signed with the key from verifying. The secret cannot be changed; rotate by creating a new key and deleting the old one.",[97,2745,2747],{"id":2746},"delete-signing-key","Delete Signing Key",[24,2749,2750],{},[27,2751,2753],{"className":29,"code":2752,"filename":31,"language":32,"meta":33,"style":33},"DELETE /signing-keys/{signingKeyId}\n",[35,2754,2755],{"__ignoreMap":33},[38,2756,2757,2759],{"class":40,"line":41},[38,2758,775],{"class":44},[38,2760,2490],{"class":66},[15,2762,466,2763,2765],{},[35,2764,1207],{},". Client tokens signed with the deleted key stop verifying within 60 seconds.",[19,2767,2769],{"id":2768},"topic-patterns","Topic Patterns",[15,2771,2772,2773,283],{},"Topics follow the pattern ",[35,2774,2775],{},"app-slug/room-slug/topic-name",[24,2777,2778],{},[27,2779,2781],{"className":29,"code":2780,"filename":31,"language":32,"meta":33,"style":33},"# Example topic patterns\nmy-chat-app-a3f9/general/messages\nmy-chat-app-a3f9/general/typing\nmy-chat-app-a3f9/private-room/notifications\n",[35,2782,2783,2788,2793,2798],{"__ignoreMap":33},[38,2784,2785],{"class":40,"line":41},[38,2786,2787],{"class":128},"# Example topic patterns\n",[38,2789,2790],{"class":40,"line":118},[38,2791,2792],{"class":44},"my-chat-app-a3f9/general/messages\n",[38,2794,2795],{"class":40,"line":125},[38,2796,2797],{"class":44},"my-chat-app-a3f9/general/typing\n",[38,2799,2800],{"class":40,"line":132},[38,2801,2802],{"class":44},"my-chat-app-a3f9/private-room/notifications\n",[15,2804,2805,2806,2808,2809,247],{},"The app slug is the suffixed value returned when the app was created. Topic names are single tokens (",[35,2807,530],{},", no ",[35,2810,2811],{},"/",[19,2813,2815],{"id":2814},"response-format","Response Format",[15,2817,2818,2819,2822,2823,2826],{},"Successful responses return the resource directly. The Apps, Scopes and Signing Keys list endpoints are paginated, wrapping results in a ",[35,2820,2821],{},"data"," array with a ",[35,2824,2825],{},"pagination"," object. The Rooms, Room Grants, Actors and Actors-in-Scope list endpoints return plain arrays with every record.",[24,2828,2829],{},[27,2830,2832],{"className":1612,"code":2831,"filename":1614,"language":1615,"meta":33,"style":33},"// Single resource (e.g. GET /apps/{appId})\n{\n  \"appId\": \"01939f83-8b57-7c3e-a456-426614174000\",\n  \"name\": \"My App\",\n  \"slug\": \"my-app-a3f9\",\n  \"description\": \"...\",\n  \"status\": \"active\",\n  \"createdAt\": \"2024-01-01T00:00:00Z\"\n}\n\n// Paginated list (Apps, Scopes, Signing Keys)\n{\n  \"data\": [...],\n  \"pagination\": {\n    \"total\": 100,\n    \"page\": 1,\n    \"pageCount\": 5\n  }\n}\n\n// Plain array (Rooms, Actors, grants, actors in scope)\n[\n  { \"roomId\": \"...\", \"name\": \"General\", ... },\n  { \"roomId\": \"...\", \"name\": \"Private\", ... }\n]\n",[35,2833,2834,2839,2843,2854,2865,2876,2886,2896,2905,2909,2913,2918,2922,2937,2945,2956,2967,2977,2981,2986,2991,2997,3003,3032,3058],{"__ignoreMap":33},[38,2835,2836],{"class":40,"line":41},[38,2837,2838],{"class":128},"// Single resource (e.g. GET /apps/{appId})\n",[38,2840,2841],{"class":40,"line":118},[38,2842,274],{"class":139},[38,2844,2845,2848,2850,2852],{"class":40,"line":125},[38,2846,2847],{"class":282},"  \"appId\"",[38,2849,1628],{"class":139},[38,2851,2163],{"class":66},[38,2853,1634],{"class":139},[38,2855,2856,2858,2860,2863],{"class":40,"line":132},[38,2857,279],{"class":282},[38,2859,1628],{"class":139},[38,2861,2862],{"class":66},"\"My App\"",[38,2864,1634],{"class":139},[38,2866,2867,2869,2871,2874],{"class":40,"line":289},[38,2868,314],{"class":282},[38,2870,1628],{"class":139},[38,2872,2873],{"class":66},"\"my-app-a3f9\"",[38,2875,1634],{"class":139},[38,2877,2878,2880,2882,2884],{"class":40,"line":300},[38,2879,292],{"class":282},[38,2881,1628],{"class":139},[38,2883,1702],{"class":66},[38,2885,1634],{"class":139},[38,2887,2888,2890,2892,2894],{"class":40,"line":311},[38,2889,707],{"class":282},[38,2891,1628],{"class":139},[38,2893,731],{"class":66},[38,2895,1634],{"class":139},[38,2897,2898,2900,2902],{"class":40,"line":322},[38,2899,1750],{"class":282},[38,2901,1628],{"class":139},[38,2903,2904],{"class":66},"\"2024-01-01T00:00:00Z\"\n",[38,2906,2907],{"class":40,"line":341},[38,2908,463],{"class":139},[38,2910,2911],{"class":40,"line":352},[38,2912,122],{"emptyLinePlaceholder":121},[38,2914,2915],{"class":40,"line":362},[38,2916,2917],{"class":128},"// Paginated list (Apps, Scopes, Signing Keys)\n",[38,2919,2920],{"class":40,"line":382},[38,2921,274],{"class":139},[38,2923,2924,2927,2930,2934],{"class":40,"line":392},[38,2925,2926],{"class":282},"  \"data\"",[38,2928,2929],{"class":139},": [",[38,2931,2933],{"class":2932},"s7hpK","...",[38,2935,2936],{"class":139},"],\n",[38,2938,2939,2942],{"class":40,"line":411},[38,2940,2941],{"class":282},"  \"pagination\"",[38,2943,2944],{"class":139},": {\n",[38,2946,2947,2950,2952,2954],{"class":40,"line":417},[38,2948,2949],{"class":282},"    \"total\"",[38,2951,1628],{"class":139},[38,2953,209],{"class":282},[38,2955,1634],{"class":139},[38,2957,2958,2961,2963,2965],{"class":40,"line":423},[38,2959,2960],{"class":282},"    \"page\"",[38,2962,1628],{"class":139},[38,2964,146],{"class":282},[38,2966,1634],{"class":139},[38,2968,2969,2972,2974],{"class":40,"line":429},[38,2970,2971],{"class":282},"    \"pageCount\"",[38,2973,1628],{"class":139},[38,2975,2976],{"class":282},"5\n",[38,2978,2979],{"class":40,"line":460},[38,2980,933],{"class":139},[38,2982,2984],{"class":40,"line":2983},19,[38,2985,463],{"class":139},[38,2987,2989],{"class":40,"line":2988},20,[38,2990,122],{"emptyLinePlaceholder":121},[38,2992,2994],{"class":40,"line":2993},21,[38,2995,2996],{"class":128},"// Plain array (Rooms, Actors, grants, actors in scope)\n",[38,2998,3000],{"class":40,"line":2999},22,[38,3001,3002],{"class":139},"[\n",[38,3004,3006,3009,3012,3014,3016,3018,3021,3023,3026,3028,3030],{"class":40,"line":3005},23,[38,3007,3008],{"class":139},"  { ",[38,3010,3011],{"class":282},"\"roomId\"",[38,3013,1628],{"class":139},[38,3015,1702],{"class":66},[38,3017,233],{"class":139},[38,3019,3020],{"class":282},"\"name\"",[38,3022,1628],{"class":139},[38,3024,3025],{"class":66},"\"General\"",[38,3027,233],{"class":139},[38,3029,2933],{"class":2932},[38,3031,379],{"class":139},[38,3033,3035,3037,3039,3041,3043,3045,3047,3049,3052,3054,3056],{"class":40,"line":3034},24,[38,3036,3008],{"class":139},[38,3038,3011],{"class":282},[38,3040,1628],{"class":139},[38,3042,1702],{"class":66},[38,3044,233],{"class":139},[38,3046,3020],{"class":282},[38,3048,1628],{"class":139},[38,3050,3051],{"class":66},"\"Private\"",[38,3053,233],{"class":139},[38,3055,2933],{"class":2932},[38,3057,408],{"class":139},[38,3059,3061],{"class":40,"line":3060},25,[38,3062,1063],{"class":139},[15,3064,3065,3066,3069],{},"Error responses come in two shapes. Errors raised by NoLag's own checks (unknown\nresource, duplicate slug, invalid identifier, bad credentials) carry a unique ",[35,3067,3068],{},"id","\nyou can quote to support:",[24,3071,3072],{},[27,3073,3075],{"className":1612,"code":3074,"filename":1614,"language":1615,"meta":33,"style":33},"{\n  \"id\": \"01939f83-8b57-7c3e-a456-426614174000\",\n  \"message\": \"Room with slug \\\"general\\\" already exists\",\n  \"timestamp\": \"2024-01-15T10:30:00.000Z\"\n}\n",[35,3076,3077,3081,3092,3115,3125],{"__ignoreMap":33},[38,3078,3079],{"class":40,"line":41},[38,3080,274],{"class":139},[38,3082,3083,3086,3088,3090],{"class":40,"line":118},[38,3084,3085],{"class":282},"  \"id\"",[38,3087,1628],{"class":139},[38,3089,2163],{"class":66},[38,3091,1634],{"class":139},[38,3093,3094,3097,3099,3102,3105,3108,3110,3113],{"class":40,"line":125},[38,3095,3096],{"class":282},"  \"message\"",[38,3098,1628],{"class":139},[38,3100,3101],{"class":66},"\"Room with slug ",[38,3103,3104],{"class":282},"\\\"",[38,3106,3107],{"class":66},"general",[38,3109,3104],{"class":282},[38,3111,3112],{"class":66}," already exists\"",[38,3114,1634],{"class":139},[38,3116,3117,3120,3122],{"class":40,"line":132},[38,3118,3119],{"class":282},"  \"timestamp\"",[38,3121,1628],{"class":139},[38,3123,3124],{"class":66},"\"2024-01-15T10:30:00.000Z\"\n",[38,3126,3127],{"class":40,"line":289},[38,3128,463],{"class":139},[15,3130,3131],{},"Framework-level errors (a key that is not project-scoped, an app that is not in\nyour project, a plan limit) use the standard NestJS shape:",[24,3133,3134],{},[27,3135,3137],{"className":1612,"code":3136,"filename":1614,"language":1615,"meta":33,"style":33},"{\n  \"statusCode\": 403,\n  \"message\": \"API key must be project-scoped to access this endpoint\",\n  \"error\": \"Forbidden\"\n}\n",[35,3138,3139,3143,3154,3165,3175],{"__ignoreMap":33},[38,3140,3141],{"class":40,"line":41},[38,3142,274],{"class":139},[38,3144,3145,3148,3150,3152],{"class":40,"line":118},[38,3146,3147],{"class":282},"  \"statusCode\"",[38,3149,1628],{"class":139},[38,3151,76],{"class":282},[38,3153,1634],{"class":139},[38,3155,3156,3158,3160,3163],{"class":40,"line":125},[38,3157,3096],{"class":282},[38,3159,1628],{"class":139},[38,3161,3162],{"class":66},"\"API key must be project-scoped to access this endpoint\"",[38,3164,1634],{"class":139},[38,3166,3167,3170,3172],{"class":40,"line":132},[38,3168,3169],{"class":282},"  \"error\"",[38,3171,1628],{"class":139},[38,3173,3174],{"class":66},"\"Forbidden\"\n",[38,3176,3177],{"class":40,"line":289},[38,3178,463],{"class":139},[15,3180,3181,3182,3184],{},"Body validation failures return ",[35,3183,87],{}," with one entry per failed constraint:",[24,3186,3187],{},[27,3188,3190],{"className":1612,"code":3189,"filename":1614,"language":1615,"meta":33,"style":33},"{\n  \"message\": \"Validation failed\",\n  \"errors\": [\n    { \"path\": \"slug\", \"value\": \"My Slug\", \"message\": \"slug must be lowercase alphanumeric with hyphens (no leading/trailing hyphens)\" }\n  ]\n}\n",[35,3191,3192,3196,3207,3215,3250,3255],{"__ignoreMap":33},[38,3193,3194],{"class":40,"line":41},[38,3195,274],{"class":139},[38,3197,3198,3200,3202,3205],{"class":40,"line":118},[38,3199,3096],{"class":282},[38,3201,1628],{"class":139},[38,3203,3204],{"class":66},"\"Validation failed\"",[38,3206,1634],{"class":139},[38,3208,3209,3212],{"class":40,"line":125},[38,3210,3211],{"class":282},"  \"errors\"",[38,3213,3214],{"class":139},": [\n",[38,3216,3217,3220,3223,3225,3228,3230,3233,3235,3238,3240,3243,3245,3248],{"class":40,"line":132},[38,3218,3219],{"class":139},"    { ",[38,3221,3222],{"class":282},"\"path\"",[38,3224,1628],{"class":139},[38,3226,3227],{"class":66},"\"slug\"",[38,3229,233],{"class":139},[38,3231,3232],{"class":282},"\"value\"",[38,3234,1628],{"class":139},[38,3236,3237],{"class":66},"\"My Slug\"",[38,3239,233],{"class":139},[38,3241,3242],{"class":282},"\"message\"",[38,3244,1628],{"class":139},[38,3246,3247],{"class":66},"\"slug must be lowercase alphanumeric with hyphens (no leading/trailing hyphens)\"",[38,3249,408],{"class":139},[38,3251,3252],{"class":40,"line":289},[38,3253,3254],{"class":139},"  ]\n",[38,3256,3257],{"class":40,"line":300},[38,3258,463],{"class":139},[15,3260,633,3261,3264,3265,501,3267,3270,3271,3275],{},[35,3262,3263],{},"message"," in every case; only the first shape has ",[35,3266,3068],{},[35,3268,3269],{},"timestamp",". See ",[517,3272,3274],{"href":3273},"/docs/api-reference/errors","Error Reference"," for status codes and the exact messages.",[19,3277,3279],{"id":3278},"sdks","SDKs",[15,3281,3282],{},"For most use cases, we recommend using our official SDKs which wrap this API:",[480,3284,3285,3291,3297],{},[483,3286,3287],{},[517,3288,3290],{"href":3289},"/docs/sdks/javascript","JavaScript/TypeScript",[483,3292,3293],{},[517,3294,3296],{"href":3295},"/docs/sdks/python","Python",[483,3298,3299],{},[517,3300,3302],{"href":3301},"/docs/sdks/go","Go",[3304,3305,3306],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}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 .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}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 .s7hpK, html code.shiki .s7hpK{--shiki-default:#B31D28;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic}",{"title":33,"searchDepth":118,"depth":118,"links":3308},[3309,3310,3311,3319,3327,3332,3339,3347,3354,3355,3356],{"id":21,"depth":118,"text":22},{"id":47,"depth":118,"text":48},{"id":91,"depth":118,"text":92,"children":3312},[3313,3314,3315,3316,3317,3318],{"id":99,"depth":125,"text":100},{"id":250,"depth":125,"text":251},{"id":643,"depth":125,"text":644},{"id":661,"depth":125,"text":662},{"id":762,"depth":125,"text":763},{"id":789,"depth":125,"text":790},{"id":814,"depth":118,"text":815,"children":3320},[3321,3322,3323,3324,3325,3326],{"id":821,"depth":125,"text":822},{"id":842,"depth":125,"text":843},{"id":1009,"depth":125,"text":1010},{"id":1096,"depth":125,"text":1097},{"id":1114,"depth":125,"text":1115},{"id":1188,"depth":125,"text":1189},{"id":1216,"depth":118,"text":1217,"children":3328},[3329,3330,3331],{"id":1236,"depth":125,"text":1237},{"id":1377,"depth":125,"text":1378},{"id":1397,"depth":125,"text":1398},{"id":1420,"depth":118,"text":1421,"children":3333},[3334,3335,3336,3337,3338],{"id":1435,"depth":125,"text":1436},{"id":1456,"depth":125,"text":1457},{"id":1806,"depth":125,"text":1807},{"id":1824,"depth":125,"text":1825},{"id":1917,"depth":125,"text":1918},{"id":1938,"depth":118,"text":1939,"children":3340},[3341,3342,3343,3344,3345,3346],{"id":1948,"depth":125,"text":1949},{"id":2034,"depth":125,"text":2035},{"id":2052,"depth":125,"text":2053},{"id":2265,"depth":125,"text":2266},{"id":2339,"depth":125,"text":2340},{"id":2371,"depth":125,"text":2372},{"id":2392,"depth":118,"text":2393,"children":3348},[3349,3350,3351,3352,3353],{"id":2402,"depth":125,"text":2403},{"id":2475,"depth":125,"text":2476},{"id":2493,"depth":125,"text":2494},{"id":2685,"depth":125,"text":2686},{"id":2746,"depth":125,"text":2747},{"id":2768,"depth":118,"text":2769},{"id":2814,"depth":118,"text":2815},{"id":3278,"depth":118,"text":3279},"Complete REST API reference for NoLag. Manage apps, rooms, actors, scopes, and signing keys programmatically.","md",{},"/docs/api-reference",{"title":5,"description":3357},"docs/api-reference/index","rfHgA7r22UQtSgxP9DfBEAJL1KTve4IOQeO9hOrxvJk",1789869418828]