AIVeed Developers Get your API key

Errors

Every error is JSON with a stable machine code:

json
{
  "error": true,
  "code": "UNSUPPORTED_OPTION",
  "message": "last_frame_url is not supported by this model",
  "param": "last_frame_url"
}

details (validation issues, provider context) and param (the offending field) appear when they add information. The same table is embedded machine-readably in the OpenAPI spec as x-error-codes.

All error codes

CodeHTTPMeaning
VALIDATION_ERROR400The request body or query failed schema validation. `details` lists the individual problems.
INVALID_PARAM400A path parameter has the wrong type (e.g. a non-integer key or webhook id).
INVALID_IDEMPOTENCY_KEY400The Idempotency-Key header is malformed. Allowed: 1-200 characters of A-Z a-z 0-9 _ . -
AUTH_REQUIRED401No credentials. Send `X-API-Key: aiv_sk_...` or `Authorization: Bearer <key or session JWT>`.
INVALID_API_KEY401The API key is malformed, unknown, or revoked.
KEY_EXPIRED401The API key is past its expiry date. Create or rotate a key on the dashboard.
TOKEN_MALFORMED401The Bearer token is not a structurally valid JWT.
TOKEN_EXPIRED401The session JWT has expired — log in again.
TOKEN_INVALID401The session JWT failed verification.
USER_NOT_FOUND401The session JWT is valid but its user no longer exists.
PASSWORD_CHANGED401The session JWT was issued before the last password change. Log in again.
INVALID_TICKET401The SSE ticket is invalid, expired, or bound to a different job.
INSUFFICIENT_CREDITS402Your balance does not cover the job cost. Nothing was charged.
insufficient_scope403The API key lacks the required scope (`required_scope` names it), or an API key attempted session-only key management.
upgrade_required403A paid-plan feature on a free key (e.g. /batch), or the free trial is exhausted. `pricing_url` links to plans.
ACCOUNT_BANNED403The account is suspended. Contact support@aiveed.io.
NOT_ELIGIBLE403The account cannot perform this action (e.g. unverified email, locked credits). `reason`/`reasons` explain.
CONTENT_POLICY_VIOLATION403The prompt or input media failed content moderation. Repeated violations can suspend the account.
JOB_NOT_FOUND404No job with that id belongs to you.
KEY_NOT_FOUND404No such API key (or it is already revoked).
WEBHOOK_NOT_FOUND404No webhook config with that id belongs to you.
NOT_FOUND404The endpoint or referenced resource does not exist.
KEY_LIMIT_REACHED409Maximum active API keys reached — revoke one first.
KEY_REVOKED409The key is revoked and cannot be rotated.
WEBHOOK_LIMIT_REACHED409Maximum active webhooks reached — delete one first.
CANNOT_CANCEL409Only queued jobs can be cancelled; this one already left the queue.
PAYLOAD_TOO_LARGE413JSON bodies are capped at 1 MB; uploads at their per-kind size cap (image 10 MB, audio 5 MB, video 50 MB).
UNSUPPORTED_MEDIA_TYPE415The uploaded file type is not allowed for that `kind`.
UNSUPPORTED_OPTION422A request option is not supported by this model (or a webhook URL is not https/publicly routable). `param` names the offending field.
RATE_LIMIT_EXCEEDED429Over your per-minute request limit. Honor `Retry-After` and the X-RateLimit-* headers.
concurrency_limit_reached429Your key already has `max_concurrent` jobs in flight — wait for one to finish.
TOO_MANY_STREAMS429Too many SSE streams open for this account. Close one before opening another, or poll GET /v1/jobs/{id} instead.
INTERNAL_ERROR500Unexpected server error. Safe to retry with the same Idempotency-Key.
PROVIDER_ERROR502The upstream generation provider is temporarily unavailable. Charged jobs that fail are refunded automatically.
GATEWAY_TIMEOUT504The generation service did not respond in time. The job may still be running — poll GET /v1/jobs/{id} rather than resubmitting, or the work could be charged twice.
GENERATION_FAILED500Fallback code when a submission fails without a more specific cause.
EXTEND_FAILED500Fallback code when a video extension fails without a more specific cause.
SKIPPED—Batch per-item only: not submitted because an earlier item failed with INSUFFICIENT_CREDITS.

Retry guidance