Skip to main content
The DecimalAI API uses standard HTTP status codes and returns structured JSON error bodies.

Error response shape

For validation errors raised by Pydantic, 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 — same manifest_hash returns the existing manifest_id with "is_new": false and "action": "deduped".
  • POST /api/v1/skills/sync — returns per-batch counts, {"status": "ok", "created": 2, "updated": 1, "unchanged": 5}; unchanged skills fall into unchanged, changes auto-create a new version.
  • POST /api/v1/traces — duplicate trace_id returns the existing trace.
Re-running these is safe and will not double-count toward your quota.

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:
The SDK respects 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 the X-Request-ID response header when filing a support ticket — it lets us look up the failing request in logs.