# Concepts

## Orgs and workspaces

An **org** (`org_…`) is the tenant. It owns money and trust: the wallet, the ledger, the default residency. Org owners
administer every workspace of the org; billing members see the org's money but not its work.

A **workspace** (`ws_…`) belongs to one org and is where work happens: members, API keys, sandboxes, budgets and usage.
A member holds one relation in it: `admin`, `developer` or `viewer`, each including the next. Every org starts with a
workspace called `default`.

## API keys

An **API key** (`key_…`, secret `rc_live_…`) belongs to one person and acts in one workspace, as `developer` (reads and
writes) or `viewer` (reads). A key is never an admin, never acts at org level, and does nothing once its person leaves
the workspace. The secret is shown once; only its hash is kept. Personal tokens, which act as their person in every
workspace that person belongs to, arrive with the [CLI](/docs/cli).

## Sandboxes

A **sandbox** (`sbx_…`) is a full virtual machine: its own Linux kernel, systemd, Docker, nested virtualization when you
ask for it, a persistent disk, and a network. Its id carries the code of the [cell](#cells) it lives in.

A sandbox is `queued`, `starting`, `running`, `stopping`, `stopped` or `failed`, as its cell last reported it (`unknown`
before its cell has reported). You pay compute only while it runs, per second, and storage for its disk while it is
stopped ([Pricing](/docs/pricing)). Creating, starting, resuming and forking cost nothing.

## Snapshots and forks

A **snapshot** (`snp_…`) captures a sandbox's disk, and, for a running sandbox, its memory. A **fork** is a new sandbox
started from a snapshot or from a running sandbox; it keeps the parent's files and state and diverges from there.
Storage is billed on **unique bytes**: blocks shared between a sandbox, its snapshots and its forks are counted once.
Forking a sandbox is `POST /v1/sandboxes/{id}/fork` ([API › Acting on a sandbox](/docs/api#acting-on-a-sandbox)).
A workspace's snapshots are listed by `GET /v1/snapshots` (`raw snapshots list`, and under **Machines** in the
console) as soon as the cell that holds them reports them; taking and deleting one are its cell's to do, answered once
cells are open ([API › Snapshots and templates](/docs/api#snapshots-and-templates)). A snapshot outlives its sandbox.

## Templates

A **template** (`tpl_…`) is a disk image to start sandboxes from: one of ours, or one your workspace built. Templates
are stored once per CPU baseline, so a sandbox started from one can run on any host of its pool. `GET /v1/templates`
(`raw templates list`, and **Machines** in the console) lists the workspace's own and our public ones (`workspace`
is `null`) as the cells report them; `POST /v1/sandboxes` with `"template": "tpl_…"` starts from one once cells are
open.

## Sizes

A size is `<vCPU>x<GiB of memory>`. Each class sells the sizes marked for it; asking a class for another is
`400 invalid_request`.

| Size | vCPU | Memory | Disk included while running | `std` | `perf` |
| --- | --- | --- | --- | --- | --- |
| `2x4` | 2 | 4 GiB | 20 GiB | yes | yes |
| `2x8` | 2 | 8 GiB | 20 GiB | yes | — |
| `4x8` | 4 | 8 GiB | 40 GiB | yes | yes |
| `4x16` | 4 | 16 GiB | 40 GiB | yes | — |
| `8x16` | 8 | 16 GiB | 80 GiB | yes | yes |
| `8x32` | 8 | 32 GiB | 80 GiB | yes | — |
| `16x32` | 16 | 32 GiB | 160 GiB | yes | yes |
| `16x64` | 16 | 64 GiB | 160 GiB | yes | — |
| `32x64` | 32 | 64 GiB | 320 GiB | yes | yes |
| `32x128` | 32 | 128 GiB | 320 GiB | yes | — |

## Classes

| Class  | For                                   | CPU                                               |
| ------ | ------------------------------------- | ------------------------------------------------- |
| `std`  | agents and dev boxes                  | shared vCPU, packed by measured workload profiles |
| `perf` | CI and anything that waits on the CPU | dedicated high-clock cores                        |

Prices for every size in each class are on [Pricing](/docs/pricing).

## Cells

A **cell** is a group of our hosts in one region that runs sandboxes. Each sandbox lives in exactly one cell, and its id
names that cell: `sbx_<cell code>_…`. The regions a workspace may use follow its [residency](#residency).

- When every cell that serves a start's class and region is full, the start waits in line with an ETA
  ([The queue](#the-queue)); with `"on_full": "fail"` it answers `503 capacity_full` instead.
- `503 capacity_unavailable` means no cell serves that class and region at all. During early access that is true of
  every class and region.
- EU residency means EU cells only.

## The queue

A start never fails just because a cell is busy. When cells exist but are full, the default is to wait in line: the
answer is `202` with the sandbox `queued`, its place in the queue and when it is expected to start.

```json
{
	"object": "sandbox",
	"id": "sbx_ny1_01m6xxh3k2q8v7c4t9r5wdz6ya",
	"name": null,
	"class": "std",
	"size": "4x8",
	"state": "queued",
	"created_at": "2026-11-08T17:02:11.000Z",
	"queue": { "position": 3, "eta": "2026-11-08T17:04:00.000Z" }
}
```

Queued time is not billed. A caller that would rather fail says so:

```json
{ "class": "perf", "size": "8x16", "on_full": "fail" }
```

and gets `503 capacity_full`, with `Retry-After` in seconds and the expected time in the message.

When **no** cell serves the requested class in the workspace's residency, the answer is `503 capacity_unavailable`,
whatever `on_full` says, with no `Retry-After`. Nothing would ever drain that queue, so we don't pretend it would. That is
the answer during early access ([Limits › Early access](/docs/limits#early-access)).

## Residency

An org has a default **residency**: `any` (the default) or `eu`. A workspace may set its own. With `eu`, the workspace's
sandboxes, disks, snapshots and templates are placed only in EU [cells](#cells), and a request that would place them
elsewhere is refused. EU placement carries a multiplier on compute ([Pricing](/docs/pricing)).
