> ## Documentation Index
> Fetch the complete documentation index at: https://docs.livingsecurity.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Error Reference

> Every error the Living Security /v1 public API can return, with its stable machine code, HTTP status, and how to resolve it.

Every `/v1` error response is `application/problem+json` ([RFC 9457](https://www.rfc-editor.org/rfc/rfc9457)) with a fixed field set:

```json theme={null}
{
  "type": "https://docs.livingsecurity.com/developers/v1/errors/resource_not_found",
  "title": "Not Found",
  "status": 404,
  "detail": "No such organization.",
  "code": "resource_not_found",
  "request_id": "req_...",
  "doc_url": "https://docs.livingsecurity.com/developers/v1/errors/resource_not_found",
  "retryable": false
}
```

Branch on `code`, never on `detail` — `code` is a stable machine contract; `detail` is human-readable and may change. `param` is present when the error is attributable to a specific request parameter. Include `request_id` when contacting support.

## Error codes

| Code | HTTP status | Retryable |
| - | - | - |
| [`unauthorized`](/developers/v1/errors/unauthorized) | 401 | No |
| [`credential_inactive`](/developers/v1/errors/credential_inactive) | 401 | No |
| [`credential_expired`](/developers/v1/errors/credential_expired) | 401 | No |
| [`credential_revoked`](/developers/v1/errors/credential_revoked) | 401 | No |
| [`not_entitled`](/developers/v1/errors/not_entitled) | 403 | No |
| [`insufficient_permission`](/developers/v1/errors/insufficient_permission) | 403 | No |
| [`permission_denied`](/developers/v1/errors/permission_denied) | 403 | No |
| [`resource_not_found`](/developers/v1/errors/resource_not_found) | 404 | No |
| [`invalid_request`](/developers/v1/errors/invalid_request) | 400 or 409 | No |
| [`invalid_filter`](/developers/v1/errors/invalid_filter) | 400 | No |
| [`unsupported_version`](/developers/v1/errors/unsupported_version) | 400 | No |
| [`idempotency_key_reuse`](/developers/v1/errors/idempotency_key_reuse) | 409 | Depends on the conflict |
| [`rate_limited`](/developers/v1/errors/rate_limited) | 429 | Yes |
| [`service_unavailable`](/developers/v1/errors/service_unavailable) | 503 | Yes |
| [`internal_error`](/developers/v1/errors/internal_error) | 500 | Yes |

The code set is closed: new codes are a public contract change and are announced through the API changelog. A `retryable: true` response means the condition may resolve; it does not prove a write had no effect. Retry reads with a finite attempt and time budget, exponential backoff and jitter. Honor `Retry-After` when present, including on a retryable `409` or `429`.

For mutations, follow the operation's documented idempotency and recovery contract. Preserve the original key and request when supported. Do not invent a new key after a timeout or `5xx`: doing so may repeat a successful write. An `Idempotency-Key` header provides no protection on an operation that does not support it.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.