{"record":{"id":"b408f1adcdaf1ac8","repo":"Comfy-Org/ComfyUI","slug":"sync-so-generation-completed-but-no-output-url-was","errorCode":null,"errorMessage":"sync.so generation completed but no output URL was returned.","messagePattern":"sync\\.so generation completed but no output URL was returned\\.","errorType":"validation","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"comfy_api_nodes/nodes_sync_so.py","lineNumber":201,"sourceCode":"        )\n        generation = await poll_op(\n            cls,\n            ApiEndpoint(path=f\"/proxy/synclabs/v2/generate/{generation.id}\"),\n            response_model=SyncGeneration,\n            status_extractor=lambda g: g.status,\n            completed_statuses=[\"COMPLETED\", \"FAILED\", \"REJECTED\"],\n            failed_statuses=[],\n            queued_statuses=[\"PENDING\"],\n            poll_interval=10.0,\n        )\n        if generation.status != \"COMPLETED\":\n            code = f\" [{generation.errorCode}]\" if generation.errorCode else \"\"\n            raise ValueError(\n                f\"sync.so generation {generation.status.lower()}{code}: \"\n                f\"{generation.error or 'no error details provided'}\"\n            )\n        if not generation.outputUrl:\n            raise ValueError(\"sync.so generation completed but no output URL was returned.\")\n        return IO.NodeOutput(await download_url_to_video_output(generation.outputUrl))\n\n\nclass SyncTalkingImageNode(IO.ComfyNode):\n    @classmethod\n    def define_schema(cls) -> IO.Schema:\n        return IO.Schema(\n            node_id=\"SyncTalkingImageNode\",\n            display_name=\"sync.so Talking Image\",\n            category=\"partner/video/sync.so\",\n            description=(\n                \"Animate a still portrait into a talking video driven by speech audio, \"\n                \"using sync.so's sync-3 model. The output duration matches the audio. \"\n                \"Cost scales with output duration.\"\n            ),\n            inputs=[\n                IO.Image.Input(\n                    \"image\",","sourceCodeStart":183,"sourceCodeEnd":219,"githubUrl":"https://github.com/Comfy-Org/ComfyUI/blob/1c6d8d45b3693bfbb32385b410d813a7fd6be216/comfy_api_nodes/nodes_sync_so.py#L183-L219","documentation":"Raised by the sync.so node when the generation status is COMPLETED but the response contains no outputUrl. The task claims success yet provides no downloadable artifact, so the node cannot fetch the video. It is the last guard after the FAILED/REJECTED branch.","triggerScenarios":"poll_op returns status COMPLETED with outputUrl None/empty/missing from the response body of /proxy/synclabs/v2/generate/{id}.","commonSituations":"sync.so API schema changes renaming the output field; transient server-side artifact publication delay; account-level restrictions producing empty completions.","solutions":["Retry the generation — delayed artifact publication sometimes yields empty completions","Check the sync.so dashboard for the generation id to see if an output exists under a different field","Review sync.so API changelog for response schema changes"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try:\n    out = await syncso_generate(...)\nexcept ValueError as e:\n    if \"no output URL\" in str(e):\n        await asyncio.sleep(5)\n        out = await syncso_generate(...)  # retry once\n    else:\n        raise","preventionTips":["Retry once on empty completions — artifact publication can lag","Keep generation ids for sync.so dashboard verification","Monitor sync.so API changelog for outputUrl schema changes"],"tags":["sync-so","api-response","empty-response","polling"],"backgroundTag":null,"analyzedSha":"1c6d8d45b3693bfbb32385b410d813a7fd6be216","analyzedAt":"2026-08-14T19:37:18.893Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}