# Pricing

Two meters — robot-hours and environment-hours — visible in every quote and every result. Metered per minute.

Everything you buy from Roborama reduces to two meters: **robot-hours**
(occupancy of an embodiment) and **environment-hours** (occupancy of a scene).
A queue priority — `burst | standard | soak` — multiplies both. There are no
credits, no seats, no platform fee. Every quote and every result shows both
meters, so the bill is an arithmetic exercise, never a surprise.

**Metered** — *most teams start here*

from $7 /robot-hour (+ environment meter from $12/env-hour)

Two meters, per minute. No credits, no seats, no platform fee.

Everything on the rate card:

- All ten catalogue embodiments, firmware-pinned
- Four environment classes, bare cell to instrumented replica
- Queue priority ×0.6–×1.5 on both meters
- episodes="auto(ci, moe)" run sizing
- max_budget_usd hard stop, metered live
- MCAP + video + ground truth on every episode

**Threshold contract**

Your cap /month (monthly_cap_usd — a hard stop you set)

Buy the verified outcome — iterate cheap, escalate automatically.

Metered under the cap, plus:

- Soak-tier iteration on commodity pods (nori-a3, $7/robot-hour)
- Automatic escalation to verification-tier hardware on crossing
- on_verified webhook gates your release
- Partial results kept — n and CI survive any stop

**Suite run**

$9,500 /suite run (flat — a small discount to the metered equivalent)

The rbr-manip-core@v3 benchmark, scheduled as one block.

One block, one report:

- 5 tasks × 300 episodes
- g1-edu-pro@fw2.3, firmware-pinned
- Suite attestation (rbr:att: id)
- Verification report included

| Compare | Metered | Threshold contract | Suite run |
| --- | --- | --- | --- |
| **Rates & billing** |  |  |  |
| Robot meter | $7–$176 /robot-hour | soak rates, then verify-tier | included |
| Environment meter | $12–$85 /env-hour | metered under your cap | included |
| Queue priority | burst ×1.5 · standard ×1.0 · soak ×0.6 | soak ×0.6 until escalation | scheduled as one block |
| Billing granularity | per minute | per minute, capped | flat |
| **Hardware** |  |  |  |
| Embodiments | all ten, firmware-pinned | nori-a3 pods → g1-edu-pro | g1-edu-pro@fw2.3 |
| Environments | four classes, versioned scenes | catalogue scenes | suite scenes, pinned |
| Teleop fallback adder | +$18 /robot-hour | +$18 /robot-hour | — |
| **Statistics** |  |  |  |
| n + Wilson 95% CI on every result | ✓ | ✓ | ✓ |
| Auto-sized episodes | ✓ | drives escalation | 300 per task |
| Failure clusters | ✓ | ✓ | ✓ |
| **Controls** |  |  |  |
| Hard budget stop | max_budget_usd per run | monthly_cap_usd | flat price |
| Quotes | POST /v1/quote, 7-day expiry | cap set in the contract | fixed |
| Webhooks | all five events | on_verified | run.completed |
| Partial results kept on stop | ✓ | ✓ | ✓ |
| **Deliverables** |  |  |  |
| MCAP + video + ground truth | ✓ | ✓ | ✓ |
| Verification report | on verification-tier runs | on threshold crossing | included |
| Suite attestation | — | — | ✓ |

## The rate card

The comparison above is arithmetic over one public rate card — a JSON file,
[`/fixtures/pricing.json`](/fixtures/pricing.json), the same one the quote
endpoint prices from.

**Meter 1 — robot-hours (occupancy of an embodiment)**

| Robot | Class | Tier | Rate | Notes |
| --- | --- | --- | --- | --- |
| nori-a3 | arm-pod | soak | $7 / robot-hour | Commodity soak pods, 24 cells. Iterate here; escalate when the numbers hold. |
| so-101 | arm-pod | soak | $9 / robot-hour | Hobby-class 5-DoF pods, 16 cells. The cheapest smoke test for a policy. |
| stretch3 | mobile-manipulator | verify | $34 / robot-hour | Mobile manipulation, firmware-pinned. |
| fr3-bench | fixed-arm | verify | $38 / robot-hour | Torque-controlled 7-DoF industrial arm on a fixed bench. |
| aloha-bimanual | bimanual | verify | $52 / robot-hour | Bimanual teleop-grade rig. |
| tiago-pro | mobile-manipulator | verify | $61 / robot-hour | Premium mobile manipulator; torso lift and force-torque wrists. |
| aloha2-pro | bimanual | verify | $74 / robot-hour | Second-generation bimanual rig, gravity-compensated, higher payload. |
| spot-arm | quadruped-manip | verify | $89 / robot-hour | Quadruped with a 6-DoF arm; uneven-floor manipulation cells. |
| g1-edu-pro | humanoid | verify | $148 / robot-hour | 37-DoF humanoid with dex3-1 hands; the verification-tier default. |
| g1-edu-plus | humanoid | verify | $176 / robot-hour | 43-DoF humanoid; limited cells. |

