> ## Documentation Index
> Fetch the complete documentation index at: https://heygen-1fa696a7.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Photo to Avatar

> Turn one still image into a HeyGen avatar with POST /v3/avatars. The fastest creation path: no footage, no consent step, and the photo becomes the reference for every later look.

<img className="w-full h-44 object-cover rounded-xl" src="https://mintcdn.com/heygen-1fa696a7/hfMXXwJzjE7vBSYZ/images/theme/research-8.webp?fit=max&auto=format&n=hfMXXwJzjE7vBSYZ&q=85&s=d16cda8ab7835eed66c6a205d16e631f" alt="" noZoom width="1400" height="788" data-path="images/theme/research-8.webp" />

A **photo avatar** is built from a single still image. It is the fastest way into the API: no recording session, and no consent step, since a group created from a photo reports `consent_status` of `null`. The image is still of a real person, so have their permission before you use it, as [Avatar Consent](/docs/avatar-consent) explains.

<Steps>
  <Step title="Create the avatar">
    ```bash theme={null}
    curl -X POST "https://api.heygen.com/v3/avatars" \
      -H "X-Api-Key: $HEYGEN_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "type": "photo",
        "name": "Sarah",
        "file": { "type": "url", "url": "https://example.com/sarah-headshot.png" }
      }'
    ```

    `file` also takes `{ "type": "asset_id", "asset_id": "..." }` from [`POST /v3/assets`](/docs/upload-assets), or base64 content. Add `avatar_group_id` to add this photo as another look on a character you already have; `consent_status` is a property of the group, so the response reports whatever that group already carries.

    Save `avatar_item.id` from the response. That is the `avatar_id` for video creation.
  </Step>

  <Step title="Wait for processing">
    Poll [`GET /v3/avatars/looks/{look_id}`](/reference/get-avatar-look) until `status` leaves `processing`.

    ```bash theme={null}
    curl -X GET "https://api.heygen.com/v3/avatars/looks/$LOOK_ID" \
      -H "X-Api-Key: $HEYGEN_API_KEY"
    ```

    A `completed` look returns `preview_image_url` and the `supported_api_engines` it renders on. A `failed` one carries `error.code` of `training_failed` or `moderation_failed`, with the reason in `error.message`.
  </Step>

  <Step title="Render">
    Photo avatars accept `motion_prompt` and `expressiveness` on [`POST /v3/videos`](/reference/create-video), which direct how much the subject moves while speaking.

    ```bash theme={null}
    curl -X POST "https://api.heygen.com/v3/videos" \
      -H "X-Api-Key: $HEYGEN_API_KEY" \
      -H "Content-Type: application/json" \
      -d '{
        "type": "avatar",
        "avatar_id": "look_abc123",
        "voice_id": "voice_xyz789",
        "script": "Here is what changed in this release."
      }'
    ```

    Pick a voice with [`GET /v3/voices`](/docs/voices/search-voices), or set one as the character default through [`PATCH /v3/avatars/{group_id}`](/reference/update-avatar-group) and leave `voice_id` out. The [Photo Avatar](/photo-avatar) recipe covers the render end to end.
  </Step>
</Steps>

<Tip>
  A clear, front-facing portrait in even lighting works best: whole head in frame, one person, as much resolution as you have. The image becomes the visual reference the character is remembered by, so choose the shot you want every later look to resemble.
</Tip>

## Give the character more looks

The photo is the identity reference for everything that follows. Pass its look id as `avatar_id` to [Prompt to Avatar](/docs/avatar-from-prompt) to put the same person in a new outfit or setting, or apply a [Look Pack](/docs/avatar-look-packs) for a coordinated set in one call.

New looks join the same character, and [`GET /v3/avatars/looks?group_id=...`](/reference/list-avatar-looks) lists them all.
