roasOS
ModelsLipsync

HeyGen Photo Avatar 4

HeyGen Photo Avatar 4 animates a photo with a clear face to an audio track and controls the output frame directly: a resolution preset, an aspect ratio and a talking style.

Family lipsync · model heygen-avatar-4 · catalog model-catalog@2026-10-06.v5 · pricing customer-pricing@2026-11-05.v15.

Endpoint

POST https://api.roasos.com/v1/lipsync/heygen-avatar-4

Send your API key as a bearer token. The key needs the scope api:write. Every paid request also needs an Idempotency-Key header.

The envelope fields quote_only, quote_id, webhook_url and wait_timeout_seconds behave the same on each model endpoint. Refer to Jobs and Quotes and credits.

Good at

Presenter-style ads where the delivery format matters more than identity nuance: one photo can produce a 9:16 cut and a 16:9 cut. talking_style selects minimal movement (stable) or more animation (expressive). Give it a front-facing, well-lit photo. It does not accept a prompt or a video source, and its built-in text-to-speech (prompt + voice) is not exposed.

Pricing

The unit is one second. Pricing key: heygen-avatar-4.

RequestCredits
10s12

The credits come from the roasOS pricing table. No other field changes the price. To get the exact price of your request, send it with quote_only: true first.

Modes

  • image-audio-to-video

Provider endpoints: fal-ai/heygen/avatar4/image-to-video.

Request fields

FieldTypeRequiredDefaultRule
aspect_ratioenumno16:916:9, 9:16, 4:5, 5:4, 1:1, auto
audio_urlstringyes—https URL; ≤ 4,096 characters
avatar_idstringno—UUID
image_urlstringno—https URL; ≤ 4,096 characters
media_rightsobjectyes—{ accepted, statement_version }
quote_idstringno—UUID
quote_onlybooleannofalse—
resolutionenumno720p360p, 480p, 540p, 720p, 1080p
talking_styleenumnostablestable, expressive
wait_timeout_secondsintegerno00–60
webhook_urlstringno—https URL; ≤ 4,096 characters

The schema is strict. A field that is not in this table gets 400 unsupported_option. The field names are the roasOS role names. One role has one name in every family.

Media

This endpoint accepts these media roles:

  • avatar_id — identity; the saved character reference sheet, with a derived portrait only where the model requires a single face or source frame
  • image_url — first frame (or the single source image)
  • audio_url — the driving audio track
RoleItemsMaximum sizeContent typesDuration
audio_url≤ 115 MBaudio/mp3, audio/mpeg, audio/wav, audio/wave, audio/x-wav0–60 s
image_url≤ 110 MBimage/jpeg, image/png, image/webp—

Every other role is refused: elements, product_id, product_images, references, reference_images, end_image_url, scene_id, scene_image, video_urls, video_url, audio_urls, voice_id. A refused role gets 400 unsupported_option.

Each media URL must be an immutable object on https://cdn.roasos.com that your workspace owns. Any other URL gets 400 reference_media_not_workspace_owned. Refer to Reference media and uploads to learn how to put a file there.

Prompt

None. The endpoint has no prompt. (At fal, prompt is the text the avatar speaks; roasOS requires audio_url instead.)

Not exposed

These catalog entries describe omitted inputs, pinned values and source constraints. They do not imply that the provider accepts every listed field.

  • prompt — not accepted by this public endpoint.
  • voice — not accepted by this public endpoint.
  • expression — not accepted by this public endpoint.
  • background — not accepted by this public endpoint.
  • caption — pinned to false.

Result

The result kind is lipsync. Always present: url.

{
  "data": {
    "id": "gen_…",
    "kind": "lipsync",
    "model": "heygen-avatar-4",
    "status": "completed",
    "result": {
      "url": "https://cdn.roasos.com/workspaces/ws_01/result"
    }
  }
}

The files are immutable objects on https://cdn.roasos.com. A result URL is a valid media input for your next request.

Example

The three steps are always the same: quote, run, poll.

# 1. Quote. Nothing is spent.
curl -X POST https://api.roasos.com/v1/lipsync/heygen-avatar-4 \
  -H "Authorization: Bearer roasos_sk_live_..." \
  -H "Idempotency-Key: 0f1c9e2a-heygen-avatar-4-0001" \
  -H "Content-Type: application/json" \
  -d '{"quote_only":true,"audio_url":"https://cdn.roasos.com/workspaces/ws_01/uploads/audio_url.mp3","image_url":"https://cdn.roasos.com/workspaces/ws_01/uploads/image_url.png","media_rights":{"accepted":true,"statement_version":1}}'
# 200 { "data": { "kind": "quote", "quote_id": "q_7Hk...", "credits": 12, "expires_at": "...",
#        "confirmation": { "model": "heygen-avatar-4", "example": "10s" } } }

# 2. Run. Same body, same Idempotency-Key, quote_id in place of quote_only.
curl -X POST https://api.roasos.com/v1/lipsync/heygen-avatar-4 \
  -H "Authorization: Bearer roasos_sk_live_..." \
  -H "Idempotency-Key: 0f1c9e2a-heygen-avatar-4-0001" \
  -H "Content-Type: application/json" \
  -d '{"quote_id":"q_7Hk...","audio_url":"https://cdn.roasos.com/workspaces/ws_01/uploads/audio_url.mp3","image_url":"https://cdn.roasos.com/workspaces/ws_01/uploads/image_url.png","media_rights":{"accepted":true,"statement_version":1}}'
# 201 { "data": { "id": "gen_...", "status": "queued", "credits_reserved": 12 } }

# 3. Poll, then read the result.
curl https://api.roasos.com/v1/jobs/gen_.../status -H "Authorization: Bearer roasos_sk_live_..."
curl https://api.roasos.com/v1/jobs/gen_.../result -H "Authorization: Bearer roasos_sk_live_..."

The deprecated path

POST /v1/generations still reaches this model for one minor version. It is deprecated. This is how it maps:

Not available on the public API. The contract of POST /v1/lipsync/heygen-avatar-4 is frozen and the route answers 501 model_endpoint_not_implemented: the model needs a recorded media-rights attestation and a server-measured audio duration, and the public API captures neither yet. POST /v1/generations returns 503 lipsync_public_authority_unavailable for the same reason. The app route POST /api/generate/lipsync with model: "heygen-avatar-4", rights_accepted: true and camelCase options (talkingStyle, aspectRatio) reaches the provider.

See also

  • llms.txt for this model — the same facts as one plain-text file for an agent.
  • GET https://api.roasos.com/v1/catalog/heygen-avatar-4 — the machine-readable form: enums, defaults, limits and prices. Refer to the API reference.
  • Jobs — how to poll a job and read its result.
  • Provider endpoints: fal-ai/heygen/avatar4/image-to-video.

On this page