Skip to main content

Video avatar agent and render errors

The avatar persona registry (/api/v1/video/avatar-agents) and the async render-job surface (/api/v1/video/avatar-video-renders) return a small, deterministic family of 4xx codes: VIDEO_AVATAR_AGENT_NOT_FOUND, VIDEO_AVATAR_AGENT_INVALID, VIDEO_AVATAR_RENDER_NOT_FOUND, VIDEO_AVATAR_RENDER_INVALID, and VIDEO_AVATAR_RENDER_INVALID_TRANSITION. None of them is transient and none clears on retry — each names a payload field or a job state you control. This page maps every code to its cause and the one fix that clears it.

What video avatar agents are

An avatar persona binds one of your conversational agents (the dialog brain) to a rendered talking-head provider reference, then either joins a live video room as a digital host or renders personalized clips from a script template with {{merge_tag}} tokens. This runbook covers the error surface only; the feature itself, end to end, is documented in AI video avatar agents.

Where these codes surface

Both surfaces are tenant-scoped and authenticated (video:read for reads; video:write plus an owner, admin, or developer role for writes), and both answer failures with the same error envelope: an error object carrying code, message, and status, and a meta object carrying request_id and timestamp:
  • The persona registry — GET and POST /video/avatar-agents, PATCH and DELETE /video/avatar-agents/:id, and GET /video/avatar-agents/:id/join-plan. Persona ids are vaa_-prefixed. A persona exists only for the tenant whose API key you called with.
  • The render-job surface — GET and POST /video/avatar-video-renders, GET, PATCH, and DELETE /video/avatar-video-renders/:id, plus POST /video/avatar-video-renders/verify. Render job ids are vavr_-prefixed. POST dereferences the persona the job binds, so a render request can return codes from either family.
When validation rejects a payload, message names the failing field — read it before you change anything.

Code-by-code decoder

Two adjacent codes on the same surfaces are worth knowing: VIDEO_AVATAR_AGENT_DISABLED (409) when a join plan targets a persona stored with "enabled": false — re-enable it with PATCH /video/avatar-agents/:id and dispatch again — and the *_FAILED 5xx family (VIDEO_AVATAR_AGENT_CREATE_FAILED, VIDEO_AVATAR_RENDER_UPDATE_FAILED, …), which are transient storage-side faults and, unlike the five codes above, do take one backoff retry.

The render state machine

A render job moves queued → rendering → completed or queued → rendering → failed; completed and failed are terminal. What each verb accepts per state: POST /video/avatar-video-renders always creates a new job; it never resumes an old one. A completed report that lacks output_url or the clip digest is refused as 400 VIDEO_AVATAR_RENDER_INVALID, not 409 — the state was legal, the payload was not.

Worked examples

404 — rendering against a persona the tenant never registered

Register the persona first (POST /video/avatar-agents), or point avatar_agent_id at an id from GET /video/avatar-agents, then post the render again. Re-posting the render without that step returns the same 404 every time — a render never creates a persona.

409 — reporting status against a terminal job

The job already finished. If two reporters race on one job, keep a single reporter per job id; if you need another clip, queue a fresh render with POST.

Retrieve and reconcile before you retry

A 404 or 409 means the world moved under your request. Before re-issuing any write:
  1. GET /video/avatar-agents — confirm the persona id exists for the tenant whose key you are sending.
  2. GET /video/avatar-video-renders/:id — read the job’s current status and compare it with the transition you were about to report.
  3. Re-issue the write only once the read shows the corrected state — the persona listed, or the job in a state that accepts your transition.
Never blind-retry a 404: the registry and the job list are read-your-writes, so a retry against a missing id fails identically until the object exists.

What not to do

  • Do not re-POST a render that 404’d with VIDEO_AVATAR_AGENT_NOT_FOUND — create or fix the persona first; the render endpoint never creates one.
  • Do not PATCH a completed or failed job to resume it — terminal is terminal; queue a fresh render.
  • Do not loop a 400 — the refusal is deterministic and names the field; the payload will not fix itself between attempts.
  • Do not treat these five codes as an outage — they never indicate a platform fault. The *_FAILED 5xx family does; retry those once with backoff.

Escalate

If a code disagrees with the state your reads show — a 404 on a persona that GET /video/avatar-agents lists, or a 409 on a job whose status is queued — open a support ticket carrying:
  • meta.request_id from the failing response,
  • the persona id (vaa_…) and/or the render job id (vavr_…),
  • the verb and path you called, and the response status.
Related: AI video avatar agents for the end-to-end workflow, Avatar video render lifecycle for the job model and its content credential, and the Error code reference for codes without a dedicated runbook.