Resources and billing

Size sandboxes, understand per-second compute charges, and monitor team credit.

Sandbox sizes

Select CPU and memory when creating a chat:

{
  "instance": {
    "cpu": 4,
    "memory": 8
  }
}

Current choices:

ResourceAllowed valuesDefault
CPU2 or 4 vCPU2 vCPU
Memory2, 4, or 8 GiB2 GiB
Diskfixed at 10 GiB10 GiB

Any allowed CPU value may be paired with any allowed memory value. Unsupported or odd values return 422.

Size belongs to the chat and is reused by later turns. Create another chat to change it.

When billing runs

Billing uses sandbox wall-clock time. Queue time does not consume compute credit. Timing starts when a sandbox is ready and ends when the turn completes, fails, times out, or is canceled.

The sandbox is stopped after every turn.

Current compute rates

ResourceRate per unit-secondRate per unit-hour
vCPU$0.0000164≈ $0.059
Memory GiB$0.0000053≈ $0.019
Disk GiB$0.000000036≈ $0.00013

Metering is per-second, so the per-second column is the authoritative rate and the hourly figures are it multiplied by 3600:

second_rate =
  cpu × 0.0000164
  + memory_gib × 0.0000053
  + disk_gib × 0.000000036

turn_cost = second_rate × sandbox_seconds

The default 2 vCPU, 2 GiB, 10 GiB sandbox runs at $0.00004376/s, or $0.157536 for a full hour of running compute.

Model-token charges go directly to the provider key supplied with the run and are separate from Epho compute credit.

Prepaid credit

Compute is deducted from the team's prepaid ledger in micro-USD. Epho refuses a new turn with 402 Payment Required when no positive credit remains.

Read the balance:

curl https://app.epho.io/api/v1/credits \
  -H "Authorization: Bearer $EPHO_API_KEY"
{
  "balance": {
    "micros": 4230000,
    "cents": 423,
    "usd": "4.23"
  }
}

One USD equals 1,000,000 micros. The micros value is the precise ledger balance; cents and usd are display-friendly forms.

Concurrency

Teams default to five active turns. Turns beyond the team's cap remain queued without consuming a slot or billable compute and emit:

{
  "type": "status",
  "phase": "queued",
  "message": "Waiting for an available run slot…"
}

Queued turns start as active turns settle.