Skip to content

Rate limits & errors

When something goes wrong, CXGear prefers a clear error over a silent failure. This page helps integrators and admins read those responses and decide what to do.

Most JSON error bodies include at least:

FieldMeaning
error or messageHuman-readable explanation
errorCodeMachine-stable code when applicable (for example PLAN_LIMIT)

Always log the status code, errorCode, and message. Retry logic should depend on the code, not only on “request failed.”

Your organization hit a subscription limit.

PropertyTypical value
errorCodePLAN_LIMIT
HTTP status403
MeaningAction blocked by plan meters (projects, jobs/month, users, API keys, …)

Example situations:

  • Creating a second project on Trial
  • Starting a job when monthly jobs are exhausted
  • Creating an API key when the key cap is reached
  • Triggering a spinner via the public API when records/month is full

What to do: open Billing → Usage, free capacity, or upgrade. Do not retry in a tight loop — the limit will not clear until usage or plan changes (monthly meters also reset on the 1st).

See When a limit is hit.

Screenshot needed
Billing usage meters with one meter at the limit.
Where: User menu → Billing
Save as: src/assets/screenshots/10-billing-usage.png

Interactive clients use user JWTs tied to a single active session.

SymptomMeaningWhat to do
Session expiredToken or session timed outSign in again
Session revokedLogout, password reset, or admin actionSign in again
Session replacedSame account signed in elsewhereExpected under single-session policy
Token invalid / missingBad or absent Authorization headerRefresh login or fix the client

The web app maps these to friendly banners on the login screen (for example “Your session has expired. Please sign in again.”).

For automation, do not use user JWTs. Use organization API keys so a person signing in on another device does not break your CRM integration.

Session conflict details: Single active session.

StatusMessage patternCause
401Invalid API keyMissing/wrong/revoked key
403Key missing ingest scopeKey lacks ingest
403Key missing trigger scopeKey lacks trigger
403PLAN_LIMITPlan meter full
404Data table / spinner not foundWrong id or not published
400Invalid bodyJSON shape wrong
400SCHEMA_MISMATCHIngest columns do not match table
400NO_SCHEMATable has no schema yet — import CSV first
CodeUsual meaning in CXGear
200Success (read or update)
201Created (for example job from trigger)
400Bad request — fix the payload
401Not authenticated — sign in or fix API key
403Authenticated but not allowed (permission or plan)
404Resource not found or not visible to this org
409Conflict (for example session already active on another device)
429Too many requests — slow down (platform rate limit)
500Unexpected server error — retry with backoff; check status/logs

403 is overloaded on purpose: it can mean “your role cannot do this” or “your plan cannot do this.” Read errorCode and the message to tell them apart.

FailureWho can fix it
Missing permission (role)Admin grants a role or permission
PLAN_LIMITAdmin upgrades or frees usage

A user with full Admin permissions can still receive PLAN_LIMIT on Trial.

The API applies general HTTP rate limiting to protect the platform. If you receive 429:

  1. Back off (wait, then retry with jitter)
  2. Batch ingest records (up to 500 per request) instead of one row per call
  3. Prefer spinner schedules over aggressive external polling

Plan meters are not the same as HTTP rate limits. Hitting 50 jobs/month on Trial is PLAN_LIMIT, not 429.

  • Integrators branch on errorCode, not only status text
  • PLAN_LIMIT routes humans to Billing
  • Session errors send people to login, not into a crash loop
  • Automation uses API keys and handles 401/403/400 explicitly
ProblemLikely causeWhat to do
Treating PLAN_LIMIT as 500Ignoring errorCodeMap 403 + PLAN_LIMIT to upgrade UX
Script breaks when user logs in elsewhereUsing JWT in middlewareSwitch to org API key
Endless retriesRetrying non-idempotent limit errorsStop on PLAN_LIMIT and 400
SCHEMA_MISMATCH in productionCRM field renameAlign columns or update table