[{"data":1,"prerenderedAt":3388},["ShallowReactive",2],{"docs-dev\u002Fudserverapi":3,"navigation":3332},{"id":4,"title":5,"body":6,"description":16,"extension":3325,"meta":3326,"navigation":3327,"path":3328,"seo":3329,"stem":3330,"__hash__":3331},"docs\u002F3.dev\u002FudServerAPI.md","udServer API",{"type":7,"value":8,"toc":3306},"minimark",[9,13,17,29,47,53,93,103,120,123,128,133,138,188,190,195,203,223,225,230,237,250,252,256,261,266,303,305,310,315,350,352,356,361,366,394,396,401,406,419,421,426,431,452,454,458,461,466,471,484,486,491,496,523,525,530,535,549,551,556,561,580,582,587,592,605,607,612,617,630,632,637,642,654,656,661,666,678,680,685,688,693,698,712,714,719,724,765,767,772,777,795,797,801,806,811,842,844,849,854,867,869,874,879,916,918,923,928,953,955,960,965,977,979,984,989,1014,1016,1019,1022,1027,1032,1052,1054,1059,1064,1100,1102,1107,1112,1126,1128,1133,1138,1161,1163,1168,1173,1185,1187,1192,1197,1209,1211,1215,1218,1223,1228,1248,1250,1255,1260,1283,1285,1290,1295,1309,1311,1316,1321,1341,1343,1348,1353,1376,1378,1383,1388,1400,1402,1407,1412,1880,1882,1887,1892,1913,1915,1920,1925,1940,1942,1946,1951,1956,1981,1983,1988,1993,2028,2030,2035,2040,2059,2061,2066,2071,2100,2102,2107,2116,2189,2191,2196,2208,2243,2245,2250,2261,2313,2315,2320,2325,2355,2357,2362,2367,2380,2382,2387,2392,2427,2429,2433,2438,2443,2454,2456,2461,2466,2503,2505,2510,2515,2544,2546,2550,2555,2566,2599,2601,2606,2611,2630,2632,2637,2642,2655,2657,2661,2666,2671,2705,2707,2712,2717,2730,2732,2737,2742,2757,2759,2764,2769,2822,2824,2828,2833,2838,2895,2897,2902,2907,2943,2945,2950,2955,2980,2982,2987,2992,3019,3021,3025,3028,3033,3038,3045,3047,3052,3057,3068,3070,3081,3086,3110,3112,3120,3125,3146,3148,3153,3158,3174,3176,3181,3186,3200,3202,3206,3211,3216,3251,3253,3258,3266,3302],[10,11,5],"h1",{"id":12},"udserver-api",[14,15,16],"p",{},"The udServer API provides access for developers to integrate with or automate tasks in udServer.",[14,18,19,20,24,25,28],{},"All API endpoints are prefixed with ",[21,22,23],"code",{},"\u002Fapi\u002F"," (e.g. ",[21,26,27],{},"\u002Fapi\u002F_user\u002Fwhoami",").",[14,30,31,32,35,36,38,39,42,43,46],{},"All endpoints return a JSON object containing at minimum a ",[21,33,34],{},"success"," boolean. If ",[21,37,34],{}," is ",[21,40,41],{},"false",", a ",[21,44,45],{},"message"," field may provide additional detail.",[14,48,49,50,52],{},"Common ",[21,51,45],{}," values:",[54,55,56,63,69,75,81,87],"ul",{},[57,58,59,62],"li",{},[21,60,61],{},"serverfault"," — internal server error; check server logs",[57,64,65,68],{},[21,66,67],{},"writefailure"," — a write operation failed",[57,70,71,74],{},[21,72,73],{},"malformed"," — request was not in the expected format",[57,76,77,80],{},[21,78,79],{},"badcredentials"," — username or password did not match",[57,82,83,86],{},[21,84,85],{},"notfound"," — requested resource was not found",[57,88,89,92],{},[21,90,91],{},"sessionexpired"," — the session is no longer valid",[14,94,95,96,99,100,102],{},"Authentication is provided via the ",[21,97,98],{},"apikey"," cookie (set at login) or an ",[21,101,98],{}," field in the JSON body.",[104,105,106],"blockquote",{},[14,107,108],{},[109,110,111,112,115,116,119],"em",{},"Note: There is an additional API at ",[21,113,114],{},"\u002Fapi\u002Fsdk\u002Fxxx"," for ",[21,117,118],{},"udSDK"," communication that is not publicly documented.",[121,122],"hr",{},[124,125,127],"h2",{"id":126},"authentication-oauth2","Authentication (OAuth2)",[14,129,130],{},[21,131,132],{},"\u002F_oauth\u002Flogin",[104,134,135],{},[14,136,137],{},"Initiates the OAuth2 login flow, redirecting the browser to the configured OAuth provider.",[54,139,140,143,185],{},[57,141,142],{},"Minimum Privilege: Public (no existing session)",[57,144,145,146,149],{},"Expected JSON: ",[21,147,148],{},"{ provider: [string], email: [string], redirect: [string] }",[54,150,151,164,175],{},[57,152,153,156,157,163],{},[21,154,155],{},"provider"," ",[109,158,159],{},[160,161,162],"span",{},"required",": The OAuth provider ID",[57,165,166,156,169,174],{},[21,167,168],{},"email",[109,170,171],{},[160,172,173],{},"optional",": Login hint for the provider",[57,176,177,156,180,184],{},[21,178,179],{},"redirect",[109,181,182],{},[160,183,173],{},": URL to redirect to after successful login",[57,186,187],{},"Response: HTTP redirect to OAuth provider",[121,189],{},[14,191,192],{},[21,193,194],{},"\u002F_oauth\u002Fredirect",[104,196,197],{},[14,198,199,200,202],{},"OAuth2 callback handler. Completes the login flow and sets the ",[21,201,98],{}," cookie.",[54,204,205,208,217],{},[57,206,207],{},"Minimum Privilege: Public",[57,209,210,211,213,214],{},"Query Params: ",[21,212,21],{},", ",[21,215,216],{},"state",[57,218,219,220,222],{},"Response: HTTP redirect to post-login page with ",[21,221,98],{}," cookie set",[121,224],{},[14,226,227],{},[21,228,229],{},"\u002F_oauth\u002Flogout",[104,231,232],{},[14,233,234,235,202],{},"Ends the current session and clears the ",[21,236,98],{},[54,238,239,242,247],{},[57,240,241],{},"Minimum Privilege: User",[57,243,145,244],{},[109,245,246],{},"nothing additional",[57,248,249],{},"Response: HTTP redirect to home page",[121,251],{},[124,253,255],{"id":254},"current-user","Current User",[14,257,258],{},[21,259,260],{},"\u002F_user\u002Fwhoami",[104,262,263],{},[14,264,265],{},"Returns information about the currently authenticated user.",[54,267,268,271,281],{},[57,269,270],{},"Minimum Privilege: Public (returns limited info if unauthenticated)",[57,272,210,273,156,276,280],{},[21,274,275],{},"extended",[109,277,278],{},[160,279,173],{}," — if present, includes email and pending invites",[57,282,283,284,287],{},"JSON on Success: ",[21,285,286],{},"{ id: [string], globalperms: [int], name: [string], language: [string], expires: [double], lastorgid: [string], needsAuthProvider: [bool], needsEULA: [bool], showWhatsNew: [bool] }",[54,288,289],{},[57,290,291,292,294,295,213,297,213,300],{},"If ",[21,293,275],{},": also includes ",[21,296,168],{},[21,298,299],{},"emailoptin",[21,301,302],{},"invites",[121,304],{},[14,306,307],{},[21,308,309],{},"\u002F_user\u002Fupdate",[104,311,312],{},[14,313,314],{},"Updates the current user's profile, or another user's profile if the caller has the User Edit global permission.",[54,316,317,319,346],{},[57,318,241],{},[57,320,145,321,324],{},[21,322,323],{},"{ userid: [string], realname: [string], language: [string], globalPermissions: [int] }",[54,325,326,336],{},[57,327,328,156,331,335],{},[21,329,330],{},"userid",[109,332,333],{},[160,334,173],{},": Defaults to the current user; requires User Edit global permission to update another user",[57,337,338,156,341,345],{},[21,339,340],{},"globalPermissions",[109,342,343],{},[160,344,173],{},": Requires admin-level global permission to set",[57,347,283,348],{},[109,349,246],{},[121,351],{},[124,353,355],{"id":354},"api-keys","API Keys",[14,357,358],{},[21,359,360],{},"\u002F_user\u002Fapikeys\u002Fcreate",[104,362,363],{},[14,364,365],{},"Creates a new API key for the current user.",[54,367,368,370,389],{},[57,369,241],{},[57,371,145,372,375],{},[21,373,374],{},"{ name: [string], expiryDays: [int] }",[54,376,377,383],{},[57,378,379,382],{},[21,380,381],{},"name",": 1–30 characters",[57,384,385,388],{},[21,386,387],{},"expiryDays",": 0–720 (0 = no expiry)",[57,390,283,391],{},[21,392,393],{},"{ newApiKey: { id: [string] } }",[121,395],{},[14,397,398],{},[21,399,400],{},"\u002F_user\u002Fapikeys\u002Fdelete",[104,402,403],{},[14,404,405],{},"Deletes an API key belonging to the current user.",[54,407,408,410,415],{},[57,409,241],{},[57,411,145,412],{},[21,413,414],{},"{ apikey: [string] }",[57,416,283,417],{},[109,418,246],{},[121,420],{},[14,422,423],{},[21,424,425],{},"\u002F_user\u002Fapikeys\u002Flist",[104,427,428],{},[14,429,430],{},"Lists all API keys for the current user.",[54,432,433,435,439],{},[57,434,241],{},[57,436,145,437],{},[109,438,246],{},[57,440,283,441,444],{},[21,442,443],{},"{ apikeys: [array] }",[54,445,446],{},[57,447,448,449],{},"Each item: ",[21,450,451],{},"{ id: [string], name: [string], expires: [double], created: [double], lastaccess: [double], key: [string] }",[121,453],{},[124,455,457],{"id":456},"organisations","Organisations",[14,459,460],{},"Organisations are the top-level grouping for users, projects, and assets.",[14,462,463],{},[21,464,465],{},"\u002Forg\u002Flist",[104,467,468],{},[14,469,470],{},"Lists all organisations the current user is a member of.",[54,472,473,475,479],{},[57,474,241],{},[57,476,145,477],{},[109,478,246],{},[57,480,283,481],{},[21,482,483],{},"{ orgs: [array] }",[121,485],{},[14,487,488],{},[21,489,490],{},"\u002Forg\u002Fcreate",[104,492,493],{},[14,494,495],{},"Creates a new organisation. Requires the \"Only Admins Create Orgs\" global permission if that setting is enabled.",[54,497,498,501,518],{},[57,499,500],{},"Minimum Privilege: User (or Global Org Edit if restricted)",[57,502,145,503,506],{},[21,504,505],{},"{ name: [string], orgid: [string] }",[54,507,508],{},[57,509,510,156,513,517],{},[21,511,512],{},"orgid",[109,514,515],{},[160,516,173],{},": Custom organisation ID",[57,519,283,520],{},[21,521,522],{},"{ orgid: [string] }",[121,524],{},[14,526,527],{},[21,528,529],{},"\u002F:orgid\u002F_get",[104,531,532],{},[14,533,534],{},"Returns details of an organisation.",[54,536,537,540,544],{},[57,538,539],{},"Minimum Privilege: Organisation Member",[57,541,145,542],{},[109,543,246],{},[57,545,283,546],{},[21,547,548],{},"{ org: { orgid: [string], name: [string], defaultpermissions: [int64], created: [int64], ispublic: [bool], pendingdelete: [bool], userpermissions: [int64] } }",[121,550],{},[14,552,553],{},[21,554,555],{},"\u002F:orgid\u002F_update",[104,557,558],{},[14,559,560],{},"Updates organisation name or default member permissions.",[54,562,563,566,576],{},[57,564,565],{},"Minimum Privilege: Organisation Owner",[57,567,145,568,571],{},[21,569,570],{},"{ name: [string], defaultpermissions: [int64] }",[54,572,573],{},[57,574,575],{},"Both fields are optional",[57,577,283,578],{},[109,579,246],{},[121,581],{},[14,583,584],{},[21,585,586],{},"\u002F:orgid\u002F_transfer",[104,588,589],{},[14,590,591],{},"Transfers ownership of the organisation to another user.",[54,593,594,596,601],{},[57,595,565],{},[57,597,145,598],{},[21,599,600],{},"{ userid: [string] }",[57,602,283,603],{},[109,604,246],{},[121,606],{},[14,608,609],{},[21,610,611],{},"\u002F:orgid\u002F_icon",[104,613,614],{},[14,615,616],{},"Sets the organisation icon.",[54,618,619,621,626],{},[57,620,565],{},[57,622,145,623],{},[109,624,625],{},"multipart\u002Fform-data with icon file",[57,627,283,628],{},[109,629,246],{},[121,631],{},[14,633,634],{},[21,635,636],{},"\u002F:orgid\u002F_delete",[104,638,639],{},[14,640,641],{},"Marks the organisation for deletion.",[54,643,644,646,650],{},[57,645,565],{},[57,647,145,648],{},[109,649,246],{},[57,651,283,652],{},[109,653,246],{},[121,655],{},[14,657,658],{},[21,659,660],{},"\u002F:orgid\u002F_recover",[104,662,663],{},[14,664,665],{},"Cancels a pending organisation deletion.",[54,667,668,670,674],{},[57,669,565],{},[57,671,145,672],{},[109,673,246],{},[57,675,283,676],{},[109,677,246],{},[121,679],{},[681,682,684],"h3",{"id":683},"organisation-roles","Organisation Roles",[14,686,687],{},"Roles define named sets of permissions that can be assigned to organisation members.",[14,689,690],{},[21,691,692],{},"\u002F:orgid\u002F_roles\u002Flist",[104,694,695],{},[14,696,697],{},"Lists all roles defined in the organisation.",[54,699,700,703,707],{},[57,701,702],{},"Minimum Privilege: Organisation UserList",[57,704,145,705],{},[109,706,246],{},[57,708,283,709],{},[21,710,711],{},"{ roles: [array] }",[121,713],{},[14,715,716],{},[21,717,718],{},"\u002F:orgid\u002F_roles\u002Fupdate",[104,720,721],{},[14,722,723],{},"Creates a new role or updates an existing one.",[54,725,726,729,757],{},[57,727,728],{},"Minimum Privilege: Organisation UserEditRoles",[57,730,145,731,734],{},[21,732,733],{},"{ create: [bool], roleid: [string], name: [string], permissions: [int64], projects: [array] }",[54,735,736,747],{},[57,737,738,156,741,746],{},[21,739,740],{},"roleid",[109,742,743],{},[160,744,745],{},"required if not creating",": 4-character role identifier",[57,748,749,156,752,756],{},[21,750,751],{},"projects",[109,753,754],{},[160,755,173],{},": Array of project IDs this role applies to",[57,758,283,759,156,762],{},[21,760,761],{},"{ roleid: [string] }",[109,763,764],{},"(on create only)",[121,766],{},[14,768,769],{},[21,770,771],{},"\u002F:orgid\u002F_roles\u002Fdelete",[104,773,774],{},[14,775,776],{},"Deletes a role from the organisation.",[54,778,779,781,791],{},[57,780,728],{},[57,782,145,783,785],{},[21,784,761],{},[54,786,787],{},[57,788,789,746],{},[21,790,740],{},[57,792,283,793],{},[109,794,246],{},[121,796],{},[681,798,800],{"id":799},"organisation-users","Organisation Users",[14,802,803],{},[21,804,805],{},"\u002F:orgid\u002F_users\u002Flist",[104,807,808],{},[14,809,810],{},"Lists users, roles, and pending invites in the organisation.",[54,812,813,816,820],{},[57,814,815],{},"Minimum Privilege: Organisation UserList or UserInvite",[57,817,145,818],{},[109,819,246],{},[57,821,283,822,825],{},[21,823,824],{},"{ users: [array], roles: [array], invites: [array] }",[54,826,827,837],{},[57,828,829,832,833,836],{},[21,830,831],{},"users"," and ",[21,834,835],{},"roles",": Returned if caller has UserList permission",[57,838,839,841],{},[21,840,302],{},": Returned if caller has UserInvite permission",[121,843],{},[14,845,846],{},[21,847,848],{},"\u002F:orgid\u002F_users\u002Fremove",[104,850,851],{},[14,852,853],{},"Removes a user from the organisation. Users may remove themselves; removing others requires the UserKick permission.",[54,855,856,859,863],{},[57,857,858],{},"Minimum Privilege: User (self) or Organisation UserKick (others)",[57,860,145,861],{},[21,862,600],{},[57,864,283,865],{},[109,866,246],{},[121,868],{},[14,870,871],{},[21,872,873],{},"\u002F:orgid\u002F_users\u002Froles\u002Fupdate",[104,875,876],{},[14,877,878],{},"Adds or removes roles for a user in the organisation.",[54,880,881,884,911],{},[57,882,883],{},"Minimum Privilege: Organisation UserAssignRoles",[57,885,145,886,889],{},[21,887,888],{},"{ userid: [string], add: [array], remove: [array] }",[54,890,891,901],{},[57,892,893,156,896,900],{},[21,894,895],{},"add",[109,897,898],{},[160,899,173],{},": Array of role IDs to assign",[57,902,903,156,906,910],{},[21,904,905],{},"remove",[109,907,908],{},[160,909,173],{},": Array of role IDs to remove",[57,912,283,913,915],{},[21,914,711],{}," — the user's current roles after the update",[121,917],{},[14,919,920],{},[21,921,922],{},"\u002F:orgid\u002F_users\u002Finvite\u002Fcreate",[104,924,925],{},[14,926,927],{},"Invites a user (by email) to the organisation.",[54,929,930,933,949],{},[57,931,932],{},"Minimum Privilege: Organisation UserInvite",[57,934,145,935,938],{},[21,936,937],{},"{ email: [string], roles: [array] }",[54,939,940],{},[57,941,942,156,944,948],{},[21,943,835],{},[109,945,946],{},[160,947,173],{},": Role IDs to assign on acceptance",[57,950,283,951],{},[109,952,246],{},[121,954],{},[14,956,957],{},[21,958,959],{},"\u002F:orgid\u002F_users\u002Finvite\u002Faccept",[104,961,962],{},[14,963,964],{},"Accepts a pending invite to an organisation (current user must not already be a member).",[54,966,967,969,973],{},[57,968,241],{},[57,970,145,971],{},[109,972,246],{},[57,974,283,975],{},[109,976,246],{},[121,978],{},[14,980,981],{},[21,982,983],{},"\u002F:orgid\u002F_users\u002Finvite\u002Fcancel",[104,985,986],{},[14,987,988],{},"Cancels a pending invite. Callers with UserInvite permission may cancel any invite; others may only cancel their own.",[54,990,991,994,1010],{},[57,992,993],{},"Minimum Privilege: User (own invite) or Organisation UserInvite (any invite)",[57,995,145,996,999],{},[21,997,998],{},"{ email: [string] }",[54,1000,1001],{},[57,1002,1003,156,1005],{},[21,1004,168],{},[109,1006,1007],{},[160,1008,1009],{},"required when cancelling another user's invite",[57,1011,283,1012],{},[109,1013,246],{},[121,1015],{},[124,1017,1018],{"id":751},"Projects",[14,1020,1021],{},"Projects are containers within an organisation for scenes and files.",[14,1023,1024],{},[21,1025,1026],{},"\u002F:orgid\u002F_projects\u002Flist",[104,1028,1029],{},[14,1030,1031],{},"Lists all projects in the organisation visible to the current user.",[54,1033,1034,1036,1040],{},[57,1035,539],{},[57,1037,145,1038],{},[109,1039,246],{},[57,1041,283,1042,1045],{},[21,1043,1044],{},"{ projects: [array] }",[54,1046,1047],{},[57,1048,448,1049],{},[21,1050,1051],{},"{ projid: [string], name: [string], created: [int64], permissions: [int64] }",[121,1053],{},[14,1055,1056],{},[21,1057,1058],{},"\u002F:orgid\u002F_projects\u002Fcreate",[104,1060,1061],{},[14,1062,1063],{},"Creates a new project in the organisation.",[54,1065,1066,1069,1095],{},[57,1067,1068],{},"Minimum Privilege: Organisation ProjectManage",[57,1070,145,1071,1074],{},[21,1072,1073],{},"{ name: [string], projid: [string] }",[54,1075,1076,1085],{},[57,1077,1078,156,1080,1084],{},[21,1079,381],{},[109,1081,1082],{},[160,1083,162],{},": Minimum 2 characters",[57,1086,1087,156,1090,1094],{},[21,1088,1089],{},"projid",[109,1091,1092],{},[160,1093,173],{},": Custom project ID",[57,1096,283,1097],{},[21,1098,1099],{},"{ projid: [string] }",[121,1101],{},[14,1103,1104],{},[21,1105,1106],{},"\u002F:orgid\u002F:projid\u002F_get",[104,1108,1109],{},[14,1110,1111],{},"Returns details of a project.",[54,1113,1114,1117,1121],{},[57,1115,1116],{},"Minimum Privilege: Organisation ProjectView",[57,1118,145,1119],{},[109,1120,246],{},[57,1122,283,1123],{},[21,1124,1125],{},"{ project: { projid: [string], name: [string], created: [int64], permissions: [int64] } }",[121,1127],{},[14,1129,1130],{},[21,1131,1132],{},"\u002F:orgid\u002F:projid\u002F_projects\u002Frename",[104,1134,1135],{},[14,1136,1137],{},"Renames a project.",[54,1139,1140,1142,1157],{},[57,1141,1068],{},[57,1143,145,1144,1147],{},[21,1145,1146],{},"{ name: [string] }",[54,1148,1149],{},[57,1150,1151,156,1153,1084],{},[21,1152,381],{},[109,1154,1155],{},[160,1156,162],{},[57,1158,283,1159],{},[109,1160,246],{},[121,1162],{},[14,1164,1165],{},[21,1166,1167],{},"\u002F:orgid\u002F:projid\u002F_projects\u002Fdelete",[104,1169,1170],{},[14,1171,1172],{},"Deletes a project and all its contents.",[54,1174,1175,1177,1181],{},[57,1176,1068],{},[57,1178,145,1179],{},[109,1180,246],{},[57,1182,283,1183],{},[109,1184,246],{},[121,1186],{},[14,1188,1189],{},[21,1190,1191],{},"\u002F:orgid\u002F:projid\u002F_permission\u002Faudit",[104,1193,1194],{},[14,1195,1196],{},"Audits effective permissions for the project.",[54,1198,1199,1201,1205],{},[57,1200,883],{},[57,1202,145,1203],{},[109,1204,246],{},[57,1206,283,1207],{},[109,1208,246],{},[121,1210],{},[124,1212,1214],{"id":1213},"scenes","Scenes",[14,1216,1217],{},"Scenes are JSON documents stored within a project, used by udStream for 3D visualisation.",[14,1219,1220],{},[21,1221,1222],{},"\u002F:orgid\u002F:projid\u002F_scene\u002Flist",[104,1224,1225],{},[14,1226,1227],{},"Lists all scenes in a project.",[54,1229,1230,1233,1243],{},[57,1231,1232],{},"Minimum Privilege: Organisation SceneList",[57,1234,210,1235,156,1238,1242],{},[21,1236,1237],{},"starttime",[109,1239,1240],{},[160,1241,173],{}," — unix timestamp; returns only scenes updated after this time",[57,1244,283,1245],{},[21,1246,1247],{},"{ scenes: [array] }",[121,1249],{},[14,1251,1252],{},[21,1253,1254],{},"\u002F:orgid\u002F:projid\u002F_scene\u002Fcreate",[104,1256,1257],{},[14,1258,1259],{},"Creates a new scene in a project.",[54,1261,1262,1265,1278],{},[57,1263,1264],{},"Minimum Privilege: Organisation SceneManage",[57,1266,145,1267,1270],{},[21,1268,1269],{},"{ body: [string] }",[54,1271,1272],{},[57,1273,1274,1277],{},[21,1275,1276],{},"body",": Full scene document as a JSON string",[57,1279,283,1280],{},[21,1281,1282],{},"{ sceneid: [string], sceneSessionID: [string] }",[121,1284],{},[14,1286,1287],{},[21,1288,1289],{},"\u002F:orgid\u002F:projid\u002F:sceneid\u002F_scene\u002Fget",[104,1291,1292],{},[14,1293,1294],{},"Returns the scene document and opens a collaborative session.",[54,1296,1297,1300,1304],{},[57,1298,1299],{},"Minimum Privilege: Organisation SceneAccess",[57,1301,145,1302],{},[109,1303,246],{},[57,1305,283,1306],{},[21,1307,1308],{},"{ scene: [object], sceneSessionID: [string] }",[121,1310],{},[14,1312,1313],{},[21,1314,1315],{},"\u002F:orgid\u002F:projid\u002F:sceneid\u002F_scene\u002Freplace",[104,1317,1318],{},[14,1319,1320],{},"Replaces the entire scene document.",[54,1322,1323,1326,1337],{},[57,1324,1325],{},"Minimum Privilege: Organisation SceneEdit",[57,1327,145,1328,1330],{},[21,1329,1269],{},[54,1331,1332],{},[57,1333,1334,1336],{},[21,1335,1276],{},": New scene document as a JSON string",[57,1338,283,1339],{},[109,1340,246],{},[121,1342],{},[14,1344,1345],{},[21,1346,1347],{},"\u002F:orgid\u002F:projid\u002F:sceneid\u002F_scene\u002Fupdate",[104,1349,1350],{},[14,1351,1352],{},"Updates scene metadata (e.g. shared visibility).",[54,1354,1355,1362,1372],{},[57,1356,1357,1358,1361],{},"Minimum Privilege: Organisation SceneShare (to update the ",[21,1359,1360],{},"shared"," flag)",[57,1363,145,1364,1367],{},[21,1365,1366],{},"{ shared: [bool] }",[54,1368,1369],{},[57,1370,1371],{},"All fields optional",[57,1373,283,1374],{},[109,1375,246],{},[121,1377],{},[14,1379,1380],{},[21,1381,1382],{},"\u002F:orgid\u002F:projid\u002F:sceneid\u002F_scene\u002Fdelete",[104,1384,1385],{},[14,1386,1387],{},"Deletes a scene.",[54,1389,1390,1392,1396],{},[57,1391,1264],{},[57,1393,145,1394],{},[109,1395,246],{},[57,1397,283,1398],{},[109,1399,246],{},[121,1401],{},[14,1403,1404],{},[21,1405,1406],{},"\u002F:orgid\u002F:projid\u002F:sceneid\u002F_scene\u002Fsync",[104,1408,1409],{},[14,1410,1411],{},"Synchronises collaborative editing state. Called periodically by connected clients.",[54,1413,1414,1416,1796],{},[57,1415,1299],{},[57,1417,1418,1419,1785],{},"Expected JSON:\n",[1420,1421,1426],"pre",{"className":1422,"code":1423,"language":1424,"meta":1425,"style":1425},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"lastupdate\": [double],\n  \"sceneSessionID\": [string],\n  \"flags\": [int],\n  \"head\": { \"x\": [double], \"y\": [double], \"z\": [double], \"h\": [double], \"p\": [double], \"r\": [double] },\n  \"handLeft\": { ... },\n  \"handRight\": { ... },\n  \"anchor\": { \"x\": [double], \"y\": [double], \"z\": [double], \"w\": [double] },\n  \"messages\": [array],\n  \"selectedNodes\": [array],\n  \"changes\": [object]\n}\n","json","",[21,1427,1428,1436,1462,1481,1500,1611,1631,1649,1722,1741,1759,1779],{"__ignoreMap":1425},[160,1429,1432],{"class":1430,"line":1431},"line",1,[160,1433,1435],{"class":1434},"sMK4o","{\n",[160,1437,1439,1442,1446,1449,1452,1455,1459],{"class":1430,"line":1438},2,[160,1440,1441],{"class":1434},"  \"",[160,1443,1445],{"class":1444},"spNyl","lastupdate",[160,1447,1448],{"class":1434},"\"",[160,1450,1451],{"class":1434},":",[160,1453,1454],{"class":1434}," [",[160,1456,1458],{"class":1457},"sTEyZ","double",[160,1460,1461],{"class":1434},"],\n",[160,1463,1465,1467,1470,1472,1474,1476,1479],{"class":1430,"line":1464},3,[160,1466,1441],{"class":1434},[160,1468,1469],{"class":1444},"sceneSessionID",[160,1471,1448],{"class":1434},[160,1473,1451],{"class":1434},[160,1475,1454],{"class":1434},[160,1477,1478],{"class":1457},"string",[160,1480,1461],{"class":1434},[160,1482,1484,1486,1489,1491,1493,1495,1498],{"class":1430,"line":1483},4,[160,1485,1441],{"class":1434},[160,1487,1488],{"class":1444},"flags",[160,1490,1448],{"class":1434},[160,1492,1451],{"class":1434},[160,1494,1454],{"class":1434},[160,1496,1497],{"class":1457},"int",[160,1499,1461],{"class":1434},[160,1501,1503,1505,1508,1510,1512,1515,1518,1522,1524,1526,1528,1530,1533,1535,1538,1540,1542,1544,1546,1548,1550,1553,1555,1557,1559,1561,1563,1565,1568,1570,1572,1574,1576,1578,1580,1582,1584,1586,1588,1590,1592,1594,1597,1599,1601,1603,1605,1608],{"class":1430,"line":1502},5,[160,1504,1441],{"class":1434},[160,1506,1507],{"class":1444},"head",[160,1509,1448],{"class":1434},[160,1511,1451],{"class":1434},[160,1513,1514],{"class":1434}," {",[160,1516,1517],{"class":1434}," \"",[160,1519,1521],{"class":1520},"sBMFI","x",[160,1523,1448],{"class":1434},[160,1525,1451],{"class":1434},[160,1527,1454],{"class":1434},[160,1529,1458],{"class":1457},[160,1531,1532],{"class":1434},"],",[160,1534,1517],{"class":1434},[160,1536,1537],{"class":1520},"y",[160,1539,1448],{"class":1434},[160,1541,1451],{"class":1434},[160,1543,1454],{"class":1434},[160,1545,1458],{"class":1457},[160,1547,1532],{"class":1434},[160,1549,1517],{"class":1434},[160,1551,1552],{"class":1520},"z",[160,1554,1448],{"class":1434},[160,1556,1451],{"class":1434},[160,1558,1454],{"class":1434},[160,1560,1458],{"class":1457},[160,1562,1532],{"class":1434},[160,1564,1517],{"class":1434},[160,1566,1567],{"class":1520},"h",[160,1569,1448],{"class":1434},[160,1571,1451],{"class":1434},[160,1573,1454],{"class":1434},[160,1575,1458],{"class":1457},[160,1577,1532],{"class":1434},[160,1579,1517],{"class":1434},[160,1581,14],{"class":1520},[160,1583,1448],{"class":1434},[160,1585,1451],{"class":1434},[160,1587,1454],{"class":1434},[160,1589,1458],{"class":1457},[160,1591,1532],{"class":1434},[160,1593,1517],{"class":1434},[160,1595,1596],{"class":1520},"r",[160,1598,1448],{"class":1434},[160,1600,1451],{"class":1434},[160,1602,1454],{"class":1434},[160,1604,1458],{"class":1457},[160,1606,1607],{"class":1434},"]",[160,1609,1610],{"class":1434}," },\n",[160,1612,1614,1616,1619,1621,1623,1625,1628],{"class":1430,"line":1613},6,[160,1615,1441],{"class":1434},[160,1617,1618],{"class":1444},"handLeft",[160,1620,1448],{"class":1434},[160,1622,1451],{"class":1434},[160,1624,1514],{"class":1434},[160,1626,1627],{"class":1457}," ... ",[160,1629,1630],{"class":1434},"},\n",[160,1632,1634,1636,1639,1641,1643,1645,1647],{"class":1430,"line":1633},7,[160,1635,1441],{"class":1434},[160,1637,1638],{"class":1444},"handRight",[160,1640,1448],{"class":1434},[160,1642,1451],{"class":1434},[160,1644,1514],{"class":1434},[160,1646,1627],{"class":1457},[160,1648,1630],{"class":1434},[160,1650,1652,1654,1657,1659,1661,1663,1665,1667,1669,1671,1673,1675,1677,1679,1681,1683,1685,1687,1689,1691,1693,1695,1697,1699,1701,1703,1705,1707,1710,1712,1714,1716,1718,1720],{"class":1430,"line":1651},8,[160,1653,1441],{"class":1434},[160,1655,1656],{"class":1444},"anchor",[160,1658,1448],{"class":1434},[160,1660,1451],{"class":1434},[160,1662,1514],{"class":1434},[160,1664,1517],{"class":1434},[160,1666,1521],{"class":1520},[160,1668,1448],{"class":1434},[160,1670,1451],{"class":1434},[160,1672,1454],{"class":1434},[160,1674,1458],{"class":1457},[160,1676,1532],{"class":1434},[160,1678,1517],{"class":1434},[160,1680,1537],{"class":1520},[160,1682,1448],{"class":1434},[160,1684,1451],{"class":1434},[160,1686,1454],{"class":1434},[160,1688,1458],{"class":1457},[160,1690,1532],{"class":1434},[160,1692,1517],{"class":1434},[160,1694,1552],{"class":1520},[160,1696,1448],{"class":1434},[160,1698,1451],{"class":1434},[160,1700,1454],{"class":1434},[160,1702,1458],{"class":1457},[160,1704,1532],{"class":1434},[160,1706,1517],{"class":1434},[160,1708,1709],{"class":1520},"w",[160,1711,1448],{"class":1434},[160,1713,1451],{"class":1434},[160,1715,1454],{"class":1434},[160,1717,1458],{"class":1457},[160,1719,1607],{"class":1434},[160,1721,1610],{"class":1434},[160,1723,1725,1727,1730,1732,1734,1736,1739],{"class":1430,"line":1724},9,[160,1726,1441],{"class":1434},[160,1728,1729],{"class":1444},"messages",[160,1731,1448],{"class":1434},[160,1733,1451],{"class":1434},[160,1735,1454],{"class":1434},[160,1737,1738],{"class":1457},"array",[160,1740,1461],{"class":1434},[160,1742,1744,1746,1749,1751,1753,1755,1757],{"class":1430,"line":1743},10,[160,1745,1441],{"class":1434},[160,1747,1748],{"class":1444},"selectedNodes",[160,1750,1448],{"class":1434},[160,1752,1451],{"class":1434},[160,1754,1454],{"class":1434},[160,1756,1738],{"class":1457},[160,1758,1461],{"class":1434},[160,1760,1762,1764,1767,1769,1771,1773,1776],{"class":1430,"line":1761},11,[160,1763,1441],{"class":1434},[160,1765,1766],{"class":1444},"changes",[160,1768,1448],{"class":1434},[160,1770,1451],{"class":1434},[160,1772,1454],{"class":1434},[160,1774,1775],{"class":1457},"object",[160,1777,1778],{"class":1434},"]\n",[160,1780,1782],{"class":1430,"line":1781},12,[160,1783,1784],{"class":1434},"}\n",[54,1786,1787],{},[57,1788,1789,156,1791,1795],{},[21,1790,1766],{},[109,1792,1793],{},[160,1794,173],{},": Requires SceneEdit permission",[57,1797,1798,1799],{},"JSON on Success:\n",[1420,1800,1802],{"className":1422,"code":1801,"language":1424,"meta":1425,"style":1425},"{\n  \"viewers\": [array],\n  \"changes\": [array],\n  \"delay\": [float],\n  \"nextupdate\": [double]\n}\n",[21,1803,1804,1808,1825,1841,1859,1876],{"__ignoreMap":1425},[160,1805,1806],{"class":1430,"line":1431},[160,1807,1435],{"class":1434},[160,1809,1810,1812,1815,1817,1819,1821,1823],{"class":1430,"line":1438},[160,1811,1441],{"class":1434},[160,1813,1814],{"class":1444},"viewers",[160,1816,1448],{"class":1434},[160,1818,1451],{"class":1434},[160,1820,1454],{"class":1434},[160,1822,1738],{"class":1457},[160,1824,1461],{"class":1434},[160,1826,1827,1829,1831,1833,1835,1837,1839],{"class":1430,"line":1464},[160,1828,1441],{"class":1434},[160,1830,1766],{"class":1444},[160,1832,1448],{"class":1434},[160,1834,1451],{"class":1434},[160,1836,1454],{"class":1434},[160,1838,1738],{"class":1457},[160,1840,1461],{"class":1434},[160,1842,1843,1845,1848,1850,1852,1854,1857],{"class":1430,"line":1483},[160,1844,1441],{"class":1434},[160,1846,1847],{"class":1444},"delay",[160,1849,1448],{"class":1434},[160,1851,1451],{"class":1434},[160,1853,1454],{"class":1434},[160,1855,1856],{"class":1457},"float",[160,1858,1461],{"class":1434},[160,1860,1861,1863,1866,1868,1870,1872,1874],{"class":1430,"line":1502},[160,1862,1441],{"class":1434},[160,1864,1865],{"class":1444},"nextupdate",[160,1867,1448],{"class":1434},[160,1869,1451],{"class":1434},[160,1871,1454],{"class":1434},[160,1873,1458],{"class":1457},[160,1875,1778],{"class":1434},[160,1877,1878],{"class":1430,"line":1613},[160,1879,1784],{"class":1434},[121,1881],{},[14,1883,1884],{},[21,1885,1886],{},"\u002F:orgid\u002F:projid\u002F:sceneid\u002F_scene\u002Fthumbnail\u002Fsave",[104,1888,1889],{},[14,1890,1891],{},"Saves a thumbnail image for a scene. The image must be a PNG no larger than 320×180 pixels.",[54,1893,1894,1896,1909],{},[57,1895,1325],{},[57,1897,145,1898,1901],{},[21,1899,1900],{},"{ image: [string] }",[54,1902,1903],{},[57,1904,1905,1908],{},[21,1906,1907],{},"image",": Base64-encoded PNG image data",[57,1910,283,1911],{},[109,1912,246],{},[121,1914],{},[14,1916,1917],{},[21,1918,1919],{},"\u002F:orgid\u002F:projid\u002F:sceneid\u002F_scene\u002Fthumbnail\u002Fget",[104,1921,1922],{},[14,1923,1924],{},"Returns the thumbnail image for a scene as a raw PNG.",[54,1926,1927,1929,1933],{},[57,1928,1232],{},[57,1930,145,1931],{},[109,1932,246],{},[57,1934,1935,1936,1939],{},"Response: Raw PNG binary data (",[21,1937,1938],{},"Content-Type: image\u002Fpng",")",[121,1941],{},[124,1943,1945],{"id":1944},"files","Files",[14,1947,1948],{},[21,1949,1950],{},"\u002F:orgid\u002F:projid\u002F_files\u002Fsettings",[104,1952,1953],{},[14,1954,1955],{},"Returns the file storage configuration for a project.",[54,1957,1958,1961,1965],{},[57,1959,1960],{},"Minimum Privilege: Organisation FileSetup",[57,1962,145,1963],{},[109,1964,246],{},[57,1966,283,1967,1970],{},[21,1968,1969],{},"{ source: [string], address: [string], region: [string], prefix: [string], accessid: [string], accesssecret: [string] }",[54,1971,1972],{},[57,1973,1974,1977,1978],{},[21,1975,1976],{},"accesssecret"," is masked as ",[21,1979,1980],{},"***",[121,1982],{},[14,1984,1985],{},[21,1986,1987],{},"\u002F:orgid\u002F:projid\u002F_files\u002Fupdate",[104,1989,1990],{},[14,1991,1992],{},"Updates the file storage configuration for a project.",[54,1994,1995,1997,2024],{},[57,1996,1960],{},[57,1998,145,1999,2001],{},[21,2000,1969],{},[54,2002,2003,2016],{},[57,2004,2005,2008,2009,832,2012,2015],{},[21,2006,2007],{},"address",": AWS S3 bucket name (3–63 chars, lowercase alphanumeric, ",[21,2010,2011],{},"-",[21,2013,2014],{},"."," allowed)",[57,2017,2018,2020,2021,2023],{},[21,2019,1976],{},": Pass ",[21,2022,1980],{}," to keep the existing secret unchanged",[57,2025,283,2026],{},[109,2027,246],{},[121,2029],{},[14,2031,2032],{},[21,2033,2034],{},"\u002F:orgid\u002F:projid\u002F_files\u002Flist",[104,2036,2037],{},[14,2038,2039],{},"Lists files in the project storage.",[54,2041,2042,2045,2054],{},[57,2043,2044],{},"Minimum Privilege: Organisation FileList",[57,2046,210,2047,156,2050],{},[21,2048,2049],{},"folder",[109,2051,2052],{},[160,2053,173],{},[57,2055,283,2056],{},[21,2057,2058],{},"{ files: [array] }",[121,2060],{},[14,2062,2063],{},[21,2064,2065],{},"\u002F:orgid\u002F:projid\u002F_file\u002F*",[104,2067,2068],{},[14,2069,2070],{},"Streams a file from project storage. Supports HTTP range requests.",[54,2072,2073,2076,2079,2097],{},[57,2074,2075],{},"Minimum Privilege: Organisation FileStream",[57,2077,2078],{},"Path: File path relative to project storage root",[57,2080,210,2081,156,2084,2088,2089,156,2092,2096],{},[21,2082,2083],{},"cell",[109,2085,2086],{},[160,2087,173],{}," (0–7, image tile index), ",[21,2090,2091],{},"maxres",[109,2093,2094],{},[160,2095,173],{}," (max resolution)",[57,2098,2099],{},"Response: Binary file data",[121,2101],{},[14,2103,2104],{},[21,2105,2106],{},"\u002F:orgid\u002F:projid\u002F_files\u002Fupload\u002Fcreate",[104,2108,2109],{},[14,2110,2111,2112,2115],{},"Initiates a multipart upload session. The client declares which storage backends it can speak to directly via the ",[21,2113,2114],{},"supports"," array; the server responds with the upload method to use and the chunk size to apply. Only supported when project storage is configured (currently AWS S3).",[54,2117,2118,2121,2150],{},[57,2119,2120],{},"Minimum Privilege: Organisation FileManage",[57,2122,145,2123,2126],{},[21,2124,2125],{},"{ filename: [string], supports: [array] }",[54,2127,2128,2137],{},[57,2129,2130,2133,2134,1939],{},[21,2131,2132],{},"filename",": Destination path within the project storage (e.g. ",[21,2135,2136],{},"models\u002Fscan.las",[57,2138,2139,2141,2142,2145,2146,2149],{},[21,2140,2114],{},": Backends the client supports uploading to directly, e.g. ",[21,2143,2144],{},"[\"aws\"]",". Omit or pass ",[21,2147,2148],{},"[]"," to force proxied mode.",[57,2151,283,2152,2155],{},[21,2153,2154],{},"{ uploadId: [string], filename: [string], method: [string], provider: [string], chunkSize: [int] }",[54,2156,2157,2171,2183],{},[57,2158,2159,2162,2163,2166,2167,2170],{},[21,2160,2161],{},"method",": ",[21,2164,2165],{},"\"presigned\""," — client uploads chunks directly to storage; or ",[21,2168,2169],{},"\"proxied\""," — client sends chunks through the server",[57,2172,2173,2175,2176,38,2178,24,2180,1939],{},[21,2174,155],{},": Storage provider name when ",[21,2177,2161],{},[21,2179,2165],{},[21,2181,2182],{},"\"aws\"",[57,2184,2185,2188],{},[21,2186,2187],{},"chunkSize",": Bytes per chunk the client should use (100 MB presigned, 32 MB proxied)",[121,2190],{},[14,2192,2193],{},[21,2194,2195],{},"\u002F:orgid\u002F:projid\u002F_files\u002Fupload\u002Fchunk-url",[104,2197,2198],{},[14,2199,2200,2201,2204,2205,2014],{},"Returns a short-lived presigned URL the client uses to PUT a single chunk directly to storage, bypassing the server entirely. Only call this when ",[21,2202,2203],{},"upload\u002Fcreate"," returned ",[21,2206,2207],{},"method: \"presigned\"",[54,2209,2210,2212,2217],{},[57,2211,2120],{},[57,2213,145,2214],{},[21,2215,2216],{},"{ filename: [string], uploadId: [string], partNumber: [int] }",[57,2218,283,2219,2222],{},[21,2220,2221],{},"{ url: [string], token: [string] }",[54,2223,2224,2230],{},[57,2225,2226,2229],{},[21,2227,2228],{},"url",": Presigned PUT URL valid for 1 hour. The client PUTs the raw chunk body to this URL with no additional auth headers.",[57,2231,2232,2235,2236,2239,2240,2014],{},[21,2233,2234],{},"token",": Reserved for future backends (e.g. Azure block ID). Empty string for AWS S3 — the ETag is returned by storage in the PUT response ",[21,2237,2238],{},"ETag"," header and must be collected by the client for use in ",[21,2241,2242],{},"upload\u002Fcomplete",[121,2244],{},[14,2246,2247],{},[21,2248,2249],{},"\u002F:orgid\u002F:projid\u002F_files\u002Fupload\u002Fchunk",[104,2251,2252],{},[14,2253,2254,2255,2204,2257,2260],{},"Uploads a single chunk of a multipart upload through the server (proxied mode). Only call this when ",[21,2256,2203],{},[21,2258,2259],{},"method: \"proxied\"",". Chunks must be at least 5 MB except for the final part. Metadata is passed via HTTP headers; the raw binary chunk data is the request body.",[54,2262,2263,2265,2292,2298],{},[57,2264,2120],{},[57,2266,2267,2268],{},"Request Headers:\n",[54,2269,2270,2278,2286],{},[57,2271,2272,2275,2276,1939],{},[21,2273,2274],{},"X-Filename",": Destination path (must match the value returned by ",[21,2277,2203],{},[57,2279,2280,2283,2284],{},[21,2281,2282],{},"X-Upload-Id",": Upload session ID returned by ",[21,2285,2203],{},[57,2287,2288,2291],{},[21,2289,2290],{},"X-Part-Number",": 1-based part index (1–10000)",[57,2293,2294,2295,1939],{},"Request Body: Raw binary chunk data (",[21,2296,2297],{},"Content-Type: application\u002Foctet-stream",[57,2299,283,2300,2303],{},[21,2301,2302],{},"{ partNumber: [int], etag: [string] }",[54,2304,2305],{},[57,2306,2307,2310,2311],{},[21,2308,2309],{},"etag",": MD5 hex digest of the chunk; required when calling ",[21,2312,2242],{},[121,2314],{},[14,2316,2317],{},[21,2318,2319],{},"\u002F:orgid\u002F:projid\u002F_files\u002Fupload\u002Fcomplete",[104,2321,2322],{},[14,2323,2324],{},"Completes a multipart upload. All parts must be provided in order. The file becomes accessible in project storage once this call succeeds. Works for both presigned and proxied uploads.",[54,2326,2327,2329,2351],{},[57,2328,2120],{},[57,2330,145,2331,2334],{},[21,2332,2333],{},"{ filename: [string], uploadId: [string], parts: [array] }",[54,2335,2336],{},[57,2337,2338,2341,2342,2344,2345,2347,2348,2350],{},[21,2339,2340],{},"parts",": Ordered array of ",[21,2343,2302],{}," objects, one per uploaded chunk. For presigned uploads the ",[21,2346,2309],{}," is the value from the storage ",[21,2349,2238],{}," response header (strip surrounding quotes).",[57,2352,283,2353],{},[109,2354,246],{},[121,2356],{},[14,2358,2359],{},[21,2360,2361],{},"\u002F:orgid\u002F:projid\u002F_files\u002Fdelete",[104,2363,2364],{},[14,2365,2366],{},"Deletes a single file from project storage. Only supported when project storage is configured as AWS S3.",[54,2368,2369,2371,2376],{},[57,2370,2120],{},[57,2372,145,2373],{},[21,2374,2375],{},"{ filename: [string] }",[57,2377,283,2378],{},[109,2379,246],{},[121,2381],{},[14,2383,2384],{},[21,2385,2386],{},"\u002F:orgid\u002F:projid\u002F_files\u002Fdelete-folder",[104,2388,2389],{},[14,2390,2391],{},"Deletes all objects under a folder prefix from project storage. S3 has no native folder delete — this lists all objects with the prefix and batch-deletes them. Only supported when project storage is configured as AWS S3.",[54,2393,2394,2396,2414],{},[57,2395,2120],{},[57,2397,145,2398,2401],{},[21,2399,2400],{},"{ folder: [string] }",[54,2402,2403],{},[57,2404,2405,2407,2408,24,2411,1939],{},[21,2406,2049],{},": The folder prefix to delete. Must end with a trailing ",[21,2409,2410],{},"\u002F",[21,2412,2413],{},"models\u002Fold-scans\u002F",[57,2415,283,2416,2419],{},[21,2417,2418],{},"{ deleted: [int] }",[54,2420,2421],{},[57,2422,2423,2426],{},[21,2424,2425],{},"deleted",": Total number of objects removed",[121,2428],{},[124,2430,2432],{"id":2431},"server-configuration","Server Configuration",[14,2434,2435],{},[21,2436,2437],{},"\u002Fconfig",[104,2439,2440],{},[14,2441,2442],{},"Returns basic public server configuration.",[54,2444,2445,2447,2451],{},[57,2446,207],{},[57,2448,145,2449],{},[109,2450,246],{},[57,2452,2453],{},"Response: Server configuration (plain text)",[121,2455],{},[14,2457,2458],{},[21,2459,2460],{},"\u002F_config\u002Ffull",[104,2462,2463],{},[14,2464,2465],{},"Returns the full server configuration including general settings, SMTP, and license info.",[54,2467,2468,2471,2475],{},[57,2469,2470],{},"Minimum Privilege: Server Config Edit",[57,2472,145,2473],{},[109,2474,246],{},[57,2476,283,2477,2480],{},[21,2478,2479],{},"{ serverurl: [string], supportemail: [string], sessiontimeouthours: [int], userscreatedisabled: [bool], onlyadmincreateorgs: [bool], smtpenabled: [bool], smtpserver: [string], smtpsourceaddress: [string], smtpusername: [string], smtpusetls: [bool], userlimit: [int], userCount: [int], shardCount: [int], shardlimit: [int], serverid: [string], serverExpiry: [double], sessionExpiry: [double], domains: [array] }",[54,2481,2482,2491,2500],{},[57,2483,2484,213,2487,2490],{},[21,2485,2486],{},"serverExpiry",[21,2488,2489],{},"sessionExpiry",": Unix epoch seconds (double)",[57,2492,2493,2496,2497],{},[21,2494,2495],{},"domains",": Array of ",[21,2498,2499],{},"{ domain: [string], sessionlimit: [int], ispremium: [bool] }",[57,2501,2502],{},"SMTP password is never returned",[121,2504],{},[14,2506,2507],{},[21,2508,2509],{},"\u002F_config\u002Fmodify",[104,2511,2512],{},[14,2513,2514],{},"Modifies server configuration settings and saves to disk.",[54,2516,2517,2519,2540],{},[57,2518,2470],{},[57,2520,145,2521,2524],{},[21,2522,2523],{},"{ sessionTimeoutHours: [int], permissionCacheExpirySeconds: [double], serverurl: [string], supportemail: [string], userscreatebanned: [bool], onlyadmincreateorgs: [bool], smtp: { enabled: [bool], server: [string], sourceaddress: [string], usetls: [bool], username: [string], password: [string] } }",[54,2525,2526,2529],{},[57,2527,2528],{},"All fields optional; omitted fields retain their current value",[57,2530,2531,2532,2535,2536,2539],{},"Setting ",[21,2533,2534],{},"smtp.username"," to ",[21,2537,2538],{},"\"\""," clears both username and password",[57,2541,283,2542],{},[109,2543,246],{},[121,2545],{},[124,2547,2549],{"id":2548},"auth-providers","Auth Providers",[14,2551,2552],{},[21,2553,2554],{},"\u002F_auth\u002Fproviders\u002Flist",[104,2556,2557],{},[14,2558,2559,2560,832,2563,2565],{},"Lists configured OAuth providers. Returns full details (including client IDs and endpoints) to callers with Server Config Edit permission; returns only ",[21,2561,2562],{},"id",[21,2564,381],{}," to public callers.",[54,2567,2568,2570,2574],{},[57,2569,207],{},[57,2571,145,2572],{},[109,2573,246],{},[57,2575,283,2576,2579],{},[21,2577,2578],{},"{ providers: [array] }",[54,2580,2581,2587],{},[57,2582,2583,2584],{},"Public: ",[21,2585,2586],{},"{ id: [string], name: [string] }",[57,2588,2589,2590,213,2593,213,2596],{},"Admin: also includes ",[21,2591,2592],{},"clientid",[21,2594,2595],{},"authendpoint",[21,2597,2598],{},"tokenendpoint",[121,2600],{},[14,2602,2603],{},[21,2604,2605],{},"\u002F_auth\u002Fproviders\u002Fadd",[104,2607,2608],{},[14,2609,2610],{},"Adds an OAuth provider. If no providers are configured yet, this endpoint is public (to allow initial setup); otherwise requires Server Config Edit.",[54,2612,2613,2616,2626],{},[57,2614,2615],{},"Minimum Privilege: Public (first provider), Server Config Edit (subsequent providers)",[57,2617,145,2618,2621],{},[21,2619,2620],{},"{ id: [string], name: [string], authendpoint: [string], tokenendpoint: [string], client_id: [string], client_secret: [string] }",[54,2622,2623],{},[57,2624,2625],{},"All fields required, minimum 3 characters each",[57,2627,283,2628],{},[109,2629,246],{},[121,2631],{},[14,2633,2634],{},[21,2635,2636],{},"\u002F_auth\u002Fproviders\u002Fremove",[104,2638,2639],{},[14,2640,2641],{},"Removes an OAuth provider.",[54,2643,2644,2646,2651],{},[57,2645,2470],{},[57,2647,145,2648],{},[21,2649,2650],{},"{ id: [string] }",[57,2652,283,2653],{},[109,2654,246],{},[121,2656],{},[681,2658,2660],{"id":2659},"users-v1","Users (v1)",[14,2662,2663],{},[21,2664,2665],{},"\u002Fv1\u002Fuser",[104,2667,2668],{},[14,2669,2670],{},"Returns information about a user.",[54,2672,2673,2675,2682],{},[57,2674,241],{},[57,2676,145,2677,2679,2680],{},[21,2678,600],{}," or ",[21,2681,998],{},[57,2683,283,2684,2687],{},[21,2685,2686],{},"{ user: { userid: [string], realname: [string], email: [string], createdtime: [double], lastlogin: [double], language: [string], globalPermissions: [int] } }",[54,2688,2689],{},[57,2690,2691,213,2693,213,2696,213,2699,213,2702,2704],{},[21,2692,168],{},[21,2694,2695],{},"createdtime",[21,2697,2698],{},"lastlogin",[21,2700,2701],{},"language",[21,2703,340],{},": Only returned to the user themselves or callers with User Edit permission",[121,2706],{},[14,2708,2709],{},[21,2710,2711],{},"\u002Fv1\u002Fuser\u002Fdeactivate",[104,2713,2714],{},[14,2715,2716],{},"Deactivates (blocks) a user account.",[54,2718,2719,2722,2726],{},[57,2720,2721],{},"Minimum Privilege: User Edit",[57,2723,145,2724],{},[21,2725,600],{},[57,2727,283,2728],{},[109,2729,246],{},[121,2731],{},[14,2733,2734],{},[21,2735,2736],{},"\u002Fv1\u002Fuser\u002Freactivate",[104,2738,2739],{},[14,2740,2741],{},"Reactivates a previously deactivated user account.",[54,2743,2744,2746,2753],{},[57,2745,2721],{},[57,2747,145,2748,2679,2750],{},[21,2749,600],{},[21,2751,2752],{},"{ username: [string] }",[57,2754,283,2755],{},[109,2756,246],{},[121,2758],{},[14,2760,2761],{},[21,2762,2763],{},"\u002Fv1\u002Fuser\u002Fsessions",[104,2765,2766],{},[14,2767,2768],{},"Lists active sessions for a user.",[54,2770,2771,2774,2810],{},[57,2772,2773],{},"Minimum Privilege: User (own sessions) or User Edit (any user)",[57,2775,145,2776,2779],{},[21,2777,2778],{},"{ userid: [string], index: [int], count: [int] }",[54,2780,2781,2790,2800],{},[57,2782,2783,156,2785,2789],{},[21,2784,330],{},[109,2786,2787],{},[160,2788,173],{},": Defaults to current user",[57,2791,2792,156,2795,2799],{},[21,2793,2794],{},"index",[109,2796,2797],{},[160,2798,173],{},": Offset for pagination (default 0)",[57,2801,2802,156,2805,2809],{},[21,2803,2804],{},"count",[109,2806,2807],{},[160,2808,173],{},": Results per page (10–50, default 25)",[57,2811,283,2812,2815],{},[21,2813,2814],{},"{ sessions: [array], total: [int] }",[54,2816,2817],{},[57,2818,448,2819],{},[21,2820,2821],{},"{ applicationname: [string], created: [double], lastaccess: [double], remoteaddress: [string] }",[121,2823],{},[681,2825,2827],{"id":2826},"packages","Packages",[14,2829,2830],{},[21,2831,2832],{},"\u002F_packages\u002Fcreate",[104,2834,2835],{},[14,2836,2837],{},"Creates a new package record and attaches deliverable download links.",[54,2839,2840,2842,2890],{},[57,2841,2470],{},[57,2843,145,2844,2847],{},[21,2845,2846],{},"{ packagename: [string], versionstring: [string], versionnumber: [int], visibility: [int], releasenotes: [string], deliverables: [array] }",[54,2848,2849,2855,2868,2878],{},[57,2850,2851,2854],{},[21,2852,2853],{},"versionnumber",": Must be > 0",[57,2856,2857,2162,2860,2863,2864,2867],{},[21,2858,2859],{},"visibility",[21,2861,2862],{},"0"," = Public, ",[21,2865,2866],{},"1"," = Beta",[57,2869,2870,156,2873,2877],{},[21,2871,2872],{},"releasenotes",[109,2874,2875],{},[160,2876,173],{},", markdown supported",[57,2879,2880,156,2883,2496,2887],{},[21,2881,2882],{},"deliverables",[109,2884,2885],{},[160,2886,173],{},[21,2888,2889],{},"{ variant: [string], fileurl: [string] }",[57,2891,283,2892],{},[21,2893,2894],{},"{ packageid: [string] }",[121,2896],{},[14,2898,2899],{},[21,2900,2901],{},"\u002F_packages\u002Flist",[104,2903,2904],{},[14,2905,2906],{},"Lists available packages.",[54,2908,2909,2911,2920],{},[57,2910,241],{},[57,2912,145,2913,2916],{},[21,2914,2915],{},"{ packagename: [string], index: [int], count: [int] }",[54,2917,2918],{},[57,2919,1371],{},[57,2921,283,2922,2925],{},[21,2923,2924],{},"{ packages: [array], total: [int] }",[54,2926,2927,2932],{},[57,2928,448,2929],{},[21,2930,2931],{},"{ packageid: [string], name: [string], versionstring: [string], versionnumber: [int], created: [int], isavailable: [bool], visibility: [int], releasenotes: [string], deliverables: [array] }",[57,2933,2934,156,2937,2942],{},[21,2935,2936],{},"isavailable",[109,2938,2939],{},[160,2940,2941],{},"deprecated",": no longer used for availability — a package is available when it has a matching deliverable.",[121,2944],{},[14,2946,2947],{},[21,2948,2949],{},"\u002F_packages\u002Flatest",[104,2951,2952],{},[14,2953,2954],{},"Returns the latest version of a named package for a given variant. A package resolves only if it has a deliverable matching the requested variant.",[54,2956,2957,2959,2964],{},[57,2958,241],{},[57,2960,145,2961],{},[21,2962,2963],{},"{ packagename: [string], packagevariant: [string] }",[57,2965,283,2966,2969],{},[21,2967,2968],{},"{ package: { packageid: [string], name: [string], versionstring: [string], versionnumber: [int], created: [int], isavailable: [bool], visibility: [int], releasenotes: [string], deliverables: [array] } }",[54,2970,2971],{},[57,2972,2973,156,2975,2979],{},[21,2974,2936],{},[109,2976,2977],{},[160,2978,2941],{},": always reported, but no longer gates resolution.",[121,2981],{},[14,2983,2984],{},[21,2985,2986],{},"\u002F_packages\u002Fupdate",[104,2988,2989],{},[14,2990,2991],{},"Updates package metadata.",[54,2993,2994,2996,3015],{},[57,2995,2470],{},[57,2997,145,2998,3001],{},[21,2999,3000],{},"{ packageid: [string], visibility: [int] }",[54,3002,3003],{},[57,3004,3005,156,3007,2162,3011,2863,3013,2867],{},[21,3006,2859],{},[109,3008,3009],{},[160,3010,173],{},[21,3012,2862],{},[21,3014,2866],{},[57,3016,283,3017],{},[109,3018,246],{},[121,3020],{},[681,3022,3024],{"id":3023},"analytics","Analytics",[14,3026,3027],{},"All analytics endpoints require the Analytics global permission.",[14,3029,3030],{},[21,3031,3032],{},"\u002F_analytics\u002Foverview",[104,3034,3035],{},[14,3036,3037],{},"Returns high-level server usage statistics.",[54,3039,3040],{},[57,3041,283,3042],{},[21,3043,3044],{},"{ users: { total: [int], loggedin: [int], created: [int] }, sessions: [int], scenes: { total: [int], active: [int], deleted: [int] }, workspaces: [int] }",[121,3046],{},[14,3048,3049],{},[21,3050,3051],{},"\u002F_analytics\u002Fdau",[104,3053,3054],{},[14,3055,3056],{},"Returns daily active user counts for the last 30 days.",[54,3058,3059],{},[57,3060,283,3061,3064,3065],{},[21,3062,3063],{},"{ dataset: [array] }"," — each item: ",[21,3066,3067],{},"[date, user_count]",[121,3069],{},[14,3071,3072,3075,3078],{},[21,3073,3074],{},"\u002F_analytics\u002Fusers\u002Ftop\u002Fsince\u002F:application",[21,3076,3077],{},"\u002F_analytics\u002Fusers\u002Ftop\u002Fsince\u002F:numdays\u002F:application",[21,3079,3080],{},"\u002F_analytics\u002Fusers\u002Ftop\u002Fsince\u002F:numdays\u002F:application\u002F:page",[104,3082,3083],{},[14,3084,3085],{},"Returns top users by session time for an application over the last N days.",[54,3087,3088,3102],{},[57,3089,3090,3091,3094,3095,213,3098,3101],{},"Path Params: ",[21,3092,3093],{},"numdays"," (1–999, default 7), ",[21,3096,3097],{},"application",[21,3099,3100],{},"page"," (default 1)",[57,3103,283,3104,3064,3107],{},[21,3105,3106],{},"{ since: [string], dataset: [array] }",[21,3108,3109],{},"[userid, email, realname, session_seconds]",[121,3111],{},[14,3113,3114,3117],{},[21,3115,3116],{},"\u002F_analytics\u002Fusers\u002Ftop\u002Fbetween\u002F:start\u002F:end\u002F:application",[21,3118,3119],{},"\u002F_analytics\u002Fusers\u002Ftop\u002Fbetween\u002F:start\u002F:end\u002F:application\u002F:page",[104,3121,3122],{},[14,3123,3124],{},"Returns top users by session time for an application between two dates.",[54,3126,3127,3140],{},[57,3128,3090,3129,213,3132,3135,3136,213,3138,3101],{},[21,3130,3131],{},"start",[21,3133,3134],{},"end"," (YYYY-MM-DD), ",[21,3137,3097],{},[21,3139,3100],{},[57,3141,283,3142,3064,3144],{},[21,3143,3063],{},[21,3145,3109],{},[121,3147],{},[14,3149,3150],{},[21,3151,3152],{},"\u002F_analytics\u002Fapps\u002Fusage\u002Fbetween\u002F:start\u002F:end",[104,3154,3155],{},[14,3156,3157],{},"Returns application usage time per day between two dates.",[54,3159,3160,3167],{},[57,3161,3090,3162,213,3164,3166],{},[21,3163,3131],{},[21,3165,3134],{}," (YYYY-MM-DD)",[57,3168,283,3169,3064,3171],{},[21,3170,3063],{},[21,3172,3173],{},"{ name: [string], dates: { [date]: [seconds] } }",[121,3175],{},[14,3177,3178],{},[21,3179,3180],{},"\u002F_analytics\u002Fplatform\u002Fusage\u002Fbetween\u002F:start\u002F:end",[104,3182,3183],{},[14,3184,3185],{},"Returns platform usage time per day between two dates.",[54,3187,3188,3194],{},[57,3189,3090,3190,213,3192,3166],{},[21,3191,3131],{},[21,3193,3134],{},[57,3195,283,3196,3064,3198],{},[21,3197,3063],{},[21,3199,3173],{},[121,3201],{},[681,3203,3205],{"id":3204},"webhooks","Webhooks",[14,3207,3208],{},[21,3209,3210],{},"\u002F_webhook\u002Flist",[104,3212,3213],{},[14,3214,3215],{},"Returns all configured webhook endpoints.",[54,3217,3218,3220,3224],{},[57,3219,2470],{},[57,3221,145,3222],{},[109,3223,246],{},[57,3225,283,3226,3229],{},[21,3227,3228],{},"{ hooks: [array] }",[54,3230,3231,3236],{},[57,3232,448,3233],{},[21,3234,3235],{},"{ url: [string], hooks: [array of string] }",[57,3237,3238,3241,3242,213,3245,213,3248],{},[21,3239,3240],{},"hooks",": Array of event name strings — ",[21,3243,3244],{},"\"user-create\"",[21,3246,3247],{},"\"user-update\"",[21,3249,3250],{},"\"user-login\"",[121,3252],{},[14,3254,3255],{},[21,3256,3257],{},"\u002F_webhook\u002Fupdate",[104,3259,3260],{},[14,3261,3262,3263,3265],{},"Creates, updates, or deletes a webhook endpoint. Passing an empty ",[21,3264,3240],{}," array removes all entries for that URL.",[54,3267,3268,3270,3298],{},[57,3269,2470],{},[57,3271,145,3272,3274],{},[21,3273,3235],{},[54,3275,3276,3281,3289],{},[57,3277,3278,3280],{},[21,3279,2228],{},": Webhook endpoint URL",[57,3282,3283,3285,3286,3288],{},[21,3284,3240],{},": Array of event names to subscribe to. Pass ",[21,3287,2148],{}," to delete the webhook.",[57,3290,3291,3292,213,3294,213,3296],{},"Valid event names: ",[21,3293,3244],{},[21,3295,3247],{},[21,3297,3250],{},[57,3299,283,3300],{},[109,3301,246],{},[3303,3304,3305],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}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);}",{"title":1425,"searchDepth":1438,"depth":1438,"links":3307},[3308,3309,3310,3311,3315,3316,3317,3318,3319],{"id":126,"depth":1438,"text":127},{"id":254,"depth":1438,"text":255},{"id":354,"depth":1438,"text":355},{"id":456,"depth":1438,"text":457,"children":3312},[3313,3314],{"id":683,"depth":1464,"text":684},{"id":799,"depth":1464,"text":800},{"id":751,"depth":1438,"text":1018},{"id":1213,"depth":1438,"text":1214},{"id":1944,"depth":1438,"text":1945},{"id":2431,"depth":1438,"text":2432},{"id":2548,"depth":1438,"text":2549,"children":3320},[3321,3322,3323,3324],{"id":2659,"depth":1464,"text":2660},{"id":2826,"depth":1464,"text":2827},{"id":3023,"depth":1464,"text":3024},{"id":3204,"depth":1464,"text":3205},"md",{},true,"\u002Fdev\u002Fudserverapi",{"title":5,"description":16},"3.dev\u002FudServerAPI","impUL6ET483y7xxLBkJUwbwBCCj3uQF94aaIyCjnv-I",[3333,3336,3364,3381],{"title":3334,"path":2410,"stem":3335},"udServer Manuals","0.index",{"title":3337,"path":3338,"stem":3339,"children":3340},"User Guide","\u002Fdocs\u002Fuser","1.user\u002F0.index",[3341,3345,3349,3352,3356,3360],{"title":3342,"path":3343,"stem":3344},"Login","\u002Fdocs\u002Fuser\u002Flogin","1.user\u002F1.login",{"title":3346,"path":3347,"stem":3348},"3rd Party Licenses","\u002Fdocs\u002Fuser\u002Flicenses","1.user\u002Flicenses",{"title":457,"path":3350,"stem":3351},"\u002Fdocs\u002Fuser\u002Forganisations","1.user\u002Forganisations",{"title":3353,"path":3354,"stem":3355},"Permissions","\u002Fdocs\u002Fuser\u002Fpermissions","1.user\u002Fpermissions",{"title":3357,"path":3358,"stem":3359},"Connecting an AWS S3 Bucket to a Project","\u002Fdocs\u002Fuser\u002Fproject-s3-setup","1.user\u002Fproject-s3-setup",{"title":3361,"path":3362,"stem":3363},"Organisation Projects","\u002Fdocs\u002Fuser\u002Fprojects","1.user\u002Fprojects",{"title":3365,"path":3366,"stem":3367,"children":3368},"IT Administrators Guide","\u002Fdocs\u002Fadmin","2.admin\u002F0.index",[3369,3373,3377],{"title":3370,"path":3371,"stem":3372},"Generic Installation","\u002Fdocs\u002Fadmin\u002Fgettingstarted","2.admin\u002F1.gettingstarted",{"title":3374,"path":3375,"stem":3376},"Setting up on an Amazon EC2 instance","\u002Fdocs\u002Fadmin\u002Famazon-ec2","2.admin\u002F2.amazon-ec2",{"title":3378,"path":3379,"stem":3380},"Configuring OAuth \u002F OIDC Authentication","\u002Fdocs\u002Fadmin\u002Foauth","2.admin\u002F3.oauth",{"title":3382,"path":3383,"stem":3384,"children":3385},"Developers Guide","\u002Fdocs\u002Fdev","3.dev\u002F0.index",[3386],{"title":5,"path":3387,"stem":3330},"\u002Fdocs\u002Fdev\u002Fudserverapi",1779890364915]