# Errors and limits

## Error codes

Over MCP, an error comes back as a tool result with `isError: true` and the JSON below, so the agent can read it and recover. Over REST it's the response body, with the HTTP status.

| Code | HTTP | Meaning |
| --- | --- | --- |
| `invalid_input` | 400 | The input doesn't match the schema, or a value isn't allowed (an unknown stage or custom field). The message says which. |
| `unauthorized` | 401 | No valid token or key. Reconnect, or check the key. |
| `payment_required` | 402 | The workspace has no active subscription, so it's read-only. Reading and exporting still work. |
| `forbidden` | 403 | The connection's scopes don't allow this, or it's a people-only action. |
| `not_found` | 404 | No such record in this workspace. |
| `conflict` | 409 | The change clashes with existing data (a duplicate domain on another company, say). |
| `rate_limited` | 429 | Too many calls; the hint says when to retry. |

```json
{ "error": { "code": "invalid_input", "message": "…", "hint": "…" } }
```

Unexpected server errors return `internal` without details; they are logged and retrying may help.

## Limits

- Tool inputs have per-field limits (for example, a task title is at most 200 characters, a signal's why-now at most 280); each tool's page lists them.
- List tools page with `limit` (usually up to 100) and `next_cursor`.
- CSV imports take up to 10,000 rows per file.
- Workspaces provided through a partner plan (such as the Founder Kit) have plan limits: 25,000 people, 10,000 companies, 3 members, 60 agent calls a minute and 20,000 a day per connection, and 12 months of change history.
