Skip to content
Ibby docs
Esc
↑↓navigate↵open⌘Jpreview
On this page

Usage and cost

List your lane's runs with their durations and estimated costs. Every cost is an estimate, never a bill.

Every cost on this page is an estimate. It is worked out from a run’s seconds, its CPU and memory size, and published rates. It is not read from a bill, and the data says so: each cost carries "estimate": true.

Your key shows only its own lane’s runs. A run is one sandbox, from its create to its end.

From the command line

ibby usage
ibby usage --since 2026-11-01T00:00:00Z --until 2026-12-01T00:00:00Z
ibby usage --json

ibby usage fetches every page and prints a table. Its columns are fixed, in this order, and named after the API’s fields:

Column What it holds
started_at When the run started, in UTC
sandbox_id The sandbox, sbx_...
name The sandbox’s name, or -
outcome How the sandbox ended, or - while it runs: removed (you removed it), lifetime_reached (its lifetime ran out), resource_limit (its size limit stopped it) or failed (the create failed or the platform lost it). New values may be added.
duration_ms How long it lasted, or - while it runs
cpu CPU cores
memory_mib Memory, in MiB
region The lane’s region
estimated_cost The estimated cost in USD, as a decimal, or - while it runs

Cells are separated by spaces, and no cell contains a space, so a script can split each line on whitespace. The last line holds the totals of the runs that have ended:

total (estimate): 12 runs, duration_ms 720000, estimated_cost 0.007920 USD

With --json, the tool prints { "runs", "totals", "next_cursor": null }: every run, and the totals over all of them.

From code

usage() returns one page, newest first, with totals for that page. Pass next_cursor back as cursor for the next page, or let the SDK follow the pages for you.

import { Ibby } from "@ibby-ai/sdk";

const ibby = new Ibby({ apiKey: process.env["IBBY_API_KEY"] ?? "" });

const page = await ibby.usage({ since: "2026-11-01T00:00:00Z", limit: 50 });
console.log(page.totals.duration_ms, page.totals.estimated_cost.amount);

for await (const each of ibby.usagePages({ since: "2026-11-01T00:00:00Z" })) {
  for (const run of each.runs) {
    console.log(
      run.sandbox_id,
      run.outcome,
      run.duration_ms,
      run.estimated_cost?.amount
    );
  }
}
import os

from ibby import Ibby

with Ibby(os.environ["IBBY_API_KEY"]) as client:
    page = client.usage(since="2026-11-01T00:00:00Z", limit=50)
    print(page.totals.duration_ms, page.totals.estimated_cost.amount)

    for each in client.usage_pages(since="2026-11-01T00:00:00Z"):
        for run in each.runs:
            cost = run.estimated_cost.amount if run.estimated_cost else None
            print(run.sandbox_id, run.outcome, run.duration_ms, cost)

A cost’s amount is a decimal string, such as "0.000660". Add amounts as decimals, not floats, or the totals drift.

Estimate limits

A run’s times are when the platform saw it start and end, so an estimate can be off in three known ways:

  • A sandbox that stops on its own is seen to end at the next call on it, or at the platform’s next check, a few minutes at most. It is counted until then, except a run that reached its lifetime, which is never counted longer than its lifetime.
  • A create whose answer was lost, and which the platform later finds running, is counted from when it was found, not from when it really started.
  • A sandbox made after its create had already been given up on is removed by the platform and never counted.

What a run record holds

Only ids, times, durations, CPU and memory size, region, outcome and the estimate. The platform never stores command text, environment values, output or file names, so none of them can appear here.

Was this page helpful?