[{"data":1,"prerenderedAt":307},["ShallowReactive",2],{"docs-dev":3,"navigation":170,"docs-surround-dev":302},{"id":4,"title":5,"body":6,"description":16,"extension":163,"meta":164,"navigation":165,"path":166,"seo":167,"stem":168,"__hash__":169},"docs\u002F3.dev\u002F0.index.md","Developers Guide",{"type":7,"value":8,"toc":156},"minimark",[9,13,17,22,46,50,74,97,110,114],[10,11,5],"h1",{"id":12},"developers-guide",[14,15,16],"p",{},"This guide covers integrating with udServer programmatically — automating administration, driving it from your own tooling, or building an application against it.",[18,19,21],"h2",{"id":20},"apis","APIs",[23,24,25,37],"ul",{},[26,27,28,36],"li",{},[29,30,32],"a",{"href":31},"udServerAPI",[33,34,35],"strong",{},"udServer API"," — the HTTP API. Everything the web interface does, it does through these endpoints: users and sessions, organisations and permissions, projects, scenes, files, work items, licensing, and server administration.",[26,38,39,45],{},[29,40,42],{"href":41},"websocketapi",[33,43,44],{},"WebSocket API"," — event-driven scene collaboration. Pushes scene edits and viewer presence as they happen instead of being polled.",[18,47,49],{"id":48},"getting-started","Getting Started",[14,51,52,53,57,58,61,62,65,66,69,70,73],{},"Every HTTP endpoint lives under ",[54,55,56],"code",{},"\u002Fapi\u002F"," and returns a JSON object containing at least a ",[54,59,60],{},"success"," boolean; when it is ",[54,63,64],{},"false",", a ",[54,67,68],{},"message"," field says why. The ",[29,71,72],{"href":31},"error message list"," at the top of the API reference covers the values common to every endpoint.",[14,75,76,77,80,81,84,85,87,88,91,92,96],{},"Authentication is by ",[33,78,79],{},"API key",", supplied either as the ",[54,82,83],{},"apikey"," cookie or as an ",[54,86,83],{}," field in the request body. Users create their own keys from ",[33,89,90],{},"Settings → API Keys"," — see ",[29,93,95],{"href":94},"\u002Fdocs\u002Fuser\u002Faccount-settings#api-keys","Account Settings"," — and a key carries exactly the permissions of the user who created it, so a script can never do more than the person running it.",[14,98,99,100,104,105,109],{},"For an application logging a ",[101,102,103],"em",{},"user"," in rather than acting as one, use the ",[29,106,108],{"href":107},"udServerAPI#external-application-sessions","external session endpoints",", which are the flow behind approving udStream and other udSDK applications.",[18,111,113],{"id":112},"things-worth-knowing-early","Things Worth Knowing Early",[23,115,116,127,133,147],{},[26,117,118,121,122,126],{},[33,119,120],{},"Permissions are per-project, not just per-organisation."," A role can be scoped to specific projects, so a member's effective permissions differ from project to project within one organisation. See ",[29,123,125],{"href":124},"\u002Fdocs\u002Fuser\u002Fpermissions","Permissions",".",[26,128,129,132],{},[33,130,131],{},"Signed documents are byte-exact."," Licenses and issuer check-ins are verified against the bytes as sent. Parsing and re-encoding the JSON — even without changing a value — invalidates the signature.",[26,134,135,138,139,142,143,146],{},[33,136,137],{},"Sequence cursors are not timestamps."," Scene synchronisation uses a per-scene edit sequence. It is named ",[54,140,141],{},"lastupdate","\u002F",[54,144,145],{},"nextupdate"," for historical reasons but must be treated as opaque, never compared against a clock.",[26,148,149,155],{},[33,150,151,154],{},[54,152,153],{},"\u002Fapi\u002Fsdk\u002F*"," is not documented here."," That namespace is the private udSDK communication channel.",{"title":157,"searchDepth":158,"depth":158,"links":159},"",2,[160,161,162],{"id":20,"depth":158,"text":21},{"id":48,"depth":158,"text":49},{"id":112,"depth":158,"text":113},"md",{},true,"\u002Fdev",{"title":5,"description":16},"3.dev\u002F0.index","kSMw8sbz0wpj8tx7zn_J-VJ47r_ZyTbjj_7pYsQIQr8",[171,174,232,293],{"title":172,"path":142,"stem":173},"udServer Manuals","0.index",{"title":175,"path":176,"stem":177,"children":178},"User Guide","\u002Fdocs\u002Fuser","1.user\u002F0.index",[179,183,186,190,194,198,202,206,208,212,216,220,224,228],{"title":180,"path":181,"stem":182},"Login","\u002Fdocs\u002Fuser\u002Flogin","1.user\u002F1.login",{"title":95,"path":184,"stem":185},"\u002Fdocs\u002Fuser\u002Faccount-settings","1.user\u002Faccount-settings",{"title":187,"path":188,"stem":189},"Files","\u002Fdocs\u002Fuser\u002Ffiles","1.user\u002Ffiles",{"title":191,"path":192,"stem":193},"Jobs","\u002Fdocs\u002Fuser\u002Fjobs","1.user\u002Fjobs",{"title":195,"path":196,"stem":197},"3rd Party Licenses","\u002Fdocs\u002Fuser\u002Flicenses","1.user\u002Flicenses",{"title":199,"path":200,"stem":201},"Licensing","\u002Fdocs\u002Fuser\u002Flicensing","1.user\u002Flicensing",{"title":203,"path":204,"stem":205},"Organisations","\u002Fdocs\u002Fuser\u002Forganisations","1.user\u002Forganisations",{"title":125,"path":124,"stem":207},"1.user\u002Fpermissions",{"title":209,"path":210,"stem":211},"Connecting an Azure Blob Container to a Project","\u002Fdocs\u002Fuser\u002Fproject-azure-setup","1.user\u002Fproject-azure-setup",{"title":213,"path":214,"stem":215},"Connecting an AWS S3 Bucket to a Project","\u002Fdocs\u002Fuser\u002Fproject-s3-setup","1.user\u002Fproject-s3-setup",{"title":217,"path":218,"stem":219},"Projects","\u002Fdocs\u002Fuser\u002Fprojects","1.user\u002Fprojects",{"title":221,"path":222,"stem":223},"Scenes","\u002Fdocs\u002Fuser\u002Fscenes","1.user\u002Fscenes",{"title":225,"path":226,"stem":227},"Software Downloads","\u002Fdocs\u002Fuser\u002Fsoftware","1.user\u002Fsoftware",{"title":229,"path":230,"stem":231},"Work Items","\u002Fdocs\u002Fuser\u002Fworkitems","1.user\u002Fworkitems",{"title":233,"path":234,"stem":235,"children":236},"IT Administrators Guide","\u002Fdocs\u002Fadmin","2.admin\u002F0.index",[237,241,245,249,253,257,261,265,269,273,277,281,285,289],{"title":238,"path":239,"stem":240},"System Requirements","\u002Fdocs\u002Fadmin\u002Fsystem-requirements","2.admin\u002F1.system-requirements",{"title":242,"path":243,"stem":244},"Publishing Software (Packages)","\u002Fdocs\u002Fadmin\u002Fsoftware-packages","2.admin\u002F10.software-packages",{"title":246,"path":247,"stem":248},"Legal Documents","\u002Fdocs\u002Fadmin\u002Flegal-documents","2.admin\u002F11.legal-documents",{"title":250,"path":251,"stem":252},"Licensing & Purchasing","\u002Fdocs\u002Fadmin\u002Flicensing","2.admin\u002F12.licensing",{"title":254,"path":255,"stem":256},"Egress","\u002Fdocs\u002Fadmin\u002Fegress","2.admin\u002F13.egress",{"title":258,"path":259,"stem":260},"Backups & Restore","\u002Fdocs\u002Fadmin\u002Fbackups","2.admin\u002F14.backups",{"title":262,"path":263,"stem":264},"Generic Installation","\u002Fdocs\u002Fadmin\u002Fgettingstarted","2.admin\u002F2.gettingstarted",{"title":266,"path":267,"stem":268},"Setting up on an Amazon EC2 instance","\u002Fdocs\u002Fadmin\u002Famazon-ec2","2.admin\u002F3.amazon-ec2",{"title":270,"path":271,"stem":272},"Configuring OAuth \u002F OIDC Authentication","\u002Fdocs\u002Fadmin\u002Foauth","2.admin\u002F4.oauth",{"title":274,"path":275,"stem":276},"Admin Console","\u002Fdocs\u002Fadmin\u002Fadmin-console","2.admin\u002F5.admin-console",{"title":278,"path":279,"stem":280},"Server Configuration","\u002Fdocs\u002Fadmin\u002Fserver-configuration","2.admin\u002F6.server-configuration",{"title":282,"path":283,"stem":284},"Users & Organisations","\u002Fdocs\u002Fadmin\u002Fusers-and-organisations","2.admin\u002F7.users-and-organisations",{"title":286,"path":287,"stem":288},"Analytics & System Log","\u002Fdocs\u002Fadmin\u002Fanalytics-and-logs","2.admin\u002F8.analytics-and-logs",{"title":290,"path":291,"stem":292},"Webhooks","\u002Fdocs\u002Fadmin\u002Fwebhooks","2.admin\u002F9.webhooks",{"title":5,"path":294,"stem":168,"children":295},"\u002Fdocs\u002Fdev",[296,299],{"title":35,"path":297,"stem":298},"\u002Fdocs\u002Fdev\u002Fudserverapi","3.dev\u002FudServerAPI",{"title":44,"path":300,"stem":301},"\u002Fdocs\u002Fdev\u002Fwebsocketapi","3.dev\u002Fwebsocketapi",[303,305],{"title":290,"path":304,"stem":292,"children":-1},"\u002Fadmin\u002Fwebhooks",{"title":35,"path":306,"stem":298,"children":-1},"\u002Fdev\u002Fudserverapi",1787483257095]