# Usage and billing on the OpenAI-compatible API

> How token usage is mapped per endpoint, and what happens when a workspace is suspended.

## Usage shapes

`usage` reflects real model token consumption for the turn, mapped into the
OpenAI-compatible shape for whichever endpoint you called:

| Endpoint | Usage shape |
|---|---|
| `POST /v1/chat/completions` | `{ prompt_tokens, completion_tokens, total_tokens }` |
| `POST /v1/responses` | `{ input_tokens, output_tokens, total_tokens }` |

```jsonc
// Responses API
"usage": { "input_tokens": 812, "output_tokens": 143, "total_tokens": 955 }

// Chat Completions
"usage": { "prompt_tokens": 812, "completion_tokens": 143, "total_tokens": 955 }
```

## Metered like everything else

Every turn made through the API is metered through the same path as the
dashboard and the email/chat channels — API usage counts against the
workspace's normal budget and suspension rules. There's no separate "API
plan"; it's the same spend as any other surface.

## Suspended or out-of-credit workspaces

If the workspace is suspended or out of credits, a request fails **before
running** with:

```json
{ "error": { "message": "...", "type": "insufficient_quota", "param": null, "code": "insufficient_quota" } }
```

which the OpenAI SDK raises as `PermissionDeniedError` (HTTP `403`). See the
[Errors](/openai-api/errors/) table for the full list of error conditions.