Skip to main content

Response format

Xenia does not wrap responses in a status/statusCode envelope. The HTTP status code carries success/failure, and the body shape depends on the endpoint. There is no requestId field.

Success responses

The exact shape depends on the endpoint, but it is always one of these: List / query endpoints (e.g. task catalog, submission records):
Action / write endpoints (e.g. delete user, change role):
User context / login:
Successful writes return HTTP 200, not 201. Read the HTTP status code — do not look for a status: true or statusCode field, they do not exist.

Error responses

Errors return a non-2xx HTTP status with one of these bodies:
Always branch on the HTTP status code, then read error.message for detail.

HTTP status codes

There is no general request rate limiter on the API, so you will not normally see 429. Very large unfiltered queries fail with a 504 from the load balancer at ~60 seconds rather than a timeout body — always scope reporting queries with a date range and page large result sets.

Common errors & solutions

401 — Invalid client credentials

  • The x-client-key / x-client-secret pair is wrong, or the key was deactivated. Re-check the values or create a new key.
Two related 401s: User not found in the workspace (the x-client-user you passed isn’t a member of the key’s workspace) and Client does not belong to this workspace (the {workspaceId} in the path doesn’t match the key’s workspace).
(Workspace is derived from the key — you don’t need a workspace-id header unless the path contains {workspaceId}.)

403 — Forbidden

Two distinct cases share this status:
  1. Route not allow-listed for API keys:
    The endpoint you called isn’t part of the API-key surface. Only the endpoints in this API Reference are reachable with a client key — check the path and method.
  2. Permission denied for the key’s user: the route is allow-listed, but the key’s default user lacks the permission it requires (e.g. CAN_VIEW_REPORTING, CAN_MANAGE_USERS). Assign the key a default user whose role grants the needed access.

404 — Not Found

  • Double-check the path (note reads and reports live under /api/v1/ops/..., user/grid/schedule endpoints under /api/v1/mgt/...) and that the resource ID belongs to the key’s workspace.

400 — Bad Request

  • A required field is missing or a value is malformed (bad UUID, invalid date). Review the endpoint’s request schema.

504 — Gateway Timeout

  • The query didn’t finish within ~60 seconds at the load balancer. Add a fromDate/toDate range, other filters, or page the results with offset/limit.

Best practices

Branch on HTTP status, then read error.message

Validate UUIDs before sending

Scope large queries

Always send a date range and page results to stay under the ~60s limit:
Use meta.totalCount from the response to know when to stop paging.

Getting help

If you encounter persistent errors, gather the request endpoint + method, the full error.message, and your request payload (without secrets), then contact support@xenia.team.

Next steps

Authentication

How client keys and tokens work

Data Extraction

Pull reporting data into BI tools