Documentation

The RSI API

One base URL, one Bearer key, four routes. Everything returns JSON.
Base URL: https://rsi.robomart.ai/v1

Overview

RSI serves complete robot brains — action models (VLAs), robot-grade vision-language models, and world models — behind one API key, priced in one unit: the step. There is no SDK requirement. If you can curl, you're integrated. The reasoning route is OpenAI-compatible, so existing SDKs work by changing base_url.

Authentication

Mint a key in the console. Keys are shown once, stored hashed, revocable anytime, and carry a monthly spend cap.

export RSI_API_KEY="rsi_sk_live_…" curl https://rsi.robomart.ai/v1/models

Quickstart

Three calls, one per modality:

# 1 — an action chunk from π0 curl -X POST https://rsi.robomart.ai/v1/act \ -H "Authorization: Bearer $RSI_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"pi0","image":"data:image/jpeg;base64,…","state":[0.1,0.4],"instruction":"pick up the red mug"}' # 2 — embodied reasoning from Molmo2-ER curl -X POST https://rsi.robomart.ai/v1/chat/completions \ -H "Authorization: Bearer $RSI_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"molmo2-er","messages":[{"role":"user","content":[{"type":"image_url","image_url":{"url":"…"}},{"type":"text","text":"point at every gauge above 60 psi"}]}]}' # 3 — five seconds of predicted future from Cosmos 3 curl -X POST https://rsi.robomart.ai/v1/world \ -H "Authorization: Bearer $RSI_API_KEY" \ -H "Content-Type: application/json" \ -d '{"model":"cosmos3-nano","image":"…","prompt":"the forklift reverses","seconds":5}'

GET /v1/models

GET /v1/models

The live catalog — id, category, per-model step rates (price_live / price_queued), license class, serving status. Public, no key required.

POST /v1/act

POST /v1/act

One inference from an action model: observation in, action chunk out. The robotics-native route — no token math on an action chunk.

{ "model": "pi0", "image": "data:image/jpeg;base64,…", // or an array for multi-camera rigs "state": [0.12, 0.44, …], // proprio vector, embodiment-dependent "instruction": "pick up the red mug", "embodiment": "so101" // optional; selects normalization stats } // → { "actions": [[…], …], "chunk_len": 50, "horizon_s": 1.0, "usage": { "steps": 50 } }
FieldNotes
modelAny action-category model id from /v1/models
imageBase64 data URI or HTTPS URL; array accepted for multi-cam
stateProprioception vector; length validated per embodiment
embodimentNamed rig (so101, aloha, franka, g1, custom:*) — picks norm stats

POST /v1/chat/completions

POST /v1/chat/completions

OpenAI-compatible chat for the reasoning catalog — robot VLMs, pointing models, physical-reasoning models. Streaming supported.

# python, openai sdk import os from openai import OpenAI client = OpenAI(base_url="https://rsi.robomart.ai/v1", api_key=os.environ["RSI_API_KEY"]) r = client.chat.completions.create( model="molmo2-er", messages=[{"role":"user","content":[ {"type":"image_url","image_url":{"url":"…"}}, {"type":"text","text":"point at every gauge above 60 psi"}]}])

POST /v1/world

POST /v1/world

World-model generation: conditioned future video. Batch by default — returns a job you poll.

{ "model": "cosmos3-nano", "image": "…", "prompt": "the forklift reverses and turns left", "seconds": 5 } // → { "job": "wj_…", "status": "queued" } — poll GET /v1/jobs/wj_…

POST /v1/policies

POST /v1/policies

Create an account-scoped Policy from a catalog model. The response includes its stable name, matching inference route, deployment status, and revision.

{ "name": "pi0-v1", "base_model": "pi0" } // → { "id":"…", "name":"acme/pi0-v1", "status":"queued", "endpoint":"https://rsi.robomart.ai/v1/act" }

POST /v1/fine-tuning/jobs

POST /v1/fine-tuning/jobs

Request a tuned revision for an existing Policy using a LeRobot-format Hugging Face repository.

{ "policy": "acme/pi0-v1", "training_data": { "source": "huggingface", "repository": "acme/robot-episodes" }, "method": "lora" } // → { "id":"…", "output_revision":2, "status":"queued" }

Steps & pricing

A step is one tick of the control loop — one motor command, one frame of imagined future, or one decision (up to ~500 tokens of deliberation inside it). One unit across the catalog; each model carries its own rate, exactly as token prices vary by model. Usage responses report usage.steps on every route.

Rates are per model — exact numbers on every model page and in GET /v1/models (fields price_live, price_queued). Two ways to run any job: live (answer now) or queued (runs when GPUs have slack, −66%). World models are queue-native. Fine-tune jobs bill the clock: $0.07/min A100 · $0.10/min H100.

Serving status

Models come online in order of demand. Deployment requests create durable queued Policies now. Inference returns 409 model_queued or 409 policy_queued until serving capacity is active. The same request shape works after activation.

Errors

CodeMeaning
401 invalid_keyKey missing, revoked, or malformed
402 spend_capMonthly cap hit — raise it in the console
404 unknown_modelNot in the catalog — GET /v1/models
409 model_queuedCatalog model not serving yet; body has queue info
409 policy_queuedPolicy deployment is queued; the stable Policy name is reserved
422 bad_observationImage/state shape doesn't match the embodiment
429 rate_limitedPer-key RPS exceeded; retry-after in headers