Comfy-Org/ComfyUI · error · ValueError
HeyGen returned no video_url for translation {translation_id
Error message
HeyGen returned no video_url for translation {translation_ids[0]}. What it means
Thrown when a HeyGen video-translation job finishes polling but its final data object lacks video_url. The translation id existed and the poll loop terminated, yet no downloadable artifact was returned — mirroring the video-node case: server-side render/export failure or a terminal status the poller did not classify as failure (only 'pending' is treated as queued here).
Source
Thrown at comfy_api_nodes/nodes_heygen.py:684
payload["speaker_num"] = speaker_count
created = await sync_op_raw(
cls,
ApiEndpoint(path=_TRANSLATIONS_PATH, method="POST"),
data=payload,
)
translation_ids = (created.get("data") or {}).get("video_translation_ids") or []
if not translation_ids:
raise ValueError(f"HeyGen did not return a translation ID: {created}")
final = await poll_op_raw(
cls,
ApiEndpoint(path=f"{_TRANSLATIONS_PATH}/{translation_ids[0]}"),
status_extractor=lambda r: (r.get("data") or {}).get("status"),
queued_statuses=["pending"],
poll_interval=5.0,
)
data = final["data"]
if not data.get("video_url"):
raise ValueError(f"HeyGen returned no video_url for translation {translation_ids[0]}.")
return IO.NodeOutput(await download_url_to_video_output(data["video_url"]))
class HeyGenTextToSpeechNode(IO.ComfyNode):
"""Synthesize speech audio from text with HeyGen's Starfish TTS engine."""
@classmethod
def define_schema(cls) -> IO.Schema:
return IO.Schema(
node_id="HeyGenTextToSpeechNode",
display_name="HeyGen Text to Speech",
category="partner/audio/HeyGen",
description="Generate speech audio from text using HeyGen's Starfish TTS engine. "
"Includes HeyGen's most popular voices across 17 languages.",
inputs=[
IO.String.Input(
"text",
multiline=True,View on GitHub (pinned to 1c6d8d45b3)
Solutions
- Retry with the same inputs — most export-stage failures are transient
- Check the translation id in the HeyGen dashboard for its terminal status
- Try a shorter clip to rule out server-side duration limits
- If reproducible, capture the final data payload and report upstream
Defensive patterns
Strategy: retry
Try / catch
try:
out = await translate_video(...)
except ValueError as e:
if 'no video_url for translation' in str(e):
out = await translate_video(...) # one retry; export-stage failures are often transient
else:
raise Prevention
- Retry translation jobs once before investigating
- Prefer shorter clips to avoid server-side export timeouts
When it happens
Trigger: poll_op_raw returns final data without video_url; e.g. HeyGen marks the translation failed/cancelled or the export step errors after analysis succeeded.
Common situations: Long videos timing out server-side, speech-analysis succeeding but dubbing failing, or transient CDN publishing issues.
Related errors
- HeyGen returned no video_url for video {video_id}.
- HeyGen did not return a translation ID: {created}
- HeyGen did not return a video_id: {created}
- A voice is required when driving the video with a text scrip
- Avatar '{avatar_label}' does not support the {engine} engine
AI-assisted analysis of Comfy-Org/ComfyUI@1c6d8d45b3 (2026-08-14).
Data as JSON: /api/errors/6f17dd7b6b098ffe.
Report an issue: GitHub.