Error Reference
All Lathe Studio API errors follow a consistent envelope format, making them easy to handle programmatically.
Error Envelope#
Every 4xx and 5xx response returns JSON with this shape:
{
"error": "invalid_request",
"message": "The 'name' field is required.",
"details": {
"field": "name"
}
}
| Field | Type | Description |
|---|---|---|
error | string | Machine-readable error code. Use this for programmatic handling. |
message | string | Human-readable description. Safe to display to end users. |
details | object | null | Optional. Additional context such as the specific field that failed validation, limit values, etc. |
HTTP Status Codes#
| Status | Error Code | When It Occurs |
|---|---|---|
| 400 | invalid_request | Request body or parameters are malformed or missing required fields |
| 401 | unauthorized | Missing, malformed, or revoked API key |
| 403 | forbidden | API key lacks the required scope for this operation |
| 404 | not_found | Resource does not exist, or the key cannot access it |
| 409 | conflict | Request conflicts with existing state (e.g. duplicate idempotency key with different body) |
| 422 | unprocessable | Request is well-formed but semantically invalid (e.g. release_id references a non-existent release) |
| 429 | rate_limit_exceeded | Monthly or per-minute rate limit exceeded |
| 500 | internal_error | Unexpected server error |
| 503 | service_unavailable | Planned maintenance or temporary outage |
Error Examples#
400 — Missing required field
{
"error": "invalid_request",
"message": "The 'name' field is required.",
"details": {
"field": "name"
}
}
401 — Invalid API key
{
"error": "unauthorized",
"message": "Invalid or expired API key. Check your Authorization header."
}
Check that your header is formatted as Authorization: Bearer pt_live_... (with a space after Bearer).
403 — Missing scope
{
"error": "forbidden",
"message": "This API key does not have the 'builds:create' scope.",
"details": {
"required_scope": "builds:create"
}
}
Create a new API key with the required scopes. Scopes cannot be added to existing keys.
404 — Resource not found
{
"error": "not_found",
"message": "Build not found."
}
The resource either doesn't exist or belongs to a different organization. Verify the ID.
422 — Semantic validation error
{
"error": "unprocessable",
"message": "The specified release_id does not exist in this project.",
"details": {
"field": "release_id",
"value": "rel_01HXYZ"
}
}
429 — Rate limit exceeded
{
"error": "rate_limit_exceeded",
"message": "You have exceeded your monthly API call limit.",
"details": {
"limit": 1000,
"reset_at": "2026-04-01T00:00:00Z"
}
}
See the X-RateLimit-Reset header for when the limit resets. See Rate Limits for retry guidance.
500 — Internal error
{
"error": "internal_error",
"message": "An unexpected error occurred. Please try again or contact support."
}
Retry with exponential backoff. If the error persists, contact support@lathe.studio with the timestamp and endpoint.
Idempotency#
For POST requests, include an Idempotency-Key header to safely retry without creating duplicate resources:
Idempotency-Key: my-pipeline-run-12345
If a request with the same key succeeds, subsequent identical requests return the original response. If the body differs, a 409 Conflict is returned.
Idempotency keys expire after 24 hours.