Reference

Errors and limits

Problem details, the status codes you will meet, rate limits, idempotency, pagination bounds and how to handle each in code.

Last updated

Error shape

Errors follow RFC 9457 problem details.

422 Unprocessable Entity
{
  "title": "Unprocessable Entity",
  "status": 422,
  "detail": "validation failed",
  "errors": [ { "location": "body.inbox_id", "message": "required property is missing" } ]
}
StatusMeaningDo
400Malformed request or JSON.Fix the request; do not retry as is.
401Missing, invalid, expired or revoked credential.Re-authenticate; check the key was not revoked.
403Valid credential without the permission; detail names it.Add the permission to the key, or use another credential.
404Not found, or not visible to this caller.Ids from another workspace look like 404 by design.
409Conflict: duplicate identity, app already installed, stale update.Read the existing object and update instead.
422Validation, a plugin or app veto (reason in detail), or a search that was too broad.Show the reason; narrow the request.
429Rate limit; Retry-After in seconds.Wait and retry with backoff.
5xxServer error.Retry with the same Idempotency-Key.

A retry helper

export async function call(input: RequestInfo, init: RequestInit = {}, attempt = 0): Promise<Response> {
  const res = await fetch(input, init);
  if ((res.status === 429 || res.status >= 500) && attempt < 5) {
    const wait = Number(res.headers.get("retry-after")) * 1000 || Math.min(30_000, 500 * 2 ** attempt);
    await new Promise((r) => setTimeout(r, wait));
    return call(input, init, attempt + 1); // safe: writes carry an Idempotency-Key
  }
  return res;
}

Limits

LimitValue
Requests per minute per API key600
Requests per minute per workspace3000
Requests per minute per IP, unauthenticated300, stricter on login and password reset
List page sizelimit up to 100; search up to 50
Message content20 000 characters
Idempotency window24 hours; same key with a different body is 422
Synchronous app hook timeout3 s default, 10 s maximum
Webhook retriesAfter 1 min, 5 min, 15 min, 1 h, 4 h, 8 h and 12 h, then failed
Bot delivery retriesAfter 30 s, 2 min and 10 min, then failed
Bot typing indicator20 a minute per conversation
Rule runs per conversationmax_runs_per_hour, default 20 (1 to 100)
"Replay all failed"The oldest 100 per call, once a minute per webhook, bot or rule
Manifest size256 KiB

Redaction

Fields the caller may not see are masked or omitted and listed under _redacted, for example ["items.3.emails", "items.3.phones"]. Treat a listed path as "exists but hidden", not as empty.

Every claim on these pages is covered by a test in the repository, and the API reference is generated from the same contract every server serves at /api/openapi. Corrections to [email protected].