Request limits
Every response carries:
Over the limit you get
429 rate_limited with a Retry-After header in seconds. Wait that long, then retry with the same Idempotency-Key. A long-poll (GET /v1/jobs/{id}?wait=25) is one request however long it waits, so it’s the cheapest way to wait for a job.
Concurrency
You can run as many generations at once as your plan’s parallel generations. The limit is per person, not per key or per workspace, and it’s shared with the Voyager app: jobs you start from the app, the dashboard, a connected AI and the API all count toward the same number.
voyager.so/pricing has the current plans.
GET /v1/account returns your limit as limits.concurrency.parallel_generations.
Speech and 3D jobs also share a workspace-wide cap that counts every member’s jobs together, on top of your own limit: limits.concurrency.workspace.speech and limits.concurrency.workspace.3d. A job over either cap waits queued.
The queue
Creating a job while you’re at your limit doesn’t fail: the job is accepted asqueued and starts when one of yours finishes.
- You can have up to 100 active jobs (queued plus running) at once, counted per person across all your workspaces. Past that, create returns
429queue_fulland nothing is accepted; theIdempotency-Keystays reusable. - A job that waits more than 1 hour without starting is
canceledwitherror.codequeue_timeout. Nothing is charged.
Credits and your account
GET /v1/account shows the workspace, plan, credits available and your limits:
plan:
credits:
limits:
limits.requests_per_minute:
limits.concurrency:
limits.concurrency.workspace:
limits.queue:
Credits are shared across the workspace: the app, the dashboard, connected AIs and the API all draw from the same Voyager credits. Running jobs hold credits until they settle, so
credits.available drops when a job starts. Prices are on voyager.so/pricing.
Usage per key
The API tab on voyager.so/dashboard/api shows credits used by each key over the last 30 days and when each key was last used. Every job created with a key is counted against that key, including its later settlement and any refunds. Workspace-wide usage, across the app and the API, is on the dashboard’s usage page.Avoid hitting limits
- Wait with
?wait=25or webhooks, not tight polling loops. Honorpoll_after_msandRetry-After. - Read
X-RateLimit-Remainingand slow down before you reach zero. - Batch work by creating jobs at a steady pace; extra jobs queue on their own.
- Use separate keys per app so one busy integration doesn’t use up another’s request limit. They still share your parallel generations.