# Billing and limits

What a request costs, what a free account gets, and the rate limits.

## Billing

Sai is credit-based. Each task draws credits from your account. The computer and the model are included; you do not bring your own model keys and there is nothing to configure.

- **Free accounts** get one pooled Windows cloud computer, a daily time limit on it, and a daily credit grant. Phone verification is required before the first API key. The exact daily figures are shown in the portal.
- **Paid accounts** get their own computers, a larger credit balance and top-ups.

Upgrade at [platform.simular.ai](https://platform.simular.ai).

## Check your balance

`GET /v1/agents/account` returns the plan and the credit a task can spend right now.

```bash
curl -s "$SAI_API_URL/v1/agents/account" \
  -H "Authorization: Bearer $SAI_API_KEY"
```

```json
{
  "userId": "3fA9kQ2xYz",
  "userState": "active",
  "plan": {
    "id": "sai_subscription",
    "title": "Sai Subscription",
    "free": false,
    "unlimited": false
  },
  "credits": { "usd": 12.4 },
  "authType": "apiKey"
}
```

`credits` is `null` when Billing cannot be reached, and `credits.usd` is `null` on the unlimited plan. When a task ends with an insufficient-credits error, this call tells you whether to top up or wait for the free plan's daily grant. See [Account](/documentation/api-reference/account).

## When you run out

A task that stops for lack of credits or computer time ends with an `error` or `tool-output-error` event carrying a `code`:

| `code`                         | What happened                                                                                                                | What to do                                                                                     |
| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
| `insufficient_credits`         | No spendable credit. The event's `resetsAt` is the next UTC midnight, when a free account's daily credits refresh.           | Free: wait for `resetsAt`. Paid: top up at [platform.simular.ai](https://platform.simular.ai). |
| `free_computer_time_exhausted` | The free plan's daily computer time is spent and the workspace shut down. It resets daily; the Sai app shows the local time. | Free: come back tomorrow, or upgrade. Do not retry today.                                      |

```json
{
  "type": "error",
  "errorText": "insufficient_credits: your free credits for today are used up.",
  "code": "insufficient_credits",
  "resetsAt": "2026-09-30T00:00:00.000Z"
}
```

Neither error is retryable today. Stop the loop, report it, and check `GET /account` if you want the numbers. See [Events](/documentation/api-reference/events#error-codes).

## Models

Each task runs on the session's model. The default, `auto`, lets Sai pick. `GET /v1/agents/models` lists the catalog with an `allowed` flag per plan; the free plan is limited to an allowlist. Pass `model` on `POST /message` to change it. See [Models](/documentation/api-reference/models).

## Rate limits

Limits apply per account on a rolling one-hour window, shared across every client (API keys, the CLI, the desktop app). Exceeding one returns `429` with an `error` string. Back off and retry after a minute.

| Action               | Limit                                    |
| -------------------- | ---------------------------------------- |
| `POST /message`      | 60 per hour                              |
| `POST /upload`       | 30 per hour, 25 MB per file              |
| `POST /abort`        | 20 per hour                              |
| `POST /new-session`  | 20 per hour                              |
| `POST /approve`      | 20 per minute                            |
| `POST /account/keys` | 5 per hour                               |
| `GET /events`        | 1200 per hour; `wait` at most 60 seconds |

Polling `/events` with `wait=0` in a tight loop hits its limit in twenty minutes. Long-poll with `wait=30` or more and the same hour costs about a hundred calls.

## Key limits

| Plan | Live keys per account |
| ---- | --------------------- |
| Free | 1                     |
| Paid | 20                    |

Creating a key past the limit returns `422`. Revoke one in the portal first.

## Storage

Uploads count against your account's file storage. When it is full, `POST /upload` returns `409` with `{ "error": "storage_quota_exceeded" }`. The quota is shown in the portal.
