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 —
GETandPOST /video/avatar-agents,PATCHandDELETE /video/avatar-agents/:id, andGET /video/avatar-agents/:id/join-plan. Persona ids arevaa_-prefixed. A persona exists only for the tenant whose API key you called with. - The render-job surface —
GETandPOST /video/avatar-video-renders,GET,PATCH, andDELETE /video/avatar-video-renders/:id, plusPOST /video/avatar-video-renders/verify. Render job ids arevavr_-prefixed.POSTdereferences the persona the job binds, so a render request can return codes from either family.
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 movesqueued → 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
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
POST.
Retrieve and reconcile before you retry
A 404 or 409 means the world moved under your request. Before re-issuing any write:GET /video/avatar-agents— confirm the persona id exists for the tenant whose key you are sending.GET /video/avatar-video-renders/:id— read the job’s currentstatusand compare it with the transition you were about to report.- 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.
What not to do
- Do not re-
POSTa render that 404’d withVIDEO_AVATAR_AGENT_NOT_FOUND— create or fix the persona first; the render endpoint never creates one. - Do not
PATCHacompletedorfailedjob 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
*_FAILED5xx family does; retry those once with backoff.
Escalate
If a code disagrees with the state your reads show — a 404 on a persona thatGET /video/avatar-agents lists, or a 409 on a job whose status is
queued — open a support ticket carrying:
meta.request_idfrom the failing response,- the persona id (
vaa_…) and/or the render job id (vavr_…), - the verb and path you called, and the response status.