{"record":{"id":"c0f7595e99992544","repo":"Comfy-Org/ComfyUI","slug":"heygen-did-not-return-a-translation-id-created","errorCode":null,"errorMessage":"HeyGen did not return a translation ID: {created}","messagePattern":"HeyGen did not return a translation ID: (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"comfy_api_nodes/nodes_heygen.py","lineNumber":674,"sourceCode":"    ) -> IO.NodeOutput:\n        video_url = await upload_video_to_comfyapi(cls, video)\n        payload = {\n            \"video\": {\"type\": \"url\", \"url\": video_url},\n            \"output_languages\": [output_language],\n            \"mode\": mode,\n            \"translate_audio_only\": translate_audio_only,\n            \"title\": \"ComfyUI Video Translate\",\n        }\n        if speaker_count > 0:\n            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:","sourceCodeStart":656,"sourceCodeEnd":692,"githubUrl":"https://github.com/Comfy-Org/ComfyUI/blob/1c6d8d45b3693bfbb32385b410d813a7fd6be216/comfy_api_nodes/nodes_heygen.py#L656-L692","documentation":"Thrown after POSTing a video-translation request to HeyGen when the response's data.video_translation_ids list is empty. The node requires at least one translation id to poll GET /v1/video_translation/{id}; an empty list means HeyGen accepted the HTTP call but created no translation job.","triggerScenarios":"HeyGen returns 2xx with empty video_translation_ids — commonly when the submitted video/language pair is rejected server-side (unsupported language, unanalyzable audio) or when an account/quota guard silently skips job creation.","commonSituations":"Videos with no speech track, unsupported target languages, region-locked accounts, or upstream schema/policy changes to the translations endpoint.","solutions":["Check the full response body in the message for a HeyGen error/status field","Confirm the source video actually contains audible speech","Verify the target language is supported by HeyGen video translate","Check account quota/permissions for translation features"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    await translate_video(...)\nexcept ValueError as e:\n    if 'did not return a translation ID' in str(e):\n        # empty video_translation_ids: check language support / speech presence in embedded body\n        raise","preventionTips":["Ensure the source video has a clear speech track before translating","Verify target language is in HeyGen's supported translation list"],"tags":["heygen","video-translation","api-contract","polling"],"backgroundTag":null,"analyzedSha":"1c6d8d45b3693bfbb32385b410d813a7fd6be216","analyzedAt":"2026-08-14T19:37:18.893Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}