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

# Credits

> What a tool call costs, where the spend shows up, and what an empty wallet returns.

**Preview.** Nothing here is new pricing. A tool call costs whatever the
operation behind it costs, on the same wallet as everything else your workspace
does.

## One rule

> A tool call costs whatever the operation behind it costs.

An extraction started from Claude and an extraction started with `POST
/api/v2/extractions` are the same extraction and are charged the same. There is
no MCP surcharge, no separate allowance, and no separate wallet.

| Tool does                                                                           | Costs                           |
| ----------------------------------------------------------------------------------- | ------------------------------- |
| Reads — listing agents, reading a conversation, polling a job, checking the balance | Nothing                         |
| Searches knowledge                                                                  | The retrieval, as anywhere else |
| Ingests, extracts, generates a report, runs an agent                                | The operation's normal price    |

## Where the spend appears

Usage is written to the same `CreditUsageLog` the rest of the platform writes
to, tagged **`source='mcp'`**. So MCP spend is separable from WhatsApp, phone,
website-widget and Runtime API spend in the usage screen, rather than
disappearing into whichever bucket happened to be the default.

<Note>
  That tag is the whole reason the source enum grew. `source` defaults to
  `whatsapp`; a new channel that does not declare its own is invoiced and
  reported as WhatsApp spend, which is wrong on the bill and invisible in the
  one report that would have shown it. The Runtime API's `api` source exists for
  exactly the same reason.
</Note>

## Running out

The billing gate runs **before** any tool that spends — not after, and not
inside the work. When it refuses, you get a tool error, not a fault:

```json theme={null}
{
  "content": [{
    "type": "text",
    "text": "This workspace cannot spend: the credit balance is exhausted."
  }],
  "isError": true
}
```

HTTP **200**. A model reading that can tell you what happened and stop. The REST
API returns **402 `usage_blocked`** for the same condition, and that is the right
answer there — but a 402 reaching a chat client is a transport failure the model
cannot narrate, and a user gets a spinner and a shrug instead of a sentence.

<Warning>
  **Retrying a blocked call will never help.** `usage_blocked` is not a rate
  limit and not a transient fault. Top up, or raise the cap. An agent loop that
  retries on it will burn its turns and report nothing useful.
</Warning>

Read tools keep working while the wallet is empty. You can still list agents,
read conversations and poll jobs — being out of credit stops you starting new
work, not looking at what you have.

## Watching it

Ask the connected client:

> *What is my ImpelLabs credit balance?*

That tool needs `usage:read` and costs nothing. The dashboard's usage screen
carries the same figure with the `mcp` source broken out.

<Card title="Rate limits" icon="gauge" href="/connect/limits" horizontal>
  The other reason a call gets refused, and the one where retrying does help.
</Card>
