Skip to content
Open app

Errors & rate limits

Every CRM Solid Public API response is JSON. Successful calls return a 2xx status with the resource payload; failed calls return a 4xx or 5xx status with a standard error envelope.

CodeMeaningWhen it happens
200OKThe request succeeded and the response body contains the resource.
201CreatedA new resource was created (e.g. POST /v1/contacts, POST /v1/deals, POST /v1/tasks).
202AcceptedA Telegram message job was accepted and queued for background delivery (POST /v1/telegram/messages).
400Bad RequestThe request body or query parameters failed validation (e.g. none of name, username, or phone supplied; text over 4000 characters; creating a deal already won/lost).
401UnauthorizedThe Authorization: Bearer token is missing or invalid.
403ForbiddenThe API key is valid but lacks the scope required by the operation (e.g. contacts:write).
404Not FoundThe resource does not exist or is not owned by the calling workspace.
429Too Many RequestsThe per-key rate limit was exceeded. See Rate limits.
5xxServer ErrorAn unexpected server-side error (internal_error). Safe to retry with backoff.

All error responses share the same envelope (components/schemas/Error):

  • error — machine-readable code, one of bad_request, not_found, conflict, unauthorized, forbidden, rate_limited, internal_error.
  • message — human-readable explanation.
  • details — optional structured context (e.g. field-level validation errors); null when not present.
{
"error": "forbidden",
"message": "scope contacts:write is required"
}

A validation failure looks like:

{
"error": "bad_request",
"message": "at least one of name, username, phone is required"
}

Rate limits are applied per API key. Every response includes the following headers so you can track your remaining budget:

HeaderDescription
X-RateLimit-LimitMaximum requests allowed per minute for this key.
X-RateLimit-RemainingRequests remaining in the current window.
X-RateLimit-ResetUnix timestamp (seconds) when the rate-limit window resets.

When a key exceeds its limit, the API returns 429 with the rate_limited error code:

{
"error": "rate_limited",
"message": "rate limit exceeded"
}