Documentation

RunRobot lets you run robot policies without having to understand machine learning or manage your own infrastructure.

Researchers

Package once, publish everywhere

Package a policy once, validate it, run it locally, then publish to runrobot to get on the leaderboard.

  • Create policy.yaml, robot.yaml, scene.yaml, and a validator.
  • Use the same packaged policy for browser runs, simulation, and hardware deploys.
Developers

Use a policy in minutes

Open policies in the browser, publish assets, and automate hosted workflows in minutes.

  • Using your robot policy is as easy as sending a browser URL.
  • Upload your own scenes, robot bundles, policy artifacts, and datasets to share or train.
Researchers

Package a policy first

The package-first workflow lives in open-source runrobot. Start here if you want the same policy package to run locally, in the browser, in headless validation, and on a robot before it reaches hosted evaluation.

my-policy/
  policy.yaml
  robot.yaml
  scene.yaml
  validator.py
  1. Export your policy into the runrobot package contract.
  2. Validate the package locally before it reaches shared evaluation surfaces.
  3. Run the same package in the browser, in simulation, and on the robot.
  4. Publish the exact package to RunRobot Cloud or an on-prem deployment of RunRobot Cloud.
  5. Collect human preference data on the hosted package and land on the leaderboard.
Topic guide

Deployments

Start from the runrobot repo, package a policy with manifests, validate it locally, then deploy to RunRobot.

Open guide
Topic guide

Scenes

Upload a GLB scene, publish it, and combine it with a policy and robot through canonical browser URLs.

Open guide
Topic guide

Robots

Publish a MuJoCo robot bundle with an entry XML so it can be referenced by public runs and deployments.

Open guide

Public URL patterns

Public browser runs are URL-based. Single-asset pages fill in missing defaults. Explicit run URLs pin the policy, robot, and scene.

https://runrobot.sh/<owner>
https://runrobot.sh/<owner>/<asset>
https://runrobot.sh/<owner>/<policy>/<robot>/<scene>
Developers

Developer quickstarts

Start by opening an existing policy browser run, then publish scenes, robots, and policies. Arena and leaderboard are advanced evaluation features for large labs.

Open a published policy in the browser

You do not need an API call to run a published policy. Build the canonical URL, open it in a browser, and the simulator page does the rest.

import Runrobot from "runrobot";

const client = new Runrobot({ auth: process.env.RUNROBOT_API_TOKEN ?? "YOUR_RUNROBOT_API_TOKEN" });
const url = client.buildRunUrl({
  owner: "amazon",
  policySlug: "php-parkour",
  robotRef: "unitree/G1",
  sceneRef: "chasebrignac/parkour",
});

console.log(url);

Use buildRunUrl() when you want a browser run URL. buildUrl() still works for generic manifest or asset URLs.

Publish a scene GLB

Upload a GLB, get a public scene manifest back, then combine it with a policy and robot by URL or by defaults.

import { readFile } from "node:fs/promises";
import Runrobot from "runrobot";

const client = new Runrobot({ auth: process.env.RUNROBOT_API_TOKEN ?? "YOUR_RUNROBOT_API_TOKEN" });
const scene = await client.publishScene({
  title: "My Scene",
  glb: new Blob([await readFile("./scene.glb")], { type: "model/gltf-binary" }),
});

console.log(client.buildUrl(scene));

Get a URL of any robot or policy in your scene in seconds

Publish a MuJoCo robot bundle

Robot bundles are zipped MuJoCo assets with an entry XML. Published robots can then be pinned into explicit run URLs.

import { readFile } from "node:fs/promises";
import Runrobot from "runrobot";

const client = new Runrobot({ auth: process.env.RUNROBOT_API_TOKEN ?? "YOUR_RUNROBOT_API_TOKEN" });
const robot = await client.publishRobot({
  slugPath: "my-g1", title: "My G1", robotKey: "unitree-g1",
  bundle: new Blob([await readFile("./robot.zip")], { type: "application/zip" }),
});

console.log(client.buildUrl(robot));

Publish a browser-native policy artifact

The hosted API accepts ONNX policies plus the current runtime adapter config. Easily package policy workflows in our open-source runrobot, you can use to publish policies with RunRobot Cloud.

import { readFile } from "node:fs/promises";
import Runrobot from "runrobot";

const client = new Runrobot({ auth: process.env.RUNROBOT_API_TOKEN ?? "YOUR_RUNROBOT_API_TOKEN" });
const policy = await client.publishPolicy({
  slugPath: "my-policy", title: "My Policy", runtimeAdapter: "onnx_metadata_v1",
  model: new Blob([await readFile("./policy.onnx")]),
});

