# Errors and limits

> The typed errors a tool returns, what each one costs, and the rate limits.

When a tool cannot answer, it returns a typed error in the result's structured content, with a `message`, `meta` and `hints`. Your agent can act on the type without reading the message.

## Tool errors

| Error | Charged | What it means, and what to do |
| --- | --- | --- |
| `BudgetExceeded` | No | The estimate (`est_credits`) is above your `max_credits`. Raise the cap or ask for less |
| `InsufficientCredits` | No | The balance is below the estimate. Stop and top up |
| `NoData` | 1 credit | The provider has nothing for this input. Do not retry the same input |
| `InvalidTarget` | No | The input is wrong: a bad domain, a bad parameter or a stale cursor. `target` names it. Fix it and retry |
| `ProviderUnavailable` | No | A provider is down or slow. Retry after `retry_after_s` |
| `ConcurrencyLimit` | No | Too many of your own calls at once. Retry after `retry_after_s`, and send fewer in parallel |
| `TaskPending` | No | An async task is still running. Call [`get_task`](https://www.manifoldmcp.com/docs/tools#async-tasks) again after `poll_after_s` |
| `TaskFailed` | No | An async task failed. The message says why |

`TaskPending` is not marked as an error, because nothing went wrong. Every other type is.

## Rate limits

- **Requests.** About 120 requests a minute per workspace, counted in each Cloudflare data centre separately, so the limit is approximate. A request over it gets HTTP 429 with `retry-after: 60`.
- **Calls in flight.** One call at a time per provider family per workspace. The search tools, the people and company tools, and the social tools are separate families, so one of each can run at once. Extra calls wait up to 30 seconds for a turn, then return `ConcurrencyLimit`.

## Sign-in errors

A missing, unknown or expired credential gets HTTP 401 before any tool runs. See [Authentication](https://www.manifoldmcp.com/docs/authentication#when-a-request-is-refused).

