Base URL
Authentication
All requests require an API key in theAuthorization header.
es_live_ and can be created in your account settings or via the API. Each account can have up to 10 active keys.
Quick start
Create a project, poll until it’s done, then get the result.Project lifecycle
Every project follows this status flow:| Status | Meaning | Poll interval |
|---|---|---|
queued | Waiting to start | 5s |
running | Agent is planning and executing | 30s |
generating | Waiting for model outputs | 30-60s |
rendering | Compositing final video | 30s |
idle | Ready for next action (see below) | Stop |
failed | Something went wrong. Check error_message. Send a message to retry | Stop |
cancelled | Stopped by user | Stop |
Two modes
Autonomous (API default). The agent handles everything start to finish. Create the project, poll untilidle, get the result.
Collaborative. The agent stops at decision points and returns idle with a message in agent_message. Review the message, send feedback via POST /projects/:id/messages, and the agent continues. Good for guiding creative direction.
The API defaults to autonomous mode. In the studio, the default is collaborative.
PATCH /projects/:id/settings.
Rate limits
| Limit | Value |
|---|---|
| Requests | 30 per minute per user |
| Concurrent projects | 5 active simultaneously |
| Renders | 50 per day |
| Request payload | 1 MB max |
429 response with a Retry-After header.
Errors
All errors follow the same format:| Code | Status | Meaning |
|---|---|---|
validation_error | 400 | Invalid request parameters |
unauthorized | 401 | Missing or invalid API key |
insufficient_credits | 402 | Not enough credits |
forbidden | 403 | Permission denied or feature requires Pro plan |
not_found | 404 | Resource doesn’t exist |
conflict | 409 | Status conflict (e.g., project is already running) |
payload_too_large | 413 | Request body exceeds 1 MB |
project_limit | 429 | Concurrent project or daily project limit exceeded |
rate_limited | 429 | Too many requests |
internal_error | 500 | Server error |
service_unavailable | 503 | Temporarily unavailable |
"brief: brief is required; mode: mode must be autonomous or collaborative".
Response headers
Every response includes:| Header | Description |
|---|---|
X-Request-Id | Unique request identifier for debugging |
X-RateLimit-Limit | Requests allowed per window |
X-RateLimit-Remaining | Requests remaining |
X-RateLimit-Reset | Unix timestamp when the window resets |
Minimum credit requirements
| Action | Minimum credits |
|---|---|
| Create project | 50 |
| Send message | 10 |
| Render (1080p) | Free (rate limited to 50/day) |
| Render (4K) | Requires Pro subscription |
Best practices
Use idempotency keys for project creation
Use idempotency keys for project creation
Network retries can duplicate projects. Include an
idempotency_key to prevent this. Existing projects return 200, new projects return 202. Handle both as success.Combine webhooks with polling
Combine webhooks with polling
Webhooks are delivered once. Use them as a trigger, then confirm state with
GET /projects/:id.Download or share videos within 24 hours
Download or share videos within 24 hours
Handle the credits_warning field
Handle the credits_warning field
When balance drops below 100 credits, responses include
credits_warning. Use this to trigger top-up flows before the agent runs out mid-project.Use cursor-based message polling
Use cursor-based message polling
Store the last message ID and pass it as
?after=msg_id to get only new messages.Log request IDs
Log request IDs
Every response includes an
X-Request-Id header. Log these alongside your requests for debugging with support.