The API returns standard HTTP status codes and a consistent JSON error body. On failure, the response body is a single object:
{ "detail": "Short, human-readable explanation of what went wrong." }{ "detail": "Short, human-readable explanation of what went wrong." }Your client should check the response status code (or use response.raise_for_status() in Python's requests) and read detail to understand the failure.
Status codes
| Status | Meaning | What to do |
|---|---|---|
200 | Request succeeded. | Parse the response body. |
400 | The request was malformed. | Fix the request — usually a missing path segment or bad query parameter. |
403 | Authentication or authorization failed. | Confirm your API key is set, correctly formatted, and has access to the resource. |
404 | The requested resource does not exist. | Double-check the slug or data_uuid. |
5xx | Server-side error. | Retry with exponential backoff. If the error persists, contact support. |
Common error bodies
400 — missing path segment on the data endpoint
The sensor data endpoint requires a data_uuid in the URL. Requesting /public/deployment/data/ (without a UUID) returns a 400 rather than a 404.
{ "detail": "Detail not found. You likely forgot to include a /data_uuid in your URI." }{ "detail": "Detail not found. You likely forgot to include a /data_uuid in your URI." }Fix: append the deployment's data_uuid to the URL — see Fetching sensor data.
403 — missing or invalid API key
Returned when the Authorization header is missing, malformed, or references a deleted key.
{ "detail": "There was a problem authenticating your request. It is possible that you have a badly formatted or missing API key." }{ "detail": "There was a problem authenticating your request. It is possible that you have a badly formatted or missing API key." }Fix:
- Confirm the header exists and uses the
Bearerscheme:Authorization: Bearer YOUR_API_KEY. - Confirm the key hasn't been deleted from your user settings.
- Check for trailing whitespace or accidental quoting around the key.
404 — deployment not found
Returned when a slug or data_uuid doesn't match any deployment you have access to. Private deployments you don't own or collaborate on behave the same as deployments that don't exist — both return 404.
{ "detail": "Not found." }{ "detail": "Not found." }Retries
For 5xx responses, retry with exponential backoff (e.g. 1s, 2s, 4s) and a maximum of 3–5 attempts. For 4xx responses, do not retry — the request is broken and will keep failing until you change it.
Requests are idempotent: retrying a GET is always safe.