Policy endpoints for agents and orchestrators.
Roll out a robot policy with a single REST call. Curate a dataset from a Slack command. Trigger a sim-to-real gap report from your CI. Async, idempotent, agent-ready.
- OpenAPI 3.1
- typed spec
- Python · TS
- SDKs
- 5
- agent frameworks
# REST
curl https://api.openbot.ai/v1/bench/rollouts \
-H "Authorization: Bearer ob_live_..." \
-d '{
"policy": "openvla-7b",
"embodiment": "franka_panda",
"task": "kitchen_handover",
"rollouts": 200,
"webhook": "https://my.app/openbot"
}'
# {
# "id": "run_8c91a4",
# "status": "queued",
# "result_url": "https://api.openbot.ai/v1/runs/run_8c91a4"
# }
# Python SDK
from openbot import Client
ob = Client() # reads OPENBOT_API_KEY
run = ob.bench.rollout(
policy="openvla-7b",
embodiment="franka_panda",
task="kitchen_handover",
rollouts=200,
)
print(run.wait().task_success) # 0.73A single surface for Bench, Data, and Synth.
One API design for the whole loop — evaluation, data curation, synthesis, reports, and workspace automation.
- 01
One call per real task
POST a rollout config. Get a job ID. Stream status or receive a webhook. No queue management, no GPU scheduling, no orchestration glue — just the result.
- 02
Async, idempotent jobs
Every rollout has a stable ID. Retries don't double-bill. Long-running tasks resume across deploys, and status is always queryable.
- 03
Tool-use schemas built in
Drop-in JSON schemas for OpenAI function-calling, Anthropic tool_use, LangChain, and AutoGen. Your agent drives Bench, Data, and Synth natively through the same surface.
- 04
Bridges where you already work
Adapters for Isaac Lab, LeRobot, ROS 2, and a small reference Python agent you drop next to your existing robot stack. No rip-and-replace.
- 05
Per-key quotas and scopes
Scope a key to a single product (Bench-only, Synth-only) or a single org workspace. Per-key rate limits, expiration, and full audit log out of the box.
- 06
Signed URLs, no data on disk
Uploads land in R2 via short-lived signed URLs. Results are downloadable the same way. Your weights and footage never sit in plaintext on a shared server.
Three ways to call. One surface.
REST for curl scripts, Python SDK for notebooks, TypeScript SDK for dashboards. Same endpoints, same types, same async behavior.
from openbot import Client
ob = Client() # reads OPENBOT_API_KEY
run = ob.bench.rollout(
policy="openvla-7b",
embodiment="franka_panda",
task="kitchen_handover",
rollouts=200,
webhook="https://my.app/openbot",
)
result = run.wait()
print(result.task_success) # 0.73POST once. Get called when it's done.
No polling loops. No long-lived connections. Your agent or CI posts a config, goes back to work, and gets a webhook when the result is ready.
{
"event": "bench.rollout.completed",
"run_id": "run_8c91a4",
"status": "success",
"result": {
"task_success": 0.73,
"sim_to_real_gap": -0.29,
"intervention_rate": 0.14
},
"report_url": "https://api.openbot.ai/v1/runs/run_8c91a4/report"
}Wired into the tools you already use.
Wire your robot to your agent.
Read the OpenAPI spec and SDK design today. Request early access for a live key.
