Reference
Status Codes

Status Codes

The API uses standard HTTP status codes to indicate success or failure.


Success

CodeMeaning
200 OKRequest succeeded. Used for GET, DELETE, and most mutations.
201 CreatedResource created (e.g. file uploaded or pin added).

Client errors

CodeMeaning
400 Bad RequestInvalid request body, query, or parameters. For token/2FA flows: code: 2fa_required or 2fa_invalid.
401 UnauthorizedMissing or invalid API key or Bearer token.
403 ForbiddenNot allowed: plan limit, disabled account, or token missing required scope (code: missing_scope, required).
404 Not FoundResource not found (e.g. CID not found for pin or delete).
409 ConflictConflict with current state (e.g. duplicate token name).
413 Payload Too LargeUpload exceeds allowed file size.
429 Too Many RequestsRate limit exceeded. Use Retry-After or body retryAfter to retry. See Rate limits.

Server errors

CodeMeaning
500 Internal Server ErrorUnexpected server error. Retry with backoff.
503 Service UnavailableService temporarily unavailable (e.g. maintenance or dependency issue). Retry later.

Checking status in code

JavaScript (fetch)

const res = await fetch(url, { headers: { 'X-API-Key': API_KEY } });
 
if (res.ok) {
  const data = await res.json();
  return data;
}
 
switch (res.status) {
  case 401:
    throw new Error('Invalid or missing API key');
  case 403:
    throw new Error('Forbidden — check scopes or plan');
  case 429:
    throw new Error(`Rate limited. Retry after ${res.headers.get('Retry-After')}s`);
  default:
    throw new Error(res.statusText);
}

JavaScript (axios)

try {
  const { data } = await axios.get(url, {
    headers: { 'X-API-Key': API_KEY },
  });
  return data;
} catch (e) {
  if (e.response?.status === 401) throw new Error('Invalid API key');
  if (e.response?.status === 429) throw new Error('Rate limited');
  throw e;
}

Next steps