Error response structure
Error category. See Error types for the full list.
Machine-readable error code (e.g.
external_id_in_use, field_invalid, rate_limit_exceeded).Human-readable summary of the error. Safe to surface to operators or end users.
The field path that caused the error (e.g.
data_points[0].input_value). Present for validation errors and some conflict errors.Link to relevant documentation when the error has a canonical doc anchor.
Unique request identifier. Also returned as the
Cula-Request-Id response header. Include this value when contacting support.Per-field errors for multi-field validation failures. Each entry has
code, param, and message. See Multi-field validation.Present only on
409 external_id_in_use responses. Contains the existing resource’s id and external_id so you can resolve the conflict with a PUT.Error types
| Type | Description |
|---|---|
validation_error | Request body or parameters failed validation |
conflict | Resource state conflict (duplicate external_id, finalised submission) |
not_found | Resource does not exist or is outside the consumer’s scope |
auth_error | Missing, invalid, or expired access token; or consumer not authorized for the requested organisation |
rate_limit | Too many requests — see Rate limits |
internal_error | Server-side failure |
HTTP status codes
| Status | Meaning |
|---|---|
| 200 | Success (GET, PUT) |
| 201 | Created (POST) |
| 204 | No content (DELETE) |
| 400 | Bad request (malformed JSON, missing required fields or headers) |
| 401 | Unauthorized (missing or invalid access token) |
| 403 | Forbidden (consumer not authorized for the requested organisation) |
| 404 | Not found |
| 409 | Conflict |
| 422 | Unprocessable entity (valid JSON, but semantically invalid) |
| 429 | Rate limited |
| 5xx | Server error |
Conflict handling
Duplicate external ID (409)
If youPOST a resource with an external_id that already exists, the server returns 409 with the existing resource reference:
id with PUT to update the resource.
Finalised submission (409)
APUT or PATCH on a resource whose downstream submission has been finalised returns:
Authentication and authorisation errors
Missing organisation header (400)
Every request must include theCula-Organisation-Id header. Omitting it returns:
Unauthorised organisation (403)
If the authenticated consumer is not authorized for the organisation specified inCula-Organisation-Id:
Invalid or expired token (401)
If the access token is missing, malformed, or expired:Idempotency
POST with the same external_id is not idempotent. It returns 409 if the resource already exists, even when the payload matches. To update an existing resource, use PUT.
Multi-field validation
When multiple fields fail validation, the top-levelmessage provides a summary and details[] contains individual field errors:
The
request_id is also returned as the Cula-Request-Id response header on every response, including successful ones. See Request IDs.