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

  1. Retry with the same inputs — most export-stage failures are transient
  2. Check the translation id in the HeyGen dashboard for its terminal status
  3. Try a shorter clip to rule out server-side duration limits
  4. 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

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


AI-assisted analysis of Comfy-Org/ComfyUI@1c6d8d45b3 (2026-08-14). Data as JSON: /api/errors/6f17dd7b6b098ffe. Report an issue: GitHub.