{"openapi":"3.1.0","info":{"title":"RunRobot Cloud API","version":"v1","summary":"Publish robot assets, build public browser runs, and automate hosted RunRobot Cloud workflows.","description":"Researchers package policies locally with the open-source runrobot contract (`policy.yaml`, `robot.yaml`, `scene.yaml`, and a validator). This HTTP API is the hosted RunRobot Cloud layer for developers: mint tokens, publish scenes, robots, and policies, create deployments, upload datasets, queue training jobs, read rollout records, start SceneGen jobs, and work with hosted evaluation surfaces. Public browser runs are plain URLs on runrobot.sh, not a separate launch API."},"externalDocs":{"description":"RunRobot deployments guide","url":"https://runrobot.sh/docs/topics/deployments"},"servers":[{"url":"https://runrobot.sh","description":"Production"},{"url":"http://127.0.0.1:3000","description":"Local development"}],"tags":[{"name":"Publishing","description":"Publish scenes, robots, and policy artifacts, then open the returned public URLs directly in a browser."},{"name":"API Tokens","description":"Create, list, and revoke developer tokens for hosted RunRobot Cloud automation."},{"name":"Deployments","description":"Create and inspect dedicated policy deployments with runtime and scaling controls."},{"name":"Rollouts","description":"Read rollout records and rollout logs for packaged policies and deployments."},{"name":"Datasets","description":"Upload MP4 videos and inspect stored dataset records for training or evaluation."},{"name":"Training","description":"Queue training jobs against uploaded datasets and proxy Video2Robot workflows when configured."},{"name":"SceneGen","description":"Create and poll image-to-scene generation jobs."},{"name":"Arena","description":"Hosted pairwise evaluation built on top of published browser runs."},{"name":"Leaderboard","description":"Read aggregate evaluation results from the public leaderboard."}],"components":{"securitySchemes":{"BearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"RunRobot API Token"}},"schemas":{"Error":{"type":"object","properties":{"error":{"type":"string","description":"Human-readable error message.","example":"Authentication required."}},"required":["error"]},"RuntimeAdapter":{"type":"string","enum":["onnx_metadata_v1","unitree_velocity_g1_v0"]},"PublishStatus":{"type":"string","enum":["draft","processing","active","failed"]},"SceneMode":{"type":"string","enum":["benchmark_scene","visual_overlay"]},"SceneJobStatus":{"type":"string","enum":["queued","running","ready","failed"]},"SceneJobPhase":{"type":"string","enum":["queued","segmenting","generating_scene","publishing","ready","failed"]},"SceneTransform":{"type":"object","properties":{"position":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3},"quaternion":{"type":"array","items":{"type":"number"},"minItems":4,"maxItems":4},"scale":{"type":"array","items":{"type":"number"},"minItems":3,"maxItems":3}},"required":["position","quaternion","scale"]},"SceneBox":{"type":"object","properties":{"x":{"type":"number","minimum":0,"maximum":1},"y":{"type":"number","minimum":0,"maximum":1},"width":{"type":"number","minimum":0,"maximum":1},"height":{"type":"number","minimum":0,"maximum":1}},"required":["x","y","width","height"]},"PolicyManifest":{"type":"object","properties":{"kind":{"type":"string","enum":["policy"]},"owner":{"type":"string","example":"amazon"},"slugPath":{"type":"string","example":"php-parkour"},"title":{"type":"string","example":"Amazon PHP Parkour"},"description":{"type":"string"},"runtimeAdapter":{"$ref":"#/components/schemas/RuntimeAdapter"},"modelUrl":{"type":"string","format":"uri-reference"},"depthModelUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"controlDt":{"type":"number","example":0.02},"metadataConfig":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"unitreeVelocityConfig":{"anyOf":[{"type":"object","additionalProperties":true},{"type":"null"}]},"defaultRobotRef":{"anyOf":[{"type":"string"},{"type":"null"}]},"defaultSceneRef":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"$ref":"#/components/schemas/PublishStatus"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["kind","owner","slugPath","title","description","runtimeAdapter","modelUrl","depthModelUrl","controlDt","metadataConfig","unitreeVelocityConfig","defaultRobotRef","defaultSceneRef","status","createdAt","updatedAt"]},"RobotManifest":{"type":"object","properties":{"kind":{"type":"string","enum":["robot"]},"owner":{"type":"string","example":"unitree"},"slugPath":{"type":"string","example":"G1"},"title":{"type":"string","example":"Unitree G1"},"description":{"type":"string"},"robotKey":{"type":"string","example":"unitree/g1"},"baseSceneUrl":{"type":"string","format":"uri-reference"},"entryXmlPath":{"type":"string","example":"g1_with_terrain.xml"},"previewUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"status":{"$ref":"#/components/schemas/PublishStatus"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["kind","owner","slugPath","title","description","robotKey","baseSceneUrl","entryXmlPath","previewUrl","status","createdAt","updatedAt"]},"SceneManifest":{"type":"object","properties":{"kind":{"type":"string","enum":["scene"]},"owner":{"type":"string","example":"chasebrignac"},"slugPath":{"type":"string","example":"parkour"},"title":{"type":"string","example":"Classic Parkour"},"description":{"type":"string"},"mode":{"$ref":"#/components/schemas/SceneMode"},"benchmarkSceneRef":{"type":"string","example":"chasebrignac/parkour"},"glbUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"previewUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"transform":{"$ref":"#/components/schemas/SceneTransform"},"status":{"$ref":"#/components/schemas/PublishStatus"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["kind","owner","slugPath","title","description","mode","benchmarkSceneRef","glbUrl","previewUrl","transform","status","createdAt","updatedAt"]},"SceneEnvelope":{"type":"object","properties":{"manifest":{"$ref":"#/components/schemas/SceneManifest"}},"required":["manifest"]},"RobotEnvelope":{"type":"object","properties":{"manifest":{"$ref":"#/components/schemas/RobotManifest"}},"required":["manifest"]},"PolicyEnvelope":{"type":"object","properties":{"manifest":{"$ref":"#/components/schemas/PolicyManifest"}},"required":["manifest"]},"ApiToken":{"type":"object","properties":{"id":{"type":"string","example":"token_123"},"owner":{"type":"string","example":"chasebrignac"},"name":{"type":"string","example":"MacBook Pro"},"prefix":{"type":"string","example":"rr_abc123def"},"createdAt":{"type":"string","format":"date-time"},"lastUsedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"revokedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"required":["id","owner","name","prefix","createdAt","lastUsedAt","revokedAt"]},"CreatedApiToken":{"allOf":[{"$ref":"#/components/schemas/ApiToken"},{"type":"object","properties":{"token":{"type":"string","example":"rr_live_secret_value"}},"required":["token"]}]},"RevokeAllApiTokensResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"revokedCount":{"type":"integer","minimum":0}},"required":["ok","revokedCount"]},"RevokeApiTokenResponse":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]}},"required":["ok"]},"PublicSceneJob":{"type":"object","properties":{"id":{"type":"string","example":"scenejob_123"},"owner":{"type":"string","example":"chasebrignac"},"slugPath":{"type":"string","example":"my-generated-scene"},"title":{"type":"string"},"description":{"type":"string"},"benchmarkSceneRef":{"type":"string"},"sourceImageUrl":{"type":"string","format":"uri-reference"},"previewUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"sceneUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"sceneHref":{"type":"string","example":"/chasebrignac/my-generated-scene"},"status":{"$ref":"#/components/schemas/SceneJobStatus"},"phase":{"$ref":"#/components/schemas/SceneJobPhase"},"transform":{"$ref":"#/components/schemas/SceneTransform"},"boxes":{"type":"array","items":{"$ref":"#/components/schemas/SceneBox"}},"error":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","owner","slugPath","title","description","benchmarkSceneRef","sourceImageUrl","previewUrl","sceneUrl","sceneHref","status","phase","transform","boxes","error","createdAt","updatedAt"]},"SceneJobEnvelope":{"type":"object","properties":{"job":{"$ref":"#/components/schemas/PublicSceneJob"}},"required":["job"]},"DeploymentStatus":{"type":"string","enum":["starting","idle","processing","failed"]},"DeploymentRuntimeKind":{"type":"string","enum":["browser.mujoco.onnx","instance.mujoco.onnx","instance.mujoco.sonic","instance.vlm.gemma","instance.vlm.wilddet3d","instance.worldmodel.cosmos","instance.worldrecon.hyworld","instance.worldplay.hyworld","instance.vla.pi0","native.robot.lowcmd"]},"Deployment":{"type":"object","properties":{"id":{"type":"string","example":"deploy_123"},"owner":{"type":"string","example":"chasebrignac"},"title":{"type":"string","example":"My G1 browser deployment"},"policyRef":{"type":"string","example":"amazon/php-parkour"},"runtimeKind":{"$ref":"#/components/schemas/DeploymentRuntimeKind"},"minInstances":{"type":"integer","minimum":0},"maxInstances":{"type":"integer","minimum":1},"scaleToZero":{"type":"boolean"},"alwaysOn":{"type":"boolean"},"hardwareSku":{"anyOf":[{"type":"string"},{"type":"null"}],"example":"gpu-h100"},"idleScaleDownSeconds":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"example":1800},"currentInstances":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"example":0},"lastActiveAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"endpointPath":{"type":"string","example":"/deployments/chasebrignac/my-g1-browser-deployment"},"status":{"$ref":"#/components/schemas/DeploymentStatus"},"lastError":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","owner","title","policyRef","runtimeKind","minInstances","maxInstances","scaleToZero","alwaysOn","endpointPath","status","lastError","createdAt","updatedAt"]},"DeploymentEnvelope":{"type":"object","properties":{"deployment":{"$ref":"#/components/schemas/Deployment"}},"required":["deployment"]},"DatasetRecordKind":{"type":"string","enum":["egocentric_video","human_wbc","human_preference"]},"DatasetRecord":{"type":"object","properties":{"id":{"type":"string","example":"dataset_123"},"owner":{"type":"string","example":"chasebrignac"},"title":{"type":"string","example":"Apartment tabletop demos"},"description":{"type":"string"},"kind":{"$ref":"#/components/schemas/DatasetRecordKind"},"fileName":{"type":"string","example":"clip-1.mp4"},"fileKey":{"type":"string","example":"chasebrignac/dataset/apartment-tabletop-demos-dataset_123/clip-1.mp4"},"mimeType":{"type":"string","example":"video/mp4"},"fileUrl":{"type":"string","format":"uri-reference"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}},"required":["id","owner","title","description","kind","fileName","fileKey","mimeType","fileUrl","createdAt","updatedAt"]},"DatasetRecordListEnvelope":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DatasetRecord"}}},"required":["items"]},"TrainingMode":{"type":"string","enum":["egocentric_manipulation","video2robot"]},"TrainingStatus":{"type":"string","enum":["configured","queued","running","completed","failed"]},"TrainingProvider":{"type":"string","enum":["local","video2robot"]},"TrainingTask":{"type":"object","properties":{"taskId":{"anyOf":[{"type":"string"},{"type":"null"}]},"status":{"type":"string","enum":["not_started","pending","running","completed","failed"]},"progress":{"type":"number","minimum":0,"maximum":1},"message":{"type":"string"},"error":{"anyOf":[{"type":"string"},{"type":"null"}]},"startedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"completedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"required":["taskId","status","progress","message","error","startedAt","completedAt"]},"TrainingDatasetRun":{"type":"object","properties":{"datasetId":{"type":"string","example":"data_123"},"datasetTitle":{"type":"string","example":"Apartment tabletop demos"},"datasetKind":{"$ref":"#/components/schemas/DatasetRecordKind"},"fileName":{"type":"string","example":"demo-clip.mp4"},"projectName":{"type":"string","example":"chasebrignac-train_123-data_123"},"uploadStatus":{"type":"string","enum":["pending","uploaded","failed"]},"uploadError":{"anyOf":[{"type":"string"},{"type":"null"}]},"extract":{"$ref":"#/components/schemas/TrainingTask"},"retarget":{"$ref":"#/components/schemas/TrainingTask"},"motionUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"updatedAt":{"type":"string","format":"date-time"}},"required":["datasetId","datasetTitle","datasetKind","fileName","projectName","uploadStatus","uploadError","extract","retarget","motionUrl","updatedAt"]},"TrainingJob":{"type":"object","properties":{"id":{"type":"string","example":"train_123"},"owner":{"type":"string","example":"chasebrignac"},"title":{"type":"string","example":"Apartment pick-and-place finetune"},"mode":{"$ref":"#/components/schemas/TrainingMode"},"datasetIds":{"type":"array","items":{"type":"string"}},"basePolicyRef":{"anyOf":[{"type":"string"},{"type":"null"}]},"provider":{"$ref":"#/components/schemas/TrainingProvider"},"status":{"$ref":"#/components/schemas/TrainingStatus"},"notes":{"type":"string"},"lastError":{"anyOf":[{"type":"string"},{"type":"null"}]},"remoteBaseUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"runs":{"type":"array","items":{"$ref":"#/components/schemas/TrainingDatasetRun"}},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"completedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"required":["id","owner","title","mode","datasetIds","basePolicyRef","provider","status","notes","lastError","remoteBaseUrl","runs","createdAt","updatedAt","completedAt"]},"TrainingJobEnvelope":{"type":"object","properties":{"job":{"$ref":"#/components/schemas/TrainingJob"}},"required":["job"]},"TrainingJobListEnvelope":{"type":"object","properties":{"jobs":{"type":"array","items":{"$ref":"#/components/schemas/TrainingJob"}}},"required":["jobs"]},"Rollout":{"type":"object","properties":{"id":{"type":"string","example":"rollout-default-amazon-php-parkour"},"title":{"type":"string","example":"Amazon PHP Parkour default browser run"},"policyRef":{"type":"string","example":"amazon/php-parkour"},"route":{"type":"string","example":"/amazon/php-parkour/unitree/G1/chasebrignac/parkour"},"runtimeKind":{"$ref":"#/components/schemas/DeploymentRuntimeKind"},"source":{"type":"string","enum":["default-run","deployment"]},"status":{"type":"string","enum":["ready","idle","failed"]},"deploymentId":{"anyOf":[{"type":"string"},{"type":"null"}]},"deploymentEndpointPath":{"anyOf":[{"type":"string"},{"type":"null"}]},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"errorLog":{"anyOf":[{"type":"string"},{"type":"null"}]},"eventLog":{"type":"array","items":{"type":"string"}}},"required":["id","title","policyRef","route","runtimeKind","source","status","deploymentId","deploymentEndpointPath","createdAt","updatedAt","errorLog","eventLog"]},"RolloutListEnvelope":{"type":"object","properties":{"rollouts":{"type":"array","items":{"$ref":"#/components/schemas/Rollout"}}},"required":["rollouts"]},"ArenaParticipant":{"type":"object","properties":{"title":{"type":"string"},"policyRef":{"type":"string","example":"amazon/php-parkour"},"simulationId":{"type":"string","example":"sim_123"},"browserUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]}},"required":["title","policyRef","simulationId","browserUrl"]},"ArenaMatchup":{"type":"object","properties":{"id":{"type":"string","example":"matchup_123"},"status":{"type":"string","enum":["queued","starting","ready","failed"]},"voteUnlockAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"left":{"$ref":"#/components/schemas/ArenaParticipant"},"right":{"$ref":"#/components/schemas/ArenaParticipant"}},"required":["id","status","voteUnlockAt","left","right"]},"ArenaMatchupEnvelope":{"type":"object","properties":{"matchup":{"$ref":"#/components/schemas/ArenaMatchup"}},"required":["matchup"]},"ArenaControlRequest":{"type":"object","properties":{"matchupId":{"type":"string","example":"matchup_123"},"side":{"type":"string","enum":["left","right"]},"action":{"type":"string","enum":["forward-press","forward-release","backward-press","backward-release","left-press","left-release","right-press","right-release","reset"]}},"required":["matchupId","side","action"]},"ArenaControlDispatch":{"type":"object","properties":{"side":{"type":"string","enum":["left","right"]},"transport":{"type":"string","enum":["browser-postmessage"]},"payload":{"type":"object","additionalProperties":true}},"required":["side","transport","payload"]},"ArenaControlEnvelope":{"type":"object","properties":{"ok":{"type":"boolean","enum":[true]},"dispatches":{"type":"array","items":{"$ref":"#/components/schemas/ArenaControlDispatch"}},"matchup":{"$ref":"#/components/schemas/ArenaMatchup"}},"required":["ok","dispatches","matchup"]},"ArenaVoteRequest":{"type":"object","properties":{"matchupId":{"type":"string","example":"matchup_123"},"winner":{"type":"string","enum":["left","right","both_good","both_bad"]}},"required":["matchupId","winner"]},"LeaderboardEntry":{"type":"object","properties":{"policy_ref":{"type":"string","example":"amazon/php-parkour"},"title":{"type":"string","example":"Amazon PHP Parkour"},"rating":{"type":"number","example":1500},"wins":{"type":"number","example":12},"losses":{"type":"number","example":4},"ties":{"type":"integer","example":1},"counted_votes":{"type":"integer","example":17},"confidence_low":{"anyOf":[{"type":"number"},{"type":"null"}]},"confidence_high":{"anyOf":[{"type":"number"},{"type":"null"}]}},"required":["policy_ref","title","rating","wins","losses","ties","counted_votes","confidence_low","confidence_high"]},"Leaderboard":{"type":"object","properties":{"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"winner":{"anyOf":[{"type":"string"},{"type":"null"}]},"entries":{"type":"array","items":{"$ref":"#/components/schemas/LeaderboardEntry"}}},"required":["updated_at","winner","entries"]}}},"paths":{"/api/api-tokens":{"get":{"operationId":"listApiTokens","tags":["API Tokens"],"summary":"List API tokens","description":"Returns the current user's active API tokens. Use these tokens for developer automation and asset publishing, not for opening public browser runs.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Active tokens","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ApiToken"}}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createApiToken","tags":["API Tokens"],"summary":"Create an API token","description":"Creates one API token for the authenticated user. Tokens are primarily for developer automation, CI, and asset publishing flows.","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","example":"MacBook Pro"}},"required":["name"]},"example":{"name":"MacBook Pro"}}}},"responses":{"201":{"description":"Token created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatedApiToken"}}}},"400":{"description":"Token name missing","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"revokeAllApiTokens","tags":["API Tokens"],"summary":"Revoke all API tokens","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"All tokens revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeAllApiTokensResponse"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/api-tokens/{tokenId}":{"delete":{"operationId":"revokeApiToken","tags":["API Tokens"],"summary":"Revoke one API token","security":[{"BearerAuth":[]}],"parameters":[{"name":"tokenId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Token revoked","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeApiTokenResponse"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Token not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/publish/scenes":{"post":{"operationId":"publishScene","tags":["Publishing"],"summary":"Publish a scene","description":"Uploads one scene GLB and returns its public manifest. Combine the returned scene with a policy and robot by URL composition or by policy defaults.","security":[{"BearerAuth":[]}],"externalDocs":{"description":"Scene publishing quickstart","url":"https://runrobot.sh/docs#developer-publish-scene"},"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"owner":{"type":"string","description":"Optional explicit owner. Must match the authenticated user when present."},"slugPath":{"type":"string","description":"Optional slug. Defaults to my-scene and auto-increments on collision."},"title":{"type":"string","description":"Optional title. Defaults to My Scene."},"description":{"type":"string","description":"Optional description. Client-specific defaults are applied when omitted."},"benchmarkSceneRef":{"type":"string","description":"Optional benchmark reference. Defaults to chasebrignac/parkour."},"transform":{"type":"string","description":"Optional JSON-encoded SceneTransform."},"glb":{"type":"string","description":"Scene GLB upload.","format":"binary"},"preview":{"type":"string","description":"Optional preview image.","format":"binary"}},"required":["glb"]}}}},"responses":{"201":{"description":"Scene published","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SceneEnvelope"}}}},"400":{"description":"Invalid scene upload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Owner mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/publish/robots":{"post":{"operationId":"publishRobot","tags":["Publishing"],"summary":"Publish a robot bundle","description":"Uploads a zipped MuJoCo robot bundle and returns its public manifest. Use the published robot in explicit browser run URLs or as a policy default.","security":[{"BearerAuth":[]}],"externalDocs":{"description":"Robot publishing quickstart","url":"https://runrobot.sh/docs#developer-publish-robot"},"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"owner":{"type":"string"},"slugPath":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"robotKey":{"type":"string","example":"unitree/g1"},"entryXmlPath":{"type":"string","description":"Optional explicit entry XML path."},"bundle":{"type":"string","description":"Zipped MuJoCo bundle.","format":"binary"}},"required":["slugPath","title","robotKey","bundle"]}}}},"responses":{"201":{"description":"Robot published","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RobotEnvelope"}}}},"400":{"description":"Invalid robot bundle","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Owner mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/publish/policies":{"post":{"operationId":"publishPolicy","tags":["Publishing"],"summary":"Publish a policy","description":"Uploads one hosted browser-native policy artifact and returns its public manifest. Open the published browser run directly by URL. For onnx_metadata_v1, config is optional if the ONNX metadata is complete. For unitree_velocity_g1_v0, config is required and should be the deploy YAML text.","security":[{"BearerAuth":[]}],"externalDocs":{"description":"Policy publishing quickstart","url":"https://runrobot.sh/docs#developer-publish-policy"},"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"owner":{"type":"string"},"slugPath":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"runtimeAdapter":{"$ref":"#/components/schemas/RuntimeAdapter"},"defaultRobotRef":{"type":"string"},"defaultSceneRef":{"type":"string"},"config":{"type":"string","description":"JSON text for onnx_metadata_v1 or YAML text for unitree_velocity_g1_v0."},"model":{"type":"string","description":"Policy ONNX file.","format":"binary"},"depthModel":{"type":"string","description":"Optional depth model ONNX file.","format":"binary"}},"required":["slugPath","title","runtimeAdapter","model"]}}}},"responses":{"201":{"description":"Policy published","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PolicyEnvelope"}}}},"400":{"description":"Invalid policy upload","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Owner mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/deployments":{"get":{"operationId":"listDeployments","tags":["Deployments"],"summary":"List deployments","description":"Returns the authenticated user's policy deployments.","security":[{"BearerAuth":[]}],"externalDocs":{"description":"Deployments guide","url":"https://runrobot.sh/docs/topics/deployments"},"responses":{"200":{"description":"Deployments","content":{"application/json":{"schema":{"type":"object","properties":{"deployments":{"type":"array","items":{"$ref":"#/components/schemas/Deployment"}}},"required":["deployments"]}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createDeployment","tags":["Deployments"],"summary":"Create a deployment","description":"Creates one dedicated policy deployment from an owned or public policy reference.","security":[{"BearerAuth":[]}],"externalDocs":{"description":"Deployments guide","url":"https://runrobot.sh/docs/topics/deployments"},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"policyRef":{"type":"string","example":"amazon/php-parkour"},"runtimeKind":{"$ref":"#/components/schemas/DeploymentRuntimeKind"},"minInstances":{"type":"integer","minimum":0},"maxInstances":{"type":"integer","minimum":1},"scaleToZero":{"type":"boolean"},"alwaysOn":{"type":"boolean"},"hardwareSku":{"anyOf":[{"type":"string"},{"type":"null"}]},"idleScaleDownSeconds":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}]}},"required":["title","policyRef","runtimeKind"]}}}},"responses":{"201":{"description":"Deployment created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeploymentEnvelope"}}}},"400":{"description":"Invalid deployment request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/rollout":{"get":{"operationId":"listRollouts","tags":["Rollouts"],"summary":"List rollouts","description":"Returns rollout records for the authenticated user's policy runs and deployments.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Rollouts","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RolloutListEnvelope"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/datasets/uploads":{"get":{"operationId":"listDatasetRecords","tags":["Datasets"],"summary":"List uploaded dataset records","description":"Returns uploaded MP4 dataset records for the authenticated user.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Uploaded dataset records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetRecordListEnvelope"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"uploadDatasetRecords","tags":["Datasets"],"summary":"Upload MP4 dataset records","description":"Uploads one or more MP4 files for egocentric video, human WBC, or preference datasets.","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"title":{"type":"string"},"description":{"type":"string"},"kind":{"$ref":"#/components/schemas/DatasetRecordKind"},"files":{"type":"array","items":{"type":"string","description":"MP4 video upload.","format":"binary"}}},"required":["title","kind","files"]}}}},"responses":{"201":{"description":"Dataset uploaded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DatasetRecordListEnvelope"}}}},"400":{"description":"Invalid upload request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/training/jobs":{"get":{"operationId":"listTrainingJobs","tags":["Training"],"summary":"List training jobs","description":"Returns training jobs configured by the authenticated user. When Video2Robot is configured, this read also refreshes remote extract and retarget task state.","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Training jobs","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingJobListEnvelope"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createTrainingJob","tags":["Training"],"summary":"Create a training job","description":"Creates one training job against uploaded datasets and an optional base policy reference. For Video2Robot mode, RunRobot Cloud launches project creation, MP4 upload, pose extraction, and retargeting through the configured external service.","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string"},"mode":{"$ref":"#/components/schemas/TrainingMode"},"datasetIds":{"type":"array","items":{"type":"string"}},"basePolicyRef":{"type":"string"},"notes":{"type":"string"}},"required":["title","mode","datasetIds"]}}}},"responses":{"201":{"description":"Training job created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrainingJobEnvelope"}}}},"400":{"description":"Invalid training request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid auth","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Video2Robot service unavailable","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/scenegen/jobs":{"post":{"operationId":"createSceneGenJob","tags":["SceneGen"],"summary":"Create a SceneGen job","description":"Uploads one image and normalized boxes, then starts asynchronous SceneGen processing.","security":[{"BearerAuth":[]}],"externalDocs":{"description":"SceneGen quickstart","url":"https://runrobot.sh/docs#developer-scenegen"},"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"owner":{"type":"string"},"slugPath":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"benchmarkSceneRef":{"type":"string"},"boxes":{"type":"string","description":"JSON-encoded array of normalized boxes."},"image":{"type":"string","description":"Input photo.","format":"binary"}},"required":["slugPath","title","boxes","image"]}}}},"responses":{"201":{"description":"SceneGen job created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SceneJobEnvelope"}}}},"400":{"description":"Invalid SceneGen request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"Missing or invalid token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"Owner mismatch","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/scenegen/jobs/{jobId}":{"get":{"operationId":"getSceneGenJob","tags":["SceneGen"],"summary":"Read a SceneGen job","description":"Poll this endpoint until status becomes ready or failed.","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"SceneGen job","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SceneJobEnvelope"}}}},"404":{"description":"Job not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/arena/launch":{"post":{"operationId":"createArenaMatchup","tags":["Arena"],"summary":"Launch an arena matchup","description":"Creates one hosted browser-native matchup from the current active policy pool. Use this after your policies are already runnable as public browser pages.","externalDocs":{"description":"Arena launch docs","url":"https://runrobot.sh/docs#evaluation-arena"},"responses":{"201":{"description":"Arena matchup created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArenaMatchupEnvelope"}}}},"400":{"description":"Unable to create matchup","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/arena/matchup/{matchupId}":{"get":{"operationId":"getArenaMatchup","tags":["Arena"],"summary":"Read an arena matchup","parameters":[{"name":"matchupId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Arena matchup","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArenaMatchupEnvelope"}}}},"404":{"description":"Matchup not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/arena/control":{"post":{"operationId":"controlArenaMatchup","tags":["Arena"],"summary":"Dispatch a control event","description":"Sends one semantic control event into one matchup pane.","requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArenaControlRequest"},"example":{"matchupId":"matchup_123","side":"left","action":"forward-press"}}}},"responses":{"200":{"description":"Control accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArenaControlEnvelope"}}}},"400":{"description":"Invalid control request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Matchup not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/arena/vote":{"post":{"operationId":"voteArenaMatchup","tags":["Arena"],"summary":"Record an arena vote","description":"Records one vote for left, right, both_good, or both_bad. Auth is optional; when absent, duplicate suppression falls back to IP and user-agent.","externalDocs":{"description":"Arena voting docs","url":"https://runrobot.sh/docs#evaluation-leaderboard"},"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArenaVoteRequest"}}}},"responses":{"200":{"description":"Vote accepted","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ArenaMatchupEnvelope"}}}},"400":{"description":"Invalid vote request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/v1/leaderboard":{"get":{"operationId":"getLeaderboard","tags":["Leaderboard"],"summary":"Read the public leaderboard","description":"Returns aggregate arena standings only. This endpoint is public and does not expose private vote history.","externalDocs":{"description":"Leaderboard docs","url":"https://runrobot.sh/docs#evaluation-read-leaderboard"},"responses":{"200":{"description":"Leaderboard","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Leaderboard"}}}}}}}}}