Skip to main content
Three creation modes all go through POST /v3/avatars — distinguished by the type field. The result is a new look that you pass as avatar_id to video creation endpoints. To browse existing avatars and looks instead, see Avatars and Avatar Looks.

Pick your flow

You have…You want…Use
Video footage of a personA reusable digital twin of that persontype: "digital_twin"
A photo of a personAn avatar from that photo, fasttype: "photo"
Just a text descriptionA fully synthetic AI charactertype: "prompt"
An existing HeyGen avatarA new look for it (new outfit, setting, style)type: "prompt" + avatar_id
The last row is the most-overlooked path: once you have any HeyGen avatar (digital twin, photo, or prompt), you can use the prompt endpoint to generate additional looks for that same character — see Generate new looks for an existing avatar.

Creation Methods

Digital Twin (type: "digital_twin")

Create an avatar from video footage. The speaker in the video becomes a reusable digital twin.
curl -X POST "https://api.heygen.com/v3/avatars" \
  -H "X-Api-Key: $HEYGEN_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "digital_twin",
    "name": "My Digital Twin",
    "file": { "type": "url", "url": "https://example.com/training-footage.mp4" }
  }'
ParameterTypeRequiredDescription
typestringYesMust be "digital_twin".
namestringYesDisplay name for the avatar.
fileobjectYesTraining video. { "type": "url", "url": "..." }, { "type": "asset_id", "asset_id": "..." } (from POST /v3/assets), or { "type": "base64", "media_type": "video/mp4", "data": "..." }.
avatar_group_idstringNoAttach to an existing character identity. Omit to create a new one.

Response

All three creation types return the same response shape:
{
  "data": {
    "avatar_item": {
      "id": "look_abc123",
      "name": "Space Commander",
      "avatar_type": "studio_avatar",
      "group_id": "group_xyz789",
      "preview_image_url": "https://files.heygen.ai/...",
      "supported_api_engines": ["avatar_4_quality", "avatar_4_turbo"],
      "tags": []
    },
    "avatar_group": {
      "id": "group_xyz789",
      "name": "Space Commander",
      "looks_count": 1,
      "consent_status": null,
      "created_at": 1717000000
    }
  }
}
FieldTypeDescription
avatar_item.idstringThe look ID — pass this as avatar_id to POST /v3/videos or Create Video Agent Session.
avatar_item.avatar_typestring"digital_twin", "photo_avatar", or "studio_avatar".
avatar_item.supported_api_enginesarrayEngine values compatible with this look for POST /v3/videos.
avatar_item.group_idstringThe character identity this look belongs to.
avatar_group.idstringGroup ID. Use to add more looks or initiate consent.
avatar_group.consent_statusstring or nullnull for photo and prompt avatars. Digital twins may require consent — see below.
Before you can generate video with a digital twin, the person depicted must consent to being cloned. Photo avatars and prompt-to-avatar characters do not require consent (their consent_status is null). HeyGen offers three increasing levels of consent access — recording via webcam (all customers), uploading a consent video (enterprise), and skipping consent entirely (strategic accounts, by agreement). The API flow, the full breakdown of the three levels, and how to request higher levels all live on the dedicated page.

Avatar Consent — levels of access & the API flow

How consent works, who each level is for, and the POST /v3/avatars/{group_id}/consent flow.

Avatars vs. Looks

An avatar group is a character identity (e.g. “Sarah”). Each group can have multiple looks — different outfits, poses, or styles. When creating a video, you pass a look ID (not a group ID) as the avatar_id. Use GET /v3/avatars/looks to browse looks (see Avatar Looks), or pass avatar_group_id when creating a new avatar to add a look to an existing character.