**Meter 2 — environment-hours (occupancy of a scene)**

| Environment class | Example | Rate | Notes |
| --- | --- | --- | --- |
| bare | cell-a@v1.0 | $12 / env-hour | Bare bench cell, overhead camera. |
| standard | warehouse-std@v2.0 | $24 / env-hour | Standard catalogue scene with mocap. |
| replica | kitchen-std@v1.2 | $39 / env-hour | Full replica scene, mocap + force-torque. |
| instrumented-replica | surgical-replica@v3 | $85 / env-hour | High-instrumentation replica, high-speed capture. |

**Queue priority (multiplies both meters)**

| Priority | Multiplier | Notes |
| --- | --- | --- |
| burst | ×1.5 | Expedited queue: next available cell, both meters at 1.5×. |
| standard | ×1.0 | Default queue. |
| soak | ×0.6 | Off-peak, interruptible scheduling at 0.6×. |

**Adders**

| Adder | Rate | Notes |
| --- | --- | --- |
| teleop-fallback | $18 / robot-hour | Human takeover on policy halt (Policy.endpoint fallback). |
| extra-instrumentation | $12 / env-hour | Additional mocap or high-speed capture beyond the environment's base kit. |

**Packaged units**

| Package | Price | Includes |
| --- | --- | --- |
| rbr-manip-core@v3 suite run | $9,500 | 5 tasks × 300 episodes on g1-edu-pro@fw2.3; suite attestation (rbr:att: id) and the verification report. |
| Outcome contract — threshold() | monthly_cap_usd you set | Soak-tier iteration (e.g. nori-a3 pods) with automatic escalation to verification-tier hardware on threshold crossing; on_verified webhook; hard monthly cap. |

Metered per minute, displayed per hour. Hours in results are rounded to 0.1 h; billing uses exact minutes. A max_budget_usd on any run is a hard stop, metered live.

## A worked quote: 600 humanoid episodes

What does it cost to run 600 episodes on `g1-edu-pro` in the
`kitchen-std@v1.2` replica at standard priority?

```text
episodes            600
est. minutes/ep     2.0   (task time + scripted reset)
robot-hours         600 × 2.0 min = 20.0 h
environment-hours   600 × 2.0 min = 20.0 h

robot meter         20.0 h × $148/robot-hour  = $2,960
environment meter   20.0 h × $39/env-hour     = $780
                                        total = $3,740   queue ETA ~6h
```

That is exactly what the quote endpoint returns — the same shape ships in
[`/fixtures/quote.json`](/fixtures/quote.json) and in the
[`POST /v1/quote`](/docs/api-reference/quote/) examples:

*Example: roborama.quote()*

**Python**

```python
import roborama  # reads ROBORAMA_API_KEY from the environment

quote = roborama.quote(
    robot="g1-edu-pro",
    environment="kitchen-std",
    episodes=600,
)
print(quote)
# {robot_hours: 20.0, env_hours: 20.0, usd: 3740, queue_eta: "6h"}
```

**TypeScript**

```typescript
import Roborama from "@roborama/sdk"; // reads ROBORAMA_API_KEY

const roborama = new Roborama();

const quote = await roborama.quote({
  robot: "g1-edu-pro",
  environment: "kitchen-std",
  episodes: 600,
});
console.log(quote);
// { robot_hours: 20.0, env_hours: 20.0, usd: 3740, queue_eta: "6h" }
```

**cURL**

```bash
curl https://api.roborama.com/v1/quote \
  -H "Authorization: Bearer $ROBORAMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "robot": "g1-edu-pro",
    "environment": "kitchen-std",
    "episodes": 600
  }'
```

**Agent (tool-use payload)**

```json
{
  "type": "tool_use",
  "name": "roborama_quote",
  "input": {
    "robot": "g1-edu-pro",
    "environment": "kitchen-std",
    "episodes": 600
  }
}
```

For comparison, the canonical run on the [product page](/product/) was
auto-sized (`episodes="auto(ci=0.95, moe=0.03)"`) and stopped at n=612 with
realized `robot_hours=20.4`, `environment_hours=20.4`, `cost_usd=3,812` —
billing uses exact minutes; displayed hours are rounded to 0.1.

## Outcome pricing: the threshold contract

If what you actually want to buy is *"iterate until verified at a 0.99 success
rate (95% CI) on `bin_pick@v1`"*, buy that. A `threshold()` contract iterates
your checkpoint stream on soak-tier commodity pods (e.g. `nori-a3`,
single-digit dollars per robot-hour) and escalates to verification-tier
hardware like `g1-edu-pro@fw2.3` only when the target is crossed. You set the
`monthly_cap_usd`; the `on_verified` webhook gates your release.