console.log(client.buildUrl(policy));

Use onnx_metadata_v1 for policies.

Advanced

Hosted platform workflows

Use these when you need scene generation, hosted pairwise evaluation, or aggregate leaderboard reads on top of already-published runs.

Generate a scene from an image

SceneGen jobs are asynchronous. Start a job with an image and boxes, then poll the job URL until the published scene is ready.

import { readFile } from "node:fs/promises";

const form = new FormData();
form.set("slugPath", "my-generated-scene"); form.set("title", "My Generated Scene");
form.set("boxes", JSON.stringify([{ x: 80, y: 60, width: 320, height: 240 }]));
form.set("image", new Blob([await readFile("./scene.jpg")], { type: "image/jpeg" }), "scene.jpg");
const response = await fetch("https://runrobot.sh/api/scenegen/jobs", { method: "POST", headers: { Authorization: `Bearer ${process.env.RUNROBOT_API_TOKEN ?? "YOUR_RUNROBOT_API_TOKEN"}` }, body: form });
console.log((await response.json()).job.id);

Run an arena evaluation

Arena is a hosted evaluation surface built on published runs. Launch a matchup only after your policies are already runnable in the browser.

const { matchup } = await fetch("https://runrobot.sh/api/arena/launch", { method: "POST" }).then((r) => r.json());
console.log(matchup.left.browserUrl);
console.log(matchup.right.browserUrl);

Vote and read the leaderboard

Leaderboard data is aggregate evaluation output. Use it after you already have published policies and completed arena votes.

await fetch("https://runrobot.sh/api/arena/vote", {
  method: "POST", headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ matchupId: "matchup_123", winner: "left" }),
});
console.log(await fetch("https://runrobot.sh/v1/leaderboard").then((r) => r.json()));

Read the aggregate leaderboard only

Use the public leaderboard endpoint when you only need aggregate standings and not the underlying arena workflow.

console.log(await fetch("https://runrobot.sh/v1/leaderboard").then((r) => r.json()));

Publishing and auth

These are the core developer endpoints. Start here if you are uploading assets or minting API tokens.

GET/api/api-tokensSession or bearer

Lists your API tokens.

POST/api/api-tokensSession or bearer

Creates one API token.

DELETE/api/api-tokens/{tokenId}Session or bearer

Revokes one API token.

POST/api/publish/scenesBearer

Publishes one scene GLB and returns its public manifest.

POST/api/publish/robotsBearer

Publishes one zipped MuJoCo robot bundle.

POST/api/publish/policiesBearer

Publishes one browser-native policy artifact and returns its manifest.

SceneGen

Use SceneGen when you want RunRobot to generate a published scene from an input image.

POST/api/scenegen/jobsBearer

Creates one SceneGen job from an image and boxes.

GET/api/scenegen/jobs/{jobId}Public

Reads SceneGen job progress, previews, and the published scene when ready.

Deployments, rollouts, datasets, and training

These are authenticated console endpoints for managing dedicated policy endpoints, rollout records, uploaded MP4 datasets, and training jobs. When Video2Robot is configured, training jobs proxy project creation, upload, pose extraction, and robot retargeting through the connected service.

GET/api/deploymentsSession or bearer

Lists your deployments.

POST/api/deploymentsSession or bearer

Creates one deployment from an owned or public policy.

GET/api/rolloutSession or bearer

Lists rollout records and error logs for your policies.

GET/api/datasets/uploadsSession or bearer

Lists your uploaded MP4 dataset records.

POST/api/datasets/uploadsSession or bearer

Uploads one or more MP4 files into your dataset library.

GET/api/training/jobsSession or bearer

Lists your training jobs and refreshes Video2Robot task state when configured.

POST/api/training/jobsSession or bearer

Creates one training job and launches Video2Robot work when available.

Evaluation

Arena and leaderboard are higher-level hosted evaluation surfaces layered on top of published runs.

POST/api/arena/launchPublic

Creates one browser-native arena matchup.

GET/api/arena/matchup/{matchupId}Public

Reads one arena matchup and both browser URLs.

POST/api/arena/controlPublic

Dispatches a control event into one arena pane.

POST/api/arena/votePublic

Records one arena vote and updates the aggregate standings.

GET/v1/leaderboardPublic

Reads the public aggregate leaderboard.

What the SDKs cover today

The runrobot SDKs are developer clients for hosted RunRobot Cloud. They build canonical public URLs and upload scenes, robots, and policy artifacts. The package-first researcher workflow lives in the open-source runrobot repo.

Docs | RunRobot