{"record":{"id":"6f17dd7b6b098ffe","repo":"Comfy-Org/ComfyUI","slug":"heygen-returned-no-video-url-for-translation-tran","errorCode":null,"errorMessage":"HeyGen returned no video_url for translation {translation_ids[0]}.","messagePattern":"HeyGen returned no video_url for translation (.+?)\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"comfy_api_nodes/nodes_heygen.py","lineNumber":684,"sourceCode":"            payload[\"speaker_num\"] = speaker_count\n        created = await sync_op_raw(\n            cls,\n            ApiEndpoint(path=_TRANSLATIONS_PATH, method=\"POST\"),\n            data=payload,\n        )\n        translation_ids = (created.get(\"data\") or {}).get(\"video_translation_ids\") or []\n        if not translation_ids:\n            raise ValueError(f\"HeyGen did not return a translation ID: {created}\")\n        final = await poll_op_raw(\n            cls,\n            ApiEndpoint(path=f\"{_TRANSLATIONS_PATH}/{translation_ids[0]}\"),\n            status_extractor=lambda r: (r.get(\"data\") or {}).get(\"status\"),\n            queued_statuses=[\"pending\"],\n            poll_interval=5.0,\n        )\n        data = final[\"data\"]\n        if not data.get(\"video_url\"):\n            raise ValueError(f\"HeyGen returned no video_url for translation {translation_ids[0]}.\")\n        return IO.NodeOutput(await download_url_to_video_output(data[\"video_url\"]))\n\n\nclass HeyGenTextToSpeechNode(IO.ComfyNode):\n    \"\"\"Synthesize speech audio from text with HeyGen's Starfish TTS engine.\"\"\"\n\n    @classmethod\n    def define_schema(cls) -> IO.Schema:\n        return IO.Schema(\n            node_id=\"HeyGenTextToSpeechNode\",\n            display_name=\"HeyGen Text to Speech\",\n            category=\"partner/audio/HeyGen\",\n            description=\"Generate speech audio from text using HeyGen's Starfish TTS engine. \"\n            \"Includes HeyGen's most popular voices across 17 languages.\",\n            inputs=[\n                IO.String.Input(\n                    \"text\",\n                    multiline=True,","sourceCodeStart":666,"sourceCodeEnd":702,"githubUrl":"https://github.com/Comfy-Org/ComfyUI/blob/1c6d8d45b3693bfbb32385b410d813a7fd6be216/comfy_api_nodes/nodes_heygen.py#L666-L702","documentation":"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).","triggerScenarios":"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.","commonSituations":"Long videos timing out server-side, speech-analysis succeeding but dubbing failing, or transient CDN publishing issues.","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"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    out = await translate_video(...)\nexcept ValueError as e:\n    if 'no video_url for translation' in str(e):\n        out = await translate_video(...)  # one retry; export-stage failures are often transient\n    else:\n        raise","preventionTips":["Retry translation jobs once before investigating","Prefer shorter clips to avoid server-side export timeouts"],"tags":["heygen","video-translation","render-failure","polling"],"backgroundTag":null,"analyzedSha":"1c6d8d45b3693bfbb32385b410d813a7fd6be216","analyzedAt":"2026-08-14T19:37:18.893Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}