*Example: the soak-to-verify contract*

**Python**

```python
import roborama  # reads ROBORAMA_API_KEY from the environment

contract = roborama.threshold(
    policy_stream=roborama.PolicyStream(webhook="https://acme.ai/ckpt"),
    target={"success_rate": 0.99, "ci": 0.95, "task": "bin_pick@v1"},
    iterate_on="soak",               # commodity tier, e.g. nori-a3 pods
    escalate_to="g1-edu-pro@fw2.3",  # verification tier on crossing
    monthly_cap_usd=12_000,
)

contract.on_verified(webhook="https://acme.ai/release-gate")
print(contract.id, contract.status)
```

**TypeScript**

```typescript
import Roborama from "@roborama/sdk"; // reads ROBORAMA_API_KEY

const roborama = new Roborama();

const contract = await roborama.runs.create({
  kind: "threshold",
  policy_stream: { webhook: "https://acme.ai/ckpt" },
  target: { success_rate: 0.99, ci: 0.95, task: "bin_pick@v1" },
  iterate_on: "soak", // commodity tier, e.g. nori-a3 pods
  escalate_to: "g1-edu-pro@fw2.3", // verification tier on crossing
  monthly_cap_usd: 12000,
});

await contract.onVerified({ webhook: "https://acme.ai/release-gate" });
console.log(contract.id, contract.status);
```

**cURL**

```bash
curl https://api.roborama.com/v1/runs \
  -H "Authorization: Bearer $ROBORAMA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "threshold",
    "policy_stream": { "webhook": "https://acme.ai/ckpt" },
    "target": { "success_rate": 0.99, "ci": 0.95, "task": "bin_pick@v1" },
    "iterate_on": "soak",
    "escalate_to": "g1-edu-pro@fw2.3",
    "monthly_cap_usd": 12000,
    "on_verified": { "webhook": "https://acme.ai/release-gate" }
  }'
```

**Agent (tool-use payload)**

```json
{
  "type": "tool_use",
  "name": "roborama_threshold",
  "input": {
    "policy_stream": { "webhook": "https://acme.ai/ckpt" },
    "target": { "success_rate": 0.99, "ci": 0.95, "task": "bin_pick@v1" },
    "iterate_on": "soak",
    "escalate_to": "g1-edu-pro@fw2.3",
    "monthly_cap_usd": 12000,
    "on_verified": { "webhook": "https://acme.ai/release-gate" }
  }
}
```

## Budgets are hard stops

Every run accepts `max_budget_usd`, metered live: the run stops at the cap and
keeps its partial result (with n and CI — partial data is still data). Account
budgets work the same way via `roborama.budgets.set(monthly_usd=25_000,
hard=True)`. See [billing & budgets](/docs/guides/billing-and-budgets/).

## FAQ

### What exactly am I billed for?

Two meters, per minute: robot-minutes while your policy occupies an embodiment
(from first motor enable to final reset) and environment-minutes while it
occupies a scene. Priority multiplies both (burst ×1.5, standard ×1.0, soak
×0.6). Adders apply only where listed on the rate card.

### What do 600 humanoid episodes cost?

At standard priority, 600 episodes of g1-edu-pro in kitchen-std@v1.2 quote at
20.0 robot-hours × $148 plus 20.0 environment-hours × $39 = $3,740, with a
queue ETA around 6 hours. Get a live number from POST /v1/quote — the quote
shows both meters and expires after seven days.

### What happens when a run hits max_budget_usd?

The hard stop fires mid-run: the run stops, you get a budget_exceeded error
with the run id, and the partial result is kept — n, success rate, and the
confidence interval for the episodes that did run.

### Do I pay for failed episodes?

Yes — the meters measure occupancy, and failures occupy hardware too. Failed
episodes ship the same artifacts (video, MCAP, replay spec) plus a failure
cluster label, which is usually the most valuable data in the run. Whether we
may train on your failures is your call: data.train_on_failures defaults to
false.

### Is there a way to iterate cheaply before paying verification-tier rates?

Use the embodiment ladder. Iterate on soak-tier pods (nori-a3 at $7/robot-hour,
or soak priority at ×0.6 on any robot) and reserve g1-edu-pro at $148/robot-hour
for the runs that produce your verification report — or let a threshold
contract manage the ladder automatically.

### Do suite runs cost the same as ad-hoc runs?

The rbr-manip-core@v3 package (5 tasks × 300 episodes on g1-edu-pro@fw2.3,
attestation and verification report included) is a flat $9,500 — priced at a
small discount to the metered equivalent, in exchange for being scheduled as
one block.
