Get started
Errors
Every refusal has the same shape: an HTTP status, and a code your program can switch on.
Response402 Payment Required
{ "error": { "code": "insufficient_credits", "message": "You need 58 credits for this and have 12. Credits can be added at https://vessero.com/pricing.", "retryable": false, "requestId": "req_7Lq2XbN0vT4mKc9P" } }
Response400 Bad Request
{ "error": { "code": "invalid_request", "message": "A field is missing or not accepted.", "retryable": false, "requestId": "req_7Lq2XbN0vT4mKc9P", "details": { "issues": [ { "field": "durationSec", "message": "Seedance 2.5 makes clips of 4 to 15 seconds." } ] } } }
An error is { "error": { "code", "message", "retryable", "requestId", "details" } }. Switch on code, not the message, which may change. retryable says whether the same call may work if sent again later. details carries what the refusal knows as data: the fields refused, a new quote, the cap. Every answer carries X-Request-Id: quote it to support.
| Code | Status | Meaning |
|---|---|---|
missing_api_key | 401 | No API key was sent. |
invalid_api_key | 401 | The key opens nothing: revoked, mistyped, or the API is not on for the account. |
insufficient_scope | 403 | The key was not given the permission this needs. |
feature_unavailable | 403 | The studio this needs is switched off for the account right now. |
route_not_found | 404 | No such address in the API. |
method_not_allowed | 405 | The address takes other methods. |
unsupported_media_type | 415 | The body must be JSON (or a form, for a file). |
payload_too_large | 413 | The body is larger than the address takes. |
invalid_json | 400 | The body is not valid JSON. |
invalid_request | 400 | A field is missing or not accepted: see details. |
invalid_idempotency_key | 400 | An Idempotency-Key is 8–64 letters, digits, - or _. |
idempotency_key_reused | 422 | This Idempotency-Key was used with a different body: make a new one. |
invalid_webhook_url | 400 | webhookUrl must be a public https address. |
confirm_credits_required | 400 | A run that spends needs confirmCredits: the quote is in details. |
price_changed | 409 | The price is above the confirmCredits sent: nothing ran; the new quote is in details. |
confirm_not_quoted | 409 | confirmCredits is above the price and was not quoted for this Idempotency-Key. |
request_in_progress | 409 | A call with this Idempotency-Key is still running; it was not started again. |
insufficient_credits | 402 | The account has too few credits for this. |
daily_cap_reached | 429 | The key’s daily credit cap would be passed: see Retry-After. |
content_refused | 422 | The content check refused it. |
generation_failed | 422 | It was tried and did not come: details say whether it was charged. |
not_found | 404 | Not found on this account. |
conflict | 409 | It clashes with the state it is in. |
forbidden | 403 | Not allowed on this account. |
refused | 400 | Refused, in the app’s words: see the message. |
rate_limited | 429 | Too many calls this minute: see Retry-After. |
unavailable | 503 | Not available right now: try again in a while. |
internal_error | 500 | Something went wrong on our side. |