Errors
LoopLlama uses conventional HTTP status codes and returns a consistent JSON body for every error, so you can branch on the status and surface the message.
Error shape#
Every error response is a JSON object with a single error string. There is no data key on errors.
{ "error": "Workflow is paused" }Status code reference#
| Status | Meaning | When it happens |
|---|---|---|
| 400 | Bad Request | The request body failed validation. |
| 401 | Unauthorized | The API key is missing, malformed, or invalid. |
| 404 | Not Found | The resource doesn't exist or isn't owned by your account. |
| 409 | Conflict | The request conflicts with the resource state (e.g. a paused workflow). |
400 — Validation errors#
When a request body fails schema validation, the API returns 400 with the first validation issue as the message. Common causes:
namePOST /v1/workflowsoptionalcrewPOST /v1/workflowsoptionalrole / systemPrompt.inputPOST /v1/workflows/{id}/runsoptionalHTTP/1.1 400 Bad Request
{ "error": "String must contain at least 1 character(s)" }401 — Authentication errors#
Returned when the Authorization header is missing or the key is rejected. The message distinguishes the cause:
{ "error": "Missing Bearer token" } // no Authorization header
{ "error": "Invalid token format" } // not an ll_live_ key
{ "error": "Invalid API key" } // unknown or revoked key404 — Not found#
The requested workflow or run does not exist, or it belongs to a different account. For security, LoopLlama does not distinguish between "missing" and "not yours" — both return the same response.
{ "error": "Not found" }409 — Conflict#
Returned when an action conflicts with the resource's state — today that means triggering a run against a workflow whose status is paused. Reactivate the workflow and retry.
{ "error": "Workflow is paused" }Failed runs#
A run that errors mid-execution is not an HTTP error — the request to trigger it already returned POST 202. Instead, the run's status becomes failed and its error field names the failing step. Always check the run status when polling, not just the HTTP code.
{
"data": {
"id": "ckrun2...",
"status": "failed",
"error": "Step 1 (writer) failed: model request timed out",
"total_steps": 1
}
}4xx responses are deterministic — fix the request before retrying. For transient failures (network errors or a run that fails on a timeout), retry with exponential backoff. Triggering a run is not idempotent: each POST creates a new run.