---
title: HeyGen
slug: heygen
image: https://make-cxp-documentation.ams3.digitaloceanspaces.com/apps-center-icons/PREVIEW_heygen.png
docTags: 
createdAt: 2025-05-20T13:02:36.620Z
---

With the HeyGen app in Make, you can monitor new videos, retrieve or delete existing ones, create avatar videos and translations, list available voices, avatars, and talking photos, upload and organize assets in folders, and perform advanced operations using API calls.

# Requirements

To use the HeyGen app in Make, you must have a [HeyGen account](https://app.heygen.com/signup).

# Connect HeyGen and Make&#x20;

To get started, you must first create a connection between HeyGen and Make, allowing the two services to communicate.

To create the connection, you need to:

::::WorkflowBlock
:::WorkflowBlockItem
[Obtain an API key in your HeyGen account.](docId\:j8v81UkFAXuY6FyqIfaci)
:::

:::WorkflowBlockItem
[Create the connection in Make.](docId\:j8v81UkFAXuY6FyqIfaci)
:::
::::

## Obtain your API key in HeyGen

Before you create the connection in Make, you should first obtain an API key in your HeyGen account.

To obtain the API key:

::::WorkflowBlock
:::WorkflowBlockItem
Sign in to your HeyGen account.
:::

:::WorkflowBlockItem
Go to **Settings** > **API**.
:::

:::WorkflowBlockItem
In the **API token** section, generate your API key.
:::

:::WorkflowBlockItem
Copy the API key and store it in a safe place.
:::
::::

You'll use this value in the **API Key** connection field in Make.

## Create the connection in Make&#x20;

Once you have your HeyGen API key, you're ready to create the connection in Make.&#x20;

To create the connection:

:::::WorkflowBlock
::::WorkflowBlockItem
Log in to your Make account, add a HeyGen module to your scenario, and click **Create a connection**.

:::hint{type="info"}
If you add a module with an ​instant​ tag, click ​**Create a webhook**​​, then ​**Create a connection**​​.
:::
::::

:::WorkflowBlockItem
Optional: In the ​​**Connection name​​** field, enter a name for the connection.
:::

:::WorkflowBlockItem
In the ​​**API Key** field, enter the API token you copied from your HeyGen account.&#x20;
:::

:::WorkflowBlockItem
Click **Save**.
:::

:::WorkflowBlockItem
If prompted, authenticate your account and confirm access.
:::
:::::

You've successfully created the connection and can now use the HeyGen app in your scenarios. If you want to make changes to your connection in the future, follow the steps [here](https://help.make.com/connect-an-application#tN2pJ).

# HeyGen modules

After connecting to the HeyGen app, you can use the following types of modules to build your scenarios.&#x20;

:::ExpandableHeading{isOpen="true"}
**Events**

- Watch events
:::

:::ExpandableHeading{isOpen="true"}
**Videos**

- Create a video
- Create a video translation
- Create a video agent session
- Get a video
- Get a video translation
- Delete a video
:::

:::ExpandableHeading{isOpen="true"}
**Assets**

- Upload an asset
- Get an asset
- Delete an asset
:::

:::ExpandableHeading{isOpen="true"}
**Avatars**

- List avatar looks
:::

:::ExpandableHeading{isOpen="true"}
**Voices**

- List voices
:::

:::ExpandableHeading{isOpen="true"}
**Other**

- Make an API call
:::

# Migrate to the new HeyGen modules

HeyGen supports its legacy v1 and v2 API endpoints until October 31, 2026. Version 1 of the HeyGen app uses these endpoints, so migrate your scenarios to version 2 before that date. Existing scenarios keep running until then.

:::hint{type="info"}
App versions and API versions are different. Version 2 of the HeyGen app uses version 3 of the HeyGen API, so use v3 endpoints in Make an API call.
:::

:::hint{type="warning"}
Create a Video from a Template and the folder modules have no replacement in version 2. Review the **Module mapping** section before you migrate.
:::

## Key changes

The following changes apply to all modules:

- **New connection:** Create a new HeyGen connection with your API key. Connections from version 1 can't be reused.
- **One video module:** Create a video replaces both Create an Avatar Video and Generate an avatar IV video. Select the video type **Avatar** or **Image**.
- **Simpler outputs:&#x20;**&#x4F;utput fields are at the top level. For example, `video_id` replaces `data.video_id`. The `error` and `warning` wrapper fields are removed.
- **Asset IDs instead of image keys:** Map `asset_id` from Upload an asset wherever you previously mapped an image key (`image/<id>/original.jpg`).

## Migration steps

To migrate a scenario that uses version 1 of the HeyGen app:

::::WorkflowBlock
:::WorkflowBlockItem
**Select version 2:** In the HeyGen app's module list, select **Version 2** in the version dropdown.
:::

:::WorkflowBlockItem
**Create a new connection:** Add any version 2 module, create a HeyGen connection, and enter your HeyGen API key. For details, see [Create the connection in Make ](docId\:j8v81UkFAXuY6FyqIfaci).
:::

:::WorkflowBlockItem
**Replace each module:** Use the module mapping and the module sections that follow to find the replacement for each version 1 module.
:::

:::WorkflowBlockItem
**Reconfigure the module fields:&#x20;**&#x53;plit multi-scene videos into separate Create a video modules. Replace **Dimension** with **Aspect ratio** and **Resolution**. Remove settings that no longer exist, such as test mode, silence, video background, and avatar scale, offset, and style.
:::

:::WorkflowBlockItem
**Use asset IDs instead of image keys:** Map `asset_id` from Upload an asset, or use an image URL. Add the file extension to the **File name** of the uploaded file.
:::

:::WorkflowBlockItem
**Re-map output fields:** Update every mapping that points to an old output field. For a list of renamed fields, see the output field mapping at the end of this section.
:::

:::WorkflowBlockItem
**Recreate triggers:** Replace Watch New Videos with Watch events, select the events you need, and check your `event_data` mappings.
:::

:::WorkflowBlockItem
**Update custom API calls:** Change `/v1/` and `/v2/` paths in Make an API call to their `/v3/` equivalents.
:::
::::

You've now migrated your scenario to version 2 of the HeyGen app.

## Module mapping

The following table shows the version 2 replacement for each version 1 module.

| **Version 1 module**                                               | **Version 2 module**                                                                                                    |
| ------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------- |
| Create an Avatar Video                                             | Create a video (**Video type**: **Avatar**)                                                                             |
| Generate an avatar IV video                                        | Create a video (**Video type**: **Image**)                                                                              |
| Create a Video Translation                                         | Create a video translation                                                                                              |
| Get a Video                                                        | Get a video                                                                                                             |
| Get a Video Translation                                            | Get a video translation                                                                                                 |
| Delete a Video                                                     | Delete a video                                                                                                          |
| List Avatars                                                       | List avatar looks (**Avatar type**: **Studio avatar** or **Digital twin**)                                              |
| List Talking Photos                                                | List avatar looks (**Avatar type**: **Photo avatar**)                                                                   |
| List Voices                                                        | List voices                                                                                                             |
| Upload an Asset                                                    | Upload an asset                                                                                                         |
| Make an API Call                                                   | Make an API call                                                                                                        |
| Watch New Videos                                                   | Watch events                                                                                                            |
| Create a Video from a Template                                     | No replacement. Use Make an API call.                                                                                   |
| Create a Folder, Update a Folder, Trash a Folder, Restore a Folder | No replacement. Use Make an API call. You can still set **Folder ID** in Create a video and Create a video translation. |

## Create a video

Create a video replaces Create an Avatar Video and Generate an avatar IV video.

### Replace Create an Avatar Video

**Title** and **Callback ID** are unchanged. The input form is restructured, so you must reconfigure each module by hand.

| **Change**                                                                                                                                                        | **What to do**                                                                                                             |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| **Video Inputs** (an array of scenes) is removed. Each video has one scene, and the character, voice, and background settings are at the top level of the module. | Split multi-scene videos into one Create a video module per scene or per video.                                            |
| **Video type** (required) replaces **Character Settings** > **Type**. Options are Avatar, Image, and Cinematic avatar.                                            | Select **Avatar** to reproduce the old behavior.                                                                           |
| **Avatar** is no longer chosen from a list. It is now **Avatar look ID**, a required text field.                                                                  | Map `id` from List avatar looks. Check `supported_api_engines` on that look, because some looks only support `avatar_iii`. |
| **Talking Photo ID** is removed. Talking photos are no longer a separate character type.                                                                          | Use the video type **Avatar** with a photo avatar look ID, or use the video type **Image**.                                |
| **Avatar scale**, **Avatar Style**, **Offset X/Y**, **Matting**, and **Circle Background Color** are removed.                                                     | Use **Fit** (Contain, Cover) and **Remove background** instead.                                                            |
| **Talking Photo crop style**, **talking style**, **expression style**, and **Super Resolution** are removed.                                                      | Use **Expressiveness** (Low, Medium, High) and **Motion prompt** instead.                                                  |
| **Speech source** (required) replaces **Voice Type**. Options are Script, Audio URL, and Audio asset. The Silence option is removed.                              | Select your speech source. Silence has no equivalent.                                                                      |
| **Input Text** is now **Script**, which is required when the speech source is Script.                                                                             | Re-map your text into **Script**.                                                                                          |
| Voice tuning moved into **Voice settings**: Speed, Pitch, Volume, and Locale. **Voice Emotion** is removed.                                                       | Re-map Voice Speed and Voice Pitch into **Voice settings**.                                                                |
| **Background** supports only a solid color or an image (URL or HeyGen asset). The video background is removed.                                                    | Re-map your background. Video backgrounds have no replacement.                                                             |
| **Dimension** (width and height in pixels) is replaced by **Aspect ratio** (16:9, 9:16, 4:5, 5:4, 1:1, auto) and **Resolution** (720p, 1080p, 4K).                | Select the aspect ratio and resolution closest to your old pixel dimensions.                                               |
| **Captions** is now **Burn captions into the video**.                                                                                                             | Re-select it when you replace the module.                                                                                  |
| **Test Mode** is removed.                                                                                                                                         | Remove any reference to it.                                                                                                |
| The output adds `status` and `output_format`. `video_id` is unchanged.                                                                                            | No action needed. Existing `video_id` mappings still work.                                                                 |

### Replace Generate an avatar IV video

| **Change**                                                                                                                                                                                                           | **What to do**                                                                       |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |
| The module is merged into Create a video.                                                                                                                                                                            | Replace the module and set **Video type** to **Image**.                              |
| **Image Asset** (an image key chosen from a list or mapped from Upload an asset) is replaced by **Image source** (required): URL, HeyGen asset (asset ID), or file data. The image key format is no longer accepted. | Map `asset_id` from Upload an asset, or enter an image URL.                          |
| **Video Title** (required) is now **Title** (optional).                                                                                                                                                              | No action needed.                                                                    |
| **Script** moves under **Speech source** > **Script** and stays required.                                                                                                                                            | Re-map your script.                                                                  |
| **Voice ID** (required) is now **Voice** (optional).                                                                                                                                                                 | No action needed.                                                                    |
| **Video Orientation** (Portrait, Landscape) is replaced by **Aspect ratio** (16:9, 9:16, 4:5, 5:4, 1:1, auto).                                                                                                       | Select the matching aspect ratio.                                                    |
| **Enhance Custom Motion Prompt** is removed. **Custom Motion Prompt** is now **Motion prompt**.                                                                                                                      | Re-map your motion prompt.                                                           |
| **Choose Audio Source** (URL, Asset ID) is now **Speech source** (Audio URL, Audio asset).                                                                                                                           | Re-select your audio source.                                                         |
| In the output, `data.video_id` is replaced by `video_id`. The `status` and `output_format` fields are added. The `error` and `warning` fields are removed.                                                           | Re-map `data.video_id` to `video_id`. Remove any mappings from `error` or `warning`. |

## Create a video translation

Create a video translation replaces Create a Video Translation. **Number of speakers**, **Title**, and **Callback ID** are unchanged.

| **Change**                                                                                                                                                                                                              | **What to do**                                                                                                               |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| **Video URL** is replaced by **Source video source** (required): URL or HeyGen asset. After you select one, enter the **Source video URL** or **Source video asset ID**.                                                | Re-map your video URL into the new field.                                                                                    |
| **Output Language** (a single language) is now **Output languages**, a required multiselect. The module creates one translation job for each language. Language values, such as Spanish, are the same in both versions. | Re-select your language.                                                                                                     |
| **Translate audio only** no longer has an explicit default. It previously defaulted to false.                                                                                                                           | Set it explicitly if you relied on the old default.                                                                          |
| In the output, `data.video_translate_id` and `data.video_translate_ids` are replaced by the `video_translation_ids[]` array, with one ID for each output language. The `error` and `warning` fields are removed.        | Map `video_translation_ids[1]` instead of `data.video_translate_id`, or iterate the array if you request multiple languages. |

## Get a video

Get a video replaces Get a Video.

:::hint{type="info"}
Before you migrate, check which fields your scenario reads from the old module. Its interface listed a `code`, `data`, and `message` envelope, but the module returned its fields in `body.data`.
:::

| **Change**                                                                                                                                                                                  | **What to do**                                                                                                     |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ |
| The module calls `/v3/videos/{video_id}` instead of the legacy `/v1/video_status.get`.                                                                                                      | Replace the module.                                                                                                |
| In the output, the `code`, `data`, and `message` envelope is removed. Every field is returned at the top level.                                                                             | Re-map every output. For example, `data.id` becomes `id` and `data.status` becomes `status`.                       |
| `data.caption_url` (the subtitle file) is now `subtitle_url`.                                                                                                                               | Re-map it.                                                                                                         |
| `data.video_url_caption` (the video with captions burned in) is now `captioned_video_url`.                                                                                                  | Re-map it.                                                                                                         |
| `data.error` is replaced by `failure_code` and `failure_message`.                                                                                                                           | Update your error handling to use the two new fields.                                                              |
| `data.callback_id` is removed.                                                                                                                                                              | Correlate on `id` instead.                                                                                         |
| The output adds `title`, `created_at`, `completed_at`, `video_page_url`, `folder_id`, and `output_language`. The `created_at` and `completed_at` fields are date values, not epoch numbers. | No action needed.                                                                                                  |
| **Video ID** is still required, but the field now opens in manual entry mode.                                                                                                               | Re-map your Video ID. You can map an ID from an earlier module directly instead of selecting it from the dropdown. |

:::hint{type="warning"}
The caption fields don't map the way their names suggest. The old `caption_url` is a subtitle file (.srt) and becomes `subtitle_url`. The old `video_url_caption` is an MP4 with captions burned in and becomes `captioned_video_url`. If you map `caption_url` to `captioned_video_url`, your scenario receives a video file where it expects a subtitle file.
:::

## Get a video translation

Get a video translation replaces Get a Video Translation.

| **Change**                                                                                                                                                                                                                                | **What to do**                                                            |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------- |
| The module calls `/v3/video-translations/{video_translation_id}` instead of the legacy `/v2/video_translate/{video_translate_id}`.                                                                                                        | Replace the module.                                                       |
| The input parameter `video_translate_id` is now `video_translation_id`. The label changes from **Video Translation ID** to **Video translation ID**.                                                                                      | Re-map your ID into the new field.                                        |
| The field was free text. It is now a select backed by the translation list and opens in manual entry mode.                                                                                                                                | Select a translation from the dropdown, or keep mapping the ID as before. |
| In the output, `video_translate_id` is now `id`.                                                                                                                                                                                          | Re-map it.                                                                |
| `url` is now `video_url`. The module also returns a separate `audio_url`.                                                                                                                                                                 | Re-map `url` to `video_url`.                                              |
| `message` is removed. `failure_message` is added.                                                                                                                                                                                         | If you used `message` to show errors, re-map it to `failure_message`.     |
| The output adds `input_language`, `output_language`, `duration`, `translate_audio_only`, `audio_url`, `srt_caption_url`, `vtt_caption_url`, `callback_id`, and `created_at`. The `created_at` field is a date value, not an epoch number. | No action needed.                                                         |

If you chain this module from Create a video translation, map `video_translation_ids[1]` into **Video translation ID** instead of `data.video_translate_id`.

Get a video and Get a video translation name their caption fields differently. In Get a video, the subtitle file is `subtitle_url`. In Get a video translation, it's `srt_caption_url`, and `vtt_caption_url` returns the WebVTT version. Check which module you're mapping from.

## Delete a video

Delete a video replaces Delete a Video.

| **Change**                                                                    | **What to do**                                                   |
| ----------------------------------------------------------------------------- | ---------------------------------------------------------------- |
| The input has no changes. **Video ID** is still required.                     | Replace the module and re-map **Video ID**.                      |
| The old module returned no output. The new module returns `id` and `deleted`. | No action needed. You can use the confirmation in later modules. |

## List avatar looks

List avatar looks replaces List Avatars and List Talking Photos.

| **Change**                                                                                                                                                                | **What to do**                                                                                    |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
| List Avatars and List Talking Photos are merged into one module.                                                                                                          | Replace both with List avatar looks. For talking photos, set **Avatar type** to **Photo avatar**. |
| New optional filters are available: **Avatar type** (Studio avatar, Digital twin, Photo avatar), **Ownership** (Public, Private), and **Avatar group ID**.                | Use them to narrow the results.                                                                   |
| In the output, `avatar_id` and `talking_photo_id` are now `id`. `avatar_name` and `talking_photo_name` are now `name`.                                                    | Re-map these fields.                                                                              |
| The output adds `avatar_type`, `group_id`, `default_voice_id`, `supported_api_engines[]`, `tags[]`, `image_width`, `image_height`, `preferred_orientation`, and `status`. | No action needed. Check `supported_api_engines` before you select an engine in Create a video.    |

The `preview_image_url` field is unchanged. The `gender` and `preview_video_url` fields were returned only by List Avatars. They're now returned for all look types.

## List voices

List voices replaces List Voices.

| **Change**                                                                                                                             | **What to do**                                                                              |
| -------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| The module calls `/v3/voices` instead of the legacy `/v2/voices`.                                                                      | Replace the module.                                                                         |
| In the output, `preview_audio` is now `preview_audio_url` and is typed as a URL instead of text.                                       | Re-map it.                                                                                  |
| `support_pause` keeps its name, but its label changes from **Support Pause** to **Supports pause**.                                    | No action needed. Re-select it if you picked it from the output list.                       |
| The output adds `type`, `support_locale`, `default_engine`, and `available_engines[]`.                                                 | No action needed.                                                                           |
| **Limit** changes from a plain number to a positive whole number. The default is still 10.                                             | No action needed unless you mapped a value that isn't a whole number.                       |
| New optional filters are available: **Type** (Public, Private), **Engine** (Starfish, Orca, ElevenLabs), **Language**, and **Gender**. | Leave **Type** empty to keep the old behavior. The module returns public voices by default. |
| Results now page automatically. The old module returned only what fit in a single response.                                            | If you previously capped **Limit** to what one page returned, you can raise it.             |

Check `default_engine` and `available_engines[]` before you set **Engine** in Create a video. These fields show which speech engines a voice supports, like `supported_api_engines` does for an avatar look.

## Upload an asset

Upload an asset replaces Upload an Asset.

| **Change**                                                                                                                                                                              | **What to do**                                                                                                                                                |
| --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Content Type** is removed. The file name extension now sets the file type. Supported extensions are png, jpeg, mp4, webm, mp3, wav, pdf, and srt.                                     | Remove the content type mapping and make sure your file name has the correct extension.                                                                       |
| **File name** is now required (previously optional) and must include the correct extension.                                                                                             | Map a file name with an extension.                                                                                                                            |
| **Data** is now **File data** and is required.                                                                                                                                          | Re-map your file data.                                                                                                                                        |
| Files can be 32 MB at most.                                                                                                                                                             | Check that your uploads are under 32 MB.                                                                                                                      |
| In the output, `id` is now `asset_id`. `image_key`, `name`, `file_type`, `folder_id`, `meta`, and `created_ts` are removed. `mime_type` and `size_bytes` are added. `url` is unchanged. | Map `asset_id` into other modules wherever you previously mapped `id` or `image_key`. No module accepts the old image key format (`image/<id>/original.jpg`). |

## Make an API call

Make an API call has no field changes. **URL**, **Method**, **Headers**, **Query string**, and **Body** are the same, and URLs are still relative to `https://api.heygen.com`. The output structure is also the same: `body`, `headers`, and `statusCode`.

| **Change**                                                                                                                                                                                            | **What to do**                                                                            |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------- |
| HeyGen marks `/v1/` and `/v2/` paths as legacy. Calls to these paths still work, but the response includes a `warning` object, a `deprecation: true` header, and a `sunset: Sat, 31 Oct 2026` header. | Rewrite your `/v1/` and `/v2/` paths to their `/v3/` equivalents before October 31, 2026. |

## Watch events

Watch events replaces Watch New Videos.

| **Change**                                                                                                                                                                             | **What to do**                                                                    |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------- |
| The trigger needs a new webhook on the new HeyGen connection.                                                                                                                          | Create a new webhook when you add the module.                                     |
| **Events** is now required (previously optional). The event list is the same in both versions, for example `avatar_video.success`, `avatar_video.fail`, and `video_translate.success`. | Select at least one event.                                                        |
| In the output, `event_data` no longer has labeled fields (`video_id`, `url`, `callback_id`). Its contents depend on the event HeyGen sends. `event_type` is unchanged.                 | Run the trigger once, then check and re-map anything that read from `event_data`. |

## Output field mapping

The following table lists the renamed output fields.

| **Old path**                                           | **New path**                              |
| ------------------------------------------------------ | ----------------------------------------- |
| `data.video_id` (Generate an avatar IV video)          | `video_id`                                |
| `data.video_translate_id` (Create a Video Translation) | `video_translation_ids[1]`                |
| `avatar_id`, `talking_photo_id`                        | `id`                                      |
| `avatar_name`, `talking_photo_name`                    | `name`                                    |
| `id` (Upload an Asset)                                 | `asset_id`                                |
| `image_key`                                            | `asset_id`                                |
| `data.<field>` (Get a Video)                           | `<field>`. The `data` wrapper is removed. |
| `data.caption_url`                                     | `subtitle_url`                            |
| `data.video_url_caption`                               | `captioned_video_url`                     |
| `data.error`                                           | `failure_code` and `failure_message`      |
| `video_translate_id` (Get a Video Translation)         | `id`                                      |
| `url` (Get a Video Translation)                        | `video_url`                               |
| `message` (Get a Video Translation)                    | `failure_message`                         |
| `preview_audio` (List Voices)                          | `preview_audio_url`                       |

# Templates

You can look for HeyGen templates in [Make's template gallery](https://www.make.com/en/templates), where you'll find thousands of pre-created scenarios.

# HeyGen resources

- [HeyGen API documentation](https://docs.heygen.com/reference/authentication)**
- [HeyGen Help Center](https://help.heygen.com/en/)

