ghostAPIv1 beta
Get started

Errors and rate limits

Errors share one JSON shape. Branch on code and the HTTP status; internal failure details are never returned.

{
  "defined": false,
  "code": "UNAUTHORIZED",
  "status": 401,
  "message": "missing"
}

defined is true when the error is one a procedure declares. Validation errors may carry a data object describing the failing fields.

StatusMeaning
400Invalid input, wrong value type, archived definition, self-merge, or a capability that is not configured.
401Missing or invalid key.
403Disabled or expired key, no membership, paused workspace access, missing scope or role, or a restricted module.
404Unknown route, or a record that does not exist in this workspace. Read collections at /data/{resource}, such as /data/icps; records at /data/{resource}/{id}. Discover operation names and input schemas at /capabilities, then use /query for reads or /operations for writes and paid work.
409Slug collision, idempotency-key conflict, or a retryable transaction conflict.
429Rate limit exceeded. Respect Retry-After.
500Infrastructure failure. Retry writes with the same Idempotency-Key.

Rate limits

300 requests per minute per key and 1,000 per minute per workspace. Successful checks expose X-RateLimit-Limit and X-RateLimit-Remaining; a 429 adds Retry-After in seconds. If the limiter is unavailable the API fails open and omits the headers.

Background operations have a separate ceiling: at most 5 active per key and 20 per workspace.