@apteva/integrations 0.3.48 → 0.3.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,97 +1,165 @@
1
1
  {
2
2
  "slug": "heygen",
3
3
  "name": "HeyGen",
4
- "description": "MCP server for HeyGen AI video generation - avatars, videos, templates, streaming interactive avatars, video translation, talking photos, personalized video, and webhooks",
4
+ "description": "HeyGen AI video generation platform. Create lifelike avatar videos from text, generate one-shot videos with the Video Agent, translate videos into 175+ languages with lip-sync, manage photo avatars, digital twins, templates, and assets.",
5
5
  "logo": "https://www.google.com/s2/favicons?domain=heygen.com&sz=128",
6
6
  "categories": [
7
7
  "ai",
8
8
  "video",
9
9
  "avatars",
10
10
  "generation",
11
- "streaming",
12
11
  "translation"
13
12
  ],
14
13
  "base_url": "https://api.heygen.com",
15
14
  "auth": {
16
- "types": [
17
- "api_key"
18
- ],
15
+ "types": ["api_key"],
19
16
  "headers": {
20
17
  "X-Api-Key": "{{api_key}}"
21
18
  },
22
19
  "credential_fields": [
23
20
  {
24
21
  "name": "api_key",
25
- "label": "Api Key",
26
- "description": "Your HeyGen API Key"
22
+ "label": "HeyGen API Key",
23
+ "description": "Create one at https://app.heygen.com/settings?nav=API"
27
24
  }
28
25
  ]
29
26
  },
30
27
  "tools": [
31
28
  {
32
- "name": "list_avatars",
33
- "description": "List all available avatars (v2) including public and custom avatars with details like avatar_id, name, gender, and preview URLs",
34
- "method": "GET",
35
- "path": "/v2/avatars",
36
- "input_schema": {
37
- "type": "object",
38
- "properties": {}
39
- }
40
- },
41
- {
42
- "name": "get_avatar_details",
43
- "description": "Get detailed information about a specific avatar by its ID including supported poses, expressions, and capabilities",
44
- "method": "GET",
45
- "path": "/v2/avatar/{avatar_id}/details",
29
+ "name": "create_video_agent_v3",
30
+ "description": "Create a video with HeyGen's newest Video Agent API (v3). Give it a natural-language prompt plus an avatar and voice, and HeyGen builds the full video automatically — no scene composition needed. Returns a video id to poll via get_video_status. This is the newest one-shot video generation endpoint; prefer it over the older v1 video_agent_generate when the caller just wants 'make me a video about X'.",
31
+ "method": "POST",
32
+ "path": "/v3/video-agents",
46
33
  "input_schema": {
47
34
  "type": "object",
48
35
  "properties": {
36
+ "prompt": {
37
+ "type": "string",
38
+ "description": "Natural-language description of the video you want. Example: 'Create a 30-second explainer about the benefits of cold brew coffee for a cafe's Instagram feed.'"
39
+ },
49
40
  "avatar_id": {
50
41
  "type": "string",
51
- "description": "The avatar ID to get details for"
42
+ "description": "Avatar id from list_avatars. The Video Agent uses this avatar's voice and appearance throughout."
43
+ },
44
+ "voice_id": {
45
+ "type": "string",
46
+ "description": "Voice id from list_voices. Overrides the avatar's default voice when provided."
52
47
  }
53
48
  },
54
- "required": [
55
- "avatar_id"
56
- ]
49
+ "required": ["prompt"]
57
50
  }
58
51
  },
59
52
  {
60
- "name": "list_voices",
61
- "description": "List all available AI voices (v2) with details like voice_id, language, gender, name, and preview URL",
62
- "method": "GET",
63
- "path": "/v2/voices",
53
+ "name": "video_agent_generate",
54
+ "description": "Older one-shot video generation via the v1 Video Agent. Takes a natural-language prompt plus optional config (avatar, duration, orientation) and asset references. Kept for backward compatibility; for new integrations prefer create_video_agent_v3.",
55
+ "method": "POST",
56
+ "path": "/v1/video_agent/generate",
64
57
  "input_schema": {
65
58
  "type": "object",
66
- "properties": {}
59
+ "properties": {
60
+ "prompt": {
61
+ "type": "string",
62
+ "description": "Natural-language description of the video you want to create."
63
+ },
64
+ "config": {
65
+ "type": "object",
66
+ "description": "Optional generation config. Fields: avatar_id (string), duration_sec (integer, min 5), orientation ('portrait' | 'landscape')."
67
+ },
68
+ "files": {
69
+ "type": "array",
70
+ "description": "Array of asset references the agent can incorporate. Each entry: {\"asset_id\": \"...\"}",
71
+ "items": { "type": "object" }
72
+ },
73
+ "callback_id": {
74
+ "type": "string",
75
+ "description": "Custom identifier echoed back in completion webhooks."
76
+ },
77
+ "callback_url": {
78
+ "type": "string",
79
+ "description": "Webhook URL to notify when the video finishes generating."
80
+ }
81
+ },
82
+ "required": ["prompt"]
67
83
  }
68
84
  },
69
85
  {
70
- "name": "generate_voice_preview",
71
- "description": "Generate a short audio preview with a specified voice and text to hear how it sounds before creating a video",
86
+ "name": "generate_video",
87
+ "description": "Generate Video (V2) — canonical endpoint for producing an avatar video from text or audio. Supports Avatar III/IV, photo avatars, digital twins, and direct image input. Use one of avatar_id / image_url / image_asset_id as the subject, and one of script+voice_id / audio_url / audio_asset_id as the voice source. Asynchronous — poll status via get_video_status.",
72
88
  "method": "POST",
73
- "path": "/v2/voices/{voice_id}/preview",
89
+ "path": "/v2/videos",
74
90
  "input_schema": {
75
91
  "type": "object",
76
92
  "properties": {
93
+ "avatar_id": {
94
+ "type": "string",
95
+ "description": "Avatar id from list_avatars. Mutually exclusive with image_url / image_asset_id."
96
+ },
97
+ "image_url": {
98
+ "type": "string",
99
+ "description": "Public image URL to use as the subject. Mutually exclusive with avatar_id / image_asset_id."
100
+ },
101
+ "image_asset_id": {
102
+ "type": "string",
103
+ "description": "Uploaded image asset id. Mutually exclusive with avatar_id / image_url."
104
+ },
105
+ "script": {
106
+ "type": "string",
107
+ "description": "Text for the avatar to speak. Requires voice_id. Mutually exclusive with audio_url / audio_asset_id."
108
+ },
77
109
  "voice_id": {
78
110
  "type": "string",
79
- "description": "The voice ID to preview"
111
+ "description": "Voice id from list_voices. Required when script is provided."
112
+ },
113
+ "audio_url": {
114
+ "type": "string",
115
+ "description": "Public audio file URL to drive the avatar's lip-sync. Mutually exclusive with script."
116
+ },
117
+ "audio_asset_id": {
118
+ "type": "string",
119
+ "description": "Uploaded audio asset id. Mutually exclusive with script."
80
120
  },
81
- "text": {
121
+ "title": {
82
122
  "type": "string",
83
- "description": "Text to generate audio preview for"
123
+ "description": "Video title shown in the HeyGen dashboard."
124
+ },
125
+ "resolution": {
126
+ "type": "string",
127
+ "enum": ["720p", "1080p"],
128
+ "default": "1080p"
129
+ },
130
+ "aspect_ratio": {
131
+ "type": "string",
132
+ "enum": ["16:9", "9:16"],
133
+ "default": "16:9"
134
+ },
135
+ "motion_prompt": {
136
+ "type": "string",
137
+ "description": "Photo avatars only — free-text guidance for movement and expression."
138
+ },
139
+ "expressiveness": {
140
+ "type": "string",
141
+ "enum": ["low", "medium", "high"],
142
+ "description": "Photo avatars only."
143
+ },
144
+ "remove_background": {
145
+ "type": "boolean",
146
+ "default": false,
147
+ "description": "Output with transparent background (requires webm via create_webm_video for true alpha channel)."
148
+ },
149
+ "background": {
150
+ "type": "object",
151
+ "description": "Background config: {type: 'color'|'image', value: '#hex' (for color), url: 'https://...' or asset_id: '...' (for image)}."
152
+ },
153
+ "voice_settings": {
154
+ "type": "object",
155
+ "description": "Voice tuning: {speed: 0.5-1.5, pitch: -50 to +50, locale: 'en-US'}"
84
156
  }
85
- },
86
- "required": [
87
- "voice_id",
88
- "text"
89
- ]
157
+ }
90
158
  }
91
159
  },
92
160
  {
93
- "name": "generate_video",
94
- "description": "Generate an AI avatar video using the Studio backend. Supports avatars, voices, dynamic backgrounds, and multiple scenes. Returns a video_id to poll for status.",
161
+ "name": "generate_studio_video",
162
+ "description": "Generate Studio Video the earlier v2 multi-scene generator. Accepts an array of video_inputs where each entry is a scene with its own character (avatar + style), voice (script + voice_id or audio), and optional background. Use this when you need a multi-scene video with different avatars or backgrounds across scenes. For single-scene videos, prefer generate_video (POST /v2/videos) which has a simpler shape.",
95
163
  "method": "POST",
96
164
  "path": "/v2/video/generate",
97
165
  "input_schema": {
@@ -99,71 +167,72 @@
99
167
  "properties": {
100
168
  "video_inputs": {
101
169
  "type": "array",
102
- "description": "Array of scene inputs, each with character (avatar + voice), voice (script), and optional background",
103
- "items": {
104
- "type": "object"
105
- }
170
+ "description": "Array of scene inputs. Each entry: { character: {type: 'avatar'|'talking_photo', avatar_id: '...', avatar_style: 'normal'|'closeUp'}, voice: {type: 'text', input_text: '...', voice_id: '...'}, background: {type: 'color'|'image'|'video', value: '#hex' or url: '...'} }",
171
+ "items": { "type": "object" }
106
172
  },
107
173
  "dimension": {
108
174
  "type": "object",
109
- "description": "Video dimensions, e.g. {\"width\": 1920, \"height\": 1080}"
175
+ "description": "Output dimensions: {width: 1920, height: 1080}"
110
176
  },
111
177
  "test": {
112
178
  "type": "boolean",
113
- "description": "Set true to generate a free test video (watermarked)"
179
+ "description": "Generate a free watermarked test video. Leave unset / false when you're sure you want to spend credits."
114
180
  },
115
181
  "caption": {
116
182
  "type": "boolean",
117
- "description": "Enable auto-captions"
183
+ "description": "Enable auto-captions."
118
184
  },
119
185
  "title": {
120
- "type": "string",
121
- "description": "Video title"
186
+ "type": "string"
122
187
  },
123
188
  "callback_id": {
124
189
  "type": "string",
125
- "description": "Custom callback ID for webhook notifications"
190
+ "description": "Custom callback id for webhook notifications."
126
191
  }
127
192
  },
128
- "required": [
129
- "video_inputs"
130
- ]
193
+ "required": ["video_inputs"]
131
194
  }
132
195
  },
133
196
  {
134
- "name": "create_avatar_iv_video",
135
- "description": "Generate an Avatar IV video from a photo with advanced AI-powered motion and expressions. Uses next-gen photorealistic avatar technology.",
197
+ "name": "create_webm_video",
198
+ "description": "Generate a WebM-format avatar video with transparent background (true alpha channel). Ideal for overlays and web embedding where you need the avatar to composite over existing content.",
136
199
  "method": "POST",
137
- "path": "/v2/video/av4/generate",
200
+ "path": "/v1/video.webm",
138
201
  "input_schema": {
139
202
  "type": "object",
140
203
  "properties": {
141
- "avatar_id": {
204
+ "avatar_pose_id": {
142
205
  "type": "string",
143
- "description": "Avatar IV avatar ID"
206
+ "description": "Avatar pose id from list_avatars."
144
207
  },
145
- "voice": {
146
- "type": "object",
147
- "description": "Voice configuration with voice_id and input_text or input_audio"
208
+ "avatar_style": {
209
+ "type": "string",
210
+ "enum": ["normal", "closeUp"],
211
+ "default": "normal"
212
+ },
213
+ "input_text": {
214
+ "type": "string",
215
+ "description": "Text for the avatar to speak (provide this OR input_audio)."
216
+ },
217
+ "voice_id": {
218
+ "type": "string",
219
+ "description": "Required when input_text is provided."
220
+ },
221
+ "input_audio": {
222
+ "type": "string",
223
+ "description": "URL or asset id of pre-recorded audio (alternative to input_text + voice_id)."
148
224
  },
149
225
  "dimension": {
150
226
  "type": "object",
151
- "description": "Video dimensions"
152
- },
153
- "test": {
154
- "type": "boolean",
155
- "description": "Generate test video (watermarked)"
227
+ "description": "Custom output dimensions: {width: 512, height: 512}"
156
228
  }
157
229
  },
158
- "required": [
159
- "avatar_id",
160
- "voice"
161
- ]
230
+ "required": ["avatar_pose_id"]
162
231
  }
163
232
  },
164
233
  {
165
234
  "name": "get_video_status",
166
- "description": "Check the status of a video generation job. Returns status (processing, completed, failed), video_url when done, and duration.",
235
+ "description": "Poll the status of a video generation job. Returns status (processing | completed | failed), video_url when done, and duration. Poll every ~10 seconds until status is completed or failed.",
167
236
  "method": "GET",
168
237
  "path": "/v1/video_status.get",
169
238
  "input_schema": {
@@ -171,17 +240,16 @@
171
240
  "properties": {
172
241
  "video_id": {
173
242
  "type": "string",
174
- "description": "The video ID to check status for"
243
+ "description": "The video id returned from generate_video / generate_studio_video / create_video_agent_v3 / etc."
175
244
  }
176
245
  },
177
- "required": [
178
- "video_id"
179
- ]
180
- }
246
+ "required": ["video_id"]
247
+ },
248
+ "query_params": ["video_id"]
181
249
  },
182
250
  {
183
251
  "name": "list_videos",
184
- "description": "List all generated videos with their status, URLs, and metadata",
252
+ "description": "List every video generated under the account, with status, URL (when completed), duration, and metadata.",
185
253
  "method": "GET",
186
254
  "path": "/v1/video.list",
187
255
  "input_schema": {
@@ -189,32 +257,153 @@
189
257
  "properties": {
190
258
  "limit": {
191
259
  "type": "integer",
192
- "description": "Number of videos to return (max 100)"
260
+ "description": "Max videos to return (up to 100)."
261
+ },
262
+ "token": {
263
+ "type": "string",
264
+ "description": "Pagination token from the previous response."
193
265
  }
194
266
  }
195
- }
267
+ },
268
+ "query_params": ["limit", "token"]
196
269
  },
197
270
  {
198
271
  "name": "delete_video",
199
- "description": "Delete a generated video by its ID",
272
+ "description": "Delete a generated video by id.",
200
273
  "method": "DELETE",
201
274
  "path": "/v1/video.delete",
202
275
  "input_schema": {
203
276
  "type": "object",
204
277
  "properties": {
205
278
  "video_id": {
206
- "type": "string",
207
- "description": "The video ID to delete"
279
+ "type": "string"
280
+ }
281
+ },
282
+ "required": ["video_id"]
283
+ },
284
+ "query_params": ["video_id"]
285
+ },
286
+ {
287
+ "name": "get_sharable_url",
288
+ "description": "Get a non-expiring shareable URL for a completed video — useful for embedding the video on external sites or sharing with users who don't have a HeyGen account.",
289
+ "method": "POST",
290
+ "path": "/v1/video/sharable-url",
291
+ "input_schema": {
292
+ "type": "object",
293
+ "properties": {
294
+ "video_id": {
295
+ "type": "string"
296
+ }
297
+ },
298
+ "required": ["video_id"]
299
+ }
300
+ },
301
+ {
302
+ "name": "list_avatars",
303
+ "description": "List every public and custom avatar available to the account. Returns avatar_id, name, gender, preview image URL, and preview video URL for each. Call this first when you need an avatar_id for generate_video.",
304
+ "method": "GET",
305
+ "path": "/v2/avatars",
306
+ "input_schema": {
307
+ "type": "object",
308
+ "properties": {}
309
+ }
310
+ },
311
+ {
312
+ "name": "get_avatar_details",
313
+ "description": "Fetch full metadata for a specific avatar including supported poses, expressions, and capabilities.",
314
+ "method": "GET",
315
+ "path": "/v2/avatar/{avatar_id}/details",
316
+ "input_schema": {
317
+ "type": "object",
318
+ "properties": {
319
+ "avatar_id": {
320
+ "type": "string"
321
+ }
322
+ },
323
+ "required": ["avatar_id"]
324
+ }
325
+ },
326
+ {
327
+ "name": "list_avatar_groups",
328
+ "description": "List every avatar group (a collection of related avatars — e.g. the same person in different outfits or styles).",
329
+ "method": "GET",
330
+ "path": "/v2/avatar_group.list",
331
+ "input_schema": {
332
+ "type": "object",
333
+ "properties": {}
334
+ }
335
+ },
336
+ {
337
+ "name": "list_avatars_in_group",
338
+ "description": "List every avatar inside a specific avatar group.",
339
+ "method": "GET",
340
+ "path": "/v2/avatar_group/{group_id}/avatars",
341
+ "input_schema": {
342
+ "type": "object",
343
+ "properties": {
344
+ "group_id": {
345
+ "type": "string"
208
346
  }
209
347
  },
210
- "required": [
211
- "video_id"
212
- ]
348
+ "required": ["group_id"]
349
+ }
350
+ },
351
+ {
352
+ "name": "list_voices",
353
+ "description": "List every AI voice with voice_id, name, language, gender, accent, emotion support, and preview audio URL. Call this to discover voice_ids for generate_video.",
354
+ "method": "GET",
355
+ "path": "/v2/voices",
356
+ "input_schema": {
357
+ "type": "object",
358
+ "properties": {}
359
+ }
360
+ },
361
+ {
362
+ "name": "list_voice_locales",
363
+ "description": "List every BCP-47 locale code supported by the voice library (e.g. en-US, es-MX, fr-FR, ja-JP). Used with voice_settings.locale on generate_video to control pronunciation.",
364
+ "method": "GET",
365
+ "path": "/v2/voices/locales",
366
+ "input_schema": {
367
+ "type": "object",
368
+ "properties": {}
369
+ }
370
+ },
371
+ {
372
+ "name": "list_brand_voices",
373
+ "description": "List Brand Glossary entries — custom pronunciation and translation rules applied when using brand_voice_id on translate_video or generate_proofread.",
374
+ "method": "GET",
375
+ "path": "/v2/brand_voice/list",
376
+ "input_schema": {
377
+ "type": "object",
378
+ "properties": {}
379
+ }
380
+ },
381
+ {
382
+ "name": "update_brand_voice",
383
+ "description": "Update a Brand Glossary entry to add/modify custom terms and pronunciation rules used during video translation.",
384
+ "method": "POST",
385
+ "path": "/v2/brand_voice/update",
386
+ "input_schema": {
387
+ "type": "object",
388
+ "properties": {
389
+ "brand_voice_id": {
390
+ "type": "string"
391
+ },
392
+ "name": {
393
+ "type": "string"
394
+ },
395
+ "terms": {
396
+ "type": "array",
397
+ "description": "Array of custom term objects: {term: 'string', pronunciation: 'string', translation_hints: {'es': 'string', ...}}",
398
+ "items": { "type": "object" }
399
+ }
400
+ },
401
+ "required": ["brand_voice_id"]
213
402
  }
214
403
  },
215
404
  {
216
405
  "name": "list_templates",
217
- "description": "List all available video templates with their variable definitions for dynamic content",
406
+ "description": "List every video template created under the account. Each template defines a video structure with variables you can fill in to produce custom videos.",
218
407
  "method": "GET",
219
408
  "path": "/v2/templates",
220
409
  "input_schema": {
@@ -224,63 +413,69 @@
224
413
  },
225
414
  {
226
415
  "name": "get_template",
227
- "description": "Get a specific template by ID with all its variable definitions that can be dynamically populated during video generation",
416
+ "description": "Fetch a template's definition including all variables that can be replaced during generation. Use the V3 variant (get_template_v3) to also see per-scene variable mappings for templates created in the New AI Studio.",
228
417
  "method": "GET",
229
418
  "path": "/v2/template/{template_id}",
230
419
  "input_schema": {
231
420
  "type": "object",
232
421
  "properties": {
233
422
  "template_id": {
234
- "type": "string",
235
- "description": "The template ID"
423
+ "type": "string"
424
+ }
425
+ },
426
+ "required": ["template_id"]
427
+ }
428
+ },
429
+ {
430
+ "name": "get_template_v3",
431
+ "description": "Fetch a template's V3 definition — same as get_template but also returns the scenes field mapping each variable to the scene where it's used. Required for templates created in HeyGen's New AI Studio.",
432
+ "method": "GET",
433
+ "path": "/v3/template/{template_id}",
434
+ "input_schema": {
435
+ "type": "object",
436
+ "properties": {
437
+ "template_id": {
438
+ "type": "string"
236
439
  }
237
440
  },
238
- "required": [
239
- "template_id"
240
- ]
441
+ "required": ["template_id"]
241
442
  }
242
443
  },
243
444
  {
244
445
  "name": "generate_from_template",
245
- "description": "Generate a video from a template with dynamic variable substitution. Provide template variables to customize the video content.",
446
+ "description": "Generate a video from a template with dynamic variable substitution. Call get_template first to see the full list of variables you need to supply.",
246
447
  "method": "POST",
247
448
  "path": "/v2/template/{template_id}/generate",
248
449
  "input_schema": {
249
450
  "type": "object",
250
451
  "properties": {
251
452
  "template_id": {
252
- "type": "string",
253
- "description": "The template ID to generate from"
453
+ "type": "string"
254
454
  },
255
455
  "title": {
256
- "type": "string",
257
- "description": "Video title"
456
+ "type": "string"
258
457
  },
259
458
  "variables": {
260
459
  "type": "object",
261
- "description": "Template variables to substitute (keys are variable names from the template)"
460
+ "description": "Map of variable names to values: {name1: {name: 'name1', type: 'text', properties: {content: '...'}}, ...}. Shape depends on the variable's type (text, image, video, audio) — see the template definition from get_template."
262
461
  },
263
462
  "test": {
264
463
  "type": "boolean",
265
- "description": "Generate test video (watermarked)"
464
+ "description": "Generate a free watermarked test video."
266
465
  },
267
466
  "caption": {
268
- "type": "boolean",
269
- "description": "Enable captions"
467
+ "type": "boolean"
270
468
  },
271
469
  "callback_id": {
272
- "type": "string",
273
- "description": "Custom callback ID for webhook"
470
+ "type": "string"
274
471
  }
275
472
  },
276
- "required": [
277
- "template_id"
278
- ]
473
+ "required": ["template_id"]
279
474
  }
280
475
  },
281
476
  {
282
477
  "name": "translate_video",
283
- "description": "Translate a video into 175+ languages with natural-sounding voice and accurate lip-sync. Returns a video_translate_id to poll for status.",
478
+ "description": "Translate a video into one of 175+ target languages with natural-sounding voice and accurate lip-sync. Returns video_translate_id to poll via get_translation_status. For translation with human-in-the-loop review, use the proofread family (generate_proofread → download_proofread_srt → upload_proofread_srt → generate_video_from_proofread).",
284
479
  "method": "POST",
285
480
  "path": "/v2/video_translate",
286
481
  "input_schema": {
@@ -288,53 +483,52 @@
288
483
  "properties": {
289
484
  "video_url": {
290
485
  "type": "string",
291
- "description": "URL of the source video to translate"
486
+ "description": "Source video URL. Supports direct file URLs, Google Drive, and YouTube."
292
487
  },
293
488
  "output_language": {
294
489
  "type": "string",
295
- "description": "Target language code (e.g., 'es', 'fr', 'de', 'ja', 'zh')"
490
+ "description": "Target language (see list_target_languages). Example: 'Spanish', 'French'."
296
491
  },
297
492
  "title": {
298
- "type": "string",
299
- "description": "Title for the translated video"
493
+ "type": "string"
494
+ },
495
+ "speaker_num": {
496
+ "type": "integer",
497
+ "description": "Number of distinct speakers in the video (improves diarization accuracy)."
300
498
  },
301
- "mode": {
499
+ "brand_voice_id": {
302
500
  "type": "string",
303
- "description": "Translation quality mode: 'fast' or 'quality'",
304
- "default": "fast"
501
+ "description": "Brand Glossary id to apply custom translation/pronunciation rules."
502
+ },
503
+ "translate_audio_only": {
504
+ "type": "boolean",
505
+ "description": "Return a translated audio track only, skipping video lip-sync."
305
506
  },
306
507
  "callback_id": {
307
- "type": "string",
308
- "description": "Custom callback ID for webhook"
508
+ "type": "string"
309
509
  }
310
510
  },
311
- "required": [
312
- "video_url",
313
- "output_language"
314
- ]
511
+ "required": ["video_url", "output_language"]
315
512
  }
316
513
  },
317
514
  {
318
515
  "name": "get_translation_status",
319
- "description": "Check the status of a video translation job",
516
+ "description": "Poll a video translation job until status is completed or failed.",
320
517
  "method": "GET",
321
518
  "path": "/v2/video_translate/{video_translate_id}",
322
519
  "input_schema": {
323
520
  "type": "object",
324
521
  "properties": {
325
522
  "video_translate_id": {
326
- "type": "string",
327
- "description": "The translation job ID"
523
+ "type": "string"
328
524
  }
329
525
  },
330
- "required": [
331
- "video_translate_id"
332
- ]
526
+ "required": ["video_translate_id"]
333
527
  }
334
528
  },
335
529
  {
336
530
  "name": "list_target_languages",
337
- "description": "Get list of all supported target languages for video translation",
531
+ "description": "List every supported target language for video translation with display names and language codes.",
338
532
  "method": "GET",
339
533
  "path": "/v2/video_translate/target_languages",
340
534
  "input_schema": {
@@ -343,632 +537,618 @@
343
537
  }
344
538
  },
345
539
  {
346
- "name": "streaming_new",
347
- "description": "Create a new interactive avatar streaming session. Returns session_id and ICE server configuration for WebRTC.",
540
+ "name": "get_translation_caption",
541
+ "description": "Download the caption (SRT) file for a completed translated video useful for re-uploading the captions elsewhere or displaying them alongside the video.",
542
+ "method": "GET",
543
+ "path": "/v2/video_translate/{video_translate_id}/caption",
544
+ "input_schema": {
545
+ "type": "object",
546
+ "properties": {
547
+ "video_translate_id": {
548
+ "type": "string"
549
+ }
550
+ },
551
+ "required": ["video_translate_id"]
552
+ }
553
+ },
554
+ {
555
+ "name": "generate_proofread",
556
+ "description": "Generate a translation proofread — HeyGen translates the video and produces an SRT file for human review before the final lip-synced video is made. Use this for higher-quality translations where you want to correct the transcription before HeyGen commits to a final output. Returns a proofread_id. Scale or Enterprise plan only.",
348
557
  "method": "POST",
349
- "path": "/v1/streaming.new",
558
+ "path": "/v2/video_translate/proofread",
350
559
  "input_schema": {
351
560
  "type": "object",
352
561
  "properties": {
353
- "avatar_id": {
562
+ "video_url": {
354
563
  "type": "string",
355
- "description": "Streaming avatar ID"
564
+ "description": "Source video URL. Supports direct file URLs, Google Drive, and YouTube."
356
565
  },
357
- "voice": {
358
- "type": "object",
359
- "description": "Voice config: {\"voice_id\": \"...\", \"rate\": 1.0}"
566
+ "title": {
567
+ "type": "string"
360
568
  },
361
- "quality": {
569
+ "output_language": {
362
570
  "type": "string",
363
- "description": "Video quality: 'low', 'medium', 'high'",
364
- "default": "medium"
571
+ "description": "Single target language (use output_languages for batch)."
365
572
  },
366
- "version": {
367
- "type": "string",
368
- "description": "API version: 'v1' or 'v2'",
369
- "default": "v2"
573
+ "output_languages": {
574
+ "type": "array",
575
+ "description": "Multiple target languages for batch proofread generation.",
576
+ "items": { "type": "string" }
577
+ },
578
+ "brand_voice_id": {
579
+ "type": "string"
370
580
  },
371
- "knowledge_base_id": {
581
+ "speaker_num": {
582
+ "type": "integer"
583
+ },
584
+ "folder_id": {
372
585
  "type": "string",
373
- "description": "Optional knowledge base ID for Q&A capabilities"
586
+ "description": "Target folder id where the proofread should be stored."
587
+ },
588
+ "enable_video_stretching": {
589
+ "type": "boolean",
590
+ "description": "Dynamic duration adjustment for better lip-sync."
591
+ },
592
+ "disable_music_track": {
593
+ "type": "boolean"
594
+ },
595
+ "enable_speech_enhancement": {
596
+ "type": "boolean"
374
597
  }
375
598
  },
376
- "required": [
377
- "avatar_id"
378
- ]
599
+ "required": ["video_url", "title"]
379
600
  }
380
601
  },
381
602
  {
382
- "name": "streaming_start",
383
- "description": "Start an interactive avatar streaming session with WebRTC SDP exchange",
384
- "method": "POST",
385
- "path": "/v1/streaming.start",
603
+ "name": "get_proofread_status",
604
+ "description": "Poll a proofread generation job until the SRT is ready for download/review.",
605
+ "method": "GET",
606
+ "path": "/v2/video_translate/proofread/{proofread_id}",
386
607
  "input_schema": {
387
608
  "type": "object",
388
609
  "properties": {
389
- "session_id": {
390
- "type": "string",
391
- "description": "Session ID from streaming.new"
392
- },
393
- "sdp": {
394
- "type": "object",
395
- "description": "WebRTC SDP offer"
610
+ "proofread_id": {
611
+ "type": "string"
396
612
  }
397
613
  },
398
- "required": [
399
- "session_id",
400
- "sdp"
401
- ]
614
+ "required": ["proofread_id"]
402
615
  }
403
616
  },
404
617
  {
405
- "name": "streaming_ice",
406
- "description": "Send a WebRTC ICE candidate to the streaming session",
618
+ "name": "download_proofread_srt",
619
+ "description": "Get a download URL for the SRT file of a completed proofread. The agent/user reviews and edits the SRT, then uploads the corrected version via upload_proofread_srt.",
620
+ "method": "GET",
621
+ "path": "/v2/video_translate/proofread/{proofread_id}/srt",
622
+ "input_schema": {
623
+ "type": "object",
624
+ "properties": {
625
+ "proofread_id": {
626
+ "type": "string"
627
+ }
628
+ },
629
+ "required": ["proofread_id"]
630
+ }
631
+ },
632
+ {
633
+ "name": "upload_proofread_srt",
634
+ "description": "Upload a corrected SRT file back to an existing proofread via a presigned URL HeyGen returns. After this succeeds, call generate_video_from_proofread to produce the final lip-synced video.",
407
635
  "method": "POST",
408
- "path": "/v1/streaming.ice",
636
+ "path": "/v2/video_translate/proofread/{proofread_id}/srt",
409
637
  "input_schema": {
410
638
  "type": "object",
411
639
  "properties": {
412
- "session_id": {
413
- "type": "string",
414
- "description": "Session ID"
415
- },
416
- "candidate": {
417
- "type": "object",
418
- "description": "ICE candidate object"
640
+ "proofread_id": {
641
+ "type": "string"
419
642
  }
420
643
  },
421
- "required": [
422
- "session_id",
423
- "candidate"
424
- ]
644
+ "required": ["proofread_id"]
425
645
  }
426
646
  },
427
647
  {
428
- "name": "streaming_task",
429
- "description": "Send text to an interactive avatar, prompting it to speak. Can also send task_type 'repeat' to repeat or 'talk' (default).",
648
+ "name": "generate_video_from_proofread",
649
+ "description": "Produce the final translated video from an approved proofread. Returns a video_translate_id you can poll via get_translation_status.",
430
650
  "method": "POST",
431
- "path": "/v1/streaming.task",
651
+ "path": "/v2/video_translate/proofread/{proofread_id}/generate_video",
432
652
  "input_schema": {
433
653
  "type": "object",
434
654
  "properties": {
435
- "session_id": {
436
- "type": "string",
437
- "description": "Session ID"
438
- },
439
- "text": {
440
- "type": "string",
441
- "description": "Text for the avatar to speak"
442
- },
443
- "task_type": {
444
- "type": "string",
445
- "description": "Task type: 'talk' or 'repeat'",
446
- "default": "talk"
447
- },
448
- "task_mode": {
449
- "type": "string",
450
- "description": "Task mode: 'async' or 'sync'",
451
- "default": "async"
655
+ "proofread_id": {
656
+ "type": "string"
452
657
  }
453
658
  },
454
- "required": [
455
- "session_id",
456
- "text"
457
- ]
659
+ "required": ["proofread_id"]
458
660
  }
459
661
  },
460
662
  {
461
- "name": "streaming_interrupt",
462
- "description": "Interrupt the avatar while it is speaking in a streaming session",
663
+ "name": "create_photo_avatar",
664
+ "description": "Generate a personalized AI avatar from text prompts and attribute inputs. The result is a new photo avatar you can use with generate_video.",
463
665
  "method": "POST",
464
- "path": "/v1/streaming.interrupt",
666
+ "path": "/v2/photo_avatar/photo/generate",
465
667
  "input_schema": {
466
668
  "type": "object",
467
669
  "properties": {
468
- "session_id": {
670
+ "name": {
671
+ "type": "string",
672
+ "description": "Display name for the avatar."
673
+ },
674
+ "age": {
675
+ "type": "string",
676
+ "description": "Age group (e.g. 'Young Adult', 'Adult', 'Senior')."
677
+ },
678
+ "gender": {
679
+ "type": "string",
680
+ "enum": ["Man", "Woman"]
681
+ },
682
+ "ethnicity": {
469
683
  "type": "string",
470
- "description": "Session ID"
684
+ "description": "Ethnicity hint (e.g. 'East Asian', 'Black', 'White', 'Hispanic')."
685
+ },
686
+ "orientation": {
687
+ "type": "string",
688
+ "enum": ["horizontal", "vertical", "square"]
689
+ },
690
+ "pose": {
691
+ "type": "string",
692
+ "description": "Pose description (e.g. 'half_body', 'full_body')."
693
+ },
694
+ "style": {
695
+ "type": "string",
696
+ "description": "Style hint (e.g. 'Realistic', 'Cinematic')."
697
+ },
698
+ "appearance": {
699
+ "type": "string",
700
+ "description": "Free-text appearance description ('short brown hair, glasses, casual shirt')."
471
701
  }
472
702
  },
473
- "required": [
474
- "session_id"
475
- ]
703
+ "required": ["name"]
476
704
  }
477
705
  },
478
706
  {
479
- "name": "streaming_stop",
480
- "description": "Stop and close an interactive avatar streaming session",
707
+ "name": "create_photo_avatar_group",
708
+ "description": "Create a photo avatar group — a container for multiple looks of the same avatar subject. Used before train_photo_avatar_group and add_looks_to_photo_avatar_group.",
481
709
  "method": "POST",
482
- "path": "/v1/streaming.stop",
710
+ "path": "/v2/photo_avatar/avatar_group/create",
483
711
  "input_schema": {
484
712
  "type": "object",
485
713
  "properties": {
486
- "session_id": {
714
+ "name": {
715
+ "type": "string"
716
+ },
717
+ "image_key": {
487
718
  "type": "string",
488
- "description": "Session ID"
719
+ "description": "Initial photo image_key from a previously-uploaded asset."
489
720
  }
490
721
  },
491
- "required": [
492
- "session_id"
493
- ]
722
+ "required": ["name", "image_key"]
494
723
  }
495
724
  },
496
725
  {
497
- "name": "streaming_list_sessions",
498
- "description": "List all streaming session history with pagination, optional date range and status filtering",
499
- "method": "GET",
500
- "path": "/v2/streaming.list",
726
+ "name": "add_looks_to_photo_avatar_group",
727
+ "description": "Add additional look images to an existing photo avatar group. Used to feed HeyGen more photos of the same person for higher-quality avatar training.",
728
+ "method": "POST",
729
+ "path": "/v2/photo_avatar/avatar_group/add",
501
730
  "input_schema": {
502
731
  "type": "object",
503
732
  "properties": {
504
- "limit": {
505
- "type": "integer",
506
- "description": "Number of sessions to return"
733
+ "group_id": {
734
+ "type": "string"
507
735
  },
508
- "offset": {
509
- "type": "integer",
510
- "description": "Pagination offset"
736
+ "image_keys": {
737
+ "type": "array",
738
+ "description": "Array of image_key strings from uploaded assets.",
739
+ "items": { "type": "string" }
511
740
  }
512
- }
741
+ },
742
+ "required": ["group_id", "image_keys"]
513
743
  }
514
744
  },
515
745
  {
516
- "name": "streaming_create_token",
517
- "description": "Create a temporary access token for client-side streaming SDK integration",
746
+ "name": "train_photo_avatar_group",
747
+ "description": "Initiate the training process for a photo avatar group. HeyGen builds an AI model from the group's photos so the avatar is consistent across generated looks. Poll get_training_job_status.",
518
748
  "method": "POST",
519
- "path": "/v1/streaming.create_token",
749
+ "path": "/v2/photo_avatar/train",
520
750
  "input_schema": {
521
751
  "type": "object",
522
- "properties": {}
752
+ "properties": {
753
+ "group_id": {
754
+ "type": "string"
755
+ }
756
+ },
757
+ "required": ["group_id"]
523
758
  }
524
759
  },
525
760
  {
526
- "name": "list_streaming_avatars",
527
- "description": "List all public and custom avatars available for interactive streaming sessions",
761
+ "name": "get_training_job_status",
762
+ "description": "Poll a photo avatar training job until status is done.",
528
763
  "method": "GET",
529
- "path": "/v1/streaming/avatar.list",
764
+ "path": "/v2/photo_avatar/train/status/{group_id}",
530
765
  "input_schema": {
531
766
  "type": "object",
532
- "properties": {}
767
+ "properties": {
768
+ "group_id": {
769
+ "type": "string"
770
+ }
771
+ },
772
+ "required": ["group_id"]
533
773
  }
534
774
  },
535
775
  {
536
- "name": "list_talking_photos",
537
- "description": "List all talking photos that can be animated with voice to create short videos",
538
- "method": "GET",
539
- "path": "/v1/talking_photo.list",
776
+ "name": "generate_photo_avatar_looks",
777
+ "description": "Generate additional looks (new images) for a trained photo avatar group. Produces variations in pose/expression/setting while keeping the same subject identity.",
778
+ "method": "POST",
779
+ "path": "/v2/photo_avatar/look/generate",
540
780
  "input_schema": {
541
781
  "type": "object",
542
- "properties": {}
782
+ "properties": {
783
+ "group_id": {
784
+ "type": "string"
785
+ },
786
+ "prompt": {
787
+ "type": "string",
788
+ "description": "Free-text description of the new look ('wearing a black suit in an office')."
789
+ },
790
+ "orientation": {
791
+ "type": "string",
792
+ "enum": ["horizontal", "vertical", "square"]
793
+ },
794
+ "pose": {
795
+ "type": "string"
796
+ },
797
+ "style": {
798
+ "type": "string"
799
+ }
800
+ },
801
+ "required": ["group_id", "prompt"]
543
802
  }
544
803
  },
545
804
  {
546
- "name": "upload_talking_photo",
547
- "description": "Upload a new talking photo that can be animated with voice",
805
+ "name": "add_photo_avatar_motion",
806
+ "description": "Add motion/animation to a still photo avatar look converts a static image into a subtly animated one that looks alive. Precondition for using the photo avatar in video generation with non-trivial movement.",
548
807
  "method": "POST",
549
- "path": "/v1/talking_photo",
808
+ "path": "/v2/photo_avatar/add_motion",
550
809
  "input_schema": {
551
810
  "type": "object",
552
811
  "properties": {
553
- "image_url": {
812
+ "avatar_id": {
554
813
  "type": "string",
555
- "description": "URL of the photo to upload"
814
+ "description": "Photo avatar look id."
556
815
  }
557
816
  },
558
- "required": [
559
- "image_url"
560
- ]
817
+ "required": ["avatar_id"]
561
818
  }
562
819
  },
563
820
  {
564
- "name": "delete_talking_photo",
565
- "description": "Delete a talking photo by its ID",
566
- "method": "DELETE",
567
- "path": "/v2/talking_photo/{talking_photo_id}",
821
+ "name": "get_photo_look_status",
822
+ "description": "Check the generation status of a photo avatar look (for create_photo_avatar, generate_photo_avatar_looks, or add_photo_avatar_motion).",
823
+ "method": "GET",
824
+ "path": "/v2/photo_avatar/{avatar_id}",
568
825
  "input_schema": {
569
826
  "type": "object",
570
827
  "properties": {
571
- "talking_photo_id": {
572
- "type": "string",
573
- "description": "The talking photo ID to delete"
828
+ "avatar_id": {
829
+ "type": "string"
574
830
  }
575
831
  },
576
- "required": [
577
- "talking_photo_id"
578
- ]
832
+ "required": ["avatar_id"]
579
833
  }
580
834
  },
581
835
  {
582
- "name": "upload_asset",
583
- "description": "Upload an asset (image, audio, video) to use in video generation",
584
- "method": "POST",
585
- "path": "/v1/asset",
836
+ "name": "delete_photo_avatar",
837
+ "description": "Delete a single photo avatar look by id.",
838
+ "method": "DELETE",
839
+ "path": "/v2/photo_avatar/{avatar_id}",
586
840
  "input_schema": {
587
841
  "type": "object",
588
842
  "properties": {
589
- "url": {
590
- "type": "string",
591
- "description": "URL of the asset to upload"
592
- },
593
- "type": {
594
- "type": "string",
595
- "description": "Asset type: 'image', 'audio', 'video'"
843
+ "avatar_id": {
844
+ "type": "string"
596
845
  }
597
846
  },
598
- "required": [
599
- "url",
600
- "type"
601
- ]
847
+ "required": ["avatar_id"]
602
848
  }
603
849
  },
604
850
  {
605
- "name": "get_remaining_quota",
606
- "description": "Get your account's remaining API quota/credits",
607
- "method": "GET",
608
- "path": "/v2/user/remaining_quota",
851
+ "name": "delete_photo_avatar_group",
852
+ "description": "Delete an entire photo avatar group (along with every look inside it). Irreversible.",
853
+ "method": "DELETE",
854
+ "path": "/v2/photo_avatar/avatar_group/{group_id}",
609
855
  "input_schema": {
610
856
  "type": "object",
611
- "properties": {}
857
+ "properties": {
858
+ "group_id": {
859
+ "type": "string"
860
+ }
861
+ },
862
+ "required": ["group_id"]
612
863
  }
613
864
  },
614
865
  {
615
- "name": "add_webhook",
616
- "description": "Register a webhook endpoint to receive real-time event notifications (video.completed, video.failed, etc.)",
866
+ "name": "create_digital_twin",
867
+ "description": "Create a digital twin avatar from training footage. Submit a training-footage video URL and a consent-statement video URL; HeyGen builds a lifelike avatar of the person that can be used like any other avatar_id in generate_video. Training takes several minutes to hours — poll via get_digital_twin_status.",
617
868
  "method": "POST",
618
- "path": "/v1/webhook/endpoint.add",
869
+ "path": "/v1/video-avatar/create",
619
870
  "input_schema": {
620
871
  "type": "object",
621
872
  "properties": {
622
- "url": {
873
+ "training_footage_url": {
623
874
  "type": "string",
624
- "description": "Webhook endpoint URL"
875
+ "description": "Public URL of the training footage video (typically 2-5 min of the person speaking to camera)."
625
876
  },
626
- "events": {
627
- "type": "array",
628
- "description": "Event types to subscribe to, e.g. ['avatar_video.success', 'avatar_video.fail']",
629
- "items": {
630
- "type": "string"
631
- }
877
+ "video_consent_url": {
878
+ "type": "string",
879
+ "description": "Public URL of the consent-statement video."
880
+ },
881
+ "avatar_name": {
882
+ "type": "string"
632
883
  }
633
884
  },
634
- "required": [
635
- "url",
636
- "events"
637
- ]
885
+ "required": ["training_footage_url", "video_consent_url", "avatar_name"]
638
886
  }
639
887
  },
640
888
  {
641
- "name": "list_webhook_endpoints",
642
- "description": "List all registered webhook endpoints",
889
+ "name": "get_digital_twin_status",
890
+ "description": "Poll a digital twin training job.",
643
891
  "method": "GET",
644
- "path": "/v1/webhook/endpoint.list",
892
+ "path": "/v1/video-avatar/{digital_twin_id}/status",
645
893
  "input_schema": {
646
894
  "type": "object",
647
- "properties": {}
895
+ "properties": {
896
+ "digital_twin_id": {
897
+ "type": "string"
898
+ }
899
+ },
900
+ "required": ["digital_twin_id"]
648
901
  }
649
902
  },
650
903
  {
651
- "name": "delete_webhook",
652
- "description": "Delete a registered webhook endpoint",
904
+ "name": "delete_digital_twin",
905
+ "description": "Delete a digital twin avatar by id.",
653
906
  "method": "DELETE",
654
- "path": "/v1/webhook/endpoint.delete",
907
+ "path": "/v1/video-avatar/{digital_twin_id}",
655
908
  "input_schema": {
656
909
  "type": "object",
657
910
  "properties": {
658
- "endpoint_id": {
659
- "type": "string",
660
- "description": "The webhook endpoint ID to delete"
911
+ "digital_twin_id": {
912
+ "type": "string"
661
913
  }
662
914
  },
663
- "required": [
664
- "endpoint_id"
665
- ]
915
+ "required": ["digital_twin_id"]
666
916
  }
667
917
  },
668
918
  {
669
- "name": "video_agent_generate",
670
- "description": "One-shot video generation from a natural language prompt. The Video Agent automatically selects the best avatar, voice, background, and script to produce a complete video. No need to specify individual parameters.",
671
- "method": "POST",
672
- "path": "/v1/video_agent/generate",
919
+ "name": "list_assets",
920
+ "description": "List every asset (image, audio, video) uploaded under the account. Paginated via token. Assets are referenced by asset_id in generate_video (image_asset_id, audio_asset_id) and create_video_agent_v3 (files array).",
921
+ "method": "GET",
922
+ "path": "/v1/asset/list",
673
923
  "input_schema": {
674
924
  "type": "object",
675
925
  "properties": {
676
- "prompt": {
926
+ "folder_id": {
677
927
  "type": "string",
678
- "description": "Natural language description of the video you want to create, e.g. 'Create a 30-second product demo for a fitness app'"
928
+ "description": "Filter by folder id."
679
929
  },
680
- "model": {
930
+ "file_type": {
681
931
  "type": "string",
682
- "description": "Model to use for generation"
932
+ "enum": ["image", "audio", "video"]
683
933
  },
684
- "avatar_id": {
685
- "type": "string",
686
- "description": "Optional: specify an avatar ID instead of letting the agent choose"
687
- },
688
- "voice_id": {
689
- "type": "string",
690
- "description": "Optional: specify a voice ID instead of letting the agent choose"
691
- },
692
- "test": {
693
- "type": "boolean",
694
- "description": "Generate a free test video (watermarked)"
934
+ "limit": {
935
+ "type": "integer",
936
+ "description": "Max assets to return (0-100)."
695
937
  },
696
- "callback_id": {
938
+ "token": {
697
939
  "type": "string",
698
- "description": "Custom callback ID for webhook notifications"
940
+ "description": "Pagination token from the previous response."
699
941
  }
700
- },
701
- "required": [
702
- "prompt"
703
- ]
704
- }
942
+ }
943
+ },
944
+ "query_params": ["folder_id", "file_type", "limit", "token"]
705
945
  },
706
946
  {
707
- "name": "create_webm_video",
708
- "description": "Generate a WebM format avatar video with transparent background support. Ideal for overlays and web embedding.",
709
- "method": "POST",
710
- "path": "/v1/video.webm",
947
+ "name": "delete_asset",
948
+ "description": "Delete a specific asset by id. Removes it from the account permanently.",
949
+ "method": "DELETE",
950
+ "path": "/v1/asset/{asset_id}",
711
951
  "input_schema": {
712
952
  "type": "object",
713
953
  "properties": {
714
- "avatar_pose_id": {
715
- "type": "string",
716
- "description": "ID of the avatar's pose (from List All Avatars)"
717
- },
718
- "avatar_style": {
719
- "type": "string",
720
- "description": "Visual style: 'normal' or 'closeUp'",
721
- "default": "normal"
722
- },
723
- "input_text": {
724
- "type": "string",
725
- "description": "Text for the avatar to speak (provide this OR input_audio)"
726
- },
727
- "voice_id": {
728
- "type": "string",
729
- "description": "Voice ID (required with input_text)"
730
- },
731
- "input_audio": {
732
- "type": "string",
733
- "description": "URL/ID of uploaded audio (alternative to input_text+voice_id)"
734
- },
735
- "dimension": {
736
- "type": "object",
737
- "description": "Custom output dimensions: {\"width\": 512, \"height\": 512}"
954
+ "asset_id": {
955
+ "type": "string"
738
956
  }
739
957
  },
740
- "required": [
741
- "avatar_pose_id"
742
- ]
958
+ "required": ["asset_id"]
743
959
  }
744
960
  },
745
961
  {
746
- "name": "get_sharable_url",
747
- "description": "Get a shareable URL for a completed video that doesn't expire",
962
+ "name": "create_folder",
963
+ "description": "Create a new folder under the account for organizing videos, assets, and templates.",
748
964
  "method": "POST",
749
- "path": "/v1/video/sharable-url",
965
+ "path": "/v1/folders",
750
966
  "input_schema": {
751
967
  "type": "object",
752
968
  "properties": {
753
- "video_id": {
969
+ "name": {
970
+ "type": "string"
971
+ },
972
+ "parent_id": {
754
973
  "type": "string",
755
- "description": "The video ID to get a sharable URL for"
974
+ "description": "Parent folder id. Omit for root-level folder."
756
975
  }
757
976
  },
758
- "required": [
759
- "video_id"
760
- ]
977
+ "required": ["name"]
761
978
  }
762
979
  },
763
980
  {
764
- "name": "list_avatar_groups",
765
- "description": "List all avatar groups (collections of related avatars)",
981
+ "name": "list_folders",
982
+ "description": "List folders with filtering by parent and name. Use is_trash=true to view trashed folders.",
766
983
  "method": "GET",
767
- "path": "/v2/avatar-groups",
768
- "input_schema": {
769
- "type": "object",
770
- "properties": {}
771
- }
772
- },
773
- {
774
- "name": "list_avatars_in_group",
775
- "description": "List all avatars belonging to a specific avatar group",
776
- "method": "GET",
777
- "path": "/v2/avatar-groups/{group_id}/avatars",
984
+ "path": "/v1/folders",
778
985
  "input_schema": {
779
986
  "type": "object",
780
987
  "properties": {
781
- "group_id": {
988
+ "limit": {
989
+ "type": "integer"
990
+ },
991
+ "parent_id": {
992
+ "type": "string"
993
+ },
994
+ "name_filter": {
782
995
  "type": "string",
783
- "description": "The avatar group ID"
996
+ "description": "Partial name search."
997
+ },
998
+ "is_trash": {
999
+ "type": "boolean",
1000
+ "description": "Return trashed folders instead of live ones."
1001
+ },
1002
+ "token": {
1003
+ "type": "string"
784
1004
  }
785
- },
786
- "required": [
787
- "group_id"
788
- ]
789
- }
1005
+ }
1006
+ },
1007
+ "query_params": ["limit", "parent_id", "name_filter", "is_trash", "token"]
790
1008
  },
791
1009
  {
792
- "name": "create_photo_avatar",
793
- "description": "Create a new photo avatar from an uploaded image for live-looking video generation",
794
- "method": "POST",
795
- "path": "/v1/photo_avatar/photo/generate",
1010
+ "name": "update_folder",
1011
+ "description": "Rename an existing folder.",
1012
+ "method": "PATCH",
1013
+ "path": "/v1/folders/{folder_id}",
796
1014
  "input_schema": {
797
1015
  "type": "object",
798
1016
  "properties": {
799
- "image_url": {
800
- "type": "string",
801
- "description": "URL of the photo to use for avatar creation"
1017
+ "folder_id": {
1018
+ "type": "string"
802
1019
  },
803
1020
  "name": {
804
1021
  "type": "string",
805
- "description": "Name for the photo avatar"
1022
+ "description": "New folder name."
806
1023
  }
807
1024
  },
808
- "required": [
809
- "image_url"
810
- ]
1025
+ "required": ["folder_id", "name"]
811
1026
  }
812
1027
  },
813
1028
  {
814
- "name": "train_photo_avatar",
815
- "description": "Train a photo avatar group to improve quality and consistency across looks",
816
- "method": "POST",
817
- "path": "/v1/photo_avatar/train",
1029
+ "name": "trash_folder",
1030
+ "description": "Move a folder to the trash (soft delete restorable via restore_folder).",
1031
+ "method": "DELETE",
1032
+ "path": "/v1/folders/{folder_id}",
818
1033
  "input_schema": {
819
1034
  "type": "object",
820
1035
  "properties": {
821
- "group_id": {
822
- "type": "string",
823
- "description": "Photo avatar group ID to train"
1036
+ "folder_id": {
1037
+ "type": "string"
824
1038
  }
825
1039
  },
826
- "required": [
827
- "group_id"
828
- ]
1040
+ "required": ["folder_id"]
829
1041
  }
830
1042
  },
831
1043
  {
832
- "name": "generate_photo_avatar_look",
833
- "description": "Generate new looks/styles for an existing photo avatar",
1044
+ "name": "restore_folder",
1045
+ "description": "Restore a previously trashed folder, returning it to its original location.",
834
1046
  "method": "POST",
835
- "path": "/v1/photo_avatar/look/generate",
1047
+ "path": "/v1/folders/{folder_id}/restore",
836
1048
  "input_schema": {
837
1049
  "type": "object",
838
1050
  "properties": {
839
- "avatar_id": {
840
- "type": "string",
841
- "description": "Photo avatar ID"
842
- },
843
- "look_config": {
844
- "type": "object",
845
- "description": "Look configuration options"
1051
+ "folder_id": {
1052
+ "type": "string"
846
1053
  }
847
1054
  },
848
- "required": [
849
- "avatar_id"
850
- ]
1055
+ "required": ["folder_id"]
851
1056
  }
852
1057
  },
853
1058
  {
854
- "name": "add_photo_avatar_motion",
855
- "description": "Add motion/animation to a photo avatar for more natural video output",
856
- "method": "POST",
857
- "path": "/v1/photo_avatar/add_motion",
1059
+ "name": "get_current_user",
1060
+ "description": "Get the authenticated user's profile information (email, plan, account id, etc).",
1061
+ "method": "GET",
1062
+ "path": "/v1/user/me",
858
1063
  "input_schema": {
859
1064
  "type": "object",
860
- "properties": {
861
- "avatar_id": {
862
- "type": "string",
863
- "description": "Photo avatar ID"
864
- },
865
- "motion_config": {
866
- "type": "object",
867
- "description": "Motion configuration"
868
- }
869
- },
870
- "required": [
871
- "avatar_id"
872
- ]
1065
+ "properties": {}
873
1066
  }
874
1067
  },
875
1068
  {
876
- "name": "create_digital_twin",
877
- "description": "Create a digital twin avatar from training footage video. Submit training footage and consent video to start the avatar creation process.",
1069
+ "name": "get_remaining_quota",
1070
+ "description": "Get the account's remaining API credit quota. Check this before starting expensive operations (digital twin training, batch translation, large template generation) to avoid mid-job credit exhaustion.",
1071
+ "method": "GET",
1072
+ "path": "/v2/user/remaining_quota",
1073
+ "input_schema": {
1074
+ "type": "object",
1075
+ "properties": {}
1076
+ }
1077
+ },
1078
+ {
1079
+ "name": "add_webhook_endpoint",
1080
+ "description": "Register a webhook endpoint to receive real-time notifications when videos complete, translations finish, etc. Events list available via list_available_webhook_events.",
878
1081
  "method": "POST",
879
- "path": "/v1/digital-twin/create",
1082
+ "path": "/v1/webhook/endpoint.add",
880
1083
  "input_schema": {
881
1084
  "type": "object",
882
1085
  "properties": {
883
- "training_footage_url": {
884
- "type": "string",
885
- "description": "URL of the training footage video"
886
- },
887
- "video_consent_url": {
1086
+ "url": {
888
1087
  "type": "string",
889
- "description": "URL of the consent video"
1088
+ "description": "HTTPS endpoint URL that will receive POST notifications."
890
1089
  },
891
- "avatar_name": {
892
- "type": "string",
893
- "description": "Name for the digital twin avatar"
1090
+ "events": {
1091
+ "type": "array",
1092
+ "description": "Array of event name strings (e.g. ['avatar_video.success', 'avatar_video.fail'])",
1093
+ "items": { "type": "string" }
894
1094
  }
895
1095
  },
896
- "required": [
897
- "training_footage_url",
898
- "video_consent_url",
899
- "avatar_name"
900
- ]
1096
+ "required": ["url", "events"]
901
1097
  }
902
1098
  },
903
1099
  {
904
- "name": "get_digital_twin_status",
905
- "description": "Check the training/generation status of a digital twin avatar",
1100
+ "name": "list_webhook_endpoints",
1101
+ "description": "List every registered webhook endpoint with its id, URL, and subscribed events.",
906
1102
  "method": "GET",
907
- "path": "/v1/digital-twin/{digital_twin_id}/status",
1103
+ "path": "/v1/webhook/endpoint.list",
908
1104
  "input_schema": {
909
1105
  "type": "object",
910
- "properties": {
911
- "digital_twin_id": {
912
- "type": "string",
913
- "description": "The digital twin ID"
914
- }
915
- },
916
- "required": [
917
- "digital_twin_id"
918
- ]
1106
+ "properties": {}
919
1107
  }
920
1108
  },
921
1109
  {
922
- "name": "delete_digital_twin",
923
- "description": "Delete a digital twin avatar",
924
- "method": "DELETE",
925
- "path": "/v1/digital-twin/{digital_twin_id}",
1110
+ "name": "update_webhook_endpoint",
1111
+ "description": "Update a webhook endpoint's URL or event subscriptions.",
1112
+ "method": "PATCH",
1113
+ "path": "/v1/webhook/endpoint",
926
1114
  "input_schema": {
927
1115
  "type": "object",
928
1116
  "properties": {
929
- "digital_twin_id": {
930
- "type": "string",
931
- "description": "The digital twin ID to delete"
1117
+ "endpoint_id": {
1118
+ "type": "string"
1119
+ },
1120
+ "url": {
1121
+ "type": "string"
1122
+ },
1123
+ "events": {
1124
+ "type": "array",
1125
+ "items": { "type": "string" }
932
1126
  }
933
1127
  },
934
- "required": [
935
- "digital_twin_id"
936
- ]
1128
+ "required": ["endpoint_id"]
937
1129
  }
938
1130
  },
939
1131
  {
940
- "name": "text_to_speech",
941
- "description": "Generate audio from text using HeyGen's AI voices (Starfish TTS engine)",
942
- "method": "POST",
943
- "path": "/v1/tts",
1132
+ "name": "delete_webhook_endpoint",
1133
+ "description": "Delete a webhook endpoint by id. Events will stop flowing to the URL.",
1134
+ "method": "DELETE",
1135
+ "path": "/v1/webhook/endpoint",
944
1136
  "input_schema": {
945
1137
  "type": "object",
946
1138
  "properties": {
947
- "text": {
948
- "type": "string",
949
- "description": "Text to convert to speech"
950
- },
951
- "voice_id": {
952
- "type": "string",
953
- "description": "Voice ID to use"
954
- },
955
- "speed": {
956
- "type": "number",
957
- "description": "Speech speed multiplier (0.5-2.0)",
958
- "default": 1
1139
+ "endpoint_id": {
1140
+ "type": "string"
959
1141
  }
960
1142
  },
961
- "required": [
962
- "text",
963
- "voice_id"
964
- ]
965
- }
1143
+ "required": ["endpoint_id"]
1144
+ },
1145
+ "query_params": ["endpoint_id"]
966
1146
  },
967
1147
  {
968
- "name": "list_tts_voices",
969
- "description": "List voices compatible with the Starfish text-to-speech engine",
1148
+ "name": "list_available_webhook_events",
1149
+ "description": "List every webhook event type HeyGen supports, so you know what to subscribe to when calling add_webhook_endpoint.",
970
1150
  "method": "GET",
971
- "path": "/v1/tts/voices",
1151
+ "path": "/v1/webhook/event.list",
972
1152
  "input_schema": {
973
1153
  "type": "object",
974
1154
  "properties": {}
@@ -977,30 +1157,47 @@
977
1157
  ],
978
1158
  "webhooks": {
979
1159
  "signature_header": "x-webhook-signature",
1160
+ "registration": {
1161
+ "method": "POST",
1162
+ "path": "/v1/webhook/endpoint.add",
1163
+ "url_field": "url",
1164
+ "events_field": "events",
1165
+ "id_field": "data.endpoint_id",
1166
+ "delete_path": "/v1/webhook/endpoint?endpoint_id={id}",
1167
+ "delete_method": "DELETE"
1168
+ },
980
1169
  "events": [
981
1170
  {
982
1171
  "name": "avatar_video.success",
983
- "description": "Video generation completed successfully"
1172
+ "description": "Avatar video generation completed successfully."
984
1173
  },
985
1174
  {
986
1175
  "name": "avatar_video.fail",
987
- "description": "Video generation failed"
1176
+ "description": "Avatar video generation failed."
988
1177
  },
989
1178
  {
990
1179
  "name": "video_translate.success",
991
- "description": "Video translation completed"
1180
+ "description": "Video translation completed successfully."
992
1181
  },
993
1182
  {
994
1183
  "name": "video_translate.fail",
995
- "description": "Video translation failed"
1184
+ "description": "Video translation failed."
1185
+ },
1186
+ {
1187
+ "name": "personalized_video.success",
1188
+ "description": "Personalized (template) video completed successfully."
1189
+ },
1190
+ {
1191
+ "name": "personalized_video.fail",
1192
+ "description": "Personalized video failed."
996
1193
  },
997
1194
  {
998
- "name": "streaming.session_started",
999
- "description": "Streaming session started"
1195
+ "name": "photo_avatar.success",
1196
+ "description": "Photo avatar generation / training / look completed."
1000
1197
  },
1001
1198
  {
1002
- "name": "streaming.session_ended",
1003
- "description": "Streaming session ended"
1199
+ "name": "photo_avatar.fail",
1200
+ "description": "Photo avatar generation / training / look failed."
1004
1201
  }
1005
1202
  ]
1006
1203
  }