Skip to main content
POST

Overview

Talking Avatar makes a video of one avatar speaking your script. The script is split into short clips and each clip is generated with the avatar talking on camera. Voice, lip movement and gestures come from the video model together with the picture: there is no voiceId, no voice settings and no lipsync step. The output is always vertical (9:16), so there is no aspectRatio either. How the avatar is filmed and how it sounds is videoStyle: the camera moves the director may pick from, the gestures (only the listed ones), a voice card or your own voice description, and an accent that matches the video’s language.


What happens next

The script is split into clips, each clip is generated, and the clips are joined, captioned and rendered. Either:
  • poll GET /v1/project/{projectId} until data.video is present and data.video.status is COMPLETED, then download data.video.url (the project’s own status turns completed when the clips are assembled, a little before the render finishes); or
  • pass webhook and wait for the COMPLETED (or FAILED) call described in Webhooks:

Credits and your own keys

  • Managed teams (Hooked’s provider keys) pay 100 credits per started 15 seconds of speech, estimated from the script at about 2.5 words per second. The estimate is charged when the project is created and refunded automatically if the project fails.
  • Teams on their own provider keys (BYOK) are not charged credits. They need an OpenRouter key and a Google AI (Gemini) key (the talking clips) in Settings → AI keys. No ElevenLabs key is needed. Without them the request answers 402 missing_credentials before anything is created or charged.

Errors

Send an Idempotency-Key header to retry safely: if a request times out or answers 5xx, sending it again with the same key and body returns the first answer instead of creating (and charging) the project twice.

Project details

Follow the project until its video is ready

Webhooks

Payloads and delivery rules

List Avatars

Pick the avatar

UGC Studio

An avatar presenting your product, with B-roll

Authorizations

x-api-key
string
header
required

Headers

Idempotency-Key
string

Makes the request safe to retry. 1-255 printable ASCII characters, one per operation (your job id, or a UUID you store), reused on every retry. Within 24 hours the same key with the same body answers with the first response and the header Idempotent-Replayed: true, without running or charging again. Keys are scoped to your team and the endpoint. 5xx answers and refusals before anything ran (401, 402, 403, 409, 429) are not kept. See Idempotency.

Required string length: 1 - 255
Pattern: ^[\x20-\x7E]+$

Query Parameters

dryRun
boolean
default:false

true: only answer the price of this exact request, as { success: true, data: { dryRun: true, estimatedCredits } } with status 200. The request is validated like a real one (a 400 or 402 says the same), but nothing is created, queued or charged. estimatedCredits is exactly what the call without dryRun charges a managed team; a byok team is charged nothing. Do not send an Idempotency-Key with it.

Body

application/json
script
string
required

What the avatar says. It is split into short clips; write it the way a person would say it: punctuation and short sentences shape the delivery.

Required string length: 1 - 10000
avatarId
string
required

Avatar ID from /v1/avatar/list (the library's or your team's own). An unknown ID answers 400.

Maximum string length: 30
name
string

Project name (max 100 characters). Generated when omitted.

Maximum string length: 100
videoStyle
object

How the avatar is filmed and how it speaks. Every field is optional.

language
string

Language the avatar speaks; detected from the script when omitted. 2-letter ISO 639-1 code, e.g. en, es.

caption
object

Burned-in captions.

content
object

Branding.

musicId
string

Background music ID from /v1/music/list. An unknown ID answers 400.

Maximum string length: 30
webhook
string<uri>

HTTPS URL on a public host, called when the video is ready or the project fails (max 500 characters). Requests are signed: verify the Hooked-Signature header (HMAC-SHA256 of ".") with the signing secret from Settings → Webhooks; Hooked-Event and Hooked-Delivery headers name the event and the delivery. No redirects are followed; 10 s timeout; 3 immediate attempts. See the Webhooks guide for the payload.

Maximum string length: 500
metadata
object

Any JSON object of your own (max 5 KB). Sent back in the webhook payload. The key automationId is reserved for dashboard automations and is removed.

Response

Project created. Follow it with GET /v1/project/{projectId} or wait for the webhook.

success
enum<boolean>
required
Available options:
true
data
object
required
message
string
required