> ## Documentation Index
> Fetch the complete documentation index at: https://docs.boat.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Billing details

> Plan time versus credit packs, per-sandbox usage, and what happens when you run out.

<video controls playsInline preload="metadata" poster="/videos/billing.jpg" src="https://mintcdn.com/ariana-1e97e6c3/GM_ek11Akew5pcll/videos/billing.mp4?fit=max&auto=format&n=GM_ek11Akew5pcll&q=85&s=c9deb02310fcd0f12f141e528bc5f0c6" className="w-full aspect-video rounded-xl" data-path="videos/billing.mp4" />

Prices, sizes and plans are on the [Pricing](/pricing) page. This page is the mechanics underneath.

## Plan time vs credit packs

Your two pools work differently, and the difference only shows up at renewal:

* **Plan time** is granted fresh at the start of every billing month and expires at the end of it. Whatever you did not spend is **not** carried forward and is not converted into credits.
* **Credit packs** (\$20 buys 2,000,000 seconds) never expire and carry over month to month.

**Plan time is always spent first.** Credits are only drawn once a month's plan time is exhausted, and once drawn they are gone for good. The next renewal restores your plan time but never refills your credits.

So a \$20/month subscriber who also bought one \$20 pack, and used 2.5M seconds in a month, ends that month having spent all 2M seconds of plan time plus 500,000 seconds of credit. They start the next month with 2M fresh plan seconds and 1.5M credit seconds remaining.

Check your balance any time:

<CodeGroup>
  ```bash CLI theme={null}
  boat limits
  boat limits --json
  ```

  ```bash curl theme={null}
  curl -sS "$BOAT_API_BASE/limits" \
    -H "Authorization: Bearer $BOAT_API_KEY"
  ```

  ```ts TypeScript theme={null}
  const limits = await sandbox.limits();
  console.log(limits.canStart, limits.starts?.day?.remaining, limits.creditBalanceHours, limits.packBalanceDollars);
  ```

  ```python Python theme={null}
  limits = sandbox.limits()
  day = getattr(limits.starts, "day", None)
  print(limits.can_start, getattr(day, "remaining", None), limits.credit_balance_hours, limits.pack_balance_dollars)
  ```
</CodeGroup>

See [Get Boat limits](/api/reference/account/get-boat-limits) for every field.

## Per-sandbox usage

Every sandbox meters its own machine time, so a platform that gives each of its users or agents a sandbox can bill them from the same numbers your balance drains by. Read one sandbox at any time, running or stopped:

<CodeGroup>
  ```bash CLI theme={null}
  boat usage bx_23456789
  boat usage bx_23456789 --since 2026-09-01 --until 2026-10-01
  boat usage bx_23456789 --json
  ```

  ```bash curl theme={null}
  curl -sS "$BOAT_API_BASE/sandboxes/bx_23456789/usage?since=2026-09-01T00:00:00Z&until=2026-10-01T00:00:00Z" \
    -H "Authorization: Bearer $BOAT_API_KEY"
  ```

  ```ts TypeScript theme={null}
  const usage = await sandbox.usage({ sandboxId: "bx_23456789", since: "2026-09-01T00:00:00Z", until: "2026-10-01T00:00:00Z" });
  console.log(usage.seconds, usage.dollars, usage.running);
  ```

  ```python Python theme={null}
  usage = sandbox.usage("bx_23456789", since="2026-09-01T00:00:00Z", until="2026-10-01T00:00:00Z")
  print(usage.seconds, usage.dollars, usage.running)
  ```
</CodeGroup>

`seconds` is billable machine time with the sandbox type's multiplier already applied, so a `large` sandbox that ran ten minutes reads 1200, and `dollars` is that at list price (`seconds / secondsPerDollar`). Stopped time is never counted, time past a [refused stop](/snapshots#when-a-stop-is-refused) is excluded, and a running sandbox keeps growing until it stops, which `running` tells you (`false` also while a refused stop holds the meter paused). Omit `since` and `until` for the sandbox's whole life; a billing period boundary that falls inside a running stretch splits it pro rata. See [Get boat usage](/api/reference/sandboxes/get-sandbox-usage) for every field.

## Organizations

A team shares one plan and balance through an organization. Everything else on this page applies to it the same way. Members, the active wallet, shared sandboxes, per-member caps and moving a personal plan in are on [Organizations & teams](/organizations).

## Running out

When your balance reaches zero you get a **24 hour grace period**, whether or not auto-pay is on. Your sandboxes keep running and you are alerted by email, so you can top up before anything stops. If the window passes without payment, running sandboxes are stopped with a snapshot. Nothing is lost; resume them after topping up.

To never hit that stop, enable **auto-pay** in the billing dashboard. It charges your saved card in small automatic increments when you run out, drawing from any prepaid balance on your account first.

If a monthly renewal payment fails while you still have credits, your sandboxes stay up until the credits run out.

Because sandboxes keep running through the grace period, you can end up using a little more machine time than you had. `creditBalanceSeconds` stops at zero and reads `0` while that is outstanding; the shortfall is carried and settled on your next payment, so the seconds you consumed are the seconds you pay for.

## Related

* [Pricing](/pricing)
* [Organizations & teams](/organizations)
* [Build a Platform on Boat](/platform-guide)
* [FAQ](/faq)
* [Long-Running Tasks](/long-running-tasks)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.