error field provides a human-readable description.
Response format
Every error response has this shape:data field instead:
error and data fields are mutually exclusive — only one will be present.
HTTP status codes
4xx Client errors
| Code | Name | When it occurs |
|---|---|---|
400 | Bad Request | Invalid request body, missing required fields, or validation failure |
401 | Unauthorized | Missing or invalid session cookie / bot token |
403 | Forbidden | Valid credentials but insufficient permissions for the resource |
404 | Not Found | Requested resource does not exist or is not visible to the caller |
409 | Conflict | Creating a resource would violate a uniqueness constraint |
410 | Gone | Resource existed but is intentionally no longer available (e.g. expired invite) |
429 | Too Many Requests | Rate limit exceeded |
5xx Server errors
| Code | Name | When it occurs |
|---|---|---|
500 | Internal Server Error | Unexpected server-side failure |
Common error messages
400 Bad Request
401 Unauthorized
Returned when a protected endpoint is accessed without a valid session or token.403 Forbidden
404 Not Found
409 Conflict
410 Gone
Returned for invite links that are no longer valid. Unlike 404, this means the resource once existed but is intentionally unavailable.429 Too Many Requests
Rate limit exceeded. The response includes aRetry-After: 1 header.
500 Internal Server Error
Handling errors
| Status | Action |
|---|---|
| 400 | Fix the request — do not retry as-is |
| 401 | Re-authenticate, then retry |
| 403 | Do not retry — user lacks permission |
| 404 | Do not retry — resource does not exist |
| 409 | Resolve the conflict (e.g. pick a different name) |
| 410 | Do not retry — resource is permanently gone |
| 429 | Wait then retry with exponential backoff (start at 1 second) |
| 500 | Retry with exponential backoff |
error string is safe to display directly in a UI. For internationalization, match specific error strings to localized messages.
