All API errors follow a consistent JSON format:
"message": "Human and agent-readable description.",
"action_url": "https://app.skillett.dev/..."
The action_url field (when present) provides a direct link to resolve the issue.
| Error | Message | Resolution |
|---|
bad_request | Varies by context | Check request body and parameters |
| Error | Message | Resolution |
|---|
unauthorized | Missing or invalid authorization. | Include Authorization: Bearer sk_xxx header |
api_key_invalid | Invalid API key. | Check your key is correct and not truncated |
api_key_revoked | This API key has been revoked. | Create a new API key on the dashboard |
api_key_expired | This API key has expired. | Create a new API key on the dashboard |
token_expired | Token expired and refresh failed. Please reconnect. | Run skillett connect <integration> to re-authorize |
| Error | Message | Resolution |
|---|
forbidden | Varies by context | Check permissions |
integration_not_connected | The user needs to connect their {slug} account first. | Run skillett connect <slug> or visit action_url |
scope_not_allowed | API key does not have access to the {slug} integration. | Create a new key with broader scopes |
plan_limit_reached | Plan limit reached: maximum {limit} {resource}. | Upgrade your plan at action_url |
| Error | Message | Resolution |
|---|
not_found | {resource} not found. | Check the resource identifier (slug, ID, endpoint name) |
| Error | Message | Resolution |
|---|
conflict | Varies by context | Resource already exists or state conflict |
| Error | Message | Resolution |
|---|
daily_limit_reached | Daily API call limit reached ({limit}). Resets at midnight UTC. | Wait for reset or upgrade plan at action_url |
| Error | Message | Resolution |
|---|
internal | Varies | Retry the request. If persistent, contact support. |