Reference
Errors
Every error the API returns, what causes it, and what to do next. The type URI in any problem document links straight to its entry here.
The shape of every error · RFC 9457
{
"type": "https://docs.sidelineexchange.com/errors/invalid_parameter",
"title": "Invalid parameter",
"status": 400,
"detail": "team must be a tm_ id.",
"errors": [
{ "index": 3, "path": "/observations/3/data/start", "message": "must end in Z" }
]
}type is stable and safe to switch on — the message is not.
detail is written for a person and may change; never parse it.
errors appears on batch validation, with the index and JSON pointer of each rejected observation.
| Code | Status | Cause |
|---|---|---|
| empty_upload | 400 | The uploaded file has no content. |
| feed_disabled | 400 | The feed exists but is switched off, and a disabled feed does not accept uploads. |
| invalid_batch | 400 | Either the batch envelope does not conform to OYSS, or no observation inside it was valid. |
| invalid_connector | 400 | The connector definition names a parser that is not registered, or is missing something that parser requires. |
| invalid_cursor | 400 | The cursor could not be decoded: it was truncated, hand-edited, or belongs to a different query. |
| invalid_json | 400 | The request body is not parseable JSON. |
| invalid_parameter | 400 | A query parameter was the wrong shape — an id with the wrong prefix (`team` must be a `tm_` id), an unparseable date, an unknown status, or no filter at all where at least one is required. |
| invalid_state | 400 | A state filter or transition named a value outside the vocabulary. |
| missing_idempotency_key | 400 | A push arrived without an `Idempotency-Key` header. |
| not_configured | 400, 501 | The feature is behind configuration that this environment does not have — a cloud-only service with no local implementation. |
| not_drifted | 400 | Accept-new-shape was called on a connector that is not currently holding a drifted run. |
| not_uploadable | 400 | The target is a connector, and a connector reads its own source. |
| unknown_source | 400 | The batch names a source key that is not registered for this account in this mode. |
| validation_failed | 400 | The request body did not satisfy the endpoint’s schema. |
| invalid_credentials | 401 | The email and password did not match. |
| invalid_token | 401 | The session token is expired, revoked, or was issued by a different environment. |
| unauthorized | 401 | No API key was presented, or the key is unknown, revoked, or belongs to a suspended account. |
| account_suspended | 403 | The account has been suspended, with a reason recorded at the time. |
| operator_only | 403 | The endpoint belongs to the operator role — the network-wide views: connectors, the review queue, the accounts directory — and the caller is a partner account. |
| publishable_key | 403 | A publishable key (`pk_…`) was used for something publishable keys cannot do: pushing observations, uploading a feed file, or a bulk export. |
| not_found | 404 | No entity with that id exists in this mode. |
| conflict | 409 | The change collides with something already there — a name or key that has to be unique, or a state that has moved since you read it. |
| email_taken | 409 | An account already exists for that email address. |
| review_decided | 409 | The item has already been approved or rejected. |
| review_not_approved | 409 | Undo was called on an item that was never approved, so there is no merge to reverse. |
| review_stale | 409 | The review item changed after you loaded it — usually because another operator decided it first. |
| review_unmergeable | 409 | The proposed merge cannot be applied — typically because one side has since been merged into something else, so approving would build a chain. |
| payload_too_large | 413 | The body exceeds the limit for the endpoint, or a batch carries more than 1,000 observations. |
| too_many_attempts | 429 | Repeated failed sign-in attempts from the same origin. |