Skip to main content

Error envelope

Every non-2xx response has the same shape:
The HTTP status code carries the class of failure; the error string is a human-readable hint. Don’t pattern-match on the message text; it’s free-form and may change. Branch on the status code instead.

Status code reference

When to retry

A minimal retry helper:
Python
Never retry POST /v1/agents/{agent_id}/run after a 5xx without checking whether the task was actually created. A 5xx during run-creation can occasionally mean “request reached us, then the connection died”, so issue a GET /v1/tasks filtered by agent_id and created_after before retrying to avoid double-runs.

Pagination

List endpoints (GET /v1/tasks, GET /v1/agents, GET /v1/agents/{id}/versions) are cursor-paginated, newest-first. The response looks like:
To fetch the next page, pass that cursor back unchanged as the cursor query parameter. When you reach the end, next_cursor is omitted (or empty).
Python

Cursor opacity

next_cursor is opaque; don’t try to parse it. If you decode it today and rely on the shape, your code will break the next time the server changes its pagination key.

limit

Default is 20, max is 100. Larger pages mean fewer round-trips but a larger response body; for bulk export, 100 is usually the right choice.

Rate limits

Rate limits are enforced per-workspace, not per-key. If you’re running tight loops or fanning out many concurrent agents, watch for 429 and back off. We do not currently publish per-tier numbers. If you’re hitting limits in production, reach out.