Error codes

Every non-2xx response carries a machine-readable code and a human message:

Error shape
{
  "ok": false,
  "error": {
    "code": "document_required",
    "message": "The template has a DOCUMENT header; pass document: { url, filename }."
  },
  "request_id": "req_abc123"
}

The SDK throws a typed BluetickedError exposing code, status, and requestId — include the request id when contacting support.

Codes

CodeMeaning
unauthorizedMissing key, revoked key, or malformed Authorization header.
forbiddenThe API key exists but does not have the required scope.
not_foundThe requested contact, template, message or campaign does not exist.
validation_failedThe request shape is valid JSON but fails business validation.
rate_limitedThe workspace or key exceeded a rate limit.
idempotency_conflictThe same Idempotency-Key was reused with a different body.
method_not_allowedThe endpoint does not support the attempted HTTP method.
channel_unavailableThe requested provider channel is disconnected or not ready.
document_invalidThe document parameter is malformed: url must be https and filename at most 240 characters.
document_requiredThe template has a DOCUMENT header; pass document: { url, filename }.
document_not_applicableA document was supplied but the template has no DOCUMENT header (or the send is not a template send).
document_source_invalidThe campaign document_source is malformed; check mode, field_key, filename_template and missing_policy.
document_source_requiredThe campaign template has a DOCUMENT header; pass a document_source.
document_source_not_applicableA document_source was supplied but the campaign template has no DOCUMENT header.
internal_errorBlueticked accepted the request but hit an internal failure.

Rate limits

Each key has a per-minute limit (default 120, configurable per key up to 10,000). 429 responses include x-ratelimit-limit, x-ratelimit-remaining and x-ratelimit-reset headers; the SDK retries them automatically with backoff.