Error response shape
detail stays a string and the per-field errors are attached under details.errors:
Status codes
Idempotency
Several endpoints are idempotent by design:POST /api/v1/manifests— samemanifest_hashreturns the existingmanifest_idwith"is_new": falseand"action": "deduped".POST /api/v1/skills/sync— returns per-batch counts,{"status": "ok", "created": 2, "updated": 1, "unchanged": 5}; unchanged skills fall intounchanged, changes auto-create a new version.POST /api/v1/traces— duplicatetrace_idreturns the existing trace.
Rate limits
Rate limits are applied per API key, using one token bucket that covers the whole API surface — there is no separate ingest budget. The bucket is sized from the key’s organization plan:
When you hit a limit, responses include:
Retry-After automatically. If you’re calling the API directly, sleep for the indicated number of seconds before retrying.
Reporting an issue
For 5xx errors or unexpected behavior, include theX-Request-ID response header when filing a support ticket — it lets us look up the failing request in logs.