[{"data":1,"prerenderedAt":1958},["ShallowReactive",2],{"docs-nav:docs_en":3,"docs-page:\u002Fen\u002Fdocs\u002Freference\u002Fapi":158,"docs-surround:\u002Fen\u002Fdocs\u002Freference\u002Fapi":1954},[4],{"title":5,"path":6,"stem":7,"children":8,"page":74},"En","\u002Fen","en",[9],{"title":10,"path":11,"stem":12,"children":13,"page":74},"Docs","\u002Fen\u002Fdocs","en\u002Fdocs",[14,75,134],{"title":15,"icon":16,"path":17,"stem":18,"children":19,"page":74},"Guides","i-lucide-book-open","\u002Fen\u002Fdocs\u002Fguides","en\u002Fdocs\u002F1.guides",[20,25,30,35,40,44,49,54,59,64,69],{"title":21,"path":22,"stem":23,"icon":24},"Introduction","\u002Fen\u002Fdocs\u002Fguides\u002Fintroduction","en\u002Fdocs\u002F1.guides\u002F01.introduction","i-lucide-info",{"title":26,"path":27,"stem":28,"icon":29},"Quick start","\u002Fen\u002Fdocs\u002Fguides\u002Fquick-start","en\u002Fdocs\u002F1.guides\u002F02.quick-start","i-lucide-play",{"title":31,"path":32,"stem":33,"icon":34},"Add the office computers","\u002Fen\u002Fdocs\u002Fguides\u002Foffice","en\u002Fdocs\u002F1.guides\u002F03.office","i-lucide-building-2",{"title":36,"path":37,"stem":38,"icon":39},"Rendering on GPU Rental Platforms","\u002Fen\u002Fdocs\u002Fguides\u002Fcloud","en\u002Fdocs\u002F1.guides\u002F04.cloud","i-lucide-cloud",{"title":41,"path":42,"stem":43},"Configuring Cloudflare R2 Storage","\u002Fen\u002Fdocs\u002Fguides\u002Fr2","en\u002Fdocs\u002F1.guides\u002F05.r2",{"title":45,"path":46,"stem":47,"icon":48},"Run the host on a NAS","\u002Fen\u002Fdocs\u002Fguides\u002Fnas","en\u002Fdocs\u002F1.guides\u002F06.nas","i-lucide-hard-drive",{"title":50,"path":51,"stem":52,"icon":53},"Devices in different places","\u002Fen\u002Fdocs\u002Fguides\u002Fremote","en\u002Fdocs\u002F1.guides\u002F07.remote","i-lucide-globe",{"title":55,"path":56,"stem":57,"icon":58},"Get the film","\u002Fen\u002Fdocs\u002Fguides\u002Ffilm","en\u002Fdocs\u002F1.guides\u002F08.film","i-lucide-film",{"title":60,"path":61,"stem":62,"icon":63},"When files change","\u002Fen\u002Fdocs\u002Fguides\u002Fupdate","en\u002Fdocs\u002F1.guides\u002F09.update","i-lucide-refresh-cw",{"title":65,"path":66,"stem":67,"icon":68},"When the host fails or moves","\u002Fen\u002Fdocs\u002Fguides\u002Fhost","en\u002Fdocs\u002F1.guides\u002F10.host","i-lucide-server-cog",{"title":70,"path":71,"stem":72,"icon":73},"FAQ","\u002Fen\u002Fdocs\u002Fguides\u002Ffaq","en\u002Fdocs\u002F1.guides\u002F11.faq","i-lucide-circle-help",false,{"title":76,"icon":77,"path":78,"stem":79,"children":80,"page":74},"Concepts","i-lucide-box","\u002Fen\u002Fdocs\u002Fconcepts","en\u002Fdocs\u002F2.concepts",[81,86,90,95,100,105,109,114,119,124,129],{"title":82,"path":83,"stem":84,"icon":85},"Workspace and host","\u002Fen\u002Fdocs\u002Fconcepts\u002Fworkspace","en\u002Fdocs\u002F2.concepts\u002F01.workspace","i-lucide-network",{"title":87,"path":88,"stem":89,"icon":48},"Store","\u002Fen\u002Fdocs\u002Fconcepts\u002Fstorage","en\u002Fdocs\u002F2.concepts\u002F02.storage",{"title":91,"path":92,"stem":93,"icon":94},"Assets, Unpacking & On-Demand Pull","\u002Fen\u002Fdocs\u002Fconcepts\u002Fassets","en\u002Fdocs\u002F2.concepts\u002F03.assets","i-lucide-images",{"title":96,"path":97,"stem":98,"icon":99},"Projects, tasks and versions","\u002Fen\u002Fdocs\u002Fconcepts\u002Ftasks","en\u002Fdocs\u002F2.concepts\u002F04.tasks","i-lucide-list-checks",{"title":101,"path":102,"stem":103,"icon":104},"Shots and chunks","\u002Fen\u002Fdocs\u002Fconcepts\u002Fshots","en\u002Fdocs\u002F2.concepts\u002F05.shots","i-lucide-clapperboard",{"title":106,"path":107,"stem":108,"icon":58},"Films","\u002Fen\u002Fdocs\u002Fconcepts\u002Ffilm","en\u002Fdocs\u002F2.concepts\u002F06.film",{"title":110,"path":111,"stem":112,"icon":113},"Blender and FFmpeg","\u002Fen\u002Fdocs\u002Fconcepts\u002Fruntimes","en\u002Fdocs\u002F2.concepts\u002F07.runtimes","i-lucide-package",{"title":115,"path":116,"stem":117,"icon":118},"Joining and access","\u002Fen\u002Fdocs\u002Fconcepts\u002Fjoining","en\u002Fdocs\u002F2.concepts\u002F08.joining","i-lucide-key-round",{"title":120,"path":121,"stem":122,"icon":123},"Render seats","\u002Fen\u002Fdocs\u002Fconcepts\u002Fseats","en\u002Fdocs\u002F2.concepts\u002F09.seats","i-lucide-gauge",{"title":125,"path":126,"stem":127,"icon":128},"Backup and takeover","\u002Fen\u002Fdocs\u002Fconcepts\u002Fbackup","en\u002Fdocs\u002F2.concepts\u002F10.backup","i-lucide-life-buoy",{"title":130,"path":131,"stem":132,"icon":133},"Plugins","\u002Fen\u002Fdocs\u002Fconcepts\u002Fplugins","en\u002Fdocs\u002F2.concepts\u002F11.plugins","i-lucide-puzzle",{"title":135,"icon":136,"path":137,"stem":138,"children":139,"page":74},"Reference","i-lucide-library","\u002Fen\u002Fdocs\u002Freference","en\u002Fdocs\u002F3.reference",[140,145,150,154],{"title":141,"path":142,"stem":143,"icon":144},"Command line","\u002Fen\u002Fdocs\u002Freference\u002Fcli","en\u002Fdocs\u002F3.reference\u002F1.cli","i-lucide-terminal",{"title":146,"path":147,"stem":148,"icon":149},"Configuration","\u002Fen\u002Fdocs\u002Freference\u002Fconfig","en\u002Fdocs\u002F3.reference\u002F2.config","i-lucide-sliders",{"title":151,"path":152,"stem":153},"HTTP API","\u002Fen\u002Fdocs\u002Freference\u002Fapi","en\u002Fdocs\u002F3.reference\u002F3.api",{"title":155,"path":156,"stem":157},"Plugin development","\u002Fen\u002Fdocs\u002Freference\u002Fplugins","en\u002Fdocs\u002F3.reference\u002F4.plugins",{"id":159,"title":151,"body":160,"description":1945,"extension":1946,"meta":1947,"navigation":1172,"path":152,"seo":1948,"stem":153,"__hash__":1953},"docs_en\u002Fen\u002Fdocs\u002F3.reference\u002F3.api.md",{"type":161,"value":162,"toc":1929},"minimark",[163,167,175,180,235,243,247,250,266,339,346,349,453,478,485,539,550,554,561,603,627,823,827,885,889,925,931,935,943,980,1002,1013,1016,1133,1136,1140,1143,1239,1255,1266,1278,1287,1291,1294,1299,1356,1360,1604,1608,1720,1723,1835,1839,1842,1918,1925],[164,165,166],"p",{},"danio's own interface, the command line, the Blender add-on, plugins, and the devices that join a workspace all call the same HTTP API. Your own scripts can use it too.",[164,168,169,170,174],{},"Every endpoint is under ",[171,172,173],"code",{},"\u002Fapi\u002Fv1\u002F"," and speaks JSON. The parameters, responses and required permission of each endpoint are in the OpenAPI description; this page covers the conventions and the most-used endpoints.",[176,177,179],"h2",{"id":178},"addresses","Addresses",[181,182,183,199],"table",{},[184,185,186],"thead",{},[187,188,189,193,196],"tr",{},[190,191,192],"th",{},"Address",[190,194,195],{},"Who uses it",[190,197,198],{},"Token",[200,201,202,224],"tbody",{},[187,203,204,210,221],{},[205,206,207],"td",{},[171,208,209],{},"http:\u002F\u002F127.0.0.1:7421",[205,211,212,213,217,218],{},"Programs on this computer. When the port is taken, danio moves up; the real address is shown under ",[214,215,216],"ui",{},"Settings"," → ",[214,219,220],{},"API",[205,222,223],{},"The local token",[187,225,226,229,232],{},[205,227,228],{},"The host's workspace address, port 7420 by default",[205,230,231],{},"Devices and scripts on other computers. The host must have opened this port to other devices first",[205,233,234],{},"A workspace token",[164,236,237,238,242],{},"For setting the port, see ",[239,240,146],"a",{"href":241},"\u002Fen\u002Fdocs\u002Freference\u002Fconfig#environment-variables",".",[176,244,246],{"id":245},"tokens-and-permissions","Tokens and permissions",[164,248,249],{},"Send the token with the request:",[251,252,257],"pre",{"className":253,"code":254,"language":255,"meta":256,"style":256},"language-http shiki shiki-themes material-theme-palenight","Authorization: Bearer \u003Ctoken>\n","http","",[171,258,259],{"__ignoreMap":256},[260,261,264],"span",{"class":262,"line":263},"line",1,[260,265,254],{},[181,267,268,280],{},[184,269,270],{},[187,271,272,274,277],{},[190,273,198],{},[190,275,276],{},"What it can do",[190,278,279],{},"Where it comes from",[200,281,282,301,324],{},[187,283,284,287,290],{},[205,285,286],{},"Local token",[205,288,289],{},"Everything this computer's engine can do, including the endpoints that exist only locally",[205,291,292,293,217,295,297,298],{},"Shown under ",[214,294,216],{},[214,296,286],{},"; can be fixed with ",[171,299,300],{},"DANIO_TOKEN",[187,302,303,306,314],{},[205,304,305],{},"Integration token",[205,307,308,309,313],{},"Only the ",[239,310,312],{"href":311},"\u002Fen\u002Fdocs\u002Fconcepts\u002Fjoining#access","access"," level you chose",[205,315,316,317,320,321],{},"The ",[214,318,319],{},"Plugins and integrations"," page in the workspace details, or ",[171,322,323],{},"danio workspace token add \u003Cname> --access \u003Clevel> --integration",[187,325,326,329,332],{},[205,327,328],{},"Device token",[205,330,331],{},"Used by a device to join the workspace and render; also carries an access level",[205,333,334,335],{},"Made when you add a device, see ",[239,336,338],{"href":337},"\u002Fen\u002Fdocs\u002Fconcepts\u002Fjoining#tokens","Tokens",[164,340,341,342,345],{},"An integration token is shown only once, when it is made. Use ",[214,343,344],{},"Rotate"," to replace it; the old one stops working at once.",[164,347,348],{},"There are 9 workspace permissions, and an access level is a combination of them:",[181,350,351,361],{},[184,352,353],{},[187,354,355,358],{},[190,356,357],{},"Permission",[190,359,360],{},"What it allows",[200,362,363,373,383,393,403,413,423,433,443],{},[187,364,365,370],{},[205,366,367],{},[171,368,369],{},"workspace.view",[205,371,372],{},"View projects, tasks, progress, previews, devices and usage",[187,374,375,380],{},[205,376,377],{},[171,378,379],{},"output.download",[205,381,382],{},"Download films and the fragments of shots",[187,384,385,390],{},[205,386,387],{},[171,388,389],{},"job.submit",[205,391,392],{},"Submit tasks; update, pause, resume, cancel, re-render and delete the tasks you submitted",[187,394,395,400],{},[205,396,397],{},[171,398,399],{},"job.manage",[205,401,402],{},"Control everyone's tasks, reorder the queue and change shot assignments",[187,404,405,410],{},[205,406,407],{},[171,408,409],{},"project.edit",[205,411,412],{},"Create, change and delete projects",[187,414,415,420],{},[205,416,417],{},[171,418,419],{},"device.manage",[205,421,422],{},"Add devices, approve join requests, change devices' access and settings, block",[187,424,425,430],{},[205,426,427],{},[171,428,429],{},"storage.manage",[205,431,432],{},"Stores, resource packs, cleanup",[187,434,435,440],{},[205,436,437],{},[171,438,439],{},"plugin.manage",[205,441,442],{},"Plugins and integration tokens",[187,444,445,450],{},[205,446,447],{},[171,448,449],{},"workspace.manage",[205,451,452],{},"Workspace settings, backups, takeover",[164,454,455,456,459,460,463,464,467,468,470,471,473,474,477],{},"The level ",[214,457,458],{},"None"," has no permissions, ",[214,461,462],{},"Viewer"," has the first two, ",[214,465,466],{},"Workstation"," adds ",[171,469,389],{}," and ",[171,472,409],{},", and ",[214,475,476],{},"Admin"," has all of them.",[164,479,480,481,484],{},"In the OpenAPI description, each endpoint's ",[171,482,483],{},"x-required-permission"," names the one it needs. Besides the 9 above, there are four other values:",[181,486,487,497],{},[184,488,489],{},[187,490,491,494],{},[190,492,493],{},"Value",[190,495,496],{},"Meaning",[200,498,499,509,519,529],{},[187,500,501,506],{},[205,502,503],{},[171,504,505],{},"public",[205,507,508],{},"No token needed; used when a device joins",[187,510,511,516],{},[205,512,513],{},[171,514,515],{},"token",[205,517,518],{},"Any request with a valid token",[187,520,521,526],{},[205,522,523],{},[171,524,525],{},"device",[205,527,528],{},"Only a device token",[187,530,531,536],{},[205,532,533],{},[171,534,535],{},"local",[205,537,538],{},"Only the local token",[164,540,541,542,545,546,549],{},"When the permission is not enough, the answer is 403 with the error code ",[171,543,544],{},"forbidden",", naming what is missing. ",[171,547,548],{},"GET \u002Fapi\u002Fv1\u002Fme"," returns the identity and permissions of the current token.",[176,551,553],{"id":552},"errors","Errors",[164,555,556,557,560],{},"On an error the answer is ",[171,558,559],{},"application\u002Fproblem+json",":",[251,562,566],{"className":563,"code":564,"language":565,"meta":256,"style":256},"language-json shiki shiki-themes material-theme-palenight","{\n  \"type\": \"urn:danio:error:version-conflict\",\n  \"title\": \"Conflict\",\n  \"status\": 409,\n  \"detail\": \"…\"\n}\n","json",[171,567,568,573,579,585,591,597],{"__ignoreMap":256},[260,569,570],{"class":262,"line":263},[260,571,572],{},"{\n",[260,574,576],{"class":262,"line":575},2,[260,577,578],{},"  \"type\": \"urn:danio:error:version-conflict\",\n",[260,580,582],{"class":262,"line":581},3,[260,583,584],{},"  \"title\": \"Conflict\",\n",[260,586,588],{"class":262,"line":587},4,[260,589,590],{},"  \"status\": 409,\n",[260,592,594],{"class":262,"line":593},5,[260,595,596],{},"  \"detail\": \"…\"\n",[260,598,600],{"class":262,"line":599},6,[260,601,602],{},"}\n",[164,604,605,608,609,612,613,616,617,620,621,623,624,242],{},[171,606,607],{},"type"," is a stable error code for programs to act on; ",[171,610,611],{},"detail"," is for people, in the language of the request's ",[171,614,615],{},"Accept-Language",": Chinese when the header is missing or starts with ",[171,618,619],{},"zh",", English otherwise. Fields that failed validation are listed in ",[171,622,552],{},"; when a submission's checks fail, the reasons are listed in ",[171,625,626],{},"checks",[181,628,629,642],{},[184,630,631],{},[187,632,633,636,639],{},[190,634,635],{},"Error code",[190,637,638],{},"Status",[190,640,641],{},"When",[200,643,644,657,670,682,695,708,720,736,749,761,774,786,798,810],{},[187,645,646,651,654],{},[205,647,648],{},[171,649,650],{},"invalid-request",[205,652,653],{},"400",[205,655,656],{},"The request itself is wrong",[187,658,659,664,667],{},[205,660,661],{},[171,662,663],{},"unauthorized",[205,665,666],{},"401",[205,668,669],{},"No token, or an invalid one",[187,671,672,676,679],{},[205,673,674],{},[171,675,544],{},[205,677,678],{},"403",[205,680,681],{},"Not enough permission, or this origin isn't allowed",[187,683,684,689,692],{},[205,685,686],{},[171,687,688],{},"not-found",[205,690,691],{},"404",[205,693,694],{},"Not found",[187,696,697,702,705],{},[205,698,699],{},[171,700,701],{},"conflict",[205,703,704],{},"409",[205,706,707],{},"Conflicts with the current state",[187,709,710,715,717],{},[205,711,712],{},[171,713,714],{},"version-conflict",[205,716,704],{},[205,718,719],{},"Someone updated the task first",[187,721,722,727,730],{},[205,723,724],{},[171,725,726],{},"precondition-failed",[205,728,729],{},"412",[205,731,732,735],{},[171,733,734],{},"If-Match"," didn't match",[187,737,738,743,746],{},[205,739,740],{},[171,741,742],{},"validation-failed",[205,744,745],{},"422",[205,747,748],{},"A field failed validation",[187,750,751,756,758],{},[205,752,753],{},[171,754,755],{},"check-failed",[205,757,745],{},[205,759,760],{},"The submission's checks failed",[187,762,763,768,771],{},[205,764,765],{},[171,766,767],{},"too-many-requests",[205,769,770],{},"429",[205,772,773],{},"Too many requests",[187,775,776,781,783],{},[205,777,778],{},[171,779,780],{},"render-limit",[205,782,678],{},[205,784,785],{},"As many devices are rendering as the workspace allows",[187,787,788,793,795],{},[205,789,790],{},[171,791,792],{},"lease-ended",[205,794,704],{},[205,796,797],{},"The chunk the device took has ended",[187,799,800,805,807],{},[205,801,802],{},[171,803,804],{},"lease-taken",[205,806,704],{},[205,808,809],{},"The chunk the device took went to another device",[187,811,812,817,820],{},[205,813,814],{},[171,815,816],{},"internal",[205,818,819],{},"500",[205,821,822],{},"An error inside danio",[176,824,826],{"id":825},"retries-and-concurrency","Retries and concurrency",[828,829,830,850,861,871],"ul",{},[831,832,833,834,837,838,841,842,845,846,849],"li",{},"Submitting a task (",[171,835,836],{},"POST \u002Fapi\u002Fv1\u002Fjobs","), updating a task (",[171,839,840],{},"POST \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Fversions",") and comparing a draft (",[171,843,844],{},"POST \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Fversions\u002Fdraft",") can carry an ",[171,847,848],{},"Idempotency-Key",", a value you choose. Retrying with the same key within 24 hours returns the first result and doesn't register the task twice. Only successful results are remembered; a retry after a failure runs again.",[831,851,852,853,856,857,860],{},"The same three endpoints can carry ",[171,854,855],{},"X-Danio-Request",", an ID you choose. The ",[171,858,859],{},"submit.progress"," events carry it, so you can tell which ones are yours.",[831,862,863,864,867,868,870],{},"When updating a task, send ",[171,865,866],{},"baseVersion",". If a newer version exists, the answer is 409 with the error code ",[171,869,714],{},"; compare again against the newest version.",[831,872,873,874,877,878,881,882,884],{},"Reading a project returns an ",[171,875,876],{},"ETag",". When changing it (",[171,879,880],{},"PATCH \u002Fapi\u002Fv1\u002Fprojects\u002F{id}","), send it back in ",[171,883,734],{},". If someone changed it first, the answer is 412.",[176,886,888],{"id":887},"lists","Lists",[164,890,891,470,894,897,898,901,902,905,906,909,910,912,913,916,917,920,921,924],{},[171,892,893],{},"GET \u002Fapi\u002Fv1\u002Fjobs",[171,895,896],{},"GET \u002Fapi\u002Fv1\u002Fprojects"," are paged: ",[171,899,900],{},"limit"," says how many items a page has, and the ",[171,903,904],{},"next"," in the answer goes into the next request's ",[171,907,908],{},"cursor",". An empty ",[171,911,904],{}," means the last page. The task list can also be filtered with ",[171,914,915],{},"project"," (a project ID), ",[171,918,919],{},"name"," (a task name, unique only within a project) and ",[171,922,923],{},"blend"," (a Blend file ID).",[164,926,316,927,930],{},[171,928,929],{},"{id}"," in a path accepts only IDs. To look something up by name, use a query parameter.",[176,932,934],{"id":933},"event-stream","Event stream",[164,936,937,940,941,560],{},[171,938,939],{},"GET \u002Fapi\u002Fv1\u002Fevents"," is a long-lived Server-Sent Events connection. It needs ",[171,942,369],{},[251,944,948],{"className":945,"code":946,"language":947,"meta":256,"style":256},"language-bash shiki shiki-themes material-theme-palenight","curl -N -H \"Authorization: Bearer $TOKEN\" http:\u002F\u002F127.0.0.1:7421\u002Fapi\u002Fv1\u002Fevents\n","bash",[171,949,950],{"__ignoreMap":256},[260,951,952,956,960,963,967,970,974,977],{"class":262,"line":263},[260,953,955],{"class":954},"s5Dmg","curl",[260,957,959],{"class":958},"sfyAc"," -N",[260,961,962],{"class":958}," -H",[260,964,966],{"class":965},"sAklC"," \"",[260,968,969],{"class":958},"Authorization: Bearer ",[260,971,973],{"class":972},"s0W1g","$TOKEN",[260,975,976],{"class":965},"\"",[260,978,979],{"class":958}," http:\u002F\u002F127.0.0.1:7421\u002Fapi\u002Fv1\u002Fevents\n",[164,981,982,983,986,987,990,991,994,995,997,998,1001],{},"Each event has an ",[171,984,985],{},"id",", an ",[171,988,989],{},"event"," (its type) and ",[171,992,993],{},"data"," (JSON). The ",[171,996,985],{}," is a string; don't compare it as a number. The connection sends a ",[171,999,1000],{},": ping"," comment line every 15 seconds to keep itself alive.",[164,1003,1004,1005,1008,1009,1012],{},"When you reconnect, send the last ",[171,1006,1007],{},"Last-Event-ID"," you received and danio replays what you missed. It keeps the last 1024 events. When it can't replay (danio restarted, or you were away too long), it sends a ",[171,1010,1011],{},"reset"," event first; read the state again then.",[164,1014,1015],{},"The events listed in the OpenAPI description:",[181,1017,1018,1027],{},[184,1019,1020],{},[187,1021,1022,1025],{},[190,1023,1024],{},"Event",[190,1026,641],{},[200,1028,1029,1044,1054,1064,1074,1084,1094,1104,1114,1124],{},[187,1030,1031,1035],{},[205,1032,1033],{},[171,1034,859],{},[205,1036,1037,1038,1041,1042],{},"Progress of a submission. The ",[171,1039,1040],{},"request"," field is the ID you gave in ",[171,1043,855],{},[187,1045,1046,1051],{},[205,1047,1048],{},[171,1049,1050],{},"render.progress",[205,1052,1053],{},"Progress and state changes of rendering on this computer",[187,1055,1056,1061],{},[205,1057,1058],{},[171,1059,1060],{},"queue.changed",[205,1062,1063],{},"The queue changed: a task joined, or the order changed",[187,1065,1066,1071],{},[205,1067,1068],{},[171,1069,1070],{},"device.room",[205,1072,1073],{},"A device is low on disk space, full, or has recovered",[187,1075,1076,1081],{},[205,1077,1078],{},[171,1079,1080],{},"workspace.devices",[205,1082,1083],{},"The device list changed: a device joined or left, or its settings, name, access or block changed",[187,1085,1086,1091],{},[205,1087,1088],{},[171,1089,1090],{},"workspace.join-request",[205,1092,1093],{},"A device on the local network asked to join",[187,1095,1096,1101],{},[205,1097,1098],{},[171,1099,1100],{},"workspace.license",[205,1102,1103],{},"A license was imported or removed",[187,1105,1106,1111],{},[205,1107,1108],{},[171,1109,1110],{},"notice",[205,1112,1113],{},"A notice for this device's window program to show",[187,1115,1116,1121],{},[205,1117,1118],{},[171,1119,1120],{},"window.show",[205,1122,1123],{},"The danio window should open a page",[187,1125,1126,1130],{},[205,1127,1128],{},[171,1129,1011],{},[205,1131,1132],{},"The missed events can't be replayed; read the state again",[164,1134,1135],{},"The stream carries other events too. Ignore any event type you don't know.",[176,1137,1139],{"id":1138},"the-openapi-description","The OpenAPI description",[164,1141,1142],{},"The full description of the API is OpenAPI 3.1 JSON. You can get it in two ways:",[251,1144,1146],{"className":945,"code":1145,"language":947,"meta":256,"style":256},"# from the command line, in Chinese by default\ndanio openapi > openapi.json\n\n# in English\ndanio openapi --lang en > openapi.json\n\n# from a running danio, with any valid token\ncurl -H \"Authorization: Bearer $TOKEN\" \\\n  \"http:\u002F\u002F127.0.0.1:7421\u002Fapi\u002Fopenapi.json?lang=en\" -o openapi.json\n",[171,1147,1148,1154,1168,1174,1179,1195,1199,1205,1223],{"__ignoreMap":256},[260,1149,1150],{"class":262,"line":263},[260,1151,1153],{"class":1152},"saEQR","# from the command line, in Chinese by default\n",[260,1155,1156,1159,1162,1165],{"class":262,"line":575},[260,1157,1158],{"class":954},"danio",[260,1160,1161],{"class":958}," openapi",[260,1163,1164],{"class":965}," >",[260,1166,1167],{"class":958}," openapi.json\n",[260,1169,1170],{"class":262,"line":581},[260,1171,1173],{"emptyLinePlaceholder":1172},true,"\n",[260,1175,1176],{"class":262,"line":587},[260,1177,1178],{"class":1152},"# in English\n",[260,1180,1181,1183,1185,1188,1191,1193],{"class":262,"line":593},[260,1182,1158],{"class":954},[260,1184,1161],{"class":958},[260,1186,1187],{"class":958}," --lang",[260,1189,1190],{"class":958}," en",[260,1192,1164],{"class":965},[260,1194,1167],{"class":958},[260,1196,1197],{"class":262,"line":599},[260,1198,1173],{"emptyLinePlaceholder":1172},[260,1200,1202],{"class":262,"line":1201},7,[260,1203,1204],{"class":1152},"# from a running danio, with any valid token\n",[260,1206,1208,1210,1212,1214,1216,1218,1220],{"class":262,"line":1207},8,[260,1209,955],{"class":954},[260,1211,962],{"class":958},[260,1213,966],{"class":965},[260,1215,969],{"class":958},[260,1217,973],{"class":972},[260,1219,976],{"class":965},[260,1221,1222],{"class":972}," \\\n",[260,1224,1226,1229,1232,1234,1237],{"class":262,"line":1225},9,[260,1227,1228],{"class":965},"  \"",[260,1230,1231],{"class":958},"http:\u002F\u002F127.0.0.1:7421\u002Fapi\u002Fopenapi.json?lang=en",[260,1233,976],{"class":965},[260,1235,1236],{"class":958}," -o",[260,1238,1167],{"class":958},[164,1240,1241,1244,1245,1248,1249,1251,1252,1254],{},[171,1242,1243],{},"lang"," can be ",[171,1246,1247],{},"zh-CN"," or ",[171,1250,7],{},". When it is missing, danio picks by ",[171,1253,615],{},", by the same rule as error messages.",[164,1256,1257,1258,1261,1262,1265],{},"In the command-line output, ",[171,1259,1260],{},"info.version"," is ",[171,1263,1264],{},"dev","; a running danio gives its own version.",[164,1267,1268,1269,217,1271,1273,1274,1277],{},"Under ",[214,1270,216],{},[214,1272,220],{},", ",[214,1275,1276],{},"API reference"," opens the same description in the interface, where you can browse it.",[164,1279,1280,1281,470,1284,242],{},"Generic OpenAPI tools can generate a client from it, such as ",[171,1282,1283],{},"openapi-typescript",[171,1285,1286],{},"openapi-python-client",[176,1288,1290],{"id":1289},"common-endpoints","Common endpoints",[164,1292,1293],{},"The permissions in the tables are the ones needed when you call with a workspace token. The local token has no limit. For the full list and the parameters, see the OpenAPI description.",[1295,1296,1298],"h3",{"id":1297},"status-and-identity","Status and identity",[181,1300,1301,1313],{},[184,1302,1303],{},[187,1304,1305,1308,1310],{},[190,1306,1307],{},"Endpoint",[190,1309,357],{},[190,1311,1312],{},"What it does",[200,1314,1315,1329,1342],{},[187,1316,1317,1322,1326],{},[205,1318,1319],{},[171,1320,1321],{},"GET \u002Fapi\u002Fv1\u002Fhealth",[205,1323,1324],{},[171,1325,515],{},[205,1327,1328],{},"Whether the engine is running; returns the version and start time",[187,1330,1331,1335,1339],{},[205,1332,1333],{},[171,1334,548],{},[205,1336,1337],{},[171,1338,515],{},[205,1340,1341],{},"The identity and permissions of the current token",[187,1343,1344,1349,1353],{},[205,1345,1346],{},[171,1347,1348],{},"GET \u002Fapi\u002Fv1\u002Fworkspace",[205,1350,1351],{},[171,1352,369],{},[205,1354,1355],{},"The workspace this computer hosts: name, settings, addresses it listens on",[1295,1357,1359],{"id":1358},"projects-and-tasks","Projects and tasks",[181,1361,1362,1372],{},[184,1363,1364],{},[187,1365,1366,1368,1370],{},[190,1367,1307],{},[190,1369,357],{},[190,1371,1312],{},[200,1373,1374,1387,1401,1417,1432,1445,1458,1472,1486,1500,1514,1528,1541,1554,1572,1586],{},[187,1375,1376,1380,1384],{},[205,1377,1378],{},[171,1379,896],{},[205,1381,1382],{},[171,1383,369],{},[205,1385,1386],{},"List projects",[187,1388,1389,1394,1398],{},[205,1390,1391],{},[171,1392,1393],{},"POST \u002Fapi\u002Fv1\u002Fprojects",[205,1395,1396],{},[171,1397,409],{},[205,1399,1400],{},"Create a project",[187,1402,1403,1408,1412],{},[205,1404,1405],{},[171,1406,1407],{},"GET \u002Fapi\u002Fv1\u002Fprojects\u002F{id}",[205,1409,1410],{},[171,1411,369],{},[205,1413,1414,1415],{},"One project; returns an ",[171,1416,876],{},[187,1418,1419,1423,1427],{},[205,1420,1421],{},[171,1422,880],{},[205,1424,1425],{},[171,1426,409],{},[205,1428,1429,1430],{},"Change a project's settings, with ",[171,1431,734],{},[187,1433,1434,1438,1442],{},[205,1435,1436],{},[171,1437,893],{},[205,1439,1440],{},[171,1441,369],{},[205,1443,1444],{},"List tasks, newest first",[187,1446,1447,1451,1455],{},[205,1448,1449],{},[171,1450,836],{},[205,1452,1453],{},[171,1454,389],{},[205,1456,1457],{},"Submit a task, one task per scene",[187,1459,1460,1465,1469],{},[205,1461,1462],{},[171,1463,1464],{},"GET \u002Fapi\u002Fv1\u002Fjobs\u002F{id}",[205,1466,1467],{},[171,1468,369],{},[205,1470,1471],{},"Task details",[187,1473,1474,1479,1483],{},[205,1475,1476],{},[171,1477,1478],{},"DELETE \u002Fapi\u002Fv1\u002Fjobs\u002F{id}",[205,1480,1481],{},[171,1482,389],{},[205,1484,1485],{},"Delete a task",[187,1487,1488,1493,1497],{},[205,1489,1490],{},[171,1491,1492],{},"POST \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Fpause",[205,1494,1495],{},[171,1496,389],{},[205,1498,1499],{},"Pause; rendered frames are kept",[187,1501,1502,1507,1511],{},[205,1503,1504],{},[171,1505,1506],{},"POST \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Fresume",[205,1508,1509],{},[171,1510,389],{},[205,1512,1513],{},"Resume",[187,1515,1516,1521,1525],{},[205,1517,1518],{},[171,1519,1520],{},"POST \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Fcancel",[205,1522,1523],{},[171,1524,389],{},[205,1526,1527],{},"Cancel",[187,1529,1530,1534,1538],{},[205,1531,1532],{},[171,1533,844],{},[205,1535,1536],{},[171,1537,389],{},[205,1539,1540],{},"Compare against the newest version and make an update draft",[187,1542,1543,1547,1551],{},[205,1544,1545],{},[171,1546,840],{},[205,1548,1549],{},[171,1550,389],{},[205,1552,1553],{},"Update the task, making a new version",[187,1555,1556,1561,1565],{},[205,1557,1558],{},[171,1559,1560],{},"GET \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Fpreview",[205,1562,1563],{},[171,1564,369],{},[205,1566,1567,1568,1571],{},"The preview of one frame, a JPEG; without ",[171,1569,1570],{},"frame",", the newest frame",[187,1573,1574,1579,1583],{},[205,1575,1576],{},[171,1577,1578],{},"GET \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Ffilms",[205,1580,1581],{},[171,1582,369],{},[205,1584,1585],{},"The films of each version",[187,1587,1588,1593,1597],{},[205,1589,1590],{},[171,1591,1592],{},"GET \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Ffilm",[205,1594,1595],{},[171,1596,379],{},[205,1598,1599,1600,1603],{},"Download a film; without ",[171,1601,1602],{},"version",", the current version; 404 when it isn't made yet",[1295,1605,1607],{"id":1606},"devices-and-tokens","Devices and tokens",[181,1609,1610,1620],{},[184,1611,1612],{},[187,1613,1614,1616,1618],{},[190,1615,1307],{},[190,1617,357],{},[190,1619,1312],{},[200,1621,1622,1636,1650,1664,1678,1692,1706],{},[187,1623,1624,1629,1633],{},[205,1625,1626],{},[171,1627,1628],{},"GET \u002Fapi\u002Fv1\u002Fdevices",[205,1630,1631],{},[171,1632,369],{},[205,1634,1635],{},"List devices",[187,1637,1638,1643,1647],{},[205,1639,1640],{},[171,1641,1642],{},"PATCH \u002Fapi\u002Fv1\u002Fdevices\u002F{id}",[205,1644,1645],{},[171,1646,419],{},[205,1648,1649],{},"Change the name or access, block or unblock",[187,1651,1652,1657,1661],{},[205,1653,1654],{},[171,1655,1656],{},"DELETE \u002Fapi\u002Fv1\u002Fdevices\u002F{id}",[205,1658,1659],{},[171,1660,419],{},[205,1662,1663],{},"Remove a device",[187,1665,1666,1671,1675],{},[205,1667,1668],{},[171,1669,1670],{},"GET \u002Fapi\u002Fv1\u002Ftokens",[205,1672,1673],{},[171,1674,419],{},[205,1676,1677],{},"List tokens",[187,1679,1680,1685,1689],{},[205,1681,1682],{},[171,1683,1684],{},"POST \u002Fapi\u002Fv1\u002Ftokens",[205,1686,1687],{},[171,1688,419],{},[205,1690,1691],{},"Make a token; the full token is returned only this once",[187,1693,1694,1699,1703],{},[205,1695,1696],{},[171,1697,1698],{},"POST \u002Fapi\u002Fv1\u002Ftokens\u002F{id}\u002Frotate",[205,1700,1701],{},[171,1702,419],{},[205,1704,1705],{},"Rotate an integration token",[187,1707,1708,1713,1717],{},[205,1709,1710],{},[171,1711,1712],{},"DELETE \u002Fapi\u002Fv1\u002Ftokens\u002F{id}",[205,1714,1715],{},[171,1716,419],{},[205,1718,1719],{},"Revoke a token",[1295,1721,130],{"id":1722},"plugins",[181,1724,1725,1735],{},[184,1726,1727],{},[187,1728,1729,1731,1733],{},[190,1730,1307],{},[190,1732,357],{},[190,1734,1312],{},[200,1736,1737,1751,1765,1779,1793,1807,1821],{},[187,1738,1739,1744,1748],{},[205,1740,1741],{},[171,1742,1743],{},"GET \u002Fapi\u002Fv1\u002Fplugins",[205,1745,1746],{},[171,1747,439],{},[205,1749,1750],{},"List plugins",[187,1752,1753,1758,1762],{},[205,1754,1755],{},[171,1756,1757],{},"POST \u002Fapi\u002Fv1\u002Fplugins",[205,1759,1760],{},[171,1761,439],{},[205,1763,1764],{},"Install a plugin; it is disabled after installing",[187,1766,1767,1772,1776],{},[205,1768,1769],{},[171,1770,1771],{},"POST \u002Fapi\u002Fv1\u002Fplugins\u002F{id}\u002Fenable",[205,1773,1774],{},[171,1775,439],{},[205,1777,1778],{},"Enable, sending the permissions it declares",[187,1780,1781,1786,1790],{},[205,1782,1783],{},[171,1784,1785],{},"POST \u002Fapi\u002Fv1\u002Fplugins\u002F{id}\u002Fdisable",[205,1787,1788],{},[171,1789,439],{},[205,1791,1792],{},"Disable",[187,1794,1795,1800,1804],{},[205,1796,1797],{},[171,1798,1799],{},"PUT \u002Fapi\u002Fv1\u002Fplugins\u002F{id}\u002Fsettings",[205,1801,1802],{},[171,1803,439],{},[205,1805,1806],{},"Change settings",[187,1808,1809,1814,1818],{},[205,1810,1811],{},[171,1812,1813],{},"GET \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Fhandovers",[205,1815,1816],{},[171,1817,369],{},[205,1819,1820],{},"How the film was handed to plugins",[187,1822,1823,1828,1832],{},[205,1824,1825],{},[171,1826,1827],{},"POST \u002Fapi\u002Fv1\u002Fjobs\u002F{id}\u002Fhandovers\u002F{plugin}\u002Fretry",[205,1829,1830],{},[171,1831,389],{},[205,1833,1834],{},"Hand it to a plugin again",[176,1836,1838],{"id":1837},"example","Example",[164,1840,1841],{},"List tasks, then pause one:",[251,1843,1845],{"className":945,"code":1844,"language":947,"meta":256,"style":256},"curl -H \"Authorization: Bearer $TOKEN\" \"http:\u002F\u002F192.168.1.20:7420\u002Fapi\u002Fv1\u002Fjobs?limit=20\"\n\ncurl -X POST -H \"Authorization: Bearer $TOKEN\" \\\n  http:\u002F\u002F192.168.1.20:7420\u002Fapi\u002Fv1\u002Fjobs\u002F\u003Ctask ID>\u002Fpause\n",[171,1846,1847,1869,1873,1895],{"__ignoreMap":256},[260,1848,1849,1851,1853,1855,1857,1859,1861,1863,1866],{"class":262,"line":263},[260,1850,955],{"class":954},[260,1852,962],{"class":958},[260,1854,966],{"class":965},[260,1856,969],{"class":958},[260,1858,973],{"class":972},[260,1860,976],{"class":965},[260,1862,966],{"class":965},[260,1864,1865],{"class":958},"http:\u002F\u002F192.168.1.20:7420\u002Fapi\u002Fv1\u002Fjobs?limit=20",[260,1867,1868],{"class":965},"\"\n",[260,1870,1871],{"class":262,"line":575},[260,1872,1173],{"emptyLinePlaceholder":1172},[260,1874,1875,1877,1880,1883,1885,1887,1889,1891,1893],{"class":262,"line":581},[260,1876,955],{"class":954},[260,1878,1879],{"class":958}," -X",[260,1881,1882],{"class":958}," POST",[260,1884,962],{"class":958},[260,1886,966],{"class":965},[260,1888,969],{"class":958},[260,1890,973],{"class":972},[260,1892,976],{"class":965},[260,1894,1222],{"class":972},[260,1896,1897,1900,1903,1906,1909,1912,1915],{"class":262,"line":587},[260,1898,1899],{"class":958},"  http:\u002F\u002F192.168.1.20:7420\u002Fapi\u002Fv1\u002Fjobs\u002F",[260,1901,1902],{"class":965},"\u003C",[260,1904,1905],{"class":958},"task",[260,1907,1908],{"class":958}," I",[260,1910,1911],{"class":972},"D",[260,1913,1914],{"class":965},">",[260,1916,1917],{"class":958},"\u002Fpause\n",[164,1919,1920,1921,1924],{},"Replace ",[171,1922,1923],{},"192.168.1.20:7420"," with your host's workspace address.",[1926,1927,1928],"style",{},"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 pre.shiki code .s5Dmg, html code.shiki .s5Dmg{--shiki-default:#FFCB6B}html pre.shiki code .sfyAc, html code.shiki .sfyAc{--shiki-default:#C3E88D}html pre.shiki code .sAklC, html code.shiki .sAklC{--shiki-default:#89DDFF}html pre.shiki code .s0W1g, html code.shiki .s0W1g{--shiki-default:#BABED8}html pre.shiki code .saEQR, html code.shiki .saEQR{--shiki-default:#676E95;--shiki-default-font-style:italic}",{"title":256,"searchDepth":575,"depth":581,"links":1930},[1931,1932,1933,1934,1935,1936,1937,1938,1944],{"id":178,"depth":575,"text":179},{"id":245,"depth":575,"text":246},{"id":552,"depth":575,"text":553},{"id":825,"depth":575,"text":826},{"id":887,"depth":575,"text":888},{"id":933,"depth":575,"text":934},{"id":1138,"depth":575,"text":1139},{"id":1289,"depth":575,"text":1290,"children":1939},[1940,1941,1942,1943],{"id":1297,"depth":581,"text":1298},{"id":1358,"depth":581,"text":1359},{"id":1606,"depth":581,"text":1607},{"id":1722,"depth":581,"text":130},{"id":1837,"depth":575,"text":1838},"[object Object]","md",{},{"title":151,"description":1949},{"danio's HTTP API":1950,"navigation":1951},"addresses, tokens and permissions, the error format, the event stream, the OpenAPI description, and the common endpoints.",{"icon":1952},"i-lucide-code-xml","7tBXnVVKNj-XqFt7p-lvgtarEFocm4r8fpVzkT83Vzk",[1955,1957],{"title":146,"path":147,"stem":148,"description":1956,"icon":149,"children":-1},"What every setting in danio.toml means, its allowed values and defaults, and the environment variables danio reads.",{"title":155,"path":156,"stem":157,"description":1945,"children":-1},1794627696229]