[{"data":1,"prerenderedAt":41529},["ShallowReactive",2],{"blog-list-en":3},[4,11289,13500,17386,23106,30411,32183,38620],{"id":5,"title":6,"body":7,"description":11278,"extension":11279,"meta":11280,"navigation":58,"path":11285,"seo":11286,"stem":11287,"__hash__":11288},"content/en/blog/seedance-2-api-tutorial-python.md","Seedance 2.0 API Tutorial: From Zero to Your First AI Video (Python)",{"type":8,"value":9,"toc":11220},"minimark",[10,14,17,32,44,47,52,55,66,69,91,96,124,127,200,202,206,215,218,246,249,270,289,298,306,308,312,315,329,336,470,473,509,512,1027,1030,1066,1240,1250,1253,1261,1263,1267,1270,1736,1739,1828,1831,1843,1847,1854,2032,2035,2156,2170,2174,2180,2188,2191,2199,2206,2213,2215,2219,2226,2262,2265,2269,2275,2345,2349,2355,2361,2422,2434,2438,2441,2567,2581,2588,2598,2600,2604,2616,2622,2885,2888,2937,2941,2968,2971,3053,3056,3208,3214,3218,3272,3282,3290,3294,3297,3376,3383,3385,3389,3392,3612,3639,3643,3648,3652,3743,3751,3756,3851,3858,3863,3951,3956,4031,4048,4052,4055,4126,4139,4157,4159,4163,4166,4170,4173,4231,4253,4256,4261,4304,4310,4315,4369,4374,4379,4431,4441,4446,4498,4515,4520,4563,4569,4574,4628,4634,4639,4682,4685,4690,4733,4736,4741,4795,4801,4805,5015,5019,5022,5026,5785,5788,5820,5827,5831,5834,6414,6425,6427,6431,6438,6442,6448,6453,6611,6617,6621,6683,6687,6690,7880,7883,7906,7909,7937,7941,7950,7998,8001,8007,8013,8060,8075,8079,8082,8254,8258,8338,8345,8347,8351,8354,8359,8907,8910,8932,8934,8938,8941,8945,8985,8989,9011,9015,9018,9050,9060,9062,9066,9070,9076,9080,9086,9090,9096,9100,9111,9115,9129,9133,9143,9147,9162,9166,9173,9177,9193,9197,9205,9207,9211,9214,11194,11208,11216],[11,12,13],"p",{},"Seedance 2.0 is ByteDance's most advanced AI video model — multimodal references, native audio, cinematic camera control, and 4–15 second generation at up to 1080p. This tutorial walks you through the entire API workflow in Python: from getting your API key to downloading your first generated video.",[11,15,16],{},"By the end, you'll have working code for text-to-video, image-to-video, async polling, webhook handling, and error recovery. Every code example here was tested against a live API.",[18,19,20],"blockquote",{},[11,21,22,26,27,31],{},[23,24,25],"strong",{},"Note — Seedance 2.0 vs 1.5:"," Seedance 2.0 is rolling out progressively. You can test the complete workflow right now using ",[28,29,30],"code",{},"seedance-1.5-pro"," — when 2.0 is fully available, just change the model name. All endpoints, parameters, and response formats are identical. The key differences in 2.0: multimodal references (mix images, videos, and audio as inputs), native audio generation, improved physics simulation, and video editing capabilities. Everything in this tutorial works with both versions.",[11,33,34],{},[23,35,36,43],{},[37,38,42],"a",{"href":39,"rel":40},"https://evolink.ai/early-access",[41],"nofollow","Get your free API key"," to follow along.",[45,46],"hr",{},[48,49,51],"h2",{"id":50},"what-youll-build-and-what-you-need","What You'll Build (and What You Need)",[11,53,54],{},"Here's what a Seedance-generated video looks like — created with a single API call:",[56,57,60,61],"video",{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},true,"width:100%;border-radius:12px;margin:1.5em 0","\n  ",[62,63],"source",{"src":64,"type":65},"https://cdn.evolink.ai/seedance2api/%E5%B0%8F%E5%A5%B3%E5%AD%A9%E5%9B%BE%E4%B9%A6%E9%A6%86%E5%A5%87%E9%81%87.mp4","video/mp4",[11,67,68],{},"In this tutorial, you'll write Python code that:",[70,71,72,76,79,82,85,88],"ol",{},[73,74,75],"li",{},"Sends a text prompt → gets back a generated video",[73,77,78],{},"Sends an image → animates it into a video",[73,80,81],{},"Polls for results asynchronously",[73,83,84],{},"Handles errors and retries like production code",[73,86,87],{},"Receives results via webhook (no polling needed)",[73,89,90],{},"Cancels in-progress tasks when needed",[92,93,95],"h3",{"id":94},"prerequisites","Prerequisites",[97,98,99,109,118],"ul",{},[73,100,101,104,105,108],{},[23,102,103],{},"Python 3.8+"," (check with ",[28,106,107],{},"python3 --version",")",[73,110,111,114,115,108],{},[23,112,113],{},"requests"," library (",[28,116,117],{},"pip install requests",[73,119,120,123],{},[23,121,122],{},"An EvoLink API key"," (free to sign up — we'll get this in the next section)",[11,125,126],{},"No GPU, no Docker, no complex setup. Just Python and an API key.",[18,128,129,135],{},[11,130,131,134],{},[23,132,133],{},"Pro Tip:"," If you're building a production app, consider using a virtual environment to isolate dependencies:",[136,137,142],"pre",{"className":138,"code":139,"language":140,"meta":141,"style":141},"language-bash shiki shiki-themes github-dark","python3 -m venv seedance-env\nsource seedance-env/bin/activate  # macOS/Linux\nseedance-env\\Scripts\\activate     # Windows\npip install requests flask\n","bash","",[28,143,144,164,176,185],{"__ignoreMap":141},[145,146,149,153,157,161],"span",{"class":147,"line":148},"line",1,[145,150,152],{"class":151},"svObZ","python3",[145,154,156],{"class":155},"sDLfK"," -m",[145,158,160],{"class":159},"sU2Wk"," venv",[145,162,163],{"class":159}," seedance-env\n",[145,165,167,169,172],{"class":147,"line":166},2,[145,168,62],{"class":155},[145,170,171],{"class":159}," seedance-env/bin/activate",[145,173,175],{"class":174},"sAwPA","  # macOS/Linux\n",[145,177,179,182],{"class":147,"line":178},3,[145,180,181],{"class":151},"seedance-env\\Scripts\\activate",[145,183,184],{"class":174},"     # Windows\n",[145,186,188,191,194,197],{"class":147,"line":187},4,[145,189,190],{"class":151},"pip",[145,192,193],{"class":159}," install",[145,195,196],{"class":159}," requests",[145,198,199],{"class":159}," flask\n",[45,201],{},[48,203,205],{"id":204},"get-your-api-key","Get Your API Key",[11,207,208,209,214],{},"Seedance 2.0 is available through ",[37,210,213],{"href":211,"rel":212},"https://evolink.ai",[41],"EvoLink",", an API gateway that provides unified access to multiple AI video models — including Seedance 2.0, Kling, and others — through a single API key.",[11,216,217],{},"Here's how to get started:",[70,219,220,228,234,240],{},[73,221,222,223,227],{},"Go to ",[37,224,226],{"href":39,"rel":225},[41],"evolink.ai/early-access"," and create an account",[73,229,230,231],{},"Navigate to ",[23,232,233],{},"Dashboard → API Keys",[73,235,236,237],{},"Click ",[23,238,239],{},"Create New Key",[73,241,242,243],{},"Copy your key — it starts with ",[28,244,245],{},"sk-",[11,247,248],{},"Store your key securely. Don't commit it to version control. We'll use an environment variable:",[136,250,252],{"className":138,"code":251,"language":140,"meta":141,"style":141},"export EVOLINK_API_KEY=\"sk-your-api-key-here\"\n",[28,253,254],{"__ignoreMap":141},[145,255,256,260,264,267],{"class":147,"line":148},[145,257,259],{"class":258},"snl16","export",[145,261,263],{"class":262},"s95oV"," EVOLINK_API_KEY",[145,265,266],{"class":258},"=",[145,268,269],{"class":159},"\"sk-your-api-key-here\"\n",[11,271,272,273,276,277,280,281,284,285,288],{},"This line sets the ",[28,274,275],{},"EVOLINK_API_KEY"," environment variable in your terminal session. On macOS/Linux, add it to your ",[28,278,279],{},"~/.bashrc"," or ",[28,282,283],{},"~/.zshrc"," to persist across sessions. On Windows, use ",[28,286,287],{},"set EVOLINK_API_KEY=sk-your-api-key-here"," in Command Prompt, or set it in System Properties → Environment Variables for persistence.",[11,290,291,292,297],{},"Your account includes starter credits to experiment with. Check the ",[37,293,296],{"href":294,"rel":295},"https://seedance2api.app/docs/getting-started",[41],"Getting Started docs"," for current pricing details.",[18,299,300],{},[11,301,302,305],{},[23,303,304],{},"Common Mistake:"," Don't hardcode your API key in source files. If you push it to GitHub, automated scrapers will find it within minutes. Always use environment variables or a secrets manager like AWS Secrets Manager or HashiCorp Vault.",[45,307],{},[48,309,311],{"id":310},"set-up-your-python-environment","Set Up Your Python Environment",[11,313,314],{},"Install the one dependency you need:",[136,316,318],{"className":138,"code":317,"language":140,"meta":141,"style":141},"pip install requests\n",[28,319,320],{"__ignoreMap":141},[145,321,322,324,326],{"class":147,"line":148},[145,323,190],{"class":151},[145,325,193],{"class":159},[145,327,328],{"class":159}," requests\n",[11,330,331,332,335],{},"Create a file called ",[28,333,334],{},"seedance_tutorial.py"," and add this setup code. Every example in this tutorial builds on this foundation:",[136,337,341],{"className":338,"code":339,"language":340,"meta":141,"style":141},"language-python shiki shiki-themes github-dark","import requests\nimport time\nimport os\nimport json\n\n# ── Configuration ─────────────────────────────────────────────\nAPI_KEY = os.getenv(\"EVOLINK_API_KEY\", \"sk-your-api-key-here\")\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n","python",[28,342,343,350,357,364,371,377,383,407,418,429,453,464],{"__ignoreMap":141},[145,344,345,348],{"class":147,"line":148},[145,346,347],{"class":258},"import",[145,349,328],{"class":262},[145,351,352,354],{"class":147,"line":166},[145,353,347],{"class":258},[145,355,356],{"class":262}," time\n",[145,358,359,361],{"class":147,"line":178},[145,360,347],{"class":258},[145,362,363],{"class":262}," os\n",[145,365,366,368],{"class":147,"line":187},[145,367,347],{"class":258},[145,369,370],{"class":262}," json\n",[145,372,374],{"class":147,"line":373},5,[145,375,376],{"emptyLinePlaceholder":58},"\n",[145,378,380],{"class":147,"line":379},6,[145,381,382],{"class":174},"# ── Configuration ─────────────────────────────────────────────\n",[145,384,386,389,392,395,398,401,404],{"class":147,"line":385},7,[145,387,388],{"class":155},"API_KEY",[145,390,391],{"class":258}," =",[145,393,394],{"class":262}," os.getenv(",[145,396,397],{"class":159},"\"EVOLINK_API_KEY\"",[145,399,400],{"class":262},", ",[145,402,403],{"class":159},"\"sk-your-api-key-here\"",[145,405,406],{"class":262},")\n",[145,408,410,413,415],{"class":147,"line":409},8,[145,411,412],{"class":155},"BASE_URL",[145,414,391],{"class":258},[145,416,417],{"class":159}," \"https://api.evolink.ai/v1\"\n",[145,419,421,424,426],{"class":147,"line":420},9,[145,422,423],{"class":155},"HEADERS",[145,425,391],{"class":258},[145,427,428],{"class":262}," {\n",[145,430,432,435,438,441,444,447,450],{"class":147,"line":431},10,[145,433,434],{"class":159},"    \"Authorization\"",[145,436,437],{"class":262},": ",[145,439,440],{"class":258},"f",[145,442,443],{"class":159},"\"Bearer ",[145,445,446],{"class":155},"{API_KEY}",[145,448,449],{"class":159},"\"",[145,451,452],{"class":262},",\n",[145,454,456,459,461],{"class":147,"line":455},11,[145,457,458],{"class":159},"    \"Content-Type\"",[145,460,437],{"class":262},[145,462,463],{"class":159},"\"application/json\"\n",[145,465,467],{"class":147,"line":466},12,[145,468,469],{"class":262},"}\n",[11,471,472],{},"Let's break this down line by line:",[97,474,475,483,494],{},[73,476,477,482],{},[23,478,479],{},[28,480,481],{},"os.getenv(\"EVOLINK_API_KEY\", \"sk-your-api-key-here\")"," — Reads the API key from the environment variable. The second argument is a fallback default (replace this with your actual key only for local testing).",[73,484,485,489,490,493],{},[23,486,487],{},[28,488,412],{}," — The root URL for all EvoLink API endpoints. All requests go to ",[28,491,492],{},"https://api.evolink.ai/v1/...",".",[73,495,496,500,501,504,505,508],{},[23,497,498],{},[28,499,423],{}," — Two headers sent with every request: ",[28,502,503],{},"Authorization"," carries your API key using the Bearer token scheme, and ",[28,506,507],{},"Content-Type"," tells the server we're sending JSON.",[11,510,511],{},"Now add the reusable helper functions:",[136,513,515],{"className":338,"code":514,"language":340,"meta":141,"style":141},"# ── Reusable Polling Helper ───────────────────────────────────\ndef wait_for_video(task_id, poll_interval=10, timeout=600):\n    \"\"\"\n    Poll a video generation task until it completes or fails.\n    \n    Args:\n        task_id: The task ID returned by the generation endpoint.\n        poll_interval: Seconds between polls (default 10).\n        timeout: Maximum wait time in seconds (default 600).\n    \n    Returns:\n        dict: The completed task response with video URLs.\n    \n    Raises:\n        TimeoutError: If the task doesn't complete within the timeout.\n        RuntimeError: If the task fails.\n    \"\"\"\n    elapsed = 0\n    while elapsed \u003C timeout:\n        # Send GET request to check the task's current status\n        response = requests.get(\n            f\"{BASE_URL}/tasks/{task_id}\",\n            headers=HEADERS\n        )\n        # Raise an exception if the HTTP status code indicates an error\n        response.raise_for_status()\n        task = response.json()\n\n        # Extract status and progress from the response\n        status = task[\"status\"]\n        progress = task.get(\"progress\", 0)\n        print(f\"  [{elapsed}s] Status: {status} | Progress: {progress}%\")\n\n        # Check terminal states\n        if status == \"completed\":\n            return task\n        elif status == \"failed\":\n            error_info = task.get(\"error\", {})\n            raise RuntimeError(\n                f\"Task {task_id} failed: {error_info.get('message', 'Unknown error')}\"\n            )\n\n        # Wait before the next poll\n        time.sleep(poll_interval)\n        elapsed += poll_interval\n\n    raise TimeoutError(f\"Task {task_id} timed out after {timeout}s\")\n",[28,516,517,522,549,554,559,564,569,574,579,584,588,593,598,603,609,615,621,626,637,652,658,669,696,708,714,720,726,737,742,748,765,786,832,837,843,861,870,885,901,913,951,957,962,968,974,986,991],{"__ignoreMap":141},[145,518,519],{"class":147,"line":148},[145,520,521],{"class":174},"# ── Reusable Polling Helper ───────────────────────────────────\n",[145,523,524,527,530,533,535,538,541,543,546],{"class":147,"line":166},[145,525,526],{"class":258},"def",[145,528,529],{"class":151}," wait_for_video",[145,531,532],{"class":262},"(task_id, poll_interval",[145,534,266],{"class":258},[145,536,537],{"class":155},"10",[145,539,540],{"class":262},", timeout",[145,542,266],{"class":258},[145,544,545],{"class":155},"600",[145,547,548],{"class":262},"):\n",[145,550,551],{"class":147,"line":178},[145,552,553],{"class":159},"    \"\"\"\n",[145,555,556],{"class":147,"line":187},[145,557,558],{"class":159},"    Poll a video generation task until it completes or fails.\n",[145,560,561],{"class":147,"line":373},[145,562,563],{"class":159},"    \n",[145,565,566],{"class":147,"line":379},[145,567,568],{"class":159},"    Args:\n",[145,570,571],{"class":147,"line":385},[145,572,573],{"class":159},"        task_id: The task ID returned by the generation endpoint.\n",[145,575,576],{"class":147,"line":409},[145,577,578],{"class":159},"        poll_interval: Seconds between polls (default 10).\n",[145,580,581],{"class":147,"line":420},[145,582,583],{"class":159},"        timeout: Maximum wait time in seconds (default 600).\n",[145,585,586],{"class":147,"line":431},[145,587,563],{"class":159},[145,589,590],{"class":147,"line":455},[145,591,592],{"class":159},"    Returns:\n",[145,594,595],{"class":147,"line":466},[145,596,597],{"class":159},"        dict: The completed task response with video URLs.\n",[145,599,601],{"class":147,"line":600},13,[145,602,563],{"class":159},[145,604,606],{"class":147,"line":605},14,[145,607,608],{"class":159},"    Raises:\n",[145,610,612],{"class":147,"line":611},15,[145,613,614],{"class":159},"        TimeoutError: If the task doesn't complete within the timeout.\n",[145,616,618],{"class":147,"line":617},16,[145,619,620],{"class":159},"        RuntimeError: If the task fails.\n",[145,622,624],{"class":147,"line":623},17,[145,625,553],{"class":159},[145,627,629,632,634],{"class":147,"line":628},18,[145,630,631],{"class":262},"    elapsed ",[145,633,266],{"class":258},[145,635,636],{"class":155}," 0\n",[145,638,640,643,646,649],{"class":147,"line":639},19,[145,641,642],{"class":258},"    while",[145,644,645],{"class":262}," elapsed ",[145,647,648],{"class":258},"\u003C",[145,650,651],{"class":262}," timeout:\n",[145,653,655],{"class":147,"line":654},20,[145,656,657],{"class":174},"        # Send GET request to check the task's current status\n",[145,659,661,664,666],{"class":147,"line":660},21,[145,662,663],{"class":262},"        response ",[145,665,266],{"class":258},[145,667,668],{"class":262}," requests.get(\n",[145,670,672,675,677,680,683,686,689,692,694],{"class":147,"line":671},22,[145,673,674],{"class":258},"            f",[145,676,449],{"class":159},[145,678,679],{"class":155},"{BASE_URL}",[145,681,682],{"class":159},"/tasks/",[145,684,685],{"class":155},"{",[145,687,688],{"class":262},"task_id",[145,690,691],{"class":155},"}",[145,693,449],{"class":159},[145,695,452],{"class":262},[145,697,699,703,705],{"class":147,"line":698},23,[145,700,702],{"class":701},"s9osk","            headers",[145,704,266],{"class":258},[145,706,707],{"class":155},"HEADERS\n",[145,709,711],{"class":147,"line":710},24,[145,712,713],{"class":262},"        )\n",[145,715,717],{"class":147,"line":716},25,[145,718,719],{"class":174},"        # Raise an exception if the HTTP status code indicates an error\n",[145,721,723],{"class":147,"line":722},26,[145,724,725],{"class":262},"        response.raise_for_status()\n",[145,727,729,732,734],{"class":147,"line":728},27,[145,730,731],{"class":262},"        task ",[145,733,266],{"class":258},[145,735,736],{"class":262}," response.json()\n",[145,738,740],{"class":147,"line":739},28,[145,741,376],{"emptyLinePlaceholder":58},[145,743,745],{"class":147,"line":744},29,[145,746,747],{"class":174},"        # Extract status and progress from the response\n",[145,749,751,754,756,759,762],{"class":147,"line":750},30,[145,752,753],{"class":262},"        status ",[145,755,266],{"class":258},[145,757,758],{"class":262}," task[",[145,760,761],{"class":159},"\"status\"",[145,763,764],{"class":262},"]\n",[145,766,768,771,773,776,779,781,784],{"class":147,"line":767},31,[145,769,770],{"class":262},"        progress ",[145,772,266],{"class":258},[145,774,775],{"class":262}," task.get(",[145,777,778],{"class":159},"\"progress\"",[145,780,400],{"class":262},[145,782,783],{"class":155},"0",[145,785,406],{"class":262},[145,787,789,792,795,797,800,802,805,807,810,812,815,817,820,822,825,827,830],{"class":147,"line":788},32,[145,790,791],{"class":155},"        print",[145,793,794],{"class":262},"(",[145,796,440],{"class":258},[145,798,799],{"class":159},"\"  [",[145,801,685],{"class":155},[145,803,804],{"class":262},"elapsed",[145,806,691],{"class":155},[145,808,809],{"class":159},"s] Status: ",[145,811,685],{"class":155},[145,813,814],{"class":262},"status",[145,816,691],{"class":155},[145,818,819],{"class":159}," | Progress: ",[145,821,685],{"class":155},[145,823,824],{"class":262},"progress",[145,826,691],{"class":155},[145,828,829],{"class":159},"%\"",[145,831,406],{"class":262},[145,833,835],{"class":147,"line":834},33,[145,836,376],{"emptyLinePlaceholder":58},[145,838,840],{"class":147,"line":839},34,[145,841,842],{"class":174},"        # Check terminal states\n",[145,844,846,849,852,855,858],{"class":147,"line":845},35,[145,847,848],{"class":258},"        if",[145,850,851],{"class":262}," status ",[145,853,854],{"class":258},"==",[145,856,857],{"class":159}," \"completed\"",[145,859,860],{"class":262},":\n",[145,862,864,867],{"class":147,"line":863},36,[145,865,866],{"class":258},"            return",[145,868,869],{"class":262}," task\n",[145,871,873,876,878,880,883],{"class":147,"line":872},37,[145,874,875],{"class":258},"        elif",[145,877,851],{"class":262},[145,879,854],{"class":258},[145,881,882],{"class":159}," \"failed\"",[145,884,860],{"class":262},[145,886,888,891,893,895,898],{"class":147,"line":887},38,[145,889,890],{"class":262},"            error_info ",[145,892,266],{"class":258},[145,894,775],{"class":262},[145,896,897],{"class":159},"\"error\"",[145,899,900],{"class":262},", {})\n",[145,902,904,907,910],{"class":147,"line":903},39,[145,905,906],{"class":258},"            raise",[145,908,909],{"class":155}," RuntimeError",[145,911,912],{"class":262},"(\n",[145,914,916,919,922,924,926,928,931,933,936,939,941,944,946,948],{"class":147,"line":915},40,[145,917,918],{"class":258},"                f",[145,920,921],{"class":159},"\"Task ",[145,923,685],{"class":155},[145,925,688],{"class":262},[145,927,691],{"class":155},[145,929,930],{"class":159}," failed: ",[145,932,685],{"class":155},[145,934,935],{"class":262},"error_info.get(",[145,937,938],{"class":159},"'message'",[145,940,400],{"class":262},[145,942,943],{"class":159},"'Unknown error'",[145,945,108],{"class":262},[145,947,691],{"class":155},[145,949,950],{"class":159},"\"\n",[145,952,954],{"class":147,"line":953},41,[145,955,956],{"class":262},"            )\n",[145,958,960],{"class":147,"line":959},42,[145,961,376],{"emptyLinePlaceholder":58},[145,963,965],{"class":147,"line":964},43,[145,966,967],{"class":174},"        # Wait before the next poll\n",[145,969,971],{"class":147,"line":970},44,[145,972,973],{"class":262},"        time.sleep(poll_interval)\n",[145,975,977,980,983],{"class":147,"line":976},45,[145,978,979],{"class":262},"        elapsed ",[145,981,982],{"class":258},"+=",[145,984,985],{"class":262}," poll_interval\n",[145,987,989],{"class":147,"line":988},46,[145,990,376],{"emptyLinePlaceholder":58},[145,992,994,997,1000,1002,1004,1006,1008,1010,1012,1015,1017,1020,1022,1025],{"class":147,"line":993},47,[145,995,996],{"class":258},"    raise",[145,998,999],{"class":155}," TimeoutError",[145,1001,794],{"class":262},[145,1003,440],{"class":258},[145,1005,921],{"class":159},[145,1007,685],{"class":155},[145,1009,688],{"class":262},[145,1011,691],{"class":155},[145,1013,1014],{"class":159}," timed out after ",[145,1016,685],{"class":155},[145,1018,1019],{"class":262},"timeout",[145,1021,691],{"class":155},[145,1023,1024],{"class":159},"s\"",[145,1026,406],{"class":262},[11,1028,1029],{},"Key design decisions in this function:",[97,1031,1032,1040,1048,1056],{},[73,1033,1034,1039],{},[23,1035,1036],{},[28,1037,1038],{},"poll_interval=10"," — 10 seconds is the sweet spot. Faster wastes API quota; slower delays your workflow.",[73,1041,1042,1047],{},[23,1043,1044],{},[28,1045,1046],{},"timeout=600"," — 10 minutes is generous. Most videos complete in 30–120 seconds, but this covers edge cases like queue congestion.",[73,1049,1050,1055],{},[23,1051,1052],{},[28,1053,1054],{},"response.raise_for_status()"," — Converts HTTP errors (4xx/5xx) into Python exceptions so they don't silently pass.",[73,1057,1058,1061,1062,1065],{},[23,1059,1060],{},"Progress printing"," — The ",[28,1063,1064],{},"[elapsed]s"," prefix helps you correlate timing. Useful for debugging slow generations.",[136,1067,1069],{"className":338,"code":1068,"language":340,"meta":141,"style":141},"# ── Helper: Download Video ────────────────────────────────────\ndef download_video(url, filename=\"output.mp4\"):\n    \"\"\"Download a video file from a URL.\"\"\"\n    print(f\"Downloading video to {filename}...\")\n    resp = requests.get(url, stream=True)\n    resp.raise_for_status()\n    with open(filename, \"wb\") as f:\n        for chunk in resp.iter_content(chunk_size=8192):\n            f.write(chunk)\n    print(f\"Saved: {filename} ({os.path.getsize(filename) / 1024:.0f} KB)\")\n",[28,1070,1071,1076,1093,1098,1122,1142,1147,1170,1194,1199],{"__ignoreMap":141},[145,1072,1073],{"class":147,"line":148},[145,1074,1075],{"class":174},"# ── Helper: Download Video ────────────────────────────────────\n",[145,1077,1078,1080,1083,1086,1088,1091],{"class":147,"line":166},[145,1079,526],{"class":258},[145,1081,1082],{"class":151}," download_video",[145,1084,1085],{"class":262},"(url, filename",[145,1087,266],{"class":258},[145,1089,1090],{"class":159},"\"output.mp4\"",[145,1092,548],{"class":262},[145,1094,1095],{"class":147,"line":178},[145,1096,1097],{"class":159},"    \"\"\"Download a video file from a URL.\"\"\"\n",[145,1099,1100,1103,1105,1107,1110,1112,1115,1117,1120],{"class":147,"line":187},[145,1101,1102],{"class":155},"    print",[145,1104,794],{"class":262},[145,1106,440],{"class":258},[145,1108,1109],{"class":159},"\"Downloading video to ",[145,1111,685],{"class":155},[145,1113,1114],{"class":262},"filename",[145,1116,691],{"class":155},[145,1118,1119],{"class":159},"...\"",[145,1121,406],{"class":262},[145,1123,1124,1127,1129,1132,1135,1137,1140],{"class":147,"line":373},[145,1125,1126],{"class":262},"    resp ",[145,1128,266],{"class":258},[145,1130,1131],{"class":262}," requests.get(url, ",[145,1133,1134],{"class":701},"stream",[145,1136,266],{"class":258},[145,1138,1139],{"class":155},"True",[145,1141,406],{"class":262},[145,1143,1144],{"class":147,"line":379},[145,1145,1146],{"class":262},"    resp.raise_for_status()\n",[145,1148,1149,1152,1155,1158,1161,1164,1167],{"class":147,"line":385},[145,1150,1151],{"class":258},"    with",[145,1153,1154],{"class":155}," open",[145,1156,1157],{"class":262},"(filename, ",[145,1159,1160],{"class":159},"\"wb\"",[145,1162,1163],{"class":262},") ",[145,1165,1166],{"class":258},"as",[145,1168,1169],{"class":262}," f:\n",[145,1171,1172,1175,1178,1181,1184,1187,1189,1192],{"class":147,"line":409},[145,1173,1174],{"class":258},"        for",[145,1176,1177],{"class":262}," chunk ",[145,1179,1180],{"class":258},"in",[145,1182,1183],{"class":262}," resp.iter_content(",[145,1185,1186],{"class":701},"chunk_size",[145,1188,266],{"class":258},[145,1190,1191],{"class":155},"8192",[145,1193,548],{"class":262},[145,1195,1196],{"class":147,"line":420},[145,1197,1198],{"class":262},"            f.write(chunk)\n",[145,1200,1201,1203,1205,1207,1210,1212,1214,1216,1219,1221,1224,1227,1230,1233,1235,1238],{"class":147,"line":431},[145,1202,1102],{"class":155},[145,1204,794],{"class":262},[145,1206,440],{"class":258},[145,1208,1209],{"class":159},"\"Saved: ",[145,1211,685],{"class":155},[145,1213,1114],{"class":262},[145,1215,691],{"class":155},[145,1217,1218],{"class":159}," (",[145,1220,685],{"class":155},[145,1222,1223],{"class":262},"os.path.getsize(filename) ",[145,1225,1226],{"class":258},"/",[145,1228,1229],{"class":155}," 1024",[145,1231,1232],{"class":258},":.0f",[145,1234,691],{"class":155},[145,1236,1237],{"class":159}," KB)\"",[145,1239,406],{"class":262},[11,1241,1242,1243,1246,1247,1249],{},"This function streams the download in 8 KB chunks instead of loading the entire video into memory. This matters — generated videos can be 10–50 MB. The ",[28,1244,1245],{},"stream=True"," parameter tells ",[28,1248,113],{}," to download incrementally.",[11,1251,1252],{},"These three pieces — configuration, polling, and download — are the foundation. Every code example below uses them. We won't repeat them — just the new payload each time.",[11,1254,1255,1256,493],{},"For the full API reference, see the ",[37,1257,1260],{"href":1258,"rel":1259},"https://seedance2api.app/docs/video-generation",[41],"Video Generation docs",[45,1262],{},[48,1264,1266],{"id":1265},"generate-your-first-video-text-to-video","Generate Your First Video (Text-to-Video)",[11,1268,1269],{},"Time to generate a video. Add this to your script:",[136,1271,1273],{"className":338,"code":1272,"language":340,"meta":141,"style":141},"# ── Text-to-Video ─────────────────────────────────────────────\ndef text_to_video():\n    payload = {\n        \"model\": \"seedance-2.0\",          # The AI model to use\n        \"prompt\": (\n            \"A golden retriever puppy chases a butterfly through \"\n            \"a sunlit meadow. The camera follows the puppy with a \"\n            \"smooth tracking shot as wildflowers sway in the breeze.\"\n        ),\n        \"duration\": 5,                     # Video length: 4-15 seconds\n        \"quality\": \"720p\",                 # Resolution: 480p, 720p, 1080p\n        \"aspect_ratio\": \"16:9\",            # Standard widescreen\n        \"generate_audio\": True             # AI generates matching audio\n    }\n\n    print(\"Submitting text-to-video request...\")\n    response = requests.post(\n        f\"{BASE_URL}/videos/generations\",  # The video generation endpoint\n        headers=HEADERS,                   # Auth + content-type headers\n        json=payload                       # Automatically serializes to JSON\n    )\n    response.raise_for_status()            # Throw if not 200 OK\n    task = response.json()                 # Parse the JSON response\n\n    # Log key info from the response\n    print(f\"Task created: {task['id']}\")\n    print(f\"Estimated time: {task['task_info']['estimated_time']}s\")\n    print(f\"Credits reserved: {task['usage']['credits_reserved']}\")\n\n    # Poll until the video is ready\n    result = wait_for_video(task[\"id\"])\n\n    # The results array contains one or more video URLs\n    video_url = result[\"results\"][0]\n    print(f\"\\nVideo URL: {video_url}\")\n    download_video(video_url, \"my_first_video.mp4\")\n\n    return result\n\n\nif __name__ == \"__main__\":\n    text_to_video()\n",[28,1274,1275,1280,1290,1299,1315,1323,1328,1333,1338,1343,1359,1375,1391,1403,1408,1412,1423,1433,1451,1466,1479,1484,1492,1505,1509,1514,1542,1574,1605,1609,1614,1630,1634,1639,1658,1685,1695,1699,1707,1711,1715,1731],{"__ignoreMap":141},[145,1276,1277],{"class":147,"line":148},[145,1278,1279],{"class":174},"# ── Text-to-Video ─────────────────────────────────────────────\n",[145,1281,1282,1284,1287],{"class":147,"line":166},[145,1283,526],{"class":258},[145,1285,1286],{"class":151}," text_to_video",[145,1288,1289],{"class":262},"():\n",[145,1291,1292,1295,1297],{"class":147,"line":178},[145,1293,1294],{"class":262},"    payload ",[145,1296,266],{"class":258},[145,1298,428],{"class":262},[145,1300,1301,1304,1306,1309,1312],{"class":147,"line":187},[145,1302,1303],{"class":159},"        \"model\"",[145,1305,437],{"class":262},[145,1307,1308],{"class":159},"\"seedance-2.0\"",[145,1310,1311],{"class":262},",          ",[145,1313,1314],{"class":174},"# The AI model to use\n",[145,1316,1317,1320],{"class":147,"line":373},[145,1318,1319],{"class":159},"        \"prompt\"",[145,1321,1322],{"class":262},": (\n",[145,1324,1325],{"class":147,"line":379},[145,1326,1327],{"class":159},"            \"A golden retriever puppy chases a butterfly through \"\n",[145,1329,1330],{"class":147,"line":385},[145,1331,1332],{"class":159},"            \"a sunlit meadow. The camera follows the puppy with a \"\n",[145,1334,1335],{"class":147,"line":409},[145,1336,1337],{"class":159},"            \"smooth tracking shot as wildflowers sway in the breeze.\"\n",[145,1339,1340],{"class":147,"line":420},[145,1341,1342],{"class":262},"        ),\n",[145,1344,1345,1348,1350,1353,1356],{"class":147,"line":431},[145,1346,1347],{"class":159},"        \"duration\"",[145,1349,437],{"class":262},[145,1351,1352],{"class":155},"5",[145,1354,1355],{"class":262},",                     ",[145,1357,1358],{"class":174},"# Video length: 4-15 seconds\n",[145,1360,1361,1364,1366,1369,1372],{"class":147,"line":455},[145,1362,1363],{"class":159},"        \"quality\"",[145,1365,437],{"class":262},[145,1367,1368],{"class":159},"\"720p\"",[145,1370,1371],{"class":262},",                 ",[145,1373,1374],{"class":174},"# Resolution: 480p, 720p, 1080p\n",[145,1376,1377,1380,1382,1385,1388],{"class":147,"line":466},[145,1378,1379],{"class":159},"        \"aspect_ratio\"",[145,1381,437],{"class":262},[145,1383,1384],{"class":159},"\"16:9\"",[145,1386,1387],{"class":262},",            ",[145,1389,1390],{"class":174},"# Standard widescreen\n",[145,1392,1393,1396,1398,1400],{"class":147,"line":600},[145,1394,1395],{"class":159},"        \"generate_audio\"",[145,1397,437],{"class":262},[145,1399,1139],{"class":155},[145,1401,1402],{"class":174},"             # AI generates matching audio\n",[145,1404,1405],{"class":147,"line":605},[145,1406,1407],{"class":262},"    }\n",[145,1409,1410],{"class":147,"line":611},[145,1411,376],{"emptyLinePlaceholder":58},[145,1413,1414,1416,1418,1421],{"class":147,"line":617},[145,1415,1102],{"class":155},[145,1417,794],{"class":262},[145,1419,1420],{"class":159},"\"Submitting text-to-video request...\"",[145,1422,406],{"class":262},[145,1424,1425,1428,1430],{"class":147,"line":623},[145,1426,1427],{"class":262},"    response ",[145,1429,266],{"class":258},[145,1431,1432],{"class":262}," requests.post(\n",[145,1434,1435,1438,1440,1442,1445,1448],{"class":147,"line":628},[145,1436,1437],{"class":258},"        f",[145,1439,449],{"class":159},[145,1441,679],{"class":155},[145,1443,1444],{"class":159},"/videos/generations\"",[145,1446,1447],{"class":262},",  ",[145,1449,1450],{"class":174},"# The video generation endpoint\n",[145,1452,1453,1456,1458,1460,1463],{"class":147,"line":639},[145,1454,1455],{"class":701},"        headers",[145,1457,266],{"class":258},[145,1459,423],{"class":155},[145,1461,1462],{"class":262},",                   ",[145,1464,1465],{"class":174},"# Auth + content-type headers\n",[145,1467,1468,1471,1473,1476],{"class":147,"line":654},[145,1469,1470],{"class":701},"        json",[145,1472,266],{"class":258},[145,1474,1475],{"class":262},"payload                       ",[145,1477,1478],{"class":174},"# Automatically serializes to JSON\n",[145,1480,1481],{"class":147,"line":660},[145,1482,1483],{"class":262},"    )\n",[145,1485,1486,1489],{"class":147,"line":671},[145,1487,1488],{"class":262},"    response.raise_for_status()            ",[145,1490,1491],{"class":174},"# Throw if not 200 OK\n",[145,1493,1494,1497,1499,1502],{"class":147,"line":698},[145,1495,1496],{"class":262},"    task ",[145,1498,266],{"class":258},[145,1500,1501],{"class":262}," response.json()                 ",[145,1503,1504],{"class":174},"# Parse the JSON response\n",[145,1506,1507],{"class":147,"line":710},[145,1508,376],{"emptyLinePlaceholder":58},[145,1510,1511],{"class":147,"line":716},[145,1512,1513],{"class":174},"    # Log key info from the response\n",[145,1515,1516,1518,1520,1522,1525,1527,1530,1533,1536,1538,1540],{"class":147,"line":722},[145,1517,1102],{"class":155},[145,1519,794],{"class":262},[145,1521,440],{"class":258},[145,1523,1524],{"class":159},"\"Task created: ",[145,1526,685],{"class":155},[145,1528,1529],{"class":262},"task[",[145,1531,1532],{"class":159},"'id'",[145,1534,1535],{"class":262},"]",[145,1537,691],{"class":155},[145,1539,449],{"class":159},[145,1541,406],{"class":262},[145,1543,1544,1546,1548,1550,1553,1555,1557,1560,1563,1566,1568,1570,1572],{"class":147,"line":728},[145,1545,1102],{"class":155},[145,1547,794],{"class":262},[145,1549,440],{"class":258},[145,1551,1552],{"class":159},"\"Estimated time: ",[145,1554,685],{"class":155},[145,1556,1529],{"class":262},[145,1558,1559],{"class":159},"'task_info'",[145,1561,1562],{"class":262},"][",[145,1564,1565],{"class":159},"'estimated_time'",[145,1567,1535],{"class":262},[145,1569,691],{"class":155},[145,1571,1024],{"class":159},[145,1573,406],{"class":262},[145,1575,1576,1578,1580,1582,1585,1587,1589,1592,1594,1597,1599,1601,1603],{"class":147,"line":739},[145,1577,1102],{"class":155},[145,1579,794],{"class":262},[145,1581,440],{"class":258},[145,1583,1584],{"class":159},"\"Credits reserved: ",[145,1586,685],{"class":155},[145,1588,1529],{"class":262},[145,1590,1591],{"class":159},"'usage'",[145,1593,1562],{"class":262},[145,1595,1596],{"class":159},"'credits_reserved'",[145,1598,1535],{"class":262},[145,1600,691],{"class":155},[145,1602,449],{"class":159},[145,1604,406],{"class":262},[145,1606,1607],{"class":147,"line":744},[145,1608,376],{"emptyLinePlaceholder":58},[145,1610,1611],{"class":147,"line":750},[145,1612,1613],{"class":174},"    # Poll until the video is ready\n",[145,1615,1616,1619,1621,1624,1627],{"class":147,"line":767},[145,1617,1618],{"class":262},"    result ",[145,1620,266],{"class":258},[145,1622,1623],{"class":262}," wait_for_video(task[",[145,1625,1626],{"class":159},"\"id\"",[145,1628,1629],{"class":262},"])\n",[145,1631,1632],{"class":147,"line":788},[145,1633,376],{"emptyLinePlaceholder":58},[145,1635,1636],{"class":147,"line":834},[145,1637,1638],{"class":174},"    # The results array contains one or more video URLs\n",[145,1640,1641,1644,1646,1649,1652,1654,1656],{"class":147,"line":839},[145,1642,1643],{"class":262},"    video_url ",[145,1645,266],{"class":258},[145,1647,1648],{"class":262}," result[",[145,1650,1651],{"class":159},"\"results\"",[145,1653,1562],{"class":262},[145,1655,783],{"class":155},[145,1657,764],{"class":262},[145,1659,1660,1662,1664,1666,1668,1671,1674,1676,1679,1681,1683],{"class":147,"line":845},[145,1661,1102],{"class":155},[145,1663,794],{"class":262},[145,1665,440],{"class":258},[145,1667,449],{"class":159},[145,1669,1670],{"class":155},"\\n",[145,1672,1673],{"class":159},"Video URL: ",[145,1675,685],{"class":155},[145,1677,1678],{"class":262},"video_url",[145,1680,691],{"class":155},[145,1682,449],{"class":159},[145,1684,406],{"class":262},[145,1686,1687,1690,1693],{"class":147,"line":863},[145,1688,1689],{"class":262},"    download_video(video_url, ",[145,1691,1692],{"class":159},"\"my_first_video.mp4\"",[145,1694,406],{"class":262},[145,1696,1697],{"class":147,"line":872},[145,1698,376],{"emptyLinePlaceholder":58},[145,1700,1701,1704],{"class":147,"line":887},[145,1702,1703],{"class":258},"    return",[145,1705,1706],{"class":262}," result\n",[145,1708,1709],{"class":147,"line":903},[145,1710,376],{"emptyLinePlaceholder":58},[145,1712,1713],{"class":147,"line":915},[145,1714,376],{"emptyLinePlaceholder":58},[145,1716,1717,1720,1723,1726,1729],{"class":147,"line":953},[145,1718,1719],{"class":258},"if",[145,1721,1722],{"class":155}," __name__",[145,1724,1725],{"class":258}," ==",[145,1727,1728],{"class":159}," \"__main__\"",[145,1730,860],{"class":262},[145,1732,1733],{"class":147,"line":959},[145,1734,1735],{"class":262},"    text_to_video()\n",[11,1737,1738],{},"Let's walk through each parameter in the payload:",[97,1740,1741,1756,1768,1776,1796,1816],{},[73,1742,1743,1748,1749,1752,1753,1755],{},[23,1744,1745],{},[28,1746,1747],{},"model"," — Which Seedance model to use. Set ",[28,1750,1751],{},"seedance-2.0"," for the latest; use ",[28,1754,30],{}," if 2.0 isn't available in your region yet.",[73,1757,1758,1763,1764,493],{},[23,1759,1760],{},[28,1761,1762],{},"prompt"," — Your video description. Be specific about subject, action, camera movement, and mood. The prompt above uses a three-part structure: subject (\"golden retriever puppy\"), action (\"chases a butterfly\"), and camera (\"smooth tracking shot\"). For advanced prompt techniques, see our ",[37,1765,1767],{"href":1766},"/blog/seedance-2-prompt-guide","Prompt Engineering Guide",[73,1769,1770,1775],{},[23,1771,1772],{},[28,1773,1774],{},"duration"," — Video length in seconds (4–15). Shorter videos generate faster and cost fewer credits. Start with 5 for testing.",[73,1777,1778,1783,1784,1787,1788,1791,1792,1795],{},[23,1779,1780],{},[28,1781,1782],{},"quality"," — Resolution tier. ",[28,1785,1786],{},"720p"," is the best balance of quality and speed for development. Use ",[28,1789,1790],{},"480p"," for rapid iteration, ",[28,1793,1794],{},"1080p"," for final renders.",[73,1797,1798,1803,1804,1807,1808,1811,1812,1815],{},[23,1799,1800],{},[28,1801,1802],{},"aspect_ratio"," — Output dimensions. ",[28,1805,1806],{},"16:9"," for YouTube/landscape, ",[28,1809,1810],{},"9:16"," for TikTok/Reels/Shorts, ",[28,1813,1814],{},"1:1"," for Instagram feed.",[73,1817,1818,1823,1824,1827],{},[23,1819,1820],{},[28,1821,1822],{},"generate_audio"," — When ",[28,1825,1826],{},"true",", Seedance generates ambient sound and music that matches the visual content. Adds ~2 seconds to generation time.",[11,1829,1830],{},"Run it:",[136,1832,1834],{"className":138,"code":1833,"language":140,"meta":141,"style":141},"python seedance_tutorial.py\n",[28,1835,1836],{"__ignoreMap":141},[145,1837,1838,1840],{"class":147,"line":148},[145,1839,340],{"class":151},[145,1841,1842],{"class":159}," seedance_tutorial.py\n",[92,1844,1846],{"id":1845},"what-the-api-returns","What the API Returns",[11,1848,1849,1850,1853],{},"When you submit a generation request, you get back a ",[23,1851,1852],{},"task object"," immediately — the video isn't ready yet. Here's the actual response:",[136,1855,1859],{"className":1856,"code":1857,"language":1858,"meta":141,"style":141},"language-json shiki shiki-themes github-dark","{\n  \"created\": 1772203771,\n  \"id\": \"task-unified-1772203771-yf1dxogh\",\n  \"model\": \"seedance-2.0\",\n  \"object\": \"video.generation.task\",\n  \"progress\": 0,\n  \"status\": \"pending\",\n  \"task_info\": {\n    \"can_cancel\": true,\n    \"estimated_time\": 132\n  },\n  \"type\": \"video\",\n  \"usage\": {\n    \"billing_rule\": \"per_second\",\n    \"credits_reserved\": 17.784,\n    \"user_group\": \"default\"\n  }\n}\n","json",[28,1860,1861,1866,1878,1890,1901,1913,1924,1936,1944,1955,1965,1970,1982,1989,2001,2013,2023,2028],{"__ignoreMap":141},[145,1862,1863],{"class":147,"line":148},[145,1864,1865],{"class":262},"{\n",[145,1867,1868,1871,1873,1876],{"class":147,"line":166},[145,1869,1870],{"class":155},"  \"created\"",[145,1872,437],{"class":262},[145,1874,1875],{"class":155},"1772203771",[145,1877,452],{"class":262},[145,1879,1880,1883,1885,1888],{"class":147,"line":178},[145,1881,1882],{"class":155},"  \"id\"",[145,1884,437],{"class":262},[145,1886,1887],{"class":159},"\"task-unified-1772203771-yf1dxogh\"",[145,1889,452],{"class":262},[145,1891,1892,1895,1897,1899],{"class":147,"line":187},[145,1893,1894],{"class":155},"  \"model\"",[145,1896,437],{"class":262},[145,1898,1308],{"class":159},[145,1900,452],{"class":262},[145,1902,1903,1906,1908,1911],{"class":147,"line":373},[145,1904,1905],{"class":155},"  \"object\"",[145,1907,437],{"class":262},[145,1909,1910],{"class":159},"\"video.generation.task\"",[145,1912,452],{"class":262},[145,1914,1915,1918,1920,1922],{"class":147,"line":379},[145,1916,1917],{"class":155},"  \"progress\"",[145,1919,437],{"class":262},[145,1921,783],{"class":155},[145,1923,452],{"class":262},[145,1925,1926,1929,1931,1934],{"class":147,"line":385},[145,1927,1928],{"class":155},"  \"status\"",[145,1930,437],{"class":262},[145,1932,1933],{"class":159},"\"pending\"",[145,1935,452],{"class":262},[145,1937,1938,1941],{"class":147,"line":409},[145,1939,1940],{"class":155},"  \"task_info\"",[145,1942,1943],{"class":262},": {\n",[145,1945,1946,1949,1951,1953],{"class":147,"line":420},[145,1947,1948],{"class":155},"    \"can_cancel\"",[145,1950,437],{"class":262},[145,1952,1826],{"class":155},[145,1954,452],{"class":262},[145,1956,1957,1960,1962],{"class":147,"line":431},[145,1958,1959],{"class":155},"    \"estimated_time\"",[145,1961,437],{"class":262},[145,1963,1964],{"class":155},"132\n",[145,1966,1967],{"class":147,"line":455},[145,1968,1969],{"class":262},"  },\n",[145,1971,1972,1975,1977,1980],{"class":147,"line":466},[145,1973,1974],{"class":155},"  \"type\"",[145,1976,437],{"class":262},[145,1978,1979],{"class":159},"\"video\"",[145,1981,452],{"class":262},[145,1983,1984,1987],{"class":147,"line":600},[145,1985,1986],{"class":155},"  \"usage\"",[145,1988,1943],{"class":262},[145,1990,1991,1994,1996,1999],{"class":147,"line":605},[145,1992,1993],{"class":155},"    \"billing_rule\"",[145,1995,437],{"class":262},[145,1997,1998],{"class":159},"\"per_second\"",[145,2000,452],{"class":262},[145,2002,2003,2006,2008,2011],{"class":147,"line":611},[145,2004,2005],{"class":155},"    \"credits_reserved\"",[145,2007,437],{"class":262},[145,2009,2010],{"class":155},"17.784",[145,2012,452],{"class":262},[145,2014,2015,2018,2020],{"class":147,"line":617},[145,2016,2017],{"class":155},"    \"user_group\"",[145,2019,437],{"class":262},[145,2021,2022],{"class":159},"\"default\"\n",[145,2024,2025],{"class":147,"line":623},[145,2026,2027],{"class":262},"  }\n",[145,2029,2030],{"class":147,"line":628},[145,2031,469],{"class":262},[11,2033,2034],{},"Key fields explained:",[2036,2037,2038,2051],"table",{},[2039,2040,2041],"thead",{},[2042,2043,2044,2048],"tr",{},[2045,2046,2047],"th",{},"Field",[2045,2049,2050],{},"Meaning",[2052,2053,2054,2065,2088,2099,2109,2119,2132,2142],"tbody",{},[2042,2055,2056,2062],{},[2057,2058,2059],"td",{},[28,2060,2061],{},"id",[2057,2063,2064],{},"Your task ID — use this to check status and retrieve results",[2042,2066,2067,2071],{},[2057,2068,2069],{},[28,2070,814],{},[2057,2072,2073,2074,2077,2078,2081,2082,280,2085],{},"Starts as ",[28,2075,2076],{},"pending",", moves to ",[28,2079,2080],{},"processing",", then ",[28,2083,2084],{},"completed",[28,2086,2087],{},"failed",[2042,2089,2090,2094],{},[2057,2091,2092],{},[28,2093,824],{},[2057,2095,2096,2097],{},"0–100 percentage. Updates in real-time during ",[28,2098,2080],{},[2042,2100,2101,2106],{},[2057,2102,2103],{},[28,2104,2105],{},"estimated_time",[2057,2107,2108],{},"Approximate seconds until completion (server-side estimate)",[2042,2110,2111,2116],{},[2057,2112,2113],{},[28,2114,2115],{},"credits_reserved",[2057,2117,2118],{},"Credits held for this job. Refunded automatically if the task fails",[2042,2120,2121,2126],{},[2057,2122,2123],{},[28,2124,2125],{},"task_info.can_cancel",[2057,2127,2128,2129,2131],{},"Whether you can cancel this task (always ",[28,2130,1826],{}," before completion)",[2042,2133,2134,2139],{},[2057,2135,2136],{},[28,2137,2138],{},"created",[2057,2140,2141],{},"Unix timestamp of when the task was submitted",[2042,2143,2144,2149],{},[2057,2145,2146],{},[28,2147,2148],{},"usage.billing_rule",[2057,2150,2151,2152,2155],{},"How credits are calculated — ",[28,2153,2154],{},"per_second"," means cost scales with duration",[18,2157,2158],{},[11,2159,2160,2162,2163,2165,2166,2169],{},[23,2161,133],{}," Save the ",[28,2164,2061],{}," to a file or database immediately after submission. If your script crashes during polling, you can resume by calling ",[28,2167,2168],{},"wait_for_video()"," with the saved task ID. Tasks persist on the server for 24 hours.",[92,2171,2173],{"id":2172},"the-polling-sequence","The Polling Sequence",[11,2175,2176,2177,2179],{},"The ",[28,2178,2168],{}," function polls every 10 seconds. Here's what the real output looks like:",[136,2181,2186],{"className":2182,"code":2184,"language":2185},[2183],"language-text","Submitting text-to-video request...\nTask created: task-unified-1772203771-yf1dxogh\nEstimated time: 132s\nCredits reserved: 17.784\n  [0s] Status: pending | Progress: 0%\n  [10s] Status: processing | Progress: 7%\n  [20s] Status: processing | Progress: 13%\n  [30s] Status: processing | Progress: 20%\n  [40s] Status: processing | Progress: 27%\n  [50s] Status: completed | Progress: 100%\n\nVideo URL: https://files.evolink.ai/.../cgt-20260227224931-8vl7s.mp4\nDownloading video to my_first_video.mp4...\nSaved: my_first_video.mp4 (2847 KB)\n","text",[28,2187,2184],{"__ignoreMap":141},[11,2189,2190],{},"That's it — about 50 seconds from API call to video file on disk.",[18,2192,2193],{},[11,2194,2195,2198],{},[23,2196,2197],{},"Important:"," Video URLs expire after 24 hours. Always download the file promptly or store it in your own storage (S3, GCS, Cloudflare R2, etc.).",[18,2200,2201],{},[11,2202,2203,2205],{},[23,2204,304],{}," Don't rely on the video URL for long-term storage. Build your pipeline to download immediately after completion. If you're processing videos asynchronously, use webhooks (covered below) to trigger downloads the moment they're ready.",[11,2207,2208,2209,2212],{},"For tips on writing effective prompts, see the ",[37,2210,2211],{"href":1766},"Seedance 2.0 Prompt Guide"," — it covers shot-script format, style keywords, and timing syntax.",[45,2214],{},[48,2216,2218],{"id":2217},"poll-for-results-understanding-the-async-workflow","Poll for Results: Understanding the Async Workflow",[11,2220,2221,2222,2225],{},"Video generation takes 30–120+ seconds depending on duration and quality. The API uses an ",[23,2223,2224],{},"asynchronous task pattern"," — the same pattern used by OpenAI, Stability AI, and most other generative AI APIs:",[70,2227,2228,2238,2248],{},[73,2229,2230,2233,2234,2237],{},[23,2231,2232],{},"Submit"," → POST to ",[28,2235,2236],{},"/v1/videos/generations"," → get a task ID instantly",[73,2239,2240,2243,2244,2247],{},[23,2241,2242],{},"Poll"," → GET ",[28,2245,2246],{},"/v1/tasks/{task_id}"," → check status periodically",[73,2249,2250,2253,2254,2257,2258,2261],{},[23,2251,2252],{},"Retrieve"," → When ",[28,2255,2256],{},"status: \"completed\"",", the ",[28,2259,2260],{},"results"," array contains video URLs",[11,2263,2264],{},"This pattern exists because video generation is computationally expensive. A synchronous HTTP request would time out long before the video is ready.",[92,2266,2268],{"id":2267},"task-status-lifecycle","Task Status Lifecycle",[136,2270,2273],{"className":2271,"code":2272,"language":2185},[2183],"pending → processing → completed\n                    ↘ failed\n",[28,2274,2272],{"__ignoreMap":141},[2036,2276,2277,2290],{},[2039,2278,2279],{},[2042,2280,2281,2284,2287],{},[2045,2282,2283],{},"Status",[2045,2285,2286],{},"What's Happening",[2045,2288,2289],{},"Typical Duration",[2052,2291,2292,2304,2319,2334],{},[2042,2293,2294,2298,2301],{},[2057,2295,2296],{},[28,2297,2076],{},[2057,2299,2300],{},"Task is queued, waiting for GPU resources",[2057,2302,2303],{},"0–30 seconds",[2042,2305,2306,2310,2316],{},[2057,2307,2308],{},[28,2309,2080],{},[2057,2311,2312,2313,2315],{},"Video is being generated — ",[28,2314,824],{}," updates in real-time",[2057,2317,2318],{},"30–120 seconds",[2042,2320,2321,2325,2331],{},[2057,2322,2323],{},[28,2324,2084],{},[2057,2326,2327,2328,2330],{},"Done! ",[28,2329,2260],{}," array has your video URL(s)",[2057,2332,2333],{},"Terminal state",[2042,2335,2336,2340,2343],{},[2057,2337,2338],{},[28,2339,2087],{},[2057,2341,2342],{},"Something went wrong — check the error details",[2057,2344,2333],{},[92,2346,2348],{"id":2347},"polling-best-practices","Polling Best Practices",[11,2350,2351,2354],{},[23,2352,2353],{},"Poll interval:"," 10 seconds is a good default. Polling too fast wastes requests and could trigger rate limits; too slow delays your pipeline. For time-critical applications, you can poll every 5 seconds, but there's no benefit to going faster than that.",[11,2356,2357,2360],{},[23,2358,2359],{},"Timeout:"," Set a reasonable upper limit based on your parameters:",[2036,2362,2363,2376],{},[2039,2364,2365],{},[2042,2366,2367,2370,2373],{},[2045,2368,2369],{},"Configuration",[2045,2371,2372],{},"Expected Time",[2045,2374,2375],{},"Suggested Timeout",[2052,2377,2378,2389,2400,2411],{},[2042,2379,2380,2383,2386],{},[2057,2381,2382],{},"4s, 480p",[2057,2384,2385],{},"20–40 seconds",[2057,2387,2388],{},"120 seconds",[2042,2390,2391,2394,2397],{},[2057,2392,2393],{},"5s, 720p",[2057,2395,2396],{},"30–60 seconds",[2057,2398,2399],{},"180 seconds",[2042,2401,2402,2405,2408],{},[2057,2403,2404],{},"10s, 720p",[2057,2406,2407],{},"60–90 seconds",[2057,2409,2410],{},"300 seconds",[2042,2412,2413,2416,2419],{},[2057,2414,2415],{},"15s, 1080p",[2057,2417,2418],{},"90–180 seconds",[2057,2420,2421],{},"600 seconds",[11,2423,2424,2427,2428,2430,2431,2433],{},[23,2425,2426],{},"Progress tracking:"," The ",[28,2429,824],{}," field (0–100) gives you granular feedback — useful for building progress bars in a UI. Progress updates roughly every 5–7 seconds during the ",[28,2432,2080],{}," phase.",[92,2435,2437],{"id":2436},"cancelling-a-task","Cancelling a Task",[11,2439,2440],{},"If you need to stop a generation in progress (wrong prompt, changed your mind), you can cancel it:",[136,2442,2444],{"className":338,"code":2443,"language":340,"meta":141,"style":141},"def cancel_task(task_id):\n    \"\"\"Cancel a pending or processing task. Credits are refunded.\"\"\"\n    response = requests.post(\n        f\"{BASE_URL}/tasks/{task_id}/cancel\",\n        headers=HEADERS\n    )\n    if response.status_code == 200:\n        print(f\"Task {task_id} cancelled. Credits refunded.\")\n    else:\n        print(f\"Cancel failed: {response.json()}\")\n",[28,2445,2446,2456,2461,2469,2490,2498,2502,2517,2538,2545],{"__ignoreMap":141},[145,2447,2448,2450,2453],{"class":147,"line":148},[145,2449,526],{"class":258},[145,2451,2452],{"class":151}," cancel_task",[145,2454,2455],{"class":262},"(task_id):\n",[145,2457,2458],{"class":147,"line":166},[145,2459,2460],{"class":159},"    \"\"\"Cancel a pending or processing task. Credits are refunded.\"\"\"\n",[145,2462,2463,2465,2467],{"class":147,"line":178},[145,2464,1427],{"class":262},[145,2466,266],{"class":258},[145,2468,1432],{"class":262},[145,2470,2471,2473,2475,2477,2479,2481,2483,2485,2488],{"class":147,"line":187},[145,2472,1437],{"class":258},[145,2474,449],{"class":159},[145,2476,679],{"class":155},[145,2478,682],{"class":159},[145,2480,685],{"class":155},[145,2482,688],{"class":262},[145,2484,691],{"class":155},[145,2486,2487],{"class":159},"/cancel\"",[145,2489,452],{"class":262},[145,2491,2492,2494,2496],{"class":147,"line":373},[145,2493,1455],{"class":701},[145,2495,266],{"class":258},[145,2497,707],{"class":155},[145,2499,2500],{"class":147,"line":379},[145,2501,1483],{"class":262},[145,2503,2504,2507,2510,2512,2515],{"class":147,"line":385},[145,2505,2506],{"class":258},"    if",[145,2508,2509],{"class":262}," response.status_code ",[145,2511,854],{"class":258},[145,2513,2514],{"class":155}," 200",[145,2516,860],{"class":262},[145,2518,2519,2521,2523,2525,2527,2529,2531,2533,2536],{"class":147,"line":409},[145,2520,791],{"class":155},[145,2522,794],{"class":262},[145,2524,440],{"class":258},[145,2526,921],{"class":159},[145,2528,685],{"class":155},[145,2530,688],{"class":262},[145,2532,691],{"class":155},[145,2534,2535],{"class":159}," cancelled. Credits refunded.\"",[145,2537,406],{"class":262},[145,2539,2540,2543],{"class":147,"line":420},[145,2541,2542],{"class":258},"    else",[145,2544,860],{"class":262},[145,2546,2547,2549,2551,2553,2556,2558,2561,2563,2565],{"class":147,"line":431},[145,2548,791],{"class":155},[145,2550,794],{"class":262},[145,2552,440],{"class":258},[145,2554,2555],{"class":159},"\"Cancel failed: ",[145,2557,685],{"class":155},[145,2559,2560],{"class":262},"response.json()",[145,2562,691],{"class":155},[145,2564,449],{"class":159},[145,2566,406],{"class":262},[11,2568,2569,2570,2572,2573,2575,2576,280,2578,2580],{},"Cancellation works when ",[28,2571,2125],{}," is ",[28,2574,1826],{},". Once a task reaches ",[28,2577,2084],{},[28,2579,2087],{},", it can't be cancelled. Reserved credits are refunded automatically on cancellation.",[18,2582,2583],{},[11,2584,2585,2587],{},[23,2586,133],{}," Build a cancellation mechanism into your UI early. Users will inevitably submit wrong prompts, and waiting 2 minutes for a bad video wastes both time and credits.",[11,2589,2176,2590,2592,2593,2597],{},[28,2591,2168],{}," function from our setup code handles the standard polling flow. If you want to skip polling entirely, jump to the ",[37,2594,2596],{"href":2595},"#set-up-webhooks-skip-the-polling","Webhooks section"," below.",[45,2599],{},[48,2601,2603],{"id":2602},"animate-an-image-image-to-video","Animate an Image (Image-to-Video)",[11,2605,2606,2607,2610,2611,2615],{},"Got a product photo, character illustration, or landscape you want to bring to life? Pass it as an ",[28,2608,2609],{},"image_url"," and Seedance will animate it. This is one of the most powerful features for ",[37,2612,2614],{"href":2613},"/blog/seedance-2-ecommerce-product-videos","e-commerce product videos"," — take a static product shot and turn it into an engaging video ad.",[11,2617,2618],{},[2619,2620,2621],"em",{},"Uses the same setup and polling function from the first example above.",[136,2623,2625],{"className":338,"code":2624,"language":340,"meta":141,"style":141},"# ── Image-to-Video ────────────────────────────────────────────\ndef image_to_video():\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as the first frame. The scene slowly comes \"\n            \"to life — leaves rustle gently, soft light shifts \"\n            \"across the frame, and the subject blinks naturally.\"\n        ),\n        \"image_urls\": [\n            \"https://example.com/your-image.jpg\"\n        ],\n        \"duration\": 5,\n        \"quality\": \"720p\",\n        \"aspect_ratio\": \"16:9\"\n    }\n\n    print(\"Submitting image-to-video request...\")\n    response = requests.post(\n        f\"{BASE_URL}/videos/generations\",\n        headers=HEADERS,\n        json=payload\n    )\n    response.raise_for_status()\n    task = response.json()\n\n    print(f\"Task created: {task['id']}\")\n    result = wait_for_video(task[\"id\"])\n\n    video_url = result[\"results\"][0]\n    download_video(video_url, \"animated_image.mp4\")\n\n    return result\n",[28,2626,2627,2632,2641,2649,2659,2665,2670,2675,2680,2684,2692,2697,2702,2712,2722,2731,2735,2739,2750,2758,2770,2780,2789,2793,2798,2806,2810,2834,2846,2850,2866,2875,2879],{"__ignoreMap":141},[145,2628,2629],{"class":147,"line":148},[145,2630,2631],{"class":174},"# ── Image-to-Video ────────────────────────────────────────────\n",[145,2633,2634,2636,2639],{"class":147,"line":166},[145,2635,526],{"class":258},[145,2637,2638],{"class":151}," image_to_video",[145,2640,1289],{"class":262},[145,2642,2643,2645,2647],{"class":147,"line":178},[145,2644,1294],{"class":262},[145,2646,266],{"class":258},[145,2648,428],{"class":262},[145,2650,2651,2653,2655,2657],{"class":147,"line":187},[145,2652,1303],{"class":159},[145,2654,437],{"class":262},[145,2656,1308],{"class":159},[145,2658,452],{"class":262},[145,2660,2661,2663],{"class":147,"line":373},[145,2662,1319],{"class":159},[145,2664,1322],{"class":262},[145,2666,2667],{"class":147,"line":379},[145,2668,2669],{"class":159},"            \"@Image1 as the first frame. The scene slowly comes \"\n",[145,2671,2672],{"class":147,"line":385},[145,2673,2674],{"class":159},"            \"to life — leaves rustle gently, soft light shifts \"\n",[145,2676,2677],{"class":147,"line":409},[145,2678,2679],{"class":159},"            \"across the frame, and the subject blinks naturally.\"\n",[145,2681,2682],{"class":147,"line":420},[145,2683,1342],{"class":262},[145,2685,2686,2689],{"class":147,"line":431},[145,2687,2688],{"class":159},"        \"image_urls\"",[145,2690,2691],{"class":262},": [\n",[145,2693,2694],{"class":147,"line":455},[145,2695,2696],{"class":159},"            \"https://example.com/your-image.jpg\"\n",[145,2698,2699],{"class":147,"line":466},[145,2700,2701],{"class":262},"        ],\n",[145,2703,2704,2706,2708,2710],{"class":147,"line":600},[145,2705,1347],{"class":159},[145,2707,437],{"class":262},[145,2709,1352],{"class":155},[145,2711,452],{"class":262},[145,2713,2714,2716,2718,2720],{"class":147,"line":605},[145,2715,1363],{"class":159},[145,2717,437],{"class":262},[145,2719,1368],{"class":159},[145,2721,452],{"class":262},[145,2723,2724,2726,2728],{"class":147,"line":611},[145,2725,1379],{"class":159},[145,2727,437],{"class":262},[145,2729,2730],{"class":159},"\"16:9\"\n",[145,2732,2733],{"class":147,"line":617},[145,2734,1407],{"class":262},[145,2736,2737],{"class":147,"line":623},[145,2738,376],{"emptyLinePlaceholder":58},[145,2740,2741,2743,2745,2748],{"class":147,"line":628},[145,2742,1102],{"class":155},[145,2744,794],{"class":262},[145,2746,2747],{"class":159},"\"Submitting image-to-video request...\"",[145,2749,406],{"class":262},[145,2751,2752,2754,2756],{"class":147,"line":639},[145,2753,1427],{"class":262},[145,2755,266],{"class":258},[145,2757,1432],{"class":262},[145,2759,2760,2762,2764,2766,2768],{"class":147,"line":654},[145,2761,1437],{"class":258},[145,2763,449],{"class":159},[145,2765,679],{"class":155},[145,2767,1444],{"class":159},[145,2769,452],{"class":262},[145,2771,2772,2774,2776,2778],{"class":147,"line":660},[145,2773,1455],{"class":701},[145,2775,266],{"class":258},[145,2777,423],{"class":155},[145,2779,452],{"class":262},[145,2781,2782,2784,2786],{"class":147,"line":671},[145,2783,1470],{"class":701},[145,2785,266],{"class":258},[145,2787,2788],{"class":262},"payload\n",[145,2790,2791],{"class":147,"line":698},[145,2792,1483],{"class":262},[145,2794,2795],{"class":147,"line":710},[145,2796,2797],{"class":262},"    response.raise_for_status()\n",[145,2799,2800,2802,2804],{"class":147,"line":716},[145,2801,1496],{"class":262},[145,2803,266],{"class":258},[145,2805,736],{"class":262},[145,2807,2808],{"class":147,"line":722},[145,2809,376],{"emptyLinePlaceholder":58},[145,2811,2812,2814,2816,2818,2820,2822,2824,2826,2828,2830,2832],{"class":147,"line":728},[145,2813,1102],{"class":155},[145,2815,794],{"class":262},[145,2817,440],{"class":258},[145,2819,1524],{"class":159},[145,2821,685],{"class":155},[145,2823,1529],{"class":262},[145,2825,1532],{"class":159},[145,2827,1535],{"class":262},[145,2829,691],{"class":155},[145,2831,449],{"class":159},[145,2833,406],{"class":262},[145,2835,2836,2838,2840,2842,2844],{"class":147,"line":739},[145,2837,1618],{"class":262},[145,2839,266],{"class":258},[145,2841,1623],{"class":262},[145,2843,1626],{"class":159},[145,2845,1629],{"class":262},[145,2847,2848],{"class":147,"line":744},[145,2849,376],{"emptyLinePlaceholder":58},[145,2851,2852,2854,2856,2858,2860,2862,2864],{"class":147,"line":750},[145,2853,1643],{"class":262},[145,2855,266],{"class":258},[145,2857,1648],{"class":262},[145,2859,1651],{"class":159},[145,2861,1562],{"class":262},[145,2863,783],{"class":155},[145,2865,764],{"class":262},[145,2867,2868,2870,2873],{"class":147,"line":767},[145,2869,1689],{"class":262},[145,2871,2872],{"class":159},"\"animated_image.mp4\"",[145,2874,406],{"class":262},[145,2876,2877],{"class":147,"line":788},[145,2878,376],{"emptyLinePlaceholder":58},[145,2880,2881,2883],{"class":147,"line":834},[145,2882,1703],{"class":258},[145,2884,1706],{"class":262},[11,2886,2887],{},"Let's unpack what's different from text-to-video:",[97,2889,2890,2902,2922],{},[73,2891,2892,2897,2898,2901],{},[23,2893,2894],{},[28,2895,2896],{},"image_urls"," — An array of publicly accessible image URLs. The API fetches these directly, so they must be reachable from the internet (not ",[28,2899,2900],{},"localhost"," or private network URLs).",[73,2903,2904,2910,2911,2913,2914,400,2916,400,2919,493],{},[23,2905,2906,2909],{},[28,2907,2908],{},"@Image1"," in the prompt"," — This tag tells Seedance which image to reference and how. It corresponds to the first URL in ",[28,2912,2896],{},". If you pass three images, you'd use ",[28,2915,2908],{},[28,2917,2918],{},"@Image2",[28,2920,2921],{},"@Image3",[73,2923,2924,2929,2930,2932,2933,2936],{},[23,2925,2926,2927],{},"No ",[28,2928,1822],{}," — Omitted here, which defaults to ",[28,2931,1826],{},". You can set it to ",[28,2934,2935],{},"false"," for silent animation.",[92,2938,2940],{"id":2939},"how-image-tags-work","How @Image Tags Work",[11,2942,2176,2943,2945,2946,2948,2949,2951,2952,2955,2956,2959,2960,2963,2964,493],{},[28,2944,2908],{}," tag in your prompt tells Seedance how to use the image. It references the first URL in the ",[28,2947,2896],{}," array. You can pass up to 9 images (",[28,2950,2908],{}," through ",[28,2953,2954],{},"@Image9","). For a complete guide on multimodal tags including ",[28,2957,2958],{},"@Video"," and ",[28,2961,2962],{},"@Audio",", see the ",[37,2965,2967],{"href":2966},"/blog/seedance-2-multimodal-tags-guide","Multimodal @Tags Guide",[11,2969,2970],{},"Common patterns:",[2036,2972,2973,2986],{},[2039,2974,2975],{},[2042,2976,2977,2980,2983],{},[2045,2978,2979],{},"Prompt Pattern",[2045,2981,2982],{},"What It Does",[2045,2984,2985],{},"Best For",[2052,2987,2988,3001,3014,3027,3040],{},[2042,2989,2990,2995,2998],{},[2057,2991,2992],{},[28,2993,2994],{},"@Image1 as first frame",[2057,2996,2997],{},"Uses the image as the opening frame",[2057,2999,3000],{},"Product showcases, scene setting",[2042,3002,3003,3008,3011],{},[2057,3004,3005],{},[28,3006,3007],{},"@Image1 as last frame",[2057,3009,3010],{},"Uses the image as the closing frame",[2057,3012,3013],{},"Logo reveals, transitions",[2042,3015,3016,3021,3024],{},[2057,3017,3018],{},[28,3019,3020],{},"@Image1 as character reference",[2057,3022,3023],{},"Maintains the character's appearance",[2057,3025,3026],{},"Consistent characters across clips",[2042,3028,3029,3034,3037],{},[2057,3030,3031],{},[28,3032,3033],{},"@Image1 as style reference",[2057,3035,3036],{},"Applies the image's visual style",[2057,3038,3039],{},"Brand consistency, art direction",[2042,3041,3042,3047,3050],{},[2057,3043,3044],{},[28,3045,3046],{},"@Image1 as first frame, @Image2 as last frame",[2057,3048,3049],{},"Creates a transition between two images",[2057,3051,3052],{},"Before/after, transformations",[11,3054,3055],{},"The actual response from our test:",[136,3057,3059],{"className":1856,"code":3058,"language":1858,"meta":141,"style":141},"{\n  \"created\": 1772204037,\n  \"id\": \"task-unified-1772204036-lify8u5p\",\n  \"model\": \"seedance-2.0\",\n  \"object\": \"video.generation.task\",\n  \"progress\": 0,\n  \"status\": \"pending\",\n  \"task_info\": {\n    \"can_cancel\": true,\n    \"estimated_time\": 145\n  },\n  \"type\": \"video\",\n  \"usage\": {\n    \"billing_rule\": \"per_second\",\n    \"credits_reserved\": 17.784,\n    \"user_group\": \"default\"\n  }\n}\n",[28,3060,3061,3065,3076,3087,3097,3107,3117,3127,3133,3143,3152,3156,3166,3172,3182,3192,3200,3204],{"__ignoreMap":141},[145,3062,3063],{"class":147,"line":148},[145,3064,1865],{"class":262},[145,3066,3067,3069,3071,3074],{"class":147,"line":166},[145,3068,1870],{"class":155},[145,3070,437],{"class":262},[145,3072,3073],{"class":155},"1772204037",[145,3075,452],{"class":262},[145,3077,3078,3080,3082,3085],{"class":147,"line":178},[145,3079,1882],{"class":155},[145,3081,437],{"class":262},[145,3083,3084],{"class":159},"\"task-unified-1772204036-lify8u5p\"",[145,3086,452],{"class":262},[145,3088,3089,3091,3093,3095],{"class":147,"line":187},[145,3090,1894],{"class":155},[145,3092,437],{"class":262},[145,3094,1308],{"class":159},[145,3096,452],{"class":262},[145,3098,3099,3101,3103,3105],{"class":147,"line":373},[145,3100,1905],{"class":155},[145,3102,437],{"class":262},[145,3104,1910],{"class":159},[145,3106,452],{"class":262},[145,3108,3109,3111,3113,3115],{"class":147,"line":379},[145,3110,1917],{"class":155},[145,3112,437],{"class":262},[145,3114,783],{"class":155},[145,3116,452],{"class":262},[145,3118,3119,3121,3123,3125],{"class":147,"line":385},[145,3120,1928],{"class":155},[145,3122,437],{"class":262},[145,3124,1933],{"class":159},[145,3126,452],{"class":262},[145,3128,3129,3131],{"class":147,"line":409},[145,3130,1940],{"class":155},[145,3132,1943],{"class":262},[145,3134,3135,3137,3139,3141],{"class":147,"line":420},[145,3136,1948],{"class":155},[145,3138,437],{"class":262},[145,3140,1826],{"class":155},[145,3142,452],{"class":262},[145,3144,3145,3147,3149],{"class":147,"line":431},[145,3146,1959],{"class":155},[145,3148,437],{"class":262},[145,3150,3151],{"class":155},"145\n",[145,3153,3154],{"class":147,"line":455},[145,3155,1969],{"class":262},[145,3157,3158,3160,3162,3164],{"class":147,"line":466},[145,3159,1974],{"class":155},[145,3161,437],{"class":262},[145,3163,1979],{"class":159},[145,3165,452],{"class":262},[145,3167,3168,3170],{"class":147,"line":600},[145,3169,1986],{"class":155},[145,3171,1943],{"class":262},[145,3173,3174,3176,3178,3180],{"class":147,"line":605},[145,3175,1993],{"class":155},[145,3177,437],{"class":262},[145,3179,1998],{"class":159},[145,3181,452],{"class":262},[145,3183,3184,3186,3188,3190],{"class":147,"line":611},[145,3185,2005],{"class":155},[145,3187,437],{"class":262},[145,3189,2010],{"class":155},[145,3191,452],{"class":262},[145,3193,3194,3196,3198],{"class":147,"line":617},[145,3195,2017],{"class":155},[145,3197,437],{"class":262},[145,3199,2022],{"class":159},[145,3201,3202],{"class":147,"line":623},[145,3203,2027],{"class":262},[145,3205,3206],{"class":147,"line":628},[145,3207,469],{"class":262},[11,3209,3210,3211,3213],{},"Image-to-video follows the exact same async pattern — submit, poll, download. The ",[28,3212,2105],{}," is slightly longer because the model needs to analyze the input image.",[92,3215,3217],{"id":3216},"image-requirements","Image Requirements",[2036,3219,3220,3230],{},[2039,3221,3222],{},[2042,3223,3224,3227],{},[2045,3225,3226],{},"Constraint",[2045,3228,3229],{},"Value",[2052,3231,3232,3240,3248,3256,3264],{},[2042,3233,3234,3237],{},[2057,3235,3236],{},"Max images",[2057,3238,3239],{},"9 per request",[2042,3241,3242,3245],{},[2057,3243,3244],{},"Max file size",[2057,3246,3247],{},"30 MB per image",[2042,3249,3250,3253],{},[2057,3251,3252],{},"Supported formats",[2057,3254,3255],{},"JPEG, PNG, WebP, BMP, TIFF, GIF",[2042,3257,3258,3261],{},[2057,3259,3260],{},"URL requirement",[2057,3262,3263],{},"Must be publicly accessible",[2042,3265,3266,3269],{},[2057,3267,3268],{},"Recommended resolution",[2057,3270,3271],{},"At least 720px on the shorter side",[18,3273,3274],{},[11,3275,3276,3278,3279,3281],{},[23,3277,304],{}," Passing a local file path instead of a URL. The ",[28,3280,2896],{}," field requires publicly accessible HTTP/HTTPS URLs. If your images are local, upload them to S3, Cloudflare R2, or even a temporary file hosting service first.",[18,3283,3284],{},[11,3285,3286,3289],{},[23,3287,3288],{},"Restriction:"," Seedance does not support uploading realistic human face images. The system automatically rejects them. Use illustrated or stylized characters instead.",[92,3291,3293],{"id":3292},"hosting-images-for-the-api","Hosting Images for the API",[11,3295,3296],{},"If you don't have a CDN, here are quick options for getting a public URL:",[136,3298,3300],{"className":338,"code":3299,"language":340,"meta":141,"style":141},"# Option 1: Upload to S3 (if you have AWS)\nimport boto3\ns3 = boto3.client('s3')\ns3.upload_file('local_image.jpg', 'my-bucket', 'seedance/input.jpg')\nimage_url = f\"https://my-bucket.s3.amazonaws.com/seedance/input.jpg\"\n\n# Option 2: Use a temporary file hosting API\n# Many services offer free temporary hosting for testing\n",[28,3301,3302,3307,3314,3329,3349,3362,3366,3371],{"__ignoreMap":141},[145,3303,3304],{"class":147,"line":148},[145,3305,3306],{"class":174},"# Option 1: Upload to S3 (if you have AWS)\n",[145,3308,3309,3311],{"class":147,"line":166},[145,3310,347],{"class":258},[145,3312,3313],{"class":262}," boto3\n",[145,3315,3316,3319,3321,3324,3327],{"class":147,"line":178},[145,3317,3318],{"class":262},"s3 ",[145,3320,266],{"class":258},[145,3322,3323],{"class":262}," boto3.client(",[145,3325,3326],{"class":159},"'s3'",[145,3328,406],{"class":262},[145,3330,3331,3334,3337,3339,3342,3344,3347],{"class":147,"line":187},[145,3332,3333],{"class":262},"s3.upload_file(",[145,3335,3336],{"class":159},"'local_image.jpg'",[145,3338,400],{"class":262},[145,3340,3341],{"class":159},"'my-bucket'",[145,3343,400],{"class":262},[145,3345,3346],{"class":159},"'seedance/input.jpg'",[145,3348,406],{"class":262},[145,3350,3351,3354,3356,3359],{"class":147,"line":373},[145,3352,3353],{"class":262},"image_url ",[145,3355,266],{"class":258},[145,3357,3358],{"class":258}," f",[145,3360,3361],{"class":159},"\"https://my-bucket.s3.amazonaws.com/seedance/input.jpg\"\n",[145,3363,3364],{"class":147,"line":379},[145,3365,376],{"emptyLinePlaceholder":58},[145,3367,3368],{"class":147,"line":385},[145,3369,3370],{"class":174},"# Option 2: Use a temporary file hosting API\n",[145,3372,3373],{"class":147,"line":409},[145,3374,3375],{"class":174},"# Many services offer free temporary hosting for testing\n",[11,3377,3378,3379,493],{},"For advanced image-to-video techniques — first-last frame control, multi-image composition, and e-commerce product animation — see the ",[37,3380,3382],{"href":3381},"/blog/seedance-2-image-to-video-api","Image-to-Video deep dive",[45,3384],{},[48,3386,3388],{"id":3387},"customize-your-videos","Customize Your Videos",[11,3390,3391],{},"Every parameter you can tune in a generation request:",[2036,3393,3394,3413],{},[2039,3395,3396],{},[2042,3397,3398,3401,3404,3407,3410],{},[2045,3399,3400],{},"Parameter",[2045,3402,3403],{},"Type",[2045,3405,3406],{},"Default",[2045,3408,3409],{},"Options",[2045,3411,3412],{},"Description",[2052,3414,3415,3434,3450,3467,3490,3522,3544,3561,3578,3595],{},[2042,3416,3417,3421,3424,3427,3431],{},[2057,3418,3419],{},[28,3420,1747],{},[2057,3422,3423],{},"string",[2057,3425,3426],{},"—",[2057,3428,3429],{},[28,3430,1751],{},[2057,3432,3433],{},"Required. The model to use.",[2042,3435,3436,3440,3442,3444,3447],{},[2057,3437,3438],{},[28,3439,1762],{},[2057,3441,3423],{},[2057,3443,3426],{},[2057,3445,3446],{},"≤2000 tokens",[2057,3448,3449],{},"Required. Video description with optional @tags.",[2042,3451,3452,3456,3459,3461,3464],{},[2057,3453,3454],{},[28,3455,1774],{},[2057,3457,3458],{},"integer",[2057,3460,1352],{},[2057,3462,3463],{},"4–15",[2057,3465,3466],{},"Video length in seconds.",[2042,3468,3469,3473,3475,3479,3487],{},[2057,3470,3471],{},[28,3472,1782],{},[2057,3474,3423],{},[2057,3476,3477],{},[28,3478,1786],{},[2057,3480,3481,400,3483,400,3485],{},[28,3482,1790],{},[28,3484,1786],{},[28,3486,1794],{},[2057,3488,3489],{},"Resolution tier. Higher = more credits.",[2042,3491,3492,3496,3498,3502,3519],{},[2057,3493,3494],{},[28,3495,1802],{},[2057,3497,3423],{},[2057,3499,3500],{},[28,3501,1806],{},[2057,3503,3504,400,3506,400,3508,400,3510,400,3513,400,3516],{},[28,3505,1806],{},[28,3507,1810],{},[28,3509,1814],{},[28,3511,3512],{},"4:3",[28,3514,3515],{},"3:4",[28,3517,3518],{},"21:9",[2057,3520,3521],{},"Output aspect ratio.",[2042,3523,3524,3528,3531,3535,3541],{},[2057,3525,3526],{},[28,3527,1822],{},[2057,3529,3530],{},"boolean",[2057,3532,3533],{},[28,3534,1826],{},[2057,3536,3537,400,3539],{},[28,3538,1826],{},[28,3540,2935],{},[2057,3542,3543],{},"Enable AI-generated audio/music.",[2042,3545,3546,3550,3553,3555,3558],{},[2057,3547,3548],{},[28,3549,2896],{},[2057,3551,3552],{},"array",[2057,3554,3426],{},[2057,3556,3557],{},"≤9 images",[2057,3559,3560],{},"Reference images. Use @Image1, @Image2... in prompt.",[2042,3562,3563,3568,3570,3572,3575],{},[2057,3564,3565],{},[28,3566,3567],{},"video_urls",[2057,3569,3552],{},[2057,3571,3426],{},[2057,3573,3574],{},"≤3 videos",[2057,3576,3577],{},"Reference videos. Use @Video1, @Video2... in prompt.",[2042,3579,3580,3585,3587,3589,3592],{},[2057,3581,3582],{},[28,3583,3584],{},"audio_urls",[2057,3586,3552],{},[2057,3588,3426],{},[2057,3590,3591],{},"≤3 audio files",[2057,3593,3594],{},"Reference audio. Use @Audio1, @Audio2... in prompt.",[2042,3596,3597,3602,3604,3606,3609],{},[2057,3598,3599],{},[28,3600,3601],{},"callback_url",[2057,3603,3423],{},[2057,3605,3426],{},[2057,3607,3608],{},"HTTPS URL",[2057,3610,3611],{},"Webhook for completion notification.",[18,3613,3614],{},[11,3615,3616,3619,3620,2959,3622,3624,3625,400,3627,3629,3630,2951,3632,3634,3635,3638],{},[23,3617,3618],{},"Seedance 2.0 vs 1.5 Note:"," All parameters above work with both ",[28,3621,1751],{},[28,3623,30],{},". The key difference: ",[28,3626,3567],{},[28,3628,3584],{},", and multi-image references (",[28,3631,2918],{},[28,3633,2954],{},") are 2.0-only features. If you use them with 1.5, the API returns a ",[28,3636,3637],{},"400"," error with a clear message indicating the feature isn't supported.",[92,3640,3642],{"id":3641},"quick-examples","Quick Examples",[11,3644,3645],{},[23,3646,3647],{},"Vertical video for social media (TikTok/Reels):",[11,3649,3650],{},[2619,3651,2621],{},[136,3653,3655],{"className":338,"code":3654,"language":340,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"A barista pours latte art in slow motion. Close-up overhead shot.\",\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"9:16\",       # Vertical for mobile\n    \"generate_audio\": True\n}\n",[28,3656,3657,3666,3677,3689,3701,3713,3729,3739],{"__ignoreMap":141},[145,3658,3659,3662,3664],{"class":147,"line":148},[145,3660,3661],{"class":262},"payload ",[145,3663,266],{"class":258},[145,3665,428],{"class":262},[145,3667,3668,3671,3673,3675],{"class":147,"line":166},[145,3669,3670],{"class":159},"    \"model\"",[145,3672,437],{"class":262},[145,3674,1308],{"class":159},[145,3676,452],{"class":262},[145,3678,3679,3682,3684,3687],{"class":147,"line":178},[145,3680,3681],{"class":159},"    \"prompt\"",[145,3683,437],{"class":262},[145,3685,3686],{"class":159},"\"A barista pours latte art in slow motion. Close-up overhead shot.\"",[145,3688,452],{"class":262},[145,3690,3691,3694,3696,3699],{"class":147,"line":187},[145,3692,3693],{"class":159},"    \"duration\"",[145,3695,437],{"class":262},[145,3697,3698],{"class":155},"8",[145,3700,452],{"class":262},[145,3702,3703,3706,3708,3711],{"class":147,"line":373},[145,3704,3705],{"class":159},"    \"quality\"",[145,3707,437],{"class":262},[145,3709,3710],{"class":159},"\"1080p\"",[145,3712,452],{"class":262},[145,3714,3715,3718,3720,3723,3726],{"class":147,"line":379},[145,3716,3717],{"class":159},"    \"aspect_ratio\"",[145,3719,437],{"class":262},[145,3721,3722],{"class":159},"\"9:16\"",[145,3724,3725],{"class":262},",       ",[145,3727,3728],{"class":174},"# Vertical for mobile\n",[145,3730,3731,3734,3736],{"class":147,"line":385},[145,3732,3733],{"class":159},"    \"generate_audio\"",[145,3735,437],{"class":262},[145,3737,3738],{"class":155},"True\n",[145,3740,3741],{"class":147,"line":409},[145,3742,469],{"class":262},[11,3744,2176,3745,3747,3748,3750],{},[28,3746,1810],{}," aspect ratio generates a 1080×1920 video — native resolution for TikTok, Instagram Reels, and YouTube Shorts. The ",[28,3749,1794],{}," quality tier ensures crisp visuals on mobile screens.",[11,3752,3753],{},[23,3754,3755],{},"Cinematic widescreen with camera movement:",[136,3757,3759],{"className":338,"code":3758,"language":340,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"Aerial drone shot over a misty mountain range at sunrise. \"\n        \"Camera slowly pushes forward, revealing a hidden valley. \"\n        \"Cinematic color grading, volumetric lighting.\"\n    ),\n    \"duration\": 10,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"21:9\",       # Ultra-widescreen cinematic\n    \"generate_audio\": True\n}\n",[28,3760,3761,3769,3779,3785,3790,3795,3800,3805,3815,3825,3839,3847],{"__ignoreMap":141},[145,3762,3763,3765,3767],{"class":147,"line":148},[145,3764,3661],{"class":262},[145,3766,266],{"class":258},[145,3768,428],{"class":262},[145,3770,3771,3773,3775,3777],{"class":147,"line":166},[145,3772,3670],{"class":159},[145,3774,437],{"class":262},[145,3776,1308],{"class":159},[145,3778,452],{"class":262},[145,3780,3781,3783],{"class":147,"line":178},[145,3782,3681],{"class":159},[145,3784,1322],{"class":262},[145,3786,3787],{"class":147,"line":187},[145,3788,3789],{"class":159},"        \"Aerial drone shot over a misty mountain range at sunrise. \"\n",[145,3791,3792],{"class":147,"line":373},[145,3793,3794],{"class":159},"        \"Camera slowly pushes forward, revealing a hidden valley. \"\n",[145,3796,3797],{"class":147,"line":379},[145,3798,3799],{"class":159},"        \"Cinematic color grading, volumetric lighting.\"\n",[145,3801,3802],{"class":147,"line":385},[145,3803,3804],{"class":262},"    ),\n",[145,3806,3807,3809,3811,3813],{"class":147,"line":409},[145,3808,3693],{"class":159},[145,3810,437],{"class":262},[145,3812,537],{"class":155},[145,3814,452],{"class":262},[145,3816,3817,3819,3821,3823],{"class":147,"line":420},[145,3818,3705],{"class":159},[145,3820,437],{"class":262},[145,3822,3710],{"class":159},[145,3824,452],{"class":262},[145,3826,3827,3829,3831,3834,3836],{"class":147,"line":431},[145,3828,3717],{"class":159},[145,3830,437],{"class":262},[145,3832,3833],{"class":159},"\"21:9\"",[145,3835,3725],{"class":262},[145,3837,3838],{"class":174},"# Ultra-widescreen cinematic\n",[145,3840,3841,3843,3845],{"class":147,"line":455},[145,3842,3733],{"class":159},[145,3844,437],{"class":262},[145,3846,3738],{"class":155},[145,3848,3849],{"class":147,"line":466},[145,3850,469],{"class":262},[11,3852,3853,3854,493],{},"For programmatic camera control — dolly zooms, orbital shots, and Hitchcock-style movements — see the ",[37,3855,3857],{"href":3856},"/blog/seedance-2-camera-movement-api","Camera Movement API Guide",[11,3859,3860],{},[23,3861,3862],{},"Silent video for a website background:",[136,3864,3866],{"className":338,"code":3865,"language":340,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"Abstract flowing particles in deep blue and gold. Slow, meditative movement.\",\n    \"duration\": 15,               # Max duration for seamless loops\n    \"quality\": \"720p\",\n    \"aspect_ratio\": \"21:9\",       # Wide background\n    \"generate_audio\": False       # No audio for autoplay backgrounds\n}\n",[28,3867,3868,3876,3886,3897,3912,3922,3935,3947],{"__ignoreMap":141},[145,3869,3870,3872,3874],{"class":147,"line":148},[145,3871,3661],{"class":262},[145,3873,266],{"class":258},[145,3875,428],{"class":262},[145,3877,3878,3880,3882,3884],{"class":147,"line":166},[145,3879,3670],{"class":159},[145,3881,437],{"class":262},[145,3883,1308],{"class":159},[145,3885,452],{"class":262},[145,3887,3888,3890,3892,3895],{"class":147,"line":178},[145,3889,3681],{"class":159},[145,3891,437],{"class":262},[145,3893,3894],{"class":159},"\"Abstract flowing particles in deep blue and gold. Slow, meditative movement.\"",[145,3896,452],{"class":262},[145,3898,3899,3901,3903,3906,3909],{"class":147,"line":187},[145,3900,3693],{"class":159},[145,3902,437],{"class":262},[145,3904,3905],{"class":155},"15",[145,3907,3908],{"class":262},",               ",[145,3910,3911],{"class":174},"# Max duration for seamless loops\n",[145,3913,3914,3916,3918,3920],{"class":147,"line":373},[145,3915,3705],{"class":159},[145,3917,437],{"class":262},[145,3919,1368],{"class":159},[145,3921,452],{"class":262},[145,3923,3924,3926,3928,3930,3932],{"class":147,"line":379},[145,3925,3717],{"class":159},[145,3927,437],{"class":262},[145,3929,3833],{"class":159},[145,3931,3725],{"class":262},[145,3933,3934],{"class":174},"# Wide background\n",[145,3936,3937,3939,3941,3944],{"class":147,"line":385},[145,3938,3733],{"class":159},[145,3940,437],{"class":262},[145,3942,3943],{"class":155},"False",[145,3945,3946],{"class":174},"       # No audio for autoplay backgrounds\n",[145,3948,3949],{"class":147,"line":409},[145,3950,469],{"class":262},[11,3952,3953],{},[23,3954,3955],{},"Budget-friendly draft (fast iteration):",[136,3957,3959],{"className":338,"code":3958,"language":340,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"A cat wearing sunglasses sits at a DJ booth. Neon club lighting.\",\n    \"duration\": 4,                # Minimum duration = fastest generation\n    \"quality\": \"480p\",            # Lowest quality = cheapest credits\n    \"aspect_ratio\": \"16:9\"\n}\n",[28,3960,3961,3969,3979,3990,4005,4019,4027],{"__ignoreMap":141},[145,3962,3963,3965,3967],{"class":147,"line":148},[145,3964,3661],{"class":262},[145,3966,266],{"class":258},[145,3968,428],{"class":262},[145,3970,3971,3973,3975,3977],{"class":147,"line":166},[145,3972,3670],{"class":159},[145,3974,437],{"class":262},[145,3976,1308],{"class":159},[145,3978,452],{"class":262},[145,3980,3981,3983,3985,3988],{"class":147,"line":178},[145,3982,3681],{"class":159},[145,3984,437],{"class":262},[145,3986,3987],{"class":159},"\"A cat wearing sunglasses sits at a DJ booth. Neon club lighting.\"",[145,3989,452],{"class":262},[145,3991,3992,3994,3996,3999,4002],{"class":147,"line":187},[145,3993,3693],{"class":159},[145,3995,437],{"class":262},[145,3997,3998],{"class":155},"4",[145,4000,4001],{"class":262},",                ",[145,4003,4004],{"class":174},"# Minimum duration = fastest generation\n",[145,4006,4007,4009,4011,4014,4016],{"class":147,"line":373},[145,4008,3705],{"class":159},[145,4010,437],{"class":262},[145,4012,4013],{"class":159},"\"480p\"",[145,4015,1387],{"class":262},[145,4017,4018],{"class":174},"# Lowest quality = cheapest credits\n",[145,4020,4021,4023,4025],{"class":147,"line":379},[145,4022,3717],{"class":159},[145,4024,437],{"class":262},[145,4026,2730],{"class":159},[145,4028,4029],{"class":147,"line":385},[145,4030,469],{"class":262},[18,4032,4033],{},[11,4034,4035,4037,4038,2959,4041,4044,4045,4047],{},[23,4036,133],{}," During development, always use ",[28,4039,4040],{},"duration: 4",[28,4042,4043],{},"quality: \"480p\"",". This is the cheapest and fastest combination — ideal for iterating on prompts. Once you're happy with the content, render the final version at ",[28,4046,1794],{}," with your desired duration.",[92,4049,4051],{"id":4050},"credit-cost-estimation","Credit Cost Estimation",[11,4053,4054],{},"Credits scale with duration and quality. Here's a rough guide:",[2036,4056,4057,4076],{},[2039,4058,4059],{},[2042,4060,4061,4064,4067,4070,4073],{},[2045,4062,4063],{},"Quality",[2045,4065,4066],{},"4s",[2045,4068,4069],{},"5s",[2045,4071,4072],{},"10s",[2045,4074,4075],{},"15s",[2052,4077,4078,4094,4110],{},[2042,4079,4080,4082,4085,4088,4091],{},[2057,4081,1790],{},[2057,4083,4084],{},"~8",[2057,4086,4087],{},"~10",[2057,4089,4090],{},"~20",[2057,4092,4093],{},"~30",[2042,4095,4096,4098,4101,4104,4107],{},[2057,4097,1786],{},[2057,4099,4100],{},"~14",[2057,4102,4103],{},"~18",[2057,4105,4106],{},"~36",[2057,4108,4109],{},"~53",[2042,4111,4112,4114,4117,4120,4123],{},[2057,4113,1794],{},[2057,4115,4116],{},"~22",[2057,4118,4119],{},"~28",[2057,4121,4122],{},"~55",[2057,4124,4125],{},"~83",[11,4127,4128],{},[2619,4129,4130,4131,4133,4134,4138],{},"Approximate credits. Actual costs shown in ",[28,4132,2115],{}," field. Check the ",[37,4135,4137],{"href":211,"rel":4136},[41],"EvoLink dashboard"," for current rates.",[11,4140,4141,4142,400,4145,400,4147,4149,4150,4153,4154,493],{},"The multimodal reference system — ",[28,4143,4144],{},"@Image",[28,4146,2958],{},[28,4148,2962],{}," tags — is where Seedance 2.0 truly shines. You can replicate ",[37,4151,4152],{"href":3856},"camera movements"," from reference videos, maintain character consistency across shots, and sync to audio beats. For a complete guide, read ",[37,4155,4156],{"href":2966},"The Ultimate Guide to @Tags",[45,4158],{},[48,4160,4162],{"id":4161},"handle-errors-gracefully","Handle Errors Gracefully",[11,4164,4165],{},"API calls fail. Networks drop. Rate limits hit. Here's how to build resilient code that handles every real error scenario.",[92,4167,4169],{"id":4168},"common-error-responses","Common Error Responses",[11,4171,4172],{},"Every error follows the same format:",[136,4174,4176],{"className":1856,"code":4175,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"description of what went wrong\",\n    \"type\": \"error_category\",\n    \"code\": \"specific_error_code\"\n  }\n}\n",[28,4177,4178,4182,4189,4201,4213,4223,4227],{"__ignoreMap":141},[145,4179,4180],{"class":147,"line":148},[145,4181,1865],{"class":262},[145,4183,4184,4187],{"class":147,"line":166},[145,4185,4186],{"class":155},"  \"error\"",[145,4188,1943],{"class":262},[145,4190,4191,4194,4196,4199],{"class":147,"line":178},[145,4192,4193],{"class":155},"    \"message\"",[145,4195,437],{"class":262},[145,4197,4198],{"class":159},"\"description of what went wrong\"",[145,4200,452],{"class":262},[145,4202,4203,4206,4208,4211],{"class":147,"line":187},[145,4204,4205],{"class":155},"    \"type\"",[145,4207,437],{"class":262},[145,4209,4210],{"class":159},"\"error_category\"",[145,4212,452],{"class":262},[145,4214,4215,4218,4220],{"class":147,"line":373},[145,4216,4217],{"class":155},"    \"code\"",[145,4219,437],{"class":262},[145,4221,4222],{"class":159},"\"specific_error_code\"\n",[145,4224,4225],{"class":147,"line":379},[145,4226,2027],{"class":262},[145,4228,4229],{"class":147,"line":385},[145,4230,469],{"class":262},[11,4232,2176,4233,4236,4237,2959,4240,4243,4244,4246,4247,4249,4250,4252],{},[28,4234,4235],{},"error"," object always contains ",[28,4238,4239],{},"message",[28,4241,4242],{},"type",". The ",[28,4245,28],{}," field is present for most errors but not all. Always check ",[28,4248,4242],{}," first, then ",[28,4251,28],{}," for specifics.",[11,4254,4255],{},"Here are real error responses from the API:",[11,4257,4258],{},[23,4259,4260],{},"401 — Invalid API Key:",[136,4262,4264],{"className":1856,"code":4263,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Invalid token (request id: 20260227225245660301729AApJNAhJ)\",\n    \"type\": \"evo_api_error\"\n  }\n}\n",[28,4265,4266,4270,4276,4287,4296,4300],{"__ignoreMap":141},[145,4267,4268],{"class":147,"line":148},[145,4269,1865],{"class":262},[145,4271,4272,4274],{"class":147,"line":166},[145,4273,4186],{"class":155},[145,4275,1943],{"class":262},[145,4277,4278,4280,4282,4285],{"class":147,"line":178},[145,4279,4193],{"class":155},[145,4281,437],{"class":262},[145,4283,4284],{"class":159},"\"Invalid token (request id: 20260227225245660301729AApJNAhJ)\"",[145,4286,452],{"class":262},[145,4288,4289,4291,4293],{"class":147,"line":187},[145,4290,4205],{"class":155},[145,4292,437],{"class":262},[145,4294,4295],{"class":159},"\"evo_api_error\"\n",[145,4297,4298],{"class":147,"line":373},[145,4299,2027],{"class":262},[145,4301,4302],{"class":147,"line":379},[145,4303,469],{"class":262},[11,4305,4306,4307,4309],{},"This means your API key is wrong, expired, or was revoked. Double-check the ",[28,4308,275],{}," environment variable. A common cause: copying the key with trailing whitespace.",[11,4311,4312],{},[23,4313,4314],{},"400 — Missing Required Field:",[136,4316,4318],{"className":1856,"code":4317,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"code\": \"invalid_parameter\",\n    \"message\": \"prompt cannot be empty\",\n    \"type\": \"invalid_request_error\"\n  }\n}\n",[28,4319,4320,4324,4330,4341,4352,4361,4365],{"__ignoreMap":141},[145,4321,4322],{"class":147,"line":148},[145,4323,1865],{"class":262},[145,4325,4326,4328],{"class":147,"line":166},[145,4327,4186],{"class":155},[145,4329,1943],{"class":262},[145,4331,4332,4334,4336,4339],{"class":147,"line":178},[145,4333,4217],{"class":155},[145,4335,437],{"class":262},[145,4337,4338],{"class":159},"\"invalid_parameter\"",[145,4340,452],{"class":262},[145,4342,4343,4345,4347,4350],{"class":147,"line":187},[145,4344,4193],{"class":155},[145,4346,437],{"class":262},[145,4348,4349],{"class":159},"\"prompt cannot be empty\"",[145,4351,452],{"class":262},[145,4353,4354,4356,4358],{"class":147,"line":373},[145,4355,4205],{"class":155},[145,4357,437],{"class":262},[145,4359,4360],{"class":159},"\"invalid_request_error\"\n",[145,4362,4363],{"class":147,"line":379},[145,4364,2027],{"class":262},[145,4366,4367],{"class":147,"line":385},[145,4368,469],{"class":262},[11,4370,2176,4371,4373],{},[28,4372,1762],{}," field is required for all generation requests. This also triggers if you pass an empty string or whitespace-only prompt.",[11,4375,4376],{},[23,4377,4378],{},"400 — Invalid Parameter Value:",[136,4380,4382],{"className":1856,"code":4381,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"code\": \"invalid_parameter\",\n    \"message\": \"duration must be between 4 and 15\",\n    \"type\": \"invalid_request_error\"\n  }\n}\n",[28,4383,4384,4388,4394,4404,4415,4423,4427],{"__ignoreMap":141},[145,4385,4386],{"class":147,"line":148},[145,4387,1865],{"class":262},[145,4389,4390,4392],{"class":147,"line":166},[145,4391,4186],{"class":155},[145,4393,1943],{"class":262},[145,4395,4396,4398,4400,4402],{"class":147,"line":178},[145,4397,4217],{"class":155},[145,4399,437],{"class":262},[145,4401,4338],{"class":159},[145,4403,452],{"class":262},[145,4405,4406,4408,4410,4413],{"class":147,"line":187},[145,4407,4193],{"class":155},[145,4409,437],{"class":262},[145,4411,4412],{"class":159},"\"duration must be between 4 and 15\"",[145,4414,452],{"class":262},[145,4416,4417,4419,4421],{"class":147,"line":373},[145,4418,4205],{"class":155},[145,4420,437],{"class":262},[145,4422,4360],{"class":159},[145,4424,4425],{"class":147,"line":379},[145,4426,2027],{"class":262},[145,4428,4429],{"class":147,"line":385},[145,4430,469],{"class":262},[11,4432,4433,4434,280,4437,4440],{},"Happens when you pass ",[28,4435,4436],{},"duration: 3",[28,4438,4439],{},"duration: 20",". The valid range is 4–15 seconds inclusive.",[11,4442,4443],{},[23,4444,4445],{},"400 — Unsupported Quality Tier:",[136,4447,4449],{"className":1856,"code":4448,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"code\": \"invalid_parameter\",\n    \"message\": \"quality must be one of: 480p, 720p, 1080p\",\n    \"type\": \"invalid_request_error\"\n  }\n}\n",[28,4450,4451,4455,4461,4471,4482,4490,4494],{"__ignoreMap":141},[145,4452,4453],{"class":147,"line":148},[145,4454,1865],{"class":262},[145,4456,4457,4459],{"class":147,"line":166},[145,4458,4186],{"class":155},[145,4460,1943],{"class":262},[145,4462,4463,4465,4467,4469],{"class":147,"line":178},[145,4464,4217],{"class":155},[145,4466,437],{"class":262},[145,4468,4338],{"class":159},[145,4470,452],{"class":262},[145,4472,4473,4475,4477,4480],{"class":147,"line":187},[145,4474,4193],{"class":155},[145,4476,437],{"class":262},[145,4478,4479],{"class":159},"\"quality must be one of: 480p, 720p, 1080p\"",[145,4481,452],{"class":262},[145,4483,4484,4486,4488],{"class":147,"line":373},[145,4485,4205],{"class":155},[145,4487,437],{"class":262},[145,4489,4360],{"class":159},[145,4491,4492],{"class":147,"line":379},[145,4493,2027],{"class":262},[145,4495,4496],{"class":147,"line":385},[145,4497,469],{"class":262},[11,4499,4500,4501,280,4504,4507,4508,400,4510,4512,4513,493],{},"Common when passing ",[28,4502,4503],{},"\"quality\": \"4k\"",[28,4505,4506],{},"\"quality\": \"hd\"",". Use the exact strings: ",[28,4509,1790],{},[28,4511,1786],{},", or ",[28,4514,1794],{},[11,4516,4517],{},[23,4518,4519],{},"402 — Insufficient Credits:",[136,4521,4523],{"className":1856,"code":4522,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Insufficient credits. Required: 17.784, Available: 2.100\",\n    \"type\": \"insufficient_quota_error\"\n  }\n}\n",[28,4524,4525,4529,4535,4546,4555,4559],{"__ignoreMap":141},[145,4526,4527],{"class":147,"line":148},[145,4528,1865],{"class":262},[145,4530,4531,4533],{"class":147,"line":166},[145,4532,4186],{"class":155},[145,4534,1943],{"class":262},[145,4536,4537,4539,4541,4544],{"class":147,"line":178},[145,4538,4193],{"class":155},[145,4540,437],{"class":262},[145,4542,4543],{"class":159},"\"Insufficient credits. Required: 17.784, Available: 2.100\"",[145,4545,452],{"class":262},[145,4547,4548,4550,4552],{"class":147,"line":187},[145,4549,4205],{"class":155},[145,4551,437],{"class":262},[145,4553,4554],{"class":159},"\"insufficient_quota_error\"\n",[145,4556,4557],{"class":147,"line":373},[145,4558,2027],{"class":262},[145,4560,4561],{"class":147,"line":379},[145,4562,469],{"class":262},[11,4564,4565,4566,493],{},"Your account doesn't have enough credits. The message tells you exactly how many you need vs. how many you have. Top up at the ",[37,4567,4137],{"href":211,"rel":4568},[41],[11,4570,4571],{},[23,4572,4573],{},"404 — Task Not Found:",[136,4575,4577],{"className":1856,"code":4576,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Task not found\",\n    \"type\": \"invalid_request_error\",\n    \"code\": \"task_not_found\"\n  }\n}\n",[28,4578,4579,4583,4589,4600,4611,4620,4624],{"__ignoreMap":141},[145,4580,4581],{"class":147,"line":148},[145,4582,1865],{"class":262},[145,4584,4585,4587],{"class":147,"line":166},[145,4586,4186],{"class":155},[145,4588,1943],{"class":262},[145,4590,4591,4593,4595,4598],{"class":147,"line":178},[145,4592,4193],{"class":155},[145,4594,437],{"class":262},[145,4596,4597],{"class":159},"\"Task not found\"",[145,4599,452],{"class":262},[145,4601,4602,4604,4606,4609],{"class":147,"line":187},[145,4603,4205],{"class":155},[145,4605,437],{"class":262},[145,4607,4608],{"class":159},"\"invalid_request_error\"",[145,4610,452],{"class":262},[145,4612,4613,4615,4617],{"class":147,"line":373},[145,4614,4217],{"class":155},[145,4616,437],{"class":262},[145,4618,4619],{"class":159},"\"task_not_found\"\n",[145,4621,4622],{"class":147,"line":379},[145,4623,2027],{"class":262},[145,4625,4626],{"class":147,"line":385},[145,4627,469],{"class":262},[11,4629,4630,4631,4633],{},"Usually means the task ID is wrong, or the task was created more than 24 hours ago (tasks expire). Double-check you're using the ",[28,4632,2061],{}," field from the creation response, not some other field.",[11,4635,4636],{},[23,4637,4638],{},"413 — Image Too Large:",[136,4640,4642],{"className":1856,"code":4641,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Image file size exceeds 30MB limit\",\n    \"type\": \"request_too_large_error\"\n  }\n}\n",[28,4643,4644,4648,4654,4665,4674,4678],{"__ignoreMap":141},[145,4645,4646],{"class":147,"line":148},[145,4647,1865],{"class":262},[145,4649,4650,4652],{"class":147,"line":166},[145,4651,4186],{"class":155},[145,4653,1943],{"class":262},[145,4655,4656,4658,4660,4663],{"class":147,"line":178},[145,4657,4193],{"class":155},[145,4659,437],{"class":262},[145,4661,4662],{"class":159},"\"Image file size exceeds 30MB limit\"",[145,4664,452],{"class":262},[145,4666,4667,4669,4671],{"class":147,"line":187},[145,4668,4205],{"class":155},[145,4670,437],{"class":262},[145,4672,4673],{"class":159},"\"request_too_large_error\"\n",[145,4675,4676],{"class":147,"line":373},[145,4677,2027],{"class":262},[145,4679,4680],{"class":147,"line":379},[145,4681,469],{"class":262},[11,4683,4684],{},"Compress your image before uploading. For the API, visual quality above 2–3 MB rarely improves results.",[11,4686,4687],{},[23,4688,4689],{},"429 — Rate Limited:",[136,4691,4693],{"className":1856,"code":4692,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Rate limit exceeded. Please retry after 60 seconds.\",\n    \"type\": \"rate_limit_error\"\n  }\n}\n",[28,4694,4695,4699,4705,4716,4725,4729],{"__ignoreMap":141},[145,4696,4697],{"class":147,"line":148},[145,4698,1865],{"class":262},[145,4700,4701,4703],{"class":147,"line":166},[145,4702,4186],{"class":155},[145,4704,1943],{"class":262},[145,4706,4707,4709,4711,4714],{"class":147,"line":178},[145,4708,4193],{"class":155},[145,4710,437],{"class":262},[145,4712,4713],{"class":159},"\"Rate limit exceeded. Please retry after 60 seconds.\"",[145,4715,452],{"class":262},[145,4717,4718,4720,4722],{"class":147,"line":187},[145,4719,4205],{"class":155},[145,4721,437],{"class":262},[145,4723,4724],{"class":159},"\"rate_limit_error\"\n",[145,4726,4727],{"class":147,"line":373},[145,4728,2027],{"class":262},[145,4730,4731],{"class":147,"line":379},[145,4732,469],{"class":262},[11,4734,4735],{},"You're sending too many requests. The default limit is generous for development, but batch scripts can hit it. Implement exponential backoff (see below).",[11,4737,4738],{},[23,4739,4740],{},"422 — Content Moderation Rejection:",[136,4742,4744],{"className":1856,"code":4743,"language":1858,"meta":141,"style":141},"{\n  \"error\": {\n    \"message\": \"Content rejected by safety filter\",\n    \"type\": \"content_policy_violation\",\n    \"code\": \"content_filtered\"\n  }\n}\n",[28,4745,4746,4750,4756,4767,4778,4787,4791],{"__ignoreMap":141},[145,4747,4748],{"class":147,"line":148},[145,4749,1865],{"class":262},[145,4751,4752,4754],{"class":147,"line":166},[145,4753,4186],{"class":155},[145,4755,1943],{"class":262},[145,4757,4758,4760,4762,4765],{"class":147,"line":178},[145,4759,4193],{"class":155},[145,4761,437],{"class":262},[145,4763,4764],{"class":159},"\"Content rejected by safety filter\"",[145,4766,452],{"class":262},[145,4768,4769,4771,4773,4776],{"class":147,"line":187},[145,4770,4205],{"class":155},[145,4772,437],{"class":262},[145,4774,4775],{"class":159},"\"content_policy_violation\"",[145,4777,452],{"class":262},[145,4779,4780,4782,4784],{"class":147,"line":373},[145,4781,4217],{"class":155},[145,4783,437],{"class":262},[145,4785,4786],{"class":159},"\"content_filtered\"\n",[145,4788,4789],{"class":147,"line":379},[145,4790,2027],{"class":262},[145,4792,4793],{"class":147,"line":385},[145,4794,469],{"class":262},[11,4796,4797,4798,4800],{},"Your prompt or input images triggered the content moderation system. Rephrase your prompt to avoid restricted content. Realistic human faces in ",[28,4799,2896],{}," are automatically rejected.",[92,4802,4804],{"id":4803},"error-reference-table","Error Reference Table",[2036,4806,4807,4824],{},[2039,4808,4809],{},[2042,4810,4811,4814,4816,4818,4821],{},[2045,4812,4813],{},"HTTP Code",[2045,4815,3403],{},[2045,4817,2050],{},[2045,4819,4820],{},"Retryable?",[2045,4822,4823],{},"Action",[2052,4825,4826,4844,4862,4880,4898,4916,4934,4955,4975,4995],{},[2042,4827,4828,4830,4835,4838,4841],{},[2057,4829,3637],{},[2057,4831,4832],{},[28,4833,4834],{},"invalid_request_error",[2057,4836,4837],{},"Bad parameters",[2057,4839,4840],{},"No",[2057,4842,4843],{},"Fix your payload",[2042,4845,4846,4849,4854,4857,4859],{},[2057,4847,4848],{},"401",[2057,4850,4851],{},[28,4852,4853],{},"authentication_error",[2057,4855,4856],{},"Invalid API key",[2057,4858,4840],{},[2057,4860,4861],{},"Verify your key",[2042,4863,4864,4867,4872,4875,4877],{},[2057,4865,4866],{},"402",[2057,4868,4869],{},[28,4870,4871],{},"insufficient_quota_error",[2057,4873,4874],{},"Out of credits",[2057,4876,4840],{},[2057,4878,4879],{},"Top up your account",[2042,4881,4882,4885,4890,4893,4895],{},[2057,4883,4884],{},"404",[2057,4886,4887],{},[28,4888,4889],{},"not_found_error",[2057,4891,4892],{},"Task or model not found",[2057,4894,4840],{},[2057,4896,4897],{},"Check task_id / model name",[2042,4899,4900,4903,4908,4911,4913],{},[2057,4901,4902],{},"413",[2057,4904,4905],{},[28,4906,4907],{},"request_too_large_error",[2057,4909,4910],{},"Payload too big",[2057,4912,4840],{},[2057,4914,4915],{},"Reduce file sizes",[2042,4917,4918,4921,4926,4929,4931],{},[2057,4919,4920],{},"422",[2057,4922,4923],{},[28,4924,4925],{},"content_policy_violation",[2057,4927,4928],{},"Content filtered",[2057,4930,4840],{},[2057,4932,4933],{},"Rephrase prompt",[2042,4935,4936,4939,4944,4947,4952],{},[2057,4937,4938],{},"429",[2057,4940,4941],{},[28,4942,4943],{},"rate_limit_error",[2057,4945,4946],{},"Too many requests",[2057,4948,4949],{},[23,4950,4951],{},"Yes",[2057,4953,4954],{},"Wait 60s, retry",[2042,4956,4957,4960,4965,4968,4972],{},[2057,4958,4959],{},"500",[2057,4961,4962],{},[28,4963,4964],{},"internal_server_error",[2057,4966,4967],{},"Server issue",[2057,4969,4970],{},[23,4971,4951],{},[2057,4973,4974],{},"Retry after a few seconds",[2042,4976,4977,4980,4985,4988,4992],{},[2057,4978,4979],{},"502",[2057,4981,4982],{},[28,4983,4984],{},"bad_gateway",[2057,4986,4987],{},"Upstream error",[2057,4989,4990],{},[23,4991,4951],{},[2057,4993,4994],{},"Retry after 5s",[2042,4996,4997,5000,5005,5008,5012],{},[2057,4998,4999],{},"503",[2057,5001,5002],{},[28,5003,5004],{},"service_unavailable_error",[2057,5006,5007],{},"Service down",[2057,5009,5010],{},[23,5011,4951],{},[2057,5013,5014],{},"Retry after 30s",[92,5016,5018],{"id":5017},"production-ready-error-handling","Production-Ready Error Handling",[11,5020,5021],{},"Wrap your API calls with retry logic for transient errors:",[11,5023,5024],{},[2619,5025,2621],{},[136,5027,5029],{"className":338,"code":5028,"language":340,"meta":141,"style":141},"import random\n\ndef generate_video_with_retry(payload, max_retries=3):\n    \"\"\"\n    Submit a video generation request with automatic retry\n    for transient errors (429, 500, 502, 503).\n    \n    Uses exponential backoff with jitter to avoid thundering herd:\n    - Attempt 1: wait ~1s\n    - Attempt 2: wait ~2s  \n    - Attempt 3: wait ~4s\n    \n    Non-retryable errors (400, 401, 402, 404, 413, 422) fail immediately\n    because retrying won't fix the underlying problem.\n    \"\"\"\n    for attempt in range(max_retries):\n        try:\n            response = requests.post(\n                f\"{BASE_URL}/videos/generations\",\n                headers=HEADERS,\n                json=payload,\n                timeout=30       # 30s connection timeout\n            )\n\n            # Success — return the task object\n            if response.status_code == 200:\n                return response.json()\n\n            # Parse the error response\n            error = response.json().get(\"error\", {})\n            error_type = error.get(\"type\", \"\")\n            error_msg = error.get(\"message\", \"Unknown error\")\n\n            # Non-retryable errors — fail immediately\n            if response.status_code in (400, 401, 402, 404, 413, 422):\n                raise ValueError(\n                    f\"API error {response.status_code}: {error_msg}\"\n                )\n\n            # Retryable errors — exponential backoff with jitter\n            if response.status_code in (429, 500, 502, 503):\n                wait = (2 ** attempt) + random.uniform(0, 1)\n                print(f\"  Retry {attempt + 1}/{max_retries} \"\n                      f\"after {wait:.1f}s ({error_type}: {error_msg})\")\n                time.sleep(wait)\n                continue\n\n        except requests.exceptions.Timeout:\n            # Server didn't respond within 30 seconds\n            wait = (2 ** attempt) + random.uniform(0, 1)\n            print(f\"  Timeout. Retry {attempt + 1}/{max_retries} \"\n                  f\"after {wait:.1f}s\")\n            time.sleep(wait)\n            continue\n\n        except requests.exceptions.ConnectionError as e:\n            # DNS failure, refused connection, etc.\n            wait = (2 ** attempt) + random.uniform(0, 1)\n            print(f\"  Connection error: {e}. Retry {attempt + 1}/{max_retries} \"\n                  f\"after {wait:.1f}s\")\n            time.sleep(wait)\n            continue\n\n    raise RuntimeError(f\"Failed after {max_retries} retries\")\n",[28,5030,5031,5038,5042,5059,5063,5068,5073,5077,5082,5087,5092,5097,5101,5106,5111,5115,5131,5138,5147,5159,5170,5180,5193,5197,5201,5206,5219,5226,5230,5235,5249,5269,5288,5292,5297,5331,5341,5367,5372,5376,5381,5407,5440,5474,5515,5520,5525,5529,5538,5544,5572,5603,5623,5629,5635,5640,5653,5659,5686,5726,5745,5750,5755,5760],{"__ignoreMap":141},[145,5032,5033,5035],{"class":147,"line":148},[145,5034,347],{"class":258},[145,5036,5037],{"class":262}," random\n",[145,5039,5040],{"class":147,"line":166},[145,5041,376],{"emptyLinePlaceholder":58},[145,5043,5044,5046,5049,5052,5054,5057],{"class":147,"line":178},[145,5045,526],{"class":258},[145,5047,5048],{"class":151}," generate_video_with_retry",[145,5050,5051],{"class":262},"(payload, max_retries",[145,5053,266],{"class":258},[145,5055,5056],{"class":155},"3",[145,5058,548],{"class":262},[145,5060,5061],{"class":147,"line":187},[145,5062,553],{"class":159},[145,5064,5065],{"class":147,"line":373},[145,5066,5067],{"class":159},"    Submit a video generation request with automatic retry\n",[145,5069,5070],{"class":147,"line":379},[145,5071,5072],{"class":159},"    for transient errors (429, 500, 502, 503).\n",[145,5074,5075],{"class":147,"line":385},[145,5076,563],{"class":159},[145,5078,5079],{"class":147,"line":409},[145,5080,5081],{"class":159},"    Uses exponential backoff with jitter to avoid thundering herd:\n",[145,5083,5084],{"class":147,"line":420},[145,5085,5086],{"class":159},"    - Attempt 1: wait ~1s\n",[145,5088,5089],{"class":147,"line":431},[145,5090,5091],{"class":159},"    - Attempt 2: wait ~2s  \n",[145,5093,5094],{"class":147,"line":455},[145,5095,5096],{"class":159},"    - Attempt 3: wait ~4s\n",[145,5098,5099],{"class":147,"line":466},[145,5100,563],{"class":159},[145,5102,5103],{"class":147,"line":600},[145,5104,5105],{"class":159},"    Non-retryable errors (400, 401, 402, 404, 413, 422) fail immediately\n",[145,5107,5108],{"class":147,"line":605},[145,5109,5110],{"class":159},"    because retrying won't fix the underlying problem.\n",[145,5112,5113],{"class":147,"line":611},[145,5114,553],{"class":159},[145,5116,5117,5120,5123,5125,5128],{"class":147,"line":617},[145,5118,5119],{"class":258},"    for",[145,5121,5122],{"class":262}," attempt ",[145,5124,1180],{"class":258},[145,5126,5127],{"class":155}," range",[145,5129,5130],{"class":262},"(max_retries):\n",[145,5132,5133,5136],{"class":147,"line":623},[145,5134,5135],{"class":258},"        try",[145,5137,860],{"class":262},[145,5139,5140,5143,5145],{"class":147,"line":628},[145,5141,5142],{"class":262},"            response ",[145,5144,266],{"class":258},[145,5146,1432],{"class":262},[145,5148,5149,5151,5153,5155,5157],{"class":147,"line":639},[145,5150,918],{"class":258},[145,5152,449],{"class":159},[145,5154,679],{"class":155},[145,5156,1444],{"class":159},[145,5158,452],{"class":262},[145,5160,5161,5164,5166,5168],{"class":147,"line":654},[145,5162,5163],{"class":701},"                headers",[145,5165,266],{"class":258},[145,5167,423],{"class":155},[145,5169,452],{"class":262},[145,5171,5172,5175,5177],{"class":147,"line":660},[145,5173,5174],{"class":701},"                json",[145,5176,266],{"class":258},[145,5178,5179],{"class":262},"payload,\n",[145,5181,5182,5185,5187,5190],{"class":147,"line":671},[145,5183,5184],{"class":701},"                timeout",[145,5186,266],{"class":258},[145,5188,5189],{"class":155},"30",[145,5191,5192],{"class":174},"       # 30s connection timeout\n",[145,5194,5195],{"class":147,"line":698},[145,5196,956],{"class":262},[145,5198,5199],{"class":147,"line":710},[145,5200,376],{"emptyLinePlaceholder":58},[145,5202,5203],{"class":147,"line":716},[145,5204,5205],{"class":174},"            # Success — return the task object\n",[145,5207,5208,5211,5213,5215,5217],{"class":147,"line":722},[145,5209,5210],{"class":258},"            if",[145,5212,2509],{"class":262},[145,5214,854],{"class":258},[145,5216,2514],{"class":155},[145,5218,860],{"class":262},[145,5220,5221,5224],{"class":147,"line":728},[145,5222,5223],{"class":258},"                return",[145,5225,736],{"class":262},[145,5227,5228],{"class":147,"line":739},[145,5229,376],{"emptyLinePlaceholder":58},[145,5231,5232],{"class":147,"line":744},[145,5233,5234],{"class":174},"            # Parse the error response\n",[145,5236,5237,5240,5242,5245,5247],{"class":147,"line":750},[145,5238,5239],{"class":262},"            error ",[145,5241,266],{"class":258},[145,5243,5244],{"class":262}," response.json().get(",[145,5246,897],{"class":159},[145,5248,900],{"class":262},[145,5250,5251,5254,5256,5259,5262,5264,5267],{"class":147,"line":767},[145,5252,5253],{"class":262},"            error_type ",[145,5255,266],{"class":258},[145,5257,5258],{"class":262}," error.get(",[145,5260,5261],{"class":159},"\"type\"",[145,5263,400],{"class":262},[145,5265,5266],{"class":159},"\"\"",[145,5268,406],{"class":262},[145,5270,5271,5274,5276,5278,5281,5283,5286],{"class":147,"line":788},[145,5272,5273],{"class":262},"            error_msg ",[145,5275,266],{"class":258},[145,5277,5258],{"class":262},[145,5279,5280],{"class":159},"\"message\"",[145,5282,400],{"class":262},[145,5284,5285],{"class":159},"\"Unknown error\"",[145,5287,406],{"class":262},[145,5289,5290],{"class":147,"line":834},[145,5291,376],{"emptyLinePlaceholder":58},[145,5293,5294],{"class":147,"line":839},[145,5295,5296],{"class":174},"            # Non-retryable errors — fail immediately\n",[145,5298,5299,5301,5303,5305,5307,5309,5311,5313,5315,5317,5319,5321,5323,5325,5327,5329],{"class":147,"line":845},[145,5300,5210],{"class":258},[145,5302,2509],{"class":262},[145,5304,1180],{"class":258},[145,5306,1218],{"class":262},[145,5308,3637],{"class":155},[145,5310,400],{"class":262},[145,5312,4848],{"class":155},[145,5314,400],{"class":262},[145,5316,4866],{"class":155},[145,5318,400],{"class":262},[145,5320,4884],{"class":155},[145,5322,400],{"class":262},[145,5324,4902],{"class":155},[145,5326,400],{"class":262},[145,5328,4920],{"class":155},[145,5330,548],{"class":262},[145,5332,5333,5336,5339],{"class":147,"line":863},[145,5334,5335],{"class":258},"                raise",[145,5337,5338],{"class":155}," ValueError",[145,5340,912],{"class":262},[145,5342,5343,5346,5349,5351,5354,5356,5358,5360,5363,5365],{"class":147,"line":872},[145,5344,5345],{"class":258},"                    f",[145,5347,5348],{"class":159},"\"API error ",[145,5350,685],{"class":155},[145,5352,5353],{"class":262},"response.status_code",[145,5355,691],{"class":155},[145,5357,437],{"class":159},[145,5359,685],{"class":155},[145,5361,5362],{"class":262},"error_msg",[145,5364,691],{"class":155},[145,5366,950],{"class":159},[145,5368,5369],{"class":147,"line":887},[145,5370,5371],{"class":262},"                )\n",[145,5373,5374],{"class":147,"line":903},[145,5375,376],{"emptyLinePlaceholder":58},[145,5377,5378],{"class":147,"line":915},[145,5379,5380],{"class":174},"            # Retryable errors — exponential backoff with jitter\n",[145,5382,5383,5385,5387,5389,5391,5393,5395,5397,5399,5401,5403,5405],{"class":147,"line":953},[145,5384,5210],{"class":258},[145,5386,2509],{"class":262},[145,5388,1180],{"class":258},[145,5390,1218],{"class":262},[145,5392,4938],{"class":155},[145,5394,400],{"class":262},[145,5396,4959],{"class":155},[145,5398,400],{"class":262},[145,5400,4979],{"class":155},[145,5402,400],{"class":262},[145,5404,4999],{"class":155},[145,5406,548],{"class":262},[145,5408,5409,5412,5414,5416,5419,5422,5425,5428,5431,5433,5435,5438],{"class":147,"line":959},[145,5410,5411],{"class":262},"                wait ",[145,5413,266],{"class":258},[145,5415,1218],{"class":262},[145,5417,5418],{"class":155},"2",[145,5420,5421],{"class":258}," **",[145,5423,5424],{"class":262}," attempt) ",[145,5426,5427],{"class":258},"+",[145,5429,5430],{"class":262}," random.uniform(",[145,5432,783],{"class":155},[145,5434,400],{"class":262},[145,5436,5437],{"class":155},"1",[145,5439,406],{"class":262},[145,5441,5442,5445,5447,5449,5452,5454,5457,5459,5462,5464,5466,5469,5471],{"class":147,"line":964},[145,5443,5444],{"class":155},"                print",[145,5446,794],{"class":262},[145,5448,440],{"class":258},[145,5450,5451],{"class":159},"\"  Retry ",[145,5453,685],{"class":155},[145,5455,5456],{"class":262},"attempt ",[145,5458,5427],{"class":258},[145,5460,5461],{"class":155}," 1}",[145,5463,1226],{"class":159},[145,5465,685],{"class":155},[145,5467,5468],{"class":262},"max_retries",[145,5470,691],{"class":155},[145,5472,5473],{"class":159}," \"\n",[145,5475,5476,5479,5482,5484,5487,5490,5492,5495,5497,5500,5502,5504,5506,5508,5510,5513],{"class":147,"line":970},[145,5477,5478],{"class":258},"                      f",[145,5480,5481],{"class":159},"\"after ",[145,5483,685],{"class":155},[145,5485,5486],{"class":262},"wait",[145,5488,5489],{"class":258},":.1f",[145,5491,691],{"class":155},[145,5493,5494],{"class":159},"s (",[145,5496,685],{"class":155},[145,5498,5499],{"class":262},"error_type",[145,5501,691],{"class":155},[145,5503,437],{"class":159},[145,5505,685],{"class":155},[145,5507,5362],{"class":262},[145,5509,691],{"class":155},[145,5511,5512],{"class":159},")\"",[145,5514,406],{"class":262},[145,5516,5517],{"class":147,"line":976},[145,5518,5519],{"class":262},"                time.sleep(wait)\n",[145,5521,5522],{"class":147,"line":988},[145,5523,5524],{"class":258},"                continue\n",[145,5526,5527],{"class":147,"line":993},[145,5528,376],{"emptyLinePlaceholder":58},[145,5530,5532,5535],{"class":147,"line":5531},48,[145,5533,5534],{"class":258},"        except",[145,5536,5537],{"class":262}," requests.exceptions.Timeout:\n",[145,5539,5541],{"class":147,"line":5540},49,[145,5542,5543],{"class":174},"            # Server didn't respond within 30 seconds\n",[145,5545,5547,5550,5552,5554,5556,5558,5560,5562,5564,5566,5568,5570],{"class":147,"line":5546},50,[145,5548,5549],{"class":262},"            wait ",[145,5551,266],{"class":258},[145,5553,1218],{"class":262},[145,5555,5418],{"class":155},[145,5557,5421],{"class":258},[145,5559,5424],{"class":262},[145,5561,5427],{"class":258},[145,5563,5430],{"class":262},[145,5565,783],{"class":155},[145,5567,400],{"class":262},[145,5569,5437],{"class":155},[145,5571,406],{"class":262},[145,5573,5575,5578,5580,5582,5585,5587,5589,5591,5593,5595,5597,5599,5601],{"class":147,"line":5574},51,[145,5576,5577],{"class":155},"            print",[145,5579,794],{"class":262},[145,5581,440],{"class":258},[145,5583,5584],{"class":159},"\"  Timeout. Retry ",[145,5586,685],{"class":155},[145,5588,5456],{"class":262},[145,5590,5427],{"class":258},[145,5592,5461],{"class":155},[145,5594,1226],{"class":159},[145,5596,685],{"class":155},[145,5598,5468],{"class":262},[145,5600,691],{"class":155},[145,5602,5473],{"class":159},[145,5604,5606,5609,5611,5613,5615,5617,5619,5621],{"class":147,"line":5605},52,[145,5607,5608],{"class":258},"                  f",[145,5610,5481],{"class":159},[145,5612,685],{"class":155},[145,5614,5486],{"class":262},[145,5616,5489],{"class":258},[145,5618,691],{"class":155},[145,5620,1024],{"class":159},[145,5622,406],{"class":262},[145,5624,5626],{"class":147,"line":5625},53,[145,5627,5628],{"class":262},"            time.sleep(wait)\n",[145,5630,5632],{"class":147,"line":5631},54,[145,5633,5634],{"class":258},"            continue\n",[145,5636,5638],{"class":147,"line":5637},55,[145,5639,376],{"emptyLinePlaceholder":58},[145,5641,5643,5645,5648,5650],{"class":147,"line":5642},56,[145,5644,5534],{"class":258},[145,5646,5647],{"class":262}," requests.exceptions.ConnectionError ",[145,5649,1166],{"class":258},[145,5651,5652],{"class":262}," e:\n",[145,5654,5656],{"class":147,"line":5655},57,[145,5657,5658],{"class":174},"            # DNS failure, refused connection, etc.\n",[145,5660,5662,5664,5666,5668,5670,5672,5674,5676,5678,5680,5682,5684],{"class":147,"line":5661},58,[145,5663,5549],{"class":262},[145,5665,266],{"class":258},[145,5667,1218],{"class":262},[145,5669,5418],{"class":155},[145,5671,5421],{"class":258},[145,5673,5424],{"class":262},[145,5675,5427],{"class":258},[145,5677,5430],{"class":262},[145,5679,783],{"class":155},[145,5681,400],{"class":262},[145,5683,5437],{"class":155},[145,5685,406],{"class":262},[145,5687,5689,5691,5693,5695,5698,5700,5703,5705,5708,5710,5712,5714,5716,5718,5720,5722,5724],{"class":147,"line":5688},59,[145,5690,5577],{"class":155},[145,5692,794],{"class":262},[145,5694,440],{"class":258},[145,5696,5697],{"class":159},"\"  Connection error: ",[145,5699,685],{"class":155},[145,5701,5702],{"class":262},"e",[145,5704,691],{"class":155},[145,5706,5707],{"class":159},". Retry ",[145,5709,685],{"class":155},[145,5711,5456],{"class":262},[145,5713,5427],{"class":258},[145,5715,5461],{"class":155},[145,5717,1226],{"class":159},[145,5719,685],{"class":155},[145,5721,5468],{"class":262},[145,5723,691],{"class":155},[145,5725,5473],{"class":159},[145,5727,5729,5731,5733,5735,5737,5739,5741,5743],{"class":147,"line":5728},60,[145,5730,5608],{"class":258},[145,5732,5481],{"class":159},[145,5734,685],{"class":155},[145,5736,5486],{"class":262},[145,5738,5489],{"class":258},[145,5740,691],{"class":155},[145,5742,1024],{"class":159},[145,5744,406],{"class":262},[145,5746,5748],{"class":147,"line":5747},61,[145,5749,5628],{"class":262},[145,5751,5753],{"class":147,"line":5752},62,[145,5754,5634],{"class":258},[145,5756,5758],{"class":147,"line":5757},63,[145,5759,376],{"emptyLinePlaceholder":58},[145,5761,5763,5765,5767,5769,5771,5774,5776,5778,5780,5783],{"class":147,"line":5762},64,[145,5764,996],{"class":258},[145,5766,909],{"class":155},[145,5768,794],{"class":262},[145,5770,440],{"class":258},[145,5772,5773],{"class":159},"\"Failed after ",[145,5775,685],{"class":155},[145,5777,5468],{"class":262},[145,5779,691],{"class":155},[145,5781,5782],{"class":159}," retries\"",[145,5784,406],{"class":262},[11,5786,5787],{},"This handles:",[97,5789,5790,5796,5802,5808,5814],{},[73,5791,5792,5795],{},[23,5793,5794],{},"Rate limits (429)"," — exponential backoff with jitter avoids synchronized retries from multiple clients",[73,5797,5798,5801],{},[23,5799,5800],{},"Server errors (500/502/503)"," — automatic retry with increasing delay",[73,5803,5804,5807],{},[23,5805,5806],{},"Timeouts"," — 30-second timeout prevents hanging on unresponsive servers",[73,5809,5810,5813],{},[23,5811,5812],{},"Connection drops"," — DNS failures, refused connections, network blips",[73,5815,5816,5819],{},[23,5817,5818],{},"Client errors (400/401/402/404/413/422)"," — fail immediately because retrying won't fix bad input",[18,5821,5822],{},[11,5823,5824,5826],{},[23,5825,133],{}," For production systems, consider logging failed requests with their full payload and error response. This makes debugging much easier when things go wrong at 3 AM.",[92,5828,5830],{"id":5829},"validating-input-before-api-calls","Validating Input Before API Calls",[11,5832,5833],{},"Save credits and time by catching obvious errors locally:",[136,5835,5837],{"className":338,"code":5836,"language":340,"meta":141,"style":141},"def validate_payload(payload):\n    \"\"\"\n    Validate a generation payload before sending to the API.\n    Catches common mistakes that would result in 400 errors.\n    \"\"\"\n    errors = []\n    \n    # Required fields\n    if not payload.get(\"model\"):\n        errors.append(\"'model' is required\")\n    if not payload.get(\"prompt\") or not payload[\"prompt\"].strip():\n        errors.append(\"'prompt' is required and cannot be empty\")\n    \n    # Duration range\n    duration = payload.get(\"duration\", 5)\n    if duration \u003C 4 or duration > 15:\n        errors.append(f\"'duration' must be 4-15, got {duration}\")\n    \n    # Quality values\n    valid_qualities = {\"480p\", \"720p\", \"1080p\"}\n    quality = payload.get(\"quality\", \"720p\")\n    if quality not in valid_qualities:\n        errors.append(f\"'quality' must be one of {valid_qualities}, got '{quality}'\")\n    \n    # Aspect ratio values\n    valid_ratios = {\"16:9\", \"9:16\", \"1:1\", \"4:3\", \"3:4\", \"21:9\"}\n    ratio = payload.get(\"aspect_ratio\", \"16:9\")\n    if ratio not in valid_ratios:\n        errors.append(f\"'aspect_ratio' must be one of {valid_ratios}, got '{ratio}'\")\n    \n    # Image URL validation\n    image_urls = payload.get(\"image_urls\", [])\n    if len(image_urls) > 9:\n        errors.append(f\"Maximum 9 images allowed, got {len(image_urls)}\")\n    for i, url in enumerate(image_urls):\n        if not url.startswith((\"http://\", \"https://\")):\n            errors.append(f\"image_urls[{i}] must be an HTTP(S) URL\")\n    \n    if errors:\n        raise ValueError(f\"Payload validation failed:\\n\" + \"\\n\".join(f\"  - {e}\" for e in errors))\n    \n    return True\n",[28,5838,5839,5849,5853,5858,5863,5867,5877,5881,5886,5901,5911,5937,5946,5950,5955,5973,5998,6017,6021,6026,6048,6066,6082,6112,6116,6121,6157,6175,6189,6218,6222,6227,6242,6259,6280,6295,6315,6337,6341,6348,6403,6407],{"__ignoreMap":141},[145,5840,5841,5843,5846],{"class":147,"line":148},[145,5842,526],{"class":258},[145,5844,5845],{"class":151}," validate_payload",[145,5847,5848],{"class":262},"(payload):\n",[145,5850,5851],{"class":147,"line":166},[145,5852,553],{"class":159},[145,5854,5855],{"class":147,"line":178},[145,5856,5857],{"class":159},"    Validate a generation payload before sending to the API.\n",[145,5859,5860],{"class":147,"line":187},[145,5861,5862],{"class":159},"    Catches common mistakes that would result in 400 errors.\n",[145,5864,5865],{"class":147,"line":373},[145,5866,553],{"class":159},[145,5868,5869,5872,5874],{"class":147,"line":379},[145,5870,5871],{"class":262},"    errors ",[145,5873,266],{"class":258},[145,5875,5876],{"class":262}," []\n",[145,5878,5879],{"class":147,"line":385},[145,5880,563],{"class":262},[145,5882,5883],{"class":147,"line":409},[145,5884,5885],{"class":174},"    # Required fields\n",[145,5887,5888,5890,5893,5896,5899],{"class":147,"line":420},[145,5889,2506],{"class":258},[145,5891,5892],{"class":258}," not",[145,5894,5895],{"class":262}," payload.get(",[145,5897,5898],{"class":159},"\"model\"",[145,5900,548],{"class":262},[145,5902,5903,5906,5909],{"class":147,"line":431},[145,5904,5905],{"class":262},"        errors.append(",[145,5907,5908],{"class":159},"\"'model' is required\"",[145,5910,406],{"class":262},[145,5912,5913,5915,5917,5919,5922,5924,5927,5929,5932,5934],{"class":147,"line":455},[145,5914,2506],{"class":258},[145,5916,5892],{"class":258},[145,5918,5895],{"class":262},[145,5920,5921],{"class":159},"\"prompt\"",[145,5923,1163],{"class":262},[145,5925,5926],{"class":258},"or",[145,5928,5892],{"class":258},[145,5930,5931],{"class":262}," payload[",[145,5933,5921],{"class":159},[145,5935,5936],{"class":262},"].strip():\n",[145,5938,5939,5941,5944],{"class":147,"line":466},[145,5940,5905],{"class":262},[145,5942,5943],{"class":159},"\"'prompt' is required and cannot be empty\"",[145,5945,406],{"class":262},[145,5947,5948],{"class":147,"line":600},[145,5949,563],{"class":262},[145,5951,5952],{"class":147,"line":605},[145,5953,5954],{"class":174},"    # Duration range\n",[145,5956,5957,5960,5962,5964,5967,5969,5971],{"class":147,"line":611},[145,5958,5959],{"class":262},"    duration ",[145,5961,266],{"class":258},[145,5963,5895],{"class":262},[145,5965,5966],{"class":159},"\"duration\"",[145,5968,400],{"class":262},[145,5970,1352],{"class":155},[145,5972,406],{"class":262},[145,5974,5975,5977,5980,5982,5985,5988,5990,5993,5996],{"class":147,"line":617},[145,5976,2506],{"class":258},[145,5978,5979],{"class":262}," duration ",[145,5981,648],{"class":258},[145,5983,5984],{"class":155}," 4",[145,5986,5987],{"class":258}," or",[145,5989,5979],{"class":262},[145,5991,5992],{"class":258},">",[145,5994,5995],{"class":155}," 15",[145,5997,860],{"class":262},[145,5999,6000,6002,6004,6007,6009,6011,6013,6015],{"class":147,"line":623},[145,6001,5905],{"class":262},[145,6003,440],{"class":258},[145,6005,6006],{"class":159},"\"'duration' must be 4-15, got ",[145,6008,685],{"class":155},[145,6010,1774],{"class":262},[145,6012,691],{"class":155},[145,6014,449],{"class":159},[145,6016,406],{"class":262},[145,6018,6019],{"class":147,"line":628},[145,6020,563],{"class":262},[145,6022,6023],{"class":147,"line":639},[145,6024,6025],{"class":174},"    # Quality values\n",[145,6027,6028,6031,6033,6036,6038,6040,6042,6044,6046],{"class":147,"line":654},[145,6029,6030],{"class":262},"    valid_qualities ",[145,6032,266],{"class":258},[145,6034,6035],{"class":262}," {",[145,6037,4013],{"class":159},[145,6039,400],{"class":262},[145,6041,1368],{"class":159},[145,6043,400],{"class":262},[145,6045,3710],{"class":159},[145,6047,469],{"class":262},[145,6049,6050,6053,6055,6057,6060,6062,6064],{"class":147,"line":660},[145,6051,6052],{"class":262},"    quality ",[145,6054,266],{"class":258},[145,6056,5895],{"class":262},[145,6058,6059],{"class":159},"\"quality\"",[145,6061,400],{"class":262},[145,6063,1368],{"class":159},[145,6065,406],{"class":262},[145,6067,6068,6070,6073,6076,6079],{"class":147,"line":671},[145,6069,2506],{"class":258},[145,6071,6072],{"class":262}," quality ",[145,6074,6075],{"class":258},"not",[145,6077,6078],{"class":258}," in",[145,6080,6081],{"class":262}," valid_qualities:\n",[145,6083,6084,6086,6088,6091,6093,6096,6098,6101,6103,6105,6107,6110],{"class":147,"line":698},[145,6085,5905],{"class":262},[145,6087,440],{"class":258},[145,6089,6090],{"class":159},"\"'quality' must be one of ",[145,6092,685],{"class":155},[145,6094,6095],{"class":262},"valid_qualities",[145,6097,691],{"class":155},[145,6099,6100],{"class":159},", got '",[145,6102,685],{"class":155},[145,6104,1782],{"class":262},[145,6106,691],{"class":155},[145,6108,6109],{"class":159},"'\"",[145,6111,406],{"class":262},[145,6113,6114],{"class":147,"line":710},[145,6115,563],{"class":262},[145,6117,6118],{"class":147,"line":716},[145,6119,6120],{"class":174},"    # Aspect ratio values\n",[145,6122,6123,6126,6128,6130,6132,6134,6136,6138,6141,6143,6146,6148,6151,6153,6155],{"class":147,"line":722},[145,6124,6125],{"class":262},"    valid_ratios ",[145,6127,266],{"class":258},[145,6129,6035],{"class":262},[145,6131,1384],{"class":159},[145,6133,400],{"class":262},[145,6135,3722],{"class":159},[145,6137,400],{"class":262},[145,6139,6140],{"class":159},"\"1:1\"",[145,6142,400],{"class":262},[145,6144,6145],{"class":159},"\"4:3\"",[145,6147,400],{"class":262},[145,6149,6150],{"class":159},"\"3:4\"",[145,6152,400],{"class":262},[145,6154,3833],{"class":159},[145,6156,469],{"class":262},[145,6158,6159,6162,6164,6166,6169,6171,6173],{"class":147,"line":728},[145,6160,6161],{"class":262},"    ratio ",[145,6163,266],{"class":258},[145,6165,5895],{"class":262},[145,6167,6168],{"class":159},"\"aspect_ratio\"",[145,6170,400],{"class":262},[145,6172,1384],{"class":159},[145,6174,406],{"class":262},[145,6176,6177,6179,6182,6184,6186],{"class":147,"line":739},[145,6178,2506],{"class":258},[145,6180,6181],{"class":262}," ratio ",[145,6183,6075],{"class":258},[145,6185,6078],{"class":258},[145,6187,6188],{"class":262}," valid_ratios:\n",[145,6190,6191,6193,6195,6198,6200,6203,6205,6207,6209,6212,6214,6216],{"class":147,"line":744},[145,6192,5905],{"class":262},[145,6194,440],{"class":258},[145,6196,6197],{"class":159},"\"'aspect_ratio' must be one of ",[145,6199,685],{"class":155},[145,6201,6202],{"class":262},"valid_ratios",[145,6204,691],{"class":155},[145,6206,6100],{"class":159},[145,6208,685],{"class":155},[145,6210,6211],{"class":262},"ratio",[145,6213,691],{"class":155},[145,6215,6109],{"class":159},[145,6217,406],{"class":262},[145,6219,6220],{"class":147,"line":750},[145,6221,563],{"class":262},[145,6223,6224],{"class":147,"line":767},[145,6225,6226],{"class":174},"    # Image URL validation\n",[145,6228,6229,6232,6234,6236,6239],{"class":147,"line":788},[145,6230,6231],{"class":262},"    image_urls ",[145,6233,266],{"class":258},[145,6235,5895],{"class":262},[145,6237,6238],{"class":159},"\"image_urls\"",[145,6240,6241],{"class":262},", [])\n",[145,6243,6244,6246,6249,6252,6254,6257],{"class":147,"line":834},[145,6245,2506],{"class":258},[145,6247,6248],{"class":155}," len",[145,6250,6251],{"class":262},"(image_urls) ",[145,6253,5992],{"class":258},[145,6255,6256],{"class":155}," 9",[145,6258,860],{"class":262},[145,6260,6261,6263,6265,6268,6271,6274,6276,6278],{"class":147,"line":839},[145,6262,5905],{"class":262},[145,6264,440],{"class":258},[145,6266,6267],{"class":159},"\"Maximum 9 images allowed, got ",[145,6269,6270],{"class":155},"{len",[145,6272,6273],{"class":262},"(image_urls)",[145,6275,691],{"class":155},[145,6277,449],{"class":159},[145,6279,406],{"class":262},[145,6281,6282,6284,6287,6289,6292],{"class":147,"line":845},[145,6283,5119],{"class":258},[145,6285,6286],{"class":262}," i, url ",[145,6288,1180],{"class":258},[145,6290,6291],{"class":155}," enumerate",[145,6293,6294],{"class":262},"(image_urls):\n",[145,6296,6297,6299,6301,6304,6307,6309,6312],{"class":147,"line":863},[145,6298,848],{"class":258},[145,6300,5892],{"class":258},[145,6302,6303],{"class":262}," url.startswith((",[145,6305,6306],{"class":159},"\"http://\"",[145,6308,400],{"class":262},[145,6310,6311],{"class":159},"\"https://\"",[145,6313,6314],{"class":262},")):\n",[145,6316,6317,6320,6322,6325,6327,6330,6332,6335],{"class":147,"line":872},[145,6318,6319],{"class":262},"            errors.append(",[145,6321,440],{"class":258},[145,6323,6324],{"class":159},"\"image_urls[",[145,6326,685],{"class":155},[145,6328,6329],{"class":262},"i",[145,6331,691],{"class":155},[145,6333,6334],{"class":159},"] must be an HTTP(S) URL\"",[145,6336,406],{"class":262},[145,6338,6339],{"class":147,"line":887},[145,6340,563],{"class":262},[145,6342,6343,6345],{"class":147,"line":903},[145,6344,2506],{"class":258},[145,6346,6347],{"class":262}," errors:\n",[145,6349,6350,6353,6355,6357,6359,6362,6364,6366,6369,6372,6374,6376,6379,6381,6384,6386,6388,6390,6392,6395,6398,6400],{"class":147,"line":915},[145,6351,6352],{"class":258},"        raise",[145,6354,5338],{"class":155},[145,6356,794],{"class":262},[145,6358,440],{"class":258},[145,6360,6361],{"class":159},"\"Payload validation failed:",[145,6363,1670],{"class":155},[145,6365,449],{"class":159},[145,6367,6368],{"class":258}," +",[145,6370,6371],{"class":159}," \"",[145,6373,1670],{"class":155},[145,6375,449],{"class":159},[145,6377,6378],{"class":262},".join(",[145,6380,440],{"class":258},[145,6382,6383],{"class":159},"\"  - ",[145,6385,685],{"class":155},[145,6387,5702],{"class":262},[145,6389,691],{"class":155},[145,6391,449],{"class":159},[145,6393,6394],{"class":258}," for",[145,6396,6397],{"class":262}," e ",[145,6399,1180],{"class":258},[145,6401,6402],{"class":262}," errors))\n",[145,6404,6405],{"class":147,"line":953},[145,6406,563],{"class":262},[145,6408,6409,6411],{"class":147,"line":959},[145,6410,1703],{"class":258},[145,6412,6413],{"class":155}," True\n",[18,6415,6416],{},[11,6417,6418,6420,6421,6424],{},[23,6419,304],{}," Forgetting to URL-encode special characters in image URLs. If your image path contains spaces or non-ASCII characters, use ",[28,6422,6423],{},"urllib.parse.quote()"," to encode it.",[45,6426],{},[48,6428,6430],{"id":6429},"set-up-webhooks-skip-the-polling","Set Up Webhooks (Skip the Polling)",[11,6432,6433,6434,6437],{},"Polling works fine for scripts and prototyping. For production systems, ",[23,6435,6436],{},"webhooks"," are more efficient — the API pushes the result to your server when the video is ready. No wasted requests, no delay between completion and notification.",[92,6439,6441],{"id":6440},"how-it-works","How It Works",[11,6443,6444,6445,6447],{},"Add ",[28,6446,3601],{}," to your generation request:",[11,6449,6450],{},[2619,6451,6452],{},"Uses the same setup from the first example above.",[136,6454,6456],{"className":338,"code":6455,"language":340,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"A spaceship launches from a desert landscape at sunset.\",\n    \"duration\": 8,\n    \"quality\": \"720p\",\n    \"callback_url\": \"https://your-server.com/api/webhook/seedance\"\n}\n\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\ntask = response.json()\nprint(f\"Task submitted: {task['id']}\")\n# No polling needed — your webhook will receive the result\n",[28,6457,6458,6466,6476,6487,6497,6507,6517,6521,6525,6534,6547,6558,6567,6571,6580,6606],{"__ignoreMap":141},[145,6459,6460,6462,6464],{"class":147,"line":148},[145,6461,3661],{"class":262},[145,6463,266],{"class":258},[145,6465,428],{"class":262},[145,6467,6468,6470,6472,6474],{"class":147,"line":166},[145,6469,3670],{"class":159},[145,6471,437],{"class":262},[145,6473,1308],{"class":159},[145,6475,452],{"class":262},[145,6477,6478,6480,6482,6485],{"class":147,"line":178},[145,6479,3681],{"class":159},[145,6481,437],{"class":262},[145,6483,6484],{"class":159},"\"A spaceship launches from a desert landscape at sunset.\"",[145,6486,452],{"class":262},[145,6488,6489,6491,6493,6495],{"class":147,"line":187},[145,6490,3693],{"class":159},[145,6492,437],{"class":262},[145,6494,3698],{"class":155},[145,6496,452],{"class":262},[145,6498,6499,6501,6503,6505],{"class":147,"line":373},[145,6500,3705],{"class":159},[145,6502,437],{"class":262},[145,6504,1368],{"class":159},[145,6506,452],{"class":262},[145,6508,6509,6512,6514],{"class":147,"line":379},[145,6510,6511],{"class":159},"    \"callback_url\"",[145,6513,437],{"class":262},[145,6515,6516],{"class":159},"\"https://your-server.com/api/webhook/seedance\"\n",[145,6518,6519],{"class":147,"line":385},[145,6520,469],{"class":262},[145,6522,6523],{"class":147,"line":409},[145,6524,376],{"emptyLinePlaceholder":58},[145,6526,6527,6530,6532],{"class":147,"line":420},[145,6528,6529],{"class":262},"response ",[145,6531,266],{"class":258},[145,6533,1432],{"class":262},[145,6535,6536,6539,6541,6543,6545],{"class":147,"line":431},[145,6537,6538],{"class":258},"    f",[145,6540,449],{"class":159},[145,6542,679],{"class":155},[145,6544,1444],{"class":159},[145,6546,452],{"class":262},[145,6548,6549,6552,6554,6556],{"class":147,"line":455},[145,6550,6551],{"class":701},"    headers",[145,6553,266],{"class":258},[145,6555,423],{"class":155},[145,6557,452],{"class":262},[145,6559,6560,6563,6565],{"class":147,"line":466},[145,6561,6562],{"class":701},"    json",[145,6564,266],{"class":258},[145,6566,2788],{"class":262},[145,6568,6569],{"class":147,"line":600},[145,6570,406],{"class":262},[145,6572,6573,6576,6578],{"class":147,"line":605},[145,6574,6575],{"class":262},"task ",[145,6577,266],{"class":258},[145,6579,736],{"class":262},[145,6581,6582,6585,6587,6589,6592,6594,6596,6598,6600,6602,6604],{"class":147,"line":611},[145,6583,6584],{"class":155},"print",[145,6586,794],{"class":262},[145,6588,440],{"class":258},[145,6590,6591],{"class":159},"\"Task submitted: ",[145,6593,685],{"class":155},[145,6595,1529],{"class":262},[145,6597,1532],{"class":159},[145,6599,1535],{"class":262},[145,6601,691],{"class":155},[145,6603,449],{"class":159},[145,6605,406],{"class":262},[145,6607,6608],{"class":147,"line":617},[145,6609,6610],{"class":174},"# No polling needed — your webhook will receive the result\n",[11,6612,6613,6614,6616],{},"When the video is ready, the API sends a POST request to your ",[28,6615,3601],{}," with the completed task object — the exact same payload you'd get from polling.",[92,6618,6620],{"id":6619},"webhook-requirements","Webhook Requirements",[2036,6622,6623,6633],{},[2039,6624,6625],{},[2042,6626,6627,6630],{},[2045,6628,6629],{},"Requirement",[2045,6631,6632],{},"Details",[2052,6634,6635,6643,6651,6659,6667,6675],{},[2042,6636,6637,6640],{},[2057,6638,6639],{},"Protocol",[2057,6641,6642],{},"HTTPS only (no HTTP) — required for security",[2042,6644,6645,6648],{},[2057,6646,6647],{},"Response",[2057,6649,6650],{},"Return 2xx within 10 seconds",[2042,6652,6653,6656],{},[2057,6654,6655],{},"Retries",[2057,6657,6658],{},"3 attempts on failure (1s, 2s, 4s intervals)",[2042,6660,6661,6664],{},[2057,6662,6663],{},"URL length",[2057,6665,6666],{},"≤ 2048 characters",[2042,6668,6669,6672],{},[2057,6670,6671],{},"Network",[2057,6673,6674],{},"No internal/private IPs (localhost, 10.x.x.x, 192.168.x.x)",[2042,6676,6677,6680],{},[2057,6678,6679],{},"Body",[2057,6681,6682],{},"JSON POST with the full task object",[92,6684,6686],{"id":6685},"production-flask-webhook-receiver","Production Flask Webhook Receiver",[11,6688,6689],{},"Here's a complete webhook server using Flask with proper validation, error handling, and async video downloading:",[136,6691,6693],{"className":338,"code":6692,"language":340,"meta":141,"style":141},"# webhook_server.py\n\"\"\"\nSeedance webhook receiver — handles video completion callbacks.\nRun: pip install flask requests\n      python webhook_server.py\n\"\"\"\nfrom flask import Flask, request, jsonify\nimport json\nimport os\nimport threading\nimport requests as req  # renamed to avoid conflict with flask.request\n\napp = Flask(__name__)\n\n# Directory to save completed videos\nOUTPUT_DIR = os.getenv(\"VIDEO_OUTPUT_DIR\", \"./videos\")\nos.makedirs(OUTPUT_DIR, exist_ok=True)\n\n\ndef download_video_async(video_url, task_id):\n    \"\"\"Download video in a background thread to not block the webhook response.\"\"\"\n    try:\n        filename = os.path.join(OUTPUT_DIR, f\"{task_id}.mp4\")\n        print(f\"  Downloading {task_id} to {filename}...\")\n        resp = req.get(video_url, stream=True, timeout=120)\n        resp.raise_for_status()\n        with open(filename, \"wb\") as f:\n            for chunk in resp.iter_content(chunk_size=8192):\n                f.write(chunk)\n        size_mb = os.path.getsize(filename) / (1024 * 1024)\n        print(f\"  Saved: {filename} ({size_mb:.1f} MB)\")\n    except Exception as e:\n        print(f\"  Download failed for {task_id}: {e}\")\n\n\n@app.route(\"/api/webhook/seedance\", methods=[\"POST\"])\ndef handle_webhook():\n    \"\"\"\n    Handle Seedance video completion webhook.\n    \n    The API sends a POST with the full task object when\n    a video generation completes (success or failure).\n    \"\"\"\n    # Parse the incoming task object\n    task = request.json\n    if not task:\n        return jsonify({\"error\": \"Empty body\"}), 400\n    \n    task_id = task.get(\"id\", \"unknown\")\n    status = task.get(\"status\", \"unknown\")\n    model = task.get(\"model\", \"unknown\")\n\n    print(f\"\\n{'='*50}\")\n    print(f\"Webhook received: task={task_id}\")\n    print(f\"  Status: {status}\")\n    print(f\"  Model: {model}\")\n\n    if status == \"completed\":\n        # Extract video URL(s) from results\n        results = task.get(\"results\", [])\n        if results:\n            video_url = results[0]\n            print(f\"  Video URL: {video_url}\")\n            \n            # Download in background thread so we respond quickly\n            thread = threading.Thread(\n                target=download_video_async,\n                args=(video_url, task_id)\n            )\n            thread.start()\n        else:\n            print(f\"  WARNING: Completed but no results array!\")\n\n    elif status == \"failed\":\n        error_info = task.get(\"error\", {})\n        print(f\"  FAILED: {json.dumps(error_info, indent=2)}\")\n        # TODO: Log to your error tracking system (Sentry, etc.)\n        # TODO: Optionally retry the generation with modified parameters\n\n    else:\n        print(f\"  Unexpected status: {status}\")\n        print(f\"  Full payload: {json.dumps(task, indent=2)}\")\n\n    # Always return 200 quickly — the API expects a response within 10s\n    return jsonify({\"received\": True, \"task_id\": task_id}), 200\n\n\n@app.route(\"/health\", methods=[\"GET\"])\ndef health_check():\n    \"\"\"Health check endpoint for load balancers.\"\"\"\n    return jsonify({\"status\": \"ok\"}), 200\n\n\nif __name__ == \"__main__\":\n    print(f\"Starting webhook server...\")\n    print(f\"Videos will be saved to: {os.path.abspath(OUTPUT_DIR)}\")\n    print(f\"Webhook URL: http://localhost:5000/api/webhook/seedance\")\n    app.run(host=\"0.0.0.0\", port=5000, debug=True)\n",[28,6694,6695,6700,6705,6710,6715,6720,6724,6737,6743,6749,6756,6771,6775,6790,6794,6799,6818,6836,6840,6844,6854,6859,6866,6895,6925,6952,6957,6974,6993,6998,7022,7055,7068,7097,7101,7105,7130,7139,7143,7148,7152,7157,7162,7166,7171,7180,7189,7210,7214,7232,7249,7266,7270,7296,7317,7338,7359,7363,7375,7380,7393,7400,7414,7435,7440,7446,7457,7468,7479,7484,7490,7498,7512,7517,7531,7545,7577,7589,7599,7604,7611,7633,7664,7669,7675,7700,7705,7710,7733,7743,7749,7767,7772,7777,7790,7804,7831,7845],{"__ignoreMap":141},[145,6696,6697],{"class":147,"line":148},[145,6698,6699],{"class":174},"# webhook_server.py\n",[145,6701,6702],{"class":147,"line":166},[145,6703,6704],{"class":159},"\"\"\"\n",[145,6706,6707],{"class":147,"line":178},[145,6708,6709],{"class":159},"Seedance webhook receiver — handles video completion callbacks.\n",[145,6711,6712],{"class":147,"line":187},[145,6713,6714],{"class":159},"Run: pip install flask requests\n",[145,6716,6717],{"class":147,"line":373},[145,6718,6719],{"class":159},"      python webhook_server.py\n",[145,6721,6722],{"class":147,"line":379},[145,6723,6704],{"class":159},[145,6725,6726,6729,6732,6734],{"class":147,"line":385},[145,6727,6728],{"class":258},"from",[145,6730,6731],{"class":262}," flask ",[145,6733,347],{"class":258},[145,6735,6736],{"class":262}," Flask, request, jsonify\n",[145,6738,6739,6741],{"class":147,"line":409},[145,6740,347],{"class":258},[145,6742,370],{"class":262},[145,6744,6745,6747],{"class":147,"line":420},[145,6746,347],{"class":258},[145,6748,363],{"class":262},[145,6750,6751,6753],{"class":147,"line":431},[145,6752,347],{"class":258},[145,6754,6755],{"class":262}," threading\n",[145,6757,6758,6760,6763,6765,6768],{"class":147,"line":455},[145,6759,347],{"class":258},[145,6761,6762],{"class":262}," requests ",[145,6764,1166],{"class":258},[145,6766,6767],{"class":262}," req  ",[145,6769,6770],{"class":174},"# renamed to avoid conflict with flask.request\n",[145,6772,6773],{"class":147,"line":466},[145,6774,376],{"emptyLinePlaceholder":58},[145,6776,6777,6780,6782,6785,6788],{"class":147,"line":600},[145,6778,6779],{"class":262},"app ",[145,6781,266],{"class":258},[145,6783,6784],{"class":262}," Flask(",[145,6786,6787],{"class":155},"__name__",[145,6789,406],{"class":262},[145,6791,6792],{"class":147,"line":605},[145,6793,376],{"emptyLinePlaceholder":58},[145,6795,6796],{"class":147,"line":611},[145,6797,6798],{"class":174},"# Directory to save completed videos\n",[145,6800,6801,6804,6806,6808,6811,6813,6816],{"class":147,"line":617},[145,6802,6803],{"class":155},"OUTPUT_DIR",[145,6805,391],{"class":258},[145,6807,394],{"class":262},[145,6809,6810],{"class":159},"\"VIDEO_OUTPUT_DIR\"",[145,6812,400],{"class":262},[145,6814,6815],{"class":159},"\"./videos\"",[145,6817,406],{"class":262},[145,6819,6820,6823,6825,6827,6830,6832,6834],{"class":147,"line":623},[145,6821,6822],{"class":262},"os.makedirs(",[145,6824,6803],{"class":155},[145,6826,400],{"class":262},[145,6828,6829],{"class":701},"exist_ok",[145,6831,266],{"class":258},[145,6833,1139],{"class":155},[145,6835,406],{"class":262},[145,6837,6838],{"class":147,"line":628},[145,6839,376],{"emptyLinePlaceholder":58},[145,6841,6842],{"class":147,"line":639},[145,6843,376],{"emptyLinePlaceholder":58},[145,6845,6846,6848,6851],{"class":147,"line":654},[145,6847,526],{"class":258},[145,6849,6850],{"class":151}," download_video_async",[145,6852,6853],{"class":262},"(video_url, task_id):\n",[145,6855,6856],{"class":147,"line":660},[145,6857,6858],{"class":159},"    \"\"\"Download video in a background thread to not block the webhook response.\"\"\"\n",[145,6860,6861,6864],{"class":147,"line":671},[145,6862,6863],{"class":258},"    try",[145,6865,860],{"class":262},[145,6867,6868,6871,6873,6876,6878,6880,6882,6884,6886,6888,6890,6893],{"class":147,"line":698},[145,6869,6870],{"class":262},"        filename ",[145,6872,266],{"class":258},[145,6874,6875],{"class":262}," os.path.join(",[145,6877,6803],{"class":155},[145,6879,400],{"class":262},[145,6881,440],{"class":258},[145,6883,449],{"class":159},[145,6885,685],{"class":155},[145,6887,688],{"class":262},[145,6889,691],{"class":155},[145,6891,6892],{"class":159},".mp4\"",[145,6894,406],{"class":262},[145,6896,6897,6899,6901,6903,6906,6908,6910,6912,6915,6917,6919,6921,6923],{"class":147,"line":710},[145,6898,791],{"class":155},[145,6900,794],{"class":262},[145,6902,440],{"class":258},[145,6904,6905],{"class":159},"\"  Downloading ",[145,6907,685],{"class":155},[145,6909,688],{"class":262},[145,6911,691],{"class":155},[145,6913,6914],{"class":159}," to ",[145,6916,685],{"class":155},[145,6918,1114],{"class":262},[145,6920,691],{"class":155},[145,6922,1119],{"class":159},[145,6924,406],{"class":262},[145,6926,6927,6930,6932,6935,6937,6939,6941,6943,6945,6947,6950],{"class":147,"line":716},[145,6928,6929],{"class":262},"        resp ",[145,6931,266],{"class":258},[145,6933,6934],{"class":262}," req.get(video_url, ",[145,6936,1134],{"class":701},[145,6938,266],{"class":258},[145,6940,1139],{"class":155},[145,6942,400],{"class":262},[145,6944,1019],{"class":701},[145,6946,266],{"class":258},[145,6948,6949],{"class":155},"120",[145,6951,406],{"class":262},[145,6953,6954],{"class":147,"line":722},[145,6955,6956],{"class":262},"        resp.raise_for_status()\n",[145,6958,6959,6962,6964,6966,6968,6970,6972],{"class":147,"line":728},[145,6960,6961],{"class":258},"        with",[145,6963,1154],{"class":155},[145,6965,1157],{"class":262},[145,6967,1160],{"class":159},[145,6969,1163],{"class":262},[145,6971,1166],{"class":258},[145,6973,1169],{"class":262},[145,6975,6976,6979,6981,6983,6985,6987,6989,6991],{"class":147,"line":739},[145,6977,6978],{"class":258},"            for",[145,6980,1177],{"class":262},[145,6982,1180],{"class":258},[145,6984,1183],{"class":262},[145,6986,1186],{"class":701},[145,6988,266],{"class":258},[145,6990,1191],{"class":155},[145,6992,548],{"class":262},[145,6994,6995],{"class":147,"line":744},[145,6996,6997],{"class":262},"                f.write(chunk)\n",[145,6999,7000,7003,7005,7008,7010,7012,7015,7018,7020],{"class":147,"line":750},[145,7001,7002],{"class":262},"        size_mb ",[145,7004,266],{"class":258},[145,7006,7007],{"class":262}," os.path.getsize(filename) ",[145,7009,1226],{"class":258},[145,7011,1218],{"class":262},[145,7013,7014],{"class":155},"1024",[145,7016,7017],{"class":258}," *",[145,7019,1229],{"class":155},[145,7021,406],{"class":262},[145,7023,7024,7026,7028,7030,7033,7035,7037,7039,7041,7043,7046,7048,7050,7053],{"class":147,"line":767},[145,7025,791],{"class":155},[145,7027,794],{"class":262},[145,7029,440],{"class":258},[145,7031,7032],{"class":159},"\"  Saved: ",[145,7034,685],{"class":155},[145,7036,1114],{"class":262},[145,7038,691],{"class":155},[145,7040,1218],{"class":159},[145,7042,685],{"class":155},[145,7044,7045],{"class":262},"size_mb",[145,7047,5489],{"class":258},[145,7049,691],{"class":155},[145,7051,7052],{"class":159}," MB)\"",[145,7054,406],{"class":262},[145,7056,7057,7060,7063,7066],{"class":147,"line":788},[145,7058,7059],{"class":258},"    except",[145,7061,7062],{"class":155}," Exception",[145,7064,7065],{"class":258}," as",[145,7067,5652],{"class":262},[145,7069,7070,7072,7074,7076,7079,7081,7083,7085,7087,7089,7091,7093,7095],{"class":147,"line":834},[145,7071,791],{"class":155},[145,7073,794],{"class":262},[145,7075,440],{"class":258},[145,7077,7078],{"class":159},"\"  Download failed for ",[145,7080,685],{"class":155},[145,7082,688],{"class":262},[145,7084,691],{"class":155},[145,7086,437],{"class":159},[145,7088,685],{"class":155},[145,7090,5702],{"class":262},[145,7092,691],{"class":155},[145,7094,449],{"class":159},[145,7096,406],{"class":262},[145,7098,7099],{"class":147,"line":839},[145,7100,376],{"emptyLinePlaceholder":58},[145,7102,7103],{"class":147,"line":845},[145,7104,376],{"emptyLinePlaceholder":58},[145,7106,7107,7110,7112,7115,7117,7120,7122,7125,7128],{"class":147,"line":863},[145,7108,7109],{"class":151},"@app.route",[145,7111,794],{"class":262},[145,7113,7114],{"class":159},"\"/api/webhook/seedance\"",[145,7116,400],{"class":262},[145,7118,7119],{"class":701},"methods",[145,7121,266],{"class":258},[145,7123,7124],{"class":262},"[",[145,7126,7127],{"class":159},"\"POST\"",[145,7129,1629],{"class":262},[145,7131,7132,7134,7137],{"class":147,"line":872},[145,7133,526],{"class":258},[145,7135,7136],{"class":151}," handle_webhook",[145,7138,1289],{"class":262},[145,7140,7141],{"class":147,"line":887},[145,7142,553],{"class":159},[145,7144,7145],{"class":147,"line":903},[145,7146,7147],{"class":159},"    Handle Seedance video completion webhook.\n",[145,7149,7150],{"class":147,"line":915},[145,7151,563],{"class":159},[145,7153,7154],{"class":147,"line":953},[145,7155,7156],{"class":159},"    The API sends a POST with the full task object when\n",[145,7158,7159],{"class":147,"line":959},[145,7160,7161],{"class":159},"    a video generation completes (success or failure).\n",[145,7163,7164],{"class":147,"line":964},[145,7165,553],{"class":159},[145,7167,7168],{"class":147,"line":970},[145,7169,7170],{"class":174},"    # Parse the incoming task object\n",[145,7172,7173,7175,7177],{"class":147,"line":976},[145,7174,1496],{"class":262},[145,7176,266],{"class":258},[145,7178,7179],{"class":262}," request.json\n",[145,7181,7182,7184,7186],{"class":147,"line":988},[145,7183,2506],{"class":258},[145,7185,5892],{"class":258},[145,7187,7188],{"class":262}," task:\n",[145,7190,7191,7194,7197,7199,7201,7204,7207],{"class":147,"line":993},[145,7192,7193],{"class":258},"        return",[145,7195,7196],{"class":262}," jsonify({",[145,7198,897],{"class":159},[145,7200,437],{"class":262},[145,7202,7203],{"class":159},"\"Empty body\"",[145,7205,7206],{"class":262},"}), ",[145,7208,7209],{"class":155},"400\n",[145,7211,7212],{"class":147,"line":5531},[145,7213,563],{"class":262},[145,7215,7216,7219,7221,7223,7225,7227,7230],{"class":147,"line":5540},[145,7217,7218],{"class":262},"    task_id ",[145,7220,266],{"class":258},[145,7222,775],{"class":262},[145,7224,1626],{"class":159},[145,7226,400],{"class":262},[145,7228,7229],{"class":159},"\"unknown\"",[145,7231,406],{"class":262},[145,7233,7234,7237,7239,7241,7243,7245,7247],{"class":147,"line":5546},[145,7235,7236],{"class":262},"    status ",[145,7238,266],{"class":258},[145,7240,775],{"class":262},[145,7242,761],{"class":159},[145,7244,400],{"class":262},[145,7246,7229],{"class":159},[145,7248,406],{"class":262},[145,7250,7251,7254,7256,7258,7260,7262,7264],{"class":147,"line":5574},[145,7252,7253],{"class":262},"    model ",[145,7255,266],{"class":258},[145,7257,775],{"class":262},[145,7259,5898],{"class":159},[145,7261,400],{"class":262},[145,7263,7229],{"class":159},[145,7265,406],{"class":262},[145,7267,7268],{"class":147,"line":5605},[145,7269,376],{"emptyLinePlaceholder":58},[145,7271,7272,7274,7276,7278,7280,7283,7286,7289,7292,7294],{"class":147,"line":5625},[145,7273,1102],{"class":155},[145,7275,794],{"class":262},[145,7277,440],{"class":258},[145,7279,449],{"class":159},[145,7281,7282],{"class":155},"\\n{",[145,7284,7285],{"class":159},"'='",[145,7287,7288],{"class":258},"*",[145,7290,7291],{"class":155},"50}",[145,7293,449],{"class":159},[145,7295,406],{"class":262},[145,7297,7298,7300,7302,7304,7307,7309,7311,7313,7315],{"class":147,"line":5631},[145,7299,1102],{"class":155},[145,7301,794],{"class":262},[145,7303,440],{"class":258},[145,7305,7306],{"class":159},"\"Webhook received: task=",[145,7308,685],{"class":155},[145,7310,688],{"class":262},[145,7312,691],{"class":155},[145,7314,449],{"class":159},[145,7316,406],{"class":262},[145,7318,7319,7321,7323,7325,7328,7330,7332,7334,7336],{"class":147,"line":5637},[145,7320,1102],{"class":155},[145,7322,794],{"class":262},[145,7324,440],{"class":258},[145,7326,7327],{"class":159},"\"  Status: ",[145,7329,685],{"class":155},[145,7331,814],{"class":262},[145,7333,691],{"class":155},[145,7335,449],{"class":159},[145,7337,406],{"class":262},[145,7339,7340,7342,7344,7346,7349,7351,7353,7355,7357],{"class":147,"line":5642},[145,7341,1102],{"class":155},[145,7343,794],{"class":262},[145,7345,440],{"class":258},[145,7347,7348],{"class":159},"\"  Model: ",[145,7350,685],{"class":155},[145,7352,1747],{"class":262},[145,7354,691],{"class":155},[145,7356,449],{"class":159},[145,7358,406],{"class":262},[145,7360,7361],{"class":147,"line":5655},[145,7362,376],{"emptyLinePlaceholder":58},[145,7364,7365,7367,7369,7371,7373],{"class":147,"line":5661},[145,7366,2506],{"class":258},[145,7368,851],{"class":262},[145,7370,854],{"class":258},[145,7372,857],{"class":159},[145,7374,860],{"class":262},[145,7376,7377],{"class":147,"line":5688},[145,7378,7379],{"class":174},"        # Extract video URL(s) from results\n",[145,7381,7382,7385,7387,7389,7391],{"class":147,"line":5728},[145,7383,7384],{"class":262},"        results ",[145,7386,266],{"class":258},[145,7388,775],{"class":262},[145,7390,1651],{"class":159},[145,7392,6241],{"class":262},[145,7394,7395,7397],{"class":147,"line":5747},[145,7396,848],{"class":258},[145,7398,7399],{"class":262}," results:\n",[145,7401,7402,7405,7407,7410,7412],{"class":147,"line":5752},[145,7403,7404],{"class":262},"            video_url ",[145,7406,266],{"class":258},[145,7408,7409],{"class":262}," results[",[145,7411,783],{"class":155},[145,7413,764],{"class":262},[145,7415,7416,7418,7420,7422,7425,7427,7429,7431,7433],{"class":147,"line":5757},[145,7417,5577],{"class":155},[145,7419,794],{"class":262},[145,7421,440],{"class":258},[145,7423,7424],{"class":159},"\"  Video URL: ",[145,7426,685],{"class":155},[145,7428,1678],{"class":262},[145,7430,691],{"class":155},[145,7432,449],{"class":159},[145,7434,406],{"class":262},[145,7436,7437],{"class":147,"line":5762},[145,7438,7439],{"class":262},"            \n",[145,7441,7443],{"class":147,"line":7442},65,[145,7444,7445],{"class":174},"            # Download in background thread so we respond quickly\n",[145,7447,7449,7452,7454],{"class":147,"line":7448},66,[145,7450,7451],{"class":262},"            thread ",[145,7453,266],{"class":258},[145,7455,7456],{"class":262}," threading.Thread(\n",[145,7458,7460,7463,7465],{"class":147,"line":7459},67,[145,7461,7462],{"class":701},"                target",[145,7464,266],{"class":258},[145,7466,7467],{"class":262},"download_video_async,\n",[145,7469,7471,7474,7476],{"class":147,"line":7470},68,[145,7472,7473],{"class":701},"                args",[145,7475,266],{"class":258},[145,7477,7478],{"class":262},"(video_url, task_id)\n",[145,7480,7482],{"class":147,"line":7481},69,[145,7483,956],{"class":262},[145,7485,7487],{"class":147,"line":7486},70,[145,7488,7489],{"class":262},"            thread.start()\n",[145,7491,7493,7496],{"class":147,"line":7492},71,[145,7494,7495],{"class":258},"        else",[145,7497,860],{"class":262},[145,7499,7501,7503,7505,7507,7510],{"class":147,"line":7500},72,[145,7502,5577],{"class":155},[145,7504,794],{"class":262},[145,7506,440],{"class":258},[145,7508,7509],{"class":159},"\"  WARNING: Completed but no results array!\"",[145,7511,406],{"class":262},[145,7513,7515],{"class":147,"line":7514},73,[145,7516,376],{"emptyLinePlaceholder":58},[145,7518,7520,7523,7525,7527,7529],{"class":147,"line":7519},74,[145,7521,7522],{"class":258},"    elif",[145,7524,851],{"class":262},[145,7526,854],{"class":258},[145,7528,882],{"class":159},[145,7530,860],{"class":262},[145,7532,7534,7537,7539,7541,7543],{"class":147,"line":7533},75,[145,7535,7536],{"class":262},"        error_info ",[145,7538,266],{"class":258},[145,7540,775],{"class":262},[145,7542,897],{"class":159},[145,7544,900],{"class":262},[145,7546,7548,7550,7552,7554,7557,7559,7562,7565,7567,7569,7571,7573,7575],{"class":147,"line":7547},76,[145,7549,791],{"class":155},[145,7551,794],{"class":262},[145,7553,440],{"class":258},[145,7555,7556],{"class":159},"\"  FAILED: ",[145,7558,685],{"class":155},[145,7560,7561],{"class":262},"json.dumps(error_info, ",[145,7563,7564],{"class":701},"indent",[145,7566,266],{"class":258},[145,7568,5418],{"class":155},[145,7570,108],{"class":262},[145,7572,691],{"class":155},[145,7574,449],{"class":159},[145,7576,406],{"class":262},[145,7578,7580,7583,7586],{"class":147,"line":7579},77,[145,7581,7582],{"class":174},"        # ",[145,7584,7585],{"class":258},"TODO",[145,7587,7588],{"class":174},": Log to your error tracking system (Sentry, etc.)\n",[145,7590,7592,7594,7596],{"class":147,"line":7591},78,[145,7593,7582],{"class":174},[145,7595,7585],{"class":258},[145,7597,7598],{"class":174},": Optionally retry the generation with modified parameters\n",[145,7600,7602],{"class":147,"line":7601},79,[145,7603,376],{"emptyLinePlaceholder":58},[145,7605,7607,7609],{"class":147,"line":7606},80,[145,7608,2542],{"class":258},[145,7610,860],{"class":262},[145,7612,7614,7616,7618,7620,7623,7625,7627,7629,7631],{"class":147,"line":7613},81,[145,7615,791],{"class":155},[145,7617,794],{"class":262},[145,7619,440],{"class":258},[145,7621,7622],{"class":159},"\"  Unexpected status: ",[145,7624,685],{"class":155},[145,7626,814],{"class":262},[145,7628,691],{"class":155},[145,7630,449],{"class":159},[145,7632,406],{"class":262},[145,7634,7636,7638,7640,7642,7645,7647,7650,7652,7654,7656,7658,7660,7662],{"class":147,"line":7635},82,[145,7637,791],{"class":155},[145,7639,794],{"class":262},[145,7641,440],{"class":258},[145,7643,7644],{"class":159},"\"  Full payload: ",[145,7646,685],{"class":155},[145,7648,7649],{"class":262},"json.dumps(task, ",[145,7651,7564],{"class":701},[145,7653,266],{"class":258},[145,7655,5418],{"class":155},[145,7657,108],{"class":262},[145,7659,691],{"class":155},[145,7661,449],{"class":159},[145,7663,406],{"class":262},[145,7665,7667],{"class":147,"line":7666},83,[145,7668,376],{"emptyLinePlaceholder":58},[145,7670,7672],{"class":147,"line":7671},84,[145,7673,7674],{"class":174},"    # Always return 200 quickly — the API expects a response within 10s\n",[145,7676,7678,7680,7682,7685,7687,7689,7691,7694,7697],{"class":147,"line":7677},85,[145,7679,1703],{"class":258},[145,7681,7196],{"class":262},[145,7683,7684],{"class":159},"\"received\"",[145,7686,437],{"class":262},[145,7688,1139],{"class":155},[145,7690,400],{"class":262},[145,7692,7693],{"class":159},"\"task_id\"",[145,7695,7696],{"class":262},": task_id}), ",[145,7698,7699],{"class":155},"200\n",[145,7701,7703],{"class":147,"line":7702},86,[145,7704,376],{"emptyLinePlaceholder":58},[145,7706,7708],{"class":147,"line":7707},87,[145,7709,376],{"emptyLinePlaceholder":58},[145,7711,7713,7715,7717,7720,7722,7724,7726,7728,7731],{"class":147,"line":7712},88,[145,7714,7109],{"class":151},[145,7716,794],{"class":262},[145,7718,7719],{"class":159},"\"/health\"",[145,7721,400],{"class":262},[145,7723,7119],{"class":701},[145,7725,266],{"class":258},[145,7727,7124],{"class":262},[145,7729,7730],{"class":159},"\"GET\"",[145,7732,1629],{"class":262},[145,7734,7736,7738,7741],{"class":147,"line":7735},89,[145,7737,526],{"class":258},[145,7739,7740],{"class":151}," health_check",[145,7742,1289],{"class":262},[145,7744,7746],{"class":147,"line":7745},90,[145,7747,7748],{"class":159},"    \"\"\"Health check endpoint for load balancers.\"\"\"\n",[145,7750,7752,7754,7756,7758,7760,7763,7765],{"class":147,"line":7751},91,[145,7753,1703],{"class":258},[145,7755,7196],{"class":262},[145,7757,761],{"class":159},[145,7759,437],{"class":262},[145,7761,7762],{"class":159},"\"ok\"",[145,7764,7206],{"class":262},[145,7766,7699],{"class":155},[145,7768,7770],{"class":147,"line":7769},92,[145,7771,376],{"emptyLinePlaceholder":58},[145,7773,7775],{"class":147,"line":7774},93,[145,7776,376],{"emptyLinePlaceholder":58},[145,7778,7780,7782,7784,7786,7788],{"class":147,"line":7779},94,[145,7781,1719],{"class":258},[145,7783,1722],{"class":155},[145,7785,1725],{"class":258},[145,7787,1728],{"class":159},[145,7789,860],{"class":262},[145,7791,7793,7795,7797,7799,7802],{"class":147,"line":7792},95,[145,7794,1102],{"class":155},[145,7796,794],{"class":262},[145,7798,440],{"class":258},[145,7800,7801],{"class":159},"\"Starting webhook server...\"",[145,7803,406],{"class":262},[145,7805,7807,7809,7811,7813,7816,7818,7821,7823,7825,7827,7829],{"class":147,"line":7806},96,[145,7808,1102],{"class":155},[145,7810,794],{"class":262},[145,7812,440],{"class":258},[145,7814,7815],{"class":159},"\"Videos will be saved to: ",[145,7817,685],{"class":155},[145,7819,7820],{"class":262},"os.path.abspath(",[145,7822,6803],{"class":155},[145,7824,108],{"class":262},[145,7826,691],{"class":155},[145,7828,449],{"class":159},[145,7830,406],{"class":262},[145,7832,7834,7836,7838,7840,7843],{"class":147,"line":7833},97,[145,7835,1102],{"class":155},[145,7837,794],{"class":262},[145,7839,440],{"class":258},[145,7841,7842],{"class":159},"\"Webhook URL: http://localhost:5000/api/webhook/seedance\"",[145,7844,406],{"class":262},[145,7846,7848,7851,7854,7856,7859,7861,7864,7866,7869,7871,7874,7876,7878],{"class":147,"line":7847},98,[145,7849,7850],{"class":262},"    app.run(",[145,7852,7853],{"class":701},"host",[145,7855,266],{"class":258},[145,7857,7858],{"class":159},"\"0.0.0.0\"",[145,7860,400],{"class":262},[145,7862,7863],{"class":701},"port",[145,7865,266],{"class":258},[145,7867,7868],{"class":155},"5000",[145,7870,400],{"class":262},[145,7872,7873],{"class":701},"debug",[145,7875,266],{"class":258},[145,7877,1139],{"class":155},[145,7879,406],{"class":262},[11,7881,7882],{},"Install dependencies and run:",[136,7884,7886],{"className":138,"code":7885,"language":140,"meta":141,"style":141},"pip install flask requests\npython webhook_server.py\n",[28,7887,7888,7899],{"__ignoreMap":141},[145,7889,7890,7892,7894,7897],{"class":147,"line":148},[145,7891,190],{"class":151},[145,7893,193],{"class":159},[145,7895,7896],{"class":159}," flask",[145,7898,328],{"class":159},[145,7900,7901,7903],{"class":147,"line":166},[145,7902,340],{"class":151},[145,7904,7905],{"class":159}," webhook_server.py\n",[11,7907,7908],{},"Key design decisions in this server:",[97,7910,7911,7921,7931],{},[73,7912,7913,7916,7917,7920],{},[23,7914,7915],{},"Background downloads"," — We spawn a thread to download the video so the webhook handler returns ",[28,7918,7919],{},"200"," immediately. The API expects a response within 10 seconds; video downloads can take longer.",[73,7922,7923,7926,7927,7930],{},[23,7924,7925],{},"Health check endpoint"," — ",[28,7928,7929],{},"/health"," is useful when deploying behind a load balancer (ALB, nginx, etc.).",[73,7932,7933,7936],{},[23,7934,7935],{},"Error logging"," — Failed tasks are printed with the full error payload. In production, pipe this to Sentry, Datadog, or your logging stack.",[92,7938,7940],{"id":7939},"exposing-localhost-with-ngrok","Exposing Localhost with ngrok",[11,7942,7943,7944,7949],{},"For local development, use ",[37,7945,7948],{"href":7946,"rel":7947},"https://ngrok.com",[41],"ngrok"," to create a public HTTPS URL that tunnels to your local server:",[136,7951,7953],{"className":138,"code":7952,"language":140,"meta":141,"style":141},"# Install ngrok (macOS)\nbrew install ngrok\n\n# Or download from https://ngrok.com/download\n\n# Start the tunnel\nngrok http 5000\n",[28,7954,7955,7960,7970,7974,7979,7983,7988],{"__ignoreMap":141},[145,7956,7957],{"class":147,"line":148},[145,7958,7959],{"class":174},"# Install ngrok (macOS)\n",[145,7961,7962,7965,7967],{"class":147,"line":166},[145,7963,7964],{"class":151},"brew",[145,7966,193],{"class":159},[145,7968,7969],{"class":159}," ngrok\n",[145,7971,7972],{"class":147,"line":178},[145,7973,376],{"emptyLinePlaceholder":58},[145,7975,7976],{"class":147,"line":187},[145,7977,7978],{"class":174},"# Or download from https://ngrok.com/download\n",[145,7980,7981],{"class":147,"line":373},[145,7982,376],{"emptyLinePlaceholder":58},[145,7984,7985],{"class":147,"line":379},[145,7986,7987],{"class":174},"# Start the tunnel\n",[145,7989,7990,7992,7995],{"class":147,"line":385},[145,7991,7948],{"class":151},[145,7993,7994],{"class":159}," http",[145,7996,7997],{"class":155}," 5000\n",[11,7999,8000],{},"ngrok outputs something like:",[136,8002,8005],{"className":8003,"code":8004,"language":2185},[2183],"Forwarding  https://a1b2c3d4.ngrok-free.app → http://localhost:5000\n",[28,8006,8004],{"__ignoreMap":141},[11,8008,8009,8010,8012],{},"Use that HTTPS URL as your ",[28,8011,3601],{},":",[136,8014,8016],{"className":338,"code":8015,"language":340,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"Your prompt here\",\n    \"callback_url\": \"https://a1b2c3d4.ngrok-free.app/api/webhook/seedance\"\n}\n",[28,8017,8018,8026,8036,8047,8056],{"__ignoreMap":141},[145,8019,8020,8022,8024],{"class":147,"line":148},[145,8021,3661],{"class":262},[145,8023,266],{"class":258},[145,8025,428],{"class":262},[145,8027,8028,8030,8032,8034],{"class":147,"line":166},[145,8029,3670],{"class":159},[145,8031,437],{"class":262},[145,8033,1308],{"class":159},[145,8035,452],{"class":262},[145,8037,8038,8040,8042,8045],{"class":147,"line":178},[145,8039,3681],{"class":159},[145,8041,437],{"class":262},[145,8043,8044],{"class":159},"\"Your prompt here\"",[145,8046,452],{"class":262},[145,8048,8049,8051,8053],{"class":147,"line":187},[145,8050,6511],{"class":159},[145,8052,437],{"class":262},[145,8054,8055],{"class":159},"\"https://a1b2c3d4.ngrok-free.app/api/webhook/seedance\"\n",[145,8057,8058],{"class":147,"line":373},[145,8059,469],{"class":262},[18,8061,8062],{},[11,8063,8064,8066,8067,8070,8071,8074],{},[23,8065,304],{}," Using the ",[28,8068,8069],{},"http://"," ngrok URL instead of ",[28,8072,8073],{},"https://",". The Seedance API requires HTTPS for webhooks — it will reject plain HTTP callback URLs with a 400 error.",[92,8076,8078],{"id":8077},"webhook-security","Webhook Security",[11,8080,8081],{},"In production, validate that webhook requests actually come from the EvoLink API:",[136,8083,8085],{"className":338,"code":8084,"language":340,"meta":141,"style":141},"import hmac\nimport hashlib\n\ndef verify_webhook(request):\n    \"\"\"Verify webhook authenticity using the task ID pattern.\"\"\"\n    task = request.json\n    task_id = task.get(\"id\", \"\")\n    \n    # EvoLink task IDs follow a specific format\n    if not task_id.startswith(\"task-unified-\"):\n        return False\n    \n    # Additional validation: check required fields exist\n    required_fields = [\"id\", \"status\", \"model\", \"created\"]\n    if not all(field in task for field in required_fields):\n        return False\n    \n    return True\n",[28,8086,8087,8094,8101,8105,8115,8120,8128,8144,8148,8153,8167,8174,8178,8183,8210,8238,8244,8248],{"__ignoreMap":141},[145,8088,8089,8091],{"class":147,"line":148},[145,8090,347],{"class":258},[145,8092,8093],{"class":262}," hmac\n",[145,8095,8096,8098],{"class":147,"line":166},[145,8097,347],{"class":258},[145,8099,8100],{"class":262}," hashlib\n",[145,8102,8103],{"class":147,"line":178},[145,8104,376],{"emptyLinePlaceholder":58},[145,8106,8107,8109,8112],{"class":147,"line":187},[145,8108,526],{"class":258},[145,8110,8111],{"class":151}," verify_webhook",[145,8113,8114],{"class":262},"(request):\n",[145,8116,8117],{"class":147,"line":373},[145,8118,8119],{"class":159},"    \"\"\"Verify webhook authenticity using the task ID pattern.\"\"\"\n",[145,8121,8122,8124,8126],{"class":147,"line":379},[145,8123,1496],{"class":262},[145,8125,266],{"class":258},[145,8127,7179],{"class":262},[145,8129,8130,8132,8134,8136,8138,8140,8142],{"class":147,"line":385},[145,8131,7218],{"class":262},[145,8133,266],{"class":258},[145,8135,775],{"class":262},[145,8137,1626],{"class":159},[145,8139,400],{"class":262},[145,8141,5266],{"class":159},[145,8143,406],{"class":262},[145,8145,8146],{"class":147,"line":409},[145,8147,563],{"class":262},[145,8149,8150],{"class":147,"line":420},[145,8151,8152],{"class":174},"    # EvoLink task IDs follow a specific format\n",[145,8154,8155,8157,8159,8162,8165],{"class":147,"line":431},[145,8156,2506],{"class":258},[145,8158,5892],{"class":258},[145,8160,8161],{"class":262}," task_id.startswith(",[145,8163,8164],{"class":159},"\"task-unified-\"",[145,8166,548],{"class":262},[145,8168,8169,8171],{"class":147,"line":455},[145,8170,7193],{"class":258},[145,8172,8173],{"class":155}," False\n",[145,8175,8176],{"class":147,"line":466},[145,8177,563],{"class":262},[145,8179,8180],{"class":147,"line":600},[145,8181,8182],{"class":174},"    # Additional validation: check required fields exist\n",[145,8184,8185,8188,8190,8193,8195,8197,8199,8201,8203,8205,8208],{"class":147,"line":605},[145,8186,8187],{"class":262},"    required_fields ",[145,8189,266],{"class":258},[145,8191,8192],{"class":262}," [",[145,8194,1626],{"class":159},[145,8196,400],{"class":262},[145,8198,761],{"class":159},[145,8200,400],{"class":262},[145,8202,5898],{"class":159},[145,8204,400],{"class":262},[145,8206,8207],{"class":159},"\"created\"",[145,8209,764],{"class":262},[145,8211,8212,8214,8216,8219,8222,8224,8227,8230,8233,8235],{"class":147,"line":611},[145,8213,2506],{"class":258},[145,8215,5892],{"class":258},[145,8217,8218],{"class":155}," all",[145,8220,8221],{"class":262},"(field ",[145,8223,1180],{"class":258},[145,8225,8226],{"class":262}," task ",[145,8228,8229],{"class":258},"for",[145,8231,8232],{"class":262}," field ",[145,8234,1180],{"class":258},[145,8236,8237],{"class":262}," required_fields):\n",[145,8239,8240,8242],{"class":147,"line":617},[145,8241,7193],{"class":258},[145,8243,8173],{"class":155},[145,8245,8246],{"class":147,"line":623},[145,8247,563],{"class":262},[145,8249,8250,8252],{"class":147,"line":628},[145,8251,1703],{"class":258},[145,8253,6413],{"class":155},[92,8255,8257],{"id":8256},"when-to-use-webhooks-vs-polling","When to Use Webhooks vs Polling",[2036,8259,8260,8273],{},[2039,8261,8262],{},[2042,8263,8264,8267,8270],{},[2045,8265,8266],{},"Scenario",[2045,8268,8269],{},"Recommendation",[2045,8271,8272],{},"Why",[2052,8274,8275,8286,8297,8308,8318,8328],{},[2042,8276,8277,8280,8283],{},[2057,8278,8279],{},"Quick prototyping / scripts",[2057,8281,8282],{},"Polling",[2057,8284,8285],{},"Simpler, no server needed",[2042,8287,8288,8291,8294],{},[2057,8289,8290],{},"Production web app",[2057,8292,8293],{},"Webhooks",[2057,8295,8296],{},"Scalable, no wasted requests",[2042,8298,8299,8302,8305],{},[2057,8300,8301],{},"Batch processing (100+ videos)",[2057,8303,8304],{},"Webhooks + queue",[2057,8306,8307],{},"Submit all, process as they complete",[2042,8309,8310,8313,8315],{},[2057,8311,8312],{},"CLI tools",[2057,8314,8282],{},[2057,8316,8317],{},"No server infrastructure required",[2042,8319,8320,8323,8325],{},[2057,8321,8322],{},"Mobile app backend",[2057,8324,8293],{},[2057,8326,8327],{},"Push notifications to users on completion",[2042,8329,8330,8333,8335],{},[2057,8331,8332],{},"Serverless (Lambda/Cloud Functions)",[2057,8334,8293],{},[2057,8336,8337],{},"Perfect fit — function triggered per completion",[18,8339,8340],{},[11,8341,8342,8344],{},[23,8343,133],{}," For batch processing, combine webhooks with a message queue (Redis, RabbitMQ, SQS). Submit all generation requests, then process completions as they arrive on the queue. This decouples submission from processing and handles retries gracefully.",[45,8346],{},[48,8348,8350],{"id":8349},"batch-processing-generate-multiple-videos","Batch Processing: Generate Multiple Videos",[11,8352,8353],{},"Real-world use cases often involve generating many videos. Here's a pattern for batch processing with rate limiting:",[11,8355,8356],{},[2619,8357,8358],{},"Uses the same setup and helper functions from the first example above.",[136,8360,8362],{"className":338,"code":8361,"language":340,"meta":141,"style":141},"import concurrent.futures\n\ndef batch_generate(prompts, max_concurrent=3):\n    \"\"\"\n    Generate multiple videos with controlled concurrency.\n    \n    Args:\n        prompts: List of prompt strings.\n        max_concurrent: Maximum simultaneous generations.\n    \n    Returns:\n        List of (prompt, result_or_error) tuples.\n    \"\"\"\n    results = []\n    \n    def generate_one(prompt, index):\n        \"\"\"Generate a single video and return the result.\"\"\"\n        payload = {\n            \"model\": \"seedance-2.0\",\n            \"prompt\": prompt,\n            \"duration\": 5,\n            \"quality\": \"720p\"\n        }\n        try:\n            task = generate_video_with_retry(payload)\n            print(f\"[{index}] Submitted: {task['id']}\")\n            result = wait_for_video(task[\"id\"])\n            video_url = result[\"results\"][0]\n            download_video(video_url, f\"batch_{index}.mp4\")\n            return (prompt, result)\n        except Exception as e:\n            print(f\"[{index}] Failed: {e}\")\n            return (prompt, str(e))\n    \n    # Process in batches to respect rate limits\n    with concurrent.futures.ThreadPoolExecutor(max_workers=max_concurrent) as executor:\n        futures = {\n            executor.submit(generate_one, prompt, i): i\n            for i, prompt in enumerate(prompts)\n        }\n        for future in concurrent.futures.as_completed(futures):\n            results.append(future.result())\n    \n    # Summary\n    succeeded = sum(1 for _, r in results if isinstance(r, dict))\n    print(f\"\\nBatch complete: {succeeded}/{len(prompts)} succeeded\")\n    return results\n\n\n# Example usage\nprompts = [\n    \"A hummingbird hovering near a red flower. Macro lens, shallow depth of field.\",\n    \"Ocean waves crashing on volcanic rocks at sunset. Slow motion.\",\n    \"A street musician playing violin in the rain. Cinematic lighting.\",\n]\nbatch_generate(prompts, max_concurrent=2)\n",[28,8363,8364,8371,8375,8391,8395,8400,8404,8408,8413,8418,8422,8426,8431,8435,8444,8448,8459,8464,8473,8484,8492,8503,8513,8518,8524,8534,8569,8582,8598,8618,8625,8635,8664,8677,8681,8686,8706,8715,8720,8734,8738,8750,8755,8759,8764,8802,8838,8845,8849,8853,8858,8868,8875,8882,8889,8893],{"__ignoreMap":141},[145,8365,8366,8368],{"class":147,"line":148},[145,8367,347],{"class":258},[145,8369,8370],{"class":262}," concurrent.futures\n",[145,8372,8373],{"class":147,"line":166},[145,8374,376],{"emptyLinePlaceholder":58},[145,8376,8377,8379,8382,8385,8387,8389],{"class":147,"line":178},[145,8378,526],{"class":258},[145,8380,8381],{"class":151}," batch_generate",[145,8383,8384],{"class":262},"(prompts, max_concurrent",[145,8386,266],{"class":258},[145,8388,5056],{"class":155},[145,8390,548],{"class":262},[145,8392,8393],{"class":147,"line":187},[145,8394,553],{"class":159},[145,8396,8397],{"class":147,"line":373},[145,8398,8399],{"class":159},"    Generate multiple videos with controlled concurrency.\n",[145,8401,8402],{"class":147,"line":379},[145,8403,563],{"class":159},[145,8405,8406],{"class":147,"line":385},[145,8407,568],{"class":159},[145,8409,8410],{"class":147,"line":409},[145,8411,8412],{"class":159},"        prompts: List of prompt strings.\n",[145,8414,8415],{"class":147,"line":420},[145,8416,8417],{"class":159},"        max_concurrent: Maximum simultaneous generations.\n",[145,8419,8420],{"class":147,"line":431},[145,8421,563],{"class":159},[145,8423,8424],{"class":147,"line":455},[145,8425,592],{"class":159},[145,8427,8428],{"class":147,"line":466},[145,8429,8430],{"class":159},"        List of (prompt, result_or_error) tuples.\n",[145,8432,8433],{"class":147,"line":600},[145,8434,553],{"class":159},[145,8436,8437,8440,8442],{"class":147,"line":605},[145,8438,8439],{"class":262},"    results ",[145,8441,266],{"class":258},[145,8443,5876],{"class":262},[145,8445,8446],{"class":147,"line":611},[145,8447,563],{"class":262},[145,8449,8450,8453,8456],{"class":147,"line":617},[145,8451,8452],{"class":258},"    def",[145,8454,8455],{"class":151}," generate_one",[145,8457,8458],{"class":262},"(prompt, index):\n",[145,8460,8461],{"class":147,"line":623},[145,8462,8463],{"class":159},"        \"\"\"Generate a single video and return the result.\"\"\"\n",[145,8465,8466,8469,8471],{"class":147,"line":628},[145,8467,8468],{"class":262},"        payload ",[145,8470,266],{"class":258},[145,8472,428],{"class":262},[145,8474,8475,8478,8480,8482],{"class":147,"line":639},[145,8476,8477],{"class":159},"            \"model\"",[145,8479,437],{"class":262},[145,8481,1308],{"class":159},[145,8483,452],{"class":262},[145,8485,8486,8489],{"class":147,"line":654},[145,8487,8488],{"class":159},"            \"prompt\"",[145,8490,8491],{"class":262},": prompt,\n",[145,8493,8494,8497,8499,8501],{"class":147,"line":660},[145,8495,8496],{"class":159},"            \"duration\"",[145,8498,437],{"class":262},[145,8500,1352],{"class":155},[145,8502,452],{"class":262},[145,8504,8505,8508,8510],{"class":147,"line":671},[145,8506,8507],{"class":159},"            \"quality\"",[145,8509,437],{"class":262},[145,8511,8512],{"class":159},"\"720p\"\n",[145,8514,8515],{"class":147,"line":698},[145,8516,8517],{"class":262},"        }\n",[145,8519,8520,8522],{"class":147,"line":710},[145,8521,5135],{"class":258},[145,8523,860],{"class":262},[145,8525,8526,8529,8531],{"class":147,"line":716},[145,8527,8528],{"class":262},"            task ",[145,8530,266],{"class":258},[145,8532,8533],{"class":262}," generate_video_with_retry(payload)\n",[145,8535,8536,8538,8540,8542,8545,8547,8550,8552,8555,8557,8559,8561,8563,8565,8567],{"class":147,"line":722},[145,8537,5577],{"class":155},[145,8539,794],{"class":262},[145,8541,440],{"class":258},[145,8543,8544],{"class":159},"\"[",[145,8546,685],{"class":155},[145,8548,8549],{"class":262},"index",[145,8551,691],{"class":155},[145,8553,8554],{"class":159},"] Submitted: ",[145,8556,685],{"class":155},[145,8558,1529],{"class":262},[145,8560,1532],{"class":159},[145,8562,1535],{"class":262},[145,8564,691],{"class":155},[145,8566,449],{"class":159},[145,8568,406],{"class":262},[145,8570,8571,8574,8576,8578,8580],{"class":147,"line":728},[145,8572,8573],{"class":262},"            result ",[145,8575,266],{"class":258},[145,8577,1623],{"class":262},[145,8579,1626],{"class":159},[145,8581,1629],{"class":262},[145,8583,8584,8586,8588,8590,8592,8594,8596],{"class":147,"line":739},[145,8585,7404],{"class":262},[145,8587,266],{"class":258},[145,8589,1648],{"class":262},[145,8591,1651],{"class":159},[145,8593,1562],{"class":262},[145,8595,783],{"class":155},[145,8597,764],{"class":262},[145,8599,8600,8603,8605,8608,8610,8612,8614,8616],{"class":147,"line":744},[145,8601,8602],{"class":262},"            download_video(video_url, ",[145,8604,440],{"class":258},[145,8606,8607],{"class":159},"\"batch_",[145,8609,685],{"class":155},[145,8611,8549],{"class":262},[145,8613,691],{"class":155},[145,8615,6892],{"class":159},[145,8617,406],{"class":262},[145,8619,8620,8622],{"class":147,"line":750},[145,8621,866],{"class":258},[145,8623,8624],{"class":262}," (prompt, result)\n",[145,8626,8627,8629,8631,8633],{"class":147,"line":767},[145,8628,5534],{"class":258},[145,8630,7062],{"class":155},[145,8632,7065],{"class":258},[145,8634,5652],{"class":262},[145,8636,8637,8639,8641,8643,8645,8647,8649,8651,8654,8656,8658,8660,8662],{"class":147,"line":788},[145,8638,5577],{"class":155},[145,8640,794],{"class":262},[145,8642,440],{"class":258},[145,8644,8544],{"class":159},[145,8646,685],{"class":155},[145,8648,8549],{"class":262},[145,8650,691],{"class":155},[145,8652,8653],{"class":159},"] Failed: ",[145,8655,685],{"class":155},[145,8657,5702],{"class":262},[145,8659,691],{"class":155},[145,8661,449],{"class":159},[145,8663,406],{"class":262},[145,8665,8666,8668,8671,8674],{"class":147,"line":834},[145,8667,866],{"class":258},[145,8669,8670],{"class":262}," (prompt, ",[145,8672,8673],{"class":155},"str",[145,8675,8676],{"class":262},"(e))\n",[145,8678,8679],{"class":147,"line":839},[145,8680,563],{"class":262},[145,8682,8683],{"class":147,"line":845},[145,8684,8685],{"class":174},"    # Process in batches to respect rate limits\n",[145,8687,8688,8690,8693,8696,8698,8701,8703],{"class":147,"line":863},[145,8689,1151],{"class":258},[145,8691,8692],{"class":262}," concurrent.futures.ThreadPoolExecutor(",[145,8694,8695],{"class":701},"max_workers",[145,8697,266],{"class":258},[145,8699,8700],{"class":262},"max_concurrent) ",[145,8702,1166],{"class":258},[145,8704,8705],{"class":262}," executor:\n",[145,8707,8708,8711,8713],{"class":147,"line":872},[145,8709,8710],{"class":262},"        futures ",[145,8712,266],{"class":258},[145,8714,428],{"class":262},[145,8716,8717],{"class":147,"line":887},[145,8718,8719],{"class":262},"            executor.submit(generate_one, prompt, i): i\n",[145,8721,8722,8724,8727,8729,8731],{"class":147,"line":903},[145,8723,6978],{"class":258},[145,8725,8726],{"class":262}," i, prompt ",[145,8728,1180],{"class":258},[145,8730,6291],{"class":155},[145,8732,8733],{"class":262},"(prompts)\n",[145,8735,8736],{"class":147,"line":915},[145,8737,8517],{"class":262},[145,8739,8740,8742,8745,8747],{"class":147,"line":953},[145,8741,1174],{"class":258},[145,8743,8744],{"class":262}," future ",[145,8746,1180],{"class":258},[145,8748,8749],{"class":262}," concurrent.futures.as_completed(futures):\n",[145,8751,8752],{"class":147,"line":959},[145,8753,8754],{"class":262},"            results.append(future.result())\n",[145,8756,8757],{"class":147,"line":964},[145,8758,563],{"class":262},[145,8760,8761],{"class":147,"line":970},[145,8762,8763],{"class":174},"    # Summary\n",[145,8765,8766,8769,8771,8774,8776,8778,8780,8783,8785,8788,8790,8793,8796,8799],{"class":147,"line":976},[145,8767,8768],{"class":262},"    succeeded ",[145,8770,266],{"class":258},[145,8772,8773],{"class":155}," sum",[145,8775,794],{"class":262},[145,8777,5437],{"class":155},[145,8779,6394],{"class":258},[145,8781,8782],{"class":262}," _, r ",[145,8784,1180],{"class":258},[145,8786,8787],{"class":262}," results ",[145,8789,1719],{"class":258},[145,8791,8792],{"class":155}," isinstance",[145,8794,8795],{"class":262},"(r, ",[145,8797,8798],{"class":155},"dict",[145,8800,8801],{"class":262},"))\n",[145,8803,8804,8806,8808,8810,8812,8814,8817,8819,8822,8824,8826,8828,8831,8833,8836],{"class":147,"line":988},[145,8805,1102],{"class":155},[145,8807,794],{"class":262},[145,8809,440],{"class":258},[145,8811,449],{"class":159},[145,8813,1670],{"class":155},[145,8815,8816],{"class":159},"Batch complete: ",[145,8818,685],{"class":155},[145,8820,8821],{"class":262},"succeeded",[145,8823,691],{"class":155},[145,8825,1226],{"class":159},[145,8827,6270],{"class":155},[145,8829,8830],{"class":262},"(prompts)",[145,8832,691],{"class":155},[145,8834,8835],{"class":159}," succeeded\"",[145,8837,406],{"class":262},[145,8839,8840,8842],{"class":147,"line":993},[145,8841,1703],{"class":258},[145,8843,8844],{"class":262}," results\n",[145,8846,8847],{"class":147,"line":5531},[145,8848,376],{"emptyLinePlaceholder":58},[145,8850,8851],{"class":147,"line":5540},[145,8852,376],{"emptyLinePlaceholder":58},[145,8854,8855],{"class":147,"line":5546},[145,8856,8857],{"class":174},"# Example usage\n",[145,8859,8860,8863,8865],{"class":147,"line":5574},[145,8861,8862],{"class":262},"prompts ",[145,8864,266],{"class":258},[145,8866,8867],{"class":262}," [\n",[145,8869,8870,8873],{"class":147,"line":5605},[145,8871,8872],{"class":159},"    \"A hummingbird hovering near a red flower. Macro lens, shallow depth of field.\"",[145,8874,452],{"class":262},[145,8876,8877,8880],{"class":147,"line":5625},[145,8878,8879],{"class":159},"    \"Ocean waves crashing on volcanic rocks at sunset. Slow motion.\"",[145,8881,452],{"class":262},[145,8883,8884,8887],{"class":147,"line":5631},[145,8885,8886],{"class":159},"    \"A street musician playing violin in the rain. Cinematic lighting.\"",[145,8888,452],{"class":262},[145,8890,8891],{"class":147,"line":5637},[145,8892,764],{"class":262},[145,8894,8895,8898,8901,8903,8905],{"class":147,"line":5642},[145,8896,8897],{"class":262},"batch_generate(prompts, ",[145,8899,8900],{"class":701},"max_concurrent",[145,8902,266],{"class":258},[145,8904,5418],{"class":155},[145,8906,406],{"class":262},[11,8908,8909],{},"Key considerations for batch processing:",[97,8911,8912,8920,8926],{},[73,8913,8914,8919],{},[23,8915,8916],{},[28,8917,8918],{},"max_concurrent=3"," — Don't submit too many requests simultaneously. Start with 2–3 and increase based on your rate limits.",[73,8921,8922,8925],{},[23,8923,8924],{},"ThreadPoolExecutor"," — Uses threads (not processes) because we're I/O-bound (waiting for API responses), not CPU-bound.",[73,8927,8928,8931],{},[23,8929,8930],{},"Error isolation"," — Each video generation is independent. One failure doesn't stop the batch.",[45,8933],{},[48,8935,8937],{"id":8936},"whats-next","What's Next",[11,8939,8940],{},"You've covered the fundamentals — text-to-video, image-to-video, async polling, webhooks, error handling, and batch processing. Here's where to go deeper:",[92,8942,8944],{"id":8943},"explore-advanced-features","Explore Advanced Features",[97,8946,8947,8955,8962,8970,8978],{},[73,8948,8949,8954],{},[23,8950,8951],{},[37,8952,8953],{"href":2966},"@Tags Multimodal Reference Guide"," — Master the @Image, @Video, @Audio reference system for multi-modal generation",[73,8956,8957,8961],{},[23,8958,8959],{},[37,8960,3857],{"href":3856}," — Replicate Hitchcock zooms, one-take tracking shots, and orbital cameras programmatically",[73,8963,8964,8969],{},[23,8965,8966],{},[37,8967,8968],{"href":3381},"Image-to-Video Deep Dive"," — First-last frame control, multi-image composition, e-commerce product videos",[73,8971,8972,8977],{},[23,8973,8974],{},[37,8975,8976],{"href":2613},"E-commerce Product Video Guide"," — Turn product photos into marketing videos at scale",[73,8979,8980,8984],{},[23,8981,8982],{},[37,8983,1767],{"href":1766}," — Shot-script format, timing syntax, and the prompts behind our demo videos",[92,8986,8988],{"id":8987},"reference-docs","Reference Docs",[97,8990,8991,8997,9004],{},[73,8992,8993],{},[37,8994,8996],{"href":1258,"rel":8995},[41],"Video Generation API Reference",[73,8998,8999],{},[37,9000,9003],{"href":9001,"rel":9002},"https://seedance2api.app/docs/multimodal-reference",[41],"Multimodal Reference Specs",[73,9005,9006],{},[37,9007,9010],{"href":9008,"rel":9009},"https://seedance2api.app/docs/sdks",[41],"Python & Node.js SDKs",[92,9012,9014],{"id":9013},"build-something","Build Something",[11,9016,9017],{},"Combine what you've learned. Here are a few project ideas:",[97,9019,9020,9029,9035,9044],{},[73,9021,9022,9025,9026,108],{},[23,9023,9024],{},"Automated product video pipeline"," — Upload product photos, generate marketing videos in bulk (see our ",[37,9027,9028],{"href":2613},"E-commerce Video Guide",[73,9030,9031,9034],{},[23,9032,9033],{},"Social media content engine"," — Generate short-form vertical videos from text briefs, post directly to TikTok/Reels",[73,9036,9037,9040,9041],{},[23,9038,9039],{},"Storyboard-to-video tool"," — Turn sequential images into animated scenes with ",[37,9042,9043],{"href":3856},"camera movement control",[73,9045,9046,9049],{},[23,9047,9048],{},"AI video editing pipeline"," — Use Seedance 2.0's video extension to create longer narratives from shorter clips",[11,9051,9052],{},[23,9053,9054,9055,9059],{},"Ready to build? ",[37,9056,9058],{"href":39,"rel":9057},[41],"Get your free EvoLink API key"," and start generating videos today.",[45,9061],{},[48,9063,9065],{"id":9064},"frequently-asked-questions","Frequently Asked Questions",[92,9067,9069],{"id":9068},"how-long-does-seedance-20-video-generation-take","How long does Seedance 2.0 video generation take?",[11,9071,9072,9073,9075],{},"Typically 30–120 seconds depending on duration and quality settings. A 5-second 720p video completes in about 50 seconds. A 15-second 1080p video can take 2–3 minutes. The API returns an ",[28,9074,2105],{}," field with each task so you can set appropriate timeouts. During peak hours, queue wait times may add 10–30 seconds to the total.",[92,9077,9079],{"id":9078},"what-image-formats-does-the-seedance-20-api-accept","What image formats does the Seedance 2.0 API accept?",[11,9081,9082,9083,9085],{},"JPEG, PNG, WebP, BMP, TIFF, and GIF. Each image must be under 30 MB. You can pass up to 9 images per request via the ",[28,9084,2896],{}," parameter. Images must be publicly accessible URLs — the API fetches them directly. For best results, use images that are at least 720px on the shorter side. Very low-resolution images (below 256px) may produce blurry animations.",[92,9087,9089],{"id":9088},"can-i-generate-videos-longer-than-15-seconds","Can I generate videos longer than 15 seconds?",[11,9091,9092,9093,9095],{},"The maximum single generation is 15 seconds. For longer content, generate multiple clips and concatenate them using FFmpeg or any video editor. Seedance 2.0 supports video extension — you can use a generated video's last frame as the first frame of the next generation to create seamless continuity. Here's the basic approach: generate clip 1, extract the last frame, pass it as ",[28,9094,2994],{}," for clip 2.",[92,9097,9099],{"id":9098},"how-much-does-seedance-20-api-cost-through-evolink","How much does Seedance 2.0 API cost through EvoLink?",[11,9101,9102,9103,9107,9108,9110],{},"Pricing is based on video duration and quality tier. A 5-second 720p video costs approximately 18 credits. EvoLink provides ",[37,9104,9106],{"href":211,"rel":9105},[41],"smart routing"," that can reduce costs compared to direct API access. Check your dashboard for current per-second rates. The ",[28,9109,2115],{}," field in the API response shows the exact cost before generation begins — you'll never be charged more than that amount.",[92,9112,9114],{"id":9113},"whats-the-difference-between-seedance-15-pro-and-seedance-20","What's the difference between seedance-1.5-pro and seedance-2.0?",[11,9116,9117,9118,9120,9121,9123,9124,9128],{},"Seedance 2.0 adds multimodal references (mix images, videos, and audio as inputs), native audio generation, improved physics and consistency, and video editing capabilities. The API interface is identical — same endpoint, same parameters, same response format. You can test with ",[28,9119,30],{}," today and switch to ",[28,9122,1751],{}," by changing the model name. Key 1.5 limitations: single image input only (no @Image2–9), no video/audio references, no native audio generation. See the ",[37,9125,9127],{"href":9126},"/blog/seedance-2-vs-sora-2-api-comparison","Seedance 2.0 vs Sora 2 comparison"," for benchmarks.",[92,9130,9132],{"id":9131},"how-do-i-handle-the-content-rejected-by-safety-filter-error","How do I handle the \"content rejected by safety filter\" error?",[11,9134,9135,9136,9138,9139,9142],{},"The content moderation system rejects prompts involving realistic violence, explicit content, and real public figures. It also rejects realistic human face images uploaded via ",[28,9137,2896],{},". To work around face restrictions, use illustrated, stylized, or anime-style character images. For prompt rejections, rephrase to be less specific about restricted topics. The error response includes ",[28,9140,9141],{},"type: \"content_policy_violation\""," — check for this in your error handling code to give users a clear message.",[92,9144,9146],{"id":9145},"can-i-use-the-seedance-api-in-a-nodejs-javascript-project","Can I use the Seedance API in a Node.js / JavaScript project?",[11,9148,9149,9150,280,9153,9156,9157,9161],{},"Yes. The REST API is language-agnostic — any HTTP client works. The concepts in this tutorial (async polling, webhooks, error handling) apply directly to Node.js with ",[28,9151,9152],{},"fetch",[28,9154,9155],{},"axios",". EvoLink also provides official ",[37,9158,9160],{"href":9008,"rel":9159},[41],"Node.js and Python SDKs"," that handle polling and retries for you.",[92,9163,9165],{"id":9164},"what-happens-if-my-webhook-server-is-down-when-the-video-completes","What happens if my webhook server is down when the video completes?",[11,9167,9168,9169,9172],{},"The API retries webhook delivery 3 times with increasing intervals (1s, 2s, 4s). If all 3 retries fail, the webhook is abandoned — but the video is still available. You can always fall back to polling with ",[28,9170,9171],{},"GET /v1/tasks/{task_id}"," to retrieve the result. For this reason, it's good practice to store the task ID on submission and have a background job that periodically checks for any tasks that completed but weren't received via webhook.",[92,9174,9176],{"id":9175},"is-there-a-rate-limit-on-api-requests","Is there a rate limit on API requests?",[11,9178,9179,9180,9182,9183,9187,9188,9192],{},"Yes. The default rate limit is generous for development and moderate production use. If you hit a ",[28,9181,4938],{}," error, implement exponential backoff as shown in the ",[37,9184,9186],{"href":9185},"#handle-errors-gracefully","error handling section",". For high-volume use cases (thousands of videos per day), contact ",[37,9189,9191],{"href":211,"rel":9190},[41],"EvoLink support"," to discuss custom rate limits and dedicated capacity.",[92,9194,9196],{"id":9195},"can-i-use-seedance-20-for-commercial-projects","Can I use Seedance 2.0 for commercial projects?",[11,9198,9199,9200,9204],{},"Yes. Videos generated through the EvoLink API are licensed for commercial use. You own the output and can use it in products, marketing materials, client deliverables, and published content. See the ",[37,9201,9203],{"href":9202},"/blog/seedance-2-copyright-api-guide","Seedance 2.0 copyright guide"," for detailed licensing terms and best practices for commercial use.",[45,9206],{},[48,9208,9210],{"id":9209},"complete-script","Complete Script",[11,9212,9213],{},"Here's the full tutorial code in a single file — copy, paste, add your API key, and run:",[136,9215,9217],{"className":338,"code":9216,"language":340,"meta":141,"style":141},"\"\"\"\nSeedance 2.0 API Tutorial — Complete Script\nDocs: https://seedance2api.app/docs/video-generation\nAPI Key: https://evolink.ai/early-access\n\"\"\"\nimport requests\nimport time\nimport os\nimport json\nimport random\n\n# ── Configuration ─────────────────────────────────────────────\nAPI_KEY = os.getenv(\"EVOLINK_API_KEY\", \"sk-your-api-key-here\")\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\n\n# ── Reusable Helpers ──────────────────────────────────────────\ndef wait_for_video(task_id, poll_interval=10, timeout=600):\n    \"\"\"Poll a video generation task until completion.\"\"\"\n    elapsed = 0\n    while elapsed \u003C timeout:\n        response = requests.get(\n            f\"{BASE_URL}/tasks/{task_id}\",\n            headers=HEADERS\n        )\n        response.raise_for_status()\n        task = response.json()\n        status = task[\"status\"]\n        progress = task.get(\"progress\", 0)\n        print(f\"  [{elapsed}s] Status: {status} | Progress: {progress}%\")\n        if status == \"completed\":\n            return task\n        elif status == \"failed\":\n            raise RuntimeError(f\"Task {task_id} failed: {task}\")\n        time.sleep(poll_interval)\n        elapsed += poll_interval\n    raise TimeoutError(f\"Task {task_id} timed out after {timeout}s\")\n\n\ndef download_video(url, filename=\"output.mp4\"):\n    \"\"\"Download a video file from a URL.\"\"\"\n    print(f\"Downloading to {filename}...\")\n    resp = requests.get(url, stream=True)\n    resp.raise_for_status()\n    with open(filename, \"wb\") as f:\n        for chunk in resp.iter_content(chunk_size=8192):\n            f.write(chunk)\n    print(f\"Saved: {filename} ({os.path.getsize(filename) / 1024:.0f} KB)\")\n\n\ndef generate_video_with_retry(payload, max_retries=3):\n    \"\"\"Submit a generation request with retry for transient errors.\"\"\"\n    for attempt in range(max_retries):\n        try:\n            response = requests.post(\n                f\"{BASE_URL}/videos/generations\",\n                headers=HEADERS,\n                json=payload,\n                timeout=30\n            )\n            if response.status_code == 200:\n                return response.json()\n            error = response.json().get(\"error\", {})\n            if response.status_code in (400, 401, 402, 404, 413, 422):\n                raise ValueError(\n                    f\"API error {response.status_code}: \"\n                    f\"{error.get('message', 'Unknown')}\"\n                )\n            if response.status_code in (429, 500, 502, 503):\n                wait = (2 ** attempt) + random.uniform(0, 1)\n                print(f\"  Retry {attempt+1}/{max_retries} after {wait:.1f}s\")\n                time.sleep(wait)\n                continue\n        except requests.exceptions.RequestException:\n            wait = (2 ** attempt) + random.uniform(0, 1)\n            print(f\"  Retry {attempt+1}/{max_retries} after {wait:.1f}s\")\n            time.sleep(wait)\n            continue\n    raise RuntimeError(f\"Failed after {max_retries} retries\")\n\n\ndef validate_payload(payload):\n    \"\"\"Validate generation payload before API call.\"\"\"\n    errors = []\n    if not payload.get(\"model\"):\n        errors.append(\"'model' is required\")\n    if not payload.get(\"prompt\") or not payload[\"prompt\"].strip():\n        errors.append(\"'prompt' is required\")\n    duration = payload.get(\"duration\", 5)\n    if duration \u003C 4 or duration > 15:\n        errors.append(f\"'duration' must be 4-15, got {duration}\")\n    quality = payload.get(\"quality\", \"720p\")\n    if quality not in {\"480p\", \"720p\", \"1080p\"}:\n        errors.append(f\"Invalid quality: {quality}\")\n    if errors:\n        raise ValueError(\"Validation failed:\\n\" + \"\\n\".join(f\"  - {e}\" for e in errors))\n\n\ndef cancel_task(task_id):\n    \"\"\"Cancel a pending or processing task.\"\"\"\n    response = requests.post(\n        f\"{BASE_URL}/tasks/{task_id}/cancel\",\n        headers=HEADERS\n    )\n    if response.status_code == 200:\n        print(f\"Task {task_id} cancelled.\")\n    else:\n        print(f\"Cancel failed: {response.json()}\")\n\n\n# ── Example 1: Text-to-Video ─────────────────────────────────\ndef text_to_video():\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"A golden retriever puppy chases a butterfly through \"\n            \"a sunlit meadow. The camera follows the puppy with a \"\n            \"smooth tracking shot as wildflowers sway in the breeze.\"\n        ),\n        \"duration\": 5,\n        \"quality\": \"720p\",\n        \"aspect_ratio\": \"16:9\",\n        \"generate_audio\": True\n    }\n    validate_payload(payload)\n    task = generate_video_with_retry(payload)\n    print(f\"Task: {task['id']} (ETA: {task['task_info']['estimated_time']}s)\")\n    result = wait_for_video(task[\"id\"])\n    download_video(result[\"results\"][0], \"text_to_video.mp4\")\n\n\n# ── Example 2: Image-to-Video ────────────────────────────────\ndef image_to_video():\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as the first frame. The scene slowly comes \"\n            \"to life — leaves rustle gently, soft light shifts \"\n            \"across the frame.\"\n        ),\n        \"image_urls\": [\"https://example.com/your-image.jpg\"],\n        \"duration\": 5,\n        \"quality\": \"720p\"\n    }\n    validate_payload(payload)\n    task = generate_video_with_retry(payload)\n    print(f\"Task: {task['id']}\")\n    result = wait_for_video(task[\"id\"])\n    download_video(result[\"results\"][0], \"image_to_video.mp4\")\n\n\n# ── Example 3: Vertical Social Media Video ───────────────────\ndef social_media_video():\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"A barista pours latte art in slow motion. \"\n            \"Close-up overhead shot, warm cafe lighting.\"\n        ),\n        \"duration\": 8,\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": \"9:16\",\n        \"generate_audio\": True\n    }\n    validate_payload(payload)\n    task = generate_video_with_retry(payload)\n    print(f\"Task: {task['id']}\")\n    result = wait_for_video(task[\"id\"])\n    download_video(result[\"results\"][0], \"social_video.mp4\")\n\n\nif __name__ == \"__main__\":\n    print(\"=== Text-to-Video ===\")\n    text_to_video()\n    # print(\"\\n=== Image-to-Video ===\")\n    # image_to_video()  # Uncomment and set your image URL\n    # print(\"\\n=== Social Media Video ===\")\n    # social_media_video()\n",[28,9218,9219,9223,9228,9233,9238,9242,9248,9254,9260,9266,9272,9276,9280,9296,9304,9312,9328,9336,9340,9344,9348,9353,9373,9378,9386,9396,9404,9424,9432,9436,9440,9448,9460,9476,9512,9524,9530,9542,9573,9577,9585,9615,9619,9623,9637,9641,9662,9678,9682,9698,9716,9720,9754,9758,9762,9776,9781,9793,9799,9807,9819,9829,9837,9846,9850,9862,9868,9880,9914,9922,9937,9961,9965,9991,10017,10060,10064,10068,10075,10101,10141,10145,10149,10171,10175,10179,10187,10192,10200,10212,10220,10242,10251,10267,10287,10305,10321,10346,10365,10372,10418,10423,10428,10437,10443,10452,10473,10482,10487,10500,10522,10529,10550,10555,10560,10566,10575,10584,10595,10602,10607,10612,10617,10622,10633,10644,10655,10664,10669,10675,10684,10728,10741,10761,10766,10771,10777,10786,10795,10806,10813,10818,10823,10829,10834,10848,10859,10868,10873,10878,10887,10912,10925,10943,10948,10953,10959,10969,10978,10989,10996,11002,11008,11013,11024,11035,11046,11055,11060,11065,11074,11099,11112,11130,11135,11140,11153,11165,11170,11176,11182,11188],{"__ignoreMap":141},[145,9220,9221],{"class":147,"line":148},[145,9222,6704],{"class":159},[145,9224,9225],{"class":147,"line":166},[145,9226,9227],{"class":159},"Seedance 2.0 API Tutorial — Complete Script\n",[145,9229,9230],{"class":147,"line":178},[145,9231,9232],{"class":159},"Docs: https://seedance2api.app/docs/video-generation\n",[145,9234,9235],{"class":147,"line":187},[145,9236,9237],{"class":159},"API Key: https://evolink.ai/early-access\n",[145,9239,9240],{"class":147,"line":373},[145,9241,6704],{"class":159},[145,9243,9244,9246],{"class":147,"line":379},[145,9245,347],{"class":258},[145,9247,328],{"class":262},[145,9249,9250,9252],{"class":147,"line":385},[145,9251,347],{"class":258},[145,9253,356],{"class":262},[145,9255,9256,9258],{"class":147,"line":409},[145,9257,347],{"class":258},[145,9259,363],{"class":262},[145,9261,9262,9264],{"class":147,"line":420},[145,9263,347],{"class":258},[145,9265,370],{"class":262},[145,9267,9268,9270],{"class":147,"line":431},[145,9269,347],{"class":258},[145,9271,5037],{"class":262},[145,9273,9274],{"class":147,"line":455},[145,9275,376],{"emptyLinePlaceholder":58},[145,9277,9278],{"class":147,"line":466},[145,9279,382],{"class":174},[145,9281,9282,9284,9286,9288,9290,9292,9294],{"class":147,"line":600},[145,9283,388],{"class":155},[145,9285,391],{"class":258},[145,9287,394],{"class":262},[145,9289,397],{"class":159},[145,9291,400],{"class":262},[145,9293,403],{"class":159},[145,9295,406],{"class":262},[145,9297,9298,9300,9302],{"class":147,"line":605},[145,9299,412],{"class":155},[145,9301,391],{"class":258},[145,9303,417],{"class":159},[145,9305,9306,9308,9310],{"class":147,"line":611},[145,9307,423],{"class":155},[145,9309,391],{"class":258},[145,9311,428],{"class":262},[145,9313,9314,9316,9318,9320,9322,9324,9326],{"class":147,"line":617},[145,9315,434],{"class":159},[145,9317,437],{"class":262},[145,9319,440],{"class":258},[145,9321,443],{"class":159},[145,9323,446],{"class":155},[145,9325,449],{"class":159},[145,9327,452],{"class":262},[145,9329,9330,9332,9334],{"class":147,"line":623},[145,9331,458],{"class":159},[145,9333,437],{"class":262},[145,9335,463],{"class":159},[145,9337,9338],{"class":147,"line":628},[145,9339,469],{"class":262},[145,9341,9342],{"class":147,"line":639},[145,9343,376],{"emptyLinePlaceholder":58},[145,9345,9346],{"class":147,"line":654},[145,9347,376],{"emptyLinePlaceholder":58},[145,9349,9350],{"class":147,"line":660},[145,9351,9352],{"class":174},"# ── Reusable Helpers ──────────────────────────────────────────\n",[145,9354,9355,9357,9359,9361,9363,9365,9367,9369,9371],{"class":147,"line":671},[145,9356,526],{"class":258},[145,9358,529],{"class":151},[145,9360,532],{"class":262},[145,9362,266],{"class":258},[145,9364,537],{"class":155},[145,9366,540],{"class":262},[145,9368,266],{"class":258},[145,9370,545],{"class":155},[145,9372,548],{"class":262},[145,9374,9375],{"class":147,"line":698},[145,9376,9377],{"class":159},"    \"\"\"Poll a video generation task until completion.\"\"\"\n",[145,9379,9380,9382,9384],{"class":147,"line":710},[145,9381,631],{"class":262},[145,9383,266],{"class":258},[145,9385,636],{"class":155},[145,9387,9388,9390,9392,9394],{"class":147,"line":716},[145,9389,642],{"class":258},[145,9391,645],{"class":262},[145,9393,648],{"class":258},[145,9395,651],{"class":262},[145,9397,9398,9400,9402],{"class":147,"line":722},[145,9399,663],{"class":262},[145,9401,266],{"class":258},[145,9403,668],{"class":262},[145,9405,9406,9408,9410,9412,9414,9416,9418,9420,9422],{"class":147,"line":728},[145,9407,674],{"class":258},[145,9409,449],{"class":159},[145,9411,679],{"class":155},[145,9413,682],{"class":159},[145,9415,685],{"class":155},[145,9417,688],{"class":262},[145,9419,691],{"class":155},[145,9421,449],{"class":159},[145,9423,452],{"class":262},[145,9425,9426,9428,9430],{"class":147,"line":739},[145,9427,702],{"class":701},[145,9429,266],{"class":258},[145,9431,707],{"class":155},[145,9433,9434],{"class":147,"line":744},[145,9435,713],{"class":262},[145,9437,9438],{"class":147,"line":750},[145,9439,725],{"class":262},[145,9441,9442,9444,9446],{"class":147,"line":767},[145,9443,731],{"class":262},[145,9445,266],{"class":258},[145,9447,736],{"class":262},[145,9449,9450,9452,9454,9456,9458],{"class":147,"line":788},[145,9451,753],{"class":262},[145,9453,266],{"class":258},[145,9455,758],{"class":262},[145,9457,761],{"class":159},[145,9459,764],{"class":262},[145,9461,9462,9464,9466,9468,9470,9472,9474],{"class":147,"line":834},[145,9463,770],{"class":262},[145,9465,266],{"class":258},[145,9467,775],{"class":262},[145,9469,778],{"class":159},[145,9471,400],{"class":262},[145,9473,783],{"class":155},[145,9475,406],{"class":262},[145,9477,9478,9480,9482,9484,9486,9488,9490,9492,9494,9496,9498,9500,9502,9504,9506,9508,9510],{"class":147,"line":839},[145,9479,791],{"class":155},[145,9481,794],{"class":262},[145,9483,440],{"class":258},[145,9485,799],{"class":159},[145,9487,685],{"class":155},[145,9489,804],{"class":262},[145,9491,691],{"class":155},[145,9493,809],{"class":159},[145,9495,685],{"class":155},[145,9497,814],{"class":262},[145,9499,691],{"class":155},[145,9501,819],{"class":159},[145,9503,685],{"class":155},[145,9505,824],{"class":262},[145,9507,691],{"class":155},[145,9509,829],{"class":159},[145,9511,406],{"class":262},[145,9513,9514,9516,9518,9520,9522],{"class":147,"line":845},[145,9515,848],{"class":258},[145,9517,851],{"class":262},[145,9519,854],{"class":258},[145,9521,857],{"class":159},[145,9523,860],{"class":262},[145,9525,9526,9528],{"class":147,"line":863},[145,9527,866],{"class":258},[145,9529,869],{"class":262},[145,9531,9532,9534,9536,9538,9540],{"class":147,"line":872},[145,9533,875],{"class":258},[145,9535,851],{"class":262},[145,9537,854],{"class":258},[145,9539,882],{"class":159},[145,9541,860],{"class":262},[145,9543,9544,9546,9548,9550,9552,9554,9556,9558,9560,9562,9564,9567,9569,9571],{"class":147,"line":887},[145,9545,906],{"class":258},[145,9547,909],{"class":155},[145,9549,794],{"class":262},[145,9551,440],{"class":258},[145,9553,921],{"class":159},[145,9555,685],{"class":155},[145,9557,688],{"class":262},[145,9559,691],{"class":155},[145,9561,930],{"class":159},[145,9563,685],{"class":155},[145,9565,9566],{"class":262},"task",[145,9568,691],{"class":155},[145,9570,449],{"class":159},[145,9572,406],{"class":262},[145,9574,9575],{"class":147,"line":903},[145,9576,973],{"class":262},[145,9578,9579,9581,9583],{"class":147,"line":915},[145,9580,979],{"class":262},[145,9582,982],{"class":258},[145,9584,985],{"class":262},[145,9586,9587,9589,9591,9593,9595,9597,9599,9601,9603,9605,9607,9609,9611,9613],{"class":147,"line":953},[145,9588,996],{"class":258},[145,9590,999],{"class":155},[145,9592,794],{"class":262},[145,9594,440],{"class":258},[145,9596,921],{"class":159},[145,9598,685],{"class":155},[145,9600,688],{"class":262},[145,9602,691],{"class":155},[145,9604,1014],{"class":159},[145,9606,685],{"class":155},[145,9608,1019],{"class":262},[145,9610,691],{"class":155},[145,9612,1024],{"class":159},[145,9614,406],{"class":262},[145,9616,9617],{"class":147,"line":959},[145,9618,376],{"emptyLinePlaceholder":58},[145,9620,9621],{"class":147,"line":964},[145,9622,376],{"emptyLinePlaceholder":58},[145,9624,9625,9627,9629,9631,9633,9635],{"class":147,"line":970},[145,9626,526],{"class":258},[145,9628,1082],{"class":151},[145,9630,1085],{"class":262},[145,9632,266],{"class":258},[145,9634,1090],{"class":159},[145,9636,548],{"class":262},[145,9638,9639],{"class":147,"line":976},[145,9640,1097],{"class":159},[145,9642,9643,9645,9647,9649,9652,9654,9656,9658,9660],{"class":147,"line":988},[145,9644,1102],{"class":155},[145,9646,794],{"class":262},[145,9648,440],{"class":258},[145,9650,9651],{"class":159},"\"Downloading to ",[145,9653,685],{"class":155},[145,9655,1114],{"class":262},[145,9657,691],{"class":155},[145,9659,1119],{"class":159},[145,9661,406],{"class":262},[145,9663,9664,9666,9668,9670,9672,9674,9676],{"class":147,"line":993},[145,9665,1126],{"class":262},[145,9667,266],{"class":258},[145,9669,1131],{"class":262},[145,9671,1134],{"class":701},[145,9673,266],{"class":258},[145,9675,1139],{"class":155},[145,9677,406],{"class":262},[145,9679,9680],{"class":147,"line":5531},[145,9681,1146],{"class":262},[145,9683,9684,9686,9688,9690,9692,9694,9696],{"class":147,"line":5540},[145,9685,1151],{"class":258},[145,9687,1154],{"class":155},[145,9689,1157],{"class":262},[145,9691,1160],{"class":159},[145,9693,1163],{"class":262},[145,9695,1166],{"class":258},[145,9697,1169],{"class":262},[145,9699,9700,9702,9704,9706,9708,9710,9712,9714],{"class":147,"line":5546},[145,9701,1174],{"class":258},[145,9703,1177],{"class":262},[145,9705,1180],{"class":258},[145,9707,1183],{"class":262},[145,9709,1186],{"class":701},[145,9711,266],{"class":258},[145,9713,1191],{"class":155},[145,9715,548],{"class":262},[145,9717,9718],{"class":147,"line":5574},[145,9719,1198],{"class":262},[145,9721,9722,9724,9726,9728,9730,9732,9734,9736,9738,9740,9742,9744,9746,9748,9750,9752],{"class":147,"line":5605},[145,9723,1102],{"class":155},[145,9725,794],{"class":262},[145,9727,440],{"class":258},[145,9729,1209],{"class":159},[145,9731,685],{"class":155},[145,9733,1114],{"class":262},[145,9735,691],{"class":155},[145,9737,1218],{"class":159},[145,9739,685],{"class":155},[145,9741,1223],{"class":262},[145,9743,1226],{"class":258},[145,9745,1229],{"class":155},[145,9747,1232],{"class":258},[145,9749,691],{"class":155},[145,9751,1237],{"class":159},[145,9753,406],{"class":262},[145,9755,9756],{"class":147,"line":5625},[145,9757,376],{"emptyLinePlaceholder":58},[145,9759,9760],{"class":147,"line":5631},[145,9761,376],{"emptyLinePlaceholder":58},[145,9763,9764,9766,9768,9770,9772,9774],{"class":147,"line":5637},[145,9765,526],{"class":258},[145,9767,5048],{"class":151},[145,9769,5051],{"class":262},[145,9771,266],{"class":258},[145,9773,5056],{"class":155},[145,9775,548],{"class":262},[145,9777,9778],{"class":147,"line":5642},[145,9779,9780],{"class":159},"    \"\"\"Submit a generation request with retry for transient errors.\"\"\"\n",[145,9782,9783,9785,9787,9789,9791],{"class":147,"line":5655},[145,9784,5119],{"class":258},[145,9786,5122],{"class":262},[145,9788,1180],{"class":258},[145,9790,5127],{"class":155},[145,9792,5130],{"class":262},[145,9794,9795,9797],{"class":147,"line":5661},[145,9796,5135],{"class":258},[145,9798,860],{"class":262},[145,9800,9801,9803,9805],{"class":147,"line":5688},[145,9802,5142],{"class":262},[145,9804,266],{"class":258},[145,9806,1432],{"class":262},[145,9808,9809,9811,9813,9815,9817],{"class":147,"line":5728},[145,9810,918],{"class":258},[145,9812,449],{"class":159},[145,9814,679],{"class":155},[145,9816,1444],{"class":159},[145,9818,452],{"class":262},[145,9820,9821,9823,9825,9827],{"class":147,"line":5747},[145,9822,5163],{"class":701},[145,9824,266],{"class":258},[145,9826,423],{"class":155},[145,9828,452],{"class":262},[145,9830,9831,9833,9835],{"class":147,"line":5752},[145,9832,5174],{"class":701},[145,9834,266],{"class":258},[145,9836,5179],{"class":262},[145,9838,9839,9841,9843],{"class":147,"line":5757},[145,9840,5184],{"class":701},[145,9842,266],{"class":258},[145,9844,9845],{"class":155},"30\n",[145,9847,9848],{"class":147,"line":5762},[145,9849,956],{"class":262},[145,9851,9852,9854,9856,9858,9860],{"class":147,"line":7442},[145,9853,5210],{"class":258},[145,9855,2509],{"class":262},[145,9857,854],{"class":258},[145,9859,2514],{"class":155},[145,9861,860],{"class":262},[145,9863,9864,9866],{"class":147,"line":7448},[145,9865,5223],{"class":258},[145,9867,736],{"class":262},[145,9869,9870,9872,9874,9876,9878],{"class":147,"line":7459},[145,9871,5239],{"class":262},[145,9873,266],{"class":258},[145,9875,5244],{"class":262},[145,9877,897],{"class":159},[145,9879,900],{"class":262},[145,9881,9882,9884,9886,9888,9890,9892,9894,9896,9898,9900,9902,9904,9906,9908,9910,9912],{"class":147,"line":7470},[145,9883,5210],{"class":258},[145,9885,2509],{"class":262},[145,9887,1180],{"class":258},[145,9889,1218],{"class":262},[145,9891,3637],{"class":155},[145,9893,400],{"class":262},[145,9895,4848],{"class":155},[145,9897,400],{"class":262},[145,9899,4866],{"class":155},[145,9901,400],{"class":262},[145,9903,4884],{"class":155},[145,9905,400],{"class":262},[145,9907,4902],{"class":155},[145,9909,400],{"class":262},[145,9911,4920],{"class":155},[145,9913,548],{"class":262},[145,9915,9916,9918,9920],{"class":147,"line":7481},[145,9917,5335],{"class":258},[145,9919,5338],{"class":155},[145,9921,912],{"class":262},[145,9923,9924,9926,9928,9930,9932,9934],{"class":147,"line":7486},[145,9925,5345],{"class":258},[145,9927,5348],{"class":159},[145,9929,685],{"class":155},[145,9931,5353],{"class":262},[145,9933,691],{"class":155},[145,9935,9936],{"class":159},": \"\n",[145,9938,9939,9941,9943,9945,9948,9950,9952,9955,9957,9959],{"class":147,"line":7492},[145,9940,5345],{"class":258},[145,9942,449],{"class":159},[145,9944,685],{"class":155},[145,9946,9947],{"class":262},"error.get(",[145,9949,938],{"class":159},[145,9951,400],{"class":262},[145,9953,9954],{"class":159},"'Unknown'",[145,9956,108],{"class":262},[145,9958,691],{"class":155},[145,9960,950],{"class":159},[145,9962,9963],{"class":147,"line":7500},[145,9964,5371],{"class":262},[145,9966,9967,9969,9971,9973,9975,9977,9979,9981,9983,9985,9987,9989],{"class":147,"line":7514},[145,9968,5210],{"class":258},[145,9970,2509],{"class":262},[145,9972,1180],{"class":258},[145,9974,1218],{"class":262},[145,9976,4938],{"class":155},[145,9978,400],{"class":262},[145,9980,4959],{"class":155},[145,9982,400],{"class":262},[145,9984,4979],{"class":155},[145,9986,400],{"class":262},[145,9988,4999],{"class":155},[145,9990,548],{"class":262},[145,9992,9993,9995,9997,9999,10001,10003,10005,10007,10009,10011,10013,10015],{"class":147,"line":7519},[145,9994,5411],{"class":262},[145,9996,266],{"class":258},[145,9998,1218],{"class":262},[145,10000,5418],{"class":155},[145,10002,5421],{"class":258},[145,10004,5424],{"class":262},[145,10006,5427],{"class":258},[145,10008,5430],{"class":262},[145,10010,783],{"class":155},[145,10012,400],{"class":262},[145,10014,5437],{"class":155},[145,10016,406],{"class":262},[145,10018,10019,10021,10023,10025,10027,10029,10032,10034,10037,10039,10041,10043,10045,10048,10050,10052,10054,10056,10058],{"class":147,"line":7533},[145,10020,5444],{"class":155},[145,10022,794],{"class":262},[145,10024,440],{"class":258},[145,10026,5451],{"class":159},[145,10028,685],{"class":155},[145,10030,10031],{"class":262},"attempt",[145,10033,5427],{"class":258},[145,10035,10036],{"class":155},"1}",[145,10038,1226],{"class":159},[145,10040,685],{"class":155},[145,10042,5468],{"class":262},[145,10044,691],{"class":155},[145,10046,10047],{"class":159}," after ",[145,10049,685],{"class":155},[145,10051,5486],{"class":262},[145,10053,5489],{"class":258},[145,10055,691],{"class":155},[145,10057,1024],{"class":159},[145,10059,406],{"class":262},[145,10061,10062],{"class":147,"line":7547},[145,10063,5519],{"class":262},[145,10065,10066],{"class":147,"line":7579},[145,10067,5524],{"class":258},[145,10069,10070,10072],{"class":147,"line":7591},[145,10071,5534],{"class":258},[145,10073,10074],{"class":262}," requests.exceptions.RequestException:\n",[145,10076,10077,10079,10081,10083,10085,10087,10089,10091,10093,10095,10097,10099],{"class":147,"line":7601},[145,10078,5549],{"class":262},[145,10080,266],{"class":258},[145,10082,1218],{"class":262},[145,10084,5418],{"class":155},[145,10086,5421],{"class":258},[145,10088,5424],{"class":262},[145,10090,5427],{"class":258},[145,10092,5430],{"class":262},[145,10094,783],{"class":155},[145,10096,400],{"class":262},[145,10098,5437],{"class":155},[145,10100,406],{"class":262},[145,10102,10103,10105,10107,10109,10111,10113,10115,10117,10119,10121,10123,10125,10127,10129,10131,10133,10135,10137,10139],{"class":147,"line":7606},[145,10104,5577],{"class":155},[145,10106,794],{"class":262},[145,10108,440],{"class":258},[145,10110,5451],{"class":159},[145,10112,685],{"class":155},[145,10114,10031],{"class":262},[145,10116,5427],{"class":258},[145,10118,10036],{"class":155},[145,10120,1226],{"class":159},[145,10122,685],{"class":155},[145,10124,5468],{"class":262},[145,10126,691],{"class":155},[145,10128,10047],{"class":159},[145,10130,685],{"class":155},[145,10132,5486],{"class":262},[145,10134,5489],{"class":258},[145,10136,691],{"class":155},[145,10138,1024],{"class":159},[145,10140,406],{"class":262},[145,10142,10143],{"class":147,"line":7613},[145,10144,5628],{"class":262},[145,10146,10147],{"class":147,"line":7635},[145,10148,5634],{"class":258},[145,10150,10151,10153,10155,10157,10159,10161,10163,10165,10167,10169],{"class":147,"line":7666},[145,10152,996],{"class":258},[145,10154,909],{"class":155},[145,10156,794],{"class":262},[145,10158,440],{"class":258},[145,10160,5773],{"class":159},[145,10162,685],{"class":155},[145,10164,5468],{"class":262},[145,10166,691],{"class":155},[145,10168,5782],{"class":159},[145,10170,406],{"class":262},[145,10172,10173],{"class":147,"line":7671},[145,10174,376],{"emptyLinePlaceholder":58},[145,10176,10177],{"class":147,"line":7677},[145,10178,376],{"emptyLinePlaceholder":58},[145,10180,10181,10183,10185],{"class":147,"line":7702},[145,10182,526],{"class":258},[145,10184,5845],{"class":151},[145,10186,5848],{"class":262},[145,10188,10189],{"class":147,"line":7707},[145,10190,10191],{"class":159},"    \"\"\"Validate generation payload before API call.\"\"\"\n",[145,10193,10194,10196,10198],{"class":147,"line":7712},[145,10195,5871],{"class":262},[145,10197,266],{"class":258},[145,10199,5876],{"class":262},[145,10201,10202,10204,10206,10208,10210],{"class":147,"line":7735},[145,10203,2506],{"class":258},[145,10205,5892],{"class":258},[145,10207,5895],{"class":262},[145,10209,5898],{"class":159},[145,10211,548],{"class":262},[145,10213,10214,10216,10218],{"class":147,"line":7745},[145,10215,5905],{"class":262},[145,10217,5908],{"class":159},[145,10219,406],{"class":262},[145,10221,10222,10224,10226,10228,10230,10232,10234,10236,10238,10240],{"class":147,"line":7751},[145,10223,2506],{"class":258},[145,10225,5892],{"class":258},[145,10227,5895],{"class":262},[145,10229,5921],{"class":159},[145,10231,1163],{"class":262},[145,10233,5926],{"class":258},[145,10235,5892],{"class":258},[145,10237,5931],{"class":262},[145,10239,5921],{"class":159},[145,10241,5936],{"class":262},[145,10243,10244,10246,10249],{"class":147,"line":7769},[145,10245,5905],{"class":262},[145,10247,10248],{"class":159},"\"'prompt' is required\"",[145,10250,406],{"class":262},[145,10252,10253,10255,10257,10259,10261,10263,10265],{"class":147,"line":7774},[145,10254,5959],{"class":262},[145,10256,266],{"class":258},[145,10258,5895],{"class":262},[145,10260,5966],{"class":159},[145,10262,400],{"class":262},[145,10264,1352],{"class":155},[145,10266,406],{"class":262},[145,10268,10269,10271,10273,10275,10277,10279,10281,10283,10285],{"class":147,"line":7779},[145,10270,2506],{"class":258},[145,10272,5979],{"class":262},[145,10274,648],{"class":258},[145,10276,5984],{"class":155},[145,10278,5987],{"class":258},[145,10280,5979],{"class":262},[145,10282,5992],{"class":258},[145,10284,5995],{"class":155},[145,10286,860],{"class":262},[145,10288,10289,10291,10293,10295,10297,10299,10301,10303],{"class":147,"line":7792},[145,10290,5905],{"class":262},[145,10292,440],{"class":258},[145,10294,6006],{"class":159},[145,10296,685],{"class":155},[145,10298,1774],{"class":262},[145,10300,691],{"class":155},[145,10302,449],{"class":159},[145,10304,406],{"class":262},[145,10306,10307,10309,10311,10313,10315,10317,10319],{"class":147,"line":7806},[145,10308,6052],{"class":262},[145,10310,266],{"class":258},[145,10312,5895],{"class":262},[145,10314,6059],{"class":159},[145,10316,400],{"class":262},[145,10318,1368],{"class":159},[145,10320,406],{"class":262},[145,10322,10323,10325,10327,10329,10331,10333,10335,10337,10339,10341,10343],{"class":147,"line":7833},[145,10324,2506],{"class":258},[145,10326,6072],{"class":262},[145,10328,6075],{"class":258},[145,10330,6078],{"class":258},[145,10332,6035],{"class":262},[145,10334,4013],{"class":159},[145,10336,400],{"class":262},[145,10338,1368],{"class":159},[145,10340,400],{"class":262},[145,10342,3710],{"class":159},[145,10344,10345],{"class":262},"}:\n",[145,10347,10348,10350,10352,10355,10357,10359,10361,10363],{"class":147,"line":7847},[145,10349,5905],{"class":262},[145,10351,440],{"class":258},[145,10353,10354],{"class":159},"\"Invalid quality: ",[145,10356,685],{"class":155},[145,10358,1782],{"class":262},[145,10360,691],{"class":155},[145,10362,449],{"class":159},[145,10364,406],{"class":262},[145,10366,10368,10370],{"class":147,"line":10367},99,[145,10369,2506],{"class":258},[145,10371,6347],{"class":262},[145,10373,10375,10377,10379,10381,10384,10386,10388,10390,10392,10394,10396,10398,10400,10402,10404,10406,10408,10410,10412,10414,10416],{"class":147,"line":10374},100,[145,10376,6352],{"class":258},[145,10378,5338],{"class":155},[145,10380,794],{"class":262},[145,10382,10383],{"class":159},"\"Validation failed:",[145,10385,1670],{"class":155},[145,10387,449],{"class":159},[145,10389,6368],{"class":258},[145,10391,6371],{"class":159},[145,10393,1670],{"class":155},[145,10395,449],{"class":159},[145,10397,6378],{"class":262},[145,10399,440],{"class":258},[145,10401,6383],{"class":159},[145,10403,685],{"class":155},[145,10405,5702],{"class":262},[145,10407,691],{"class":155},[145,10409,449],{"class":159},[145,10411,6394],{"class":258},[145,10413,6397],{"class":262},[145,10415,1180],{"class":258},[145,10417,6402],{"class":262},[145,10419,10421],{"class":147,"line":10420},101,[145,10422,376],{"emptyLinePlaceholder":58},[145,10424,10426],{"class":147,"line":10425},102,[145,10427,376],{"emptyLinePlaceholder":58},[145,10429,10431,10433,10435],{"class":147,"line":10430},103,[145,10432,526],{"class":258},[145,10434,2452],{"class":151},[145,10436,2455],{"class":262},[145,10438,10440],{"class":147,"line":10439},104,[145,10441,10442],{"class":159},"    \"\"\"Cancel a pending or processing task.\"\"\"\n",[145,10444,10446,10448,10450],{"class":147,"line":10445},105,[145,10447,1427],{"class":262},[145,10449,266],{"class":258},[145,10451,1432],{"class":262},[145,10453,10455,10457,10459,10461,10463,10465,10467,10469,10471],{"class":147,"line":10454},106,[145,10456,1437],{"class":258},[145,10458,449],{"class":159},[145,10460,679],{"class":155},[145,10462,682],{"class":159},[145,10464,685],{"class":155},[145,10466,688],{"class":262},[145,10468,691],{"class":155},[145,10470,2487],{"class":159},[145,10472,452],{"class":262},[145,10474,10476,10478,10480],{"class":147,"line":10475},107,[145,10477,1455],{"class":701},[145,10479,266],{"class":258},[145,10481,707],{"class":155},[145,10483,10485],{"class":147,"line":10484},108,[145,10486,1483],{"class":262},[145,10488,10490,10492,10494,10496,10498],{"class":147,"line":10489},109,[145,10491,2506],{"class":258},[145,10493,2509],{"class":262},[145,10495,854],{"class":258},[145,10497,2514],{"class":155},[145,10499,860],{"class":262},[145,10501,10503,10505,10507,10509,10511,10513,10515,10517,10520],{"class":147,"line":10502},110,[145,10504,791],{"class":155},[145,10506,794],{"class":262},[145,10508,440],{"class":258},[145,10510,921],{"class":159},[145,10512,685],{"class":155},[145,10514,688],{"class":262},[145,10516,691],{"class":155},[145,10518,10519],{"class":159}," cancelled.\"",[145,10521,406],{"class":262},[145,10523,10525,10527],{"class":147,"line":10524},111,[145,10526,2542],{"class":258},[145,10528,860],{"class":262},[145,10530,10532,10534,10536,10538,10540,10542,10544,10546,10548],{"class":147,"line":10531},112,[145,10533,791],{"class":155},[145,10535,794],{"class":262},[145,10537,440],{"class":258},[145,10539,2555],{"class":159},[145,10541,685],{"class":155},[145,10543,2560],{"class":262},[145,10545,691],{"class":155},[145,10547,449],{"class":159},[145,10549,406],{"class":262},[145,10551,10553],{"class":147,"line":10552},113,[145,10554,376],{"emptyLinePlaceholder":58},[145,10556,10558],{"class":147,"line":10557},114,[145,10559,376],{"emptyLinePlaceholder":58},[145,10561,10563],{"class":147,"line":10562},115,[145,10564,10565],{"class":174},"# ── Example 1: Text-to-Video ─────────────────────────────────\n",[145,10567,10569,10571,10573],{"class":147,"line":10568},116,[145,10570,526],{"class":258},[145,10572,1286],{"class":151},[145,10574,1289],{"class":262},[145,10576,10578,10580,10582],{"class":147,"line":10577},117,[145,10579,1294],{"class":262},[145,10581,266],{"class":258},[145,10583,428],{"class":262},[145,10585,10587,10589,10591,10593],{"class":147,"line":10586},118,[145,10588,1303],{"class":159},[145,10590,437],{"class":262},[145,10592,1308],{"class":159},[145,10594,452],{"class":262},[145,10596,10598,10600],{"class":147,"line":10597},119,[145,10599,1319],{"class":159},[145,10601,1322],{"class":262},[145,10603,10605],{"class":147,"line":10604},120,[145,10606,1327],{"class":159},[145,10608,10610],{"class":147,"line":10609},121,[145,10611,1332],{"class":159},[145,10613,10615],{"class":147,"line":10614},122,[145,10616,1337],{"class":159},[145,10618,10620],{"class":147,"line":10619},123,[145,10621,1342],{"class":262},[145,10623,10625,10627,10629,10631],{"class":147,"line":10624},124,[145,10626,1347],{"class":159},[145,10628,437],{"class":262},[145,10630,1352],{"class":155},[145,10632,452],{"class":262},[145,10634,10636,10638,10640,10642],{"class":147,"line":10635},125,[145,10637,1363],{"class":159},[145,10639,437],{"class":262},[145,10641,1368],{"class":159},[145,10643,452],{"class":262},[145,10645,10647,10649,10651,10653],{"class":147,"line":10646},126,[145,10648,1379],{"class":159},[145,10650,437],{"class":262},[145,10652,1384],{"class":159},[145,10654,452],{"class":262},[145,10656,10658,10660,10662],{"class":147,"line":10657},127,[145,10659,1395],{"class":159},[145,10661,437],{"class":262},[145,10663,3738],{"class":155},[145,10665,10667],{"class":147,"line":10666},128,[145,10668,1407],{"class":262},[145,10670,10672],{"class":147,"line":10671},129,[145,10673,10674],{"class":262},"    validate_payload(payload)\n",[145,10676,10678,10680,10682],{"class":147,"line":10677},130,[145,10679,1496],{"class":262},[145,10681,266],{"class":258},[145,10683,8533],{"class":262},[145,10685,10687,10689,10691,10693,10696,10698,10700,10702,10704,10706,10709,10711,10713,10715,10717,10719,10721,10723,10726],{"class":147,"line":10686},131,[145,10688,1102],{"class":155},[145,10690,794],{"class":262},[145,10692,440],{"class":258},[145,10694,10695],{"class":159},"\"Task: ",[145,10697,685],{"class":155},[145,10699,1529],{"class":262},[145,10701,1532],{"class":159},[145,10703,1535],{"class":262},[145,10705,691],{"class":155},[145,10707,10708],{"class":159}," (ETA: ",[145,10710,685],{"class":155},[145,10712,1529],{"class":262},[145,10714,1559],{"class":159},[145,10716,1562],{"class":262},[145,10718,1565],{"class":159},[145,10720,1535],{"class":262},[145,10722,691],{"class":155},[145,10724,10725],{"class":159},"s)\"",[145,10727,406],{"class":262},[145,10729,10731,10733,10735,10737,10739],{"class":147,"line":10730},132,[145,10732,1618],{"class":262},[145,10734,266],{"class":258},[145,10736,1623],{"class":262},[145,10738,1626],{"class":159},[145,10740,1629],{"class":262},[145,10742,10744,10747,10749,10751,10753,10756,10759],{"class":147,"line":10743},133,[145,10745,10746],{"class":262},"    download_video(result[",[145,10748,1651],{"class":159},[145,10750,1562],{"class":262},[145,10752,783],{"class":155},[145,10754,10755],{"class":262},"], ",[145,10757,10758],{"class":159},"\"text_to_video.mp4\"",[145,10760,406],{"class":262},[145,10762,10764],{"class":147,"line":10763},134,[145,10765,376],{"emptyLinePlaceholder":58},[145,10767,10769],{"class":147,"line":10768},135,[145,10770,376],{"emptyLinePlaceholder":58},[145,10772,10774],{"class":147,"line":10773},136,[145,10775,10776],{"class":174},"# ── Example 2: Image-to-Video ────────────────────────────────\n",[145,10778,10780,10782,10784],{"class":147,"line":10779},137,[145,10781,526],{"class":258},[145,10783,2638],{"class":151},[145,10785,1289],{"class":262},[145,10787,10789,10791,10793],{"class":147,"line":10788},138,[145,10790,1294],{"class":262},[145,10792,266],{"class":258},[145,10794,428],{"class":262},[145,10796,10798,10800,10802,10804],{"class":147,"line":10797},139,[145,10799,1303],{"class":159},[145,10801,437],{"class":262},[145,10803,1308],{"class":159},[145,10805,452],{"class":262},[145,10807,10809,10811],{"class":147,"line":10808},140,[145,10810,1319],{"class":159},[145,10812,1322],{"class":262},[145,10814,10816],{"class":147,"line":10815},141,[145,10817,2669],{"class":159},[145,10819,10821],{"class":147,"line":10820},142,[145,10822,2674],{"class":159},[145,10824,10826],{"class":147,"line":10825},143,[145,10827,10828],{"class":159},"            \"across the frame.\"\n",[145,10830,10832],{"class":147,"line":10831},144,[145,10833,1342],{"class":262},[145,10835,10837,10839,10842,10845],{"class":147,"line":10836},145,[145,10838,2688],{"class":159},[145,10840,10841],{"class":262},": [",[145,10843,10844],{"class":159},"\"https://example.com/your-image.jpg\"",[145,10846,10847],{"class":262},"],\n",[145,10849,10851,10853,10855,10857],{"class":147,"line":10850},146,[145,10852,1347],{"class":159},[145,10854,437],{"class":262},[145,10856,1352],{"class":155},[145,10858,452],{"class":262},[145,10860,10862,10864,10866],{"class":147,"line":10861},147,[145,10863,1363],{"class":159},[145,10865,437],{"class":262},[145,10867,8512],{"class":159},[145,10869,10871],{"class":147,"line":10870},148,[145,10872,1407],{"class":262},[145,10874,10876],{"class":147,"line":10875},149,[145,10877,10674],{"class":262},[145,10879,10881,10883,10885],{"class":147,"line":10880},150,[145,10882,1496],{"class":262},[145,10884,266],{"class":258},[145,10886,8533],{"class":262},[145,10888,10890,10892,10894,10896,10898,10900,10902,10904,10906,10908,10910],{"class":147,"line":10889},151,[145,10891,1102],{"class":155},[145,10893,794],{"class":262},[145,10895,440],{"class":258},[145,10897,10695],{"class":159},[145,10899,685],{"class":155},[145,10901,1529],{"class":262},[145,10903,1532],{"class":159},[145,10905,1535],{"class":262},[145,10907,691],{"class":155},[145,10909,449],{"class":159},[145,10911,406],{"class":262},[145,10913,10915,10917,10919,10921,10923],{"class":147,"line":10914},152,[145,10916,1618],{"class":262},[145,10918,266],{"class":258},[145,10920,1623],{"class":262},[145,10922,1626],{"class":159},[145,10924,1629],{"class":262},[145,10926,10928,10930,10932,10934,10936,10938,10941],{"class":147,"line":10927},153,[145,10929,10746],{"class":262},[145,10931,1651],{"class":159},[145,10933,1562],{"class":262},[145,10935,783],{"class":155},[145,10937,10755],{"class":262},[145,10939,10940],{"class":159},"\"image_to_video.mp4\"",[145,10942,406],{"class":262},[145,10944,10946],{"class":147,"line":10945},154,[145,10947,376],{"emptyLinePlaceholder":58},[145,10949,10951],{"class":147,"line":10950},155,[145,10952,376],{"emptyLinePlaceholder":58},[145,10954,10956],{"class":147,"line":10955},156,[145,10957,10958],{"class":174},"# ── Example 3: Vertical Social Media Video ───────────────────\n",[145,10960,10962,10964,10967],{"class":147,"line":10961},157,[145,10963,526],{"class":258},[145,10965,10966],{"class":151}," social_media_video",[145,10968,1289],{"class":262},[145,10970,10972,10974,10976],{"class":147,"line":10971},158,[145,10973,1294],{"class":262},[145,10975,266],{"class":258},[145,10977,428],{"class":262},[145,10979,10981,10983,10985,10987],{"class":147,"line":10980},159,[145,10982,1303],{"class":159},[145,10984,437],{"class":262},[145,10986,1308],{"class":159},[145,10988,452],{"class":262},[145,10990,10992,10994],{"class":147,"line":10991},160,[145,10993,1319],{"class":159},[145,10995,1322],{"class":262},[145,10997,10999],{"class":147,"line":10998},161,[145,11000,11001],{"class":159},"            \"A barista pours latte art in slow motion. \"\n",[145,11003,11005],{"class":147,"line":11004},162,[145,11006,11007],{"class":159},"            \"Close-up overhead shot, warm cafe lighting.\"\n",[145,11009,11011],{"class":147,"line":11010},163,[145,11012,1342],{"class":262},[145,11014,11016,11018,11020,11022],{"class":147,"line":11015},164,[145,11017,1347],{"class":159},[145,11019,437],{"class":262},[145,11021,3698],{"class":155},[145,11023,452],{"class":262},[145,11025,11027,11029,11031,11033],{"class":147,"line":11026},165,[145,11028,1363],{"class":159},[145,11030,437],{"class":262},[145,11032,3710],{"class":159},[145,11034,452],{"class":262},[145,11036,11038,11040,11042,11044],{"class":147,"line":11037},166,[145,11039,1379],{"class":159},[145,11041,437],{"class":262},[145,11043,3722],{"class":159},[145,11045,452],{"class":262},[145,11047,11049,11051,11053],{"class":147,"line":11048},167,[145,11050,1395],{"class":159},[145,11052,437],{"class":262},[145,11054,3738],{"class":155},[145,11056,11058],{"class":147,"line":11057},168,[145,11059,1407],{"class":262},[145,11061,11063],{"class":147,"line":11062},169,[145,11064,10674],{"class":262},[145,11066,11068,11070,11072],{"class":147,"line":11067},170,[145,11069,1496],{"class":262},[145,11071,266],{"class":258},[145,11073,8533],{"class":262},[145,11075,11077,11079,11081,11083,11085,11087,11089,11091,11093,11095,11097],{"class":147,"line":11076},171,[145,11078,1102],{"class":155},[145,11080,794],{"class":262},[145,11082,440],{"class":258},[145,11084,10695],{"class":159},[145,11086,685],{"class":155},[145,11088,1529],{"class":262},[145,11090,1532],{"class":159},[145,11092,1535],{"class":262},[145,11094,691],{"class":155},[145,11096,449],{"class":159},[145,11098,406],{"class":262},[145,11100,11102,11104,11106,11108,11110],{"class":147,"line":11101},172,[145,11103,1618],{"class":262},[145,11105,266],{"class":258},[145,11107,1623],{"class":262},[145,11109,1626],{"class":159},[145,11111,1629],{"class":262},[145,11113,11115,11117,11119,11121,11123,11125,11128],{"class":147,"line":11114},173,[145,11116,10746],{"class":262},[145,11118,1651],{"class":159},[145,11120,1562],{"class":262},[145,11122,783],{"class":155},[145,11124,10755],{"class":262},[145,11126,11127],{"class":159},"\"social_video.mp4\"",[145,11129,406],{"class":262},[145,11131,11133],{"class":147,"line":11132},174,[145,11134,376],{"emptyLinePlaceholder":58},[145,11136,11138],{"class":147,"line":11137},175,[145,11139,376],{"emptyLinePlaceholder":58},[145,11141,11143,11145,11147,11149,11151],{"class":147,"line":11142},176,[145,11144,1719],{"class":258},[145,11146,1722],{"class":155},[145,11148,1725],{"class":258},[145,11150,1728],{"class":159},[145,11152,860],{"class":262},[145,11154,11156,11158,11160,11163],{"class":147,"line":11155},177,[145,11157,1102],{"class":155},[145,11159,794],{"class":262},[145,11161,11162],{"class":159},"\"=== Text-to-Video ===\"",[145,11164,406],{"class":262},[145,11166,11168],{"class":147,"line":11167},178,[145,11169,1735],{"class":262},[145,11171,11173],{"class":147,"line":11172},179,[145,11174,11175],{"class":174},"    # print(\"\\n=== Image-to-Video ===\")\n",[145,11177,11179],{"class":147,"line":11178},180,[145,11180,11181],{"class":174},"    # image_to_video()  # Uncomment and set your image URL\n",[145,11183,11185],{"class":147,"line":11184},181,[145,11186,11187],{"class":174},"    # print(\"\\n=== Social Media Video ===\")\n",[145,11189,11191],{"class":147,"line":11190},182,[145,11192,11193],{"class":174},"    # social_media_video()\n",[18,11195,11196],{},[11,11197,11198,11201,11202,6914,11204,11207],{},[23,11199,11200],{},"Tip:"," To test with the currently available model, change ",[28,11203,1308],{},[28,11205,11206],{},"\"seedance-1.5-pro\"",". The API interface is identical — same endpoint, same parameters, same response format. When Seedance 2.0 is fully rolled out, just switch the model name back.",[11,11209,11210],{},[23,11211,11212],{},[37,11213,11215],{"href":39,"rel":11214},[41],"Start building → Get your free API key at EvoLink",[11217,11218,11219],"style",{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}",{"title":141,"searchDepth":166,"depth":166,"links":11221},[11222,11225,11226,11227,11231,11236,11241,11245,11251,11259,11260,11265,11277],{"id":50,"depth":166,"text":51,"children":11223},[11224],{"id":94,"depth":178,"text":95},{"id":204,"depth":166,"text":205},{"id":310,"depth":166,"text":311},{"id":1265,"depth":166,"text":1266,"children":11228},[11229,11230],{"id":1845,"depth":178,"text":1846},{"id":2172,"depth":178,"text":2173},{"id":2217,"depth":166,"text":2218,"children":11232},[11233,11234,11235],{"id":2267,"depth":178,"text":2268},{"id":2347,"depth":178,"text":2348},{"id":2436,"depth":178,"text":2437},{"id":2602,"depth":166,"text":2603,"children":11237},[11238,11239,11240],{"id":2939,"depth":178,"text":2940},{"id":3216,"depth":178,"text":3217},{"id":3292,"depth":178,"text":3293},{"id":3387,"depth":166,"text":3388,"children":11242},[11243,11244],{"id":3641,"depth":178,"text":3642},{"id":4050,"depth":178,"text":4051},{"id":4161,"depth":166,"text":4162,"children":11246},[11247,11248,11249,11250],{"id":4168,"depth":178,"text":4169},{"id":4803,"depth":178,"text":4804},{"id":5017,"depth":178,"text":5018},{"id":5829,"depth":178,"text":5830},{"id":6429,"depth":166,"text":6430,"children":11252},[11253,11254,11255,11256,11257,11258],{"id":6440,"depth":178,"text":6441},{"id":6619,"depth":178,"text":6620},{"id":6685,"depth":178,"text":6686},{"id":7939,"depth":178,"text":7940},{"id":8077,"depth":178,"text":8078},{"id":8256,"depth":178,"text":8257},{"id":8349,"depth":166,"text":8350},{"id":8936,"depth":166,"text":8937,"children":11261},[11262,11263,11264],{"id":8943,"depth":178,"text":8944},{"id":8987,"depth":178,"text":8988},{"id":9013,"depth":178,"text":9014},{"id":9064,"depth":166,"text":9065,"children":11266},[11267,11268,11269,11270,11271,11272,11273,11274,11275,11276],{"id":9068,"depth":178,"text":9069},{"id":9078,"depth":178,"text":9079},{"id":9088,"depth":178,"text":9089},{"id":9098,"depth":178,"text":9099},{"id":9113,"depth":178,"text":9114},{"id":9131,"depth":178,"text":9132},{"id":9145,"depth":178,"text":9146},{"id":9164,"depth":178,"text":9165},{"id":9175,"depth":178,"text":9176},{"id":9195,"depth":178,"text":9196},{"id":9209,"depth":166,"text":9210},"Generate your first AI video with Seedance 2.0 API in Python. Step-by-step tutorial: text-to-video, image-to-video, async polling, webhooks, and error handling.","md",{"date":11281,"image":11282,"seoTitle":11283,"author":11284},"2026-02-27","/s2-hero-api-tutorial.webp","Seedance 2.0 API Tutorial: First AI Video in Python (2026)","J @ EvoLink","/en/blog/seedance-2-api-tutorial-python",{"title":6,"description":11278},"en/blog/seedance-2-api-tutorial-python","-ZlzP0MIl__0Rhg_KNb0Y6rKWGqSG1ray6IAZgQ8Aqk",{"id":11290,"title":11291,"body":11292,"description":13492,"extension":11279,"meta":13493,"navigation":58,"path":13496,"seo":13497,"stem":13498,"__hash__":13499},"content/en/blog/seedance-2-camera-movement-api.md","How to Replicate Camera Movements with Seedance 2.0 API",{"type":8,"value":11293,"toc":13443},[11294,11297,11303,11310,11316,11336,11339,11350,11352,11356,11359,11366,11392,11395,11398,11400,11404,11413,11417,11423,11426,11431,11437,11442,11448,11455,11459,11531,11540,11550,11552,11556,11560,11579,11583,11595,11599,11950,11953,11963,11965,11969,11979,11982,11986,11992,12002,12006,12012,12015,12037,12041,12244,12248,12254,12259,12264,12270,12272,12276,12283,12286,12289,12294,12299,12302,12308,12311,12513,12517,12524,12529,12531,12535,12538,12541,12546,12551,12554,12560,12563,12760,12764,12767,12813,12816,12818,12822,12825,12829,12832,12849,13090,13094,13097,13177,13183,13188,13190,13194,13198,13203,13209,13214,13219,13225,13229,13232,13238,13242,13253,13259,13263,13266,13278,13282,13285,13299,13301,13305,13309,13322,13326,13329,13333,13339,13343,13346,13350,13359,13361,13365,13371,13374,13394,13397,13405,13407,13412,13433,13435,13440],[11,11295,11296],{},"Camera movement is what separates a flat, static video from something that feels cinematic. A dolly zoom creates tension. An orbital shot adds grandeur. A one-take tracking shot builds immersion. Traditionally, achieving these requires expensive equipment — gimbals, cranes, drones, Steadicams — plus an operator who knows how to use them.",[11,11298,11299,11300,11302],{},"Seedance 2.0 eliminates the hardware. Upload a reference video that contains the camera movement you want, tell the model what to do with it via ",[28,11301,2958],{}," tags, and the API generates new content that replicates the exact camera language — the speed, the trajectory, the rhythm, the acceleration curves.",[11,11304,11305],{},[11306,11307],"img",{"alt":11308,"src":11309},"Cinematic camera movement replication with Seedance 2.0 API — dolly track visualization","/s4-hero-camera-movement.webp",[11,11311,11312,11313,8012],{},"This tutorial walks you through three complete camera replication cases using the Seedance 2.0 API via ",[37,11314,213],{"href":211,"rel":11315},[41],[70,11317,11318,11324,11330],{},[73,11319,11320,11323],{},[23,11321,11322],{},"One-take tracking shot"," — a continuous camera follow through multiple environments",[73,11325,11326,11329],{},[23,11327,11328],{},"Hitchcock zoom (dolly zoom)"," — the classic vertigo effect",[73,11331,11332,11335],{},[23,11333,11334],{},"Orbital camera"," — a 360° rotating shot around a subject",[11,11337,11338],{},"Each case includes a complete Python script you can copy, paste, and run.",[11,11340,11341,11344,11345,11349],{},[23,11342,11343],{},"Prerequisites:"," Python 3.8+, an ",[37,11346,11348],{"href":211,"rel":11347},[41],"EvoLink API key"," (free tier available), and a reference video for each camera movement type.",[45,11351],{},[48,11353,11355],{"id":11354},"why-camera-movement-replication-changes-ai-video","Why Camera Movement Replication Changes AI Video",[11,11357,11358],{},"Most AI video generators give you basic text-based camera control. You type \"dolly in\" or \"pan left\" and hope the model interprets it correctly. The results are inconsistent — sometimes you get a smooth push-in, sometimes a jerky pan, sometimes nothing changes at all.",[11,11360,11361,11362,11365],{},"Seedance 2.0 takes a fundamentally different approach: ",[23,11363,11364],{},"show, don't tell",". Instead of describing camera movement in words, you upload a video that demonstrates the exact movement you want. The model analyzes the reference and reproduces:",[97,11367,11368,11374,11380,11386],{},[73,11369,11370,11373],{},[23,11371,11372],{},"Camera trajectory"," — tracking paths, orbital arcs, crane movements",[73,11375,11376,11379],{},[23,11377,11378],{},"Speed and acceleration"," — ease-in, ease-out, sudden stops, smooth glides",[73,11381,11382,11385],{},[23,11383,11384],{},"Focal behavior"," — rack focus timing, depth-of-field shifts",[73,11387,11388,11391],{},[23,11389,11390],{},"Compositional rhythm"," — how long each framing holds before the camera moves",[11,11393,11394],{},"This means you can take a camera movement from a Hollywood film, a drone shot from YouTube, or a gimbal clip you filmed yourself — and apply that exact movement to entirely new content.",[11,11396,11397],{},"No other AI video API offers this level of camera control. Sora 2 and Kling 3.0 rely on text prompts for camera direction. Veo 3.1 supports basic camera keywords. Only Seedance 2.0 accepts reference video input specifically for camera language extraction.",[45,11399],{},[48,11401,11403],{"id":11402},"how-seedance-20-reads-camera-language","How Seedance 2.0 Reads Camera Language",[11,11405,2176,11406,11408,11409,11412],{},[28,11407,2958],{}," tag is the mechanism. When you upload a reference video and tag it in your prompt, you specify ",[2619,11410,11411],{},"what"," the model should extract from it. This is critical — a single reference video contains camera movement, subject motion, visual effects, lighting, and pacing. You need to tell the model which element to use.",[92,11414,11416],{"id":11415},"the-video-tag-syntax","The @Video Tag Syntax",[11,11418,11419,11422],{},[28,11420,11421],{},"@Video1"," — reference camera movement and tracking trajectory",[11,11424,11425],{},"The prompt explicitly states what to reference. Compare these two approaches:",[11,11427,11428],{},[23,11429,11430],{},"Vague (unreliable):",[136,11432,11435],{"className":11433,"code":11434,"language":2185},[2183],"Use @Video1 as reference. Generate a city scene.\n",[28,11436,11434],{"__ignoreMap":141},[11,11438,11439],{},[23,11440,11441],{},"Specific (reliable):",[136,11443,11446],{"className":11444,"code":11445,"language":2185},[2183],"Replicate @Video1's camera movement exactly — the tracking speed,\ntrajectory, and push-in timing. Apply this camera work to a new scene:\na samurai walking through a bamboo forest at dawn.\n",[28,11447,11445],{"__ignoreMap":141},[11,11449,11450,11451,11454],{},"The second version tells the model: extract ",[2619,11452,11453],{},"only"," the camera language from the reference. Generate new content (samurai, bamboo forest) but move the virtual camera exactly as the reference video's camera moves.",[92,11456,11458],{"id":11457},"what-you-can-extract","What You Can Extract",[2036,11460,11461,11474],{},[2039,11462,11463],{},[2042,11464,11465,11468,11471],{},[2045,11466,11467],{},"Reference Element",[2045,11469,11470],{},"Prompt Language",[2045,11472,11473],{},"Example",[2052,11475,11476,11487,11498,11509,11520],{},[2042,11477,11478,11481,11484],{},[2057,11479,11480],{},"Camera path/trajectory",[2057,11482,11483],{},"\"replicate camera movement\"",[2057,11485,11486],{},"Tracking, dolly, orbit, crane",[2042,11488,11489,11492,11495],{},[2057,11490,11491],{},"Camera speed",[2057,11493,11494],{},"\"match camera pacing\"",[2057,11496,11497],{},"Slow creep, fast whip pan",[2042,11499,11500,11503,11506],{},[2057,11501,11502],{},"Camera + subject motion",[2057,11504,11505],{},"\"replicate camera and choreography\"",[2057,11507,11508],{},"Dance + camera combo",[2042,11510,11511,11514,11517],{},[2057,11512,11513],{},"Only subject motion",[2057,11515,11516],{},"\"replicate movement/action from @Video1\"",[2057,11518,11519],{},"Character walking pattern",[2042,11521,11522,11525,11528],{},[2057,11523,11524],{},"Visual effects",[2057,11526,11527],{},"\"replicate transition effects\"",[2057,11529,11530],{},"Whip pan transitions, morphs",[11,11532,11533,11536,11537,11539],{},[23,11534,11535],{},"Key rule:"," Be explicit about what you're referencing. If you want ",[2619,11538,11453],{}," the camera movement, say \"camera movement.\" If you also want the action choreography, say both. Ambiguity leads to mixed results.",[11,11541,11542,11543,11546,11547,493],{},"For a complete guide to the ",[28,11544,11545],{},"@"," tag reference system, see our ",[37,11548,11549],{"href":2966},"Multimodal Reference: The Ultimate Guide to @Tags",[45,11551],{},[48,11553,11555],{"id":11554},"setting-up-your-environment","Setting Up Your Environment",[92,11557,11559],{"id":11558},"requirements","Requirements",[97,11561,11562,11564,11569,11576],{},[73,11563,103],{},[73,11565,11566,11568],{},[28,11567,113],{}," library",[73,11570,11571,11572,108],{},"EvoLink API key (",[37,11573,11575],{"href":211,"rel":11574},[41],"sign up free",[73,11577,11578],{},"Reference video files (MP4, 2–15 seconds, under 50MB, 480p–720p)",[92,11580,11582],{"id":11581},"install-dependencies","Install Dependencies",[136,11584,11585],{"className":138,"code":317,"language":140,"meta":141,"style":141},[28,11586,11587],{"__ignoreMap":141},[145,11588,11589,11591,11593],{"class":147,"line":148},[145,11590,190],{"class":151},[145,11592,193],{"class":159},[145,11594,328],{"class":159},[92,11596,11598],{"id":11597},"base-api-configuration","Base API Configuration",[136,11600,11602],{"className":338,"code":11601,"language":340,"meta":141,"style":141},"import requests\nimport time\n\nEVOLINK_API_KEY = \"your-evolink-api-key\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {EVOLINK_API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef poll_task(task_id, interval=5, timeout=300):\n    elapsed = 0\n    while elapsed \u003C timeout:\n        resp = requests.get(\n            f\"{BASE_URL}/tasks/{task_id}\",\n            headers=HEADERS\n        )\n        result = resp.json()\n        status = result.get(\"status\")\n\n        if status == \"completed\":\n            print(f\"Video ready: {result['results'][0]}\")\n            return result\n        elif status == \"failed\":\n            print(f\"Generation failed: {result.get('error')}\")\n            return result\n\n        print(f\"Status: {status} ({elapsed}s elapsed)\")\n        time.sleep(interval)\n        elapsed += interval\n\n    print(\"Timeout reached\")\n    return None\n",[28,11603,11604,11610,11616,11620,11629,11637,11645,11662,11670,11674,11678,11701,11709,11719,11727,11747,11755,11759,11769,11782,11786,11798,11829,11835,11847,11874,11880,11884,11914,11919,11928,11932,11943],{"__ignoreMap":141},[145,11605,11606,11608],{"class":147,"line":148},[145,11607,347],{"class":258},[145,11609,328],{"class":262},[145,11611,11612,11614],{"class":147,"line":166},[145,11613,347],{"class":258},[145,11615,356],{"class":262},[145,11617,11618],{"class":147,"line":178},[145,11619,376],{"emptyLinePlaceholder":58},[145,11621,11622,11624,11626],{"class":147,"line":187},[145,11623,275],{"class":155},[145,11625,391],{"class":258},[145,11627,11628],{"class":159}," \"your-evolink-api-key\"\n",[145,11630,11631,11633,11635],{"class":147,"line":373},[145,11632,412],{"class":155},[145,11634,391],{"class":258},[145,11636,417],{"class":159},[145,11638,11639,11641,11643],{"class":147,"line":379},[145,11640,423],{"class":155},[145,11642,391],{"class":258},[145,11644,428],{"class":262},[145,11646,11647,11649,11651,11653,11655,11658,11660],{"class":147,"line":385},[145,11648,434],{"class":159},[145,11650,437],{"class":262},[145,11652,440],{"class":258},[145,11654,443],{"class":159},[145,11656,11657],{"class":155},"{EVOLINK_API_KEY}",[145,11659,449],{"class":159},[145,11661,452],{"class":262},[145,11663,11664,11666,11668],{"class":147,"line":409},[145,11665,458],{"class":159},[145,11667,437],{"class":262},[145,11669,463],{"class":159},[145,11671,11672],{"class":147,"line":420},[145,11673,469],{"class":262},[145,11675,11676],{"class":147,"line":431},[145,11677,376],{"emptyLinePlaceholder":58},[145,11679,11680,11682,11685,11688,11690,11692,11694,11696,11699],{"class":147,"line":455},[145,11681,526],{"class":258},[145,11683,11684],{"class":151}," poll_task",[145,11686,11687],{"class":262},"(task_id, interval",[145,11689,266],{"class":258},[145,11691,1352],{"class":155},[145,11693,540],{"class":262},[145,11695,266],{"class":258},[145,11697,11698],{"class":155},"300",[145,11700,548],{"class":262},[145,11702,11703,11705,11707],{"class":147,"line":466},[145,11704,631],{"class":262},[145,11706,266],{"class":258},[145,11708,636],{"class":155},[145,11710,11711,11713,11715,11717],{"class":147,"line":600},[145,11712,642],{"class":258},[145,11714,645],{"class":262},[145,11716,648],{"class":258},[145,11718,651],{"class":262},[145,11720,11721,11723,11725],{"class":147,"line":605},[145,11722,6929],{"class":262},[145,11724,266],{"class":258},[145,11726,668],{"class":262},[145,11728,11729,11731,11733,11735,11737,11739,11741,11743,11745],{"class":147,"line":611},[145,11730,674],{"class":258},[145,11732,449],{"class":159},[145,11734,679],{"class":155},[145,11736,682],{"class":159},[145,11738,685],{"class":155},[145,11740,688],{"class":262},[145,11742,691],{"class":155},[145,11744,449],{"class":159},[145,11746,452],{"class":262},[145,11748,11749,11751,11753],{"class":147,"line":617},[145,11750,702],{"class":701},[145,11752,266],{"class":258},[145,11754,707],{"class":155},[145,11756,11757],{"class":147,"line":623},[145,11758,713],{"class":262},[145,11760,11761,11764,11766],{"class":147,"line":628},[145,11762,11763],{"class":262},"        result ",[145,11765,266],{"class":258},[145,11767,11768],{"class":262}," resp.json()\n",[145,11770,11771,11773,11775,11778,11780],{"class":147,"line":639},[145,11772,753],{"class":262},[145,11774,266],{"class":258},[145,11776,11777],{"class":262}," result.get(",[145,11779,761],{"class":159},[145,11781,406],{"class":262},[145,11783,11784],{"class":147,"line":654},[145,11785,376],{"emptyLinePlaceholder":58},[145,11787,11788,11790,11792,11794,11796],{"class":147,"line":660},[145,11789,848],{"class":258},[145,11791,851],{"class":262},[145,11793,854],{"class":258},[145,11795,857],{"class":159},[145,11797,860],{"class":262},[145,11799,11800,11802,11804,11806,11809,11811,11814,11817,11819,11821,11823,11825,11827],{"class":147,"line":671},[145,11801,5577],{"class":155},[145,11803,794],{"class":262},[145,11805,440],{"class":258},[145,11807,11808],{"class":159},"\"Video ready: ",[145,11810,685],{"class":155},[145,11812,11813],{"class":262},"result[",[145,11815,11816],{"class":159},"'results'",[145,11818,1562],{"class":262},[145,11820,783],{"class":155},[145,11822,1535],{"class":262},[145,11824,691],{"class":155},[145,11826,449],{"class":159},[145,11828,406],{"class":262},[145,11830,11831,11833],{"class":147,"line":698},[145,11832,866],{"class":258},[145,11834,1706],{"class":262},[145,11836,11837,11839,11841,11843,11845],{"class":147,"line":710},[145,11838,875],{"class":258},[145,11840,851],{"class":262},[145,11842,854],{"class":258},[145,11844,882],{"class":159},[145,11846,860],{"class":262},[145,11848,11849,11851,11853,11855,11858,11860,11863,11866,11868,11870,11872],{"class":147,"line":716},[145,11850,5577],{"class":155},[145,11852,794],{"class":262},[145,11854,440],{"class":258},[145,11856,11857],{"class":159},"\"Generation failed: ",[145,11859,685],{"class":155},[145,11861,11862],{"class":262},"result.get(",[145,11864,11865],{"class":159},"'error'",[145,11867,108],{"class":262},[145,11869,691],{"class":155},[145,11871,449],{"class":159},[145,11873,406],{"class":262},[145,11875,11876,11878],{"class":147,"line":722},[145,11877,866],{"class":258},[145,11879,1706],{"class":262},[145,11881,11882],{"class":147,"line":728},[145,11883,376],{"emptyLinePlaceholder":58},[145,11885,11886,11888,11890,11892,11895,11897,11899,11901,11903,11905,11907,11909,11912],{"class":147,"line":739},[145,11887,791],{"class":155},[145,11889,794],{"class":262},[145,11891,440],{"class":258},[145,11893,11894],{"class":159},"\"Status: ",[145,11896,685],{"class":155},[145,11898,814],{"class":262},[145,11900,691],{"class":155},[145,11902,1218],{"class":159},[145,11904,685],{"class":155},[145,11906,804],{"class":262},[145,11908,691],{"class":155},[145,11910,11911],{"class":159},"s elapsed)\"",[145,11913,406],{"class":262},[145,11915,11916],{"class":147,"line":744},[145,11917,11918],{"class":262},"        time.sleep(interval)\n",[145,11920,11921,11923,11925],{"class":147,"line":750},[145,11922,979],{"class":262},[145,11924,982],{"class":258},[145,11926,11927],{"class":262}," interval\n",[145,11929,11930],{"class":147,"line":767},[145,11931,376],{"emptyLinePlaceholder":58},[145,11933,11934,11936,11938,11941],{"class":147,"line":788},[145,11935,1102],{"class":155},[145,11937,794],{"class":262},[145,11939,11940],{"class":159},"\"Timeout reached\"",[145,11942,406],{"class":262},[145,11944,11945,11947],{"class":147,"line":834},[145,11946,1703],{"class":258},[145,11948,11949],{"class":155}," None\n",[11,11951,11952],{},"This base code handles authentication and task polling. Every case below builds on it.",[11,11954,11955,11957,11958,11962],{},[23,11956,9058],{}," at ",[37,11959,11961],{"href":211,"rel":11960},[41],"evolink.ai"," to follow along with the examples below.",[45,11964],{},[48,11966,11968],{"id":11967},"case-1-one-take-tracking-shot","Case 1: One-Take Tracking Shot",[11,11970,11971,11972,11975,11976,493],{},"The one-take tracking shot is one of the most impressive camera techniques in filmmaking. The camera follows a subject through multiple environments in a single continuous take — no cuts. Think of the famous Copacabana scene in ",[2619,11973,11974],{},"Goodfellas"," or the hallway fight in ",[2619,11977,11978],{},"Oldboy",[11,11980,11981],{},"With Seedance 2.0, you replicate this by uploading a reference video that demonstrates a continuous tracking movement, then generating new content that follows the same camera path.",[92,11983,11985],{"id":11984},"what-you-need","What You Need",[11,11987,11988,11991],{},[23,11989,11990],{},"Reference video:"," Any clip showing a continuous tracking camera movement (2–15 seconds). A gimbal walking shot, a drone following shot, or a Steadicam clip works well.",[11,11993,11994,11997,11998,12001],{},[23,11995,11996],{},"Prompt:"," Describes the ",[2619,11999,12000],{},"new content"," to generate, while referencing the camera movement from your video.",[92,12003,12005],{"id":12004},"the-prompt","The Prompt",[136,12007,12010],{"className":12008,"code":12009,"language":2185},[2183],"Replicate @Video1's camera movement exactly — continuous one-take\ntracking shot, maintaining the same speed, trajectory, and smooth\nforward motion throughout.\n\nApply this camera work to a new scene: a parkour runner sprinting\nthrough narrow city alleyways, leaping over obstacles, vaulting up\na staircase, and reaching a rooftop overlooking the city skyline.\nGolden sunset lighting. Dynamic and energetic. No cuts.\n",[28,12011,12009],{"__ignoreMap":141},[11,12013,12014],{},"Key elements of this prompt:",[97,12016,12017,12025,12031],{},[73,12018,12019,12022,12023],{},[23,12020,12021],{},"Line 1–3:"," Explicitly tells the model to extract camera movement from ",[28,12024,11421],{},[73,12026,12027,12030],{},[23,12028,12029],{},"Line 5–8:"," Describes entirely new content — the model generates this subject matter",[73,12032,12033,12036],{},[23,12034,12035],{},"\"No cuts\":"," Reinforces the one-take requirement",[92,12038,12040],{"id":12039},"complete-python-code","Complete Python Code",[136,12042,12044],{"className":338,"code":12043,"language":340,"meta":141,"style":141},"# Case 1: One-Take Tracking Shot\n\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Replicate @Video1's camera movement exactly — continuous \"\n            \"one-take tracking shot, maintaining the same speed, \"\n            \"trajectory, and smooth forward motion throughout.\\n\\n\"\n            \"Apply this camera work to a new scene: a parkour runner \"\n            \"sprinting through narrow city alleyways, leaping over \"\n            \"obstacles, vaulting up a staircase, and reaching a rooftop \"\n            \"overlooking the city skyline. Golden sunset lighting. \"\n            \"Dynamic and energetic. No cuts.\"\n        ),\n        \"video_urls\": [\"https://your-cdn.com/tracking_reference.mp4\"],\n        \"duration\": 10,\n        \"quality\": \"720p\"\n    }\n)\n\ntask_id = response.json()[\"id\"]\nprint(f\"Task created: {task_id}\")\nresult = poll_task(task_id)\n",[28,12045,12046,12051,12055,12063,12075,12085,12093,12103,12109,12114,12119,12129,12134,12139,12144,12149,12154,12158,12170,12180,12188,12192,12196,12200,12214,12234],{"__ignoreMap":141},[145,12047,12048],{"class":147,"line":148},[145,12049,12050],{"class":174},"# Case 1: One-Take Tracking Shot\n",[145,12052,12053],{"class":147,"line":166},[145,12054,376],{"emptyLinePlaceholder":58},[145,12056,12057,12059,12061],{"class":147,"line":178},[145,12058,6529],{"class":262},[145,12060,266],{"class":258},[145,12062,1432],{"class":262},[145,12064,12065,12067,12069,12071,12073],{"class":147,"line":187},[145,12066,6538],{"class":258},[145,12068,449],{"class":159},[145,12070,679],{"class":155},[145,12072,1444],{"class":159},[145,12074,452],{"class":262},[145,12076,12077,12079,12081,12083],{"class":147,"line":373},[145,12078,6551],{"class":701},[145,12080,266],{"class":258},[145,12082,423],{"class":155},[145,12084,452],{"class":262},[145,12086,12087,12089,12091],{"class":147,"line":379},[145,12088,6562],{"class":701},[145,12090,266],{"class":258},[145,12092,1865],{"class":262},[145,12094,12095,12097,12099,12101],{"class":147,"line":385},[145,12096,1303],{"class":159},[145,12098,437],{"class":262},[145,12100,1308],{"class":159},[145,12102,452],{"class":262},[145,12104,12105,12107],{"class":147,"line":409},[145,12106,1319],{"class":159},[145,12108,1322],{"class":262},[145,12110,12111],{"class":147,"line":420},[145,12112,12113],{"class":159},"            \"Replicate @Video1's camera movement exactly — continuous \"\n",[145,12115,12116],{"class":147,"line":431},[145,12117,12118],{"class":159},"            \"one-take tracking shot, maintaining the same speed, \"\n",[145,12120,12121,12124,12127],{"class":147,"line":455},[145,12122,12123],{"class":159},"            \"trajectory, and smooth forward motion throughout.",[145,12125,12126],{"class":155},"\\n\\n",[145,12128,950],{"class":159},[145,12130,12131],{"class":147,"line":466},[145,12132,12133],{"class":159},"            \"Apply this camera work to a new scene: a parkour runner \"\n",[145,12135,12136],{"class":147,"line":600},[145,12137,12138],{"class":159},"            \"sprinting through narrow city alleyways, leaping over \"\n",[145,12140,12141],{"class":147,"line":605},[145,12142,12143],{"class":159},"            \"obstacles, vaulting up a staircase, and reaching a rooftop \"\n",[145,12145,12146],{"class":147,"line":611},[145,12147,12148],{"class":159},"            \"overlooking the city skyline. Golden sunset lighting. \"\n",[145,12150,12151],{"class":147,"line":617},[145,12152,12153],{"class":159},"            \"Dynamic and energetic. No cuts.\"\n",[145,12155,12156],{"class":147,"line":623},[145,12157,1342],{"class":262},[145,12159,12160,12163,12165,12168],{"class":147,"line":628},[145,12161,12162],{"class":159},"        \"video_urls\"",[145,12164,10841],{"class":262},[145,12166,12167],{"class":159},"\"https://your-cdn.com/tracking_reference.mp4\"",[145,12169,10847],{"class":262},[145,12171,12172,12174,12176,12178],{"class":147,"line":639},[145,12173,1347],{"class":159},[145,12175,437],{"class":262},[145,12177,537],{"class":155},[145,12179,452],{"class":262},[145,12181,12182,12184,12186],{"class":147,"line":654},[145,12183,1363],{"class":159},[145,12185,437],{"class":262},[145,12187,8512],{"class":159},[145,12189,12190],{"class":147,"line":660},[145,12191,1407],{"class":262},[145,12193,12194],{"class":147,"line":671},[145,12195,406],{"class":262},[145,12197,12198],{"class":147,"line":698},[145,12199,376],{"emptyLinePlaceholder":58},[145,12201,12202,12205,12207,12210,12212],{"class":147,"line":710},[145,12203,12204],{"class":262},"task_id ",[145,12206,266],{"class":258},[145,12208,12209],{"class":262}," response.json()[",[145,12211,1626],{"class":159},[145,12213,764],{"class":262},[145,12215,12216,12218,12220,12222,12224,12226,12228,12230,12232],{"class":147,"line":716},[145,12217,6584],{"class":155},[145,12219,794],{"class":262},[145,12221,440],{"class":258},[145,12223,1524],{"class":159},[145,12225,685],{"class":155},[145,12227,688],{"class":262},[145,12229,691],{"class":155},[145,12231,449],{"class":159},[145,12233,406],{"class":262},[145,12235,12236,12239,12241],{"class":147,"line":722},[145,12237,12238],{"class":262},"result ",[145,12240,266],{"class":258},[145,12242,12243],{"class":262}," poll_task(task_id)\n",[92,12245,12247],{"id":12246},"what-to-expect","What to Expect",[11,12249,12250,12251,493],{},"The generated video will show a parkour runner in a city environment — but the camera movement (tracking speed, forward momentum, smooth continuous motion) comes from your reference video. The model doesn't copy the subject or scenery from the reference. It copies ",[2619,12252,12253],{},"how the camera moves",[56,12255,60,12256],{"controls":58,"playsInline":58,"style":59},[62,12257],{"src":12258,"type":65},"https://cdn.evolink.ai/seedance2api/%E5%9F%8E%E5%B8%82%E8%B7%91%E9%85%B7.mp4",[11,12260,12261],{},[2619,12262,12263],{},"Example output: One-take tracking shot following a parkour runner through urban environments. Camera maintains continuous forward motion with smooth gimbal-like stability.",[11,12265,12266,12269],{},[23,12267,12268],{},"Try it yourself:"," Swap in your own reference video — a drone following shot, a car dashcam clip, or a walking gimbal video — and change the prompt to match your desired scene. The camera movement transfers.",[45,12271],{},[48,12273,12275],{"id":12274},"case-2-hitchcock-zoom-dolly-zoom","Case 2: Hitchcock Zoom (Dolly Zoom)",[11,12277,12278,12279,12282],{},"The dolly zoom — invented for Alfred Hitchcock's ",[2619,12280,12281],{},"Vertigo"," (1958) — is one of cinema's most disorienting and powerful camera techniques. The camera physically moves toward (or away from) the subject while the lens zooms in the opposite direction. The subject stays the same size in frame, but the background warps dramatically. It creates a visceral sense of unease, realization, or emotional shift.",[11,12284,12285],{},"In real filmmaking, this requires a dolly track and precise zoom timing. With Seedance 2.0, you need a reference clip.",[92,12287,11985],{"id":12288},"what-you-need-1",[11,12290,12291,12293],{},[23,12292,11990],{}," A clip demonstrating a dolly zoom effect. You can find examples on YouTube by searching \"dolly zoom effect\" or \"vertigo effect tutorial.\" The clip should be 3–8 seconds showing the background compression/expansion while the subject stays stationary.",[11,12295,12296,12298],{},[23,12297,11996],{}," New subject matter with explicit dolly zoom reference.",[92,12300,12005],{"id":12301},"the-prompt-1",[136,12303,12306],{"className":12304,"code":12305,"language":2185},[2183],"Replicate @Video1's camera technique exactly — the dolly zoom\n(Hitchcock zoom) effect where the camera moves forward while\nzooming out, keeping the subject the same size while the\nbackground dramatically stretches.\n\nApply this effect to: a detective standing in a dim corridor.\nAs the dolly zoom activates, the corridor behind him stretches\nimpossibly long, creating a sense of dawning horror.\nDramatic side lighting with deep shadows. Film noir atmosphere.\n",[28,12307,12305],{"__ignoreMap":141},[92,12309,12040],{"id":12310},"complete-python-code-1",[136,12312,12314],{"className":338,"code":12313,"language":340,"meta":141,"style":141},"# Case 2: Hitchcock Zoom (Dolly Zoom)\n\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Replicate @Video1's camera technique exactly — the dolly \"\n            \"zoom (Hitchcock zoom) effect where the camera moves forward \"\n            \"while zooming out, keeping the subject the same size while \"\n            \"the background dramatically stretches.\\n\\n\"\n            \"Apply this effect to: a detective standing in a dim \"\n            \"corridor. As the dolly zoom activates, the corridor behind \"\n            \"him stretches impossibly long, creating a sense of dawning \"\n            \"horror. Dramatic side lighting with deep shadows. \"\n            \"Film noir atmosphere.\"\n        ),\n        \"video_urls\": [\"https://your-cdn.com/dolly_zoom_reference.mp4\"],\n        \"duration\": 8,\n        \"quality\": \"720p\"\n    }\n)\n\ntask_id = response.json()[\"id\"]\nprint(f\"Task created: {task_id}\")\nresult = poll_task(task_id)\n",[28,12315,12316,12321,12325,12333,12345,12355,12363,12373,12379,12384,12389,12394,12403,12408,12413,12418,12423,12428,12432,12443,12453,12461,12465,12469,12473,12485,12505],{"__ignoreMap":141},[145,12317,12318],{"class":147,"line":148},[145,12319,12320],{"class":174},"# Case 2: Hitchcock Zoom (Dolly Zoom)\n",[145,12322,12323],{"class":147,"line":166},[145,12324,376],{"emptyLinePlaceholder":58},[145,12326,12327,12329,12331],{"class":147,"line":178},[145,12328,6529],{"class":262},[145,12330,266],{"class":258},[145,12332,1432],{"class":262},[145,12334,12335,12337,12339,12341,12343],{"class":147,"line":187},[145,12336,6538],{"class":258},[145,12338,449],{"class":159},[145,12340,679],{"class":155},[145,12342,1444],{"class":159},[145,12344,452],{"class":262},[145,12346,12347,12349,12351,12353],{"class":147,"line":373},[145,12348,6551],{"class":701},[145,12350,266],{"class":258},[145,12352,423],{"class":155},[145,12354,452],{"class":262},[145,12356,12357,12359,12361],{"class":147,"line":379},[145,12358,6562],{"class":701},[145,12360,266],{"class":258},[145,12362,1865],{"class":262},[145,12364,12365,12367,12369,12371],{"class":147,"line":385},[145,12366,1303],{"class":159},[145,12368,437],{"class":262},[145,12370,1308],{"class":159},[145,12372,452],{"class":262},[145,12374,12375,12377],{"class":147,"line":409},[145,12376,1319],{"class":159},[145,12378,1322],{"class":262},[145,12380,12381],{"class":147,"line":420},[145,12382,12383],{"class":159},"            \"Replicate @Video1's camera technique exactly — the dolly \"\n",[145,12385,12386],{"class":147,"line":431},[145,12387,12388],{"class":159},"            \"zoom (Hitchcock zoom) effect where the camera moves forward \"\n",[145,12390,12391],{"class":147,"line":455},[145,12392,12393],{"class":159},"            \"while zooming out, keeping the subject the same size while \"\n",[145,12395,12396,12399,12401],{"class":147,"line":466},[145,12397,12398],{"class":159},"            \"the background dramatically stretches.",[145,12400,12126],{"class":155},[145,12402,950],{"class":159},[145,12404,12405],{"class":147,"line":600},[145,12406,12407],{"class":159},"            \"Apply this effect to: a detective standing in a dim \"\n",[145,12409,12410],{"class":147,"line":605},[145,12411,12412],{"class":159},"            \"corridor. As the dolly zoom activates, the corridor behind \"\n",[145,12414,12415],{"class":147,"line":611},[145,12416,12417],{"class":159},"            \"him stretches impossibly long, creating a sense of dawning \"\n",[145,12419,12420],{"class":147,"line":617},[145,12421,12422],{"class":159},"            \"horror. Dramatic side lighting with deep shadows. \"\n",[145,12424,12425],{"class":147,"line":623},[145,12426,12427],{"class":159},"            \"Film noir atmosphere.\"\n",[145,12429,12430],{"class":147,"line":628},[145,12431,1342],{"class":262},[145,12433,12434,12436,12438,12441],{"class":147,"line":639},[145,12435,12162],{"class":159},[145,12437,10841],{"class":262},[145,12439,12440],{"class":159},"\"https://your-cdn.com/dolly_zoom_reference.mp4\"",[145,12442,10847],{"class":262},[145,12444,12445,12447,12449,12451],{"class":147,"line":654},[145,12446,1347],{"class":159},[145,12448,437],{"class":262},[145,12450,3698],{"class":155},[145,12452,452],{"class":262},[145,12454,12455,12457,12459],{"class":147,"line":660},[145,12456,1363],{"class":159},[145,12458,437],{"class":262},[145,12460,8512],{"class":159},[145,12462,12463],{"class":147,"line":671},[145,12464,1407],{"class":262},[145,12466,12467],{"class":147,"line":698},[145,12468,406],{"class":262},[145,12470,12471],{"class":147,"line":710},[145,12472,376],{"emptyLinePlaceholder":58},[145,12474,12475,12477,12479,12481,12483],{"class":147,"line":716},[145,12476,12204],{"class":262},[145,12478,266],{"class":258},[145,12480,12209],{"class":262},[145,12482,1626],{"class":159},[145,12484,764],{"class":262},[145,12486,12487,12489,12491,12493,12495,12497,12499,12501,12503],{"class":147,"line":722},[145,12488,6584],{"class":155},[145,12490,794],{"class":262},[145,12492,440],{"class":258},[145,12494,1524],{"class":159},[145,12496,685],{"class":155},[145,12498,688],{"class":262},[145,12500,691],{"class":155},[145,12502,449],{"class":159},[145,12504,406],{"class":262},[145,12506,12507,12509,12511],{"class":147,"line":728},[145,12508,12238],{"class":262},[145,12510,266],{"class":258},[145,12512,12243],{"class":262},[92,12514,12516],{"id":12515},"why-this-works","Why This Works",[11,12518,12519,12520,12523],{},"The dolly zoom is notoriously hard to describe in text. Prompting \"zoom in while moving backward\" often produces confused results in other AI video tools. By providing a reference video that ",[2619,12521,12522],{},"demonstrates"," the technique, Seedance 2.0 can analyze the spatial relationship changes — how the background compresses/expands relative to the foreground — and reproduce them precisely.",[11,12525,12526,12528],{},[23,12527,11200],{}," The cleaner and more isolated the dolly zoom in your reference video, the better. Avoid reference clips with lots of subject movement or scene changes — the model might confuse camera motion with subject motion.",[45,12530],{},[48,12532,12534],{"id":12533},"case-3-orbital-camera-360-rotation","Case 3: Orbital Camera (360° Rotation)",[11,12536,12537],{},"The orbital shot rotates the camera around a subject, creating a dramatic reveal or establishing a character's presence. It's a staple of music videos, hero introductions, and product showcases.",[92,12539,11985],{"id":12540},"what-you-need-2",[11,12542,12543,12545],{},[23,12544,11990],{}," A clip showing a camera orbiting around a subject. A smooth 180° or 360° rotation works best. Turntable product shots or character reveal shots are ideal references.",[11,12547,12548,12550],{},[23,12549,11996],{}," New subject + explicit orbital reference.",[92,12552,12005],{"id":12553},"the-prompt-2",[136,12555,12558],{"className":12556,"code":12557,"language":2185},[2183],"Replicate @Video1's orbital camera movement — the smooth 360°\nrotation around the subject, maintaining consistent distance\nand speed throughout the arc.\n\nApply this camera movement to: a lone astronaut standing on\nthe surface of Mars. Red desert landscape stretches to the\nhorizon. The orbital camera reveals the astronaut from all\nangles as dust particles float in the thin atmosphere.\nEpic cinematic scale. Golden hour Martian lighting.\n",[28,12559,12557],{"__ignoreMap":141},[92,12561,12040],{"id":12562},"complete-python-code-2",[136,12564,12566],{"className":338,"code":12565,"language":340,"meta":141,"style":141},"# Case 3: Orbital Camera (360 Rotation)\n\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Replicate @Video1's orbital camera movement — the smooth \"\n            \"360 degree rotation around the subject, maintaining consistent \"\n            \"distance and speed throughout the arc.\\n\\n\"\n            \"Apply this camera movement to: a lone astronaut standing \"\n            \"on the surface of Mars. Red desert landscape stretches to \"\n            \"the horizon. The orbital camera reveals the astronaut from \"\n            \"all angles as dust particles float in the thin atmosphere. \"\n            \"Epic cinematic scale. Golden hour Martian lighting.\"\n        ),\n        \"video_urls\": [\"https://your-cdn.com/orbital_reference.mp4\"],\n        \"duration\": 10,\n        \"quality\": \"720p\"\n    }\n)\n\ntask_id = response.json()[\"id\"]\nprint(f\"Task created: {task_id}\")\nresult = poll_task(task_id)\n",[28,12567,12568,12573,12577,12585,12597,12607,12615,12625,12631,12636,12641,12650,12655,12660,12665,12670,12675,12679,12690,12700,12708,12712,12716,12720,12732,12752],{"__ignoreMap":141},[145,12569,12570],{"class":147,"line":148},[145,12571,12572],{"class":174},"# Case 3: Orbital Camera (360 Rotation)\n",[145,12574,12575],{"class":147,"line":166},[145,12576,376],{"emptyLinePlaceholder":58},[145,12578,12579,12581,12583],{"class":147,"line":178},[145,12580,6529],{"class":262},[145,12582,266],{"class":258},[145,12584,1432],{"class":262},[145,12586,12587,12589,12591,12593,12595],{"class":147,"line":187},[145,12588,6538],{"class":258},[145,12590,449],{"class":159},[145,12592,679],{"class":155},[145,12594,1444],{"class":159},[145,12596,452],{"class":262},[145,12598,12599,12601,12603,12605],{"class":147,"line":373},[145,12600,6551],{"class":701},[145,12602,266],{"class":258},[145,12604,423],{"class":155},[145,12606,452],{"class":262},[145,12608,12609,12611,12613],{"class":147,"line":379},[145,12610,6562],{"class":701},[145,12612,266],{"class":258},[145,12614,1865],{"class":262},[145,12616,12617,12619,12621,12623],{"class":147,"line":385},[145,12618,1303],{"class":159},[145,12620,437],{"class":262},[145,12622,1308],{"class":159},[145,12624,452],{"class":262},[145,12626,12627,12629],{"class":147,"line":409},[145,12628,1319],{"class":159},[145,12630,1322],{"class":262},[145,12632,12633],{"class":147,"line":420},[145,12634,12635],{"class":159},"            \"Replicate @Video1's orbital camera movement — the smooth \"\n",[145,12637,12638],{"class":147,"line":431},[145,12639,12640],{"class":159},"            \"360 degree rotation around the subject, maintaining consistent \"\n",[145,12642,12643,12646,12648],{"class":147,"line":455},[145,12644,12645],{"class":159},"            \"distance and speed throughout the arc.",[145,12647,12126],{"class":155},[145,12649,950],{"class":159},[145,12651,12652],{"class":147,"line":466},[145,12653,12654],{"class":159},"            \"Apply this camera movement to: a lone astronaut standing \"\n",[145,12656,12657],{"class":147,"line":600},[145,12658,12659],{"class":159},"            \"on the surface of Mars. Red desert landscape stretches to \"\n",[145,12661,12662],{"class":147,"line":605},[145,12663,12664],{"class":159},"            \"the horizon. The orbital camera reveals the astronaut from \"\n",[145,12666,12667],{"class":147,"line":611},[145,12668,12669],{"class":159},"            \"all angles as dust particles float in the thin atmosphere. \"\n",[145,12671,12672],{"class":147,"line":617},[145,12673,12674],{"class":159},"            \"Epic cinematic scale. Golden hour Martian lighting.\"\n",[145,12676,12677],{"class":147,"line":623},[145,12678,1342],{"class":262},[145,12680,12681,12683,12685,12688],{"class":147,"line":628},[145,12682,12162],{"class":159},[145,12684,10841],{"class":262},[145,12686,12687],{"class":159},"\"https://your-cdn.com/orbital_reference.mp4\"",[145,12689,10847],{"class":262},[145,12691,12692,12694,12696,12698],{"class":147,"line":639},[145,12693,1347],{"class":159},[145,12695,437],{"class":262},[145,12697,537],{"class":155},[145,12699,452],{"class":262},[145,12701,12702,12704,12706],{"class":147,"line":654},[145,12703,1363],{"class":159},[145,12705,437],{"class":262},[145,12707,8512],{"class":159},[145,12709,12710],{"class":147,"line":660},[145,12711,1407],{"class":262},[145,12713,12714],{"class":147,"line":671},[145,12715,406],{"class":262},[145,12717,12718],{"class":147,"line":698},[145,12719,376],{"emptyLinePlaceholder":58},[145,12721,12722,12724,12726,12728,12730],{"class":147,"line":710},[145,12723,12204],{"class":262},[145,12725,266],{"class":258},[145,12727,12209],{"class":262},[145,12729,1626],{"class":159},[145,12731,764],{"class":262},[145,12733,12734,12736,12738,12740,12742,12744,12746,12748,12750],{"class":147,"line":716},[145,12735,6584],{"class":155},[145,12737,794],{"class":262},[145,12739,440],{"class":258},[145,12741,1524],{"class":159},[145,12743,685],{"class":155},[145,12745,688],{"class":262},[145,12747,691],{"class":155},[145,12749,449],{"class":159},[145,12751,406],{"class":262},[145,12753,12754,12756,12758],{"class":147,"line":722},[145,12755,12238],{"class":262},[145,12757,266],{"class":258},[145,12759,12243],{"class":262},[92,12761,12763],{"id":12762},"choosing-the-right-orbital-reference","Choosing the Right Orbital Reference",[11,12765,12766],{},"Not all orbital shots are equal. The reference video determines:",[2036,12768,12769,12779],{},[2039,12770,12771],{},[2042,12772,12773,12776],{},[2045,12774,12775],{},"Reference Quality",[2045,12777,12778],{},"Result Quality",[2052,12780,12781,12789,12797,12805],{},[2042,12782,12783,12786],{},[2057,12784,12785],{},"Smooth, steady rotation at constant speed",[2057,12787,12788],{},"Clean, professional orbital",[2042,12790,12791,12794],{},[2057,12792,12793],{},"Handheld wobbly rotation",[2057,12795,12796],{},"Organic, documentary-style orbit",[2042,12798,12799,12802],{},[2057,12800,12801],{},"Fast whip-around",[2057,12803,12804],{},"Dynamic, high-energy reveal",[2042,12806,12807,12810],{},[2057,12808,12809],{},"Slow 90° partial orbit",[2057,12811,12812],{},"Subtle, dramatic angle shift",[11,12814,12815],{},"Pick a reference that matches the energy you want. A turntable product video gives you machine-smooth rotation. A handheld walk-around gives you organic movement.",[45,12817],{},[48,12819,12821],{"id":12820},"advanced-combining-camera-movement-with-other-references","Advanced: Combining Camera Movement with Other References",[11,12823,12824],{},"The real power of Seedance 2.0's reference system emerges when you combine camera movement with other input types. You're not limited to a single reference — you can use up to 3 video references and 9 image references (12 files total).",[92,12826,12828],{"id":12827},"camera-character-style","Camera + Character + Style",[11,12830,12831],{},"Here's a three-input combination:",[97,12833,12834,12839,12844],{},[73,12835,12836,12838],{},[28,12837,11421],{}," — camera movement (orbital shot)",[73,12840,12841,12843],{},[28,12842,2908],{}," — character appearance (a specific character design)",[73,12845,12846,12848],{},[28,12847,2918],{}," — style reference (a particular art style or color palette)",[136,12850,12852],{"className":338,"code":12851,"language":340,"meta":141,"style":141},"# Advanced: Camera + Character + Style combination\n\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Replicate @Video1's orbital camera movement — smooth \"\n            \"rotation around the subject.\\n\\n\"\n            \"@Image1 is the character — maintain this character's \"\n            \"appearance exactly.\\n\\n\"\n            \"@Image2 is the visual style reference — match its color \"\n            \"palette, lighting mood, and artistic treatment.\\n\\n\"\n            \"Scene: The character from @Image1 stands in the center \"\n            \"of a grand cathedral. The orbital camera from @Video1 \"\n            \"slowly reveals the architecture. Visual style matches \"\n            \"@Image2 throughout.\"\n        ),\n        \"image_urls\": [\n            \"https://your-cdn.com/character_design.png\",\n            \"https://your-cdn.com/art_style_reference.jpg\"\n        ],\n        \"video_urls\": [\n            \"https://your-cdn.com/orbital_reference.mp4\"\n        ],\n        \"duration\": 10,\n        \"quality\": \"720p\"\n    }\n)\n\ntask_id = response.json()[\"id\"]\nprint(f\"Task created: {task_id}\")\nresult = poll_task(task_id)\n",[28,12853,12854,12859,12863,12871,12883,12893,12901,12911,12917,12922,12931,12936,12945,12950,12959,12964,12969,12974,12979,12983,12989,12996,13001,13005,13011,13016,13020,13030,13038,13042,13046,13050,13062,13082],{"__ignoreMap":141},[145,12855,12856],{"class":147,"line":148},[145,12857,12858],{"class":174},"# Advanced: Camera + Character + Style combination\n",[145,12860,12861],{"class":147,"line":166},[145,12862,376],{"emptyLinePlaceholder":58},[145,12864,12865,12867,12869],{"class":147,"line":178},[145,12866,6529],{"class":262},[145,12868,266],{"class":258},[145,12870,1432],{"class":262},[145,12872,12873,12875,12877,12879,12881],{"class":147,"line":187},[145,12874,6538],{"class":258},[145,12876,449],{"class":159},[145,12878,679],{"class":155},[145,12880,1444],{"class":159},[145,12882,452],{"class":262},[145,12884,12885,12887,12889,12891],{"class":147,"line":373},[145,12886,6551],{"class":701},[145,12888,266],{"class":258},[145,12890,423],{"class":155},[145,12892,452],{"class":262},[145,12894,12895,12897,12899],{"class":147,"line":379},[145,12896,6562],{"class":701},[145,12898,266],{"class":258},[145,12900,1865],{"class":262},[145,12902,12903,12905,12907,12909],{"class":147,"line":385},[145,12904,1303],{"class":159},[145,12906,437],{"class":262},[145,12908,1308],{"class":159},[145,12910,452],{"class":262},[145,12912,12913,12915],{"class":147,"line":409},[145,12914,1319],{"class":159},[145,12916,1322],{"class":262},[145,12918,12919],{"class":147,"line":420},[145,12920,12921],{"class":159},"            \"Replicate @Video1's orbital camera movement — smooth \"\n",[145,12923,12924,12927,12929],{"class":147,"line":431},[145,12925,12926],{"class":159},"            \"rotation around the subject.",[145,12928,12126],{"class":155},[145,12930,950],{"class":159},[145,12932,12933],{"class":147,"line":455},[145,12934,12935],{"class":159},"            \"@Image1 is the character — maintain this character's \"\n",[145,12937,12938,12941,12943],{"class":147,"line":466},[145,12939,12940],{"class":159},"            \"appearance exactly.",[145,12942,12126],{"class":155},[145,12944,950],{"class":159},[145,12946,12947],{"class":147,"line":600},[145,12948,12949],{"class":159},"            \"@Image2 is the visual style reference — match its color \"\n",[145,12951,12952,12955,12957],{"class":147,"line":605},[145,12953,12954],{"class":159},"            \"palette, lighting mood, and artistic treatment.",[145,12956,12126],{"class":155},[145,12958,950],{"class":159},[145,12960,12961],{"class":147,"line":611},[145,12962,12963],{"class":159},"            \"Scene: The character from @Image1 stands in the center \"\n",[145,12965,12966],{"class":147,"line":617},[145,12967,12968],{"class":159},"            \"of a grand cathedral. The orbital camera from @Video1 \"\n",[145,12970,12971],{"class":147,"line":623},[145,12972,12973],{"class":159},"            \"slowly reveals the architecture. Visual style matches \"\n",[145,12975,12976],{"class":147,"line":628},[145,12977,12978],{"class":159},"            \"@Image2 throughout.\"\n",[145,12980,12981],{"class":147,"line":639},[145,12982,1342],{"class":262},[145,12984,12985,12987],{"class":147,"line":654},[145,12986,2688],{"class":159},[145,12988,2691],{"class":262},[145,12990,12991,12994],{"class":147,"line":660},[145,12992,12993],{"class":159},"            \"https://your-cdn.com/character_design.png\"",[145,12995,452],{"class":262},[145,12997,12998],{"class":147,"line":671},[145,12999,13000],{"class":159},"            \"https://your-cdn.com/art_style_reference.jpg\"\n",[145,13002,13003],{"class":147,"line":698},[145,13004,2701],{"class":262},[145,13006,13007,13009],{"class":147,"line":710},[145,13008,12162],{"class":159},[145,13010,2691],{"class":262},[145,13012,13013],{"class":147,"line":716},[145,13014,13015],{"class":159},"            \"https://your-cdn.com/orbital_reference.mp4\"\n",[145,13017,13018],{"class":147,"line":722},[145,13019,2701],{"class":262},[145,13021,13022,13024,13026,13028],{"class":147,"line":728},[145,13023,1347],{"class":159},[145,13025,437],{"class":262},[145,13027,537],{"class":155},[145,13029,452],{"class":262},[145,13031,13032,13034,13036],{"class":147,"line":739},[145,13033,1363],{"class":159},[145,13035,437],{"class":262},[145,13037,8512],{"class":159},[145,13039,13040],{"class":147,"line":744},[145,13041,1407],{"class":262},[145,13043,13044],{"class":147,"line":750},[145,13045,406],{"class":262},[145,13047,13048],{"class":147,"line":767},[145,13049,376],{"emptyLinePlaceholder":58},[145,13051,13052,13054,13056,13058,13060],{"class":147,"line":788},[145,13053,12204],{"class":262},[145,13055,266],{"class":258},[145,13057,12209],{"class":262},[145,13059,1626],{"class":159},[145,13061,764],{"class":262},[145,13063,13064,13066,13068,13070,13072,13074,13076,13078,13080],{"class":147,"line":834},[145,13065,6584],{"class":155},[145,13067,794],{"class":262},[145,13069,440],{"class":258},[145,13071,1524],{"class":159},[145,13073,685],{"class":155},[145,13075,688],{"class":262},[145,13077,691],{"class":155},[145,13079,449],{"class":159},[145,13081,406],{"class":262},[145,13083,13084,13086,13088],{"class":147,"line":839},[145,13085,12238],{"class":262},[145,13087,266],{"class":258},[145,13089,12243],{"class":262},[92,13091,13093],{"id":13092},"reference-allocation-strategy","Reference Allocation Strategy",[11,13095,13096],{},"When mixing multiple reference types, be strategic about your 12-file budget:",[2036,13098,13099,13114],{},[2039,13100,13101],{},[2042,13102,13103,13105,13108,13111],{},[2045,13104,8266],{},[2045,13106,13107],{},"Video Refs",[2045,13109,13110],{},"Image Refs",[2045,13112,13113],{},"Audio Refs",[2052,13115,13116,13128,13140,13152,13164],{},[2042,13117,13118,13121,13124,13126],{},[2057,13119,13120],{},"Camera replication only",[2057,13122,13123],{},"1 (camera)",[2057,13125,783],{},[2057,13127,783],{},[2042,13129,13130,13133,13135,13138],{},[2057,13131,13132],{},"Camera + character",[2057,13134,13123],{},[2057,13136,13137],{},"1 (character)",[2057,13139,783],{},[2042,13141,13142,13145,13147,13150],{},[2057,13143,13144],{},"Camera + character + style",[2057,13146,13123],{},[2057,13148,13149],{},"2 (character + style)",[2057,13151,783],{},[2042,13153,13154,13157,13160,13162],{},[2057,13155,13156],{},"Camera + choreography + character",[2057,13158,13159],{},"2 (camera + dance)",[2057,13161,13137],{},[2057,13163,783],{},[2042,13165,13166,13169,13171,13174],{},[2057,13167,13168],{},"Full production",[2057,13170,13123],{},[2057,13172,13173],{},"3 (character + scene + style)",[2057,13175,13176],{},"1 (music)",[11,13178,13179,13182],{},[23,13180,13181],{},"Rule of thumb:"," Start with 2–3 references. Adding more doesn't always improve results — it can introduce conflicting signals. Use the minimum number of references needed to communicate your intent.",[11,13184,13185,13186,493],{},"For more on multi-reference strategies, see our ",[37,13187,11549],{"href":2966},[45,13189],{},[48,13191,13193],{"id":13192},"common-mistakes-and-how-to-fix-them","Common Mistakes and How to Fix Them",[92,13195,13197],{"id":13196},"mistake-1-not-specifying-what-to-reference","Mistake 1: Not Specifying What to Reference",[11,13199,13200],{},[23,13201,13202],{},"Bad:",[136,13204,13207],{"className":13205,"code":13206,"language":2185},[2183],"Use @Video1. A knight rides a horse through a valley.\n",[28,13208,13206],{"__ignoreMap":141},[11,13210,13211,13212,493],{},"The model doesn't know if you want the camera movement, the subject motion, the visual style, or everything from ",[28,13213,11421],{},[11,13215,13216],{},[23,13217,13218],{},"Good:",[136,13220,13223],{"className":13221,"code":13222,"language":2185},[2183],"Replicate @Video1's camera movement and tracking trajectory.\nA knight rides a horse through a green valley at sunrise.\n",[28,13224,13222],{"__ignoreMap":141},[92,13226,13228],{"id":13227},"mistake-2-reference-video-too-long-or-complex","Mistake 2: Reference Video Too Long or Complex",[11,13230,13231],{},"Reference videos should be 2–15 seconds and show a clean, identifiable camera movement. A 15-second clip with three different camera techniques (pan, then zoom, then orbit) gives confusing signals.",[11,13233,13234,13237],{},[23,13235,13236],{},"Fix:"," Trim your reference to isolate the specific camera movement you want. Use the simplest, cleanest example of the technique.",[92,13239,13241],{"id":13240},"mistake-3-confusing-camera-movement-with-subject-movement","Mistake 3: Confusing Camera Movement with Subject Movement",[11,13243,13244,13245,13248,13249,13252],{},"A reference video of someone dancing contains two things: how the ",[2619,13246,13247],{},"camera"," moves and how the ",[2619,13250,13251],{},"subject"," moves. If you only want the camera work, say so explicitly:",[136,13254,13257],{"className":13255,"code":13256,"language":2185},[2183],"Replicate ONLY @Video1's camera movement — the pan speed, tracking\ntrajectory, and framing rhythm. Ignore the subject's actions.\n\nNew subject: a robot assembling car parts on a factory floor.\n",[28,13258,13256],{"__ignoreMap":141},[92,13260,13262],{"id":13261},"mistake-4-conflicting-prompt-and-reference","Mistake 4: Conflicting Prompt and Reference",[11,13264,13265],{},"If your reference shows a slow, smooth dolly push-in but your prompt says \"fast-paced action with rapid cuts,\" the model receives contradictory signals.",[11,13267,13268,13270,13271,13274,13275,493],{},[23,13269,13236],{}," Align your text prompt with your reference video's energy. The prompt describes ",[2619,13272,13273],{},"content","; the reference demonstrates ",[2619,13276,13277],{},"technique",[92,13279,13281],{"id":13280},"mistake-5-expecting-perfect-first-results","Mistake 5: Expecting Perfect First Results",[11,13283,13284],{},"Camera replication is sophisticated. Your first attempt may not perfectly match the reference. Iterate:",[70,13286,13287,13290,13293,13296],{},[73,13288,13289],{},"Start with a simple prompt + clean reference",[73,13291,13292],{},"Review the output — is the camera movement close?",[73,13294,13295],{},"Adjust the prompt language to be more specific about what's off",[73,13297,13298],{},"Try a different reference video if the technique isn't transferring",[45,13300],{},[48,13302,13304],{"id":13303},"faq","FAQ",[92,13306,13308],{"id":13307},"can-i-combine-camera-movement-from-one-video-with-choreography-from-another","Can I combine camera movement from one video with choreography from another?",[11,13310,13311,13312,13314,13315,13317,13318,13321],{},"Yes. Use two ",[28,13313,2958],{}," references: ",[28,13316,11421],{}," for camera movement and ",[28,13319,13320],{},"@Video2"," for choreography/action. Specify in the prompt: \"Replicate @Video1's camera movement and @Video2's dance choreography.\" Seedance 2.0 supports up to 3 video references simultaneously.",[92,13323,13325],{"id":13324},"what-video-format-and-length-works-best-for-camera-references","What video format and length works best for camera references?",[11,13327,13328],{},"MP4 format, 480p–720p resolution, 2–15 seconds duration, under 50MB file size. For camera movement references, shorter is often better — a clean 3–5 second clip of a single camera technique transfers more reliably than a long clip with multiple techniques.",[92,13330,13332],{"id":13331},"how-is-this-different-from-sora-or-kling-camera-control","How is this different from Sora or Kling camera control?",[11,13334,13335,13336,13338],{},"Sora 2 and Kling 3.0 use text-based camera direction — you describe the movement in words (\"dolly in,\" \"pan left\"). Results depend on how well the model interprets your text. Seedance 2.0 uses reference-based camera control — you show the model what you want via ",[28,13337,2958],{}," tags. This produces more precise and consistent camera replication, especially for complex movements like Hitchcock zooms or one-take tracking shots that are difficult to describe in text.",[92,13340,13342],{"id":13341},"can-i-use-a-screen-recording-or-phone-video-as-a-camera-reference","Can I use a screen recording or phone video as a camera reference?",[11,13344,13345],{},"Yes. Any video that demonstrates the camera movement you want works as a reference. A phone video you shot while walking produces a handheld tracking shot. A screen recording of a film clip transfers that film's camera language. The model extracts the camera behavior regardless of production quality.",[92,13347,13349],{"id":13348},"does-camera-replication-work-with-image-to-video-generation","Does camera replication work with image-to-video generation?",[11,13351,13352,13353,13355,13356,13358],{},"Yes. You can combine ",[28,13354,11421],{}," (camera movement reference) with ",[28,13357,2908],{}," (first frame / character) to generate a video that starts from your image and moves the camera according to your video reference. This is powerful for product videos and character showcases.",[45,13360],{},[48,13362,13364],{"id":13363},"start-replicating-any-camera-movement","Start Replicating Any Camera Movement",[11,13366,13367,13368,13370],{},"Camera movement is no longer limited by equipment or expertise. With a reference video and Seedance 2.0's ",[28,13369,2958],{}," tag system, you can replicate any camera technique — from subtle rack-focus pulls to full Hitchcock zooms — and apply it to any content you can describe.",[11,13372,13373],{},"The three cases in this tutorial cover the most requested camera techniques:",[97,13375,13376,13382,13388],{},[73,13377,13378,13381],{},[23,13379,13380],{},"One-take tracking"," for immersive, continuous movement",[73,13383,13384,13387],{},[23,13385,13386],{},"Dolly zoom"," for dramatic tension and psychological impact",[73,13389,13390,13393],{},[23,13391,13392],{},"Orbital shot"," for character reveals and product showcases",[11,13395,13396],{},"Each works the same way: upload a reference, tag it, describe your scene, let the model handle the camera.",[11,13398,13399,13400,13404],{},"Ready to try it? ",[37,13401,13403],{"href":211,"rel":13402},[41],"Sign up for a free EvoLink API key"," and start generating cinematic AI videos with precise camera control.",[45,13406],{},[11,13408,13409],{},[2619,13410,13411],{},"Related reading:",[97,13413,13414,13424],{},[73,13415,13416,13419,13420,13423],{},[37,13417,13418],{"href":1766},"Seedance 2.0 Prompts: Complete Guide to Multimodal Video Generation"," — master the ",[37,13421,13422],{"href":1766},"shot-script prompting format"," for complex scenes",[73,13425,13426,13429,13430],{},[37,13427,13428],{"href":2966},"Seedance 2.0 Multimodal Reference: The Ultimate Guide to @Tags"," — deep dive into the complete ",[37,13431,13432],{"href":2966},"@tag reference system",[45,13434],{},[11,13436,13437],{},[2619,13438,13439],{},"Last updated: February 20, 2026 | Written by J, Growth Lead at EvoLink",[11217,13441,13442],{},"html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":141,"searchDepth":166,"depth":166,"links":13444},[13445,13446,13450,13455,13461,13467,13473,13477,13484,13491],{"id":11354,"depth":166,"text":11355},{"id":11402,"depth":166,"text":11403,"children":13447},[13448,13449],{"id":11415,"depth":178,"text":11416},{"id":11457,"depth":178,"text":11458},{"id":11554,"depth":166,"text":11555,"children":13451},[13452,13453,13454],{"id":11558,"depth":178,"text":11559},{"id":11581,"depth":178,"text":11582},{"id":11597,"depth":178,"text":11598},{"id":11967,"depth":166,"text":11968,"children":13456},[13457,13458,13459,13460],{"id":11984,"depth":178,"text":11985},{"id":12004,"depth":178,"text":12005},{"id":12039,"depth":178,"text":12040},{"id":12246,"depth":178,"text":12247},{"id":12274,"depth":166,"text":12275,"children":13462},[13463,13464,13465,13466],{"id":12288,"depth":178,"text":11985},{"id":12301,"depth":178,"text":12005},{"id":12310,"depth":178,"text":12040},{"id":12515,"depth":178,"text":12516},{"id":12533,"depth":166,"text":12534,"children":13468},[13469,13470,13471,13472],{"id":12540,"depth":178,"text":11985},{"id":12553,"depth":178,"text":12005},{"id":12562,"depth":178,"text":12040},{"id":12762,"depth":178,"text":12763},{"id":12820,"depth":166,"text":12821,"children":13474},[13475,13476],{"id":12827,"depth":178,"text":12828},{"id":13092,"depth":178,"text":13093},{"id":13192,"depth":166,"text":13193,"children":13478},[13479,13480,13481,13482,13483],{"id":13196,"depth":178,"text":13197},{"id":13227,"depth":178,"text":13228},{"id":13240,"depth":178,"text":13241},{"id":13261,"depth":178,"text":13262},{"id":13280,"depth":178,"text":13281},{"id":13303,"depth":166,"text":13304,"children":13485},[13486,13487,13488,13489,13490],{"id":13307,"depth":178,"text":13308},{"id":13324,"depth":178,"text":13325},{"id":13331,"depth":178,"text":13332},{"id":13341,"depth":178,"text":13342},{"id":13348,"depth":178,"text":13349},{"id":13363,"depth":166,"text":13364},"Learn to replicate Hitchcock zooms, one-take tracking shots & orbital cameras using Seedance 2.0 API. 3 complete Python examples with @Video tags.",{"date":13494,"image":11309,"seoTitle":13495},"2026-02-20","Replicate Camera Movements with Seedance 2.0 API | Tutorial","/en/blog/seedance-2-camera-movement-api",{"title":11291,"description":13492},"en/blog/seedance-2-camera-movement-api","nZPhNUDqpOTiwza7sZ250hO4kzqzNXAcqsEsQU4EGhY",{"id":13501,"title":13502,"body":13503,"description":17376,"extension":11279,"meta":17377,"navigation":58,"path":17382,"seo":17383,"stem":17384,"__hash__":17385},"content/en/blog/seedance-2-copyright-api-guide.md","Seedance 2.0 Copyright Controversy: What API Developers Need to Know",{"type":8,"value":13504,"toc":17331},[13505,13508,13511,13515,13518,13521,13525,13536,13539,13551,13566,13569,13573,13589,13598,13618,13627,13644,13652,13671,13679,13683,13686,13718,13726,13730,13733,13737,13740,13748,13751,13755,13758,13764,13770,13776,13782,13794,13798,13801,13924,13927,13930,13934,13937,13940,13943,13946,13950,13953,13957,13973,13999,14003,14006,14012,14018,14024,14029,14032,14036,14039,14045,14051,14057,14063,14080,14086,14092,14099,14103,14109,14112,14116,14119,14124,14127,14130,14133,14138,14141,14158,14161,14165,14265,14269,14272,14361,14369,14387,14391,14397,14400,14404,14407,14509,14512,14516,14519,14589,14593,14596,14616,14619,14639,14642,14646,14649,15073,15076,15302,15305,15309,15317,15437,15441,15449,15453,15456,16113,16118,16122,16138,16141,16145,16148,16157,16272,16277,16281,16287,16456,16460,16476,16480,16483,16665,16671,16686,16690,16693,17108,17112,17115,17118,17124,17126,17130,17143,17145,17153,17157,17160,17164,17170,17174,17177,17255,17262,17264,17268,17271,17274,17306,17309,17323,17328],[11,13506,13507],{},"The Seedance 2.0 API launch — originally scheduled for February 24, 2026 — is on hold. Five major Hollywood studios have sent cease-and-desist letters to ByteDance, the Motion Picture Association (MPA) has called Seedance 2.0 a \"machine built for systemic infringement,\" and developers building on this model now face real questions about timelines, legal risk, and commercial viability.",[11,13509,13510],{},"If you're integrating Seedance 2.0 into your video generation pipeline, this guide covers everything you need to know: the full copyright timeline, why Hollywood is targeting this model specifically, what the API delay means in practice, how to protect your commercial projects, safe prompt engineering strategies with code examples, and how to keep your pipeline running through a unified multi-model API while the situation resolves.",[48,13512,13514],{"id":13513},"what-happened-the-seedance-20-copyright-timeline","What Happened: The Seedance 2.0 Copyright Timeline",[11,13516,13517],{},"The Seedance 2.0 copyright crisis didn't happen overnight, but it escalated remarkably fast once it started. Within a single week in February 2026, ByteDance went from receiving informal complaints to facing coordinated legal action from every major Hollywood studio.",[11,13519,13520],{},"Here's the verified timeline based on reporting from major news outlets:",[92,13522,13524],{"id":13523},"week-1-the-backlash-builds-february-1416","Week 1: The Backlash Builds (February 14–16)",[11,13526,13527,7926,13530,13535],{},[23,13528,13529],{},"February 15, 2026",[37,13531,13534],{"href":13532,"rel":13533},"https://techcrunch.com",[41],"TechCrunch reports"," that Hollywood studios are \"not happy\" about Seedance 2.0's capabilities. The article details how the model can generate video content that closely resembles copyrighted films and television shows. At this point, the complaints are still informal — no legal action has been taken, but the tone is sharp.",[11,13537,13538],{},"The trigger was a wave of social media posts showing Seedance 2.0 generating scenes featuring recognizable Disney characters, Marvel superheroes, and sequences that clearly mimicked specific films. These demonstrations went viral, and Hollywood noticed.",[11,13540,13541,13544,13545,13550],{},[23,13542,13543],{},"February 16, 2026"," — The story goes mainstream across multiple outlets. ",[37,13546,13549],{"href":13547,"rel":13548},"https://www.cnbc.com",[41],"CNBC reports"," that ByteDance has acknowledged the concerns and pledged to add safeguards to Seedance 2.0. The most significant quote comes from MPA CEO Charles Rivkin, who describes the situation as \"unauthorized use on a massive scale.\"",[11,13552,13553,13554,13559,13560,13565],{},"The same day, ",[37,13555,13558],{"href":13556,"rel":13557},"https://www.aljazeera.com",[41],"Al Jazeera covers"," ByteDance's public pledge to implement fixes. ",[37,13561,13564],{"href":13562,"rel":13563},"https://www.nbcnews.com",[41],"NBC News"," also reports on ByteDance's response. The company's statement is carefully worded — acknowledging the concerns without admitting fault, and promising \"enhanced content protections\" without specifying what those would be or when they'd arrive.",[11,13567,13568],{},"At this stage, many developers assumed this was a typical tech-industry controversy that would blow over with some PR management and minor product adjustments. It didn't.",[92,13570,13572],{"id":13571},"week-2-coordinated-legal-action-february-2022","Week 2: Coordinated Legal Action (February 20–22)",[11,13574,13575,13578,13579,13584,13585,13588],{},[23,13576,13577],{},"February 20, 2026"," — The situation escalates from PR problem to legal crisis. ",[37,13580,13583],{"href":13581,"rel":13582},"https://www.axios.com",[41],"Axios reports"," that five studios — Disney, Warner Bros. Discovery, Paramount, Netflix, and Sony — have each sent ",[23,13586,13587],{},"individual"," cease-and-desist letters to ByteDance. This is a critical detail: these aren't joint letters through the MPA (though that comes later). Each studio's legal team independently decided that Seedance 2.0 posed enough of a threat to warrant direct legal action.",[11,13590,13591,13592,13597],{},"The language in these letters, as reported by ",[37,13593,13596],{"href":13594,"rel":13595},"https://copyrightlately.com",[41],"Copyright Lately",", is unusually aggressive for initial C&D communications:",[97,13599,13600,13606,13612],{},[73,13601,13602,13605],{},[23,13603,13604],{},"Disney"," called Seedance 2.0 a \"virtual smash-and-grab\" of copyrighted content — language that frames the issue not as an accident but as deliberate theft",[73,13607,13608,13611],{},[23,13609,13610],{},"Paramount"," stated that Seedance 2.0 outputs were \"indistinguishable\" from their copyrighted material — a legally significant claim that could support an infringement case",[73,13613,13614,13617],{},[23,13615,13616],{},"Warner Bros. Discovery, Netflix, and Sony"," each filed their own letters with similarly strong language",[11,13619,13620,13621,13626],{},"Community discussions on ",[37,13622,13625],{"href":13623,"rel":13624},"https://reddit.com/r/comfyui",[41],"Reddit's r/comfyui (2/20)"," begin surfacing reports that the planned API launch has been delayed due to deepfake and copyright concerns. Developer forums light up with speculation about timelines and implications.",[11,13628,13629,13632,13633,2959,13638,13643],{},[23,13630,13631],{},"February 21, 2026"," — The MPA formalizes the industry's position. ",[37,13634,13637],{"href":13635,"rel":13636},"https://www.hollywoodreporter.com",[41],"The Hollywood Reporter",[37,13639,13642],{"href":13640,"rel":13641},"https://variety.com",[41],"Variety"," both report that the MPA has sent its own cease-and-desist letter to ByteDance, calling Seedance 2.0 a tool for \"systemic infringement.\" This is the industry's trade association — representing all five studios plus others — adding its institutional weight to the individual studio actions.",[11,13645,13646,13651],{},[37,13647,13650],{"href":13648,"rel":13649},"https://news.ycombinator.com",[41],"Hacker News discussions (2/21)"," confirm that the API launch has been officially postponed, with ByteDance reportedly adding \"pre-release safeguards\" before proceeding.",[11,13653,13654,7926,13657,13662,13663,13666,13667,13670],{},[23,13655,13656],{},"February 22, 2026",[37,13658,13661],{"href":13659,"rel":13660},"https://the-decoder.com",[41],"The Decoder reports"," the MPA's full characterization of Seedance 2.0: a \"machine built for systemic infringement.\" This phrase — carefully chosen by MPA lawyers — goes beyond claiming the tool ",[2619,13664,13665],{},"can"," be used to infringe. It asserts the tool was ",[2619,13668,13669],{},"designed"," to infringe, which has significant legal implications if the case goes to court.",[11,13672,13553,13673,13678],{},[37,13674,13677],{"href":13675,"rel":13676},"https://www.chosun.com",[41],"Chosun (South Korea)"," reports that ByteDance has officially delayed the Seedance 2.0 API release over the copyright disputes. This is the first direct confirmation from an outlet with sources inside ByteDance that the API timeline has changed specifically because of the legal action — not just routine development delays.",[92,13680,13682],{"id":13681},"where-things-stand-now-february-23-2026","Where Things Stand Now (February 23, 2026)",[11,13684,13685],{},"As of today:",[97,13687,13688,13694,13700,13706,13712],{},[73,13689,13690,13693],{},[23,13691,13692],{},"Five individual C&D letters"," from Disney, WBD, Paramount, Netflix, and Sony",[73,13695,13696,13699],{},[23,13697,13698],{},"One institutional C&D letter"," from the MPA",[73,13701,13702,13705],{},[23,13703,13704],{},"API launch postponed"," from February 24 to an unspecified future date",[73,13707,13708,13711],{},[23,13709,13710],{},"ByteDance committed to safeguards"," but hasn't specified implementation details or a timeline",[73,13713,13714,13717],{},[23,13715,13716],{},"No lawsuits filed yet"," — but C&D letters are typically the precursor to litigation if demands aren't met",[18,13719,13720],{},[11,13721,13722,13725],{},[23,13723,13724],{},"Key takeaway for developers:"," This isn't a minor PR issue that will resolve quickly. The coordinated nature of the legal response — five studios plus the MPA — means ByteDance faces enormous pressure to make meaningful changes before the API launches. Plan accordingly.",[48,13727,13729],{"id":13728},"why-hollywood-is-targeting-seedance-20-specifically","Why Hollywood Is Targeting Seedance 2.0 Specifically",[11,13731,13732],{},"Other AI video generation tools exist — Kling, Sora, Veo, Runway Gen-3, Pika — so why is Seedance 2.0 drawing this level of legal fire? The answer lies in a specific combination of capabilities, output quality, and missing safeguards that made it uniquely threatening to Hollywood's content.",[92,13734,13736],{"id":13735},"the-training-data-question","The Training Data Question",[11,13738,13739],{},"The core allegation underlying all the C&D letters is that Seedance 2.0 was trained on copyrighted film and television content without authorization. This isn't unique to Seedance — nearly every large generative model faces similar questions — but the MPA's language suggests they believe ByteDance's training dataset drew particularly heavily on Hollywood content.",[11,13741,13742,13743,13747],{},"The phrase \"unauthorized use on a massive scale\" from MPA CEO Rivkin (",[37,13744,13746],{"href":13547,"rel":13745},[41],"CNBC, 2/16",") implies the studios have evidence (or at least strong suspicion) about the composition of the training data. Disney's \"smash-and-grab\" characterization suggests they believe this was deliberate rather than incidental.",[11,13749,13750],{},"What makes the training data question particularly pointed for Seedance 2.0 is ByteDance's position as a Chinese technology company. ByteDance operates TikTok, which hosts billions of clips — many containing copyrighted content uploaded by users. The studios may suspect (though this hasn't been publicly confirmed) that Seedance 2.0's training data included TikTok's vast library of user-uploaded movie clips, TV segments, and music videos.",[92,13752,13754],{"id":13753},"the-output-fidelity-problem","The Output Fidelity Problem",[11,13756,13757],{},"What separates Seedance 2.0 from earlier AI video tools is its output quality, particularly in areas that matter most to Hollywood. The model excels at precisely the capabilities that make copyright infringement easier:",[11,13759,13760,13763],{},[23,13761,13762],{},"Character consistency across shots."," Seedance 2.0 maintains consistent character appearance throughout a video — same face, same clothing, same proportions. Earlier models often produced characters that shifted appearance between frames. This consistency means that if a user generates content featuring a copyrighted character, the character looks like that character throughout the entire video, not just in one frame.",[11,13765,13766,13769],{},[23,13767,13768],{},"Precise facial expression and emotion control."," The model can generate nuanced emotional performances — a character transitioning from surprise to joy, or from calm to panic. This makes it possible to create new \"performances\" of copyrighted characters that feel authentic to their established personalities.",[11,13771,13772,13775],{},[23,13773,13774],{},"Cinematic camera work."," Seedance 2.0 reproduces specific cinematographic techniques: Hitchcock zooms, tracking shots, crane movements, one-take sequences. These are the visual signatures of Hollywood filmmaking, and the model can replicate them with high fidelity.",[11,13777,13778,13781],{},[23,13779,13780],{},"Native audio generation."," Unlike most competitors, Seedance 2.0 generates synchronized audio — dialogue, sound effects, and music — along with the video. This means generated content isn't just visual copies; it's complete audiovisual works that can include character voices.",[11,13783,13784,2427,13787,13790,13791,493],{},[23,13785,13786],{},"Multimodal references.",[28,13788,13789],{},"@-reference"," system allows users to upload images, videos, and audio as creative references. A user could upload a still of a copyrighted character and a clip showing specific camera movements, and the model would combine both into new content. For more on this system, see our ",[37,13792,13793],{"href":2966},"@Tags Multimodal Guide",[92,13795,13797],{"id":13796},"the-missing-guardrails","The Missing Guardrails",[11,13799,13800],{},"At launch, Seedance 2.0 reportedly had minimal content filtering. Users could generate videos featuring recognizable Disney characters, Marvel heroes, Star Wars scenes, and other protected IP without any system-level intervention. This stood in stark contrast to competitors:",[2036,13802,13803,13826],{},[2039,13804,13805],{},[2042,13806,13807,13810,13814,13817,13820,13823],{},[2045,13808,13809],{},"Platform",[2045,13811,13813],{"align":13812},"center","Copyright Filters",[2045,13815,13816],{"align":13812},"Character Blocking",[2045,13818,13819],{"align":13812},"Celebrity Detection",[2045,13821,13822],{"align":13812},"Watermark",[2045,13824,13825],{"align":13812},"Content Policy",[2052,13827,13828,13845,13862,13877,13894,13909],{},[2042,13829,13830,13833,13836,13838,13840,13842],{},[2057,13831,13832],{},"Seedance 2.0 (at launch)",[2057,13834,13835],{"align":13812},"❌",[2057,13837,13835],{"align":13812},[2057,13839,13835],{"align":13812},[2057,13841,13835],{"align":13812},[2057,13843,13844],{"align":13812},"Minimal",[2042,13846,13847,13850,13853,13855,13857,13859],{},[2057,13848,13849],{},"OpenAI Sora",[2057,13851,13852],{"align":13812},"✅",[2057,13854,13852],{"align":13812},[2057,13856,13852],{"align":13812},[2057,13858,13852],{"align":13812},[2057,13860,13861],{"align":13812},"Strict",[2042,13863,13864,13867,13869,13871,13873,13875],{},[2057,13865,13866],{},"Google Veo 2",[2057,13868,13852],{"align":13812},[2057,13870,13852],{"align":13812},[2057,13872,13852],{"align":13812},[2057,13874,13852],{"align":13812},[2057,13876,13861],{"align":13812},[2042,13878,13879,13882,13885,13887,13889,13891],{},[2057,13880,13881],{},"Runway Gen-3",[2057,13883,13884],{"align":13812},"Partial",[2057,13886,13884],{"align":13812},[2057,13888,13835],{"align":13812},[2057,13890,13852],{"align":13812},[2057,13892,13893],{"align":13812},"Moderate",[2042,13895,13896,13899,13901,13903,13905,13907],{},[2057,13897,13898],{},"Kling",[2057,13900,13884],{"align":13812},[2057,13902,13835],{"align":13812},[2057,13904,13884],{"align":13812},[2057,13906,13852],{"align":13812},[2057,13908,13893],{"align":13812},[2042,13910,13911,13914,13916,13918,13920,13922],{},[2057,13912,13913],{},"Pika",[2057,13915,13884],{"align":13812},[2057,13917,13835],{"align":13812},[2057,13919,13835],{"align":13812},[2057,13921,13852],{"align":13812},[2057,13923,13893],{"align":13812},[11,13925,13926],{},"OpenAI and Google invested heavily in content safety systems before launching their video models. Sora has multiple layers of filtering: it blocks prompts referencing copyrighted characters by name, detects generated faces that resemble real public figures, applies visible and invisible watermarks, and has human review processes for edge cases.",[11,13928,13929],{},"ByteDance apparently prioritized capability over safety for Seedance 2.0's initial release — and the result was a model that could produce Hollywood-quality content from Hollywood's own IP, with nothing to stop it.",[92,13931,13933],{"id":13932},"why-other-ai-video-tools-havent-faced-similar-action","Why Other AI Video Tools Haven't Faced Similar Action",[11,13935,13936],{},"The simple answer: a combination of weaker output quality, stronger safety filters, and US-based legal presence that makes them easier to negotiate with.",[11,13938,13939],{},"Sora and Veo are both produced by US companies (OpenAI and Google) with established legal teams and existing relationships with content owners. These companies have proactively engaged with rights holders, implemented robust content filtering, and in some cases pursued licensing agreements.",[11,13941,13942],{},"Runway and Kling have faced some criticism but haven't reached the output fidelity threshold where Hollywood's lawyers considered them an existential threat. Seedance 2.0 crossed that threshold.",[11,13944,13945],{},"The combination of highest-in-class output fidelity, absent guardrails, and a parent company based outside US jurisdiction created the perfect storm for legal action.",[48,13947,13949],{"id":13948},"the-api-delay-what-we-know","The API Delay: What We Know",[11,13951,13952],{},"The Seedance 2.0 API was originally scheduled for public release on February 24, 2026. That date has been pushed back with no confirmed replacement.",[92,13954,13956],{"id":13955},"what-bytedance-has-promised","What ByteDance Has Promised",[11,13958,13959,13960,400,13964,13968,13969,8012],{},"In response to the legal pressure, ByteDance has committed to implementing several safeguards before the API launches. Based on reporting from ",[37,13961,13963],{"href":13547,"rel":13962},[41],"CNBC (2/16)",[37,13965,13967],{"href":13648,"rel":13966},[41],"Hacker News (2/21)",", and ",[37,13970,13972],{"href":13556,"rel":13971},[41],"Al Jazeera (2/16)",[97,13974,13975,13981,13987,13993],{},[73,13976,13977,13980],{},[23,13978,13979],{},"Face detection and blocking"," — Preventing generation of recognizable real people. This includes actors, public figures, and potentially any real individual whose face appears in the training data. The system would need to compare generated faces against a database of known individuals.",[73,13982,13983,13986],{},[23,13984,13985],{},"Copyrighted character interception"," — Blocking prompts that reference known IP. This means text-level filtering (catching \"Spider-Man\" or \"Elsa\") plus visual-level detection (catching uploaded reference images of copyrighted characters). Both are technically complex at scale.",[73,13988,13989,13992],{},[23,13990,13991],{},"Watermarking"," — Adding invisible watermarks to all generated content for provenance tracking. This allows rights holders to identify AI-generated content and trace it back to the platform and potentially the user who generated it.",[73,13994,13995,13998],{},[23,13996,13997],{},"Content similarity detection"," — Broader filtering to prevent generation of content that closely matches specific copyrighted works. This could involve comparing generated frames against a database of copyrighted content — computationally expensive but legally necessary.",[92,14000,14002],{"id":14001},"the-implementation-challenge","The Implementation Challenge",[11,14004,14005],{},"These safeguards aren't trivial to build. Each one involves significant engineering:",[11,14007,14008,14011],{},[23,14009,14010],{},"Text-level filtering"," is the easiest — maintaining a blocklist of character names, franchise names, and trademark terms. But it's also the easiest to circumvent (\"a mouse with round ears wearing red shorts\").",[11,14013,14014,14017],{},[23,14015,14016],{},"Visual-level detection"," is harder. The system needs to recognize copyrighted characters even when described indirectly, and detect when generated output resembles specific copyrighted content. This requires training separate detection models on the copyrighted content itself — which raises its own licensing questions.",[11,14019,14020,14023],{},[23,14021,14022],{},"Face recognition"," for celebrity/actor blocking requires a comprehensive face database and real-time comparison during generation. This needs to handle multiple angles, lighting conditions, and artistic styles.",[11,14025,14026,14028],{},[23,14027,13991],{}," that survives compression, cropping, and format conversion is an active research area. ByteDance needs watermarks that are imperceptible to viewers but robust enough to survive the processing that typical social media distribution involves.",[11,14030,14031],{},"The MPA isn't going to accept a checkbox exercise. These safeguards need to actually work, and verifying that takes time.",[92,14033,14035],{"id":14034},"what-this-means-for-developers-right-now","What This Means for Developers Right Now",[11,14037,14038],{},"If you've been building around the Seedance 2.0 API, the delay creates several immediate practical problems:",[11,14040,14041,14044],{},[23,14042,14043],{},"1. No confirmed launch date."," ByteDance hasn't announced a new timeline. The safeguards need to satisfy legal teams at five major studios plus the MPA — that's not a quick process. Realistic estimates range from weeks to months, depending on how aggressive the safeguard requirements are.",[11,14046,14047,14050],{},[23,14048,14049],{},"2. API behavior will change."," The addition of content filtering means new error codes, modified prompt handling, and rejected inputs that previously worked in the web interface. Prompts referencing specific visual styles that are too close to copyrighted material will likely fail. You'll need to handle these rejections gracefully in your code.",[11,14052,14053,14056],{},[23,14054,14055],{},"3. Pricing uncertainty."," Content filtering infrastructure costs money — both the compute for real-time detection and the engineering to build and maintain it. It's plausible that per-generation costs increase to cover the additional overhead. ByteDance could also implement tiered pricing based on the level of content filtering applied.",[11,14058,14059,14062],{},[23,14060,14061],{},"4. Terms of service will tighten."," Expect stricter usage policies, particularly around:",[97,14064,14065,14068,14071,14074,14077],{},[73,14066,14067],{},"Commercial use of generated content",[73,14069,14070],{},"Liability for infringing outputs",[73,14072,14073],{},"Requirements for prompt documentation",[73,14075,14076],{},"Restrictions on certain categories of content generation",[73,14078,14079],{},"Indemnification clauses (or lack thereof)",[11,14081,14082,14085],{},[23,14083,14084],{},"5. Rate limits and review processes."," For enterprise API users, ByteDance may implement additional review processes for high-volume accounts or certain categories of content.",[11,14087,14088,14091],{},[23,14089,14090],{},"6. Downstream platform risk."," If you're building a product on top of Seedance 2.0 API and offering video generation to your own users, you inherit whatever liability gaps exist. Your users could generate infringing content through your platform, and you could face claims from rights holders.",[11,14093,14094,14095,2597],{},"For developers who need video generation capabilities today and can't wait for the Seedance delay to resolve, implementing multi-model failover is the pragmatic solution. We cover this in detail in the ",[37,14096,14098],{"href":14097},"#how-to-access-seedance-20-api-through-evolink","EvoLink integration section",[48,14100,14102],{"id":14101},"what-this-means-for-your-commercial-projects","What This Means for Your Commercial Projects",[11,14104,14105,14106],{},"The central question every developer building on AI video generation is asking: ",[23,14107,14108],{},"Can I safely use Seedance 2.0 API-generated content in commercial products?",[11,14110,14111],{},"The honest answer: it depends entirely on what you generate and how you generate it. The risk isn't binary — it exists on a spectrum, and understanding where your specific use case falls on that spectrum is essential.",[92,14113,14115],{"id":14114},"two-distinct-layers-of-copyright-risk","Two Distinct Layers of Copyright Risk",[11,14117,14118],{},"Copyright risk in AI-generated content exists on two separate legal dimensions. Conflating them leads to either excessive caution (avoiding the technology entirely) or dangerous complacency (assuming everything is fine). Neither serves you well.",[11,14120,14121],{},[23,14122,14123],{},"Layer 1: Training Data Liability (Model-Level Risk)",[11,14125,14126],{},"This is the MPA's primary concern and the basis for the C&D letters. If Seedance 2.0 was trained on copyrighted content without licensing, ByteDance faces potential statutory damages. But the critical question for developers: does that liability extend downstream to API users?",[11,14128,14129],{},"As of February 2026, no US court has ruled that downstream users of an AI model are liable for the model's training data composition. The closest precedents come from the ongoing cases against Stability AI, Midjourney, and others — but these target the model creators, not the end users.",[11,14131,14132],{},"However, the legal landscape is evolving rapidly. If a court eventually establishes that AI-generated content derived from infringing training data is itself a derivative work, developers who commercialized that content could face retroactive claims. The probability is debatable; the potential impact is not.",[11,14134,14135],{},[23,14136,14137],{},"Layer 2: Output Content Liability (User-Level Risk)",[11,14139,14140],{},"This is the more immediate and actionable risk for developers. Regardless of the training data question, if your Seedance-generated video:",[97,14142,14143,14146,14149,14152,14155],{},[73,14144,14145],{},"Contains recognizable copyrighted characters (Mickey Mouse, Spider-Man, Darth Vader)",[73,14147,14148],{},"Closely replicates specific copyrighted scenes or sequences",[73,14150,14151],{},"Features recognizable real people without their consent",[73,14153,14154],{},"Reproduces trademarked logos, brand elements, or distinctive visual identities",[73,14156,14157],{},"Mimics a specific artist's or studio's protected visual style closely enough to cause confusion",[11,14159,14160],{},"...then you face direct copyright, trademark, or right-of-publicity liability. This risk exists regardless of the training data question and regardless of which AI model you use.",[92,14162,14164],{"id":14163},"risk-spectrum-for-common-use-cases","Risk Spectrum for Common Use Cases",[2036,14166,14167,14180],{},[2039,14168,14169],{},[2042,14170,14171,14174,14177],{},[2045,14172,14173],{},"Use Case",[2045,14175,14176],{},"Risk Level",[2045,14178,14179],{},"Key Factors",[2052,14181,14182,14193,14203,14213,14224,14234,14245,14255],{},[2042,14183,14184,14187,14190],{},[2057,14185,14186],{},"Original product showcase video using your own product images",[2057,14188,14189],{},"🟢 Low",[2057,14191,14192],{},"Your assets, generic description, no IP references",[2042,14194,14195,14198,14200],{},[2057,14196,14197],{},"Marketing video with original characters and scenes",[2057,14199,14189],{},[2057,14201,14202],{},"Original creative direction, no existing IP",[2042,14204,14205,14208,14210],{},[2057,14206,14207],{},"Generic stock-style footage (nature, cityscapes, abstract)",[2057,14209,14189],{},[2057,14211,14212],{},"No character or IP involvement",[2042,14214,14215,14218,14221],{},[2057,14216,14217],{},"Video mimicking a specific film's visual style",[2057,14219,14220],{},"🟡 Medium",[2057,14222,14223],{},"Style alone isn't copyrightable, but too-close replication is risky",[2042,14225,14226,14229,14231],{},[2057,14227,14228],{},"Content featuring original characters that resemble copyrighted ones",[2057,14230,14220],{},[2057,14232,14233],{},"\"Inspired by\" vs. \"substantially similar\" — a gray area",[2042,14235,14236,14239,14242],{},[2057,14237,14238],{},"Video featuring recognizable copyrighted characters",[2057,14240,14241],{},"🔴 High",[2057,14243,14244],{},"Direct infringement regardless of tool used",[2042,14246,14247,14250,14252],{},[2057,14248,14249],{},"Content featuring real celebrity likenesses",[2057,14251,14241],{},[2057,14253,14254],{},"Right of publicity violations",[2042,14256,14257,14260,14262],{},[2057,14258,14259],{},"Replication of specific copyrighted scenes",[2057,14261,14241],{},[2057,14263,14264],{},"Direct copying of protectable expression",[92,14266,14268],{"id":14267},"enterprise-compliance-checklist","Enterprise Compliance Checklist",[11,14270,14271],{},"Before using any AI video generation tool for commercial content, work through this checklist:",[97,14273,14276,14289,14298,14307,14316,14325,14334,14343,14352],{"className":14274},[14275],"contains-task-list",[73,14277,14280,14284,14285,14288],{"className":14278},[14279],"task-list-item",[14281,14282],"input",{"disabled":58,"type":14283},"checkbox"," ",[23,14286,14287],{},"Review the platform's Terms of Service"," — Specifically: who owns the output? What commercial rights are granted? What usage restrictions apply? Does the platform indemnify you against infringement claims?",[73,14290,14292,14284,14294,14297],{"className":14291},[14279],[14281,14293],{"disabled":58,"type":14283},[23,14295,14296],{},"Establish an internal AI usage policy"," — Document which types of content are approved for AI generation and which require human creation. Train your team on the policy.",[73,14299,14301,14284,14303,14306],{"className":14300},[14279],[14281,14302],{"disabled":58,"type":14283},[23,14304,14305],{},"Audit every prompt before submission"," — Do any reference specific copyrighted characters, real people, or trademarked properties? Implement prompt review for commercial projects.",[73,14308,14310,14284,14312,14315],{"className":14309},[14279],[14281,14311],{"disabled":58,"type":14283},[23,14313,14314],{},"Check output similarity before publishing"," — Does the generated content closely resemble any specific copyrighted work? Use reverse image/video search and human review.",[73,14317,14319,14284,14321,14324],{"className":14318},[14279],[14281,14320],{"disabled":58,"type":14283},[23,14322,14323],{},"Document your entire process"," — Keep records of prompts, parameters, creative intent, and the review steps taken. This establishes good faith if challenged.",[73,14326,14328,14284,14330,14333],{"className":14327},[14279],[14281,14329],{"disabled":58,"type":14283},[23,14331,14332],{},"Get legal review for high-stakes content"," — For advertising campaigns, branded entertainment, or content with wide distribution, have IP counsel review both the platform terms and your specific outputs.",[73,14335,14337,14284,14339,14342],{"className":14336},[14279],[14281,14338],{"disabled":58,"type":14283},[23,14340,14341],{},"Consider E&O insurance"," — Errors and omissions insurance that explicitly covers AI-generated content is increasingly available and, for commercial video production, increasingly necessary.",[73,14344,14346,14284,14348,14351],{"className":14345},[14279],[14281,14347],{"disabled":58,"type":14283},[23,14349,14350],{},"Monitor legal developments"," — Subscribe to AI copyright legal updates. The landscape is changing monthly. What's acceptable practice today may be litigated tomorrow.",[73,14353,14355,14284,14357,14360],{"className":14354},[14279],[14281,14356],{"disabled":58,"type":14283},[23,14358,14359],{},"Plan for content recall"," — If a legal ruling changes the risk calculus for content you've already published, have a process to identify and address affected assets.",[18,14362,14363],{},[11,14364,14365,14368],{},[23,14366,14367],{},"Bottom line:"," Generic, original content generated from descriptive prompts — no character names, no brand references, no actor likenesses, no deliberate replication of specific works — carries the lowest risk. Content that intentionally or negligently replicates existing IP carries the highest risk, and using an API doesn't insulate you from that risk.",[14370,14371,14373,14378,14381],"div",{"style":14372},"background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 12px; padding: 2em; margin: 2em 0; color: white;",[11,14374,14375],{},[23,14376,14377],{},"Need video generation that doesn't stop when one model is delayed?",[11,14379,14380],{},"EvoLink provides a unified API for Seedance 2.0, Kling, Veo, Sora, and more. If Seedance is unavailable, your production pipeline doesn't break — it switches models automatically.",[11,14382,14383],{},[37,14384,14386],{"href":14385},"/docs/video-generation","Explore the Video Generation API →",[48,14388,14390],{"id":14389},"safe-prompt-practices-avoiding-copyright-triggers","Safe Prompt Practices: Avoiding Copyright Triggers",[11,14392,14393,14394],{},"Whether you're using Seedance 2.0, Sora, Veo, or any other AI video generation model, safe prompt practices protect your projects from copyright risk. The fundamental principle: ",[23,14395,14396],{},"describe what you want to create, not what you want to copy.",[11,14398,14399],{},"This section provides concrete, actionable guidelines with code examples you can use directly in your Seedance 2.0 API integration.",[92,14401,14403],{"id":14402},"prompt-patterns-to-avoid","Prompt Patterns to Avoid",[11,14405,14406],{},"These patterns will likely trigger copyright filters (once implemented) and create legal risk regardless of filtering:",[2036,14408,14409,14422],{},[2039,14410,14411],{},[2042,14412,14413,14416,14419],{},[2045,14414,14415],{},"❌ Dangerous Prompt Pattern",[2045,14417,14418],{},"Why It's Risky",[2045,14420,14421],{},"Legal Exposure",[2052,14423,14424,14435,14445,14456,14466,14476,14487,14498],{},[2042,14425,14426,14429,14432],{},[2057,14427,14428],{},"\"Generate a video of Spider-Man swinging through New York\"",[2057,14430,14431],{},"Direct copyrighted character reference",[2057,14433,14434],{},"Copyright infringement",[2042,14436,14437,14440,14443],{},[2057,14438,14439],{},"\"Create a scene that looks like it's from Frozen\"",[2057,14441,14442],{},"Deliberate replication of copyrighted work",[2057,14444,14434],{},[2042,14446,14447,14450,14453],{},[2057,14448,14449],{},"\"Make a video featuring someone who looks like Scarlett Johansson\"",[2057,14451,14452],{},"Personality rights violation",[2057,14454,14455],{},"Right of publicity",[2042,14457,14458,14461,14464],{},[2057,14459,14460],{},"\"Replicate the opening sequence of Blade Runner 2049\"",[2057,14462,14463],{},"Direct scene copying",[2057,14465,14434],{},[2042,14467,14468,14471,14474],{},[2057,14469,14470],{},"\"A character that looks like Elsa with ice powers\"",[2057,14472,14473],{},"Indirect copyrighted character reference",[2057,14475,14434],{},[2042,14477,14478,14481,14484],{},[2057,14479,14480],{},"\"Generate a video with the Nike swoosh logo\"",[2057,14482,14483],{},"Trademark use",[2057,14485,14486],{},"Trademark infringement",[2042,14488,14489,14492,14495],{},[2057,14490,14491],{},"\"A wizard school that looks like Hogwarts\"",[2057,14493,14494],{},"Trademarked setting replication",[2057,14496,14497],{},"Trademark dilution",[2042,14499,14500,14503,14506],{},[2057,14501,14502],{},"\"An anime girl in the exact style of Studio Ghibli\"",[2057,14504,14505],{},"Studio style replication",[2057,14507,14508],{},"Gray area, potentially risky",[11,14510,14511],{},"The indirect references are particularly dangerous because they might pass text-level filters while still producing infringing output. \"A princess with platinum blonde hair, ice powers, and a blue dress\" doesn't say \"Elsa,\" but the output almost certainly looks like Elsa.",[92,14513,14515],{"id":14514},"prompt-patterns-that-work-safely","Prompt Patterns That Work Safely",[11,14517,14518],{},"These patterns generate compelling, original content without copyright entanglement:",[2036,14520,14521,14531],{},[2039,14522,14523],{},[2042,14524,14525,14528],{},[2045,14526,14527],{},"✅ Safe Prompt Pattern",[2045,14529,14530],{},"Why It Works",[2052,14532,14533,14541,14549,14557,14565,14573,14581],{},[2042,14534,14535,14538],{},[2057,14536,14537],{},"\"A superhero in an original red and gold suit flies over a futuristic city at sunset\"",[2057,14539,14540],{},"Original character, original setting",[2042,14542,14543,14546],{},[2057,14544,14545],{},"\"Cinematic drone shot over a coastal city at golden hour, warm color palette, anamorphic lens\"",[2057,14547,14548],{},"Generic scene with cinematic technique description",[2042,14550,14551,14554],{},[2057,14552,14553],{},"\"A young woman in a flowing blue dress walks through a sunlit Mediterranean village\"",[2057,14555,14556],{},"Original character, generic setting",[2042,14558,14559,14562],{},[2057,14560,14561],{},"\"Product showcase: silver smartwatch rotating on marble surface, studio lighting\"",[2057,14563,14564],{},"Your own product, generic staging",[2042,14566,14567,14570],{},[2057,14568,14569],{},"\"@Image1 as first frame, tracking shot following the subject through a forest\"",[2057,14571,14572],{},"Your own reference assets",[2042,14574,14575,14578],{},[2057,14576,14577],{},"\"Anime-style warrior in ornate jade armor standing on a cliff overlooking a stormy sea\"",[2057,14579,14580],{},"Original character in a generic style category",[2042,14582,14583,14586],{},[2057,14584,14585],{},"\"Pixar-quality 3D animation: a wise old cat in spectacles sits at a cafe table\"",[2057,14587,14588],{},"Style quality reference (not a specific Pixar property)",[92,14590,14592],{"id":14591},"the-style-vs-character-distinction","The Style vs. Character Distinction",[11,14594,14595],{},"This is a nuance that matters legally. You can generally reference:",[97,14597,14598,14604,14610],{},[73,14599,14600,14603],{},[23,14601,14602],{},"Artistic styles broadly"," — \"anime style,\" \"Pixar-quality 3D,\" \"oil painting aesthetic,\" \"noir cinematography\"",[73,14605,14606,14609],{},[23,14607,14608],{},"Cinematographic techniques"," — \"Hitchcock zoom,\" \"Steadicam tracking shot,\" \"Dutch angle\"",[73,14611,14612,14615],{},[23,14613,14614],{},"Genre conventions"," — \"cyberpunk cityscape,\" \"fantasy medieval village,\" \"space opera\"",[11,14617,14618],{},"You should not reference:",[97,14620,14621,14627,14633],{},[73,14622,14623,14626],{},[23,14624,14625],{},"Specific works"," — \"like the chase scene in The Dark Knight\"",[73,14628,14629,14632],{},[23,14630,14631],{},"Specific characters"," — even indirectly described",[73,14634,14635,14638],{},[23,14636,14637],{},"Specific studios' proprietary styles"," — if the description is specific enough to identify the source",[11,14640,14641],{},"The line is blurry, and when in doubt, make it more generic.",[92,14643,14645],{"id":14644},"code-example-safe-vs-dangerous-prompts-in-practice","Code Example: Safe vs. Dangerous Prompts in Practice",[11,14647,14648],{},"Here's the complete setup for all code examples in this guide, using the Seedance 2.0 API through EvoLink:",[136,14650,14652],{"className":338,"code":14651,"language":340,"meta":141,"style":141},"import requests\nimport time\n\nAPI_KEY = \"your-evolink-api-key\"  # Get yours at evolink.ai/early-access\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef generate_video(payload):\n    \"\"\"Submit a video generation task and poll until complete.\"\"\"\n    response = requests.post(\n        f\"{BASE_URL}/videos/generations\",\n        headers=HEADERS,\n        json=payload\n    )\n    response.raise_for_status()\n    task = response.json()\n    task_id = task[\"id\"]\n    print(f\"Task created: {task_id} (model: {task['model']})\")\n\n    # Poll for completion\n    while True:\n        status_resp = requests.get(\n            f\"{BASE_URL}/tasks/{task_id}\",\n            headers=HEADERS\n        )\n        status_resp.raise_for_status()\n        result = status_resp.json()\n\n        if result[\"status\"] == \"completed\":\n            video_url = result[\"task_info\"][\"video_url\"]\n            print(f\"✅ Video ready: {video_url}\")\n            return result\n        elif result[\"status\"] == \"failed\":\n            raise Exception(f\"Task failed: {result.get('error', 'Unknown')}\")\n\n        print(f\"⏳ Progress: {result.get('progress', 0)}%\")\n        time.sleep(10)\n",[28,14653,14654,14660,14666,14670,14682,14690,14698,14714,14722,14726,14730,14739,14744,14752,14764,14774,14782,14786,14790,14798,14810,14844,14848,14853,14862,14871,14891,14899,14903,14908,14917,14921,14938,14956,14977,14983,14999,15030,15034,15064],{"__ignoreMap":141},[145,14655,14656,14658],{"class":147,"line":148},[145,14657,347],{"class":258},[145,14659,328],{"class":262},[145,14661,14662,14664],{"class":147,"line":166},[145,14663,347],{"class":258},[145,14665,356],{"class":262},[145,14667,14668],{"class":147,"line":178},[145,14669,376],{"emptyLinePlaceholder":58},[145,14671,14672,14674,14676,14679],{"class":147,"line":187},[145,14673,388],{"class":155},[145,14675,391],{"class":258},[145,14677,14678],{"class":159}," \"your-evolink-api-key\"",[145,14680,14681],{"class":174},"  # Get yours at evolink.ai/early-access\n",[145,14683,14684,14686,14688],{"class":147,"line":373},[145,14685,412],{"class":155},[145,14687,391],{"class":258},[145,14689,417],{"class":159},[145,14691,14692,14694,14696],{"class":147,"line":379},[145,14693,423],{"class":155},[145,14695,391],{"class":258},[145,14697,428],{"class":262},[145,14699,14700,14702,14704,14706,14708,14710,14712],{"class":147,"line":385},[145,14701,434],{"class":159},[145,14703,437],{"class":262},[145,14705,440],{"class":258},[145,14707,443],{"class":159},[145,14709,446],{"class":155},[145,14711,449],{"class":159},[145,14713,452],{"class":262},[145,14715,14716,14718,14720],{"class":147,"line":409},[145,14717,458],{"class":159},[145,14719,437],{"class":262},[145,14721,463],{"class":159},[145,14723,14724],{"class":147,"line":420},[145,14725,469],{"class":262},[145,14727,14728],{"class":147,"line":431},[145,14729,376],{"emptyLinePlaceholder":58},[145,14731,14732,14734,14737],{"class":147,"line":455},[145,14733,526],{"class":258},[145,14735,14736],{"class":151}," generate_video",[145,14738,5848],{"class":262},[145,14740,14741],{"class":147,"line":466},[145,14742,14743],{"class":159},"    \"\"\"Submit a video generation task and poll until complete.\"\"\"\n",[145,14745,14746,14748,14750],{"class":147,"line":600},[145,14747,1427],{"class":262},[145,14749,266],{"class":258},[145,14751,1432],{"class":262},[145,14753,14754,14756,14758,14760,14762],{"class":147,"line":605},[145,14755,1437],{"class":258},[145,14757,449],{"class":159},[145,14759,679],{"class":155},[145,14761,1444],{"class":159},[145,14763,452],{"class":262},[145,14765,14766,14768,14770,14772],{"class":147,"line":611},[145,14767,1455],{"class":701},[145,14769,266],{"class":258},[145,14771,423],{"class":155},[145,14773,452],{"class":262},[145,14775,14776,14778,14780],{"class":147,"line":617},[145,14777,1470],{"class":701},[145,14779,266],{"class":258},[145,14781,2788],{"class":262},[145,14783,14784],{"class":147,"line":623},[145,14785,1483],{"class":262},[145,14787,14788],{"class":147,"line":628},[145,14789,2797],{"class":262},[145,14791,14792,14794,14796],{"class":147,"line":639},[145,14793,1496],{"class":262},[145,14795,266],{"class":258},[145,14797,736],{"class":262},[145,14799,14800,14802,14804,14806,14808],{"class":147,"line":654},[145,14801,7218],{"class":262},[145,14803,266],{"class":258},[145,14805,758],{"class":262},[145,14807,1626],{"class":159},[145,14809,764],{"class":262},[145,14811,14812,14814,14816,14818,14820,14822,14824,14826,14829,14831,14833,14836,14838,14840,14842],{"class":147,"line":660},[145,14813,1102],{"class":155},[145,14815,794],{"class":262},[145,14817,440],{"class":258},[145,14819,1524],{"class":159},[145,14821,685],{"class":155},[145,14823,688],{"class":262},[145,14825,691],{"class":155},[145,14827,14828],{"class":159}," (model: ",[145,14830,685],{"class":155},[145,14832,1529],{"class":262},[145,14834,14835],{"class":159},"'model'",[145,14837,1535],{"class":262},[145,14839,691],{"class":155},[145,14841,5512],{"class":159},[145,14843,406],{"class":262},[145,14845,14846],{"class":147,"line":671},[145,14847,376],{"emptyLinePlaceholder":58},[145,14849,14850],{"class":147,"line":698},[145,14851,14852],{"class":174},"    # Poll for completion\n",[145,14854,14855,14857,14860],{"class":147,"line":710},[145,14856,642],{"class":258},[145,14858,14859],{"class":155}," True",[145,14861,860],{"class":262},[145,14863,14864,14867,14869],{"class":147,"line":716},[145,14865,14866],{"class":262},"        status_resp ",[145,14868,266],{"class":258},[145,14870,668],{"class":262},[145,14872,14873,14875,14877,14879,14881,14883,14885,14887,14889],{"class":147,"line":722},[145,14874,674],{"class":258},[145,14876,449],{"class":159},[145,14878,679],{"class":155},[145,14880,682],{"class":159},[145,14882,685],{"class":155},[145,14884,688],{"class":262},[145,14886,691],{"class":155},[145,14888,449],{"class":159},[145,14890,452],{"class":262},[145,14892,14893,14895,14897],{"class":147,"line":728},[145,14894,702],{"class":701},[145,14896,266],{"class":258},[145,14898,707],{"class":155},[145,14900,14901],{"class":147,"line":739},[145,14902,713],{"class":262},[145,14904,14905],{"class":147,"line":744},[145,14906,14907],{"class":262},"        status_resp.raise_for_status()\n",[145,14909,14910,14912,14914],{"class":147,"line":750},[145,14911,11763],{"class":262},[145,14913,266],{"class":258},[145,14915,14916],{"class":262}," status_resp.json()\n",[145,14918,14919],{"class":147,"line":767},[145,14920,376],{"emptyLinePlaceholder":58},[145,14922,14923,14925,14927,14929,14932,14934,14936],{"class":147,"line":788},[145,14924,848],{"class":258},[145,14926,1648],{"class":262},[145,14928,761],{"class":159},[145,14930,14931],{"class":262},"] ",[145,14933,854],{"class":258},[145,14935,857],{"class":159},[145,14937,860],{"class":262},[145,14939,14940,14942,14944,14946,14949,14951,14954],{"class":147,"line":834},[145,14941,7404],{"class":262},[145,14943,266],{"class":258},[145,14945,1648],{"class":262},[145,14947,14948],{"class":159},"\"task_info\"",[145,14950,1562],{"class":262},[145,14952,14953],{"class":159},"\"video_url\"",[145,14955,764],{"class":262},[145,14957,14958,14960,14962,14964,14967,14969,14971,14973,14975],{"class":147,"line":839},[145,14959,5577],{"class":155},[145,14961,794],{"class":262},[145,14963,440],{"class":258},[145,14965,14966],{"class":159},"\"✅ Video ready: ",[145,14968,685],{"class":155},[145,14970,1678],{"class":262},[145,14972,691],{"class":155},[145,14974,449],{"class":159},[145,14976,406],{"class":262},[145,14978,14979,14981],{"class":147,"line":845},[145,14980,866],{"class":258},[145,14982,1706],{"class":262},[145,14984,14985,14987,14989,14991,14993,14995,14997],{"class":147,"line":863},[145,14986,875],{"class":258},[145,14988,1648],{"class":262},[145,14990,761],{"class":159},[145,14992,14931],{"class":262},[145,14994,854],{"class":258},[145,14996,882],{"class":159},[145,14998,860],{"class":262},[145,15000,15001,15003,15005,15007,15009,15012,15014,15016,15018,15020,15022,15024,15026,15028],{"class":147,"line":872},[145,15002,906],{"class":258},[145,15004,7062],{"class":155},[145,15006,794],{"class":262},[145,15008,440],{"class":258},[145,15010,15011],{"class":159},"\"Task failed: ",[145,15013,685],{"class":155},[145,15015,11862],{"class":262},[145,15017,11865],{"class":159},[145,15019,400],{"class":262},[145,15021,9954],{"class":159},[145,15023,108],{"class":262},[145,15025,691],{"class":155},[145,15027,449],{"class":159},[145,15029,406],{"class":262},[145,15031,15032],{"class":147,"line":887},[145,15033,376],{"emptyLinePlaceholder":58},[145,15035,15036,15038,15040,15042,15045,15047,15049,15052,15054,15056,15058,15060,15062],{"class":147,"line":903},[145,15037,791],{"class":155},[145,15039,794],{"class":262},[145,15041,440],{"class":258},[145,15043,15044],{"class":159},"\"⏳ Progress: ",[145,15046,685],{"class":155},[145,15048,11862],{"class":262},[145,15050,15051],{"class":159},"'progress'",[145,15053,400],{"class":262},[145,15055,783],{"class":155},[145,15057,108],{"class":262},[145,15059,691],{"class":155},[145,15061,829],{"class":159},[145,15063,406],{"class":262},[145,15065,15066,15069,15071],{"class":147,"line":915},[145,15067,15068],{"class":262},"        time.sleep(",[145,15070,537],{"class":155},[145,15072,406],{"class":262},[11,15074,15075],{},"Now compare a dangerous prompt with its safe equivalent — both achieving a similar creative outcome:",[136,15077,15079],{"className":338,"code":15078,"language":340,"meta":141,"style":141},"# ❌ DANGEROUS — references copyrighted character and specific film\ndangerous_payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"Spider-Man swings between skyscrapers in New York City, \"\n              \"wearing his classic red and blue suit. He shoots a web \"\n              \"line and does a backflip, landing on a rooftop. \"\n              \"Marvel cinematic style, dramatic lighting.\",\n    \"duration\": 10,\n    \"quality\": \"720p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n# This will likely be rejected by copyright filters AND exposes you legally\n\n# ✅ SAFE — original character, similar visual impact\nsafe_payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"A masked vigilante in a sleek crimson and silver suit \"\n              \"swings between futuristic skyscrapers using retractable \"\n              \"grappling cables. Dynamic tracking shot follows the arc \"\n              \"of movement as the figure performs an acrobatic flip \"\n              \"mid-air and lands on a glass rooftop. Cinematic action \"\n              \"sequence, golden hour lighting, anamorphic lens flare. \"\n              \"The city below is a mix of neon signs and steam vents.\",\n    \"duration\": 10,\n    \"quality\": \"720p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n\nresult = generate_video(safe_payload)\n",[28,15080,15081,15086,15095,15105,15114,15119,15124,15131,15141,15151,15161,15169,15173,15178,15182,15187,15196,15206,15215,15220,15225,15230,15235,15240,15247,15257,15267,15277,15285,15289,15293],{"__ignoreMap":141},[145,15082,15083],{"class":147,"line":148},[145,15084,15085],{"class":174},"# ❌ DANGEROUS — references copyrighted character and specific film\n",[145,15087,15088,15091,15093],{"class":147,"line":166},[145,15089,15090],{"class":262},"dangerous_payload ",[145,15092,266],{"class":258},[145,15094,428],{"class":262},[145,15096,15097,15099,15101,15103],{"class":147,"line":178},[145,15098,3670],{"class":159},[145,15100,437],{"class":262},[145,15102,1308],{"class":159},[145,15104,452],{"class":262},[145,15106,15107,15109,15111],{"class":147,"line":187},[145,15108,3681],{"class":159},[145,15110,437],{"class":262},[145,15112,15113],{"class":159},"\"Spider-Man swings between skyscrapers in New York City, \"\n",[145,15115,15116],{"class":147,"line":373},[145,15117,15118],{"class":159},"              \"wearing his classic red and blue suit. He shoots a web \"\n",[145,15120,15121],{"class":147,"line":379},[145,15122,15123],{"class":159},"              \"line and does a backflip, landing on a rooftop. \"\n",[145,15125,15126,15129],{"class":147,"line":385},[145,15127,15128],{"class":159},"              \"Marvel cinematic style, dramatic lighting.\"",[145,15130,452],{"class":262},[145,15132,15133,15135,15137,15139],{"class":147,"line":409},[145,15134,3693],{"class":159},[145,15136,437],{"class":262},[145,15138,537],{"class":155},[145,15140,452],{"class":262},[145,15142,15143,15145,15147,15149],{"class":147,"line":420},[145,15144,3705],{"class":159},[145,15146,437],{"class":262},[145,15148,1368],{"class":159},[145,15150,452],{"class":262},[145,15152,15153,15155,15157,15159],{"class":147,"line":431},[145,15154,3717],{"class":159},[145,15156,437],{"class":262},[145,15158,1384],{"class":159},[145,15160,452],{"class":262},[145,15162,15163,15165,15167],{"class":147,"line":455},[145,15164,3733],{"class":159},[145,15166,437],{"class":262},[145,15168,3738],{"class":155},[145,15170,15171],{"class":147,"line":466},[145,15172,469],{"class":262},[145,15174,15175],{"class":147,"line":600},[145,15176,15177],{"class":174},"# This will likely be rejected by copyright filters AND exposes you legally\n",[145,15179,15180],{"class":147,"line":605},[145,15181,376],{"emptyLinePlaceholder":58},[145,15183,15184],{"class":147,"line":611},[145,15185,15186],{"class":174},"# ✅ SAFE — original character, similar visual impact\n",[145,15188,15189,15192,15194],{"class":147,"line":617},[145,15190,15191],{"class":262},"safe_payload ",[145,15193,266],{"class":258},[145,15195,428],{"class":262},[145,15197,15198,15200,15202,15204],{"class":147,"line":623},[145,15199,3670],{"class":159},[145,15201,437],{"class":262},[145,15203,1308],{"class":159},[145,15205,452],{"class":262},[145,15207,15208,15210,15212],{"class":147,"line":628},[145,15209,3681],{"class":159},[145,15211,437],{"class":262},[145,15213,15214],{"class":159},"\"A masked vigilante in a sleek crimson and silver suit \"\n",[145,15216,15217],{"class":147,"line":639},[145,15218,15219],{"class":159},"              \"swings between futuristic skyscrapers using retractable \"\n",[145,15221,15222],{"class":147,"line":654},[145,15223,15224],{"class":159},"              \"grappling cables. Dynamic tracking shot follows the arc \"\n",[145,15226,15227],{"class":147,"line":660},[145,15228,15229],{"class":159},"              \"of movement as the figure performs an acrobatic flip \"\n",[145,15231,15232],{"class":147,"line":671},[145,15233,15234],{"class":159},"              \"mid-air and lands on a glass rooftop. Cinematic action \"\n",[145,15236,15237],{"class":147,"line":698},[145,15238,15239],{"class":159},"              \"sequence, golden hour lighting, anamorphic lens flare. \"\n",[145,15241,15242,15245],{"class":147,"line":710},[145,15243,15244],{"class":159},"              \"The city below is a mix of neon signs and steam vents.\"",[145,15246,452],{"class":262},[145,15248,15249,15251,15253,15255],{"class":147,"line":716},[145,15250,3693],{"class":159},[145,15252,437],{"class":262},[145,15254,537],{"class":155},[145,15256,452],{"class":262},[145,15258,15259,15261,15263,15265],{"class":147,"line":722},[145,15260,3705],{"class":159},[145,15262,437],{"class":262},[145,15264,1368],{"class":159},[145,15266,452],{"class":262},[145,15268,15269,15271,15273,15275],{"class":147,"line":728},[145,15270,3717],{"class":159},[145,15272,437],{"class":262},[145,15274,1384],{"class":159},[145,15276,452],{"class":262},[145,15278,15279,15281,15283],{"class":147,"line":739},[145,15280,3733],{"class":159},[145,15282,437],{"class":262},[145,15284,3738],{"class":155},[145,15286,15287],{"class":147,"line":744},[145,15288,469],{"class":262},[145,15290,15291],{"class":147,"line":750},[145,15292,376],{"emptyLinePlaceholder":58},[145,15294,15295,15297,15299],{"class":147,"line":767},[145,15296,12238],{"class":262},[145,15298,266],{"class":258},[145,15300,15301],{"class":262}," generate_video(safe_payload)\n",[11,15303,15304],{},"The safe prompt produces equally compelling video — original character design, dynamic action, cinematic quality — without referencing any copyrighted property. The output is commercially usable because it's original creative expression.",[92,15306,15308],{"id":15307},"product-and-brand-content-using-your-own-assets-safely","Product and Brand Content: Using Your Own Assets Safely",[11,15310,15311,15312,2959,15314,15316],{},"For commercial product videos, the safest and most effective approach is referencing your own assets through the ",[28,15313,4144],{},[28,15315,2958],{}," reference tags. This produces content that's copyright-safe by design:",[136,15318,15320],{"className":338,"code":15319,"language":340,"meta":141,"style":141},"# ✅ Product showcase using your own brand assets\nproduct_payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"@Image1 as the hero product. Cinematic product reveal: \"\n              \"camera orbits slowly around the product on a clean white \"\n              \"marble surface. Soft studio lighting with a single dramatic \"\n              \"key light creating elegant shadows. Shallow depth of field. \"\n              \"Premium commercial photography aesthetic. Camera movement: \"\n              \"smooth 180-degree orbit, then slow push-in to detail shot.\",\n    \"image_urls\": [\"https://your-cdn.com/your-product-photo.jpg\"],\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": False\n}\n",[28,15321,15322,15327,15336,15346,15355,15360,15365,15370,15375,15382,15394,15404,15414,15424,15433],{"__ignoreMap":141},[145,15323,15324],{"class":147,"line":148},[145,15325,15326],{"class":174},"# ✅ Product showcase using your own brand assets\n",[145,15328,15329,15332,15334],{"class":147,"line":166},[145,15330,15331],{"class":262},"product_payload ",[145,15333,266],{"class":258},[145,15335,428],{"class":262},[145,15337,15338,15340,15342,15344],{"class":147,"line":178},[145,15339,3670],{"class":159},[145,15341,437],{"class":262},[145,15343,1308],{"class":159},[145,15345,452],{"class":262},[145,15347,15348,15350,15352],{"class":147,"line":187},[145,15349,3681],{"class":159},[145,15351,437],{"class":262},[145,15353,15354],{"class":159},"\"@Image1 as the hero product. Cinematic product reveal: \"\n",[145,15356,15357],{"class":147,"line":373},[145,15358,15359],{"class":159},"              \"camera orbits slowly around the product on a clean white \"\n",[145,15361,15362],{"class":147,"line":379},[145,15363,15364],{"class":159},"              \"marble surface. Soft studio lighting with a single dramatic \"\n",[145,15366,15367],{"class":147,"line":385},[145,15368,15369],{"class":159},"              \"key light creating elegant shadows. Shallow depth of field. \"\n",[145,15371,15372],{"class":147,"line":409},[145,15373,15374],{"class":159},"              \"Premium commercial photography aesthetic. Camera movement: \"\n",[145,15376,15377,15380],{"class":147,"line":420},[145,15378,15379],{"class":159},"              \"smooth 180-degree orbit, then slow push-in to detail shot.\"",[145,15381,452],{"class":262},[145,15383,15384,15387,15389,15392],{"class":147,"line":431},[145,15385,15386],{"class":159},"    \"image_urls\"",[145,15388,10841],{"class":262},[145,15390,15391],{"class":159},"\"https://your-cdn.com/your-product-photo.jpg\"",[145,15393,10847],{"class":262},[145,15395,15396,15398,15400,15402],{"class":147,"line":455},[145,15397,3693],{"class":159},[145,15399,437],{"class":262},[145,15401,3698],{"class":155},[145,15403,452],{"class":262},[145,15405,15406,15408,15410,15412],{"class":147,"line":466},[145,15407,3705],{"class":159},[145,15409,437],{"class":262},[145,15411,3710],{"class":159},[145,15413,452],{"class":262},[145,15415,15416,15418,15420,15422],{"class":147,"line":600},[145,15417,3717],{"class":159},[145,15419,437],{"class":262},[145,15421,1384],{"class":159},[145,15423,452],{"class":262},[145,15425,15426,15428,15430],{"class":147,"line":605},[145,15427,3733],{"class":159},[145,15429,437],{"class":262},[145,15431,15432],{"class":155},"False\n",[145,15434,15435],{"class":147,"line":611},[145,15436,469],{"class":262},[11,15438,15439],{},[2619,15440,2621],{},[11,15442,15443,15444,15446,15447,493],{},"For more prompt engineering techniques — including the shot-script format with time-based descriptions and advanced ",[28,15445,13789],{}," combinations — see our comprehensive ",[37,15448,2211],{"href":1766},[92,15450,15452],{"id":15451},"building-a-prompt-safety-layer-in-your-application","Building a Prompt Safety Layer in Your Application",[11,15454,15455],{},"If you're building a product that lets your users generate video content, consider implementing a client-side prompt safety check before sending requests to the API:",[136,15457,15459],{"className":338,"code":15458,"language":340,"meta":141,"style":141},"import re\n\n# Basic copyright safety check — extend as needed\nBLOCKED_TERMS = {\n    # Characters\n    \"spider-man\", \"spiderman\", \"batman\", \"superman\", \"iron man\",\n    \"mickey mouse\", \"elsa\", \"buzz lightyear\", \"pikachu\", \"mario\",\n    \"harry potter\", \"darth vader\", \"baby yoda\", \"grogu\",\n    # Franchises\n    \"marvel\", \"disney\", \"pixar movie\", \"star wars\", \"pokemon\",\n    \"lord of the rings\", \"game of thrones\", \"hogwarts\",\n    # Studios (when used to replicate their specific works)\n    \"studio ghibli film\", \"dreamworks movie\",\n    # Brands\n    \"nike swoosh\", \"coca-cola\", \"apple logo\",\n}\n\nBLOCKED_PATTERNS = [\n    r\"looks?\\s+like\\s+\\w+\\s+(from|in)\\s+\",  # \"looks like X from Y\"\n    r\"(scene|sequence)\\s+(from|in)\\s+[A-Z]\",  # \"scene from [Movie]\"\n    r\"in\\s+the\\s+style\\s+of\\s+[A-Z]\\w+\\s+[A-Z]\",  # \"in the style of [Studio Name]\"\n]\n\ndef check_prompt_safety(prompt: str) -> dict:\n    \"\"\"Check a prompt for potential copyright issues.\"\"\"\n    prompt_lower = prompt.lower()\n    issues = []\n\n    for term in BLOCKED_TERMS:\n        if term in prompt_lower:\n            issues.append(f\"Blocked term found: '{term}'\")\n\n    for pattern in BLOCKED_PATTERNS:\n        if re.search(pattern, prompt, re.IGNORECASE):\n            issues.append(f\"Risky pattern detected: {pattern}\")\n\n    return {\n        \"safe\": len(issues) == 0,\n        \"issues\": issues,\n        \"recommendation\": \"Revise prompt to use original descriptions\"\n                          if issues else \"Prompt appears safe\"\n    }\n\n# Usage\nresult = check_prompt_safety(\n    \"A Spider-Man style hero swinging through New York\"\n)\nprint(result)\n# {'safe': False, 'issues': ['Blocked term found: \\'spider-man\\''],\n#  'recommendation': 'Revise prompt to use original descriptions'}\n\nresult = check_prompt_safety(\n    \"A masked hero in crimson armor swings between futuristic towers\"\n)\nprint(result)\n# {'safe': True, 'issues': [], 'recommendation': 'Prompt appears safe'}\n",[28,15460,15461,15468,15472,15477,15486,15491,15518,15545,15567,15572,15599,15616,15621,15633,15638,15655,15659,15663,15672,15728,15770,15820,15824,15828,15847,15852,15862,15871,15875,15889,15900,15921,15925,15939,15951,15971,15975,15981,16001,16009,16019,16033,16037,16041,16046,16055,16060,16064,16071,16076,16081,16085,16093,16098,16102,16108],{"__ignoreMap":141},[145,15462,15463,15465],{"class":147,"line":148},[145,15464,347],{"class":258},[145,15466,15467],{"class":262}," re\n",[145,15469,15470],{"class":147,"line":166},[145,15471,376],{"emptyLinePlaceholder":58},[145,15473,15474],{"class":147,"line":178},[145,15475,15476],{"class":174},"# Basic copyright safety check — extend as needed\n",[145,15478,15479,15482,15484],{"class":147,"line":187},[145,15480,15481],{"class":155},"BLOCKED_TERMS",[145,15483,391],{"class":258},[145,15485,428],{"class":262},[145,15487,15488],{"class":147,"line":373},[145,15489,15490],{"class":174},"    # Characters\n",[145,15492,15493,15496,15498,15501,15503,15506,15508,15511,15513,15516],{"class":147,"line":379},[145,15494,15495],{"class":159},"    \"spider-man\"",[145,15497,400],{"class":262},[145,15499,15500],{"class":159},"\"spiderman\"",[145,15502,400],{"class":262},[145,15504,15505],{"class":159},"\"batman\"",[145,15507,400],{"class":262},[145,15509,15510],{"class":159},"\"superman\"",[145,15512,400],{"class":262},[145,15514,15515],{"class":159},"\"iron man\"",[145,15517,452],{"class":262},[145,15519,15520,15523,15525,15528,15530,15533,15535,15538,15540,15543],{"class":147,"line":385},[145,15521,15522],{"class":159},"    \"mickey mouse\"",[145,15524,400],{"class":262},[145,15526,15527],{"class":159},"\"elsa\"",[145,15529,400],{"class":262},[145,15531,15532],{"class":159},"\"buzz lightyear\"",[145,15534,400],{"class":262},[145,15536,15537],{"class":159},"\"pikachu\"",[145,15539,400],{"class":262},[145,15541,15542],{"class":159},"\"mario\"",[145,15544,452],{"class":262},[145,15546,15547,15550,15552,15555,15557,15560,15562,15565],{"class":147,"line":409},[145,15548,15549],{"class":159},"    \"harry potter\"",[145,15551,400],{"class":262},[145,15553,15554],{"class":159},"\"darth vader\"",[145,15556,400],{"class":262},[145,15558,15559],{"class":159},"\"baby yoda\"",[145,15561,400],{"class":262},[145,15563,15564],{"class":159},"\"grogu\"",[145,15566,452],{"class":262},[145,15568,15569],{"class":147,"line":420},[145,15570,15571],{"class":174},"    # Franchises\n",[145,15573,15574,15577,15579,15582,15584,15587,15589,15592,15594,15597],{"class":147,"line":431},[145,15575,15576],{"class":159},"    \"marvel\"",[145,15578,400],{"class":262},[145,15580,15581],{"class":159},"\"disney\"",[145,15583,400],{"class":262},[145,15585,15586],{"class":159},"\"pixar movie\"",[145,15588,400],{"class":262},[145,15590,15591],{"class":159},"\"star wars\"",[145,15593,400],{"class":262},[145,15595,15596],{"class":159},"\"pokemon\"",[145,15598,452],{"class":262},[145,15600,15601,15604,15606,15609,15611,15614],{"class":147,"line":455},[145,15602,15603],{"class":159},"    \"lord of the rings\"",[145,15605,400],{"class":262},[145,15607,15608],{"class":159},"\"game of thrones\"",[145,15610,400],{"class":262},[145,15612,15613],{"class":159},"\"hogwarts\"",[145,15615,452],{"class":262},[145,15617,15618],{"class":147,"line":466},[145,15619,15620],{"class":174},"    # Studios (when used to replicate their specific works)\n",[145,15622,15623,15626,15628,15631],{"class":147,"line":600},[145,15624,15625],{"class":159},"    \"studio ghibli film\"",[145,15627,400],{"class":262},[145,15629,15630],{"class":159},"\"dreamworks movie\"",[145,15632,452],{"class":262},[145,15634,15635],{"class":147,"line":605},[145,15636,15637],{"class":174},"    # Brands\n",[145,15639,15640,15643,15645,15648,15650,15653],{"class":147,"line":611},[145,15641,15642],{"class":159},"    \"nike swoosh\"",[145,15644,400],{"class":262},[145,15646,15647],{"class":159},"\"coca-cola\"",[145,15649,400],{"class":262},[145,15651,15652],{"class":159},"\"apple logo\"",[145,15654,452],{"class":262},[145,15656,15657],{"class":147,"line":617},[145,15658,469],{"class":262},[145,15660,15661],{"class":147,"line":623},[145,15662,376],{"emptyLinePlaceholder":58},[145,15664,15665,15668,15670],{"class":147,"line":628},[145,15666,15667],{"class":155},"BLOCKED_PATTERNS",[145,15669,391],{"class":258},[145,15671,8867],{"class":262},[145,15673,15674,15677,15679,15683,15686,15689,15691,15694,15696,15698,15701,15703,15705,15707,15709,15711,15714,15716,15719,15721,15723,15725],{"class":147,"line":639},[145,15675,15676],{"class":258},"    r",[145,15678,449],{"class":159},[145,15680,15682],{"class":15681},"sns5M","looks",[145,15684,15685],{"class":258},"?",[145,15687,15688],{"class":155},"\\s",[145,15690,5427],{"class":258},[145,15692,15693],{"class":15681},"like",[145,15695,15688],{"class":155},[145,15697,5427],{"class":258},[145,15699,15700],{"class":155},"\\w",[145,15702,5427],{"class":258},[145,15704,15688],{"class":155},[145,15706,5427],{"class":258},[145,15708,794],{"class":155},[145,15710,6728],{"class":15681},[145,15712,15713],{"class":258},"|",[145,15715,1180],{"class":15681},[145,15717,15718],{"class":155},")\\s",[145,15720,5427],{"class":258},[145,15722,449],{"class":159},[145,15724,1447],{"class":262},[145,15726,15727],{"class":174},"# \"looks like X from Y\"\n",[145,15729,15730,15732,15734,15736,15739,15741,15744,15746,15748,15750,15752,15754,15756,15758,15760,15763,15765,15767],{"class":147,"line":654},[145,15731,15676],{"class":258},[145,15733,449],{"class":159},[145,15735,794],{"class":155},[145,15737,15738],{"class":15681},"scene",[145,15740,15713],{"class":258},[145,15742,15743],{"class":15681},"sequence",[145,15745,15718],{"class":155},[145,15747,5427],{"class":258},[145,15749,794],{"class":155},[145,15751,6728],{"class":15681},[145,15753,15713],{"class":258},[145,15755,1180],{"class":15681},[145,15757,15718],{"class":155},[145,15759,5427],{"class":258},[145,15761,15762],{"class":155},"[A-Z]",[145,15764,449],{"class":159},[145,15766,1447],{"class":262},[145,15768,15769],{"class":174},"# \"scene from [Movie]\"\n",[145,15771,15772,15774,15776,15778,15780,15782,15785,15787,15789,15791,15793,15795,15798,15800,15802,15805,15807,15809,15811,15813,15815,15817],{"class":147,"line":660},[145,15773,15676],{"class":258},[145,15775,449],{"class":159},[145,15777,1180],{"class":15681},[145,15779,15688],{"class":155},[145,15781,5427],{"class":258},[145,15783,15784],{"class":15681},"the",[145,15786,15688],{"class":155},[145,15788,5427],{"class":258},[145,15790,11217],{"class":15681},[145,15792,15688],{"class":155},[145,15794,5427],{"class":258},[145,15796,15797],{"class":15681},"of",[145,15799,15688],{"class":155},[145,15801,5427],{"class":258},[145,15803,15804],{"class":155},"[A-Z]\\w",[145,15806,5427],{"class":258},[145,15808,15688],{"class":155},[145,15810,5427],{"class":258},[145,15812,15762],{"class":155},[145,15814,449],{"class":159},[145,15816,1447],{"class":262},[145,15818,15819],{"class":174},"# \"in the style of [Studio Name]\"\n",[145,15821,15822],{"class":147,"line":671},[145,15823,764],{"class":262},[145,15825,15826],{"class":147,"line":698},[145,15827,376],{"emptyLinePlaceholder":58},[145,15829,15830,15832,15835,15838,15840,15843,15845],{"class":147,"line":710},[145,15831,526],{"class":258},[145,15833,15834],{"class":151}," check_prompt_safety",[145,15836,15837],{"class":262},"(prompt: ",[145,15839,8673],{"class":155},[145,15841,15842],{"class":262},") -> ",[145,15844,8798],{"class":155},[145,15846,860],{"class":262},[145,15848,15849],{"class":147,"line":716},[145,15850,15851],{"class":159},"    \"\"\"Check a prompt for potential copyright issues.\"\"\"\n",[145,15853,15854,15857,15859],{"class":147,"line":722},[145,15855,15856],{"class":262},"    prompt_lower ",[145,15858,266],{"class":258},[145,15860,15861],{"class":262}," prompt.lower()\n",[145,15863,15864,15867,15869],{"class":147,"line":728},[145,15865,15866],{"class":262},"    issues ",[145,15868,266],{"class":258},[145,15870,5876],{"class":262},[145,15872,15873],{"class":147,"line":739},[145,15874,376],{"emptyLinePlaceholder":58},[145,15876,15877,15879,15882,15884,15887],{"class":147,"line":744},[145,15878,5119],{"class":258},[145,15880,15881],{"class":262}," term ",[145,15883,1180],{"class":258},[145,15885,15886],{"class":155}," BLOCKED_TERMS",[145,15888,860],{"class":262},[145,15890,15891,15893,15895,15897],{"class":147,"line":750},[145,15892,848],{"class":258},[145,15894,15881],{"class":262},[145,15896,1180],{"class":258},[145,15898,15899],{"class":262}," prompt_lower:\n",[145,15901,15902,15905,15907,15910,15912,15915,15917,15919],{"class":147,"line":767},[145,15903,15904],{"class":262},"            issues.append(",[145,15906,440],{"class":258},[145,15908,15909],{"class":159},"\"Blocked term found: '",[145,15911,685],{"class":155},[145,15913,15914],{"class":262},"term",[145,15916,691],{"class":155},[145,15918,6109],{"class":159},[145,15920,406],{"class":262},[145,15922,15923],{"class":147,"line":788},[145,15924,376],{"emptyLinePlaceholder":58},[145,15926,15927,15929,15932,15934,15937],{"class":147,"line":834},[145,15928,5119],{"class":258},[145,15930,15931],{"class":262}," pattern ",[145,15933,1180],{"class":258},[145,15935,15936],{"class":155}," BLOCKED_PATTERNS",[145,15938,860],{"class":262},[145,15940,15941,15943,15946,15949],{"class":147,"line":839},[145,15942,848],{"class":258},[145,15944,15945],{"class":262}," re.search(pattern, prompt, re.",[145,15947,15948],{"class":155},"IGNORECASE",[145,15950,548],{"class":262},[145,15952,15953,15955,15957,15960,15962,15965,15967,15969],{"class":147,"line":845},[145,15954,15904],{"class":262},[145,15956,440],{"class":258},[145,15958,15959],{"class":159},"\"Risky pattern detected: ",[145,15961,685],{"class":155},[145,15963,15964],{"class":262},"pattern",[145,15966,691],{"class":155},[145,15968,449],{"class":159},[145,15970,406],{"class":262},[145,15972,15973],{"class":147,"line":863},[145,15974,376],{"emptyLinePlaceholder":58},[145,15976,15977,15979],{"class":147,"line":872},[145,15978,1703],{"class":258},[145,15980,428],{"class":262},[145,15982,15983,15986,15988,15991,15994,15996,15999],{"class":147,"line":887},[145,15984,15985],{"class":159},"        \"safe\"",[145,15987,437],{"class":262},[145,15989,15990],{"class":155},"len",[145,15992,15993],{"class":262},"(issues) ",[145,15995,854],{"class":258},[145,15997,15998],{"class":155}," 0",[145,16000,452],{"class":262},[145,16002,16003,16006],{"class":147,"line":903},[145,16004,16005],{"class":159},"        \"issues\"",[145,16007,16008],{"class":262},": issues,\n",[145,16010,16011,16014,16016],{"class":147,"line":915},[145,16012,16013],{"class":159},"        \"recommendation\"",[145,16015,437],{"class":262},[145,16017,16018],{"class":159},"\"Revise prompt to use original descriptions\"\n",[145,16020,16021,16024,16027,16030],{"class":147,"line":953},[145,16022,16023],{"class":258},"                          if",[145,16025,16026],{"class":262}," issues ",[145,16028,16029],{"class":258},"else",[145,16031,16032],{"class":159}," \"Prompt appears safe\"\n",[145,16034,16035],{"class":147,"line":959},[145,16036,1407],{"class":262},[145,16038,16039],{"class":147,"line":964},[145,16040,376],{"emptyLinePlaceholder":58},[145,16042,16043],{"class":147,"line":970},[145,16044,16045],{"class":174},"# Usage\n",[145,16047,16048,16050,16052],{"class":147,"line":976},[145,16049,12238],{"class":262},[145,16051,266],{"class":258},[145,16053,16054],{"class":262}," check_prompt_safety(\n",[145,16056,16057],{"class":147,"line":988},[145,16058,16059],{"class":159},"    \"A Spider-Man style hero swinging through New York\"\n",[145,16061,16062],{"class":147,"line":993},[145,16063,406],{"class":262},[145,16065,16066,16068],{"class":147,"line":5531},[145,16067,6584],{"class":155},[145,16069,16070],{"class":262},"(result)\n",[145,16072,16073],{"class":147,"line":5540},[145,16074,16075],{"class":174},"# {'safe': False, 'issues': ['Blocked term found: \\'spider-man\\''],\n",[145,16077,16078],{"class":147,"line":5546},[145,16079,16080],{"class":174},"#  'recommendation': 'Revise prompt to use original descriptions'}\n",[145,16082,16083],{"class":147,"line":5574},[145,16084,376],{"emptyLinePlaceholder":58},[145,16086,16087,16089,16091],{"class":147,"line":5605},[145,16088,12238],{"class":262},[145,16090,266],{"class":258},[145,16092,16054],{"class":262},[145,16094,16095],{"class":147,"line":5625},[145,16096,16097],{"class":159},"    \"A masked hero in crimson armor swings between futuristic towers\"\n",[145,16099,16100],{"class":147,"line":5631},[145,16101,406],{"class":262},[145,16103,16104,16106],{"class":147,"line":5637},[145,16105,6584],{"class":155},[145,16107,16070],{"class":262},[145,16109,16110],{"class":147,"line":5642},[145,16111,16112],{"class":174},"# {'safe': True, 'issues': [], 'recommendation': 'Prompt appears safe'}\n",[11,16114,16115],{},[2619,16116,16117],{},"This is a basic starting point. A production system should use more sophisticated NLP-based detection, regularly updated blocklists, and human review for borderline cases.",[48,16119,16121],{"id":16120},"how-to-access-seedance-20-api-through-evolink","How to Access Seedance 2.0 API Through EvoLink",[18,16123,16124],{},[11,16125,16126,16127,16130,16131,16133,16134,16137],{},"⚠️ ",[23,16128,16129],{},"Important disclaimer:"," EvoLink is a unified API gateway for multiple video generation models. EvoLink does ",[23,16132,6075],{}," serve as a compliance intermediary and makes ",[23,16135,16136],{},"no guarantees"," about the copyright status of any model's outputs. Copyright compliance is the developer's responsibility. EvoLink provides access and infrastructure — not legal protection.",[11,16139,16140],{},"With that clearly stated, here's what EvoLink offers developers working with Seedance 2.0.",[92,16142,16144],{"id":16143},"api-integration-ready-now-live-when-bytedance-opens","API Integration: Ready Now, Live When ByteDance Opens",[11,16146,16147],{},"EvoLink has completed its Seedance 2.0 API adapter. The endpoint, parameters, and response format are finalized and documented. When ByteDance officially enables the API after implementing its copyright safeguards, your EvoLink integration goes live immediately — zero code changes needed.",[11,16149,16150,16151,16156],{},"The integration follows the ",[37,16152,16155],{"href":16153,"rel":16154},"https://docs.evolink.ai/en/api-manual/video-series/seedance2.0/seedance-2.0-video-generate",[41],"EvoLink Seedance 2.0 Video Generation API"," specification:",[136,16158,16160],{"className":338,"code":16159,"language":340,"meta":141,"style":141},"# Text-to-video: Seedance 2.0 via EvoLink\ntext_to_video = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"A wise old cat in round spectacles sits at a cozy cafe \"\n              \"table, paws wrapped around a tiny porcelain cup. Steam \"\n              \"curls upward. The cat speaks in a calm, measured tone. \"\n              \"Warm afternoon light through the cafe window, Pixar-quality \"\n              \"3D animation, warm color palette, expressive character acting.\",\n    \"duration\": 10,\n    \"quality\": \"720p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n\nresult = generate_video(text_to_video)\n",[28,16161,16162,16167,16176,16186,16195,16200,16205,16210,16217,16227,16237,16247,16255,16259,16263],{"__ignoreMap":141},[145,16163,16164],{"class":147,"line":148},[145,16165,16166],{"class":174},"# Text-to-video: Seedance 2.0 via EvoLink\n",[145,16168,16169,16172,16174],{"class":147,"line":166},[145,16170,16171],{"class":262},"text_to_video ",[145,16173,266],{"class":258},[145,16175,428],{"class":262},[145,16177,16178,16180,16182,16184],{"class":147,"line":178},[145,16179,3670],{"class":159},[145,16181,437],{"class":262},[145,16183,1308],{"class":159},[145,16185,452],{"class":262},[145,16187,16188,16190,16192],{"class":147,"line":187},[145,16189,3681],{"class":159},[145,16191,437],{"class":262},[145,16193,16194],{"class":159},"\"A wise old cat in round spectacles sits at a cozy cafe \"\n",[145,16196,16197],{"class":147,"line":373},[145,16198,16199],{"class":159},"              \"table, paws wrapped around a tiny porcelain cup. Steam \"\n",[145,16201,16202],{"class":147,"line":379},[145,16203,16204],{"class":159},"              \"curls upward. The cat speaks in a calm, measured tone. \"\n",[145,16206,16207],{"class":147,"line":385},[145,16208,16209],{"class":159},"              \"Warm afternoon light through the cafe window, Pixar-quality \"\n",[145,16211,16212,16215],{"class":147,"line":409},[145,16213,16214],{"class":159},"              \"3D animation, warm color palette, expressive character acting.\"",[145,16216,452],{"class":262},[145,16218,16219,16221,16223,16225],{"class":147,"line":420},[145,16220,3693],{"class":159},[145,16222,437],{"class":262},[145,16224,537],{"class":155},[145,16226,452],{"class":262},[145,16228,16229,16231,16233,16235],{"class":147,"line":431},[145,16230,3705],{"class":159},[145,16232,437],{"class":262},[145,16234,1368],{"class":159},[145,16236,452],{"class":262},[145,16238,16239,16241,16243,16245],{"class":147,"line":455},[145,16240,3717],{"class":159},[145,16242,437],{"class":262},[145,16244,1384],{"class":159},[145,16246,452],{"class":262},[145,16248,16249,16251,16253],{"class":147,"line":466},[145,16250,3733],{"class":159},[145,16252,437],{"class":262},[145,16254,3738],{"class":155},[145,16256,16257],{"class":147,"line":600},[145,16258,469],{"class":262},[145,16260,16261],{"class":147,"line":605},[145,16262,376],{"emptyLinePlaceholder":58},[145,16264,16265,16267,16269],{"class":147,"line":611},[145,16266,12238],{"class":262},[145,16268,266],{"class":258},[145,16270,16271],{"class":262}," generate_video(text_to_video)\n",[11,16273,16274],{},[2619,16275,16276],{},"Uses the same setup and polling function from the first code example.",[92,16278,16280],{"id":16279},"full-multimodal-generation-images-videos-audio","Full Multimodal Generation: Images + Videos + Audio",[11,16282,16283,16284,16286],{},"Seedance 2.0's standout feature is its multimodal ",[28,16285,13789],{}," system — the ability to combine image, video, and audio inputs as creative references within a single generation request. Through EvoLink, all input modalities are fully supported:",[136,16288,16290],{"className":338,"code":16289,"language":340,"meta":141,"style":141},"# Multimodal generation — character ref + camera ref + audio sync\nmultimodal_payload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": \"@Image1 as character reference — dancer in athletic wear. \"\n              \"Reference @Video1 camera movement style: rhythmic push-pull \"\n              \"pan and tilt movements. @Audio1 for BGM rhythm — align cuts \"\n              \"and motion energy to the beat. The dancer performs energetically \"\n              \"on a colorful LED-lit stage. Spotlights shift colors in sync \"\n              \"with the rhythm. Smoke effects catch the colored lighting.\",\n    \"image_urls\": [\n        \"https://your-cdn.com/character-design.png\"\n    ],\n    \"video_urls\": [\n        \"https://your-cdn.com/camera-reference.mp4\"\n    ],\n    \"audio_urls\": [\n        \"https://your-cdn.com/background-track.mp3\"\n    ],\n    \"duration\": 12,\n    \"quality\": \"720p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n\nresult = generate_video(multimodal_payload)\n",[28,16291,16292,16297,16306,16316,16325,16330,16335,16340,16345,16352,16358,16363,16368,16375,16380,16384,16391,16396,16400,16411,16421,16431,16439,16443,16447],{"__ignoreMap":141},[145,16293,16294],{"class":147,"line":148},[145,16295,16296],{"class":174},"# Multimodal generation — character ref + camera ref + audio sync\n",[145,16298,16299,16302,16304],{"class":147,"line":166},[145,16300,16301],{"class":262},"multimodal_payload ",[145,16303,266],{"class":258},[145,16305,428],{"class":262},[145,16307,16308,16310,16312,16314],{"class":147,"line":178},[145,16309,3670],{"class":159},[145,16311,437],{"class":262},[145,16313,1308],{"class":159},[145,16315,452],{"class":262},[145,16317,16318,16320,16322],{"class":147,"line":187},[145,16319,3681],{"class":159},[145,16321,437],{"class":262},[145,16323,16324],{"class":159},"\"@Image1 as character reference — dancer in athletic wear. \"\n",[145,16326,16327],{"class":147,"line":373},[145,16328,16329],{"class":159},"              \"Reference @Video1 camera movement style: rhythmic push-pull \"\n",[145,16331,16332],{"class":147,"line":379},[145,16333,16334],{"class":159},"              \"pan and tilt movements. @Audio1 for BGM rhythm — align cuts \"\n",[145,16336,16337],{"class":147,"line":385},[145,16338,16339],{"class":159},"              \"and motion energy to the beat. The dancer performs energetically \"\n",[145,16341,16342],{"class":147,"line":409},[145,16343,16344],{"class":159},"              \"on a colorful LED-lit stage. Spotlights shift colors in sync \"\n",[145,16346,16347,16350],{"class":147,"line":420},[145,16348,16349],{"class":159},"              \"with the rhythm. Smoke effects catch the colored lighting.\"",[145,16351,452],{"class":262},[145,16353,16354,16356],{"class":147,"line":431},[145,16355,15386],{"class":159},[145,16357,2691],{"class":262},[145,16359,16360],{"class":147,"line":455},[145,16361,16362],{"class":159},"        \"https://your-cdn.com/character-design.png\"\n",[145,16364,16365],{"class":147,"line":466},[145,16366,16367],{"class":262},"    ],\n",[145,16369,16370,16373],{"class":147,"line":600},[145,16371,16372],{"class":159},"    \"video_urls\"",[145,16374,2691],{"class":262},[145,16376,16377],{"class":147,"line":605},[145,16378,16379],{"class":159},"        \"https://your-cdn.com/camera-reference.mp4\"\n",[145,16381,16382],{"class":147,"line":611},[145,16383,16367],{"class":262},[145,16385,16386,16389],{"class":147,"line":617},[145,16387,16388],{"class":159},"    \"audio_urls\"",[145,16390,2691],{"class":262},[145,16392,16393],{"class":147,"line":623},[145,16394,16395],{"class":159},"        \"https://your-cdn.com/background-track.mp3\"\n",[145,16397,16398],{"class":147,"line":628},[145,16399,16367],{"class":262},[145,16401,16402,16404,16406,16409],{"class":147,"line":639},[145,16403,3693],{"class":159},[145,16405,437],{"class":262},[145,16407,16408],{"class":155},"12",[145,16410,452],{"class":262},[145,16412,16413,16415,16417,16419],{"class":147,"line":654},[145,16414,3705],{"class":159},[145,16416,437],{"class":262},[145,16418,1368],{"class":159},[145,16420,452],{"class":262},[145,16422,16423,16425,16427,16429],{"class":147,"line":660},[145,16424,3717],{"class":159},[145,16426,437],{"class":262},[145,16428,1384],{"class":159},[145,16430,452],{"class":262},[145,16432,16433,16435,16437],{"class":147,"line":671},[145,16434,3733],{"class":159},[145,16436,437],{"class":262},[145,16438,3738],{"class":155},[145,16440,16441],{"class":147,"line":698},[145,16442,469],{"class":262},[145,16444,16445],{"class":147,"line":710},[145,16446,376],{"emptyLinePlaceholder":58},[145,16448,16449,16451,16453],{"class":147,"line":716},[145,16450,12238],{"class":262},[145,16452,266],{"class":258},[145,16454,16455],{"class":262}," generate_video(multimodal_payload)\n",[11,16457,16458],{},[2619,16459,16276],{},[14370,16461,16462,16467,16470],{"style":14372},[11,16463,16464],{},[23,16465,16466],{},"Get started with EvoLink's Video Generation API",[11,16468,16469],{},"Free tier available. One API key, multiple models. Seedance 2.0 integration ready — goes live the moment ByteDance opens access.",[11,16471,16472],{},[37,16473,16475],{"href":16474},"/early-access","Get Your Free API Key →",[92,16477,16479],{"id":16478},"complete-api-parameter-reference","Complete API Parameter Reference",[11,16481,16482],{},"Here's the full parameter set supported through EvoLink for Seedance 2.0:",[2036,16484,16485,16498],{},[2039,16486,16487],{},[2042,16488,16489,16491,16493,16496],{},[2045,16490,3400],{},[2045,16492,3403],{},[2045,16494,16495],{"align":13812},"Required",[2045,16497,3412],{},[2052,16499,16500,16514,16535,16550,16565,16580,16593,16612,16639,16652],{},[2042,16501,16502,16506,16508,16510],{},[2057,16503,16504],{},[28,16505,1747],{},[2057,16507,3423],{},[2057,16509,13852],{"align":13812},[2057,16511,16512],{},[28,16513,1308],{},[2042,16515,16516,16520,16522,16524],{},[2057,16517,16518],{},[28,16519,1762],{},[2057,16521,3423],{},[2057,16523,13852],{"align":13812},[2057,16525,16526,16527,400,16529,400,16531,16534],{},"Up to 2000 tokens. Supports ",[28,16528,2908],{},[28,16530,11421],{},[28,16532,16533],{},"@Audio1"," references",[2042,16536,16537,16541,16545,16547],{},[2057,16538,16539],{},[28,16540,2896],{},[2057,16542,3423,16543],{},[145,16544],{},[2057,16546,3426],{"align":13812},[2057,16548,16549],{},"Up to 9 images, max 30MB each. Formats: jpeg, png, webp, bmp, tiff, gif",[2042,16551,16552,16556,16560,16562],{},[2057,16553,16554],{},[28,16555,3567],{},[2057,16557,3423,16558],{},[145,16559],{},[2057,16561,3426],{"align":13812},[2057,16563,16564],{},"Up to 3 videos, total 2-15s, max 50MB each. Formats: mp4, mov",[2042,16566,16567,16571,16575,16577],{},[2057,16568,16569],{},[28,16570,3584],{},[2057,16572,3423,16573],{},[145,16574],{},[2057,16576,3426],{"align":13812},[2057,16578,16579],{},"Up to 3 audio tracks, total ≤15s, max 15MB each. Formats: mp3, wav",[2042,16581,16582,16586,16588,16590],{},[2057,16583,16584],{},[28,16585,1774],{},[2057,16587,3458],{},[2057,16589,3426],{"align":13812},[2057,16591,16592],{},"4-15 seconds (default: 5)",[2042,16594,16595,16599,16601,16603],{},[2057,16596,16597],{},[28,16598,1782],{},[2057,16600,3423],{},[2057,16602,3426],{"align":13812},[2057,16604,16605,400,16607,16609,16610],{},[28,16606,4013],{},[28,16608,1368],{}," (default), ",[28,16611,3710],{},[2042,16613,16614,16618,16620,16622],{},[2057,16615,16616],{},[28,16617,1802],{},[2057,16619,3423],{},[2057,16621,3426],{"align":13812},[2057,16623,16624,16609,16626,400,16628,400,16630,400,16632,400,16634,400,16636],{},[28,16625,1384],{},[28,16627,3722],{},[28,16629,6140],{},[28,16631,6145],{},[28,16633,6150],{},[28,16635,3833],{},[28,16637,16638],{},"\"adaptive\"",[2042,16640,16641,16645,16647,16649],{},[2057,16642,16643],{},[28,16644,1822],{},[2057,16646,3530],{},[2057,16648,3426],{"align":13812},[2057,16650,16651],{},"Enable synchronized audio generation (default: true)",[2042,16653,16654,16658,16660,16662],{},[2057,16655,16656],{},[28,16657,3601],{},[2057,16659,3423],{},[2057,16661,3426],{"align":13812},[2057,16663,16664],{},"HTTPS webhook URL for task completion notification",[11,16666,16667,16670],{},[23,16668,16669],{},"Input limits:"," Maximum 12 files total across all modalities. Realistic human face uploads are automatically rejected. All URLs must be directly accessible by the server.",[11,16672,16673,16676,16677,16682,16683,16685],{},[23,16674,16675],{},"Task flow:"," The API returns a task ID immediately. Poll the ",[37,16678,16681],{"href":16679,"rel":16680},"https://docs.evolink.ai/en/api-manual/task-management/get-task-detail",[41],"task status endpoint"," or use the ",[28,16684,3601],{}," webhook to receive completion notifications. Generated video URLs are valid for 24 hours — download and store them promptly.",[92,16687,16689],{"id":16688},"multi-model-failover-keep-your-pipeline-running-during-the-delay","Multi-Model Failover: Keep Your Pipeline Running During the Delay",[11,16691,16692],{},"This is where EvoLink's unified API architecture delivers concrete value during the Seedance 2.0 copyright delay. Instead of building and maintaining separate integrations for each model, you implement automatic failover with a single code path:",[136,16694,16696],{"className":338,"code":16695,"language":340,"meta":141,"style":141},"# Multi-model failover — your pipeline never stops\nMODEL_PRIORITY = [\n    \"seedance-2.0\",  # Preferred: best multimodal capabilities\n    \"kling\",          # Fallback 1: strong motion quality\n    \"veo-2\",          # Fallback 2: high visual fidelity\n    \"sora\",           # Fallback 3: robust safety, good adherence\n]\n\ndef generate_with_failover(prompt, duration=10, quality=\"720p\",\n                           aspect_ratio=\"16:9\", **kwargs):\n    \"\"\"Try models in priority order. First success wins.\"\"\"\n    errors = {}\n    for model in MODEL_PRIORITY:\n        try:\n            payload = {\n                \"model\": model,\n                \"prompt\": prompt,\n                \"duration\": duration,\n                \"quality\": quality,\n                \"aspect_ratio\": aspect_ratio,\n                **kwargs\n            }\n            result = generate_video(payload)\n            print(f\"✅ Generated with: {model}\")\n            return result\n        except Exception as e:\n            errors[model] = str(e)\n            print(f\"⚠️ {model} unavailable: {e}\")\n            continue\n\n    raise Exception(f\"All models failed: {errors}\")\n\n# Your application code stays the same regardless of model availability\nresult = generate_with_failover(\n    prompt=\"Cinematic drone shot over a mountain lake at sunrise. \"\n           \"Mist rises from the water surface. Golden light breaks \"\n           \"through clouds and reflects off the still water. \"\n           \"Slow, majestic camera movement.\",\n    duration=10,\n    quality=\"720p\",\n    aspect_ratio=\"16:9\",\n    generate_audio=True\n)\n",[28,16697,16698,16703,16712,16722,16732,16742,16753,16757,16761,16784,16801,16806,16815,16829,16835,16844,16852,16859,16867,16875,16883,16891,16896,16905,16926,16932,16942,16955,16985,16989,16993,17017,17021,17026,17035,17045,17050,17055,17062,17073,17084,17095,17104],{"__ignoreMap":141},[145,16699,16700],{"class":147,"line":148},[145,16701,16702],{"class":174},"# Multi-model failover — your pipeline never stops\n",[145,16704,16705,16708,16710],{"class":147,"line":166},[145,16706,16707],{"class":155},"MODEL_PRIORITY",[145,16709,391],{"class":258},[145,16711,8867],{"class":262},[145,16713,16714,16717,16719],{"class":147,"line":178},[145,16715,16716],{"class":159},"    \"seedance-2.0\"",[145,16718,1447],{"class":262},[145,16720,16721],{"class":174},"# Preferred: best multimodal capabilities\n",[145,16723,16724,16727,16729],{"class":147,"line":187},[145,16725,16726],{"class":159},"    \"kling\"",[145,16728,1311],{"class":262},[145,16730,16731],{"class":174},"# Fallback 1: strong motion quality\n",[145,16733,16734,16737,16739],{"class":147,"line":373},[145,16735,16736],{"class":159},"    \"veo-2\"",[145,16738,1311],{"class":262},[145,16740,16741],{"class":174},"# Fallback 2: high visual fidelity\n",[145,16743,16744,16747,16750],{"class":147,"line":379},[145,16745,16746],{"class":159},"    \"sora\"",[145,16748,16749],{"class":262},",           ",[145,16751,16752],{"class":174},"# Fallback 3: robust safety, good adherence\n",[145,16754,16755],{"class":147,"line":385},[145,16756,764],{"class":262},[145,16758,16759],{"class":147,"line":409},[145,16760,376],{"emptyLinePlaceholder":58},[145,16762,16763,16765,16768,16771,16773,16775,16778,16780,16782],{"class":147,"line":420},[145,16764,526],{"class":258},[145,16766,16767],{"class":151}," generate_with_failover",[145,16769,16770],{"class":262},"(prompt, duration",[145,16772,266],{"class":258},[145,16774,537],{"class":155},[145,16776,16777],{"class":262},", quality",[145,16779,266],{"class":258},[145,16781,1368],{"class":159},[145,16783,452],{"class":262},[145,16785,16786,16789,16791,16793,16795,16798],{"class":147,"line":431},[145,16787,16788],{"class":262},"                           aspect_ratio",[145,16790,266],{"class":258},[145,16792,1384],{"class":159},[145,16794,400],{"class":262},[145,16796,16797],{"class":258},"**",[145,16799,16800],{"class":262},"kwargs):\n",[145,16802,16803],{"class":147,"line":455},[145,16804,16805],{"class":159},"    \"\"\"Try models in priority order. First success wins.\"\"\"\n",[145,16807,16808,16810,16812],{"class":147,"line":466},[145,16809,5871],{"class":262},[145,16811,266],{"class":258},[145,16813,16814],{"class":262}," {}\n",[145,16816,16817,16819,16822,16824,16827],{"class":147,"line":600},[145,16818,5119],{"class":258},[145,16820,16821],{"class":262}," model ",[145,16823,1180],{"class":258},[145,16825,16826],{"class":155}," MODEL_PRIORITY",[145,16828,860],{"class":262},[145,16830,16831,16833],{"class":147,"line":605},[145,16832,5135],{"class":258},[145,16834,860],{"class":262},[145,16836,16837,16840,16842],{"class":147,"line":611},[145,16838,16839],{"class":262},"            payload ",[145,16841,266],{"class":258},[145,16843,428],{"class":262},[145,16845,16846,16849],{"class":147,"line":617},[145,16847,16848],{"class":159},"                \"model\"",[145,16850,16851],{"class":262},": model,\n",[145,16853,16854,16857],{"class":147,"line":623},[145,16855,16856],{"class":159},"                \"prompt\"",[145,16858,8491],{"class":262},[145,16860,16861,16864],{"class":147,"line":628},[145,16862,16863],{"class":159},"                \"duration\"",[145,16865,16866],{"class":262},": duration,\n",[145,16868,16869,16872],{"class":147,"line":639},[145,16870,16871],{"class":159},"                \"quality\"",[145,16873,16874],{"class":262},": quality,\n",[145,16876,16877,16880],{"class":147,"line":654},[145,16878,16879],{"class":159},"                \"aspect_ratio\"",[145,16881,16882],{"class":262},": aspect_ratio,\n",[145,16884,16885,16888],{"class":147,"line":660},[145,16886,16887],{"class":258},"                **",[145,16889,16890],{"class":262},"kwargs\n",[145,16892,16893],{"class":147,"line":671},[145,16894,16895],{"class":262},"            }\n",[145,16897,16898,16900,16902],{"class":147,"line":698},[145,16899,8573],{"class":262},[145,16901,266],{"class":258},[145,16903,16904],{"class":262}," generate_video(payload)\n",[145,16906,16907,16909,16911,16913,16916,16918,16920,16922,16924],{"class":147,"line":710},[145,16908,5577],{"class":155},[145,16910,794],{"class":262},[145,16912,440],{"class":258},[145,16914,16915],{"class":159},"\"✅ Generated with: ",[145,16917,685],{"class":155},[145,16919,1747],{"class":262},[145,16921,691],{"class":155},[145,16923,449],{"class":159},[145,16925,406],{"class":262},[145,16927,16928,16930],{"class":147,"line":716},[145,16929,866],{"class":258},[145,16931,1706],{"class":262},[145,16933,16934,16936,16938,16940],{"class":147,"line":722},[145,16935,5534],{"class":258},[145,16937,7062],{"class":155},[145,16939,7065],{"class":258},[145,16941,5652],{"class":262},[145,16943,16944,16947,16949,16952],{"class":147,"line":728},[145,16945,16946],{"class":262},"            errors[model] ",[145,16948,266],{"class":258},[145,16950,16951],{"class":155}," str",[145,16953,16954],{"class":262},"(e)\n",[145,16956,16957,16959,16961,16963,16966,16968,16970,16972,16975,16977,16979,16981,16983],{"class":147,"line":739},[145,16958,5577],{"class":155},[145,16960,794],{"class":262},[145,16962,440],{"class":258},[145,16964,16965],{"class":159},"\"⚠️ ",[145,16967,685],{"class":155},[145,16969,1747],{"class":262},[145,16971,691],{"class":155},[145,16973,16974],{"class":159}," unavailable: ",[145,16976,685],{"class":155},[145,16978,5702],{"class":262},[145,16980,691],{"class":155},[145,16982,449],{"class":159},[145,16984,406],{"class":262},[145,16986,16987],{"class":147,"line":744},[145,16988,5634],{"class":258},[145,16990,16991],{"class":147,"line":750},[145,16992,376],{"emptyLinePlaceholder":58},[145,16994,16995,16997,16999,17001,17003,17006,17008,17011,17013,17015],{"class":147,"line":767},[145,16996,996],{"class":258},[145,16998,7062],{"class":155},[145,17000,794],{"class":262},[145,17002,440],{"class":258},[145,17004,17005],{"class":159},"\"All models failed: ",[145,17007,685],{"class":155},[145,17009,17010],{"class":262},"errors",[145,17012,691],{"class":155},[145,17014,449],{"class":159},[145,17016,406],{"class":262},[145,17018,17019],{"class":147,"line":788},[145,17020,376],{"emptyLinePlaceholder":58},[145,17022,17023],{"class":147,"line":834},[145,17024,17025],{"class":174},"# Your application code stays the same regardless of model availability\n",[145,17027,17028,17030,17032],{"class":147,"line":839},[145,17029,12238],{"class":262},[145,17031,266],{"class":258},[145,17033,17034],{"class":262}," generate_with_failover(\n",[145,17036,17037,17040,17042],{"class":147,"line":845},[145,17038,17039],{"class":701},"    prompt",[145,17041,266],{"class":258},[145,17043,17044],{"class":159},"\"Cinematic drone shot over a mountain lake at sunrise. \"\n",[145,17046,17047],{"class":147,"line":863},[145,17048,17049],{"class":159},"           \"Mist rises from the water surface. Golden light breaks \"\n",[145,17051,17052],{"class":147,"line":872},[145,17053,17054],{"class":159},"           \"through clouds and reflects off the still water. \"\n",[145,17056,17057,17060],{"class":147,"line":887},[145,17058,17059],{"class":159},"           \"Slow, majestic camera movement.\"",[145,17061,452],{"class":262},[145,17063,17064,17067,17069,17071],{"class":147,"line":903},[145,17065,17066],{"class":701},"    duration",[145,17068,266],{"class":258},[145,17070,537],{"class":155},[145,17072,452],{"class":262},[145,17074,17075,17078,17080,17082],{"class":147,"line":915},[145,17076,17077],{"class":701},"    quality",[145,17079,266],{"class":258},[145,17081,1368],{"class":159},[145,17083,452],{"class":262},[145,17085,17086,17089,17091,17093],{"class":147,"line":953},[145,17087,17088],{"class":701},"    aspect_ratio",[145,17090,266],{"class":258},[145,17092,1384],{"class":159},[145,17094,452],{"class":262},[145,17096,17097,17100,17102],{"class":147,"line":959},[145,17098,17099],{"class":701},"    generate_audio",[145,17101,266],{"class":258},[145,17103,3738],{"class":155},[145,17105,17106],{"class":147,"line":964},[145,17107,406],{"class":262},[11,17109,17110],{},[2619,17111,16276],{},[11,17113,17114],{},"While Seedance 2.0 remains delayed, your pipeline generates video through Kling, Veo, or Sora via the same EvoLink endpoint. The moment Seedance comes back online, it slots into the priority list — no migration, no code changes, no downtime.",[11,17116,17117],{},"This isn't just about the current delay. Model availability is inherently unpredictable — rate limits, maintenance windows, policy changes, and yes, legal actions can take any model offline at any time. Building model-agnostic from day one is a strategic decision that pays dividends every time the landscape shifts.",[11,17119,17120,17121,493],{},"For the complete API documentation including task management, webhooks, error handling, and SDK examples in Python, Node.js, and cURL, see the ",[37,17122,17123],{"href":14385},"EvoLink Video Generation Docs",[48,17125,9065],{"id":9064},[92,17127,17129],{"id":17128},"is-seedance-20-api-still-launching","Is Seedance 2.0 API still launching?",[11,17131,17132,17133,17137,17138,17142],{},"Yes, but the timeline is uncertain. ByteDance delayed the originally planned February 24, 2026 launch to implement copyright safeguards including face detection, copyrighted character blocking, and watermarking (",[37,17134,17136],{"href":13675,"rel":17135},[41],"Chosun, 2/22","; ",[37,17139,17141],{"href":13648,"rel":17140},[41],"Hacker News, 2/21","). No replacement launch date has been announced publicly. The delay will last until ByteDance's safeguard implementation satisfies both its own legal team and, presumably, addresses the core concerns raised in the MPA's cease-and-desist letter. Realistic estimates range from weeks to months.",[92,17144,9196],{"id":9195},[11,17146,17147,17148,17152],{},"It depends entirely on what you generate. Content created from original prompts describing original characters and scenes — without referencing copyrighted properties, real people, or trademarked brands — carries the lowest legal risk. Content that deliberately or negligently replicates existing IP carries significant risk, and this is true regardless of which AI model generates it. When the API launches, review Seedance 2.0's Terms of Service carefully for specific commercial use provisions, and consult intellectual property counsel for high-stakes or high-distribution commercial projects. See the ",[37,17149,17151],{"href":17150},"#enterprise-compliance-checklist","compliance checklist"," above for a practical framework.",[92,17154,17156],{"id":17155},"will-my-existing-seedance-videos-be-taken-down","Will my existing Seedance videos be taken down?",[11,17158,17159],{},"There's no indication that ByteDance plans to retroactively remove content already generated through the Seedance 2.0 web interface. The MPA's cease-and-desist letters target ByteDance's practices as a platform — not individual users or their outputs. However, if you've generated and published content featuring recognizable copyrighted characters or real people, you could face separate takedown requests (DMCA notices or equivalent) from the rights holders directly. That risk exists regardless of the generation tool used.",[92,17161,17163],{"id":17162},"how-does-evolink-handle-copyright-compliance","How does EvoLink handle copyright compliance?",[11,17165,17166,17167,17169],{},"EvoLink is a unified API gateway — it provides access to multiple video generation models through a single integration point. EvoLink does ",[23,17168,6075],{}," filter, moderate, or validate the copyright status of prompts or generated outputs. Copyright compliance is entirely the developer's responsibility. What EvoLink does provide is infrastructure flexibility: if one model's content policies, availability, or legal situation doesn't meet your needs, you can switch to another model through the same API without changing your code. This model diversity itself is a practical risk mitigation strategy — you're never dependent on a single model's availability or policy decisions.",[92,17171,17173],{"id":17172},"what-alternatives-exist-if-the-seedance-api-stays-delayed","What alternatives exist if the Seedance API stays delayed?",[11,17175,17176],{},"Through EvoLink's unified API, you can access several production-ready alternatives using the same integration code you'd use for Seedance:",[2036,17178,17179,17193],{},[2039,17180,17181],{},[2042,17182,17183,17186,17189,17191],{},[2045,17184,17185],{},"Model",[2045,17187,17188],{},"Strengths",[2045,17190,13825],{},[2045,17192,2985],{},[2052,17194,17195,17210,17226,17241],{},[2042,17196,17197,17201,17204,17207],{},[2057,17198,17199],{},[23,17200,13898],{},[2057,17202,17203],{},"Strong motion quality, character consistency",[2057,17205,17206],{},"Moderate filtering",[2057,17208,17209],{},"Action, character animation",[2042,17211,17212,17217,17220,17223],{},[2057,17213,17214],{},[23,17215,17216],{},"Veo 2",[2057,17218,17219],{},"High visual fidelity, Google's safety infrastructure",[2057,17221,17222],{},"Strict filtering",[2057,17224,17225],{},"Premium quality, brand-safe content",[2042,17227,17228,17233,17236,17238],{},[2057,17229,17230],{},[23,17231,17232],{},"Sora",[2057,17234,17235],{},"Strong prompt adherence, OpenAI safety stack",[2057,17237,17222],{},[2057,17239,17240],{},"Narrative content, precise direction",[2042,17242,17243,17247,17250,17252],{},[2057,17244,17245],{},[23,17246,13881],{},[2057,17248,17249],{},"Established ecosystem, good motion",[2057,17251,17206],{},[2057,17253,17254],{},"General purpose, rapid iteration",[11,17256,17257,17258,17261],{},"Each model has different strengths, content policies, pricing, and availability. EvoLink's multi-model architecture lets you evaluate all of them without building separate integrations. The failover code example above shows how to automatically switch between models based on availability. See the ",[37,17259,17260],{"href":14385},"Video Generation API docs"," for model-specific parameters and capability comparisons.",[45,17263],{},[48,17265,17267],{"id":17266},"what-comes-next","What Comes Next",[11,17269,17270],{},"The Seedance 2.0 copyright situation is actively evolving. The safeguards ByteDance implements will reshape what the API can and can't generate. The legal precedents being set in response to AI video generation will affect every platform in this space, not just Seedance.",[11,17272,17273],{},"For developers, the practical path forward is clear:",[70,17275,17276,17282,17288,17294,17300],{},[73,17277,17278,17281],{},[23,17279,17280],{},"Build model-agnostic."," Don't stake your production pipeline on a single model's availability or legal status. Use a unified API that lets you switch models without code changes.",[73,17283,17284,17287],{},[23,17285,17286],{},"Prompt safely."," Original descriptions, original characters, your own reference assets. The content that's safest legally is also the content that's most commercially valuable — because it's yours.",[73,17289,17290,17293],{},[23,17291,17292],{},"Stay informed."," The legal landscape around AI-generated content is changing monthly. Follow developments in the MPA v. ByteDance situation and the broader AI copyright cases working through courts.",[73,17295,17296,17299],{},[23,17297,17298],{},"Document everything."," Keep records of your prompts, parameters, creative intent, and review processes. Good-faith compliance efforts matter if questions arise.",[73,17301,17302,17305],{},[23,17303,17304],{},"Don't panic."," The sky isn't falling. AI video generation is a transformative capability, and the legal frameworks will evolve to accommodate it. Developers who build responsibly now will be well-positioned when the rules solidify.",[11,17307,17308],{},"We'll update this guide as the situation develops. Bookmark it, and check back when new developments emerge.",[14370,17310,17311,17316,17319],{"style":14372},[11,17312,17313],{},[23,17314,17315],{},"Build with confidence across multiple AI video models",[11,17317,17318],{},"EvoLink gives you one API for Seedance 2.0, Kling, Veo, Sora, and more. Start free — switch models anytime, no lock-in.",[11,17320,17321],{},[37,17322,16475],{"href":16474},[11,17324,17325],{},[2619,17326,17327],{},"Last updated: February 23, 2026. This article will be updated as the Seedance 2.0 copyright situation develops.",[11217,17329,17330],{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sns5M, html code.shiki .sns5M{--shiki-default:#DBEDFF}",{"title":141,"searchDepth":166,"depth":166,"links":17332},[17333,17338,17344,17349,17354,17362,17368,17375],{"id":13513,"depth":166,"text":13514,"children":17334},[17335,17336,17337],{"id":13523,"depth":178,"text":13524},{"id":13571,"depth":178,"text":13572},{"id":13681,"depth":178,"text":13682},{"id":13728,"depth":166,"text":13729,"children":17339},[17340,17341,17342,17343],{"id":13735,"depth":178,"text":13736},{"id":13753,"depth":178,"text":13754},{"id":13796,"depth":178,"text":13797},{"id":13932,"depth":178,"text":13933},{"id":13948,"depth":166,"text":13949,"children":17345},[17346,17347,17348],{"id":13955,"depth":178,"text":13956},{"id":14001,"depth":178,"text":14002},{"id":14034,"depth":178,"text":14035},{"id":14101,"depth":166,"text":14102,"children":17350},[17351,17352,17353],{"id":14114,"depth":178,"text":14115},{"id":14163,"depth":178,"text":14164},{"id":14267,"depth":178,"text":14268},{"id":14389,"depth":166,"text":14390,"children":17355},[17356,17357,17358,17359,17360,17361],{"id":14402,"depth":178,"text":14403},{"id":14514,"depth":178,"text":14515},{"id":14591,"depth":178,"text":14592},{"id":14644,"depth":178,"text":14645},{"id":15307,"depth":178,"text":15308},{"id":15451,"depth":178,"text":15452},{"id":16120,"depth":166,"text":16121,"children":17363},[17364,17365,17366,17367],{"id":16143,"depth":178,"text":16144},{"id":16279,"depth":178,"text":16280},{"id":16478,"depth":178,"text":16479},{"id":16688,"depth":178,"text":16689},{"id":9064,"depth":166,"text":9065,"children":17369},[17370,17371,17372,17373,17374],{"id":17128,"depth":178,"text":17129},{"id":9195,"depth":178,"text":9196},{"id":17155,"depth":178,"text":17156},{"id":17162,"depth":178,"text":17163},{"id":17172,"depth":178,"text":17173},{"id":17266,"depth":166,"text":17267},"MPA cease-and-desist, API delay, and what it means for your project. Complete guide to using Seedance 2.0 API safely for commercial video generation.",{"date":17378,"image":17379,"seoTitle":17380,"author":17381},"2026-02-23","/copyright-guide-hero.webp","Seedance 2.0 Copyright Guide for API Developers (2026)","EvoLink Team","/en/blog/seedance-2-copyright-api-guide",{"title":13502,"description":17376},"en/blog/seedance-2-copyright-api-guide","knDHFP5Y7l8pxsAxBNdSo8UM_NSZS8BXCukT5yynUnI",{"id":17387,"title":17388,"body":17389,"description":23097,"extension":11279,"meta":23098,"navigation":58,"path":23102,"seo":23103,"stem":23104,"__hash__":23105},"content/en/blog/seedance-2-ecommerce-product-videos.md","Build AI Product Videos for E-commerce with Seedance 2.0 API",{"type":8,"value":17390,"toc":23046},[17391,17400,17404,17419,17422,17516,17519,17522,17525,17529,17532,17535,17539,17551,17554,17566,17569,17572,18113,18121,18127,18138,18145,18151,18155,18158,18163,18166,18279,18282,18296,18302,18308,18314,18318,18375,18378,18382,18385,18391,18397,18403,18409,18416,18419,18423,18426,18431,18548,18551,18555,18561,18567,18573,18579,18585,18591,18594,18598,18601,18627,18630,18637,18641,18644,18653,18783,18786,18791,18799,18808,18812,18895,18898,18902,18911,18914,18928,18936,18946,18950,18953,19080,19084,19087,19119,19123,19129,19135,19141,19147,19153,19159,19165,19171,19177,19181,19184,19311,19314,19318,19321,19327,19333,19339,19342,19348,19352,19355,19358,19362,19365,19391,19394,19397,19401,19404,19537,19541,19544,19988,19991,19994,19998,20001,20004,20008,20011,20043,20049,20053,20056,20059,20096,20101,21913,21916,21920,21930,22018,22021,22025,22071,22075,22078,22088,22097,22103,22109,22113,22119,22868,22875,22879,22882,22885,22911,22914,22916,22920,22929,22933,22936,22940,22946,22950,22953,22957,22960,22964,22967,22971,22985,22989,22998,23002,23005,23008,23011,23014,23017,23024,23026,23043],[11,17392,17393,17394,17399],{},"Every product in your catalog deserves video. A single product photo can now become a polished video ad in under three minutes. No camera crew, no studio rental, no post-production timeline. ",[37,17395,17398],{"href":17396,"rel":17397},"https://seed.bytedance.com/en/seedance2_0",[41],"Seedance 2.0"," — ByteDance's latest video generation model — turns static product images into broadcast-ready clips through a simple API call. This guide walks you through five distinct video types for e-commerce, a batch pipeline for entire catalogs, and multi-platform export strategies. Every code example is production-ready Python.",[48,17401,17403],{"id":17402},"why-product-video-matters-and-why-studios-are-obsolete","Why Product Video Matters (and Why Studios Are Obsolete)",[11,17405,17406,17407,17412,17413,17418],{},"Product listings with video consistently outperform those without. According to ",[37,17408,17411],{"href":17409,"rel":17410},"https://www.shopify.com/blog/product-photography-tips",[41],"Shopify's product media best practices",", merchants who add video to product pages see measurably higher engagement and conversion rates. Amazon's own ",[37,17414,17417],{"href":17415,"rel":17416},"https://sellercentral.amazon.com/help/hub/reference/G202124160",[41],"seller guidelines"," now actively encourage video on every listing, and their A+ Content program prioritizes video-enhanced pages in search results.",[11,17420,17421],{},"The gap between \"knowing video works\" and \"actually producing video\" has historically been enormous. A single product video shoot — including studio time, lighting, equipment, a videographer, and basic editing — typically runs $500–$2,000 per SKU. For a catalog of 200 products, that's six figures before you've uploaded a single file.",[2036,17423,17424,17436],{},[2039,17425,17426],{},[2042,17427,17428,17430,17433],{},[2045,17429],{},[2045,17431,17432],{},"Traditional Studio",[2045,17434,17435],{},"Seedance 2.0 API",[2052,17437,17438,17451,17464,17477,17490,17503],{},[2042,17439,17440,17445,17448],{},[2057,17441,17442],{},[23,17443,17444],{},"Cost per video",[2057,17446,17447],{},"$500–$2,000",[2057,17449,17450],{},"$0.02–$0.15",[2042,17452,17453,17458,17461],{},[2057,17454,17455],{},[23,17456,17457],{},"Turnaround",[2057,17459,17460],{},"3–10 business days",[2057,17462,17463],{},"60–180 seconds",[2042,17465,17466,17471,17474],{},[2057,17467,17468],{},[23,17469,17470],{},"Setup required",[2057,17472,17473],{},"Studio, crew, equipment",[2057,17475,17476],{},"One product photo",[2042,17478,17479,17484,17487],{},[2057,17480,17481],{},[23,17482,17483],{},"Scaling to 500 SKUs",[2057,17485,17486],{},"$250K–$1M+",[2057,17488,17489],{},"Under $75",[2042,17491,17492,17497,17500],{},[2057,17493,17494],{},[23,17495,17496],{},"Iteration speed",[2057,17498,17499],{},"Re-shoot required",[2057,17501,17502],{},"Change prompt, regenerate",[2042,17504,17505,17510,17513],{},[2057,17506,17507],{},[23,17508,17509],{},"Aspect ratio variants",[2057,17511,17512],{},"Separate edits per format",[2057,17514,17515],{},"One parameter change",[11,17517,17518],{},"The economics are not comparable. AI product video generation doesn't replace a $50,000 brand film — it replaces the repetitive, per-SKU video work that most e-commerce teams either skip entirely or outsource at painful margins.",[11,17520,17521],{},"Consider the math for a mid-size Shopify store with 300 SKUs. Traditional studio video for the full catalog: $150K–$600K, plus months of scheduling and production. Seedance 2.0 API for the same catalog: under $50 total, completed in a single afternoon. Even if you factor in developer time to set up the pipeline, the return on investment is orders of magnitude higher.",[11,17523,17524],{},"The shift mirrors what happened with product photography a decade ago. Studios didn't disappear, but the routine work moved to automated solutions. Video is following the same trajectory, just faster.",[92,17526,17528],{"id":17527},"the-conversion-case-for-video","The Conversion Case for Video",[11,17530,17531],{},"Industry reports consistently show that product pages with video outperform those without. Shopify's own research highlights that video increases time on page and reduces return rates by helping customers understand what they're buying. Amazon reports that listings with video see higher click-through rates in search results.",[11,17533,17534],{},"The specific numbers vary by category and market, but the direction is unambiguous: video sells more product. The question has never been whether video works. The question has been whether the ROI justifies the production cost. At API pricing, that calculation is settled.",[48,17536,17538],{"id":17537},"setup-api-key-and-base-code","Setup: API Key and Base Code",[11,17540,17541,17542,17545,17546,17550],{},"You need an ",[37,17543,213],{"href":211,"rel":17544},[41]," account and an API key. EvoLink provides access to Seedance 2.0 with a straightforward REST API. If you haven't set up an account yet, follow the ",[37,17547,17549],{"href":17548},"/docs/getting-started","getting started guide"," for a walkthrough.",[11,17552,17553],{},"Install the only dependency:",[136,17555,17556],{"className":138,"code":317,"language":140,"meta":141,"style":141},[28,17557,17558],{"__ignoreMap":141},[145,17559,17560,17562,17564],{"class":147,"line":148},[145,17561,190],{"class":151},[145,17563,193],{"class":159},[145,17565,328],{"class":159},[11,17567,17568],{},"No GPU required. No model downloads. No infrastructure to manage. The API handles all computation server-side. Your local machine just sends HTTP requests and receives video URLs.",[11,17570,17571],{},"Here is the complete base code. Every example in this guide builds on this foundation:",[136,17573,17575],{"className":338,"code":17574,"language":340,"meta":141,"style":141},"import requests\nimport time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\n\nheaders = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\n\ndef generate_video(payload: dict) -> dict:\n    \"\"\"Submit a video generation request and return the task response.\"\"\"\n    response = requests.post(\n        f\"{BASE_URL}/videos/generations\",\n        headers=headers,\n        json=payload\n    )\n    response.raise_for_status()\n    return response.json()\n\n\ndef wait_for_video(task_id: str, poll_interval: int = 5, timeout: int = 300) -> dict:\n    \"\"\"Poll a task until it completes or fails. Returns the final task object.\"\"\"\n    elapsed = 0\n    while elapsed \u003C timeout:\n        resp = requests.get(f\"{BASE_URL}/tasks/{task_id}\", headers=headers)\n        resp.raise_for_status()\n        task = resp.json()\n        status = task.get(\"status\")\n\n        if status == \"completed\":\n            print(f\"✅ Video ready: {task['output']['video_url']}\")\n            return task\n        elif status == \"failed\":\n            raise RuntimeError(f\"Task failed: {task.get('error', 'Unknown error')}\")\n\n        print(f\"⏳ Status: {status} ({elapsed}s elapsed)\")\n        time.sleep(poll_interval)\n        elapsed += poll_interval\n\n    raise TimeoutError(f\"Task {task_id} did not complete within {timeout}s\")\n\n\ndef create_and_wait(payload: dict) -> dict:\n    \"\"\"Generate a video and wait for the result. Returns the completed task.\"\"\"\n    task = generate_video(payload)\n    task_id = task[\"task_id\"]\n    print(f\"🎬 Task created: {task_id}\")\n    return wait_for_video(task_id)\n",[28,17576,17577,17583,17589,17593,17602,17610,17614,17623,17639,17647,17651,17655,17659,17676,17681,17689,17701,17710,17718,17722,17726,17732,17736,17740,17778,17783,17791,17801,17836,17840,17848,17860,17864,17876,17906,17912,17924,17955,17959,17988,17992,18000,18004,18035,18039,18043,18060,18065,18073,18085,18106],{"__ignoreMap":141},[145,17578,17579,17581],{"class":147,"line":148},[145,17580,347],{"class":258},[145,17582,328],{"class":262},[145,17584,17585,17587],{"class":147,"line":166},[145,17586,347],{"class":258},[145,17588,356],{"class":262},[145,17590,17591],{"class":147,"line":178},[145,17592,376],{"emptyLinePlaceholder":58},[145,17594,17595,17597,17599],{"class":147,"line":187},[145,17596,388],{"class":155},[145,17598,391],{"class":258},[145,17600,17601],{"class":159}," \"YOUR_API_KEY\"\n",[145,17603,17604,17606,17608],{"class":147,"line":373},[145,17605,412],{"class":155},[145,17607,391],{"class":258},[145,17609,417],{"class":159},[145,17611,17612],{"class":147,"line":379},[145,17613,376],{"emptyLinePlaceholder":58},[145,17615,17616,17619,17621],{"class":147,"line":385},[145,17617,17618],{"class":262},"headers ",[145,17620,266],{"class":258},[145,17622,428],{"class":262},[145,17624,17625,17627,17629,17631,17633,17635,17637],{"class":147,"line":409},[145,17626,434],{"class":159},[145,17628,437],{"class":262},[145,17630,440],{"class":258},[145,17632,443],{"class":159},[145,17634,446],{"class":155},[145,17636,449],{"class":159},[145,17638,452],{"class":262},[145,17640,17641,17643,17645],{"class":147,"line":420},[145,17642,458],{"class":159},[145,17644,437],{"class":262},[145,17646,463],{"class":159},[145,17648,17649],{"class":147,"line":431},[145,17650,469],{"class":262},[145,17652,17653],{"class":147,"line":455},[145,17654,376],{"emptyLinePlaceholder":58},[145,17656,17657],{"class":147,"line":466},[145,17658,376],{"emptyLinePlaceholder":58},[145,17660,17661,17663,17665,17668,17670,17672,17674],{"class":147,"line":600},[145,17662,526],{"class":258},[145,17664,14736],{"class":151},[145,17666,17667],{"class":262},"(payload: ",[145,17669,8798],{"class":155},[145,17671,15842],{"class":262},[145,17673,8798],{"class":155},[145,17675,860],{"class":262},[145,17677,17678],{"class":147,"line":605},[145,17679,17680],{"class":159},"    \"\"\"Submit a video generation request and return the task response.\"\"\"\n",[145,17682,17683,17685,17687],{"class":147,"line":611},[145,17684,1427],{"class":262},[145,17686,266],{"class":258},[145,17688,1432],{"class":262},[145,17690,17691,17693,17695,17697,17699],{"class":147,"line":617},[145,17692,1437],{"class":258},[145,17694,449],{"class":159},[145,17696,679],{"class":155},[145,17698,1444],{"class":159},[145,17700,452],{"class":262},[145,17702,17703,17705,17707],{"class":147,"line":623},[145,17704,1455],{"class":701},[145,17706,266],{"class":258},[145,17708,17709],{"class":262},"headers,\n",[145,17711,17712,17714,17716],{"class":147,"line":628},[145,17713,1470],{"class":701},[145,17715,266],{"class":258},[145,17717,2788],{"class":262},[145,17719,17720],{"class":147,"line":639},[145,17721,1483],{"class":262},[145,17723,17724],{"class":147,"line":654},[145,17725,2797],{"class":262},[145,17727,17728,17730],{"class":147,"line":660},[145,17729,1703],{"class":258},[145,17731,736],{"class":262},[145,17733,17734],{"class":147,"line":671},[145,17735,376],{"emptyLinePlaceholder":58},[145,17737,17738],{"class":147,"line":698},[145,17739,376],{"emptyLinePlaceholder":58},[145,17741,17742,17744,17746,17749,17751,17754,17757,17759,17762,17765,17767,17769,17772,17774,17776],{"class":147,"line":710},[145,17743,526],{"class":258},[145,17745,529],{"class":151},[145,17747,17748],{"class":262},"(task_id: ",[145,17750,8673],{"class":155},[145,17752,17753],{"class":262},", poll_interval: ",[145,17755,17756],{"class":155},"int",[145,17758,391],{"class":258},[145,17760,17761],{"class":155}," 5",[145,17763,17764],{"class":262},", timeout: ",[145,17766,17756],{"class":155},[145,17768,391],{"class":258},[145,17770,17771],{"class":155}," 300",[145,17773,15842],{"class":262},[145,17775,8798],{"class":155},[145,17777,860],{"class":262},[145,17779,17780],{"class":147,"line":716},[145,17781,17782],{"class":159},"    \"\"\"Poll a task until it completes or fails. Returns the final task object.\"\"\"\n",[145,17784,17785,17787,17789],{"class":147,"line":722},[145,17786,631],{"class":262},[145,17788,266],{"class":258},[145,17790,636],{"class":155},[145,17792,17793,17795,17797,17799],{"class":147,"line":728},[145,17794,642],{"class":258},[145,17796,645],{"class":262},[145,17798,648],{"class":258},[145,17800,651],{"class":262},[145,17802,17803,17805,17807,17810,17812,17814,17816,17818,17820,17822,17824,17826,17828,17831,17833],{"class":147,"line":739},[145,17804,6929],{"class":262},[145,17806,266],{"class":258},[145,17808,17809],{"class":262}," requests.get(",[145,17811,440],{"class":258},[145,17813,449],{"class":159},[145,17815,679],{"class":155},[145,17817,682],{"class":159},[145,17819,685],{"class":155},[145,17821,688],{"class":262},[145,17823,691],{"class":155},[145,17825,449],{"class":159},[145,17827,400],{"class":262},[145,17829,17830],{"class":701},"headers",[145,17832,266],{"class":258},[145,17834,17835],{"class":262},"headers)\n",[145,17837,17838],{"class":147,"line":744},[145,17839,6956],{"class":262},[145,17841,17842,17844,17846],{"class":147,"line":750},[145,17843,731],{"class":262},[145,17845,266],{"class":258},[145,17847,11768],{"class":262},[145,17849,17850,17852,17854,17856,17858],{"class":147,"line":767},[145,17851,753],{"class":262},[145,17853,266],{"class":258},[145,17855,775],{"class":262},[145,17857,761],{"class":159},[145,17859,406],{"class":262},[145,17861,17862],{"class":147,"line":788},[145,17863,376],{"emptyLinePlaceholder":58},[145,17865,17866,17868,17870,17872,17874],{"class":147,"line":834},[145,17867,848],{"class":258},[145,17869,851],{"class":262},[145,17871,854],{"class":258},[145,17873,857],{"class":159},[145,17875,860],{"class":262},[145,17877,17878,17880,17882,17884,17886,17888,17890,17893,17895,17898,17900,17902,17904],{"class":147,"line":839},[145,17879,5577],{"class":155},[145,17881,794],{"class":262},[145,17883,440],{"class":258},[145,17885,14966],{"class":159},[145,17887,685],{"class":155},[145,17889,1529],{"class":262},[145,17891,17892],{"class":159},"'output'",[145,17894,1562],{"class":262},[145,17896,17897],{"class":159},"'video_url'",[145,17899,1535],{"class":262},[145,17901,691],{"class":155},[145,17903,449],{"class":159},[145,17905,406],{"class":262},[145,17907,17908,17910],{"class":147,"line":845},[145,17909,866],{"class":258},[145,17911,869],{"class":262},[145,17913,17914,17916,17918,17920,17922],{"class":147,"line":863},[145,17915,875],{"class":258},[145,17917,851],{"class":262},[145,17919,854],{"class":258},[145,17921,882],{"class":159},[145,17923,860],{"class":262},[145,17925,17926,17928,17930,17932,17934,17936,17938,17941,17943,17945,17947,17949,17951,17953],{"class":147,"line":872},[145,17927,906],{"class":258},[145,17929,909],{"class":155},[145,17931,794],{"class":262},[145,17933,440],{"class":258},[145,17935,15011],{"class":159},[145,17937,685],{"class":155},[145,17939,17940],{"class":262},"task.get(",[145,17942,11865],{"class":159},[145,17944,400],{"class":262},[145,17946,943],{"class":159},[145,17948,108],{"class":262},[145,17950,691],{"class":155},[145,17952,449],{"class":159},[145,17954,406],{"class":262},[145,17956,17957],{"class":147,"line":887},[145,17958,376],{"emptyLinePlaceholder":58},[145,17960,17961,17963,17965,17967,17970,17972,17974,17976,17978,17980,17982,17984,17986],{"class":147,"line":903},[145,17962,791],{"class":155},[145,17964,794],{"class":262},[145,17966,440],{"class":258},[145,17968,17969],{"class":159},"\"⏳ Status: ",[145,17971,685],{"class":155},[145,17973,814],{"class":262},[145,17975,691],{"class":155},[145,17977,1218],{"class":159},[145,17979,685],{"class":155},[145,17981,804],{"class":262},[145,17983,691],{"class":155},[145,17985,11911],{"class":159},[145,17987,406],{"class":262},[145,17989,17990],{"class":147,"line":915},[145,17991,973],{"class":262},[145,17993,17994,17996,17998],{"class":147,"line":953},[145,17995,979],{"class":262},[145,17997,982],{"class":258},[145,17999,985],{"class":262},[145,18001,18002],{"class":147,"line":959},[145,18003,376],{"emptyLinePlaceholder":58},[145,18005,18006,18008,18010,18012,18014,18016,18018,18020,18022,18025,18027,18029,18031,18033],{"class":147,"line":964},[145,18007,996],{"class":258},[145,18009,999],{"class":155},[145,18011,794],{"class":262},[145,18013,440],{"class":258},[145,18015,921],{"class":159},[145,18017,685],{"class":155},[145,18019,688],{"class":262},[145,18021,691],{"class":155},[145,18023,18024],{"class":159}," did not complete within ",[145,18026,685],{"class":155},[145,18028,1019],{"class":262},[145,18030,691],{"class":155},[145,18032,1024],{"class":159},[145,18034,406],{"class":262},[145,18036,18037],{"class":147,"line":970},[145,18038,376],{"emptyLinePlaceholder":58},[145,18040,18041],{"class":147,"line":976},[145,18042,376],{"emptyLinePlaceholder":58},[145,18044,18045,18047,18050,18052,18054,18056,18058],{"class":147,"line":988},[145,18046,526],{"class":258},[145,18048,18049],{"class":151}," create_and_wait",[145,18051,17667],{"class":262},[145,18053,8798],{"class":155},[145,18055,15842],{"class":262},[145,18057,8798],{"class":155},[145,18059,860],{"class":262},[145,18061,18062],{"class":147,"line":993},[145,18063,18064],{"class":159},"    \"\"\"Generate a video and wait for the result. Returns the completed task.\"\"\"\n",[145,18066,18067,18069,18071],{"class":147,"line":5531},[145,18068,1496],{"class":262},[145,18070,266],{"class":258},[145,18072,16904],{"class":262},[145,18074,18075,18077,18079,18081,18083],{"class":147,"line":5540},[145,18076,7218],{"class":262},[145,18078,266],{"class":258},[145,18080,758],{"class":262},[145,18082,7693],{"class":159},[145,18084,764],{"class":262},[145,18086,18087,18089,18091,18093,18096,18098,18100,18102,18104],{"class":147,"line":5546},[145,18088,1102],{"class":155},[145,18090,794],{"class":262},[145,18092,440],{"class":258},[145,18094,18095],{"class":159},"\"🎬 Task created: ",[145,18097,685],{"class":155},[145,18099,688],{"class":262},[145,18101,691],{"class":155},[145,18103,449],{"class":159},[145,18105,406],{"class":262},[145,18107,18108,18110],{"class":147,"line":5574},[145,18109,1703],{"class":258},[145,18111,18112],{"class":262}," wait_for_video(task_id)\n",[18,18114,18115],{},[11,18116,18117,18120],{},[23,18118,18119],{},"All following code examples use this same setup."," We'll show only the unique payload for each video type.",[11,18122,2176,18123,18126],{},[28,18124,18125],{},"create_and_wait"," function handles the full lifecycle: submit the job, poll until completion, and return the video URL. Video URLs expire after 24 hours, so download them promptly or pipe them directly into your asset management system.",[11,18128,18129,18130,18132,18133,18137],{},"The polling approach works well for interactive scripts and small batches. For production pipelines processing hundreds of products, the ",[28,18131,3601],{}," parameter (covered in the ",[37,18134,18136],{"href":18135},"#batch-pipeline-csv-catalog-to-video-library","batch pipeline section",") eliminates polling overhead entirely.",[11,18139,18140,18141,18144],{},"Every code example below calls ",[28,18142,18143],{},"create_and_wait(payload)"," with a different payload dictionary. The setup code above is the only boilerplate you need.",[11,18146,18147],{},[37,18148,18150],{"href":211,"rel":18149},[41],"Get your free EvoLink API key →",[48,18152,18154],{"id":18153},"video-type-1-360-product-rotation","Video Type 1: 360° Product Rotation",[11,18156,18157],{},"The turntable rotation is the workhorse of e-commerce video. One white-background product photo becomes a smooth, rotating showcase — the kind of clip that used to require a motorized turntable and careful lighting. This format works everywhere: Amazon listings, Shopify product pages, and social ads.",[56,18159,60,18160],{"controls":58,"playsInline":58,"style":59},[62,18161],{"src":18162,"type":65},"https://cdn.evolink.ai/seedance2api/%E6%89%8B%E8%A1%A8%E5%B9%BF%E5%91%8A.mp4",[11,18164,18165],{},"Here's the payload for a luxury watch rotation:",[136,18167,18169],{"className":338,"code":18168,"language":340,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\n        \"https://your-cdn.com/products/watch-front.jpg\"\n    ],\n    \"prompt\": (\n        \"@Image1 is a luxury wristwatch. The watch rotates slowly under \"\n        \"dramatic studio lighting on a dark reflective surface. Light catches \"\n        \"the polished metal case and sapphire crystal. Slow cinematic rotation. \"\n        \"Premium advertisement quality.\"\n    ),\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\"\n}\n\nresult = create_and_wait(payload)\n",[28,18170,18171,18179,18189,18195,18200,18204,18210,18215,18220,18225,18230,18234,18244,18254,18262,18266,18270],{"__ignoreMap":141},[145,18172,18173,18175,18177],{"class":147,"line":148},[145,18174,3661],{"class":262},[145,18176,266],{"class":258},[145,18178,428],{"class":262},[145,18180,18181,18183,18185,18187],{"class":147,"line":166},[145,18182,3670],{"class":159},[145,18184,437],{"class":262},[145,18186,1308],{"class":159},[145,18188,452],{"class":262},[145,18190,18191,18193],{"class":147,"line":178},[145,18192,15386],{"class":159},[145,18194,2691],{"class":262},[145,18196,18197],{"class":147,"line":187},[145,18198,18199],{"class":159},"        \"https://your-cdn.com/products/watch-front.jpg\"\n",[145,18201,18202],{"class":147,"line":373},[145,18203,16367],{"class":262},[145,18205,18206,18208],{"class":147,"line":379},[145,18207,3681],{"class":159},[145,18209,1322],{"class":262},[145,18211,18212],{"class":147,"line":385},[145,18213,18214],{"class":159},"        \"@Image1 is a luxury wristwatch. The watch rotates slowly under \"\n",[145,18216,18217],{"class":147,"line":409},[145,18218,18219],{"class":159},"        \"dramatic studio lighting on a dark reflective surface. Light catches \"\n",[145,18221,18222],{"class":147,"line":420},[145,18223,18224],{"class":159},"        \"the polished metal case and sapphire crystal. Slow cinematic rotation. \"\n",[145,18226,18227],{"class":147,"line":431},[145,18228,18229],{"class":159},"        \"Premium advertisement quality.\"\n",[145,18231,18232],{"class":147,"line":455},[145,18233,3804],{"class":262},[145,18235,18236,18238,18240,18242],{"class":147,"line":466},[145,18237,3693],{"class":159},[145,18239,437],{"class":262},[145,18241,3698],{"class":155},[145,18243,452],{"class":262},[145,18245,18246,18248,18250,18252],{"class":147,"line":600},[145,18247,3705],{"class":159},[145,18249,437],{"class":262},[145,18251,3710],{"class":159},[145,18253,452],{"class":262},[145,18255,18256,18258,18260],{"class":147,"line":605},[145,18257,3717],{"class":159},[145,18259,437],{"class":262},[145,18261,2730],{"class":159},[145,18263,18264],{"class":147,"line":611},[145,18265,469],{"class":262},[145,18267,18268],{"class":147,"line":617},[145,18269,376],{"emptyLinePlaceholder":58},[145,18271,18272,18274,18276],{"class":147,"line":623},[145,18273,12238],{"class":262},[145,18275,266],{"class":258},[145,18277,18278],{"class":262}," create_and_wait(payload)\n",[11,18280,18281],{},"The prompt structure matters. Break it into layers for consistent results with any product:",[11,18283,18284,18287,18288,18291,18292,18295],{},[23,18285,18286],{},"Layer 1 — Subject identification."," Start with ",[28,18289,18290],{},"@Image1 is a [product]."," This anchors the model to your source image. See the ",[37,18293,18294],{"href":2966},"@tags guide"," for details on how Seedance 2.0 interprets image references.",[11,18297,18298,18301],{},[23,18299,18300],{},"Layer 2 — Motion description."," \"Rotates slowly\" is better than \"spins\" — it implies consistent speed. Add \"smooth turntable rotation\" or \"360-degree rotation\" to reinforce the motion pattern.",[11,18303,18304,18307],{},[23,18305,18306],{},"Layer 3 — Lighting and environment."," Studio lighting terms the model responds well to: \"dramatic studio lighting,\" \"soft diffused light,\" \"rim lighting,\" \"three-point lighting setup.\" The background choice — dark reflective surface, white cyclorama, gradient backdrop — sets the tone entirely.",[11,18309,18310,18313],{},[23,18311,18312],{},"Layer 4 — Quality modifier."," End with a quality cue: \"premium advertisement quality,\" \"commercial-grade,\" or \"4K product showcase.\" These terms push the model toward cleaner, more polished output.",[92,18315,18317],{"id":18316},"rotation-tips","Rotation Tips",[2036,18319,18320,18331],{},[2039,18321,18322],{},[2042,18323,18324,18326,18329],{},[2045,18325,3400],{},[2045,18327,18328],{},"Recommended",[2045,18330,8272],{},[2052,18332,18333,18344,18355,18364],{},[2042,18334,18335,18338,18341],{},[2057,18336,18337],{},"Duration",[2057,18339,18340],{},"6–10s",[2057,18342,18343],{},"Full rotation needs at least 6s to avoid looking rushed",[2042,18345,18346,18349,18352],{},[2057,18347,18348],{},"Aspect ratio",[2057,18350,18351],{},"16:9 or 1:1",[2057,18353,18354],{},"16:9 for web/Amazon, 1:1 for social feeds",[2042,18356,18357,18359,18361],{},[2057,18358,4063],{},[2057,18360,1794],{},[2057,18362,18363],{},"Always 1080p for product content",[2042,18365,18366,18369,18372],{},[2057,18367,18368],{},"Background in prompt",[2057,18370,18371],{},"Dark reflective or white",[2057,18373,18374],{},"Match your brand's product page aesthetic",[11,18376,18377],{},"For products with intricate details — jewelry, watches, electronics — increase duration to 10 seconds. The extra frames let the model render surface details during the rotation without motion blur artifacts.",[92,18379,18381],{"id":18380},"background-strategies-for-rotation-videos","Background Strategies for Rotation Videos",[11,18383,18384],{},"Your source image background significantly affects the output. Here's how to handle common scenarios:",[11,18386,18387,18390],{},[23,18388,18389],{},"White background (ideal)."," Standard e-commerce product photos on white work perfectly. The model preserves the product and generates clean rotation motion. You can keep the white background or describe a different one in the prompt.",[11,18392,18393,18396],{},[23,18394,18395],{},"Transparent background (PNG)."," Also excellent. The model fills the background based on your prompt description, giving you full control over the final look.",[11,18398,18399,18402],{},[23,18400,18401],{},"Cluttered or lifestyle background."," Workable but less predictable. The model may incorporate unwanted background elements into the rotation. For best results, describe the desired background explicitly: \"on a clean white surface\" or \"on a dark gradient background.\"",[11,18404,18405,18408],{},[23,18406,18407],{},"Studio shot with controlled background."," Great starting point. If your existing photo already has professional lighting, the model extends that lighting quality into the video.",[11,18410,18411,18412,18415],{},"If your source photo has a cluttered background, describe the desired background explicitly in the prompt. Seedance 2.0 can recontextualize the product onto a clean surface. For best results, start with a white-background or transparent-background product photo. Read more about ",[37,18413,18414],{"href":3381},"image-to-video fundamentals"," for source image best practices.",[11,18417,18418],{},"Try this with your own product photo — results in under 3 minutes.",[48,18420,18422],{"id":18421},"video-type-2-hero-shot-product-launch-trailer","Video Type 2: Hero Shot (Product Launch Trailer)",[11,18424,18425],{},"Launch trailers create anticipation. They're the cinematic reveal moment — smoke, light beams, dramatic angles — compressed into a few seconds. This format dominates social ads and landing page hero sections where first impressions drive click-through rates.",[56,18427,60,18428],{"controls":58,"playsInline":58,"style":59},[62,18429],{"src":18430,"type":65},"https://cdn.evolink.ai/seedance2api/%E8%80%B3%E6%9C%BA%E5%B9%BF%E5%91%8A%E5%9B%9B%E4%B8%AA%E9%A2%9C%E8%89%B2.mp4",[136,18432,18434],{"className":338,"code":18433,"language":340,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\n        \"https://your-cdn.com/products/headphones-lineup.jpg\"\n    ],\n    \"prompt\": (\n        \"@Image1 shows premium over-ear headphones in four colors. \"\n        \"Rapid four-frame flash cuts, each color freeze-framed. \"\n        \"Extreme close-up of hinge mechanism unfolding in slow motion. \"\n        \"Quick-cut lifestyle montage. Final lineup on white pedestal. \"\n        \"Brand text fades in. Commercial-grade lighting.\"\n    ),\n    \"duration\": 10,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\"\n}\n\nresult = create_and_wait(payload)\n",[28,18435,18436,18444,18454,18460,18465,18469,18475,18480,18485,18490,18495,18500,18504,18514,18524,18532,18536,18540],{"__ignoreMap":141},[145,18437,18438,18440,18442],{"class":147,"line":148},[145,18439,3661],{"class":262},[145,18441,266],{"class":258},[145,18443,428],{"class":262},[145,18445,18446,18448,18450,18452],{"class":147,"line":166},[145,18447,3670],{"class":159},[145,18449,437],{"class":262},[145,18451,1308],{"class":159},[145,18453,452],{"class":262},[145,18455,18456,18458],{"class":147,"line":178},[145,18457,15386],{"class":159},[145,18459,2691],{"class":262},[145,18461,18462],{"class":147,"line":187},[145,18463,18464],{"class":159},"        \"https://your-cdn.com/products/headphones-lineup.jpg\"\n",[145,18466,18467],{"class":147,"line":373},[145,18468,16367],{"class":262},[145,18470,18471,18473],{"class":147,"line":379},[145,18472,3681],{"class":159},[145,18474,1322],{"class":262},[145,18476,18477],{"class":147,"line":385},[145,18478,18479],{"class":159},"        \"@Image1 shows premium over-ear headphones in four colors. \"\n",[145,18481,18482],{"class":147,"line":409},[145,18483,18484],{"class":159},"        \"Rapid four-frame flash cuts, each color freeze-framed. \"\n",[145,18486,18487],{"class":147,"line":420},[145,18488,18489],{"class":159},"        \"Extreme close-up of hinge mechanism unfolding in slow motion. \"\n",[145,18491,18492],{"class":147,"line":431},[145,18493,18494],{"class":159},"        \"Quick-cut lifestyle montage. Final lineup on white pedestal. \"\n",[145,18496,18497],{"class":147,"line":455},[145,18498,18499],{"class":159},"        \"Brand text fades in. Commercial-grade lighting.\"\n",[145,18501,18502],{"class":147,"line":466},[145,18503,3804],{"class":262},[145,18505,18506,18508,18510,18512],{"class":147,"line":600},[145,18507,3693],{"class":159},[145,18509,437],{"class":262},[145,18511,537],{"class":155},[145,18513,452],{"class":262},[145,18515,18516,18518,18520,18522],{"class":147,"line":605},[145,18517,3705],{"class":159},[145,18519,437],{"class":262},[145,18521,3710],{"class":159},[145,18523,452],{"class":262},[145,18525,18526,18528,18530],{"class":147,"line":611},[145,18527,3717],{"class":159},[145,18529,437],{"class":262},[145,18531,2730],{"class":159},[145,18533,18534],{"class":147,"line":617},[145,18535,469],{"class":262},[145,18537,18538],{"class":147,"line":623},[145,18539,376],{"emptyLinePlaceholder":58},[145,18541,18542,18544,18546],{"class":147,"line":628},[145,18543,12238],{"class":262},[145,18545,266],{"class":258},[145,18547,18278],{"class":262},[11,18549,18550],{},"The hero shot prompt uses a different vocabulary than the rotation. Here you're directing a sequence, not a single continuous motion. Think of each sentence as a scene in a storyboard.",[92,18552,18554],{"id":18553},"hero-shot-prompt-patterns","Hero Shot Prompt Patterns",[11,18556,18557,18560],{},[23,18558,18559],{},"The Emergence:"," Product rises from smoke, fog, or particles. Works for tech products, fragrances, premium goods.",[136,18562,18565],{"className":18563,"code":18564,"language":2185},[2183],"@Image1 is [product]. It emerges from dense volumetric fog, \nbacklit by a single golden spotlight. Particles drift upward. \nSlow reveal. Cinematic depth of field. Premium commercial aesthetic.\n",[28,18566,18564],{"__ignoreMap":141},[11,18568,18569,18572],{},[23,18570,18571],{},"The Impact Landing:"," Product drops into frame with energy — splash, shatter, burst.",[136,18574,18577],{"className":18575,"code":18576,"language":2185},[2183],"@Image1 is [product]. It lands on a glossy black surface with a \nsubtle shockwave ripple. Dust particles scatter on impact. \nCamera pushes in slowly. Dramatic rim lighting. High-end advertisement.\n",[28,18578,18576],{"__ignoreMap":141},[11,18580,18581,18584],{},[23,18582,18583],{},"The Assembly:"," Components fly together to form the complete product. Great for tech and modular goods.",[136,18586,18589],{"className":18587,"code":18588,"language":2185},[2183],"@Image1 is [product]. Individual components float in space, then \nsmoothly assemble into the final product. Each piece locks into \nplace with a satisfying precision. Clean white environment. \nStudio lighting. Commercial quality.\n",[28,18590,18588],{"__ignoreMap":141},[11,18592,18593],{},"The hero shot format benefits from higher duration — 8 to 12 seconds gives the model room to build tension and resolve the reveal. Shorter clips feel abrupt; longer clips risk losing the viewer's attention.",[92,18595,18597],{"id":18596},"when-to-use-hero-shots","When to Use Hero Shots",[11,18599,18600],{},"Hero shots work best for:",[97,18602,18603,18609,18615,18621],{},[73,18604,18605,18608],{},[23,18606,18607],{},"Product launches."," New product announcements on social media and landing pages. The dramatic reveal builds anticipation and signals premium positioning.",[73,18610,18611,18614],{},[23,18612,18613],{},"Seasonal campaigns."," Holiday sales, Black Friday, new collection drops. The cinematic quality elevates the campaign above standard promotional content.",[73,18616,18617,18620],{},[23,18618,18619],{},"Ad creative."," Facebook, Instagram, and TikTok ads benefit from the stopping power of a dramatic product reveal. These clips grab attention in a scroll-heavy feed.",[73,18622,18623,18626],{},[23,18624,18625],{},"Website hero sections."," An autoplaying hero shot above the fold communicates brand quality instantly. Keep duration under 6 seconds for hero banners to avoid performance issues.",[11,18628,18629],{},"Hero shots are less appropriate for product detail pages where customers want informational content. Save the drama for top-of-funnel marketing; use rotation and macro videos for the product page itself.",[11,18631,18632,18633,18636],{},"For ",[37,18634,18635],{"href":1766},"prompt engineering tips"," beyond e-commerce, including how Seedance 2.0 interprets cinematic terminology, check the dedicated prompt guide.",[48,18638,18640],{"id":18639},"video-type-3-lifestyle-context","Video Type 3: Lifestyle Context",[11,18642,18643],{},"Static product photos on white backgrounds convert. But lifestyle imagery — the product in context, being used, in a real environment — builds emotional connection. Lifestyle video is the format that makes a customer think \"I want that life,\" not just \"I want that thing.\"",[11,18645,18646,18647,18649,18650,18652],{},"Seedance 2.0 supports multi-image input. Use ",[28,18648,2908],{}," for the product and ",[28,18651,2918],{}," for the environment or scene you want it placed in. The model composites the product into the scene with natural lighting and perspective.",[136,18654,18656],{"className":338,"code":18655,"language":340,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\n        \"https://your-cdn.com/products/ceramic-mug.jpg\",\n        \"https://your-cdn.com/scenes/cafe-table-morning.jpg\"\n    ],\n    \"prompt\": (\n        \"@Image1 is a handmade ceramic coffee mug. @Image2 is a cozy \"\n        \"café table by a window on a rainy morning. The mug sits on the \"\n        \"table, steam rising gently from fresh coffee. Soft natural light \"\n        \"from the window. Shallow depth of field. A hand reaches in and \"\n        \"wraps around the mug. Warm, inviting atmosphere. Lifestyle \"\n        \"advertisement quality.\"\n    ),\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"9:16\"\n}\n\nresult = create_and_wait(payload)\n",[28,18657,18658,18666,18676,18682,18689,18694,18698,18704,18709,18714,18719,18724,18729,18734,18738,18748,18758,18767,18771,18775],{"__ignoreMap":141},[145,18659,18660,18662,18664],{"class":147,"line":148},[145,18661,3661],{"class":262},[145,18663,266],{"class":258},[145,18665,428],{"class":262},[145,18667,18668,18670,18672,18674],{"class":147,"line":166},[145,18669,3670],{"class":159},[145,18671,437],{"class":262},[145,18673,1308],{"class":159},[145,18675,452],{"class":262},[145,18677,18678,18680],{"class":147,"line":178},[145,18679,15386],{"class":159},[145,18681,2691],{"class":262},[145,18683,18684,18687],{"class":147,"line":187},[145,18685,18686],{"class":159},"        \"https://your-cdn.com/products/ceramic-mug.jpg\"",[145,18688,452],{"class":262},[145,18690,18691],{"class":147,"line":373},[145,18692,18693],{"class":159},"        \"https://your-cdn.com/scenes/cafe-table-morning.jpg\"\n",[145,18695,18696],{"class":147,"line":379},[145,18697,16367],{"class":262},[145,18699,18700,18702],{"class":147,"line":385},[145,18701,3681],{"class":159},[145,18703,1322],{"class":262},[145,18705,18706],{"class":147,"line":409},[145,18707,18708],{"class":159},"        \"@Image1 is a handmade ceramic coffee mug. @Image2 is a cozy \"\n",[145,18710,18711],{"class":147,"line":420},[145,18712,18713],{"class":159},"        \"café table by a window on a rainy morning. The mug sits on the \"\n",[145,18715,18716],{"class":147,"line":431},[145,18717,18718],{"class":159},"        \"table, steam rising gently from fresh coffee. Soft natural light \"\n",[145,18720,18721],{"class":147,"line":455},[145,18722,18723],{"class":159},"        \"from the window. Shallow depth of field. A hand reaches in and \"\n",[145,18725,18726],{"class":147,"line":466},[145,18727,18728],{"class":159},"        \"wraps around the mug. Warm, inviting atmosphere. Lifestyle \"\n",[145,18730,18731],{"class":147,"line":600},[145,18732,18733],{"class":159},"        \"advertisement quality.\"\n",[145,18735,18736],{"class":147,"line":605},[145,18737,3804],{"class":262},[145,18739,18740,18742,18744,18746],{"class":147,"line":611},[145,18741,3693],{"class":159},[145,18743,437],{"class":262},[145,18745,3698],{"class":155},[145,18747,452],{"class":262},[145,18749,18750,18752,18754,18756],{"class":147,"line":617},[145,18751,3705],{"class":159},[145,18753,437],{"class":262},[145,18755,3710],{"class":159},[145,18757,452],{"class":262},[145,18759,18760,18762,18764],{"class":147,"line":623},[145,18761,3717],{"class":159},[145,18763,437],{"class":262},[145,18765,18766],{"class":159},"\"9:16\"\n",[145,18768,18769],{"class":147,"line":628},[145,18770,469],{"class":262},[145,18772,18773],{"class":147,"line":639},[145,18774,376],{"emptyLinePlaceholder":58},[145,18776,18777,18779,18781],{"class":147,"line":654},[145,18778,12238],{"class":262},[145,18780,266],{"class":258},[145,18782,18278],{"class":262},[11,18784,18785],{},"Here's what this looks like in practice — a painted character reaching for a product (a coffee cup) placed in front of her frame:",[56,18787,60,18788],{"controls":58,"playsInline":58,"style":59},[62,18789],{"src":18790,"type":65},"https://cdn.evolink.ai/seedance2api/%E7%94%BB%E4%B8%AD%E5%A5%B3%E4%BA%BA%E5%81%B7%E5%96%9D%E5%92%96%E5%95%A1.mp4",[11,18792,18793],{},[2619,18794,18795,18796,18798],{},"This demo shows how ",[28,18797,2908],{}," (the character/product reference) stays visually consistent while the model generates natural interaction with props and environment. The same principle applies to any product-in-context video.",[11,18800,2176,18801,18803,18804,18807],{},[28,18802,2918],{}," reference gives the model a concrete environment to work with rather than hallucinating one from a text description alone. This produces more realistic and consistent results. The ",[37,18805,18806],{"href":2966},"@tags system"," supports up to nine images, so you can layer multiple reference images for complex scenes.",[92,18809,18811],{"id":18810},"lifestyle-scene-suggestions-by-category","Lifestyle Scene Suggestions by Category",[2036,18813,18814,18827],{},[2039,18815,18816],{},[2042,18817,18818,18821,18824],{},[2045,18819,18820],{},"Product Category",[2045,18822,18823],{},"Scene",[2045,18825,18826],{},"Prompt Keywords",[2052,18828,18829,18840,18851,18862,18873,18884],{},[2042,18830,18831,18834,18837],{},[2057,18832,18833],{},"Drinkware",[2057,18835,18836],{},"Café table, kitchen counter, outdoor patio",[2057,18838,18839],{},"steam rising, morning light, cozy atmosphere",[2042,18841,18842,18845,18848],{},[2057,18843,18844],{},"Watches",[2057,18846,18847],{},"Wrist on steering wheel, desk with laptop, outdoor adventure",[2057,18849,18850],{},"natural wrist movement, lifestyle context, candid feel",[2042,18852,18853,18856,18859],{},[2057,18854,18855],{},"Headphones",[2057,18857,18858],{},"Commuter on train, runner in park, student at desk",[2057,18860,18861],{},"wearing naturally, ambient environment, in-use",[2042,18863,18864,18867,18870],{},[2057,18865,18866],{},"Skincare",[2057,18868,18869],{},"Bathroom vanity, spa setting, bedroom nightstand",[2057,18871,18872],{},"soft lighting, clean aesthetic, self-care moment",[2042,18874,18875,18878,18881],{},[2057,18876,18877],{},"Furniture",[2057,18879,18880],{},"Living room with sunlight, styled apartment",[2057,18882,18883],{},"room context, natural scale, interior design",[2042,18885,18886,18889,18892],{},[2057,18887,18888],{},"Bags",[2057,18890,18891],{},"Street style, airport terminal, office entrance",[2057,18893,18894],{},"walking motion, casual carry, urban setting",[11,18896,18897],{},"The key to lifestyle video is specificity. \"A person using the product\" generates generic results. \"A hand reaches in and wraps around the mug\" creates a moment with intention. Describe the micro-action, not the macro-concept.",[92,18899,18901],{"id":18900},"single-image-vs-dual-image-lifestyle","Single-Image vs. Dual-Image Lifestyle",[11,18903,18904,18905,18907,18908,18910],{},"You can generate lifestyle videos with just one product image — describe the scene entirely in the prompt. Dual-image mode (",[28,18906,2908],{}," + ",[28,18909,2918],{},") produces more consistent environments because the model has a visual reference for the scene, not just a text description.",[11,18912,18913],{},"When to use each approach:",[97,18915,18916,18922],{},[73,18917,18918,18921],{},[23,18919,18920],{},"Single image + descriptive prompt:"," Quick and easy. Good when the scene is generic (e.g., \"on a desk,\" \"in a kitchen\"). No need to source a second reference image.",[73,18923,18924,18927],{},[23,18925,18926],{},"Dual image (product + scene reference):"," Higher quality compositing. Use when the specific environment matters — a particular café aesthetic, a branded retail space, a curated lifestyle setting that matches your brand guidelines.",[11,18929,18930,18931,18933,18934,493],{},"For dual-image mode, your scene reference doesn't need to be your own photo. Stock photos work well as environment references. The model extracts the lighting, color palette, and spatial layout from ",[28,18932,2918],{}," and uses it to contextualize ",[28,18935,2908],{},[11,18937,18938,18939,18941,18942,2597],{},"Note the aspect ratio shift: lifestyle content for Instagram Reels and TikTok uses ",[28,18940,1810],{},". Match the aspect ratio to the platform where the video will run. More on this in the ",[37,18943,18945],{"href":18944},"#multi-platform-export-aspect-ratios-for-every-channel","multi-platform export section",[48,18947,18949],{"id":18948},"video-type-4-material-close-up-macro-detail","Video Type 4: Material Close-up (Macro Detail)",[11,18951,18952],{},"Texture sells premium products. The grain of leather, the brushed finish on aluminum, the weave of a cashmere sweater — these details communicate quality in ways that wide shots cannot. A macro close-up video that slowly reveals surface detail is one of the highest-converting formats for luxury and handcrafted goods.",[136,18954,18956],{"className":338,"code":18955,"language":340,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\n        \"https://your-cdn.com/products/leather-wallet.jpg\"\n    ],\n    \"prompt\": (\n        \"@Image1 is a full-grain leather bifold wallet. Extreme macro \"\n        \"close-up. The camera slowly glides across the leather surface, \"\n        \"revealing grain texture and hand-stitched seams. Shallow depth \"\n        \"of field with creamy bokeh. Warm directional lighting rakes \"\n        \"across the surface, emphasizing every pore and fiber. The camera \"\n        \"pulls back gradually to reveal the full wallet. Luxury product \"\n        \"photography in motion.\"\n    ),\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\"\n}\n\nresult = create_and_wait(payload)\n",[28,18957,18958,18966,18976,18982,18987,18991,18997,19002,19007,19012,19017,19022,19027,19032,19036,19046,19056,19064,19068,19072],{"__ignoreMap":141},[145,18959,18960,18962,18964],{"class":147,"line":148},[145,18961,3661],{"class":262},[145,18963,266],{"class":258},[145,18965,428],{"class":262},[145,18967,18968,18970,18972,18974],{"class":147,"line":166},[145,18969,3670],{"class":159},[145,18971,437],{"class":262},[145,18973,1308],{"class":159},[145,18975,452],{"class":262},[145,18977,18978,18980],{"class":147,"line":178},[145,18979,15386],{"class":159},[145,18981,2691],{"class":262},[145,18983,18984],{"class":147,"line":187},[145,18985,18986],{"class":159},"        \"https://your-cdn.com/products/leather-wallet.jpg\"\n",[145,18988,18989],{"class":147,"line":373},[145,18990,16367],{"class":262},[145,18992,18993,18995],{"class":147,"line":379},[145,18994,3681],{"class":159},[145,18996,1322],{"class":262},[145,18998,18999],{"class":147,"line":385},[145,19000,19001],{"class":159},"        \"@Image1 is a full-grain leather bifold wallet. Extreme macro \"\n",[145,19003,19004],{"class":147,"line":409},[145,19005,19006],{"class":159},"        \"close-up. The camera slowly glides across the leather surface, \"\n",[145,19008,19009],{"class":147,"line":420},[145,19010,19011],{"class":159},"        \"revealing grain texture and hand-stitched seams. Shallow depth \"\n",[145,19013,19014],{"class":147,"line":431},[145,19015,19016],{"class":159},"        \"of field with creamy bokeh. Warm directional lighting rakes \"\n",[145,19018,19019],{"class":147,"line":455},[145,19020,19021],{"class":159},"        \"across the surface, emphasizing every pore and fiber. The camera \"\n",[145,19023,19024],{"class":147,"line":466},[145,19025,19026],{"class":159},"        \"pulls back gradually to reveal the full wallet. Luxury product \"\n",[145,19028,19029],{"class":147,"line":600},[145,19030,19031],{"class":159},"        \"photography in motion.\"\n",[145,19033,19034],{"class":147,"line":605},[145,19035,3804],{"class":262},[145,19037,19038,19040,19042,19044],{"class":147,"line":611},[145,19039,3693],{"class":159},[145,19041,437],{"class":262},[145,19043,3698],{"class":155},[145,19045,452],{"class":262},[145,19047,19048,19050,19052,19054],{"class":147,"line":617},[145,19049,3705],{"class":159},[145,19051,437],{"class":262},[145,19053,3710],{"class":159},[145,19055,452],{"class":262},[145,19057,19058,19060,19062],{"class":147,"line":623},[145,19059,3717],{"class":159},[145,19061,437],{"class":262},[145,19063,2730],{"class":159},[145,19065,19066],{"class":147,"line":628},[145,19067,469],{"class":262},[145,19069,19070],{"class":147,"line":639},[145,19071,376],{"emptyLinePlaceholder":58},[145,19073,19074,19076,19078],{"class":147,"line":654},[145,19075,12238],{"class":262},[145,19077,266],{"class":258},[145,19079,18278],{"class":262},[92,19081,19083],{"id":19082},"macro-prompt-vocabulary","Macro Prompt Vocabulary",[11,19085,19086],{},"The model responds strongly to specific cinematography terms. Use these to control the macro effect:",[97,19088,19089,19095,19101,19107,19113],{},[73,19090,19091,19094],{},[23,19092,19093],{},"\"Extreme macro close-up\""," — triggers tight framing on surface details",[73,19096,19097,19100],{},[23,19098,19099],{},"\"Shallow depth of field\" / \"creamy bokeh\""," — blurs the background, isolates the detail",[73,19102,19103,19106],{},[23,19104,19105],{},"\"Raking light\" / \"directional lighting\""," — emphasizes surface texture through shadows",[73,19108,19109,19112],{},[23,19110,19111],{},"\"Camera glides across\""," — smooth lateral motion, reveals texture progressively",[73,19114,19115,19118],{},[23,19116,19117],{},"\"Surface texture reveal\""," — explicit instruction to focus on material quality",[92,19120,19122],{"id":19121},"material-specific-prompts","Material-Specific Prompts",[11,19124,19125,19128],{},[23,19126,19127],{},"Leather:"," Focus on grain, stitching, patina. Use warm lighting.",[136,19130,19133],{"className":19131,"code":19132,"language":2185},[2183],"Extreme macro on full-grain leather surface. Raking warm light reveals \nnatural grain variation and hand-stitched seam detail. Camera drifts \nslowly across the material. Shallow depth of field.\n",[28,19134,19132],{"__ignoreMap":141},[11,19136,19137,19140],{},[23,19138,19139],{},"Metal (brushed/polished):"," Focus on reflections, machining marks, precision.",[136,19142,19145],{"className":19143,"code":19144,"language":2185},[2183],"Extreme close-up of brushed stainless steel surface. Cool directional \nlight creates long specular highlights across machined grooves. Camera \ntracks along the edge. Mirror-like reflections shift with the angle.\n",[28,19146,19144],{"__ignoreMap":141},[11,19148,19149,19152],{},[23,19150,19151],{},"Fabric/textile:"," Focus on weave pattern, fiber detail, drape.",[136,19154,19157],{"className":19155,"code":19156,"language":2185},[2183],"Macro view of cashmere knit fabric. Soft diffused light reveals \nindividual fiber structure and weave pattern. Camera slowly pans \nacross the textile. Gentle motion shows natural drape and softness.\n",[28,19158,19156],{"__ignoreMap":141},[11,19160,19161,19164],{},[23,19162,19163],{},"Wood grain:"," Focus on rings, finish, natural variation.",[136,19166,19169],{"className":19167,"code":19168,"language":2185},[2183],"Extreme macro of walnut wood surface with oil finish. Warm side \nlighting reveals growth rings and natural color variation. Camera \nglides along the grain direction. Rich, organic texture detail.\n",[28,19170,19168],{"__ignoreMap":141},[11,19172,19173,19174,493],{},"These material close-ups are particularly powerful as the second or third video in a product listing. After the customer sees the full product (rotation or hero shot), the macro detail video reinforces the quality perception. For camera movement techniques that enhance these reveals, see the ",[37,19175,19176],{"href":3856},"camera movements guide",[48,19178,19180],{"id":19179},"video-type-5-unboxing-reveal","Video Type 5: Unboxing Reveal",[11,19182,19183],{},"Unboxing videos dominate YouTube and social platforms for a reason: they simulate the purchase experience. The anticipation of opening packaging, the first glimpse of the product, the satisfaction of a well-designed unbox — this format taps into the emotional peak of buying.",[136,19185,19187],{"className":338,"code":19186,"language":340,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\n        \"https://your-cdn.com/products/smartwatch-boxed.jpg\"\n    ],\n    \"prompt\": (\n        \"@Image1 is a premium smartwatch in its retail packaging. \"\n        \"Hands gently lift the box lid, revealing tissue paper inside. \"\n        \"The tissue parts to unveil the watch nestled in a molded insert. \"\n        \"Soft overhead lighting. The watch face catches the light as \"\n        \"it's lifted from the box. Close-up of the clasp clicking shut \"\n        \"on a wrist. Smooth, deliberate pacing. Unboxing experience \"\n        \"video. Premium commercial quality.\"\n    ),\n    \"duration\": 12,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"9:16\"\n}\n\nresult = create_and_wait(payload)\n",[28,19188,19189,19197,19207,19213,19218,19222,19228,19233,19238,19243,19248,19253,19258,19263,19267,19277,19287,19295,19299,19303],{"__ignoreMap":141},[145,19190,19191,19193,19195],{"class":147,"line":148},[145,19192,3661],{"class":262},[145,19194,266],{"class":258},[145,19196,428],{"class":262},[145,19198,19199,19201,19203,19205],{"class":147,"line":166},[145,19200,3670],{"class":159},[145,19202,437],{"class":262},[145,19204,1308],{"class":159},[145,19206,452],{"class":262},[145,19208,19209,19211],{"class":147,"line":178},[145,19210,15386],{"class":159},[145,19212,2691],{"class":262},[145,19214,19215],{"class":147,"line":187},[145,19216,19217],{"class":159},"        \"https://your-cdn.com/products/smartwatch-boxed.jpg\"\n",[145,19219,19220],{"class":147,"line":373},[145,19221,16367],{"class":262},[145,19223,19224,19226],{"class":147,"line":379},[145,19225,3681],{"class":159},[145,19227,1322],{"class":262},[145,19229,19230],{"class":147,"line":385},[145,19231,19232],{"class":159},"        \"@Image1 is a premium smartwatch in its retail packaging. \"\n",[145,19234,19235],{"class":147,"line":409},[145,19236,19237],{"class":159},"        \"Hands gently lift the box lid, revealing tissue paper inside. \"\n",[145,19239,19240],{"class":147,"line":420},[145,19241,19242],{"class":159},"        \"The tissue parts to unveil the watch nestled in a molded insert. \"\n",[145,19244,19245],{"class":147,"line":431},[145,19246,19247],{"class":159},"        \"Soft overhead lighting. The watch face catches the light as \"\n",[145,19249,19250],{"class":147,"line":455},[145,19251,19252],{"class":159},"        \"it's lifted from the box. Close-up of the clasp clicking shut \"\n",[145,19254,19255],{"class":147,"line":466},[145,19256,19257],{"class":159},"        \"on a wrist. Smooth, deliberate pacing. Unboxing experience \"\n",[145,19259,19260],{"class":147,"line":600},[145,19261,19262],{"class":159},"        \"video. Premium commercial quality.\"\n",[145,19264,19265],{"class":147,"line":605},[145,19266,3804],{"class":262},[145,19268,19269,19271,19273,19275],{"class":147,"line":611},[145,19270,3693],{"class":159},[145,19272,437],{"class":262},[145,19274,16408],{"class":155},[145,19276,452],{"class":262},[145,19278,19279,19281,19283,19285],{"class":147,"line":617},[145,19280,3705],{"class":159},[145,19282,437],{"class":262},[145,19284,3710],{"class":159},[145,19286,452],{"class":262},[145,19288,19289,19291,19293],{"class":147,"line":623},[145,19290,3717],{"class":159},[145,19292,437],{"class":262},[145,19294,18766],{"class":159},[145,19296,19297],{"class":147,"line":628},[145,19298,469],{"class":262},[145,19300,19301],{"class":147,"line":639},[145,19302,376],{"emptyLinePlaceholder":58},[145,19304,19305,19307,19309],{"class":147,"line":654},[145,19306,12238],{"class":262},[145,19308,266],{"class":258},[145,19310,18278],{"class":262},[11,19312,19313],{},"The unboxing format works best with longer durations — 10 to 15 seconds — because it tells a story with a beginning (sealed box), middle (reveal), and end (product in use or on display). Shorter clips truncate the narrative arc and lose the emotional payoff.",[92,19315,19317],{"id":19316},"unboxing-prompt-structure","Unboxing Prompt Structure",[11,19319,19320],{},"An effective unboxing prompt follows a three-act structure:",[11,19322,19323,19326],{},[23,19324,19325],{},"Act 1 — The Package (2–3 seconds)."," Establish the packaging. Describe hands interacting with the sealed box, the material of the packaging, any branded elements.",[11,19328,19329,19332],{},[23,19330,19331],{},"Act 2 — The Reveal (4–6 seconds)."," The lid opens. Tissue paper, foam inserts, or protective layers part. The product becomes visible for the first time. This is the emotional peak — describe it with sensory detail.",[11,19334,19335,19338],{},[23,19336,19337],{},"Act 3 — The Product (3–5 seconds)."," The product is lifted, displayed, or put to use. A watch goes on a wrist. Earbuds go into ears. A phone screen lights up. This completes the purchase fantasy.",[11,19340,19341],{},"For products with distinctive or premium packaging, use a photo that shows the box as your input image. If you only have a product-on-white photo, describe the packaging in the prompt and let the model generate it. Results are more consistent when you provide a reference image of the actual packaging.",[11,19343,19344,19345,19347],{},"The 9:16 vertical format dominates here because unboxing content primarily lives on Instagram Reels, TikTok, and YouTube Shorts. For product pages, consider a 16:9 edit with tighter framing. The ",[37,19346,19176],{"href":3856}," covers how to describe dramatic reveals and top-down angles that enhance unboxing sequences.",[92,19349,19351],{"id":19350},"packaging-as-a-marketing-asset","Packaging as a Marketing Asset",[11,19353,19354],{},"Premium brands invest heavily in packaging design — and unboxing videos are where that investment pays off on camera. If your product has distinctive packaging (custom boxes, magnetic closures, embossed logos, tissue paper with branding), make sure your input image captures the packaged state, not just the product itself.",[11,19356,19357],{},"For products without luxury packaging — standard brown boxes, poly mailers, minimal retail packaging — you can still create an aspirational unboxing experience. Products with unremarkable packaging can still produce compelling unboxing videos. Focus the prompt on the reveal moment — the contrast between a closed box and the product inside. The narrative arc carries the video even when the packaging is standard.",[92,19359,19361],{"id":19360},"combining-video-types-for-a-complete-listing","Combining Video Types for a Complete Listing",[11,19363,19364],{},"The most effective product listings use multiple video types together. A strong combination for a product page:",[70,19366,19367,19373,19379,19385],{},[73,19368,19369,19372],{},[23,19370,19371],{},"Hero shot"," (first video) — Grabs attention, establishes premium positioning",[73,19374,19375,19378],{},[23,19376,19377],{},"360° rotation"," (second video) — Shows the product from every angle",[73,19380,19381,19384],{},[23,19382,19383],{},"Macro close-up"," (third video) — Proves quality through material detail",[73,19386,19387,19390],{},[23,19388,19389],{},"Lifestyle context"," (fourth video) — Helps the customer visualize ownership",[11,19392,19393],{},"For social media promotion of the same product, lead with the hero shot or unboxing reveal (both optimized for stopping thumbs in a feed), then retarget viewers with lifestyle and rotation content.",[11,19395,19396],{},"Generate all five types from a single product photo in one pipeline run. The batch system in the next section handles this automatically.",[48,19398,19400],{"id":19399},"multi-platform-export-aspect-ratios-for-every-channel","Multi-Platform Export: Aspect Ratios for Every Channel",[11,19402,19403],{},"One product video is useful. The same video in every format your channels need is a system. Each platform has different aspect ratio preferences, autoplay behaviors, and duration sweet spots. Generating a single video and cropping it to fit destroys composition. Generating natively in each ratio produces a video framed correctly for every screen.",[2036,19405,19406,19421],{},[2039,19407,19408],{},[2042,19409,19410,19412,19415,19418],{},[2045,19411,13809],{},[2045,19413,19414],{},"Aspect Ratio",[2045,19416,19417],{},"Recommended Duration",[2045,19419,19420],{},"Notes",[2052,19422,19423,19436,19448,19461,19474,19486,19500,19513,19525],{},[2042,19424,19425,19428,19430,19433],{},[2057,19426,19427],{},"Amazon Product Page",[2057,19429,1806],{},[2057,19431,19432],{},"6–8s",[2057,19434,19435],{},"Clean, informative. Autoplay in listing.",[2042,19437,19438,19441,19443,19445],{},[2057,19439,19440],{},"Shopify Product Page",[2057,19442,1806],{},[2057,19444,18340],{},[2057,19446,19447],{},"Autoplay hero or gallery embed.",[2042,19449,19450,19453,19455,19458],{},[2057,19451,19452],{},"Instagram Reels",[2057,19454,1810],{},[2057,19456,19457],{},"8–10s",[2057,19459,19460],{},"Eye-catching, fast pacing preferred.",[2042,19462,19463,19466,19468,19471],{},[2057,19464,19465],{},"TikTok",[2057,19467,1810],{},[2057,19469,19470],{},"8–15s",[2057,19472,19473],{},"Trending styles, dynamic transitions.",[2042,19475,19476,19479,19481,19483],{},[2057,19477,19478],{},"Facebook Feed",[2057,19480,1814],{},[2057,19482,19432],{},[2057,19484,19485],{},"Square for maximum feed real estate.",[2042,19487,19488,19491,19494,19497],{},[2057,19489,19490],{},"Pinterest Video Pin",[2057,19492,19493],{},"1:1 or 9:16",[2057,19495,19496],{},"6–15s",[2057,19498,19499],{},"Vertical performs best on mobile.",[2042,19501,19502,19505,19507,19510],{},[2057,19503,19504],{},"Website Hero Banner",[2057,19506,1806],{},[2057,19508,19509],{},"4–6s",[2057,19511,19512],{},"Short loop, autoplay, no audio.",[2042,19514,19515,19518,19520,19522],{},[2057,19516,19517],{},"YouTube Shorts",[2057,19519,1810],{},[2057,19521,19470],{},[2057,19523,19524],{},"Similar to TikTok format.",[2042,19526,19527,19530,19532,19534],{},[2057,19528,19529],{},"Email Campaign",[2057,19531,1806],{},[2057,19533,19509],{},[2057,19535,19536],{},"GIF fallback, keep file size small.",[92,19538,19540],{"id":19539},"generate-all-ratios-in-one-pass","Generate All Ratios in One Pass",[11,19542,19543],{},"Use a simple loop to generate the same product video in every ratio your channels require:",[136,19545,19547],{"className":338,"code":19546,"language":340,"meta":141,"style":141},"platform_configs = [\n    {\"name\": \"amazon\",    \"aspect_ratio\": \"16:9\", \"duration\": 8},\n    {\"name\": \"instagram\", \"aspect_ratio\": \"9:16\", \"duration\": 10},\n    {\"name\": \"facebook\",  \"aspect_ratio\": \"1:1\",  \"duration\": 8},\n    {\"name\": \"website\",   \"aspect_ratio\": \"16:9\", \"duration\": 5},\n]\n\nbase_prompt = (\n    \"@Image1 is a premium wireless speaker. The speaker rotates slowly \"\n    \"on a matte black surface under soft studio lighting. Clean, minimal \"\n    \"aesthetic. Commercial product video quality.\"\n)\n\ntasks = []\nfor config in platform_configs:\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [\"https://your-cdn.com/products/speaker.jpg\"],\n        \"prompt\": base_prompt,\n        \"duration\": config[\"duration\"],\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": config[\"aspect_ratio\"]\n    }\n    task = generate_video(payload)\n    tasks.append({\"platform\": config[\"name\"], \"task_id\": task[\"task_id\"]})\n    print(f\"📐 {config['name']} ({config['aspect_ratio']}): {task['task_id']}\")\n    time.sleep(1)  # Rate limiting\n\n# Collect results\nfor t in tasks:\n    result = wait_for_video(t[\"task_id\"])\n    print(f\"✅ {t['platform']}: {result['output']['video_url']}\")\n",[28,19548,19549,19558,19591,19620,19649,19679,19683,19687,19697,19702,19707,19712,19716,19720,19729,19741,19749,19759,19770,19777,19788,19798,19808,19812,19820,19844,19898,19911,19915,19920,19932,19945],{"__ignoreMap":141},[145,19550,19551,19554,19556],{"class":147,"line":148},[145,19552,19553],{"class":262},"platform_configs ",[145,19555,266],{"class":258},[145,19557,8867],{"class":262},[145,19559,19560,19563,19566,19568,19571,19574,19576,19578,19580,19582,19584,19586,19588],{"class":147,"line":166},[145,19561,19562],{"class":262},"    {",[145,19564,19565],{"class":159},"\"name\"",[145,19567,437],{"class":262},[145,19569,19570],{"class":159},"\"amazon\"",[145,19572,19573],{"class":262},",    ",[145,19575,6168],{"class":159},[145,19577,437],{"class":262},[145,19579,1384],{"class":159},[145,19581,400],{"class":262},[145,19583,5966],{"class":159},[145,19585,437],{"class":262},[145,19587,3698],{"class":155},[145,19589,19590],{"class":262},"},\n",[145,19592,19593,19595,19597,19599,19602,19604,19606,19608,19610,19612,19614,19616,19618],{"class":147,"line":178},[145,19594,19562],{"class":262},[145,19596,19565],{"class":159},[145,19598,437],{"class":262},[145,19600,19601],{"class":159},"\"instagram\"",[145,19603,400],{"class":262},[145,19605,6168],{"class":159},[145,19607,437],{"class":262},[145,19609,3722],{"class":159},[145,19611,400],{"class":262},[145,19613,5966],{"class":159},[145,19615,437],{"class":262},[145,19617,537],{"class":155},[145,19619,19590],{"class":262},[145,19621,19622,19624,19626,19628,19631,19633,19635,19637,19639,19641,19643,19645,19647],{"class":147,"line":187},[145,19623,19562],{"class":262},[145,19625,19565],{"class":159},[145,19627,437],{"class":262},[145,19629,19630],{"class":159},"\"facebook\"",[145,19632,1447],{"class":262},[145,19634,6168],{"class":159},[145,19636,437],{"class":262},[145,19638,6140],{"class":159},[145,19640,1447],{"class":262},[145,19642,5966],{"class":159},[145,19644,437],{"class":262},[145,19646,3698],{"class":155},[145,19648,19590],{"class":262},[145,19650,19651,19653,19655,19657,19660,19663,19665,19667,19669,19671,19673,19675,19677],{"class":147,"line":373},[145,19652,19562],{"class":262},[145,19654,19565],{"class":159},[145,19656,437],{"class":262},[145,19658,19659],{"class":159},"\"website\"",[145,19661,19662],{"class":262},",   ",[145,19664,6168],{"class":159},[145,19666,437],{"class":262},[145,19668,1384],{"class":159},[145,19670,400],{"class":262},[145,19672,5966],{"class":159},[145,19674,437],{"class":262},[145,19676,1352],{"class":155},[145,19678,19590],{"class":262},[145,19680,19681],{"class":147,"line":379},[145,19682,764],{"class":262},[145,19684,19685],{"class":147,"line":385},[145,19686,376],{"emptyLinePlaceholder":58},[145,19688,19689,19692,19694],{"class":147,"line":409},[145,19690,19691],{"class":262},"base_prompt ",[145,19693,266],{"class":258},[145,19695,19696],{"class":262}," (\n",[145,19698,19699],{"class":147,"line":420},[145,19700,19701],{"class":159},"    \"@Image1 is a premium wireless speaker. The speaker rotates slowly \"\n",[145,19703,19704],{"class":147,"line":431},[145,19705,19706],{"class":159},"    \"on a matte black surface under soft studio lighting. Clean, minimal \"\n",[145,19708,19709],{"class":147,"line":455},[145,19710,19711],{"class":159},"    \"aesthetic. Commercial product video quality.\"\n",[145,19713,19714],{"class":147,"line":466},[145,19715,406],{"class":262},[145,19717,19718],{"class":147,"line":600},[145,19719,376],{"emptyLinePlaceholder":58},[145,19721,19722,19725,19727],{"class":147,"line":605},[145,19723,19724],{"class":262},"tasks ",[145,19726,266],{"class":258},[145,19728,5876],{"class":262},[145,19730,19731,19733,19736,19738],{"class":147,"line":611},[145,19732,8229],{"class":258},[145,19734,19735],{"class":262}," config ",[145,19737,1180],{"class":258},[145,19739,19740],{"class":262}," platform_configs:\n",[145,19742,19743,19745,19747],{"class":147,"line":617},[145,19744,1294],{"class":262},[145,19746,266],{"class":258},[145,19748,428],{"class":262},[145,19750,19751,19753,19755,19757],{"class":147,"line":623},[145,19752,1303],{"class":159},[145,19754,437],{"class":262},[145,19756,1308],{"class":159},[145,19758,452],{"class":262},[145,19760,19761,19763,19765,19768],{"class":147,"line":628},[145,19762,2688],{"class":159},[145,19764,10841],{"class":262},[145,19766,19767],{"class":159},"\"https://your-cdn.com/products/speaker.jpg\"",[145,19769,10847],{"class":262},[145,19771,19772,19774],{"class":147,"line":639},[145,19773,1319],{"class":159},[145,19775,19776],{"class":262},": base_prompt,\n",[145,19778,19779,19781,19784,19786],{"class":147,"line":654},[145,19780,1347],{"class":159},[145,19782,19783],{"class":262},": config[",[145,19785,5966],{"class":159},[145,19787,10847],{"class":262},[145,19789,19790,19792,19794,19796],{"class":147,"line":660},[145,19791,1363],{"class":159},[145,19793,437],{"class":262},[145,19795,3710],{"class":159},[145,19797,452],{"class":262},[145,19799,19800,19802,19804,19806],{"class":147,"line":671},[145,19801,1379],{"class":159},[145,19803,19783],{"class":262},[145,19805,6168],{"class":159},[145,19807,764],{"class":262},[145,19809,19810],{"class":147,"line":698},[145,19811,1407],{"class":262},[145,19813,19814,19816,19818],{"class":147,"line":710},[145,19815,1496],{"class":262},[145,19817,266],{"class":258},[145,19819,16904],{"class":262},[145,19821,19822,19825,19828,19830,19832,19834,19836,19839,19841],{"class":147,"line":716},[145,19823,19824],{"class":262},"    tasks.append({",[145,19826,19827],{"class":159},"\"platform\"",[145,19829,19783],{"class":262},[145,19831,19565],{"class":159},[145,19833,10755],{"class":262},[145,19835,7693],{"class":159},[145,19837,19838],{"class":262},": task[",[145,19840,7693],{"class":159},[145,19842,19843],{"class":262},"]})\n",[145,19845,19846,19848,19850,19852,19855,19857,19860,19863,19865,19867,19869,19871,19873,19876,19878,19880,19883,19885,19887,19890,19892,19894,19896],{"class":147,"line":722},[145,19847,1102],{"class":155},[145,19849,794],{"class":262},[145,19851,440],{"class":258},[145,19853,19854],{"class":159},"\"📐 ",[145,19856,685],{"class":155},[145,19858,19859],{"class":262},"config[",[145,19861,19862],{"class":159},"'name'",[145,19864,1535],{"class":262},[145,19866,691],{"class":155},[145,19868,1218],{"class":159},[145,19870,685],{"class":155},[145,19872,19859],{"class":262},[145,19874,19875],{"class":159},"'aspect_ratio'",[145,19877,1535],{"class":262},[145,19879,691],{"class":155},[145,19881,19882],{"class":159},"): ",[145,19884,685],{"class":155},[145,19886,1529],{"class":262},[145,19888,19889],{"class":159},"'task_id'",[145,19891,1535],{"class":262},[145,19893,691],{"class":155},[145,19895,449],{"class":159},[145,19897,406],{"class":262},[145,19899,19900,19903,19905,19908],{"class":147,"line":728},[145,19901,19902],{"class":262},"    time.sleep(",[145,19904,5437],{"class":155},[145,19906,19907],{"class":262},")  ",[145,19909,19910],{"class":174},"# Rate limiting\n",[145,19912,19913],{"class":147,"line":739},[145,19914,376],{"emptyLinePlaceholder":58},[145,19916,19917],{"class":147,"line":744},[145,19918,19919],{"class":174},"# Collect results\n",[145,19921,19922,19924,19927,19929],{"class":147,"line":750},[145,19923,8229],{"class":258},[145,19925,19926],{"class":262}," t ",[145,19928,1180],{"class":258},[145,19930,19931],{"class":262}," tasks:\n",[145,19933,19934,19936,19938,19941,19943],{"class":147,"line":767},[145,19935,1618],{"class":262},[145,19937,266],{"class":258},[145,19939,19940],{"class":262}," wait_for_video(t[",[145,19942,7693],{"class":159},[145,19944,1629],{"class":262},[145,19946,19947,19949,19951,19953,19956,19958,19961,19964,19966,19968,19970,19972,19974,19976,19978,19980,19982,19984,19986],{"class":147,"line":788},[145,19948,1102],{"class":155},[145,19950,794],{"class":262},[145,19952,440],{"class":258},[145,19954,19955],{"class":159},"\"✅ ",[145,19957,685],{"class":155},[145,19959,19960],{"class":262},"t[",[145,19962,19963],{"class":159},"'platform'",[145,19965,1535],{"class":262},[145,19967,691],{"class":155},[145,19969,437],{"class":159},[145,19971,685],{"class":155},[145,19973,11813],{"class":262},[145,19975,17892],{"class":159},[145,19977,1562],{"class":262},[145,19979,17897],{"class":159},[145,19981,1535],{"class":262},[145,19983,691],{"class":155},[145,19985,449],{"class":159},[145,19987,406],{"class":262},[11,19989,19990],{},"This submits all variants in parallel (with a 1-second pause between requests for rate limiting), then collects results as they complete. For a catalog of 100 products across 4 platforms, that's 400 videos — generated in the time it takes to watch a TV episode.",[11,19992,19993],{},"This pattern submits all four variants, then collects results as they finish. Total generation time is roughly equal to a single video — all four process in parallel on the server side.",[92,19995,19997],{"id":19996},"why-native-ratios-beat-cropping","Why Native Ratios Beat Cropping",[11,19999,20000],{},"The prompt stays identical across ratios. Seedance 2.0 recomposes the scene to fit each aspect ratio natively, adjusting framing and spatial layout rather than cropping. A 9:16 vertical version of a rotation video places the product centrally with more headroom; a 1:1 square version tightens the framing for maximum product visibility in a feed.",[11,20002,20003],{},"Traditional video editing handles multi-platform by cropping a 16:9 master file. A center crop to 9:16 loses the sides of the frame. A crop to 1:1 loses context. With Seedance 2.0, each ratio is generated from scratch — the model composes the scene appropriately for each shape. A vertical 9:16 version of a product rotation places the product with more vertical breathing room. A square 1:1 version tightens the framing for maximum product visibility in a social feed. The product always occupies the right proportion of the frame.",[92,20005,20007],{"id":20006},"platform-specific-prompt-adjustments","Platform-Specific Prompt Adjustments",[11,20009,20010],{},"While the same base prompt works across ratios, you can optimize for each platform's content style:",[97,20012,20013,20019,20025,20031,20037],{},[73,20014,20015,20018],{},[23,20016,20017],{},"Amazon/Shopify (16:9):"," Keep it clean and informational. Avoid flashy transitions. Focus on showing the product clearly.",[73,20020,20021,20024],{},[23,20022,20023],{},"Instagram Reels (9:16):"," Faster pacing works. Add \"dynamic\" or \"energetic\" to the prompt for more visual motion.",[73,20026,20027,20030],{},[23,20028,20029],{},"TikTok (9:16):"," Even more dynamic. \"Quick cuts,\" \"trend-style transitions,\" and \"bold camera movements\" match TikTok's visual language.",[73,20032,20033,20036],{},[23,20034,20035],{},"Facebook Feed (1:1):"," The square format needs strong center composition. Describe the product centrally: \"product centered in frame.\"",[73,20038,20039,20042],{},[23,20040,20041],{},"Website Hero (16:9):"," Subtlety wins. \"Slow, hypnotic motion\" and \"seamless loop\" are key terms. These videos autoplay silently, so visual quality matters more than narrative.",[11,20044,20045,20046,493],{},"For complete API parameter documentation including all supported ratios, see the ",[37,20047,20048],{"href":14385},"video generation API docs",[48,20050,20052],{"id":20051},"batch-pipeline-csv-catalog-to-video-library","Batch Pipeline: CSV Catalog to Video Library",[11,20054,20055],{},"Individual API calls work for testing. Production e-commerce needs a pipeline: read a product catalog, generate videos for every SKU, handle failures, and organize the output. This section builds that pipeline.",[11,20057,20058],{},"Start with a CSV file containing your product catalog:",[136,20060,20064],{"className":20061,"code":20062,"language":20063,"meta":141,"style":141},"language-csv shiki shiki-themes github-dark","name,image_url,category,style\nLeather Bifold Wallet,https://cdn.example.com/wallet.jpg,accessories,rotation\nWireless Earbuds Pro,https://cdn.example.com/earbuds.jpg,electronics,hero\nCeramic Pour-Over Set,https://cdn.example.com/pourover.jpg,kitchen,lifestyle\nMerino Wool Scarf,https://cdn.example.com/scarf.jpg,apparel,macro\nSmart Fitness Watch,https://cdn.example.com/watch.jpg,electronics,unboxing\n","csv",[28,20065,20066,20071,20076,20081,20086,20091],{"__ignoreMap":141},[145,20067,20068],{"class":147,"line":148},[145,20069,20070],{},"name,image_url,category,style\n",[145,20072,20073],{"class":147,"line":166},[145,20074,20075],{},"Leather Bifold Wallet,https://cdn.example.com/wallet.jpg,accessories,rotation\n",[145,20077,20078],{"class":147,"line":178},[145,20079,20080],{},"Wireless Earbuds Pro,https://cdn.example.com/earbuds.jpg,electronics,hero\n",[145,20082,20083],{"class":147,"line":187},[145,20084,20085],{},"Ceramic Pour-Over Set,https://cdn.example.com/pourover.jpg,kitchen,lifestyle\n",[145,20087,20088],{"class":147,"line":373},[145,20089,20090],{},"Merino Wool Scarf,https://cdn.example.com/scarf.jpg,apparel,macro\n",[145,20092,20093],{"class":147,"line":379},[145,20094,20095],{},"Smart Fitness Watch,https://cdn.example.com/watch.jpg,electronics,unboxing\n",[11,20097,2176,20098,20100],{},[28,20099,11217],{}," column maps to the five video types covered in this guide. Here's the complete pipeline:",[136,20102,20104],{"className":338,"code":20103,"language":340,"meta":141,"style":141},"import csv\nimport os\nimport time\nimport requests\nfrom pathlib import Path\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nOUTPUT_DIR = Path(\"./product_videos\")\nOUTPUT_DIR.mkdir(exist_ok=True)\n\nheaders = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\n# Prompt templates keyed by style\nSTYLE_PROMPTS = {\n    \"rotation\": (\n        \"@Image1 is a {name}. The product rotates slowly on a clean surface \"\n        \"under professional studio lighting. Smooth 360-degree turntable \"\n        \"rotation. Commercial product showcase quality.\"\n    ),\n    \"hero\": (\n        \"@Image1 is a {name}. The product emerges dramatically from soft \"\n        \"volumetric fog with a golden backlight. Particles drift upward. \"\n        \"Cinematic slow reveal. Premium advertisement quality.\"\n    ),\n    \"lifestyle\": (\n        \"@Image1 is a {name}. The product is shown in a natural lifestyle \"\n        \"setting, being used in an everyday context. Warm natural lighting. \"\n        \"Shallow depth of field. Authentic lifestyle commercial.\"\n    ),\n    \"macro\": (\n        \"@Image1 is a {name}. Extreme macro close-up. The camera glides \"\n        \"across the surface, revealing material texture and craftsmanship \"\n        \"details. Shallow depth of field. Raking directional light. \"\n        \"Luxury product detail shot.\"\n    ),\n    \"unboxing\": (\n        \"@Image1 is a {name} in retail packaging. Hands lift the lid to \"\n        \"reveal the product inside. Tissue paper parts. The product is \"\n        \"lifted out and displayed. Soft overhead lighting. Premium \"\n        \"unboxing experience video.\"\n    ),\n}\n\nSTYLE_DEFAULTS = {\n    \"rotation\":  {\"duration\": 8,  \"aspect_ratio\": \"16:9\"},\n    \"hero\":      {\"duration\": 10, \"aspect_ratio\": \"16:9\"},\n    \"lifestyle\": {\"duration\": 8,  \"aspect_ratio\": \"9:16\"},\n    \"macro\":     {\"duration\": 8,  \"aspect_ratio\": \"16:9\"},\n    \"unboxing\":  {\"duration\": 12, \"aspect_ratio\": \"9:16\"},\n}\n\n\ndef submit_video_task(name: str, image_url: str, style: str) -> str:\n    \"\"\"Submit a single video generation task. Returns task_id.\"\"\"\n    prompt_template = STYLE_PROMPTS.get(style, STYLE_PROMPTS[\"rotation\"])\n    defaults = STYLE_DEFAULTS.get(style, STYLE_DEFAULTS[\"rotation\"])\n\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [image_url],\n        \"prompt\": prompt_template.format(name=name),\n        \"duration\": defaults[\"duration\"],\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": defaults[\"aspect_ratio\"],\n    }\n\n    resp = requests.post(\n        f\"{BASE_URL}/videos/generations\", headers=headers, json=payload\n    )\n    resp.raise_for_status()\n    return resp.json()[\"task_id\"]\n\n\ndef poll_task(task_id: str, timeout: int = 300) -> dict:\n    \"\"\"Poll until task completes or fails.\"\"\"\n    elapsed = 0\n    while elapsed \u003C timeout:\n        resp = requests.get(f\"{BASE_URL}/tasks/{task_id}\", headers=headers)\n        resp.raise_for_status()\n        task = resp.json()\n\n        if task[\"status\"] == \"completed\":\n            return task\n        elif task[\"status\"] == \"failed\":\n            raise RuntimeError(f\"Task {task_id} failed: {task.get('error')}\")\n\n        time.sleep(5)\n        elapsed += 5\n\n    raise TimeoutError(f\"Task {task_id} timed out after {timeout}s\")\n\n\ndef download_video(url: str, filepath: Path):\n    \"\"\"Download a video file from a URL.\"\"\"\n    resp = requests.get(url, stream=True)\n    resp.raise_for_status()\n    with open(filepath, \"wb\") as f:\n        for chunk in resp.iter_content(chunk_size=8192):\n            f.write(chunk)\n    print(f\"💾 Saved: {filepath}\")\n\n\ndef process_catalog(csv_path: str, max_retries: int = 2):\n    \"\"\"Process an entire product catalog CSV into videos.\"\"\"\n    # Phase 1: Submit all tasks\n    pending = []\n    with open(csv_path, \"r\") as f:\n        reader = csv.DictReader(f)\n        for row in reader:\n            name = row[\"name\"]\n            image_url = row[\"image_url\"]\n            style = row.get(\"style\", \"rotation\")\n\n            for attempt in range(max_retries + 1):\n                try:\n                    task_id = submit_video_task(name, image_url, style)\n                    pending.append({\n                        \"name\": name,\n                        \"task_id\": task_id,\n                        \"style\": style,\n                    })\n                    print(f\"🎬 Submitted: {name} ({style}) → {task_id}\")\n                    time.sleep(1)  # Rate limiting: 1 request per second\n                    break\n                except requests.exceptions.RequestException as e:\n                    if attempt \u003C max_retries:\n                        print(f\"⚠️  Retry {attempt + 1} for {name}: {e}\")\n                        time.sleep(3)\n                    else:\n                        print(f\"❌ Failed to submit {name}: {e}\")\n\n    # Phase 2: Collect results\n    results = []\n    for item in pending:\n        try:\n            task = poll_task(item[\"task_id\"])\n            video_url = task[\"output\"][\"video_url\"]\n\n            # Generate safe filename\n            safe_name = item[\"name\"].lower().replace(\" \", \"-\")\n            filename = f\"{safe_name}_{item['style']}.mp4\"\n            filepath = OUTPUT_DIR / filename\n\n            download_video(video_url, filepath)\n            results.append({\n                \"name\": item[\"name\"],\n                \"style\": item[\"style\"],\n                \"file\": str(filepath),\n                \"status\": \"success\"\n            })\n        except Exception as e:\n            print(f\"❌ Failed: {item['name']}: {e}\")\n            results.append({\n                \"name\": item[\"name\"],\n                \"style\": item[\"style\"],\n                \"file\": None,\n                \"status\": f\"error: {e}\"\n            })\n\n    # Summary\n    success = sum(1 for r in results if r[\"status\"] == \"success\")\n    print(f\"\\n📊 Complete: {success}/{len(results)} videos generated\")\n    return results\n\n\n# Run it\nresults = process_catalog(\"products.csv\")\n",[28,20105,20106,20113,20119,20125,20131,20143,20147,20155,20163,20177,20192,20196,20204,20220,20228,20232,20236,20241,20250,20257,20268,20273,20278,20282,20289,20298,20303,20308,20312,20319,20328,20333,20338,20342,20349,20358,20363,20368,20373,20377,20384,20393,20398,20403,20408,20412,20416,20420,20429,20452,20475,20498,20521,20543,20547,20551,20555,20583,20588,20610,20630,20634,20642,20652,20659,20674,20685,20695,20705,20709,20713,20721,20746,20750,20754,20765,20769,20773,20797,20802,20810,20820,20852,20856,20864,20868,20884,20890,20906,20940,20944,20952,20961,20965,20995,20999,21003,21017,21021,21037,21041,21058,21076,21080,21102,21106,21110,21134,21139,21144,21153,21171,21181,21193,21207,21221,21240,21244,21264,21271,21281,21286,21294,21302,21310,21315,21354,21366,21371,21383,21395,21436,21445,21452,21481,21485,21490,21498,21510,21516,21529,21546,21550,21555,21580,21616,21632,21636,21641,21646,21658,21669,21681,21691,21696,21706,21739,21743,21753,21763,21774,21793,21797,21801,21805,21843,21879,21885,21889,21893,21898],{"__ignoreMap":141},[145,20107,20108,20110],{"class":147,"line":148},[145,20109,347],{"class":258},[145,20111,20112],{"class":262}," csv\n",[145,20114,20115,20117],{"class":147,"line":166},[145,20116,347],{"class":258},[145,20118,363],{"class":262},[145,20120,20121,20123],{"class":147,"line":178},[145,20122,347],{"class":258},[145,20124,356],{"class":262},[145,20126,20127,20129],{"class":147,"line":187},[145,20128,347],{"class":258},[145,20130,328],{"class":262},[145,20132,20133,20135,20138,20140],{"class":147,"line":373},[145,20134,6728],{"class":258},[145,20136,20137],{"class":262}," pathlib ",[145,20139,347],{"class":258},[145,20141,20142],{"class":262}," Path\n",[145,20144,20145],{"class":147,"line":379},[145,20146,376],{"emptyLinePlaceholder":58},[145,20148,20149,20151,20153],{"class":147,"line":385},[145,20150,388],{"class":155},[145,20152,391],{"class":258},[145,20154,17601],{"class":159},[145,20156,20157,20159,20161],{"class":147,"line":409},[145,20158,412],{"class":155},[145,20160,391],{"class":258},[145,20162,417],{"class":159},[145,20164,20165,20167,20169,20172,20175],{"class":147,"line":420},[145,20166,6803],{"class":155},[145,20168,391],{"class":258},[145,20170,20171],{"class":262}," Path(",[145,20173,20174],{"class":159},"\"./product_videos\"",[145,20176,406],{"class":262},[145,20178,20179,20181,20184,20186,20188,20190],{"class":147,"line":431},[145,20180,6803],{"class":155},[145,20182,20183],{"class":262},".mkdir(",[145,20185,6829],{"class":701},[145,20187,266],{"class":258},[145,20189,1139],{"class":155},[145,20191,406],{"class":262},[145,20193,20194],{"class":147,"line":455},[145,20195,376],{"emptyLinePlaceholder":58},[145,20197,20198,20200,20202],{"class":147,"line":466},[145,20199,17618],{"class":262},[145,20201,266],{"class":258},[145,20203,428],{"class":262},[145,20205,20206,20208,20210,20212,20214,20216,20218],{"class":147,"line":600},[145,20207,434],{"class":159},[145,20209,437],{"class":262},[145,20211,440],{"class":258},[145,20213,443],{"class":159},[145,20215,446],{"class":155},[145,20217,449],{"class":159},[145,20219,452],{"class":262},[145,20221,20222,20224,20226],{"class":147,"line":605},[145,20223,458],{"class":159},[145,20225,437],{"class":262},[145,20227,463],{"class":159},[145,20229,20230],{"class":147,"line":611},[145,20231,469],{"class":262},[145,20233,20234],{"class":147,"line":617},[145,20235,376],{"emptyLinePlaceholder":58},[145,20237,20238],{"class":147,"line":623},[145,20239,20240],{"class":174},"# Prompt templates keyed by style\n",[145,20242,20243,20246,20248],{"class":147,"line":628},[145,20244,20245],{"class":155},"STYLE_PROMPTS",[145,20247,391],{"class":258},[145,20249,428],{"class":262},[145,20251,20252,20255],{"class":147,"line":639},[145,20253,20254],{"class":159},"    \"rotation\"",[145,20256,1322],{"class":262},[145,20258,20259,20262,20265],{"class":147,"line":654},[145,20260,20261],{"class":159},"        \"@Image1 is a ",[145,20263,20264],{"class":155},"{name}",[145,20266,20267],{"class":159},". The product rotates slowly on a clean surface \"\n",[145,20269,20270],{"class":147,"line":660},[145,20271,20272],{"class":159},"        \"under professional studio lighting. Smooth 360-degree turntable \"\n",[145,20274,20275],{"class":147,"line":671},[145,20276,20277],{"class":159},"        \"rotation. Commercial product showcase quality.\"\n",[145,20279,20280],{"class":147,"line":698},[145,20281,3804],{"class":262},[145,20283,20284,20287],{"class":147,"line":710},[145,20285,20286],{"class":159},"    \"hero\"",[145,20288,1322],{"class":262},[145,20290,20291,20293,20295],{"class":147,"line":716},[145,20292,20261],{"class":159},[145,20294,20264],{"class":155},[145,20296,20297],{"class":159},". The product emerges dramatically from soft \"\n",[145,20299,20300],{"class":147,"line":722},[145,20301,20302],{"class":159},"        \"volumetric fog with a golden backlight. Particles drift upward. \"\n",[145,20304,20305],{"class":147,"line":728},[145,20306,20307],{"class":159},"        \"Cinematic slow reveal. Premium advertisement quality.\"\n",[145,20309,20310],{"class":147,"line":739},[145,20311,3804],{"class":262},[145,20313,20314,20317],{"class":147,"line":744},[145,20315,20316],{"class":159},"    \"lifestyle\"",[145,20318,1322],{"class":262},[145,20320,20321,20323,20325],{"class":147,"line":750},[145,20322,20261],{"class":159},[145,20324,20264],{"class":155},[145,20326,20327],{"class":159},". The product is shown in a natural lifestyle \"\n",[145,20329,20330],{"class":147,"line":767},[145,20331,20332],{"class":159},"        \"setting, being used in an everyday context. Warm natural lighting. \"\n",[145,20334,20335],{"class":147,"line":788},[145,20336,20337],{"class":159},"        \"Shallow depth of field. Authentic lifestyle commercial.\"\n",[145,20339,20340],{"class":147,"line":834},[145,20341,3804],{"class":262},[145,20343,20344,20347],{"class":147,"line":839},[145,20345,20346],{"class":159},"    \"macro\"",[145,20348,1322],{"class":262},[145,20350,20351,20353,20355],{"class":147,"line":845},[145,20352,20261],{"class":159},[145,20354,20264],{"class":155},[145,20356,20357],{"class":159},". Extreme macro close-up. The camera glides \"\n",[145,20359,20360],{"class":147,"line":863},[145,20361,20362],{"class":159},"        \"across the surface, revealing material texture and craftsmanship \"\n",[145,20364,20365],{"class":147,"line":872},[145,20366,20367],{"class":159},"        \"details. Shallow depth of field. Raking directional light. \"\n",[145,20369,20370],{"class":147,"line":887},[145,20371,20372],{"class":159},"        \"Luxury product detail shot.\"\n",[145,20374,20375],{"class":147,"line":903},[145,20376,3804],{"class":262},[145,20378,20379,20382],{"class":147,"line":915},[145,20380,20381],{"class":159},"    \"unboxing\"",[145,20383,1322],{"class":262},[145,20385,20386,20388,20390],{"class":147,"line":953},[145,20387,20261],{"class":159},[145,20389,20264],{"class":155},[145,20391,20392],{"class":159}," in retail packaging. Hands lift the lid to \"\n",[145,20394,20395],{"class":147,"line":959},[145,20396,20397],{"class":159},"        \"reveal the product inside. Tissue paper parts. The product is \"\n",[145,20399,20400],{"class":147,"line":964},[145,20401,20402],{"class":159},"        \"lifted out and displayed. Soft overhead lighting. Premium \"\n",[145,20404,20405],{"class":147,"line":970},[145,20406,20407],{"class":159},"        \"unboxing experience video.\"\n",[145,20409,20410],{"class":147,"line":976},[145,20411,3804],{"class":262},[145,20413,20414],{"class":147,"line":988},[145,20415,469],{"class":262},[145,20417,20418],{"class":147,"line":993},[145,20419,376],{"emptyLinePlaceholder":58},[145,20421,20422,20425,20427],{"class":147,"line":5531},[145,20423,20424],{"class":155},"STYLE_DEFAULTS",[145,20426,391],{"class":258},[145,20428,428],{"class":262},[145,20430,20431,20433,20436,20438,20440,20442,20444,20446,20448,20450],{"class":147,"line":5540},[145,20432,20254],{"class":159},[145,20434,20435],{"class":262},":  {",[145,20437,5966],{"class":159},[145,20439,437],{"class":262},[145,20441,3698],{"class":155},[145,20443,1447],{"class":262},[145,20445,6168],{"class":159},[145,20447,437],{"class":262},[145,20449,1384],{"class":159},[145,20451,19590],{"class":262},[145,20453,20454,20456,20459,20461,20463,20465,20467,20469,20471,20473],{"class":147,"line":5546},[145,20455,20286],{"class":159},[145,20457,20458],{"class":262},":      {",[145,20460,5966],{"class":159},[145,20462,437],{"class":262},[145,20464,537],{"class":155},[145,20466,400],{"class":262},[145,20468,6168],{"class":159},[145,20470,437],{"class":262},[145,20472,1384],{"class":159},[145,20474,19590],{"class":262},[145,20476,20477,20479,20482,20484,20486,20488,20490,20492,20494,20496],{"class":147,"line":5574},[145,20478,20316],{"class":159},[145,20480,20481],{"class":262},": {",[145,20483,5966],{"class":159},[145,20485,437],{"class":262},[145,20487,3698],{"class":155},[145,20489,1447],{"class":262},[145,20491,6168],{"class":159},[145,20493,437],{"class":262},[145,20495,3722],{"class":159},[145,20497,19590],{"class":262},[145,20499,20500,20502,20505,20507,20509,20511,20513,20515,20517,20519],{"class":147,"line":5605},[145,20501,20346],{"class":159},[145,20503,20504],{"class":262},":     {",[145,20506,5966],{"class":159},[145,20508,437],{"class":262},[145,20510,3698],{"class":155},[145,20512,1447],{"class":262},[145,20514,6168],{"class":159},[145,20516,437],{"class":262},[145,20518,1384],{"class":159},[145,20520,19590],{"class":262},[145,20522,20523,20525,20527,20529,20531,20533,20535,20537,20539,20541],{"class":147,"line":5625},[145,20524,20381],{"class":159},[145,20526,20435],{"class":262},[145,20528,5966],{"class":159},[145,20530,437],{"class":262},[145,20532,16408],{"class":155},[145,20534,400],{"class":262},[145,20536,6168],{"class":159},[145,20538,437],{"class":262},[145,20540,3722],{"class":159},[145,20542,19590],{"class":262},[145,20544,20545],{"class":147,"line":5631},[145,20546,469],{"class":262},[145,20548,20549],{"class":147,"line":5637},[145,20550,376],{"emptyLinePlaceholder":58},[145,20552,20553],{"class":147,"line":5642},[145,20554,376],{"emptyLinePlaceholder":58},[145,20556,20557,20559,20562,20565,20567,20570,20572,20575,20577,20579,20581],{"class":147,"line":5655},[145,20558,526],{"class":258},[145,20560,20561],{"class":151}," submit_video_task",[145,20563,20564],{"class":262},"(name: ",[145,20566,8673],{"class":155},[145,20568,20569],{"class":262},", image_url: ",[145,20571,8673],{"class":155},[145,20573,20574],{"class":262},", style: ",[145,20576,8673],{"class":155},[145,20578,15842],{"class":262},[145,20580,8673],{"class":155},[145,20582,860],{"class":262},[145,20584,20585],{"class":147,"line":5661},[145,20586,20587],{"class":159},"    \"\"\"Submit a single video generation task. Returns task_id.\"\"\"\n",[145,20589,20590,20593,20595,20598,20601,20603,20605,20608],{"class":147,"line":5688},[145,20591,20592],{"class":262},"    prompt_template ",[145,20594,266],{"class":258},[145,20596,20597],{"class":155}," STYLE_PROMPTS",[145,20599,20600],{"class":262},".get(style, ",[145,20602,20245],{"class":155},[145,20604,7124],{"class":262},[145,20606,20607],{"class":159},"\"rotation\"",[145,20609,1629],{"class":262},[145,20611,20612,20615,20617,20620,20622,20624,20626,20628],{"class":147,"line":5728},[145,20613,20614],{"class":262},"    defaults ",[145,20616,266],{"class":258},[145,20618,20619],{"class":155}," STYLE_DEFAULTS",[145,20621,20600],{"class":262},[145,20623,20424],{"class":155},[145,20625,7124],{"class":262},[145,20627,20607],{"class":159},[145,20629,1629],{"class":262},[145,20631,20632],{"class":147,"line":5747},[145,20633,376],{"emptyLinePlaceholder":58},[145,20635,20636,20638,20640],{"class":147,"line":5752},[145,20637,1294],{"class":262},[145,20639,266],{"class":258},[145,20641,428],{"class":262},[145,20643,20644,20646,20648,20650],{"class":147,"line":5757},[145,20645,1303],{"class":159},[145,20647,437],{"class":262},[145,20649,1308],{"class":159},[145,20651,452],{"class":262},[145,20653,20654,20656],{"class":147,"line":5762},[145,20655,2688],{"class":159},[145,20657,20658],{"class":262},": [image_url],\n",[145,20660,20661,20663,20666,20669,20671],{"class":147,"line":7442},[145,20662,1319],{"class":159},[145,20664,20665],{"class":262},": prompt_template.format(",[145,20667,20668],{"class":701},"name",[145,20670,266],{"class":258},[145,20672,20673],{"class":262},"name),\n",[145,20675,20676,20678,20681,20683],{"class":147,"line":7448},[145,20677,1347],{"class":159},[145,20679,20680],{"class":262},": defaults[",[145,20682,5966],{"class":159},[145,20684,10847],{"class":262},[145,20686,20687,20689,20691,20693],{"class":147,"line":7459},[145,20688,1363],{"class":159},[145,20690,437],{"class":262},[145,20692,3710],{"class":159},[145,20694,452],{"class":262},[145,20696,20697,20699,20701,20703],{"class":147,"line":7470},[145,20698,1379],{"class":159},[145,20700,20680],{"class":262},[145,20702,6168],{"class":159},[145,20704,10847],{"class":262},[145,20706,20707],{"class":147,"line":7481},[145,20708,1407],{"class":262},[145,20710,20711],{"class":147,"line":7486},[145,20712,376],{"emptyLinePlaceholder":58},[145,20714,20715,20717,20719],{"class":147,"line":7492},[145,20716,1126],{"class":262},[145,20718,266],{"class":258},[145,20720,1432],{"class":262},[145,20722,20723,20725,20727,20729,20731,20733,20735,20737,20740,20742,20744],{"class":147,"line":7500},[145,20724,1437],{"class":258},[145,20726,449],{"class":159},[145,20728,679],{"class":155},[145,20730,1444],{"class":159},[145,20732,400],{"class":262},[145,20734,17830],{"class":701},[145,20736,266],{"class":258},[145,20738,20739],{"class":262},"headers, ",[145,20741,1858],{"class":701},[145,20743,266],{"class":258},[145,20745,2788],{"class":262},[145,20747,20748],{"class":147,"line":7514},[145,20749,1483],{"class":262},[145,20751,20752],{"class":147,"line":7519},[145,20753,1146],{"class":262},[145,20755,20756,20758,20761,20763],{"class":147,"line":7533},[145,20757,1703],{"class":258},[145,20759,20760],{"class":262}," resp.json()[",[145,20762,7693],{"class":159},[145,20764,764],{"class":262},[145,20766,20767],{"class":147,"line":7547},[145,20768,376],{"emptyLinePlaceholder":58},[145,20770,20771],{"class":147,"line":7579},[145,20772,376],{"emptyLinePlaceholder":58},[145,20774,20775,20777,20779,20781,20783,20785,20787,20789,20791,20793,20795],{"class":147,"line":7591},[145,20776,526],{"class":258},[145,20778,11684],{"class":151},[145,20780,17748],{"class":262},[145,20782,8673],{"class":155},[145,20784,17764],{"class":262},[145,20786,17756],{"class":155},[145,20788,391],{"class":258},[145,20790,17771],{"class":155},[145,20792,15842],{"class":262},[145,20794,8798],{"class":155},[145,20796,860],{"class":262},[145,20798,20799],{"class":147,"line":7601},[145,20800,20801],{"class":159},"    \"\"\"Poll until task completes or fails.\"\"\"\n",[145,20803,20804,20806,20808],{"class":147,"line":7606},[145,20805,631],{"class":262},[145,20807,266],{"class":258},[145,20809,636],{"class":155},[145,20811,20812,20814,20816,20818],{"class":147,"line":7613},[145,20813,642],{"class":258},[145,20815,645],{"class":262},[145,20817,648],{"class":258},[145,20819,651],{"class":262},[145,20821,20822,20824,20826,20828,20830,20832,20834,20836,20838,20840,20842,20844,20846,20848,20850],{"class":147,"line":7635},[145,20823,6929],{"class":262},[145,20825,266],{"class":258},[145,20827,17809],{"class":262},[145,20829,440],{"class":258},[145,20831,449],{"class":159},[145,20833,679],{"class":155},[145,20835,682],{"class":159},[145,20837,685],{"class":155},[145,20839,688],{"class":262},[145,20841,691],{"class":155},[145,20843,449],{"class":159},[145,20845,400],{"class":262},[145,20847,17830],{"class":701},[145,20849,266],{"class":258},[145,20851,17835],{"class":262},[145,20853,20854],{"class":147,"line":7666},[145,20855,6956],{"class":262},[145,20857,20858,20860,20862],{"class":147,"line":7671},[145,20859,731],{"class":262},[145,20861,266],{"class":258},[145,20863,11768],{"class":262},[145,20865,20866],{"class":147,"line":7677},[145,20867,376],{"emptyLinePlaceholder":58},[145,20869,20870,20872,20874,20876,20878,20880,20882],{"class":147,"line":7702},[145,20871,848],{"class":258},[145,20873,758],{"class":262},[145,20875,761],{"class":159},[145,20877,14931],{"class":262},[145,20879,854],{"class":258},[145,20881,857],{"class":159},[145,20883,860],{"class":262},[145,20885,20886,20888],{"class":147,"line":7707},[145,20887,866],{"class":258},[145,20889,869],{"class":262},[145,20891,20892,20894,20896,20898,20900,20902,20904],{"class":147,"line":7712},[145,20893,875],{"class":258},[145,20895,758],{"class":262},[145,20897,761],{"class":159},[145,20899,14931],{"class":262},[145,20901,854],{"class":258},[145,20903,882],{"class":159},[145,20905,860],{"class":262},[145,20907,20908,20910,20912,20914,20916,20918,20920,20922,20924,20926,20928,20930,20932,20934,20936,20938],{"class":147,"line":7735},[145,20909,906],{"class":258},[145,20911,909],{"class":155},[145,20913,794],{"class":262},[145,20915,440],{"class":258},[145,20917,921],{"class":159},[145,20919,685],{"class":155},[145,20921,688],{"class":262},[145,20923,691],{"class":155},[145,20925,930],{"class":159},[145,20927,685],{"class":155},[145,20929,17940],{"class":262},[145,20931,11865],{"class":159},[145,20933,108],{"class":262},[145,20935,691],{"class":155},[145,20937,449],{"class":159},[145,20939,406],{"class":262},[145,20941,20942],{"class":147,"line":7745},[145,20943,376],{"emptyLinePlaceholder":58},[145,20945,20946,20948,20950],{"class":147,"line":7751},[145,20947,15068],{"class":262},[145,20949,1352],{"class":155},[145,20951,406],{"class":262},[145,20953,20954,20956,20958],{"class":147,"line":7769},[145,20955,979],{"class":262},[145,20957,982],{"class":258},[145,20959,20960],{"class":155}," 5\n",[145,20962,20963],{"class":147,"line":7774},[145,20964,376],{"emptyLinePlaceholder":58},[145,20966,20967,20969,20971,20973,20975,20977,20979,20981,20983,20985,20987,20989,20991,20993],{"class":147,"line":7779},[145,20968,996],{"class":258},[145,20970,999],{"class":155},[145,20972,794],{"class":262},[145,20974,440],{"class":258},[145,20976,921],{"class":159},[145,20978,685],{"class":155},[145,20980,688],{"class":262},[145,20982,691],{"class":155},[145,20984,1014],{"class":159},[145,20986,685],{"class":155},[145,20988,1019],{"class":262},[145,20990,691],{"class":155},[145,20992,1024],{"class":159},[145,20994,406],{"class":262},[145,20996,20997],{"class":147,"line":7792},[145,20998,376],{"emptyLinePlaceholder":58},[145,21000,21001],{"class":147,"line":7806},[145,21002,376],{"emptyLinePlaceholder":58},[145,21004,21005,21007,21009,21012,21014],{"class":147,"line":7833},[145,21006,526],{"class":258},[145,21008,1082],{"class":151},[145,21010,21011],{"class":262},"(url: ",[145,21013,8673],{"class":155},[145,21015,21016],{"class":262},", filepath: Path):\n",[145,21018,21019],{"class":147,"line":7847},[145,21020,1097],{"class":159},[145,21022,21023,21025,21027,21029,21031,21033,21035],{"class":147,"line":10367},[145,21024,1126],{"class":262},[145,21026,266],{"class":258},[145,21028,1131],{"class":262},[145,21030,1134],{"class":701},[145,21032,266],{"class":258},[145,21034,1139],{"class":155},[145,21036,406],{"class":262},[145,21038,21039],{"class":147,"line":10374},[145,21040,1146],{"class":262},[145,21042,21043,21045,21047,21050,21052,21054,21056],{"class":147,"line":10420},[145,21044,1151],{"class":258},[145,21046,1154],{"class":155},[145,21048,21049],{"class":262},"(filepath, ",[145,21051,1160],{"class":159},[145,21053,1163],{"class":262},[145,21055,1166],{"class":258},[145,21057,1169],{"class":262},[145,21059,21060,21062,21064,21066,21068,21070,21072,21074],{"class":147,"line":10425},[145,21061,1174],{"class":258},[145,21063,1177],{"class":262},[145,21065,1180],{"class":258},[145,21067,1183],{"class":262},[145,21069,1186],{"class":701},[145,21071,266],{"class":258},[145,21073,1191],{"class":155},[145,21075,548],{"class":262},[145,21077,21078],{"class":147,"line":10430},[145,21079,1198],{"class":262},[145,21081,21082,21084,21086,21088,21091,21093,21096,21098,21100],{"class":147,"line":10439},[145,21083,1102],{"class":155},[145,21085,794],{"class":262},[145,21087,440],{"class":258},[145,21089,21090],{"class":159},"\"💾 Saved: ",[145,21092,685],{"class":155},[145,21094,21095],{"class":262},"filepath",[145,21097,691],{"class":155},[145,21099,449],{"class":159},[145,21101,406],{"class":262},[145,21103,21104],{"class":147,"line":10445},[145,21105,376],{"emptyLinePlaceholder":58},[145,21107,21108],{"class":147,"line":10454},[145,21109,376],{"emptyLinePlaceholder":58},[145,21111,21112,21114,21117,21120,21122,21125,21127,21129,21132],{"class":147,"line":10475},[145,21113,526],{"class":258},[145,21115,21116],{"class":151}," process_catalog",[145,21118,21119],{"class":262},"(csv_path: ",[145,21121,8673],{"class":155},[145,21123,21124],{"class":262},", max_retries: ",[145,21126,17756],{"class":155},[145,21128,391],{"class":258},[145,21130,21131],{"class":155}," 2",[145,21133,548],{"class":262},[145,21135,21136],{"class":147,"line":10484},[145,21137,21138],{"class":159},"    \"\"\"Process an entire product catalog CSV into videos.\"\"\"\n",[145,21140,21141],{"class":147,"line":10489},[145,21142,21143],{"class":174},"    # Phase 1: Submit all tasks\n",[145,21145,21146,21149,21151],{"class":147,"line":10502},[145,21147,21148],{"class":262},"    pending ",[145,21150,266],{"class":258},[145,21152,5876],{"class":262},[145,21154,21155,21157,21159,21162,21165,21167,21169],{"class":147,"line":10524},[145,21156,1151],{"class":258},[145,21158,1154],{"class":155},[145,21160,21161],{"class":262},"(csv_path, ",[145,21163,21164],{"class":159},"\"r\"",[145,21166,1163],{"class":262},[145,21168,1166],{"class":258},[145,21170,1169],{"class":262},[145,21172,21173,21176,21178],{"class":147,"line":10531},[145,21174,21175],{"class":262},"        reader ",[145,21177,266],{"class":258},[145,21179,21180],{"class":262}," csv.DictReader(f)\n",[145,21182,21183,21185,21188,21190],{"class":147,"line":10552},[145,21184,1174],{"class":258},[145,21186,21187],{"class":262}," row ",[145,21189,1180],{"class":258},[145,21191,21192],{"class":262}," reader:\n",[145,21194,21195,21198,21200,21203,21205],{"class":147,"line":10557},[145,21196,21197],{"class":262},"            name ",[145,21199,266],{"class":258},[145,21201,21202],{"class":262}," row[",[145,21204,19565],{"class":159},[145,21206,764],{"class":262},[145,21208,21209,21212,21214,21216,21219],{"class":147,"line":10562},[145,21210,21211],{"class":262},"            image_url ",[145,21213,266],{"class":258},[145,21215,21202],{"class":262},[145,21217,21218],{"class":159},"\"image_url\"",[145,21220,764],{"class":262},[145,21222,21223,21226,21228,21231,21234,21236,21238],{"class":147,"line":10568},[145,21224,21225],{"class":262},"            style ",[145,21227,266],{"class":258},[145,21229,21230],{"class":262}," row.get(",[145,21232,21233],{"class":159},"\"style\"",[145,21235,400],{"class":262},[145,21237,20607],{"class":159},[145,21239,406],{"class":262},[145,21241,21242],{"class":147,"line":10577},[145,21243,376],{"emptyLinePlaceholder":58},[145,21245,21246,21248,21250,21252,21254,21257,21259,21262],{"class":147,"line":10586},[145,21247,6978],{"class":258},[145,21249,5122],{"class":262},[145,21251,1180],{"class":258},[145,21253,5127],{"class":155},[145,21255,21256],{"class":262},"(max_retries ",[145,21258,5427],{"class":258},[145,21260,21261],{"class":155}," 1",[145,21263,548],{"class":262},[145,21265,21266,21269],{"class":147,"line":10597},[145,21267,21268],{"class":258},"                try",[145,21270,860],{"class":262},[145,21272,21273,21276,21278],{"class":147,"line":10604},[145,21274,21275],{"class":262},"                    task_id ",[145,21277,266],{"class":258},[145,21279,21280],{"class":262}," submit_video_task(name, image_url, style)\n",[145,21282,21283],{"class":147,"line":10609},[145,21284,21285],{"class":262},"                    pending.append({\n",[145,21287,21288,21291],{"class":147,"line":10614},[145,21289,21290],{"class":159},"                        \"name\"",[145,21292,21293],{"class":262},": name,\n",[145,21295,21296,21299],{"class":147,"line":10619},[145,21297,21298],{"class":159},"                        \"task_id\"",[145,21300,21301],{"class":262},": task_id,\n",[145,21303,21304,21307],{"class":147,"line":10624},[145,21305,21306],{"class":159},"                        \"style\"",[145,21308,21309],{"class":262},": style,\n",[145,21311,21312],{"class":147,"line":10635},[145,21313,21314],{"class":262},"                    })\n",[145,21316,21317,21320,21322,21324,21327,21329,21331,21333,21335,21337,21339,21341,21344,21346,21348,21350,21352],{"class":147,"line":10646},[145,21318,21319],{"class":155},"                    print",[145,21321,794],{"class":262},[145,21323,440],{"class":258},[145,21325,21326],{"class":159},"\"🎬 Submitted: ",[145,21328,685],{"class":155},[145,21330,20668],{"class":262},[145,21332,691],{"class":155},[145,21334,1218],{"class":159},[145,21336,685],{"class":155},[145,21338,11217],{"class":262},[145,21340,691],{"class":155},[145,21342,21343],{"class":159},") → ",[145,21345,685],{"class":155},[145,21347,688],{"class":262},[145,21349,691],{"class":155},[145,21351,449],{"class":159},[145,21353,406],{"class":262},[145,21355,21356,21359,21361,21363],{"class":147,"line":10657},[145,21357,21358],{"class":262},"                    time.sleep(",[145,21360,5437],{"class":155},[145,21362,19907],{"class":262},[145,21364,21365],{"class":174},"# Rate limiting: 1 request per second\n",[145,21367,21368],{"class":147,"line":10666},[145,21369,21370],{"class":258},"                    break\n",[145,21372,21373,21376,21379,21381],{"class":147,"line":10671},[145,21374,21375],{"class":258},"                except",[145,21377,21378],{"class":262}," requests.exceptions.RequestException ",[145,21380,1166],{"class":258},[145,21382,5652],{"class":262},[145,21384,21385,21388,21390,21392],{"class":147,"line":10677},[145,21386,21387],{"class":258},"                    if",[145,21389,5122],{"class":262},[145,21391,648],{"class":258},[145,21393,21394],{"class":262}," max_retries:\n",[145,21396,21397,21400,21402,21404,21407,21409,21411,21413,21415,21418,21420,21422,21424,21426,21428,21430,21432,21434],{"class":147,"line":10686},[145,21398,21399],{"class":155},"                        print",[145,21401,794],{"class":262},[145,21403,440],{"class":258},[145,21405,21406],{"class":159},"\"⚠️  Retry ",[145,21408,685],{"class":155},[145,21410,5456],{"class":262},[145,21412,5427],{"class":258},[145,21414,5461],{"class":155},[145,21416,21417],{"class":159}," for ",[145,21419,685],{"class":155},[145,21421,20668],{"class":262},[145,21423,691],{"class":155},[145,21425,437],{"class":159},[145,21427,685],{"class":155},[145,21429,5702],{"class":262},[145,21431,691],{"class":155},[145,21433,449],{"class":159},[145,21435,406],{"class":262},[145,21437,21438,21441,21443],{"class":147,"line":10730},[145,21439,21440],{"class":262},"                        time.sleep(",[145,21442,5056],{"class":155},[145,21444,406],{"class":262},[145,21446,21447,21450],{"class":147,"line":10743},[145,21448,21449],{"class":258},"                    else",[145,21451,860],{"class":262},[145,21453,21454,21456,21458,21460,21463,21465,21467,21469,21471,21473,21475,21477,21479],{"class":147,"line":10763},[145,21455,21399],{"class":155},[145,21457,794],{"class":262},[145,21459,440],{"class":258},[145,21461,21462],{"class":159},"\"❌ Failed to submit ",[145,21464,685],{"class":155},[145,21466,20668],{"class":262},[145,21468,691],{"class":155},[145,21470,437],{"class":159},[145,21472,685],{"class":155},[145,21474,5702],{"class":262},[145,21476,691],{"class":155},[145,21478,449],{"class":159},[145,21480,406],{"class":262},[145,21482,21483],{"class":147,"line":10768},[145,21484,376],{"emptyLinePlaceholder":58},[145,21486,21487],{"class":147,"line":10773},[145,21488,21489],{"class":174},"    # Phase 2: Collect results\n",[145,21491,21492,21494,21496],{"class":147,"line":10779},[145,21493,8439],{"class":262},[145,21495,266],{"class":258},[145,21497,5876],{"class":262},[145,21499,21500,21502,21505,21507],{"class":147,"line":10788},[145,21501,5119],{"class":258},[145,21503,21504],{"class":262}," item ",[145,21506,1180],{"class":258},[145,21508,21509],{"class":262}," pending:\n",[145,21511,21512,21514],{"class":147,"line":10797},[145,21513,5135],{"class":258},[145,21515,860],{"class":262},[145,21517,21518,21520,21522,21525,21527],{"class":147,"line":10808},[145,21519,8528],{"class":262},[145,21521,266],{"class":258},[145,21523,21524],{"class":262}," poll_task(item[",[145,21526,7693],{"class":159},[145,21528,1629],{"class":262},[145,21530,21531,21533,21535,21537,21540,21542,21544],{"class":147,"line":10815},[145,21532,7404],{"class":262},[145,21534,266],{"class":258},[145,21536,758],{"class":262},[145,21538,21539],{"class":159},"\"output\"",[145,21541,1562],{"class":262},[145,21543,14953],{"class":159},[145,21545,764],{"class":262},[145,21547,21548],{"class":147,"line":10820},[145,21549,376],{"emptyLinePlaceholder":58},[145,21551,21552],{"class":147,"line":10825},[145,21553,21554],{"class":174},"            # Generate safe filename\n",[145,21556,21557,21560,21562,21565,21567,21570,21573,21575,21578],{"class":147,"line":10831},[145,21558,21559],{"class":262},"            safe_name ",[145,21561,266],{"class":258},[145,21563,21564],{"class":262}," item[",[145,21566,19565],{"class":159},[145,21568,21569],{"class":262},"].lower().replace(",[145,21571,21572],{"class":159},"\" \"",[145,21574,400],{"class":262},[145,21576,21577],{"class":159},"\"-\"",[145,21579,406],{"class":262},[145,21581,21582,21585,21587,21589,21591,21593,21596,21598,21601,21603,21606,21609,21611,21613],{"class":147,"line":10836},[145,21583,21584],{"class":262},"            filename ",[145,21586,266],{"class":258},[145,21588,3358],{"class":258},[145,21590,449],{"class":159},[145,21592,685],{"class":155},[145,21594,21595],{"class":262},"safe_name",[145,21597,691],{"class":155},[145,21599,21600],{"class":159},"_",[145,21602,685],{"class":155},[145,21604,21605],{"class":262},"item[",[145,21607,21608],{"class":159},"'style'",[145,21610,1535],{"class":262},[145,21612,691],{"class":155},[145,21614,21615],{"class":159},".mp4\"\n",[145,21617,21618,21621,21623,21626,21629],{"class":147,"line":10850},[145,21619,21620],{"class":262},"            filepath ",[145,21622,266],{"class":258},[145,21624,21625],{"class":155}," OUTPUT_DIR",[145,21627,21628],{"class":258}," /",[145,21630,21631],{"class":262}," filename\n",[145,21633,21634],{"class":147,"line":10861},[145,21635,376],{"emptyLinePlaceholder":58},[145,21637,21638],{"class":147,"line":10870},[145,21639,21640],{"class":262},"            download_video(video_url, filepath)\n",[145,21642,21643],{"class":147,"line":10875},[145,21644,21645],{"class":262},"            results.append({\n",[145,21647,21648,21651,21654,21656],{"class":147,"line":10880},[145,21649,21650],{"class":159},"                \"name\"",[145,21652,21653],{"class":262},": item[",[145,21655,19565],{"class":159},[145,21657,10847],{"class":262},[145,21659,21660,21663,21665,21667],{"class":147,"line":10889},[145,21661,21662],{"class":159},"                \"style\"",[145,21664,21653],{"class":262},[145,21666,21233],{"class":159},[145,21668,10847],{"class":262},[145,21670,21671,21674,21676,21678],{"class":147,"line":10914},[145,21672,21673],{"class":159},"                \"file\"",[145,21675,437],{"class":262},[145,21677,8673],{"class":155},[145,21679,21680],{"class":262},"(filepath),\n",[145,21682,21683,21686,21688],{"class":147,"line":10927},[145,21684,21685],{"class":159},"                \"status\"",[145,21687,437],{"class":262},[145,21689,21690],{"class":159},"\"success\"\n",[145,21692,21693],{"class":147,"line":10945},[145,21694,21695],{"class":262},"            })\n",[145,21697,21698,21700,21702,21704],{"class":147,"line":10950},[145,21699,5534],{"class":258},[145,21701,7062],{"class":155},[145,21703,7065],{"class":258},[145,21705,5652],{"class":262},[145,21707,21708,21710,21712,21714,21717,21719,21721,21723,21725,21727,21729,21731,21733,21735,21737],{"class":147,"line":10955},[145,21709,5577],{"class":155},[145,21711,794],{"class":262},[145,21713,440],{"class":258},[145,21715,21716],{"class":159},"\"❌ Failed: ",[145,21718,685],{"class":155},[145,21720,21605],{"class":262},[145,21722,19862],{"class":159},[145,21724,1535],{"class":262},[145,21726,691],{"class":155},[145,21728,437],{"class":159},[145,21730,685],{"class":155},[145,21732,5702],{"class":262},[145,21734,691],{"class":155},[145,21736,449],{"class":159},[145,21738,406],{"class":262},[145,21740,21741],{"class":147,"line":10961},[145,21742,21645],{"class":262},[145,21744,21745,21747,21749,21751],{"class":147,"line":10971},[145,21746,21650],{"class":159},[145,21748,21653],{"class":262},[145,21750,19565],{"class":159},[145,21752,10847],{"class":262},[145,21754,21755,21757,21759,21761],{"class":147,"line":10980},[145,21756,21662],{"class":159},[145,21758,21653],{"class":262},[145,21760,21233],{"class":159},[145,21762,10847],{"class":262},[145,21764,21765,21767,21769,21772],{"class":147,"line":10991},[145,21766,21673],{"class":159},[145,21768,437],{"class":262},[145,21770,21771],{"class":155},"None",[145,21773,452],{"class":262},[145,21775,21776,21778,21780,21782,21785,21787,21789,21791],{"class":147,"line":10998},[145,21777,21685],{"class":159},[145,21779,437],{"class":262},[145,21781,440],{"class":258},[145,21783,21784],{"class":159},"\"error: ",[145,21786,685],{"class":155},[145,21788,5702],{"class":262},[145,21790,691],{"class":155},[145,21792,950],{"class":159},[145,21794,21795],{"class":147,"line":11004},[145,21796,21695],{"class":262},[145,21798,21799],{"class":147,"line":11010},[145,21800,376],{"emptyLinePlaceholder":58},[145,21802,21803],{"class":147,"line":11015},[145,21804,8763],{"class":174},[145,21806,21807,21810,21812,21814,21816,21818,21820,21823,21825,21827,21829,21832,21834,21836,21838,21841],{"class":147,"line":11026},[145,21808,21809],{"class":262},"    success ",[145,21811,266],{"class":258},[145,21813,8773],{"class":155},[145,21815,794],{"class":262},[145,21817,5437],{"class":155},[145,21819,6394],{"class":258},[145,21821,21822],{"class":262}," r ",[145,21824,1180],{"class":258},[145,21826,8787],{"class":262},[145,21828,1719],{"class":258},[145,21830,21831],{"class":262}," r[",[145,21833,761],{"class":159},[145,21835,14931],{"class":262},[145,21837,854],{"class":258},[145,21839,21840],{"class":159}," \"success\"",[145,21842,406],{"class":262},[145,21844,21845,21847,21849,21851,21853,21855,21858,21860,21863,21865,21867,21869,21872,21874,21877],{"class":147,"line":11037},[145,21846,1102],{"class":155},[145,21848,794],{"class":262},[145,21850,440],{"class":258},[145,21852,449],{"class":159},[145,21854,1670],{"class":155},[145,21856,21857],{"class":159},"📊 Complete: ",[145,21859,685],{"class":155},[145,21861,21862],{"class":262},"success",[145,21864,691],{"class":155},[145,21866,1226],{"class":159},[145,21868,6270],{"class":155},[145,21870,21871],{"class":262},"(results)",[145,21873,691],{"class":155},[145,21875,21876],{"class":159}," videos generated\"",[145,21878,406],{"class":262},[145,21880,21881,21883],{"class":147,"line":11048},[145,21882,1703],{"class":258},[145,21884,8844],{"class":262},[145,21886,21887],{"class":147,"line":11057},[145,21888,376],{"emptyLinePlaceholder":58},[145,21890,21891],{"class":147,"line":11062},[145,21892,376],{"emptyLinePlaceholder":58},[145,21894,21895],{"class":147,"line":11067},[145,21896,21897],{"class":174},"# Run it\n",[145,21899,21900,21903,21905,21908,21911],{"class":147,"line":11076},[145,21901,21902],{"class":262},"results ",[145,21904,266],{"class":258},[145,21906,21907],{"class":262}," process_catalog(",[145,21909,21910],{"class":159},"\"products.csv\"",[145,21912,406],{"class":262},[11,21914,21915],{},"The pipeline operates in two phases. Phase 1 submits all tasks rapidly (with rate limiting), storing task IDs. Phase 2 polls each task and downloads the result. This maximizes parallelism — all videos generate simultaneously on the server side.",[92,21917,21919],{"id":21918},"using-callbacks-instead-of-polling","Using Callbacks Instead of Polling",[11,21921,21922,21923,21925,21926,21929],{},"For larger catalogs (100+ products), polling becomes inefficient. Use the ",[28,21924,3601],{}," parameter to receive a webhook when each video completes. Refer to the ",[37,21927,21928],{"href":14385},"API docs for callback parameters"," for the full webhook payload specification.",[136,21931,21933],{"className":338,"code":21932,"language":340,"meta":141,"style":141},"payload = {\n    \"model\": \"seedance-2.0\",\n    \"image_urls\": [\"https://your-cdn.com/products/item.jpg\"],\n    \"prompt\": \"@Image1 is a product. Smooth rotation. Studio lighting.\",\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\",\n    \"callback_url\": \"https://your-server.com/webhooks/video-ready\"\n}\n",[28,21934,21935,21943,21953,21964,21975,21985,21995,22005,22014],{"__ignoreMap":141},[145,21936,21937,21939,21941],{"class":147,"line":148},[145,21938,3661],{"class":262},[145,21940,266],{"class":258},[145,21942,428],{"class":262},[145,21944,21945,21947,21949,21951],{"class":147,"line":166},[145,21946,3670],{"class":159},[145,21948,437],{"class":262},[145,21950,1308],{"class":159},[145,21952,452],{"class":262},[145,21954,21955,21957,21959,21962],{"class":147,"line":178},[145,21956,15386],{"class":159},[145,21958,10841],{"class":262},[145,21960,21961],{"class":159},"\"https://your-cdn.com/products/item.jpg\"",[145,21963,10847],{"class":262},[145,21965,21966,21968,21970,21973],{"class":147,"line":187},[145,21967,3681],{"class":159},[145,21969,437],{"class":262},[145,21971,21972],{"class":159},"\"@Image1 is a product. Smooth rotation. Studio lighting.\"",[145,21974,452],{"class":262},[145,21976,21977,21979,21981,21983],{"class":147,"line":373},[145,21978,3693],{"class":159},[145,21980,437],{"class":262},[145,21982,3698],{"class":155},[145,21984,452],{"class":262},[145,21986,21987,21989,21991,21993],{"class":147,"line":379},[145,21988,3705],{"class":159},[145,21990,437],{"class":262},[145,21992,3710],{"class":159},[145,21994,452],{"class":262},[145,21996,21997,21999,22001,22003],{"class":147,"line":385},[145,21998,3717],{"class":159},[145,22000,437],{"class":262},[145,22002,1384],{"class":159},[145,22004,452],{"class":262},[145,22006,22007,22009,22011],{"class":147,"line":409},[145,22008,6511],{"class":159},[145,22010,437],{"class":262},[145,22012,22013],{"class":159},"\"https://your-server.com/webhooks/video-ready\"\n",[145,22015,22016],{"class":147,"line":420},[145,22017,469],{"class":262},[11,22019,22020],{},"Your webhook endpoint receives a POST with the completed task object, including the video URL. This eliminates polling entirely and lets you process results asynchronously — download the video, update your product database, and push to your CDN in a single webhook handler.",[92,22022,22024],{"id":22023},"pipeline-tips","Pipeline Tips",[97,22026,22027,22033,22039,22045,22055,22061],{},[73,22028,22029,22032],{},[23,22030,22031],{},"Rate limiting:"," Keep requests to 1 per second. Burst submissions can trigger throttling.",[73,22034,22035,22038],{},[23,22036,22037],{},"Video URL expiry:"," Download within 24 hours. The pipeline above downloads immediately, but if you use callbacks, ensure your webhook handler downloads promptly.",[73,22040,22041,22044],{},[23,22042,22043],{},"Retry logic:"," Network errors happen. The pipeline retries failed submissions up to twice with a 3-second backoff.",[73,22046,22047,22050,22051,22054],{},[23,22048,22049],{},"Organize output:"," The filename convention ",[28,22052,22053],{},"{product-name}_{style}.mp4"," keeps your video library browsable. Add the aspect ratio to the filename if generating multiple ratios per product.",[73,22056,22057,22060],{},[23,22058,22059],{},"Idempotency:"," Track which products already have videos. Before submitting a task, check if the output file already exists. This prevents duplicate generation when re-running the pipeline after partial failures.",[73,22062,22063,22066,22067,22070],{},[23,22064,22065],{},"Cost monitoring:"," Log the number of videos generated per run. At a few cents per video, costs stay low, but runaway loops or misconfigured CSVs can submit thousands of requests unintentionally. Add a confirmation prompt or a ",[28,22068,22069],{},"--dry-run"," flag.",[92,22072,22074],{"id":22073},"scaling-beyond-the-basics","Scaling Beyond the Basics",[11,22076,22077],{},"For catalogs over 1,000 SKUs, consider these enhancements:",[11,22079,22080,22083,22084,22087],{},[23,22081,22082],{},"Concurrent polling."," The pipeline above polls tasks sequentially. Use Python's ",[28,22085,22086],{},"concurrent.futures.ThreadPoolExecutor"," to poll multiple tasks in parallel, reducing total wall-clock time.",[11,22089,22090,22093,22094,22096],{},[23,22091,22092],{},"Database tracking."," Replace the in-memory ",[28,22095,2260],{}," list with a SQLite database or a simple JSON file that persists across runs. Track task IDs, completion status, output file paths, and timestamps. This makes the pipeline resumable after interruptions.",[11,22098,22099,22102],{},[23,22100,22101],{},"CDN upload."," After downloading, automatically upload to your CDN (S3, CloudFront, Cloudflare R2) and store the public URL. This eliminates the manual step of transferring files to your hosting infrastructure.",[11,22104,22105,22108],{},[23,22106,22107],{},"Metadata generation."," Generate a JSON manifest alongside the videos, containing product name, video type, aspect ratio, duration, and CDN URL. This manifest feeds directly into your CMS or product information management (PIM) system for automated listing updates.",[48,22110,22112],{"id":22111},"prompt-template-library-for-e-commerce","Prompt Template Library for E-commerce",[11,22114,22115,22116,22118],{},"Copy-paste prompts for the most common e-commerce product categories. Each template is designed for the specified product type and can be used directly with any product photo in that category. Swap the product name in the ",[28,22117,20264],{}," placeholder.",[136,22120,22122],{"className":338,"code":22121,"language":340,"meta":141,"style":141},"ECOMMERCE_PROMPTS = {\n    \"jewelry\": {\n        \"prompt\": (\n            \"@Image1 is {name}. Extreme close-up on a black velvet surface. \"\n            \"The piece rotates slowly under pinpoint spotlights. Light refracts \"\n            \"through gemstones, casting prismatic reflections. Shallow depth of \"\n            \"field. The camera pulls back to reveal the full piece. Luxury \"\n            \"jewelry advertisement quality.\"\n        ),\n        \"duration\": 10,\n        \"aspect_ratio\": \"1:1\",\n    },\n    \"electronics\": {\n        \"prompt\": (\n            \"@Image1 is {name}. The device sits on a minimal desk setup. \"\n            \"Screen illuminates, casting a soft glow. Camera orbits slowly, \"\n            \"showing ports, buttons, and build quality from every angle. \"\n            \"Clean, modern aesthetic. Tech product showcase.\"\n        ),\n        \"duration\": 10,\n        \"aspect_ratio\": \"16:9\",\n    },\n    \"apparel\": {\n        \"prompt\": (\n            \"@Image1 is {name}. The garment is displayed on an invisible \"\n            \"mannequin form, rotating slowly. Fabric moves naturally with \"\n            \"gentle airflow, showing drape and texture. Soft diffused \"\n            \"studio lighting. Clean white background. Fashion e-commerce \"\n            \"product video.\"\n        ),\n        \"duration\": 8,\n        \"aspect_ratio\": \"9:16\",\n    },\n    \"food_beverage\": {\n        \"prompt\": (\n            \"@Image1 is {name}. Steam rises gently. Camera pushes in slowly \"\n            \"from a wide tabletop shot to an appetizing close-up. Warm, \"\n            \"golden-hour lighting. Shallow depth of field. Ingredients or \"\n            \"garnishes are visible in beautiful detail. Food photography \"\n            \"in motion.\"\n        ),\n        \"duration\": 8,\n        \"aspect_ratio\": \"1:1\",\n    },\n    \"furniture\": {\n        \"prompt\": (\n            \"@Image1 is {name}. Placed in a styled modern living room with \"\n            \"natural light streaming through large windows. Camera dollies \"\n            \"slowly around the piece, showing form and proportion in context. \"\n            \"Warm afternoon light. Interior design showcase quality.\"\n        ),\n        \"duration\": 10,\n        \"aspect_ratio\": \"16:9\",\n    },\n    \"cosmetics\": {\n        \"prompt\": (\n            \"@Image1 is {name}. The product sits on a marble surface with \"\n            \"soft pink and gold tones. A gentle pour or squeeze dispenses \"\n            \"the product, showing color and texture. Macro close-up of the \"\n            \"formula. Smooth, luxurious pacing. Beauty brand advertisement.\"\n        ),\n        \"duration\": 8,\n        \"aspect_ratio\": \"9:16\",\n    },\n    \"sports_gear\": {\n        \"prompt\": (\n            \"@Image1 is {name}. Dynamic presentation against a dark \"\n            \"background with dramatic side lighting. The product rotates \"\n            \"with energy — quick cuts between angles showing key features. \"\n            \"Subtle motion graphics energy. Athletic brand commercial style.\"\n        ),\n        \"duration\": 8,\n        \"aspect_ratio\": \"16:9\",\n    },\n    \"home_decor\": {\n        \"prompt\": (\n            \"@Image1 is {name}. Displayed in a curated shelf vignette with \"\n            \"complementary objects. Soft natural light. Camera slowly racks \"\n            \"focus from background to the product. Cozy, aspirational \"\n            \"interior styling. Lifestyle brand aesthetic.\"\n        ),\n        \"duration\": 8,\n        \"aspect_ratio\": \"1:1\",\n    },\n}\n\n\ndef generate_from_template(category: str, name: str, image_url: str) -> dict:\n    \"\"\"Generate a video using a category-specific prompt template.\"\"\"\n    template = ECOMMERCE_PROMPTS[category]\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"image_urls\": [image_url],\n        \"prompt\": template[\"prompt\"].format(name=name),\n        \"duration\": template[\"duration\"],\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": template[\"aspect_ratio\"],\n    }\n    return create_and_wait(payload)\n\n\n# Example usage\nresult = generate_from_template(\n    category=\"jewelry\",\n    name=\"18K gold pendant necklace with emerald\",\n    image_url=\"https://your-cdn.com/products/emerald-pendant.jpg\"\n)\n",[28,22123,22124,22133,22140,22146,22156,22161,22166,22171,22176,22180,22190,22200,22205,22212,22218,22227,22232,22237,22242,22246,22256,22266,22270,22277,22283,22292,22297,22302,22307,22312,22316,22326,22336,22340,22347,22353,22362,22367,22372,22377,22382,22386,22396,22406,22410,22417,22423,22432,22437,22442,22447,22451,22461,22471,22475,22482,22488,22497,22502,22507,22512,22516,22526,22536,22540,22547,22553,22562,22567,22572,22577,22581,22591,22601,22605,22612,22618,22627,22632,22637,22642,22646,22656,22666,22670,22674,22678,22682,22709,22714,22727,22735,22745,22751,22769,22779,22789,22799,22803,22809,22813,22817,22821,22830,22842,22854,22864],{"__ignoreMap":141},[145,22125,22126,22129,22131],{"class":147,"line":148},[145,22127,22128],{"class":155},"ECOMMERCE_PROMPTS",[145,22130,391],{"class":258},[145,22132,428],{"class":262},[145,22134,22135,22138],{"class":147,"line":166},[145,22136,22137],{"class":159},"    \"jewelry\"",[145,22139,1943],{"class":262},[145,22141,22142,22144],{"class":147,"line":178},[145,22143,1319],{"class":159},[145,22145,1322],{"class":262},[145,22147,22148,22151,22153],{"class":147,"line":187},[145,22149,22150],{"class":159},"            \"@Image1 is ",[145,22152,20264],{"class":155},[145,22154,22155],{"class":159},". Extreme close-up on a black velvet surface. \"\n",[145,22157,22158],{"class":147,"line":373},[145,22159,22160],{"class":159},"            \"The piece rotates slowly under pinpoint spotlights. Light refracts \"\n",[145,22162,22163],{"class":147,"line":379},[145,22164,22165],{"class":159},"            \"through gemstones, casting prismatic reflections. Shallow depth of \"\n",[145,22167,22168],{"class":147,"line":385},[145,22169,22170],{"class":159},"            \"field. The camera pulls back to reveal the full piece. Luxury \"\n",[145,22172,22173],{"class":147,"line":409},[145,22174,22175],{"class":159},"            \"jewelry advertisement quality.\"\n",[145,22177,22178],{"class":147,"line":420},[145,22179,1342],{"class":262},[145,22181,22182,22184,22186,22188],{"class":147,"line":431},[145,22183,1347],{"class":159},[145,22185,437],{"class":262},[145,22187,537],{"class":155},[145,22189,452],{"class":262},[145,22191,22192,22194,22196,22198],{"class":147,"line":455},[145,22193,1379],{"class":159},[145,22195,437],{"class":262},[145,22197,6140],{"class":159},[145,22199,452],{"class":262},[145,22201,22202],{"class":147,"line":466},[145,22203,22204],{"class":262},"    },\n",[145,22206,22207,22210],{"class":147,"line":600},[145,22208,22209],{"class":159},"    \"electronics\"",[145,22211,1943],{"class":262},[145,22213,22214,22216],{"class":147,"line":605},[145,22215,1319],{"class":159},[145,22217,1322],{"class":262},[145,22219,22220,22222,22224],{"class":147,"line":611},[145,22221,22150],{"class":159},[145,22223,20264],{"class":155},[145,22225,22226],{"class":159},". The device sits on a minimal desk setup. \"\n",[145,22228,22229],{"class":147,"line":617},[145,22230,22231],{"class":159},"            \"Screen illuminates, casting a soft glow. Camera orbits slowly, \"\n",[145,22233,22234],{"class":147,"line":623},[145,22235,22236],{"class":159},"            \"showing ports, buttons, and build quality from every angle. \"\n",[145,22238,22239],{"class":147,"line":628},[145,22240,22241],{"class":159},"            \"Clean, modern aesthetic. Tech product showcase.\"\n",[145,22243,22244],{"class":147,"line":639},[145,22245,1342],{"class":262},[145,22247,22248,22250,22252,22254],{"class":147,"line":654},[145,22249,1347],{"class":159},[145,22251,437],{"class":262},[145,22253,537],{"class":155},[145,22255,452],{"class":262},[145,22257,22258,22260,22262,22264],{"class":147,"line":660},[145,22259,1379],{"class":159},[145,22261,437],{"class":262},[145,22263,1384],{"class":159},[145,22265,452],{"class":262},[145,22267,22268],{"class":147,"line":671},[145,22269,22204],{"class":262},[145,22271,22272,22275],{"class":147,"line":698},[145,22273,22274],{"class":159},"    \"apparel\"",[145,22276,1943],{"class":262},[145,22278,22279,22281],{"class":147,"line":710},[145,22280,1319],{"class":159},[145,22282,1322],{"class":262},[145,22284,22285,22287,22289],{"class":147,"line":716},[145,22286,22150],{"class":159},[145,22288,20264],{"class":155},[145,22290,22291],{"class":159},". The garment is displayed on an invisible \"\n",[145,22293,22294],{"class":147,"line":722},[145,22295,22296],{"class":159},"            \"mannequin form, rotating slowly. Fabric moves naturally with \"\n",[145,22298,22299],{"class":147,"line":728},[145,22300,22301],{"class":159},"            \"gentle airflow, showing drape and texture. Soft diffused \"\n",[145,22303,22304],{"class":147,"line":739},[145,22305,22306],{"class":159},"            \"studio lighting. Clean white background. Fashion e-commerce \"\n",[145,22308,22309],{"class":147,"line":744},[145,22310,22311],{"class":159},"            \"product video.\"\n",[145,22313,22314],{"class":147,"line":750},[145,22315,1342],{"class":262},[145,22317,22318,22320,22322,22324],{"class":147,"line":767},[145,22319,1347],{"class":159},[145,22321,437],{"class":262},[145,22323,3698],{"class":155},[145,22325,452],{"class":262},[145,22327,22328,22330,22332,22334],{"class":147,"line":788},[145,22329,1379],{"class":159},[145,22331,437],{"class":262},[145,22333,3722],{"class":159},[145,22335,452],{"class":262},[145,22337,22338],{"class":147,"line":834},[145,22339,22204],{"class":262},[145,22341,22342,22345],{"class":147,"line":839},[145,22343,22344],{"class":159},"    \"food_beverage\"",[145,22346,1943],{"class":262},[145,22348,22349,22351],{"class":147,"line":845},[145,22350,1319],{"class":159},[145,22352,1322],{"class":262},[145,22354,22355,22357,22359],{"class":147,"line":863},[145,22356,22150],{"class":159},[145,22358,20264],{"class":155},[145,22360,22361],{"class":159},". Steam rises gently. Camera pushes in slowly \"\n",[145,22363,22364],{"class":147,"line":872},[145,22365,22366],{"class":159},"            \"from a wide tabletop shot to an appetizing close-up. Warm, \"\n",[145,22368,22369],{"class":147,"line":887},[145,22370,22371],{"class":159},"            \"golden-hour lighting. Shallow depth of field. Ingredients or \"\n",[145,22373,22374],{"class":147,"line":903},[145,22375,22376],{"class":159},"            \"garnishes are visible in beautiful detail. Food photography \"\n",[145,22378,22379],{"class":147,"line":915},[145,22380,22381],{"class":159},"            \"in motion.\"\n",[145,22383,22384],{"class":147,"line":953},[145,22385,1342],{"class":262},[145,22387,22388,22390,22392,22394],{"class":147,"line":959},[145,22389,1347],{"class":159},[145,22391,437],{"class":262},[145,22393,3698],{"class":155},[145,22395,452],{"class":262},[145,22397,22398,22400,22402,22404],{"class":147,"line":964},[145,22399,1379],{"class":159},[145,22401,437],{"class":262},[145,22403,6140],{"class":159},[145,22405,452],{"class":262},[145,22407,22408],{"class":147,"line":970},[145,22409,22204],{"class":262},[145,22411,22412,22415],{"class":147,"line":976},[145,22413,22414],{"class":159},"    \"furniture\"",[145,22416,1943],{"class":262},[145,22418,22419,22421],{"class":147,"line":988},[145,22420,1319],{"class":159},[145,22422,1322],{"class":262},[145,22424,22425,22427,22429],{"class":147,"line":993},[145,22426,22150],{"class":159},[145,22428,20264],{"class":155},[145,22430,22431],{"class":159},". Placed in a styled modern living room with \"\n",[145,22433,22434],{"class":147,"line":5531},[145,22435,22436],{"class":159},"            \"natural light streaming through large windows. Camera dollies \"\n",[145,22438,22439],{"class":147,"line":5540},[145,22440,22441],{"class":159},"            \"slowly around the piece, showing form and proportion in context. \"\n",[145,22443,22444],{"class":147,"line":5546},[145,22445,22446],{"class":159},"            \"Warm afternoon light. Interior design showcase quality.\"\n",[145,22448,22449],{"class":147,"line":5574},[145,22450,1342],{"class":262},[145,22452,22453,22455,22457,22459],{"class":147,"line":5605},[145,22454,1347],{"class":159},[145,22456,437],{"class":262},[145,22458,537],{"class":155},[145,22460,452],{"class":262},[145,22462,22463,22465,22467,22469],{"class":147,"line":5625},[145,22464,1379],{"class":159},[145,22466,437],{"class":262},[145,22468,1384],{"class":159},[145,22470,452],{"class":262},[145,22472,22473],{"class":147,"line":5631},[145,22474,22204],{"class":262},[145,22476,22477,22480],{"class":147,"line":5637},[145,22478,22479],{"class":159},"    \"cosmetics\"",[145,22481,1943],{"class":262},[145,22483,22484,22486],{"class":147,"line":5642},[145,22485,1319],{"class":159},[145,22487,1322],{"class":262},[145,22489,22490,22492,22494],{"class":147,"line":5655},[145,22491,22150],{"class":159},[145,22493,20264],{"class":155},[145,22495,22496],{"class":159},". The product sits on a marble surface with \"\n",[145,22498,22499],{"class":147,"line":5661},[145,22500,22501],{"class":159},"            \"soft pink and gold tones. A gentle pour or squeeze dispenses \"\n",[145,22503,22504],{"class":147,"line":5688},[145,22505,22506],{"class":159},"            \"the product, showing color and texture. Macro close-up of the \"\n",[145,22508,22509],{"class":147,"line":5728},[145,22510,22511],{"class":159},"            \"formula. Smooth, luxurious pacing. Beauty brand advertisement.\"\n",[145,22513,22514],{"class":147,"line":5747},[145,22515,1342],{"class":262},[145,22517,22518,22520,22522,22524],{"class":147,"line":5752},[145,22519,1347],{"class":159},[145,22521,437],{"class":262},[145,22523,3698],{"class":155},[145,22525,452],{"class":262},[145,22527,22528,22530,22532,22534],{"class":147,"line":5757},[145,22529,1379],{"class":159},[145,22531,437],{"class":262},[145,22533,3722],{"class":159},[145,22535,452],{"class":262},[145,22537,22538],{"class":147,"line":5762},[145,22539,22204],{"class":262},[145,22541,22542,22545],{"class":147,"line":7442},[145,22543,22544],{"class":159},"    \"sports_gear\"",[145,22546,1943],{"class":262},[145,22548,22549,22551],{"class":147,"line":7448},[145,22550,1319],{"class":159},[145,22552,1322],{"class":262},[145,22554,22555,22557,22559],{"class":147,"line":7459},[145,22556,22150],{"class":159},[145,22558,20264],{"class":155},[145,22560,22561],{"class":159},". Dynamic presentation against a dark \"\n",[145,22563,22564],{"class":147,"line":7470},[145,22565,22566],{"class":159},"            \"background with dramatic side lighting. The product rotates \"\n",[145,22568,22569],{"class":147,"line":7481},[145,22570,22571],{"class":159},"            \"with energy — quick cuts between angles showing key features. \"\n",[145,22573,22574],{"class":147,"line":7486},[145,22575,22576],{"class":159},"            \"Subtle motion graphics energy. Athletic brand commercial style.\"\n",[145,22578,22579],{"class":147,"line":7492},[145,22580,1342],{"class":262},[145,22582,22583,22585,22587,22589],{"class":147,"line":7500},[145,22584,1347],{"class":159},[145,22586,437],{"class":262},[145,22588,3698],{"class":155},[145,22590,452],{"class":262},[145,22592,22593,22595,22597,22599],{"class":147,"line":7514},[145,22594,1379],{"class":159},[145,22596,437],{"class":262},[145,22598,1384],{"class":159},[145,22600,452],{"class":262},[145,22602,22603],{"class":147,"line":7519},[145,22604,22204],{"class":262},[145,22606,22607,22610],{"class":147,"line":7533},[145,22608,22609],{"class":159},"    \"home_decor\"",[145,22611,1943],{"class":262},[145,22613,22614,22616],{"class":147,"line":7547},[145,22615,1319],{"class":159},[145,22617,1322],{"class":262},[145,22619,22620,22622,22624],{"class":147,"line":7579},[145,22621,22150],{"class":159},[145,22623,20264],{"class":155},[145,22625,22626],{"class":159},". Displayed in a curated shelf vignette with \"\n",[145,22628,22629],{"class":147,"line":7591},[145,22630,22631],{"class":159},"            \"complementary objects. Soft natural light. Camera slowly racks \"\n",[145,22633,22634],{"class":147,"line":7601},[145,22635,22636],{"class":159},"            \"focus from background to the product. Cozy, aspirational \"\n",[145,22638,22639],{"class":147,"line":7606},[145,22640,22641],{"class":159},"            \"interior styling. Lifestyle brand aesthetic.\"\n",[145,22643,22644],{"class":147,"line":7613},[145,22645,1342],{"class":262},[145,22647,22648,22650,22652,22654],{"class":147,"line":7635},[145,22649,1347],{"class":159},[145,22651,437],{"class":262},[145,22653,3698],{"class":155},[145,22655,452],{"class":262},[145,22657,22658,22660,22662,22664],{"class":147,"line":7666},[145,22659,1379],{"class":159},[145,22661,437],{"class":262},[145,22663,6140],{"class":159},[145,22665,452],{"class":262},[145,22667,22668],{"class":147,"line":7671},[145,22669,22204],{"class":262},[145,22671,22672],{"class":147,"line":7677},[145,22673,469],{"class":262},[145,22675,22676],{"class":147,"line":7702},[145,22677,376],{"emptyLinePlaceholder":58},[145,22679,22680],{"class":147,"line":7707},[145,22681,376],{"emptyLinePlaceholder":58},[145,22683,22684,22686,22689,22692,22694,22697,22699,22701,22703,22705,22707],{"class":147,"line":7712},[145,22685,526],{"class":258},[145,22687,22688],{"class":151}," generate_from_template",[145,22690,22691],{"class":262},"(category: ",[145,22693,8673],{"class":155},[145,22695,22696],{"class":262},", name: ",[145,22698,8673],{"class":155},[145,22700,20569],{"class":262},[145,22702,8673],{"class":155},[145,22704,15842],{"class":262},[145,22706,8798],{"class":155},[145,22708,860],{"class":262},[145,22710,22711],{"class":147,"line":7735},[145,22712,22713],{"class":159},"    \"\"\"Generate a video using a category-specific prompt template.\"\"\"\n",[145,22715,22716,22719,22721,22724],{"class":147,"line":7745},[145,22717,22718],{"class":262},"    template ",[145,22720,266],{"class":258},[145,22722,22723],{"class":155}," ECOMMERCE_PROMPTS",[145,22725,22726],{"class":262},"[category]\n",[145,22728,22729,22731,22733],{"class":147,"line":7751},[145,22730,1294],{"class":262},[145,22732,266],{"class":258},[145,22734,428],{"class":262},[145,22736,22737,22739,22741,22743],{"class":147,"line":7769},[145,22738,1303],{"class":159},[145,22740,437],{"class":262},[145,22742,1308],{"class":159},[145,22744,452],{"class":262},[145,22746,22747,22749],{"class":147,"line":7774},[145,22748,2688],{"class":159},[145,22750,20658],{"class":262},[145,22752,22753,22755,22758,22760,22763,22765,22767],{"class":147,"line":7779},[145,22754,1319],{"class":159},[145,22756,22757],{"class":262},": template[",[145,22759,5921],{"class":159},[145,22761,22762],{"class":262},"].format(",[145,22764,20668],{"class":701},[145,22766,266],{"class":258},[145,22768,20673],{"class":262},[145,22770,22771,22773,22775,22777],{"class":147,"line":7792},[145,22772,1347],{"class":159},[145,22774,22757],{"class":262},[145,22776,5966],{"class":159},[145,22778,10847],{"class":262},[145,22780,22781,22783,22785,22787],{"class":147,"line":7806},[145,22782,1363],{"class":159},[145,22784,437],{"class":262},[145,22786,3710],{"class":159},[145,22788,452],{"class":262},[145,22790,22791,22793,22795,22797],{"class":147,"line":7833},[145,22792,1379],{"class":159},[145,22794,22757],{"class":262},[145,22796,6168],{"class":159},[145,22798,10847],{"class":262},[145,22800,22801],{"class":147,"line":7847},[145,22802,1407],{"class":262},[145,22804,22805,22807],{"class":147,"line":10367},[145,22806,1703],{"class":258},[145,22808,18278],{"class":262},[145,22810,22811],{"class":147,"line":10374},[145,22812,376],{"emptyLinePlaceholder":58},[145,22814,22815],{"class":147,"line":10420},[145,22816,376],{"emptyLinePlaceholder":58},[145,22818,22819],{"class":147,"line":10425},[145,22820,8857],{"class":174},[145,22822,22823,22825,22827],{"class":147,"line":10430},[145,22824,12238],{"class":262},[145,22826,266],{"class":258},[145,22828,22829],{"class":262}," generate_from_template(\n",[145,22831,22832,22835,22837,22840],{"class":147,"line":10439},[145,22833,22834],{"class":701},"    category",[145,22836,266],{"class":258},[145,22838,22839],{"class":159},"\"jewelry\"",[145,22841,452],{"class":262},[145,22843,22844,22847,22849,22852],{"class":147,"line":10445},[145,22845,22846],{"class":701},"    name",[145,22848,266],{"class":258},[145,22850,22851],{"class":159},"\"18K gold pendant necklace with emerald\"",[145,22853,452],{"class":262},[145,22855,22856,22859,22861],{"class":147,"line":10454},[145,22857,22858],{"class":701},"    image_url",[145,22860,266],{"class":258},[145,22862,22863],{"class":159},"\"https://your-cdn.com/products/emerald-pendant.jpg\"\n",[145,22865,22866],{"class":147,"line":10475},[145,22867,406],{"class":262},[11,22869,22870,22871,22874],{},"These templates are starting points. Adjust the lighting descriptions and camera movements to match your brand's visual identity. The ",[37,22872,22873],{"href":1766},"complete prompt guide"," covers advanced techniques for fine-tuning Seedance 2.0 output.",[92,22876,22878],{"id":22877},"customizing-templates-for-your-brand","Customizing Templates for Your Brand",[11,22880,22881],{},"Every brand has a visual language. Apple uses clean white environments with precise, slow camera movements. Nike uses dynamic, high-contrast lighting with fast cuts. Your product videos should reflect your brand's established aesthetic.",[11,22883,22884],{},"Modify the templates along these axes:",[97,22886,22887,22893,22899,22905],{},[73,22888,22889,22892],{},[23,22890,22891],{},"Lighting tone:"," Warm (gold, amber) for artisanal/luxury brands. Cool (blue, silver) for tech. Neutral (white, soft) for minimalist brands.",[73,22894,22895,22898],{},[23,22896,22897],{},"Camera speed:"," Slow, deliberate movements for premium positioning. Faster, more dynamic movements for youth-oriented or sports brands.",[73,22900,22901,22904],{},[23,22902,22903],{},"Background:"," Dark backgrounds signal luxury. White backgrounds signal clean/modern. Environmental backgrounds signal lifestyle.",[73,22906,22907,22910],{},[23,22908,22909],{},"Pacing vocabulary:"," \"Slow, measured\" vs. \"dynamic, energetic\" vs. \"calm, meditative\" — these words directly influence the model's output tempo.",[11,22912,22913],{},"Build your brand's master prompt prefix — a set of terms that prepend every product video prompt — and apply it consistently across your catalog. This creates visual coherence across hundreds of product videos, mimicking the consistency you'd get from a single studio setup.",[48,22915,13304],{"id":13303},[92,22917,22919],{"id":22918},"how-much-does-it-cost-to-generate-a-product-video","How much does it cost to generate a product video?",[11,22921,22922,22923,22928],{},"Pricing depends on duration and quality settings. A standard 8-second video at 1080p quality costs a few cents. Generating 500 product videos for an entire catalog runs well under $100 in most configurations. Check ",[37,22924,22927],{"href":22925,"rel":22926},"https://evolink.ai/pricing",[41],"EvoLink pricing"," for current rates. Compared to the $500–$2,000 per video that studios charge, the API cost is effectively negligible at any scale.",[92,22930,22932],{"id":22931},"can-i-use-real-human-model-photos-as-input","Can I use real human model photos as input?",[11,22934,22935],{},"Seedance 2.0 has restrictions on generating realistic human faces to prevent deepfake misuse. Product-only photos work without limitations. If your product needs to be shown with a person — clothing on a model, a watch on a wrist — use illustrated or stylized human references rather than photorealistic portraits. Alternatively, describe the human element in the prompt (e.g., \"a hand reaches into frame\") and let the model generate it rather than providing a face photo as input.",[92,22937,22939],{"id":22938},"how-long-does-video-generation-take","How long does video generation take?",[11,22941,22942,22943,22945],{},"Typical generation time is 60–180 seconds depending on duration and quality settings. A 5-second video at 720p completes in about a minute. A 15-second video at 1080p can take up to three minutes. The batch pipeline in this guide handles timing automatically through polling. For production systems, use the ",[28,22944,3601],{}," parameter to receive a webhook on completion instead of polling.",[92,22947,22949],{"id":22948},"can-i-add-brand-logos-or-text-overlays","Can I add brand logos or text overlays?",[11,22951,22952],{},"Two approaches work. First, include text descriptions in your prompt — \"Brand name fades in at the end\" or \"Logo watermark in lower right corner.\" The model can generate text-like elements, though precise typography is not guaranteed. Second, and more reliably, generate the video without text and composite your logo, titles, or lower thirds in post-production using FFmpeg, After Effects, or your video editing tool of choice. The second approach gives you exact control over brand assets.",[92,22954,22956],{"id":22955},"is-the-video-quality-good-enough-for-commercial-use","Is the video quality good enough for commercial use?",[11,22958,22959],{},"At 1080p quality, the output is suitable for product listings, social media ads, and website hero sections. The visual quality matches or exceeds what most e-commerce teams produce with basic studio setups. For high-end brand campaigns or broadcast television, you may want to use the AI-generated video as a previz or starting point, then refine with traditional post-production. For the vast majority of e-commerce use cases — Amazon, Shopify, social ads, email campaigns — the output is production-ready.",[92,22961,22963],{"id":22962},"what-image-format-and-resolution-works-best-for-input","What image format and resolution works best for input?",[11,22965,22966],{},"JPEG and PNG both work. PNG with transparency is ideal for products that need clean background replacement. For resolution, provide the highest quality source image available — at least 1024×1024 pixels. The model extracts more detail from higher-resolution inputs, which is especially noticeable in macro close-up and rotation videos. Avoid heavily compressed JPEGs with visible artifacts, as these carry through into the generated video.",[92,22968,22970],{"id":22969},"can-i-generate-videos-with-audio-or-music","Can I generate videos with audio or music?",[11,22972,22973,22974,22976,22977,22979,22980,22984],{},"Seedance 2.0 supports the ",[28,22975,1822],{}," parameter, which adds contextual sound effects to the video. For product videos, ambient studio sounds or subtle swooshes can enhance the premium feel. However, most e-commerce platforms autoplay video without sound, so the visual quality matters far more. If you need specific music or voiceover, add it in post-production. The API also supports ",[28,22978,3584],{}," for audio-guided generation — see the ",[37,22981,22983],{"href":22982},"/docs/multimodal-reference","multimodal reference docs"," for details.",[92,22986,22988],{"id":22987},"how-do-i-integrate-this-with-shopify-or-amazon","How do I integrate this with Shopify or Amazon?",[11,22990,22991,22992,22994,22995,22997],{},"The workflow is: generate video → download MP4 → upload to your platform. For Shopify, upload videos directly to product media through the admin or Shopify API. For Amazon, upload through Seller Central's \"Manage Videos\" section or via the SP-API. To automate the full loop, use the batch pipeline with ",[28,22993,3601],{}," — your webhook handler can download the video and push it to your platform's API automatically. The ",[37,22996,22983],{"href":22982}," cover the full API response format for building integrations.",[48,22999,23001],{"id":23000},"from-studio-to-api-your-new-video-pipeline","From Studio to API: Your New Video Pipeline",[11,23003,23004],{},"Five video types cover the full e-commerce product video spectrum: 360° rotations for product pages, hero shots for launches, lifestyle context for emotional connection, macro close-ups for quality perception, and unboxing reveals for social content. Each type requires one product photo and one API call.",[11,23006,23007],{},"The batch pipeline turns a CSV catalog into a complete video library. Multi-platform export generates every aspect ratio your channels need in a single pass. The prompt template library gives you copy-paste starting points for any product category.",[11,23009,23010],{},"The entire workflow — from product photo to published video across every sales channel — compresses from weeks to hours. A single developer can operate a video pipeline that previously required a production team, a studio, and a post-production editor.",[11,23012,23013],{},"This is not an incremental improvement over traditional video production. It's a structural shift. The bottleneck in e-commerce video was never creative vision — it was cost and logistics. When a single video costs pennies and takes two minutes, the question changes from \"which products deserve video?\" to \"why doesn't every product have video?\"",[11,23015,23016],{},"Start with one product. Generate a rotation video. See the result in three minutes. Then scale to your full catalog. The API is the same whether you're generating one video or ten thousand.",[11,23018,23019,23020],{},"Replace your video production pipeline. ",[37,23021,23023],{"href":211,"rel":23022},[41],"Sign up free on EvoLink →",[45,23025],{},[11,23027,23028],{},[2619,23029,23030,23031,23034,23035,23034,23037,23034,23040],{},"Previously in this series: ",[37,23032,23033],{"href":1766},"Seedance 2.0 Prompts Guide"," · ",[37,23036,2967],{"href":2966},[37,23038,23039],{"href":3856},"Camera Movements Guide",[37,23041,23042],{"href":3381},"Image-to-Video Tutorial",[11217,23044,23045],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}",{"title":141,"searchDepth":166,"depth":166,"links":23047},[23048,23051,23052,23056,23060,23064,23068,23073,23078,23083,23086,23096],{"id":17402,"depth":166,"text":17403,"children":23049},[23050],{"id":17527,"depth":178,"text":17528},{"id":17537,"depth":166,"text":17538},{"id":18153,"depth":166,"text":18154,"children":23053},[23054,23055],{"id":18316,"depth":178,"text":18317},{"id":18380,"depth":178,"text":18381},{"id":18421,"depth":166,"text":18422,"children":23057},[23058,23059],{"id":18553,"depth":178,"text":18554},{"id":18596,"depth":178,"text":18597},{"id":18639,"depth":166,"text":18640,"children":23061},[23062,23063],{"id":18810,"depth":178,"text":18811},{"id":18900,"depth":178,"text":18901},{"id":18948,"depth":166,"text":18949,"children":23065},[23066,23067],{"id":19082,"depth":178,"text":19083},{"id":19121,"depth":178,"text":19122},{"id":19179,"depth":166,"text":19180,"children":23069},[23070,23071,23072],{"id":19316,"depth":178,"text":19317},{"id":19350,"depth":178,"text":19351},{"id":19360,"depth":178,"text":19361},{"id":19399,"depth":166,"text":19400,"children":23074},[23075,23076,23077],{"id":19539,"depth":178,"text":19540},{"id":19996,"depth":178,"text":19997},{"id":20006,"depth":178,"text":20007},{"id":20051,"depth":166,"text":20052,"children":23079},[23080,23081,23082],{"id":21918,"depth":178,"text":21919},{"id":22023,"depth":178,"text":22024},{"id":22073,"depth":178,"text":22074},{"id":22111,"depth":166,"text":22112,"children":23084},[23085],{"id":22877,"depth":178,"text":22878},{"id":13303,"depth":166,"text":13304,"children":23087},[23088,23089,23090,23091,23092,23093,23094,23095],{"id":22918,"depth":178,"text":22919},{"id":22931,"depth":178,"text":22932},{"id":22938,"depth":178,"text":22939},{"id":22948,"depth":178,"text":22949},{"id":22955,"depth":178,"text":22956},{"id":22962,"depth":178,"text":22963},{"id":22969,"depth":178,"text":22970},{"id":22987,"depth":178,"text":22988},{"id":23000,"depth":166,"text":23001},"Generate e-commerce product videos from photos using Seedance 2.0 API. 5 video types, batch pipeline, multi-platform export. Complete Python code included.",{"date":23099,"image":23100,"seoTitle":23101},"2026-02-21","/s7-hero-ecommerce-product-videos.webp","Build AI Product Videos for E-commerce | Seedance 2.0 API","/en/blog/seedance-2-ecommerce-product-videos",{"title":17388,"description":23097},"en/blog/seedance-2-ecommerce-product-videos","23bESJAPsWnpUeIQ8nJnOTEI3LuWTMyfr7u3xp9qcHY",{"id":23107,"title":23108,"body":23109,"description":30403,"extension":11279,"meta":30404,"navigation":58,"path":30407,"seo":30408,"stem":30409,"__hash__":30410},"content/en/blog/seedance-2-image-to-video-api.md","Seedance 2.0 Image-to-Video API: Animate Any Image with Full Control",{"type":8,"value":23110,"toc":30332},[23111,23115,23118,23125,23127,23131,23134,23141,23145,23266,23271,23277,23282,23286,23289,23298,23301,23305,23312,23316,23319,23321,23325,23331,23335,23349,23358,23362,23374,23377,23381,23460,23467,23476,23480,23483,23769,23782,23788,23790,23794,23797,23799,23809,23835,23842,23846,24376,24387,24391,24395,24403,24409,24413,24418,24425,24428,24432,24435,24440,24446,24451,24457,24472,24475,24528,24536,24538,24542,24549,24552,24558,24572,24578,24582,24585,24617,24621,25137,25141,25146,25153,25156,25160,25166,25176,25182,25188,25231,25233,25237,25243,25247,25253,25259,25262,25268,25271,25275,25852,25856,25860,25867,25873,25877,25882,25977,25981,25986,25993,25998,26006,26008,26012,26022,26026,26032,26487,26491,26495,26502,26505,26509,26515,26524,26530,26539,26598,26607,26611,26614,27606,27614,27618,27621,27627,27633,27644,27646,27650,27657,27661,27664,27681,27684,27695,27699,27702,28231,28235,28239,28246,28249,28253,28259,28464,28468,28472,28479,28482,28486,28489,29076,29082,29086,29089,29248,29250,29252,29255,29259,29271,29277,29282,29345,29349,29354,29359,29364,29427,29431,29436,29441,29446,29492,29496,29501,29506,29523,29528,29567,29626,29630,29638,29646,29717,29721,29726,29731,29736,29884,29886,29890,29895,29900,29909,29962,29964,29968,29971,30174,30195,30197,30199,30203,30206,30210,30219,30223,30229,30233,30248,30252,30261,30265,30274,30278,30284,30286,30290,30297,30300,30306,30314,30316,30330],[23112,23113,23108],"h1",{"id":23114},"seedance-20-image-to-video-api-animate-any-image-with-full-control",[11,23116,23117],{},"A single product photo sitting on your hard drive generates zero engagement. A 10-second video of that product rotating under studio lighting, with synchronized sound, generates clicks, shares, and sales. Seedance 2.0's image-to-video API turns any static image into a fully controllable video — through a single POST request.",[11,23119,23120,23121,23124],{},"This guide covers three distinct image-to-video modes: single image animation, first-last frame interpolation, and multi-image composition with ",[28,23122,23123],{},"@tag"," references. Each section includes complete, runnable Python code, real demo outputs, and the exact prompts that generated them.",[45,23126],{},[48,23128,23130],{"id":23129},"what-makes-seedance-20s-image-to-video-different","What Makes Seedance 2.0's Image-to-Video Different",[11,23132,23133],{},"Every major AI video platform now offers some form of image-to-video generation. Sora accepts a single image as a starting frame. Kling provides image animation with basic motion control. Veo 2 supports image conditioning for style guidance. They all solve the same surface-level problem: turn a picture into moving pixels.",[11,23135,23136,23137,23140],{},"Seedance 2.0 solves a different problem entirely. It gives you ",[23,23138,23139],{},"compositional control"," over multiple images within a single generation request — and it does this through a tagging system that no other API currently matches.",[92,23142,23144],{"id":23143},"the-core-differences","The Core Differences",[2036,23146,23147,23162],{},[2039,23148,23149],{},[2042,23150,23151,23154,23156,23158,23160],{},[2045,23152,23153],{},"Capability",[2045,23155,17232],{},[2045,23157,13898],{},[2045,23159,17216],{},[2045,23161,17398],{},[2052,23163,23164,23177,23191,23205,23224,23238,23251],{},[2042,23165,23166,23169,23171,23173,23175],{},[2057,23167,23168],{},"Single image → video",[2057,23170,13852],{},[2057,23172,13852],{},[2057,23174,13852],{},[2057,23176,13852],{},[2042,23178,23179,23182,23184,23187,23189],{},[2057,23180,23181],{},"First-last frame control",[2057,23183,13835],{},[2057,23185,23186],{},"✅ (limited)",[2057,23188,13835],{},[2057,23190,13852],{},[2042,23192,23193,23196,23198,23200,23202],{},[2057,23194,23195],{},"Multi-image composition",[2057,23197,13835],{},[2057,23199,13835],{},[2057,23201,13835],{},[2057,23203,23204],{},"✅ (up to 9 images)",[2042,23206,23207,23210,23212,23214,23216],{},[2057,23208,23209],{},"Per-image role assignment",[2057,23211,13835],{},[2057,23213,13835],{},[2057,23215,13835],{},[2057,23217,23218,23219,400,23221,23223],{},"✅ (",[28,23220,2908],{},[28,23222,2918],{},"…)",[2042,23225,23226,23229,23231,23233,23235],{},[2057,23227,23228],{},"Mixed media (image + video + audio)",[2057,23230,13835],{},[2057,23232,13835],{},[2057,23234,13835],{},[2057,23236,23237],{},"✅ (up to 12 files)",[2042,23239,23240,23243,23245,23247,23249],{},[2057,23241,23242],{},"Native audio generation",[2057,23244,13835],{},[2057,23246,13835],{},[2057,23248,13835],{},[2057,23250,13852],{},[2042,23252,23253,23256,23259,23261,23264],{},[2057,23254,23255],{},"API-first access",[2057,23257,23258],{},"Waitlist",[2057,23260,13852],{},[2057,23262,23263],{},"Limited",[2057,23265,13852],{},[11,23267,2176,23268,23270],{},[28,23269,23123],{}," system is where Seedance 2.0 pulls ahead. When you upload three images, you can write a prompt like:",[136,23272,23275],{"className":23273,"code":23274,"language":2185},[2183],"@Image1 is the main character. @Image2 is the background environment.\n@Image3 is the art style reference. The character walks through the environment\nin the style of @Image3.\n",[28,23276,23274],{"__ignoreMap":141},[11,23278,23279,23280,493],{},"Each image gets a specific semantic role. The model doesn't guess which image is the character and which is the background — you tell it explicitly. For a deep dive into this tagging system, see the ",[37,23281,2967],{"href":2966},[92,23283,23285],{"id":23284},"why-tags-matter-for-developers","Why @Tags Matter for Developers",[11,23287,23288],{},"If you've worked with other image-to-video APIs, you know the frustration: you upload multiple images and hope the model figures out what you intended. Sometimes it uses the background image as the character. Sometimes it blends all images into an incoherent mash. There's no way to debug this because you have no control over how the model interprets each input.",[11,23290,2176,23291,23293,23294,23297],{},[28,23292,23123],{}," system eliminates this uncertainty. It's essentially a variable binding system — you name each input and reference it explicitly in your instructions. This makes image-to-video generation ",[23,23295,23296],{},"deterministic and reproducible",". Same inputs, same tags, same prompt → same semantic interpretation every time.",[11,23299,23300],{},"For production pipelines, this is the difference between \"try it and see\" and \"configure it and ship it.\" You can build templates, validate outputs, and iterate on specific elements without the entire composition shifting unpredictably.",[92,23302,23304],{"id":23303},"native-audio-changes-the-output","Native Audio Changes the Output",[11,23306,23307,23308,23311],{},"Most AI image-to-video tools produce silent clips. You then need a separate audio generation step, a separate API call, and a video editing pass to combine them. Seedance 2.0 generates synchronized audio as part of the same request by setting ",[28,23309,23310],{},"generate_audio: true",". Footsteps match walking motion. Wind sounds match outdoor scenes. This eliminates an entire post-production step.",[92,23313,23315],{"id":23314},"what-it-wont-do","What It Won't Do",[11,23317,23318],{},"Seedance 2.0 does not support realistic human faces in image-to-video generation. If your input image contains a photorealistic human face, the API will reject the request automatically. Illustrated characters, stylized faces, anime characters, and non-photorealistic portraits all work fine. This is a deliberate safety constraint, not a technical limitation.",[45,23320],{},[48,23322,23324],{"id":23323},"quick-setup-api-key-and-environment","Quick Setup: API Key and Environment",[11,23326,23327,23328,23330],{},"You need three things: an EvoLink account, an API key, and the ",[28,23329,113],{}," library. The entire setup takes under a minute.",[92,23332,23334],{"id":23333},"step-1-get-your-api-key","Step 1: Get Your API Key",[70,23336,23337,23343,23346],{},[73,23338,222,23339,23342],{},[37,23340,11961],{"href":211,"rel":23341},[41]," and create a free account",[73,23344,23345],{},"Navigate to the API Keys section in your dashboard",[73,23347,23348],{},"Generate a new key and copy it",[11,23350,23351,23352,23354,23355,493],{},"Your key starts with ",[28,23353,245],{}," and looks like this: ",[28,23356,23357],{},"sk-XpXn...Ms1N",[92,23359,23361],{"id":23360},"step-2-install-dependencies","Step 2: Install Dependencies",[136,23363,23364],{"className":138,"code":317,"language":140,"meta":141,"style":141},[28,23365,23366],{"__ignoreMap":141},[145,23367,23368,23370,23372],{"class":147,"line":148},[145,23369,190],{"class":151},[145,23371,193],{"class":159},[145,23373,328],{"class":159},[11,23375,23376],{},"That's it. No SDK to install, no complex authentication flow. The API uses standard REST with Bearer token auth.",[92,23378,23380],{"id":23379},"step-3-set-up-your-python-environment","Step 3: Set Up Your Python Environment",[136,23382,23384],{"className":338,"code":23383,"language":340,"meta":141,"style":141},"import requests\nimport time\nimport json\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n",[28,23385,23386,23392,23398,23404,23408,23416,23424,23432,23448,23456],{"__ignoreMap":141},[145,23387,23388,23390],{"class":147,"line":148},[145,23389,347],{"class":258},[145,23391,328],{"class":262},[145,23393,23394,23396],{"class":147,"line":166},[145,23395,347],{"class":258},[145,23397,356],{"class":262},[145,23399,23400,23402],{"class":147,"line":178},[145,23401,347],{"class":258},[145,23403,370],{"class":262},[145,23405,23406],{"class":147,"line":187},[145,23407,376],{"emptyLinePlaceholder":58},[145,23409,23410,23412,23414],{"class":147,"line":373},[145,23411,388],{"class":155},[145,23413,391],{"class":258},[145,23415,17601],{"class":159},[145,23417,23418,23420,23422],{"class":147,"line":379},[145,23419,412],{"class":155},[145,23421,391],{"class":258},[145,23423,417],{"class":159},[145,23425,23426,23428,23430],{"class":147,"line":385},[145,23427,423],{"class":155},[145,23429,391],{"class":258},[145,23431,428],{"class":262},[145,23433,23434,23436,23438,23440,23442,23444,23446],{"class":147,"line":409},[145,23435,434],{"class":159},[145,23437,437],{"class":262},[145,23439,440],{"class":258},[145,23441,443],{"class":159},[145,23443,446],{"class":155},[145,23445,449],{"class":159},[145,23447,452],{"class":262},[145,23449,23450,23452,23454],{"class":147,"line":420},[145,23451,458],{"class":159},[145,23453,437],{"class":262},[145,23455,463],{"class":159},[145,23457,23458],{"class":147,"line":431},[145,23459,469],{"class":262},[11,23461,23462,23463,23466],{},"Every code example in this guide builds on these three variables. Replace ",[28,23464,23465],{},"YOUR_API_KEY"," with your actual key and you're ready to generate.",[18,23468,23469],{},[11,23470,23471],{},[23,23472,23473],{},[37,23474,18150],{"href":211,"rel":23475},[41],[92,23477,23479],{"id":23478},"the-polling-helper","The Polling Helper",[11,23481,23482],{},"Since video generation takes 60–180 seconds, you need a function to poll for completion. This helper works across all three image-to-video modes:",[136,23484,23486],{"className":338,"code":23485,"language":340,"meta":141,"style":141},"def wait_for_video(task_id, interval=5, max_wait=300):\n    \"\"\"Poll the task endpoint until the video is ready.\"\"\"\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n\n    while elapsed \u003C max_wait:\n        resp = requests.get(url, headers=HEADERS)\n        data = resp.json()\n        status = data[\"status\"]\n\n        if status == \"completed\":\n            video_url = data[\"output\"][\"video_url\"]\n            print(f\"Video ready: {video_url}\")\n            return data\n        elif status == \"failed\":\n            print(f\"Generation failed: {data.get('error', 'Unknown error')}\")\n            return data\n\n        print(f\"Status: {status} ({elapsed}s elapsed)\")\n        time.sleep(interval)\n        elapsed += interval\n\n    print(\"Timed out waiting for video\")\n    return None\n",[28,23487,23488,23509,23514,23537,23545,23549,23560,23576,23585,23598,23602,23614,23630,23650,23657,23669,23698,23704,23708,23736,23740,23748,23752,23763],{"__ignoreMap":141},[145,23489,23490,23492,23494,23496,23498,23500,23503,23505,23507],{"class":147,"line":148},[145,23491,526],{"class":258},[145,23493,529],{"class":151},[145,23495,11687],{"class":262},[145,23497,266],{"class":258},[145,23499,1352],{"class":155},[145,23501,23502],{"class":262},", max_wait",[145,23504,266],{"class":258},[145,23506,11698],{"class":155},[145,23508,548],{"class":262},[145,23510,23511],{"class":147,"line":166},[145,23512,23513],{"class":159},"    \"\"\"Poll the task endpoint until the video is ready.\"\"\"\n",[145,23515,23516,23519,23521,23523,23525,23527,23529,23531,23533,23535],{"class":147,"line":178},[145,23517,23518],{"class":262},"    url ",[145,23520,266],{"class":258},[145,23522,3358],{"class":258},[145,23524,449],{"class":159},[145,23526,679],{"class":155},[145,23528,682],{"class":159},[145,23530,685],{"class":155},[145,23532,688],{"class":262},[145,23534,691],{"class":155},[145,23536,950],{"class":159},[145,23538,23539,23541,23543],{"class":147,"line":187},[145,23540,631],{"class":262},[145,23542,266],{"class":258},[145,23544,636],{"class":155},[145,23546,23547],{"class":147,"line":373},[145,23548,376],{"emptyLinePlaceholder":58},[145,23550,23551,23553,23555,23557],{"class":147,"line":379},[145,23552,642],{"class":258},[145,23554,645],{"class":262},[145,23556,648],{"class":258},[145,23558,23559],{"class":262}," max_wait:\n",[145,23561,23562,23564,23566,23568,23570,23572,23574],{"class":147,"line":385},[145,23563,6929],{"class":262},[145,23565,266],{"class":258},[145,23567,1131],{"class":262},[145,23569,17830],{"class":701},[145,23571,266],{"class":258},[145,23573,423],{"class":155},[145,23575,406],{"class":262},[145,23577,23578,23581,23583],{"class":147,"line":409},[145,23579,23580],{"class":262},"        data ",[145,23582,266],{"class":258},[145,23584,11768],{"class":262},[145,23586,23587,23589,23591,23594,23596],{"class":147,"line":420},[145,23588,753],{"class":262},[145,23590,266],{"class":258},[145,23592,23593],{"class":262}," data[",[145,23595,761],{"class":159},[145,23597,764],{"class":262},[145,23599,23600],{"class":147,"line":431},[145,23601,376],{"emptyLinePlaceholder":58},[145,23603,23604,23606,23608,23610,23612],{"class":147,"line":455},[145,23605,848],{"class":258},[145,23607,851],{"class":262},[145,23609,854],{"class":258},[145,23611,857],{"class":159},[145,23613,860],{"class":262},[145,23615,23616,23618,23620,23622,23624,23626,23628],{"class":147,"line":466},[145,23617,7404],{"class":262},[145,23619,266],{"class":258},[145,23621,23593],{"class":262},[145,23623,21539],{"class":159},[145,23625,1562],{"class":262},[145,23627,14953],{"class":159},[145,23629,764],{"class":262},[145,23631,23632,23634,23636,23638,23640,23642,23644,23646,23648],{"class":147,"line":600},[145,23633,5577],{"class":155},[145,23635,794],{"class":262},[145,23637,440],{"class":258},[145,23639,11808],{"class":159},[145,23641,685],{"class":155},[145,23643,1678],{"class":262},[145,23645,691],{"class":155},[145,23647,449],{"class":159},[145,23649,406],{"class":262},[145,23651,23652,23654],{"class":147,"line":605},[145,23653,866],{"class":258},[145,23655,23656],{"class":262}," data\n",[145,23658,23659,23661,23663,23665,23667],{"class":147,"line":611},[145,23660,875],{"class":258},[145,23662,851],{"class":262},[145,23664,854],{"class":258},[145,23666,882],{"class":159},[145,23668,860],{"class":262},[145,23670,23671,23673,23675,23677,23679,23681,23684,23686,23688,23690,23692,23694,23696],{"class":147,"line":617},[145,23672,5577],{"class":155},[145,23674,794],{"class":262},[145,23676,440],{"class":258},[145,23678,11857],{"class":159},[145,23680,685],{"class":155},[145,23682,23683],{"class":262},"data.get(",[145,23685,11865],{"class":159},[145,23687,400],{"class":262},[145,23689,943],{"class":159},[145,23691,108],{"class":262},[145,23693,691],{"class":155},[145,23695,449],{"class":159},[145,23697,406],{"class":262},[145,23699,23700,23702],{"class":147,"line":623},[145,23701,866],{"class":258},[145,23703,23656],{"class":262},[145,23705,23706],{"class":147,"line":628},[145,23707,376],{"emptyLinePlaceholder":58},[145,23709,23710,23712,23714,23716,23718,23720,23722,23724,23726,23728,23730,23732,23734],{"class":147,"line":639},[145,23711,791],{"class":155},[145,23713,794],{"class":262},[145,23715,440],{"class":258},[145,23717,11894],{"class":159},[145,23719,685],{"class":155},[145,23721,814],{"class":262},[145,23723,691],{"class":155},[145,23725,1218],{"class":159},[145,23727,685],{"class":155},[145,23729,804],{"class":262},[145,23731,691],{"class":155},[145,23733,11911],{"class":159},[145,23735,406],{"class":262},[145,23737,23738],{"class":147,"line":654},[145,23739,11918],{"class":262},[145,23741,23742,23744,23746],{"class":147,"line":660},[145,23743,979],{"class":262},[145,23745,982],{"class":258},[145,23747,11927],{"class":262},[145,23749,23750],{"class":147,"line":671},[145,23751,376],{"emptyLinePlaceholder":58},[145,23753,23754,23756,23758,23761],{"class":147,"line":698},[145,23755,1102],{"class":155},[145,23757,794],{"class":262},[145,23759,23760],{"class":159},"\"Timed out waiting for video\"",[145,23762,406],{"class":262},[145,23764,23765,23767],{"class":147,"line":710},[145,23766,1703],{"class":258},[145,23768,11949],{"class":155},[11,23770,23771,23772,23774,23775,23774,23777,280,23779,23781],{},"The task status follows a simple lifecycle: ",[28,23773,2076],{}," → ",[28,23776,2080],{},[28,23778,2084],{},[28,23780,2087],{},". Video URLs in the response expire after 24 hours — download or serve them before then.",[11,23783,23784,23785,493],{},"For a complete walkthrough of the API fundamentals (text-to-video, parameters, error handling), see the ",[37,23786,23787],{"href":17548},"Getting Started Guide",[45,23789],{},[48,23791,23793],{"id":23792},"mode-1-single-image-animation","Mode 1: Single Image Animation",[11,23795,23796],{},"Single image animation is the most common image-to-video workflow. You provide one image and a prompt describing the desired motion. The model preserves the visual content of your image while adding realistic movement, camera motion, and environmental effects.",[92,23798,6441],{"id":6440},[11,23800,23801,23802,23804,23805,23808],{},"When you pass exactly one URL in ",[28,23803,2896],{},", Seedance 2.0 treats it as the ",[23,23806,23807],{},"primary visual reference",". The model anchors the first frame to your image and generates forward motion based on your prompt. The output preserves:",[97,23810,23811,23817,23823,23829],{},[73,23812,23813,23816],{},[23,23814,23815],{},"Color palette"," from the source image",[73,23818,23819,23822],{},[23,23820,23821],{},"Composition"," and framing",[73,23824,23825,23828],{},[23,23826,23827],{},"Subject identity"," (clothing, shape, features)",[73,23830,23831,23834],{},[23,23832,23833],{},"Art style"," (illustration, 3D render, photography)",[11,23836,23837,23838,23841],{},"Your prompt controls what ",[2619,23839,23840],{},"changes",": movement, camera angles, lighting shifts, and environmental dynamics.",[92,23843,23845],{"id":23844},"complete-code-single-image-to-video","Complete Code: Single Image to Video",[136,23847,23849],{"className":338,"code":23848,"language":340,"meta":141,"style":141},"import requests\nimport time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef wait_for_video(task_id, interval=5, max_wait=300):\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n    while elapsed \u003C max_wait:\n        resp = requests.get(url, headers=HEADERS)\n        data = resp.json()\n        status = data[\"status\"]\n        if status == \"completed\":\n            print(f\"Video ready: {data['output']['video_url']}\")\n            return data\n        elif status == \"failed\":\n            print(f\"Failed: {data.get('error', 'Unknown error')}\")\n            return data\n        print(f\"Status: {status} ({elapsed}s)\")\n        time.sleep(interval)\n        elapsed += interval\n    return None\n\n# --- Single Image Animation ---\npayload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"The woman in the painting slowly reaches for a coffee cup on the table, \"\n        \"lifts it to her lips, and takes a quiet sip. Soft morning light filters \"\n        \"through a nearby window. Gentle steam rises from the cup. \"\n        \"Painterly brushstroke texture preserved throughout.\"\n    ),\n    \"image_urls\": [\n        \"https://example.com/painting-woman.jpg\"\n    ],\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n\nresp = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\nresult = resp.json()\nprint(f\"Task ID: {result['task_id']}\")\n\n# Poll until complete\nvideo_data = wait_for_video(result[\"task_id\"])\n",[28,23850,23851,23857,23863,23867,23875,23883,23891,23907,23915,23919,23923,23943,23965,23973,23983,23999,24007,24019,24031,24060,24066,24078,24107,24113,24141,24145,24153,24159,24163,24168,24176,24186,24192,24197,24202,24207,24212,24216,24222,24227,24231,24241,24251,24261,24269,24273,24277,24286,24298,24308,24316,24320,24328,24353,24357,24362],{"__ignoreMap":141},[145,23852,23853,23855],{"class":147,"line":148},[145,23854,347],{"class":258},[145,23856,328],{"class":262},[145,23858,23859,23861],{"class":147,"line":166},[145,23860,347],{"class":258},[145,23862,356],{"class":262},[145,23864,23865],{"class":147,"line":178},[145,23866,376],{"emptyLinePlaceholder":58},[145,23868,23869,23871,23873],{"class":147,"line":187},[145,23870,388],{"class":155},[145,23872,391],{"class":258},[145,23874,17601],{"class":159},[145,23876,23877,23879,23881],{"class":147,"line":373},[145,23878,412],{"class":155},[145,23880,391],{"class":258},[145,23882,417],{"class":159},[145,23884,23885,23887,23889],{"class":147,"line":379},[145,23886,423],{"class":155},[145,23888,391],{"class":258},[145,23890,428],{"class":262},[145,23892,23893,23895,23897,23899,23901,23903,23905],{"class":147,"line":385},[145,23894,434],{"class":159},[145,23896,437],{"class":262},[145,23898,440],{"class":258},[145,23900,443],{"class":159},[145,23902,446],{"class":155},[145,23904,449],{"class":159},[145,23906,452],{"class":262},[145,23908,23909,23911,23913],{"class":147,"line":409},[145,23910,458],{"class":159},[145,23912,437],{"class":262},[145,23914,463],{"class":159},[145,23916,23917],{"class":147,"line":420},[145,23918,469],{"class":262},[145,23920,23921],{"class":147,"line":431},[145,23922,376],{"emptyLinePlaceholder":58},[145,23924,23925,23927,23929,23931,23933,23935,23937,23939,23941],{"class":147,"line":455},[145,23926,526],{"class":258},[145,23928,529],{"class":151},[145,23930,11687],{"class":262},[145,23932,266],{"class":258},[145,23934,1352],{"class":155},[145,23936,23502],{"class":262},[145,23938,266],{"class":258},[145,23940,11698],{"class":155},[145,23942,548],{"class":262},[145,23944,23945,23947,23949,23951,23953,23955,23957,23959,23961,23963],{"class":147,"line":466},[145,23946,23518],{"class":262},[145,23948,266],{"class":258},[145,23950,3358],{"class":258},[145,23952,449],{"class":159},[145,23954,679],{"class":155},[145,23956,682],{"class":159},[145,23958,685],{"class":155},[145,23960,688],{"class":262},[145,23962,691],{"class":155},[145,23964,950],{"class":159},[145,23966,23967,23969,23971],{"class":147,"line":600},[145,23968,631],{"class":262},[145,23970,266],{"class":258},[145,23972,636],{"class":155},[145,23974,23975,23977,23979,23981],{"class":147,"line":605},[145,23976,642],{"class":258},[145,23978,645],{"class":262},[145,23980,648],{"class":258},[145,23982,23559],{"class":262},[145,23984,23985,23987,23989,23991,23993,23995,23997],{"class":147,"line":611},[145,23986,6929],{"class":262},[145,23988,266],{"class":258},[145,23990,1131],{"class":262},[145,23992,17830],{"class":701},[145,23994,266],{"class":258},[145,23996,423],{"class":155},[145,23998,406],{"class":262},[145,24000,24001,24003,24005],{"class":147,"line":617},[145,24002,23580],{"class":262},[145,24004,266],{"class":258},[145,24006,11768],{"class":262},[145,24008,24009,24011,24013,24015,24017],{"class":147,"line":623},[145,24010,753],{"class":262},[145,24012,266],{"class":258},[145,24014,23593],{"class":262},[145,24016,761],{"class":159},[145,24018,764],{"class":262},[145,24020,24021,24023,24025,24027,24029],{"class":147,"line":628},[145,24022,848],{"class":258},[145,24024,851],{"class":262},[145,24026,854],{"class":258},[145,24028,857],{"class":159},[145,24030,860],{"class":262},[145,24032,24033,24035,24037,24039,24041,24043,24046,24048,24050,24052,24054,24056,24058],{"class":147,"line":639},[145,24034,5577],{"class":155},[145,24036,794],{"class":262},[145,24038,440],{"class":258},[145,24040,11808],{"class":159},[145,24042,685],{"class":155},[145,24044,24045],{"class":262},"data[",[145,24047,17892],{"class":159},[145,24049,1562],{"class":262},[145,24051,17897],{"class":159},[145,24053,1535],{"class":262},[145,24055,691],{"class":155},[145,24057,449],{"class":159},[145,24059,406],{"class":262},[145,24061,24062,24064],{"class":147,"line":654},[145,24063,866],{"class":258},[145,24065,23656],{"class":262},[145,24067,24068,24070,24072,24074,24076],{"class":147,"line":660},[145,24069,875],{"class":258},[145,24071,851],{"class":262},[145,24073,854],{"class":258},[145,24075,882],{"class":159},[145,24077,860],{"class":262},[145,24079,24080,24082,24084,24086,24089,24091,24093,24095,24097,24099,24101,24103,24105],{"class":147,"line":671},[145,24081,5577],{"class":155},[145,24083,794],{"class":262},[145,24085,440],{"class":258},[145,24087,24088],{"class":159},"\"Failed: ",[145,24090,685],{"class":155},[145,24092,23683],{"class":262},[145,24094,11865],{"class":159},[145,24096,400],{"class":262},[145,24098,943],{"class":159},[145,24100,108],{"class":262},[145,24102,691],{"class":155},[145,24104,449],{"class":159},[145,24106,406],{"class":262},[145,24108,24109,24111],{"class":147,"line":698},[145,24110,866],{"class":258},[145,24112,23656],{"class":262},[145,24114,24115,24117,24119,24121,24123,24125,24127,24129,24131,24133,24135,24137,24139],{"class":147,"line":710},[145,24116,791],{"class":155},[145,24118,794],{"class":262},[145,24120,440],{"class":258},[145,24122,11894],{"class":159},[145,24124,685],{"class":155},[145,24126,814],{"class":262},[145,24128,691],{"class":155},[145,24130,1218],{"class":159},[145,24132,685],{"class":155},[145,24134,804],{"class":262},[145,24136,691],{"class":155},[145,24138,10725],{"class":159},[145,24140,406],{"class":262},[145,24142,24143],{"class":147,"line":716},[145,24144,11918],{"class":262},[145,24146,24147,24149,24151],{"class":147,"line":722},[145,24148,979],{"class":262},[145,24150,982],{"class":258},[145,24152,11927],{"class":262},[145,24154,24155,24157],{"class":147,"line":728},[145,24156,1703],{"class":258},[145,24158,11949],{"class":155},[145,24160,24161],{"class":147,"line":739},[145,24162,376],{"emptyLinePlaceholder":58},[145,24164,24165],{"class":147,"line":744},[145,24166,24167],{"class":174},"# --- Single Image Animation ---\n",[145,24169,24170,24172,24174],{"class":147,"line":750},[145,24171,3661],{"class":262},[145,24173,266],{"class":258},[145,24175,428],{"class":262},[145,24177,24178,24180,24182,24184],{"class":147,"line":767},[145,24179,3670],{"class":159},[145,24181,437],{"class":262},[145,24183,1308],{"class":159},[145,24185,452],{"class":262},[145,24187,24188,24190],{"class":147,"line":788},[145,24189,3681],{"class":159},[145,24191,1322],{"class":262},[145,24193,24194],{"class":147,"line":834},[145,24195,24196],{"class":159},"        \"The woman in the painting slowly reaches for a coffee cup on the table, \"\n",[145,24198,24199],{"class":147,"line":839},[145,24200,24201],{"class":159},"        \"lifts it to her lips, and takes a quiet sip. Soft morning light filters \"\n",[145,24203,24204],{"class":147,"line":845},[145,24205,24206],{"class":159},"        \"through a nearby window. Gentle steam rises from the cup. \"\n",[145,24208,24209],{"class":147,"line":863},[145,24210,24211],{"class":159},"        \"Painterly brushstroke texture preserved throughout.\"\n",[145,24213,24214],{"class":147,"line":872},[145,24215,3804],{"class":262},[145,24217,24218,24220],{"class":147,"line":887},[145,24219,15386],{"class":159},[145,24221,2691],{"class":262},[145,24223,24224],{"class":147,"line":903},[145,24225,24226],{"class":159},"        \"https://example.com/painting-woman.jpg\"\n",[145,24228,24229],{"class":147,"line":915},[145,24230,16367],{"class":262},[145,24232,24233,24235,24237,24239],{"class":147,"line":953},[145,24234,3693],{"class":159},[145,24236,437],{"class":262},[145,24238,3698],{"class":155},[145,24240,452],{"class":262},[145,24242,24243,24245,24247,24249],{"class":147,"line":959},[145,24244,3705],{"class":159},[145,24246,437],{"class":262},[145,24248,3710],{"class":159},[145,24250,452],{"class":262},[145,24252,24253,24255,24257,24259],{"class":147,"line":964},[145,24254,3717],{"class":159},[145,24256,437],{"class":262},[145,24258,1384],{"class":159},[145,24260,452],{"class":262},[145,24262,24263,24265,24267],{"class":147,"line":970},[145,24264,3733],{"class":159},[145,24266,437],{"class":262},[145,24268,3738],{"class":155},[145,24270,24271],{"class":147,"line":976},[145,24272,469],{"class":262},[145,24274,24275],{"class":147,"line":988},[145,24276,376],{"emptyLinePlaceholder":58},[145,24278,24279,24282,24284],{"class":147,"line":993},[145,24280,24281],{"class":262},"resp ",[145,24283,266],{"class":258},[145,24285,1432],{"class":262},[145,24287,24288,24290,24292,24294,24296],{"class":147,"line":5531},[145,24289,6538],{"class":258},[145,24291,449],{"class":159},[145,24293,679],{"class":155},[145,24295,1444],{"class":159},[145,24297,452],{"class":262},[145,24299,24300,24302,24304,24306],{"class":147,"line":5540},[145,24301,6551],{"class":701},[145,24303,266],{"class":258},[145,24305,423],{"class":155},[145,24307,452],{"class":262},[145,24309,24310,24312,24314],{"class":147,"line":5546},[145,24311,6562],{"class":701},[145,24313,266],{"class":258},[145,24315,2788],{"class":262},[145,24317,24318],{"class":147,"line":5574},[145,24319,406],{"class":262},[145,24321,24322,24324,24326],{"class":147,"line":5605},[145,24323,12238],{"class":262},[145,24325,266],{"class":258},[145,24327,11768],{"class":262},[145,24329,24330,24332,24334,24336,24339,24341,24343,24345,24347,24349,24351],{"class":147,"line":5625},[145,24331,6584],{"class":155},[145,24333,794],{"class":262},[145,24335,440],{"class":258},[145,24337,24338],{"class":159},"\"Task ID: ",[145,24340,685],{"class":155},[145,24342,11813],{"class":262},[145,24344,19889],{"class":159},[145,24346,1535],{"class":262},[145,24348,691],{"class":155},[145,24350,449],{"class":159},[145,24352,406],{"class":262},[145,24354,24355],{"class":147,"line":5631},[145,24356,376],{"emptyLinePlaceholder":58},[145,24358,24359],{"class":147,"line":5637},[145,24360,24361],{"class":174},"# Poll until complete\n",[145,24363,24364,24367,24369,24372,24374],{"class":147,"line":5642},[145,24365,24366],{"class":262},"video_data ",[145,24368,266],{"class":258},[145,24370,24371],{"class":262}," wait_for_video(result[",[145,24373,7693],{"class":159},[145,24375,1629],{"class":262},[18,24377,24378],{},[11,24379,24380,24383,24384,24386],{},[23,24381,24382],{},"Run this with your own API key."," Swap the ",[28,24385,2896],{}," value for any publicly accessible image URL.",[92,24388,24390],{"id":24389},"demo-painting-comes-to-life","Demo: Painting Comes to Life",[56,24392,60,24393],{"controls":58,"playsInline":58,"style":59},[62,24394],{"src":18790,"type":65},[11,24396,24397,14284,24400],{},[23,24398,24399],{},"Prompt used:",[2619,24401,24402],{},"\"The woman in the painting slowly reaches forward, picks up a coffee cup from the table, and takes a quiet sip. Soft indoor lighting. Painterly brushstroke style maintained. Subtle steam rises from the cup.\"",[11,24404,24405,24406,24408],{},"This demo uses a single painted portrait as ",[28,24407,2908],{}," (the character reference). The model preserves the oil-painting aesthetic while generating natural arm movement and steam physics.",[92,24410,24412],{"id":24411},"demo-style-transfer-animation","Demo: Style Transfer Animation",[56,24414,60,24415],{"controls":58,"playsInline":58,"style":59},[62,24416],{"src":24417,"type":65},"https://cdn.evolink.ai/seedance2api/%E6%A2%B5%E9%AB%98%E7%94%BB%E5%A5%B3%E5%AD%A9%E4%B8%8E%E6%9D%91%E5%BA%84.mp4",[11,24419,24420,14284,24422],{},[23,24421,24399],{},[2619,24423,24424],{},"\"A young girl walks along a winding path through a Van Gogh-style village. Swirling sky with thick brushstrokes. Vibrant yellows and blues. The girl's dress and hair flow in the wind. Camera slowly follows her from behind.\"",[11,24426,24427],{},"Notice how the Van Gogh brushstroke style from the input image carries through every frame — the swirling sky, the impasto texture on buildings, the color relationships. Single image animation excels at style-consistent motion.",[92,24429,24431],{"id":24430},"prompt-best-practices-for-single-image-mode","Prompt Best Practices for Single Image Mode",[11,24433,24434],{},"Your prompt determines the quality of the animation. Static descriptions produce static videos. Motion-rich prompts produce dynamic output.",[11,24436,24437],{},[23,24438,24439],{},"Weak prompt:",[136,24441,24444],{"className":24442,"code":24443,"language":2185},[2183],"A cat sitting on a windowsill\n",[28,24445,24443],{"__ignoreMap":141},[11,24447,24448],{},[23,24449,24450],{},"Strong prompt:",[136,24452,24455],{"className":24453,"code":24454,"language":2185},[2183],"The cat stretches lazily on the windowsill, yawns wide showing tiny teeth,\nthen curls back into a ball. Afternoon sunlight shifts slowly across the fur.\nDust motes float in the light beam. Camera holds steady, slight depth of field.\n",[28,24456,24454],{"__ignoreMap":141},[11,24458,24459,24460,24463,24464,24467,24468,24471],{},"The difference: the strong prompt specifies ",[23,24461,24462],{},"sequential actions"," (stretches → yawns → curls), ",[23,24465,24466],{},"environmental motion"," (sunlight shifts, dust motes), and ",[23,24469,24470],{},"camera behavior"," (steady, depth of field).",[11,24473,24474],{},"Key principles for single-image prompts:",[2036,24476,24477,24486],{},[2039,24478,24479],{},[2042,24480,24481,24484],{},[2045,24482,24483],{},"Principle",[2045,24485,11473],{},[2052,24487,24488,24496,24504,24512,24520],{},[2042,24489,24490,24493],{},[2057,24491,24492],{},"Describe motion, not appearance",[2057,24494,24495],{},"\"walks forward\" not \"a person standing\"",[2042,24497,24498,24501],{},[2057,24499,24500],{},"Sequence 2-3 actions",[2057,24502,24503],{},"\"picks up → examines → sets down\"",[2042,24505,24506,24509],{},[2057,24507,24508],{},"Add environmental dynamics",[2057,24510,24511],{},"\"wind rustles leaves\", \"rain beads on glass\"",[2042,24513,24514,24517],{},[2057,24515,24516],{},"Specify camera movement",[2057,24518,24519],{},"\"slow pan left\", \"camera pulls back to reveal\"",[2042,24521,24522,24525],{},[2057,24523,24524],{},"Match the image's art style",[2057,24526,24527],{},"\"painterly strokes preserved\", \"3D render quality\"",[11,24529,24530,24531,24533,24534,493],{},"For a complete prompt engineering reference, see the ",[37,24532,23033],{"href":1766},". For camera-specific techniques, see the ",[37,24535,23039],{"href":3856},[45,24537],{},[48,24539,24541],{"id":24540},"mode-2-first-last-frame-control","Mode 2: First-Last Frame Control",[11,24543,24544,24545,24548],{},"Single image mode anchors the beginning of your video. First-last frame mode anchors ",[23,24546,24547],{},"both ends",". You supply two images — the opening frame and the closing frame — and Seedance 2.0 generates a smooth transition between them.",[92,24550,6441],{"id":24551},"how-it-works-1",[11,24553,24554,24555,24557],{},"When ",[28,24556,2896],{}," contains exactly two URLs, the model interprets them as:",[97,24559,24560,24566],{},[73,24561,24562,24565],{},[23,24563,24564],{},"First URL"," → starting frame",[73,24567,24568,24571],{},[23,24569,24570],{},"Second URL"," → ending frame",[11,24573,24574,24575,24577],{},"The model then generates intermediate frames that create a natural, physically plausible transition. Your prompt guides the ",[2619,24576,11217],{}," of the transition — whether it's a smooth morph, a narrative journey, or a dramatic transformation.",[92,24579,24581],{"id":24580},"use-cases","Use Cases",[11,24583,24584],{},"First-last frame control solves problems that single-image mode cannot:",[97,24586,24587,24593,24599,24605,24611],{},[73,24588,24589,24592],{},[23,24590,24591],{},"Before/after reveals",": renovation, makeover, seasonal change",[73,24594,24595,24598],{},[23,24596,24597],{},"Time-lapse simulation",": dawn to dusk, empty room to furnished room",[73,24600,24601,24604],{},[23,24602,24603],{},"Scene transitions",": one location morphing into another",[73,24606,24607,24610],{},[23,24608,24609],{},"Product transformation",": closed packaging to open product display",[73,24612,24613,24616],{},[23,24614,24615],{},"Morphing effects",": one character or style becoming another",[92,24618,24620],{"id":24619},"complete-code-first-last-frame-interpolation","Complete Code: First-Last Frame Interpolation",[136,24622,24624],{"className":338,"code":24623,"language":340,"meta":141,"style":141},"import requests\nimport time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef wait_for_video(task_id, interval=5, max_wait=300):\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n    while elapsed \u003C max_wait:\n        resp = requests.get(url, headers=HEADERS)\n        data = resp.json()\n        status = data[\"status\"]\n        if status == \"completed\":\n            print(f\"Video ready: {data['output']['video_url']}\")\n            return data\n        elif status == \"failed\":\n            print(f\"Failed: {data.get('error', 'Unknown error')}\")\n            return data\n        print(f\"Status: {status} ({elapsed}s)\")\n        time.sleep(interval)\n        elapsed += interval\n    return None\n\n# --- First-Last Frame Control ---\npayload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"Smooth cinematic transition. The real-world landscape gradually \"\n        \"transforms into a traditional Chinese ink wash painting. Mountains \"\n        \"dissolve from photorealistic to brushstroke. Water becomes flowing ink. \"\n        \"Sky shifts from blue to rice-paper white. Slow, meditative pace.\"\n    ),\n    \"image_urls\": [\n        \"https://example.com/real-landscape.jpg\",\n        \"https://example.com/ink-wash-painting.jpg\"\n    ],\n    \"duration\": 10,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\"\n}\n\nresp = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\nresult = resp.json()\nprint(f\"Task ID: {result['task_id']}\")\n\nvideo_data = wait_for_video(result[\"task_id\"])\n",[28,24625,24626,24632,24638,24642,24650,24658,24666,24682,24690,24694,24698,24718,24740,24748,24758,24774,24782,24794,24806,24834,24840,24852,24880,24886,24914,24918,24926,24932,24936,24941,24949,24959,24965,24970,24975,24980,24985,24989,24995,25002,25007,25011,25021,25031,25039,25043,25047,25055,25067,25077,25085,25089,25097,25121,25125],{"__ignoreMap":141},[145,24627,24628,24630],{"class":147,"line":148},[145,24629,347],{"class":258},[145,24631,328],{"class":262},[145,24633,24634,24636],{"class":147,"line":166},[145,24635,347],{"class":258},[145,24637,356],{"class":262},[145,24639,24640],{"class":147,"line":178},[145,24641,376],{"emptyLinePlaceholder":58},[145,24643,24644,24646,24648],{"class":147,"line":187},[145,24645,388],{"class":155},[145,24647,391],{"class":258},[145,24649,17601],{"class":159},[145,24651,24652,24654,24656],{"class":147,"line":373},[145,24653,412],{"class":155},[145,24655,391],{"class":258},[145,24657,417],{"class":159},[145,24659,24660,24662,24664],{"class":147,"line":379},[145,24661,423],{"class":155},[145,24663,391],{"class":258},[145,24665,428],{"class":262},[145,24667,24668,24670,24672,24674,24676,24678,24680],{"class":147,"line":385},[145,24669,434],{"class":159},[145,24671,437],{"class":262},[145,24673,440],{"class":258},[145,24675,443],{"class":159},[145,24677,446],{"class":155},[145,24679,449],{"class":159},[145,24681,452],{"class":262},[145,24683,24684,24686,24688],{"class":147,"line":409},[145,24685,458],{"class":159},[145,24687,437],{"class":262},[145,24689,463],{"class":159},[145,24691,24692],{"class":147,"line":420},[145,24693,469],{"class":262},[145,24695,24696],{"class":147,"line":431},[145,24697,376],{"emptyLinePlaceholder":58},[145,24699,24700,24702,24704,24706,24708,24710,24712,24714,24716],{"class":147,"line":455},[145,24701,526],{"class":258},[145,24703,529],{"class":151},[145,24705,11687],{"class":262},[145,24707,266],{"class":258},[145,24709,1352],{"class":155},[145,24711,23502],{"class":262},[145,24713,266],{"class":258},[145,24715,11698],{"class":155},[145,24717,548],{"class":262},[145,24719,24720,24722,24724,24726,24728,24730,24732,24734,24736,24738],{"class":147,"line":466},[145,24721,23518],{"class":262},[145,24723,266],{"class":258},[145,24725,3358],{"class":258},[145,24727,449],{"class":159},[145,24729,679],{"class":155},[145,24731,682],{"class":159},[145,24733,685],{"class":155},[145,24735,688],{"class":262},[145,24737,691],{"class":155},[145,24739,950],{"class":159},[145,24741,24742,24744,24746],{"class":147,"line":600},[145,24743,631],{"class":262},[145,24745,266],{"class":258},[145,24747,636],{"class":155},[145,24749,24750,24752,24754,24756],{"class":147,"line":605},[145,24751,642],{"class":258},[145,24753,645],{"class":262},[145,24755,648],{"class":258},[145,24757,23559],{"class":262},[145,24759,24760,24762,24764,24766,24768,24770,24772],{"class":147,"line":611},[145,24761,6929],{"class":262},[145,24763,266],{"class":258},[145,24765,1131],{"class":262},[145,24767,17830],{"class":701},[145,24769,266],{"class":258},[145,24771,423],{"class":155},[145,24773,406],{"class":262},[145,24775,24776,24778,24780],{"class":147,"line":617},[145,24777,23580],{"class":262},[145,24779,266],{"class":258},[145,24781,11768],{"class":262},[145,24783,24784,24786,24788,24790,24792],{"class":147,"line":623},[145,24785,753],{"class":262},[145,24787,266],{"class":258},[145,24789,23593],{"class":262},[145,24791,761],{"class":159},[145,24793,764],{"class":262},[145,24795,24796,24798,24800,24802,24804],{"class":147,"line":628},[145,24797,848],{"class":258},[145,24799,851],{"class":262},[145,24801,854],{"class":258},[145,24803,857],{"class":159},[145,24805,860],{"class":262},[145,24807,24808,24810,24812,24814,24816,24818,24820,24822,24824,24826,24828,24830,24832],{"class":147,"line":639},[145,24809,5577],{"class":155},[145,24811,794],{"class":262},[145,24813,440],{"class":258},[145,24815,11808],{"class":159},[145,24817,685],{"class":155},[145,24819,24045],{"class":262},[145,24821,17892],{"class":159},[145,24823,1562],{"class":262},[145,24825,17897],{"class":159},[145,24827,1535],{"class":262},[145,24829,691],{"class":155},[145,24831,449],{"class":159},[145,24833,406],{"class":262},[145,24835,24836,24838],{"class":147,"line":654},[145,24837,866],{"class":258},[145,24839,23656],{"class":262},[145,24841,24842,24844,24846,24848,24850],{"class":147,"line":660},[145,24843,875],{"class":258},[145,24845,851],{"class":262},[145,24847,854],{"class":258},[145,24849,882],{"class":159},[145,24851,860],{"class":262},[145,24853,24854,24856,24858,24860,24862,24864,24866,24868,24870,24872,24874,24876,24878],{"class":147,"line":671},[145,24855,5577],{"class":155},[145,24857,794],{"class":262},[145,24859,440],{"class":258},[145,24861,24088],{"class":159},[145,24863,685],{"class":155},[145,24865,23683],{"class":262},[145,24867,11865],{"class":159},[145,24869,400],{"class":262},[145,24871,943],{"class":159},[145,24873,108],{"class":262},[145,24875,691],{"class":155},[145,24877,449],{"class":159},[145,24879,406],{"class":262},[145,24881,24882,24884],{"class":147,"line":698},[145,24883,866],{"class":258},[145,24885,23656],{"class":262},[145,24887,24888,24890,24892,24894,24896,24898,24900,24902,24904,24906,24908,24910,24912],{"class":147,"line":710},[145,24889,791],{"class":155},[145,24891,794],{"class":262},[145,24893,440],{"class":258},[145,24895,11894],{"class":159},[145,24897,685],{"class":155},[145,24899,814],{"class":262},[145,24901,691],{"class":155},[145,24903,1218],{"class":159},[145,24905,685],{"class":155},[145,24907,804],{"class":262},[145,24909,691],{"class":155},[145,24911,10725],{"class":159},[145,24913,406],{"class":262},[145,24915,24916],{"class":147,"line":716},[145,24917,11918],{"class":262},[145,24919,24920,24922,24924],{"class":147,"line":722},[145,24921,979],{"class":262},[145,24923,982],{"class":258},[145,24925,11927],{"class":262},[145,24927,24928,24930],{"class":147,"line":728},[145,24929,1703],{"class":258},[145,24931,11949],{"class":155},[145,24933,24934],{"class":147,"line":739},[145,24935,376],{"emptyLinePlaceholder":58},[145,24937,24938],{"class":147,"line":744},[145,24939,24940],{"class":174},"# --- First-Last Frame Control ---\n",[145,24942,24943,24945,24947],{"class":147,"line":750},[145,24944,3661],{"class":262},[145,24946,266],{"class":258},[145,24948,428],{"class":262},[145,24950,24951,24953,24955,24957],{"class":147,"line":767},[145,24952,3670],{"class":159},[145,24954,437],{"class":262},[145,24956,1308],{"class":159},[145,24958,452],{"class":262},[145,24960,24961,24963],{"class":147,"line":788},[145,24962,3681],{"class":159},[145,24964,1322],{"class":262},[145,24966,24967],{"class":147,"line":834},[145,24968,24969],{"class":159},"        \"Smooth cinematic transition. The real-world landscape gradually \"\n",[145,24971,24972],{"class":147,"line":839},[145,24973,24974],{"class":159},"        \"transforms into a traditional Chinese ink wash painting. Mountains \"\n",[145,24976,24977],{"class":147,"line":845},[145,24978,24979],{"class":159},"        \"dissolve from photorealistic to brushstroke. Water becomes flowing ink. \"\n",[145,24981,24982],{"class":147,"line":863},[145,24983,24984],{"class":159},"        \"Sky shifts from blue to rice-paper white. Slow, meditative pace.\"\n",[145,24986,24987],{"class":147,"line":872},[145,24988,3804],{"class":262},[145,24990,24991,24993],{"class":147,"line":887},[145,24992,15386],{"class":159},[145,24994,2691],{"class":262},[145,24996,24997,25000],{"class":147,"line":903},[145,24998,24999],{"class":159},"        \"https://example.com/real-landscape.jpg\"",[145,25001,452],{"class":262},[145,25003,25004],{"class":147,"line":915},[145,25005,25006],{"class":159},"        \"https://example.com/ink-wash-painting.jpg\"\n",[145,25008,25009],{"class":147,"line":953},[145,25010,16367],{"class":262},[145,25012,25013,25015,25017,25019],{"class":147,"line":959},[145,25014,3693],{"class":159},[145,25016,437],{"class":262},[145,25018,537],{"class":155},[145,25020,452],{"class":262},[145,25022,25023,25025,25027,25029],{"class":147,"line":964},[145,25024,3705],{"class":159},[145,25026,437],{"class":262},[145,25028,3710],{"class":159},[145,25030,452],{"class":262},[145,25032,25033,25035,25037],{"class":147,"line":970},[145,25034,3717],{"class":159},[145,25036,437],{"class":262},[145,25038,2730],{"class":159},[145,25040,25041],{"class":147,"line":976},[145,25042,469],{"class":262},[145,25044,25045],{"class":147,"line":988},[145,25046,376],{"emptyLinePlaceholder":58},[145,25048,25049,25051,25053],{"class":147,"line":993},[145,25050,24281],{"class":262},[145,25052,266],{"class":258},[145,25054,1432],{"class":262},[145,25056,25057,25059,25061,25063,25065],{"class":147,"line":5531},[145,25058,6538],{"class":258},[145,25060,449],{"class":159},[145,25062,679],{"class":155},[145,25064,1444],{"class":159},[145,25066,452],{"class":262},[145,25068,25069,25071,25073,25075],{"class":147,"line":5540},[145,25070,6551],{"class":701},[145,25072,266],{"class":258},[145,25074,423],{"class":155},[145,25076,452],{"class":262},[145,25078,25079,25081,25083],{"class":147,"line":5546},[145,25080,6562],{"class":701},[145,25082,266],{"class":258},[145,25084,2788],{"class":262},[145,25086,25087],{"class":147,"line":5574},[145,25088,406],{"class":262},[145,25090,25091,25093,25095],{"class":147,"line":5605},[145,25092,12238],{"class":262},[145,25094,266],{"class":258},[145,25096,11768],{"class":262},[145,25098,25099,25101,25103,25105,25107,25109,25111,25113,25115,25117,25119],{"class":147,"line":5625},[145,25100,6584],{"class":155},[145,25102,794],{"class":262},[145,25104,440],{"class":258},[145,25106,24338],{"class":159},[145,25108,685],{"class":155},[145,25110,11813],{"class":262},[145,25112,19889],{"class":159},[145,25114,1535],{"class":262},[145,25116,691],{"class":155},[145,25118,449],{"class":159},[145,25120,406],{"class":262},[145,25122,25123],{"class":147,"line":5631},[145,25124,376],{"emptyLinePlaceholder":58},[145,25126,25127,25129,25131,25133,25135],{"class":147,"line":5637},[145,25128,24366],{"class":262},[145,25130,266],{"class":258},[145,25132,24371],{"class":262},[145,25134,7693],{"class":159},[145,25136,1629],{"class":262},[92,25138,25140],{"id":25139},"demo-reality-to-ink-painting","Demo: Reality to Ink Painting",[56,25142,60,25143],{"controls":58,"playsInline":58,"style":59},[62,25144],{"src":25145,"type":65},"https://cdn.evolink.ai/seedance2api/%E7%8E%B0%E5%AE%9E%E5%9C%BA%E6%99%AF%E5%B1%B1%E6%B0%B4%E7%94%BB.mp4",[11,25147,25148,14284,25150],{},[23,25149,24399],{},[2619,25151,25152],{},"\"The real-world mountain landscape gradually transforms into a traditional Chinese ink wash (山水画) painting. Photorealistic textures dissolve into flowing brushstrokes. Colors fade from vivid to monochrome ink tones. Water surfaces become calligraphic ink flows. Slow, contemplative transition.\"",[11,25154,25155],{},"The first frame is a photorealistic mountain landscape. The last frame is a traditional ink wash painting of a similar scene. The model creates a seamless transformation where photographic textures progressively dissolve into brushstrokes — an effect that would take hours to achieve manually in After Effects.",[92,25157,25159],{"id":25158},"tips-for-first-last-frame-mode","Tips for First-Last Frame Mode",[11,25161,25162,25165],{},[23,25163,25164],{},"Match composition between frames."," If your first frame has a mountain on the left, your last frame should have a similar structural element in the same position. The model generates better transitions when both frames share roughly the same layout.",[11,25167,25168,25171,25172,25175],{},[23,25169,25170],{},"Describe the transition, not just the endpoints."," The model already knows what the start and end look like — it has the images. Your prompt should describe ",[2619,25173,25174],{},"how"," to get from A to B.",[136,25177,25180],{"className":25178,"code":25179,"language":2185},[2183],"# Weak: just describes the endpoints\n\"A sunrise and a sunset\"\n\n# Strong: describes the journey\n\"The golden dawn light gradually warms to midday brightness,\nthen softens through amber afternoon hues into deep sunset oranges.\nShadows rotate clockwise. Cloud formations shift and reform.\"\n",[28,25181,25179],{"__ignoreMap":141},[11,25183,25184,25187],{},[23,25185,25186],{},"Use longer durations for complex transitions."," A simple color shift works in 4 seconds. A style transformation (photorealistic → illustrated) benefits from 8–12 seconds. Abrupt changes at short durations look jarring.",[2036,25189,25190,25199],{},[2039,25191,25192],{},[2042,25193,25194,25197],{},[2045,25195,25196],{},"Transition Type",[2045,25198,19417],{},[2052,25200,25201,25208,25215,25223],{},[2042,25202,25203,25206],{},[2057,25204,25205],{},"Color/lighting shift",[2057,25207,19509],{},[2042,25209,25210,25213],{},[2057,25211,25212],{},"Camera position change",[2057,25214,19432],{},[2042,25216,25217,25220],{},[2057,25218,25219],{},"Style transformation",[2057,25221,25222],{},"8–12s",[2042,25224,25225,25228],{},[2057,25226,25227],{},"Narrative scene change",[2057,25229,25230],{},"10–15s",[45,25232],{},[48,25234,25236],{"id":25235},"mode-3-multi-image-composition-with-tags","Mode 3: Multi-Image Composition with @Tags",[11,25238,25239,25240,25242],{},"This is Seedance 2.0's most powerful image-to-video mode — and the one no competing API offers. You provide up to 9 images, assign each a semantic role using ",[28,25241,4144],{}," tags in your prompt, and the model composes them into a single coherent video.",[92,25244,25246],{"id":25245},"how-tags-work","How @Tags Work",[11,25248,25249,25250,25252],{},"When you include multiple URLs in ",[28,25251,2896],{},", Seedance 2.0 assigns them sequential tags based on their array position:",[136,25254,25257],{"className":25255,"code":25256,"language":2185},[2183],"image_urls[0] → @Image1\nimage_urls[1] → @Image2\nimage_urls[2] → @Image3\n...\nimage_urls[8] → @Image9\n",[28,25258,25256],{"__ignoreMap":141},[11,25260,25261],{},"You reference these tags in your prompt to tell the model exactly how to use each image:",[136,25263,25266],{"className":25264,"code":25265,"language":2185},[2183],"@Image1 is the main character running through the city.\n@Image2 is the city skyline in the background.\n@Image3 defines the color grading and visual mood.\n",[28,25267,25265],{"__ignoreMap":141},[11,25269,25270],{},"Without tags, the model would have to guess which image is the character and which is the background. With tags, there's no ambiguity. This is especially important when your images look visually similar or when you want a specific image to control style rather than content.",[92,25272,25274],{"id":25273},"complete-code-multi-image-composition","Complete Code: Multi-Image Composition",[136,25276,25278],{"className":338,"code":25277,"language":340,"meta":141,"style":141},"import requests\nimport time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef wait_for_video(task_id, interval=5, max_wait=300):\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n    while elapsed \u003C max_wait:\n        resp = requests.get(url, headers=HEADERS)\n        data = resp.json()\n        status = data[\"status\"]\n        if status == \"completed\":\n            print(f\"Video ready: {data['output']['video_url']}\")\n            return data\n        elif status == \"failed\":\n            print(f\"Failed: {data.get('error', 'Unknown error')}\")\n            return data\n        print(f\"Status: {status} ({elapsed}s)\")\n        time.sleep(interval)\n        elapsed += interval\n    return None\n\n# --- Multi-Image Composition with @Tags ---\npayload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"@Image1 is a parkour runner in dark athletic gear. \"\n        \"@Image2 is a futuristic city rooftop at twilight. \"\n        \"@Image3 is a neon-lit alleyway. \"\n        \"@Image4 is a glass skyscraper facade. \"\n        \"@Image5 provides the cyberpunk color grading reference. \"\n        \"The runner (@Image1) sprints across the rooftop (@Image2), \"\n        \"leaps over the edge, flips through the alleyway (@Image3), \"\n        \"and wall-runs along the skyscraper (@Image4). \"\n        \"Dynamic handheld camera follows the action. \"\n        \"Cyberpunk neon color palette from @Image5 throughout.\"\n    ),\n    \"image_urls\": [\n        \"https://example.com/runner.jpg\",\n        \"https://example.com/rooftop.jpg\",\n        \"https://example.com/alley.jpg\",\n        \"https://example.com/skyscraper.jpg\",\n        \"https://example.com/cyberpunk-ref.jpg\"\n    ],\n    \"duration\": 10,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": True\n}\n\nresp = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\nresult = resp.json()\nprint(f\"Task ID: {result['task_id']}\")\n\nvideo_data = wait_for_video(result[\"task_id\"])\n",[28,25279,25280,25286,25292,25296,25304,25312,25320,25336,25344,25348,25352,25372,25394,25402,25412,25428,25436,25448,25460,25488,25494,25506,25534,25540,25568,25572,25580,25586,25590,25595,25603,25613,25619,25624,25629,25634,25639,25644,25649,25654,25659,25664,25669,25673,25679,25686,25693,25700,25707,25712,25716,25726,25736,25746,25754,25758,25762,25770,25782,25792,25800,25804,25812,25836,25840],{"__ignoreMap":141},[145,25281,25282,25284],{"class":147,"line":148},[145,25283,347],{"class":258},[145,25285,328],{"class":262},[145,25287,25288,25290],{"class":147,"line":166},[145,25289,347],{"class":258},[145,25291,356],{"class":262},[145,25293,25294],{"class":147,"line":178},[145,25295,376],{"emptyLinePlaceholder":58},[145,25297,25298,25300,25302],{"class":147,"line":187},[145,25299,388],{"class":155},[145,25301,391],{"class":258},[145,25303,17601],{"class":159},[145,25305,25306,25308,25310],{"class":147,"line":373},[145,25307,412],{"class":155},[145,25309,391],{"class":258},[145,25311,417],{"class":159},[145,25313,25314,25316,25318],{"class":147,"line":379},[145,25315,423],{"class":155},[145,25317,391],{"class":258},[145,25319,428],{"class":262},[145,25321,25322,25324,25326,25328,25330,25332,25334],{"class":147,"line":385},[145,25323,434],{"class":159},[145,25325,437],{"class":262},[145,25327,440],{"class":258},[145,25329,443],{"class":159},[145,25331,446],{"class":155},[145,25333,449],{"class":159},[145,25335,452],{"class":262},[145,25337,25338,25340,25342],{"class":147,"line":409},[145,25339,458],{"class":159},[145,25341,437],{"class":262},[145,25343,463],{"class":159},[145,25345,25346],{"class":147,"line":420},[145,25347,469],{"class":262},[145,25349,25350],{"class":147,"line":431},[145,25351,376],{"emptyLinePlaceholder":58},[145,25353,25354,25356,25358,25360,25362,25364,25366,25368,25370],{"class":147,"line":455},[145,25355,526],{"class":258},[145,25357,529],{"class":151},[145,25359,11687],{"class":262},[145,25361,266],{"class":258},[145,25363,1352],{"class":155},[145,25365,23502],{"class":262},[145,25367,266],{"class":258},[145,25369,11698],{"class":155},[145,25371,548],{"class":262},[145,25373,25374,25376,25378,25380,25382,25384,25386,25388,25390,25392],{"class":147,"line":466},[145,25375,23518],{"class":262},[145,25377,266],{"class":258},[145,25379,3358],{"class":258},[145,25381,449],{"class":159},[145,25383,679],{"class":155},[145,25385,682],{"class":159},[145,25387,685],{"class":155},[145,25389,688],{"class":262},[145,25391,691],{"class":155},[145,25393,950],{"class":159},[145,25395,25396,25398,25400],{"class":147,"line":600},[145,25397,631],{"class":262},[145,25399,266],{"class":258},[145,25401,636],{"class":155},[145,25403,25404,25406,25408,25410],{"class":147,"line":605},[145,25405,642],{"class":258},[145,25407,645],{"class":262},[145,25409,648],{"class":258},[145,25411,23559],{"class":262},[145,25413,25414,25416,25418,25420,25422,25424,25426],{"class":147,"line":611},[145,25415,6929],{"class":262},[145,25417,266],{"class":258},[145,25419,1131],{"class":262},[145,25421,17830],{"class":701},[145,25423,266],{"class":258},[145,25425,423],{"class":155},[145,25427,406],{"class":262},[145,25429,25430,25432,25434],{"class":147,"line":617},[145,25431,23580],{"class":262},[145,25433,266],{"class":258},[145,25435,11768],{"class":262},[145,25437,25438,25440,25442,25444,25446],{"class":147,"line":623},[145,25439,753],{"class":262},[145,25441,266],{"class":258},[145,25443,23593],{"class":262},[145,25445,761],{"class":159},[145,25447,764],{"class":262},[145,25449,25450,25452,25454,25456,25458],{"class":147,"line":628},[145,25451,848],{"class":258},[145,25453,851],{"class":262},[145,25455,854],{"class":258},[145,25457,857],{"class":159},[145,25459,860],{"class":262},[145,25461,25462,25464,25466,25468,25470,25472,25474,25476,25478,25480,25482,25484,25486],{"class":147,"line":639},[145,25463,5577],{"class":155},[145,25465,794],{"class":262},[145,25467,440],{"class":258},[145,25469,11808],{"class":159},[145,25471,685],{"class":155},[145,25473,24045],{"class":262},[145,25475,17892],{"class":159},[145,25477,1562],{"class":262},[145,25479,17897],{"class":159},[145,25481,1535],{"class":262},[145,25483,691],{"class":155},[145,25485,449],{"class":159},[145,25487,406],{"class":262},[145,25489,25490,25492],{"class":147,"line":654},[145,25491,866],{"class":258},[145,25493,23656],{"class":262},[145,25495,25496,25498,25500,25502,25504],{"class":147,"line":660},[145,25497,875],{"class":258},[145,25499,851],{"class":262},[145,25501,854],{"class":258},[145,25503,882],{"class":159},[145,25505,860],{"class":262},[145,25507,25508,25510,25512,25514,25516,25518,25520,25522,25524,25526,25528,25530,25532],{"class":147,"line":671},[145,25509,5577],{"class":155},[145,25511,794],{"class":262},[145,25513,440],{"class":258},[145,25515,24088],{"class":159},[145,25517,685],{"class":155},[145,25519,23683],{"class":262},[145,25521,11865],{"class":159},[145,25523,400],{"class":262},[145,25525,943],{"class":159},[145,25527,108],{"class":262},[145,25529,691],{"class":155},[145,25531,449],{"class":159},[145,25533,406],{"class":262},[145,25535,25536,25538],{"class":147,"line":698},[145,25537,866],{"class":258},[145,25539,23656],{"class":262},[145,25541,25542,25544,25546,25548,25550,25552,25554,25556,25558,25560,25562,25564,25566],{"class":147,"line":710},[145,25543,791],{"class":155},[145,25545,794],{"class":262},[145,25547,440],{"class":258},[145,25549,11894],{"class":159},[145,25551,685],{"class":155},[145,25553,814],{"class":262},[145,25555,691],{"class":155},[145,25557,1218],{"class":159},[145,25559,685],{"class":155},[145,25561,804],{"class":262},[145,25563,691],{"class":155},[145,25565,10725],{"class":159},[145,25567,406],{"class":262},[145,25569,25570],{"class":147,"line":716},[145,25571,11918],{"class":262},[145,25573,25574,25576,25578],{"class":147,"line":722},[145,25575,979],{"class":262},[145,25577,982],{"class":258},[145,25579,11927],{"class":262},[145,25581,25582,25584],{"class":147,"line":728},[145,25583,1703],{"class":258},[145,25585,11949],{"class":155},[145,25587,25588],{"class":147,"line":739},[145,25589,376],{"emptyLinePlaceholder":58},[145,25591,25592],{"class":147,"line":744},[145,25593,25594],{"class":174},"# --- Multi-Image Composition with @Tags ---\n",[145,25596,25597,25599,25601],{"class":147,"line":750},[145,25598,3661],{"class":262},[145,25600,266],{"class":258},[145,25602,428],{"class":262},[145,25604,25605,25607,25609,25611],{"class":147,"line":767},[145,25606,3670],{"class":159},[145,25608,437],{"class":262},[145,25610,1308],{"class":159},[145,25612,452],{"class":262},[145,25614,25615,25617],{"class":147,"line":788},[145,25616,3681],{"class":159},[145,25618,1322],{"class":262},[145,25620,25621],{"class":147,"line":834},[145,25622,25623],{"class":159},"        \"@Image1 is a parkour runner in dark athletic gear. \"\n",[145,25625,25626],{"class":147,"line":839},[145,25627,25628],{"class":159},"        \"@Image2 is a futuristic city rooftop at twilight. \"\n",[145,25630,25631],{"class":147,"line":845},[145,25632,25633],{"class":159},"        \"@Image3 is a neon-lit alleyway. \"\n",[145,25635,25636],{"class":147,"line":863},[145,25637,25638],{"class":159},"        \"@Image4 is a glass skyscraper facade. \"\n",[145,25640,25641],{"class":147,"line":872},[145,25642,25643],{"class":159},"        \"@Image5 provides the cyberpunk color grading reference. \"\n",[145,25645,25646],{"class":147,"line":887},[145,25647,25648],{"class":159},"        \"The runner (@Image1) sprints across the rooftop (@Image2), \"\n",[145,25650,25651],{"class":147,"line":903},[145,25652,25653],{"class":159},"        \"leaps over the edge, flips through the alleyway (@Image3), \"\n",[145,25655,25656],{"class":147,"line":915},[145,25657,25658],{"class":159},"        \"and wall-runs along the skyscraper (@Image4). \"\n",[145,25660,25661],{"class":147,"line":953},[145,25662,25663],{"class":159},"        \"Dynamic handheld camera follows the action. \"\n",[145,25665,25666],{"class":147,"line":959},[145,25667,25668],{"class":159},"        \"Cyberpunk neon color palette from @Image5 throughout.\"\n",[145,25670,25671],{"class":147,"line":964},[145,25672,3804],{"class":262},[145,25674,25675,25677],{"class":147,"line":970},[145,25676,15386],{"class":159},[145,25678,2691],{"class":262},[145,25680,25681,25684],{"class":147,"line":976},[145,25682,25683],{"class":159},"        \"https://example.com/runner.jpg\"",[145,25685,452],{"class":262},[145,25687,25688,25691],{"class":147,"line":988},[145,25689,25690],{"class":159},"        \"https://example.com/rooftop.jpg\"",[145,25692,452],{"class":262},[145,25694,25695,25698],{"class":147,"line":993},[145,25696,25697],{"class":159},"        \"https://example.com/alley.jpg\"",[145,25699,452],{"class":262},[145,25701,25702,25705],{"class":147,"line":5531},[145,25703,25704],{"class":159},"        \"https://example.com/skyscraper.jpg\"",[145,25706,452],{"class":262},[145,25708,25709],{"class":147,"line":5540},[145,25710,25711],{"class":159},"        \"https://example.com/cyberpunk-ref.jpg\"\n",[145,25713,25714],{"class":147,"line":5546},[145,25715,16367],{"class":262},[145,25717,25718,25720,25722,25724],{"class":147,"line":5574},[145,25719,3693],{"class":159},[145,25721,437],{"class":262},[145,25723,537],{"class":155},[145,25725,452],{"class":262},[145,25727,25728,25730,25732,25734],{"class":147,"line":5605},[145,25729,3705],{"class":159},[145,25731,437],{"class":262},[145,25733,3710],{"class":159},[145,25735,452],{"class":262},[145,25737,25738,25740,25742,25744],{"class":147,"line":5625},[145,25739,3717],{"class":159},[145,25741,437],{"class":262},[145,25743,1384],{"class":159},[145,25745,452],{"class":262},[145,25747,25748,25750,25752],{"class":147,"line":5631},[145,25749,3733],{"class":159},[145,25751,437],{"class":262},[145,25753,3738],{"class":155},[145,25755,25756],{"class":147,"line":5637},[145,25757,469],{"class":262},[145,25759,25760],{"class":147,"line":5642},[145,25761,376],{"emptyLinePlaceholder":58},[145,25763,25764,25766,25768],{"class":147,"line":5655},[145,25765,24281],{"class":262},[145,25767,266],{"class":258},[145,25769,1432],{"class":262},[145,25771,25772,25774,25776,25778,25780],{"class":147,"line":5661},[145,25773,6538],{"class":258},[145,25775,449],{"class":159},[145,25777,679],{"class":155},[145,25779,1444],{"class":159},[145,25781,452],{"class":262},[145,25783,25784,25786,25788,25790],{"class":147,"line":5688},[145,25785,6551],{"class":701},[145,25787,266],{"class":258},[145,25789,423],{"class":155},[145,25791,452],{"class":262},[145,25793,25794,25796,25798],{"class":147,"line":5728},[145,25795,6562],{"class":701},[145,25797,266],{"class":258},[145,25799,2788],{"class":262},[145,25801,25802],{"class":147,"line":5747},[145,25803,406],{"class":262},[145,25805,25806,25808,25810],{"class":147,"line":5752},[145,25807,12238],{"class":262},[145,25809,266],{"class":258},[145,25811,11768],{"class":262},[145,25813,25814,25816,25818,25820,25822,25824,25826,25828,25830,25832,25834],{"class":147,"line":5757},[145,25815,6584],{"class":155},[145,25817,794],{"class":262},[145,25819,440],{"class":258},[145,25821,24338],{"class":159},[145,25823,685],{"class":155},[145,25825,11813],{"class":262},[145,25827,19889],{"class":159},[145,25829,1535],{"class":262},[145,25831,691],{"class":155},[145,25833,449],{"class":159},[145,25835,406],{"class":262},[145,25837,25838],{"class":147,"line":5762},[145,25839,376],{"emptyLinePlaceholder":58},[145,25841,25842,25844,25846,25848,25850],{"class":147,"line":7442},[145,25843,24366],{"class":262},[145,25845,266],{"class":258},[145,25847,24371],{"class":262},[145,25849,7693],{"class":159},[145,25851,1629],{"class":262},[92,25853,25855],{"id":25854},"demo-city-parkour-with-5-image-references","Demo: City Parkour with 5 Image References",[56,25857,60,25858],{"controls":58,"playsInline":58,"style":59},[62,25859],{"src":12258,"type":65},[11,25861,25862,14284,25864],{},[23,25863,24399],{},[2619,25865,25866],{},"\"@Image1 is the parkour runner. @Image2 is the rooftop environment. @Image3 is the neon alley. @Image4 is the glass building. @Image5 is the color palette reference. The runner (@Image1) sprints across the rooftop (@Image2), leaps, flips through the alley (@Image3), wall-runs along the building (@Image4). Dynamic tracking camera. Cyberpunk color grading from @Image5.\"",[11,25868,25869,25870,25872],{},"Five separate images — a character, three environments, and a style reference — combine into a single continuous action sequence. Each ",[28,25871,4144],{}," tag gives the model precise instructions about which visual element controls which part of the scene.",[92,25874,25876],{"id":25875},"common-tag-role-assignments","Common @Tag Role Assignments",[11,25878,2176,25879,25881],{},[28,25880,23123],{}," system is flexible. Here are the most effective patterns:",[2036,25883,25884,25897],{},[2039,25885,25886],{},[2042,25887,25888,25891,25894],{},[2045,25889,25890],{},"Role",[2045,25892,25893],{},"Tag Usage in Prompt",[2045,25895,25896],{},"Purpose",[2052,25898,25899,25912,25925,25938,25951,25964],{},[2042,25900,25901,25904,25909],{},[2057,25902,25903],{},"Character",[2057,25905,25906],{},[28,25907,25908],{},"@Image1 is the main character",[2057,25910,25911],{},"Preserves identity, clothing, features",[2042,25913,25914,25917,25922],{},[2057,25915,25916],{},"Background",[2057,25918,25919],{},[28,25920,25921],{},"@Image2 is the environment",[2057,25923,25924],{},"Sets the scene location",[2042,25926,25927,25930,25935],{},[2057,25928,25929],{},"Style reference",[2057,25931,25932],{},[28,25933,25934],{},"@Image3 defines the art style",[2057,25936,25937],{},"Controls rendering aesthetic",[2042,25939,25940,25943,25948],{},[2057,25941,25942],{},"Object/prop",[2057,25944,25945],{},[28,25946,25947],{},"@Image4 is the product on the table",[2057,25949,25950],{},"Places specific items in scene",[2042,25952,25953,25956,25961],{},[2057,25954,25955],{},"Color grading",[2057,25957,25958],{},[28,25959,25960],{},"@Image5 is the color palette",[2057,25962,25963],{},"Applies mood/tone from reference",[2042,25965,25966,25969,25974],{},[2057,25967,25968],{},"Texture reference",[2057,25970,25971],{},[28,25972,25973],{},"@Image6 provides surface textures",[2057,25975,25976],{},"Material/texture transfer",[92,25978,25980],{"id":25979},"demo-character-with-style-reference","Demo: Character with Style Reference",[56,25982,60,25983],{"controls":58,"playsInline":58,"style":59},[62,25984],{"src":25985,"type":65},"https://cdn.evolink.ai/seedance2api/%E7%BA%A2%E8%89%B2%E5%A4%96%E5%A5%97%E7%9A%84%E7%A5%9E%E7%A7%98%E8%BA%AB%E5%BD%B1%E5%9C%A8%E5%9F%8E%E5%B8%82%E8%A1%97%E9%81%93%E5%A5%94%E8%B7%91.mp4",[11,25987,25988,14284,25990],{},[23,25989,24399],{},[2619,25991,25992],{},"\"@Image1 is the character — a mysterious figure in a red coat. The character runs through rain-soaked city streets at night. Neon reflections on wet pavement. Camera tracks alongside at medium distance. Cinematic atmosphere, shallow depth of field.\"",[11,25994,25995,25996,493],{},"A single character reference image controls identity while the prompt drives the environment and action. The red coat, body proportions, and movement style all derive from ",[28,25997,2908],{},[11,25999,26000,26001,26003,26004,493],{},"For the full ",[28,26002,23123],{}," reference — including video and audio tags, mixed media combinations, and advanced role patterns — see the ",[37,26005,2967],{"href":2966},[45,26007],{},[48,26009,26011],{"id":26010},"keeping-characters-consistent-across-shots","Keeping Characters Consistent Across Shots",[11,26013,26014,26015,26018,26019,26021],{},"A single generated clip is useful. A sequence of clips with the ",[2619,26016,26017],{},"same character"," across different scenes is a story. Character consistency is the hardest problem in AI video generation, and Seedance 2.0's ",[28,26020,23123],{}," system provides the most reliable solution available through an API.",[92,26023,26025],{"id":26024},"the-character-lock-pattern","The Character Lock Pattern",[11,26027,26028,26029,26031],{},"To maintain the same character across multiple shots, use the same character reference image as ",[28,26030,2908],{}," in every generation request. Change only the prompt and the background/environment images.",[136,26033,26035],{"className":338,"code":26034,"language":340,"meta":141,"style":141},"CHARACTER_IMAGE = \"https://example.com/my-character.jpg\"\n\nshots = [\n    {\n        \"prompt\": (\n            \"@Image1 is the main character. She walks into a cozy library, \"\n            \"looks around with wonder, and reaches for a book on the top shelf. \"\n            \"Warm golden lighting. Camera at eye level, slow push in.\"\n        ),\n        \"extra_images\": [],\n        \"duration\": 8\n    },\n    {\n        \"prompt\": (\n            \"@Image1 is the main character. She sits at a wooden reading table, \"\n            \"opens the book, and pages start glowing with magical light. \"\n            \"Dust particles float in warm lamplight. Camera orbits slowly around her.\"\n        ),\n        \"extra_images\": [],\n        \"duration\": 10\n    },\n    {\n        \"prompt\": (\n            \"@Image1 is the main character. She steps out of the library into \"\n            \"a fantastical world that matches the book's illustrations. \"\n            \"Vibrant colors replace the muted library tones. \"\n            \"Camera pulls back to reveal the vast landscape. Wide shot.\"\n        ),\n        \"extra_images\": [],\n        \"duration\": 10\n    },\n]\n\ndef generate_shot(shot):\n    image_urls = [CHARACTER_IMAGE] + shot[\"extra_images\"]\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": shot[\"prompt\"],\n        \"image_urls\": image_urls,\n        \"duration\": shot[\"duration\"],\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": \"16:9\"\n    }\n    resp = requests.post(\n        f\"{BASE_URL}/videos/generations\",\n        headers=HEADERS,\n        json=payload\n    )\n    return resp.json()[\"task_id\"]\n\n# Generate all shots\ntask_ids = [generate_shot(shot) for shot in shots]\nprint(f\"Submitted {len(task_ids)} shots: {task_ids}\")\n\n# Poll each shot\nfor i, task_id in enumerate(task_ids):\n    print(f\"\\nWaiting for Shot {i+1}...\")\n    wait_for_video(task_id)\n",[28,26036,26037,26047,26051,26060,26065,26071,26076,26081,26086,26090,26098,26107,26111,26115,26121,26126,26131,26136,26140,26146,26155,26159,26163,26169,26174,26179,26184,26189,26193,26199,26207,26211,26215,26219,26229,26251,26259,26269,26280,26287,26297,26307,26315,26319,26327,26339,26349,26357,26361,26371,26375,26380,26400,26432,26436,26441,26455,26482],{"__ignoreMap":141},[145,26038,26039,26042,26044],{"class":147,"line":148},[145,26040,26041],{"class":155},"CHARACTER_IMAGE",[145,26043,391],{"class":258},[145,26045,26046],{"class":159}," \"https://example.com/my-character.jpg\"\n",[145,26048,26049],{"class":147,"line":166},[145,26050,376],{"emptyLinePlaceholder":58},[145,26052,26053,26056,26058],{"class":147,"line":178},[145,26054,26055],{"class":262},"shots ",[145,26057,266],{"class":258},[145,26059,8867],{"class":262},[145,26061,26062],{"class":147,"line":187},[145,26063,26064],{"class":262},"    {\n",[145,26066,26067,26069],{"class":147,"line":373},[145,26068,1319],{"class":159},[145,26070,1322],{"class":262},[145,26072,26073],{"class":147,"line":379},[145,26074,26075],{"class":159},"            \"@Image1 is the main character. She walks into a cozy library, \"\n",[145,26077,26078],{"class":147,"line":385},[145,26079,26080],{"class":159},"            \"looks around with wonder, and reaches for a book on the top shelf. \"\n",[145,26082,26083],{"class":147,"line":409},[145,26084,26085],{"class":159},"            \"Warm golden lighting. Camera at eye level, slow push in.\"\n",[145,26087,26088],{"class":147,"line":420},[145,26089,1342],{"class":262},[145,26091,26092,26095],{"class":147,"line":431},[145,26093,26094],{"class":159},"        \"extra_images\"",[145,26096,26097],{"class":262},": [],\n",[145,26099,26100,26102,26104],{"class":147,"line":455},[145,26101,1347],{"class":159},[145,26103,437],{"class":262},[145,26105,26106],{"class":155},"8\n",[145,26108,26109],{"class":147,"line":466},[145,26110,22204],{"class":262},[145,26112,26113],{"class":147,"line":600},[145,26114,26064],{"class":262},[145,26116,26117,26119],{"class":147,"line":605},[145,26118,1319],{"class":159},[145,26120,1322],{"class":262},[145,26122,26123],{"class":147,"line":611},[145,26124,26125],{"class":159},"            \"@Image1 is the main character. She sits at a wooden reading table, \"\n",[145,26127,26128],{"class":147,"line":617},[145,26129,26130],{"class":159},"            \"opens the book, and pages start glowing with magical light. \"\n",[145,26132,26133],{"class":147,"line":623},[145,26134,26135],{"class":159},"            \"Dust particles float in warm lamplight. Camera orbits slowly around her.\"\n",[145,26137,26138],{"class":147,"line":628},[145,26139,1342],{"class":262},[145,26141,26142,26144],{"class":147,"line":639},[145,26143,26094],{"class":159},[145,26145,26097],{"class":262},[145,26147,26148,26150,26152],{"class":147,"line":654},[145,26149,1347],{"class":159},[145,26151,437],{"class":262},[145,26153,26154],{"class":155},"10\n",[145,26156,26157],{"class":147,"line":660},[145,26158,22204],{"class":262},[145,26160,26161],{"class":147,"line":671},[145,26162,26064],{"class":262},[145,26164,26165,26167],{"class":147,"line":698},[145,26166,1319],{"class":159},[145,26168,1322],{"class":262},[145,26170,26171],{"class":147,"line":710},[145,26172,26173],{"class":159},"            \"@Image1 is the main character. She steps out of the library into \"\n",[145,26175,26176],{"class":147,"line":716},[145,26177,26178],{"class":159},"            \"a fantastical world that matches the book's illustrations. \"\n",[145,26180,26181],{"class":147,"line":722},[145,26182,26183],{"class":159},"            \"Vibrant colors replace the muted library tones. \"\n",[145,26185,26186],{"class":147,"line":728},[145,26187,26188],{"class":159},"            \"Camera pulls back to reveal the vast landscape. Wide shot.\"\n",[145,26190,26191],{"class":147,"line":739},[145,26192,1342],{"class":262},[145,26194,26195,26197],{"class":147,"line":744},[145,26196,26094],{"class":159},[145,26198,26097],{"class":262},[145,26200,26201,26203,26205],{"class":147,"line":750},[145,26202,1347],{"class":159},[145,26204,437],{"class":262},[145,26206,26154],{"class":155},[145,26208,26209],{"class":147,"line":767},[145,26210,22204],{"class":262},[145,26212,26213],{"class":147,"line":788},[145,26214,764],{"class":262},[145,26216,26217],{"class":147,"line":834},[145,26218,376],{"emptyLinePlaceholder":58},[145,26220,26221,26223,26226],{"class":147,"line":839},[145,26222,526],{"class":258},[145,26224,26225],{"class":151}," generate_shot",[145,26227,26228],{"class":262},"(shot):\n",[145,26230,26231,26233,26235,26237,26239,26241,26243,26246,26249],{"class":147,"line":845},[145,26232,6231],{"class":262},[145,26234,266],{"class":258},[145,26236,8192],{"class":262},[145,26238,26041],{"class":155},[145,26240,14931],{"class":262},[145,26242,5427],{"class":258},[145,26244,26245],{"class":262}," shot[",[145,26247,26248],{"class":159},"\"extra_images\"",[145,26250,764],{"class":262},[145,26252,26253,26255,26257],{"class":147,"line":863},[145,26254,1294],{"class":262},[145,26256,266],{"class":258},[145,26258,428],{"class":262},[145,26260,26261,26263,26265,26267],{"class":147,"line":872},[145,26262,1303],{"class":159},[145,26264,437],{"class":262},[145,26266,1308],{"class":159},[145,26268,452],{"class":262},[145,26270,26271,26273,26276,26278],{"class":147,"line":887},[145,26272,1319],{"class":159},[145,26274,26275],{"class":262},": shot[",[145,26277,5921],{"class":159},[145,26279,10847],{"class":262},[145,26281,26282,26284],{"class":147,"line":903},[145,26283,2688],{"class":159},[145,26285,26286],{"class":262},": image_urls,\n",[145,26288,26289,26291,26293,26295],{"class":147,"line":915},[145,26290,1347],{"class":159},[145,26292,26275],{"class":262},[145,26294,5966],{"class":159},[145,26296,10847],{"class":262},[145,26298,26299,26301,26303,26305],{"class":147,"line":953},[145,26300,1363],{"class":159},[145,26302,437],{"class":262},[145,26304,3710],{"class":159},[145,26306,452],{"class":262},[145,26308,26309,26311,26313],{"class":147,"line":959},[145,26310,1379],{"class":159},[145,26312,437],{"class":262},[145,26314,2730],{"class":159},[145,26316,26317],{"class":147,"line":964},[145,26318,1407],{"class":262},[145,26320,26321,26323,26325],{"class":147,"line":970},[145,26322,1126],{"class":262},[145,26324,266],{"class":258},[145,26326,1432],{"class":262},[145,26328,26329,26331,26333,26335,26337],{"class":147,"line":976},[145,26330,1437],{"class":258},[145,26332,449],{"class":159},[145,26334,679],{"class":155},[145,26336,1444],{"class":159},[145,26338,452],{"class":262},[145,26340,26341,26343,26345,26347],{"class":147,"line":988},[145,26342,1455],{"class":701},[145,26344,266],{"class":258},[145,26346,423],{"class":155},[145,26348,452],{"class":262},[145,26350,26351,26353,26355],{"class":147,"line":993},[145,26352,1470],{"class":701},[145,26354,266],{"class":258},[145,26356,2788],{"class":262},[145,26358,26359],{"class":147,"line":5531},[145,26360,1483],{"class":262},[145,26362,26363,26365,26367,26369],{"class":147,"line":5540},[145,26364,1703],{"class":258},[145,26366,20760],{"class":262},[145,26368,7693],{"class":159},[145,26370,764],{"class":262},[145,26372,26373],{"class":147,"line":5546},[145,26374,376],{"emptyLinePlaceholder":58},[145,26376,26377],{"class":147,"line":5574},[145,26378,26379],{"class":174},"# Generate all shots\n",[145,26381,26382,26385,26387,26390,26392,26395,26397],{"class":147,"line":5605},[145,26383,26384],{"class":262},"task_ids ",[145,26386,266],{"class":258},[145,26388,26389],{"class":262}," [generate_shot(shot) ",[145,26391,8229],{"class":258},[145,26393,26394],{"class":262}," shot ",[145,26396,1180],{"class":258},[145,26398,26399],{"class":262}," shots]\n",[145,26401,26402,26404,26406,26408,26411,26413,26416,26418,26421,26423,26426,26428,26430],{"class":147,"line":5625},[145,26403,6584],{"class":155},[145,26405,794],{"class":262},[145,26407,440],{"class":258},[145,26409,26410],{"class":159},"\"Submitted ",[145,26412,6270],{"class":155},[145,26414,26415],{"class":262},"(task_ids)",[145,26417,691],{"class":155},[145,26419,26420],{"class":159}," shots: ",[145,26422,685],{"class":155},[145,26424,26425],{"class":262},"task_ids",[145,26427,691],{"class":155},[145,26429,449],{"class":159},[145,26431,406],{"class":262},[145,26433,26434],{"class":147,"line":5631},[145,26435,376],{"emptyLinePlaceholder":58},[145,26437,26438],{"class":147,"line":5637},[145,26439,26440],{"class":174},"# Poll each shot\n",[145,26442,26443,26445,26448,26450,26452],{"class":147,"line":5642},[145,26444,8229],{"class":258},[145,26446,26447],{"class":262}," i, task_id ",[145,26449,1180],{"class":258},[145,26451,6291],{"class":155},[145,26453,26454],{"class":262},"(task_ids):\n",[145,26456,26457,26459,26461,26463,26465,26467,26470,26472,26474,26476,26478,26480],{"class":147,"line":5655},[145,26458,1102],{"class":155},[145,26460,794],{"class":262},[145,26462,440],{"class":258},[145,26464,449],{"class":159},[145,26466,1670],{"class":155},[145,26468,26469],{"class":159},"Waiting for Shot ",[145,26471,685],{"class":155},[145,26473,6329],{"class":262},[145,26475,5427],{"class":258},[145,26477,10036],{"class":155},[145,26479,1119],{"class":159},[145,26481,406],{"class":262},[145,26483,26484],{"class":147,"line":5661},[145,26485,26486],{"class":262},"    wait_for_video(task_id)\n",[92,26488,26490],{"id":26489},"demo-library-story-sequence","Demo: Library Story Sequence",[56,26492,60,26493],{"controls":58,"playsInline":58,"style":59},[62,26494],{"src":64,"type":65},[11,26496,26497,14284,26499],{},[23,26498,24399],{},[2619,26500,26501],{},"\"@Image1 is a young girl with braids. She enters a grand old library, runs her fingers along the spines of ancient books, pulls one out, and opens it. Golden dust motes swirl in shaft of light from a high window. Warm, magical atmosphere. Camera follows her at child's eye level.\"",[11,26503,26504],{},"The character — a young girl with braids — remains visually consistent because the same reference image anchors every shot. The model preserves her proportions, clothing, and visual features while generating different actions and environments.",[92,26506,26508],{"id":26507},"consistency-tips","Consistency Tips",[11,26510,26511,26514],{},[23,26512,26513],{},"Use a clear, well-lit character reference."," The model extracts identity features from your reference image. A blurry, poorly lit, or heavily occluded image gives the model less to work with. Front-facing, full-body or upper-body shots with clean backgrounds produce the best consistency.",[11,26516,26517,26520,26521,26523],{},[23,26518,26519],{},"Keep the character description minimal in prompts."," If ",[28,26522,2908],{}," already shows a girl in a blue dress, don't write \"a girl wearing a red dress\" in the prompt. Conflicting descriptions force the model to choose between your image and your text, reducing consistency.",[11,26525,26526,26529],{},[23,26527,26528],{},"Maintain the same aspect ratio across shots."," Switching from 16:9 to 9:16 mid-sequence forces different framing, which can alter how the character appears. Pick one ratio and stick with it.",[11,26531,26532,26535,26536,26538],{},[23,26533,26534],{},"Add environment images as separate @tags."," Instead of describing the background entirely in text, provide a background reference image as ",[28,26537,2918],{},". This gives you precise control over both character and environment while keeping them visually separate.",[136,26540,26542],{"className":338,"code":26541,"language":340,"meta":141,"style":141},"# Shot 1: Character in library\n\"image_urls\": [CHARACTER_IMAGE, \"https://example.com/library.jpg\"]\n# Prompt: \"@Image1 is the character. @Image2 is the library environment.\"\n\n# Shot 2: Character in forest\n\"image_urls\": [CHARACTER_IMAGE, \"https://example.com/forest.jpg\"]\n# Prompt: \"@Image1 is the character. @Image2 is the forest environment.\"\n",[28,26543,26544,26549,26564,26569,26573,26578,26593],{"__ignoreMap":141},[145,26545,26546],{"class":147,"line":148},[145,26547,26548],{"class":174},"# Shot 1: Character in library\n",[145,26550,26551,26553,26555,26557,26559,26562],{"class":147,"line":166},[145,26552,6238],{"class":159},[145,26554,10841],{"class":262},[145,26556,26041],{"class":155},[145,26558,400],{"class":262},[145,26560,26561],{"class":159},"\"https://example.com/library.jpg\"",[145,26563,764],{"class":262},[145,26565,26566],{"class":147,"line":178},[145,26567,26568],{"class":174},"# Prompt: \"@Image1 is the character. @Image2 is the library environment.\"\n",[145,26570,26571],{"class":147,"line":187},[145,26572,376],{"emptyLinePlaceholder":58},[145,26574,26575],{"class":147,"line":373},[145,26576,26577],{"class":174},"# Shot 2: Character in forest\n",[145,26579,26580,26582,26584,26586,26588,26591],{"class":147,"line":379},[145,26581,6238],{"class":159},[145,26583,10841],{"class":262},[145,26585,26041],{"class":155},[145,26587,400],{"class":262},[145,26589,26590],{"class":159},"\"https://example.com/forest.jpg\"",[145,26592,764],{"class":262},[145,26594,26595],{"class":147,"line":385},[145,26596,26597],{"class":174},"# Prompt: \"@Image1 is the character. @Image2 is the forest environment.\"\n",[11,26599,26600,26601,26603,26604,26606],{},"This pattern — fixed ",[28,26602,2908],{}," for character, variable ",[28,26605,2918],{}," for environment — is the most reliable multi-shot workflow available through any AI video API today.",[92,26608,26610],{"id":26609},"advanced-multi-shot-narrative-pipeline","Advanced: Multi-Shot Narrative Pipeline",[11,26612,26613],{},"For longer narratives (30+ seconds), you need to generate multiple clips and stitch them together. Here's a structured approach that manages the full pipeline — shot list definition, parallel generation, and ordered output:",[136,26615,26617],{"className":338,"code":26616,"language":340,"meta":141,"style":141},"import concurrent.futures\nimport requests\nimport time\nimport json\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\nCHARACTER_REF = \"https://example.com/story-character.jpg\"\n\nSHOT_LIST = [\n    {\n        \"shot_id\": \"01_entrance\",\n        \"prompt\": (\n            \"@Image1 is the main character. \"\n            \"She pushes open a heavy wooden door and steps into a dimly lit room. \"\n            \"Dust swirls in the doorway light. \"\n            \"Camera follows her from behind, over-the-shoulder angle.\"\n        ),\n        \"env_images\": [],\n        \"duration\": 6\n    },\n    {\n        \"shot_id\": \"02_discovery\",\n        \"prompt\": (\n            \"@Image1 is the main character. @Image2 is the room interior. \"\n            \"She walks to the center of the room and discovers a glowing object on a pedestal. \"\n            \"Her face shows surprise. Blue light illuminates her features. \"\n            \"Camera pushes in from medium shot to close-up on her expression.\"\n        ),\n        \"env_images\": [\"https://example.com/mysterious-room.jpg\"],\n        \"duration\": 8\n    },\n    {\n        \"shot_id\": \"03_transformation\",\n        \"prompt\": (\n            \"@Image1 is the main character. \"\n            \"She reaches out and touches the glowing object. \"\n            \"Light radiates outward from the point of contact. \"\n            \"The room transforms — walls dissolve into a starfield. \"\n            \"Camera rapidly pulls back to extreme wide shot.\"\n        ),\n        \"env_images\": [],\n        \"duration\": 10\n    },\n]\n\ndef submit_shot(shot):\n    \"\"\"Submit a single shot for generation.\"\"\"\n    image_urls = [CHARACTER_REF] + shot[\"env_images\"]\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": shot[\"prompt\"],\n        \"image_urls\": image_urls,\n        \"duration\": shot[\"duration\"],\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": \"16:9\",\n        \"generate_audio\": True\n    }\n    resp = requests.post(f\"{BASE_URL}/videos/generations\", headers=HEADERS, json=payload)\n    task_id = resp.json()[\"task_id\"]\n    return {\"shot_id\": shot[\"shot_id\"], \"task_id\": task_id}\n\ndef poll_until_done(task_id, max_wait=300):\n    \"\"\"Block until task completes or fails.\"\"\"\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n    while elapsed \u003C max_wait:\n        data = requests.get(url, headers=HEADERS).json()\n        if data[\"status\"] in (\"completed\", \"failed\"):\n            return data\n        time.sleep(5)\n        elapsed += 5\n    return None\n\n# Submit all shots in parallel\nresults = []\nfor shot in SHOT_LIST:\n    result = submit_shot(shot)\n    results.append(result)\n    print(f\"Submitted {result['shot_id']} → {result['task_id']}\")\n    time.sleep(0.5)\n\n# Collect results in order\nfinal_videos = []\nfor r in results:\n    print(f\"\\nPolling {r['shot_id']}...\")\n    data = poll_until_done(r[\"task_id\"])\n    if data and data[\"status\"] == \"completed\":\n        video_url = data[\"output\"][\"video_url\"]\n        final_videos.append({\"shot_id\": r[\"shot_id\"], \"url\": video_url})\n        print(f\"  Done: {r['shot_id']}: {video_url}\")\n    else:\n        print(f\"  Failed: {r['shot_id']}: generation failed\")\n\n# Output the ordered shot list\nprint(\"\\n=== Final Shot List ===\")\nfor v in final_videos:\n    print(f\"{v['shot_id']}: {v['url']}\")\n",[28,26618,26619,26625,26631,26637,26643,26647,26655,26663,26671,26687,26695,26699,26703,26713,26717,26726,26730,26742,26748,26753,26758,26763,26768,26772,26779,26788,26792,26796,26807,26813,26818,26823,26828,26833,26837,26848,26856,26860,26864,26875,26881,26885,26890,26895,26900,26905,26909,26915,26923,26927,26931,26935,26944,26949,26970,26978,26988,26998,27004,27014,27024,27034,27042,27046,27080,27092,27112,27116,27132,27137,27159,27167,27177,27194,27218,27224,27232,27240,27246,27250,27255,27263,27276,27285,27290,27327,27336,27340,27345,27354,27364,27394,27408,27430,27447,27467,27500,27506,27532,27536,27541,27556,27568],{"__ignoreMap":141},[145,26620,26621,26623],{"class":147,"line":148},[145,26622,347],{"class":258},[145,26624,8370],{"class":262},[145,26626,26627,26629],{"class":147,"line":166},[145,26628,347],{"class":258},[145,26630,328],{"class":262},[145,26632,26633,26635],{"class":147,"line":178},[145,26634,347],{"class":258},[145,26636,356],{"class":262},[145,26638,26639,26641],{"class":147,"line":187},[145,26640,347],{"class":258},[145,26642,370],{"class":262},[145,26644,26645],{"class":147,"line":373},[145,26646,376],{"emptyLinePlaceholder":58},[145,26648,26649,26651,26653],{"class":147,"line":379},[145,26650,388],{"class":155},[145,26652,391],{"class":258},[145,26654,17601],{"class":159},[145,26656,26657,26659,26661],{"class":147,"line":385},[145,26658,412],{"class":155},[145,26660,391],{"class":258},[145,26662,417],{"class":159},[145,26664,26665,26667,26669],{"class":147,"line":409},[145,26666,423],{"class":155},[145,26668,391],{"class":258},[145,26670,428],{"class":262},[145,26672,26673,26675,26677,26679,26681,26683,26685],{"class":147,"line":420},[145,26674,434],{"class":159},[145,26676,437],{"class":262},[145,26678,440],{"class":258},[145,26680,443],{"class":159},[145,26682,446],{"class":155},[145,26684,449],{"class":159},[145,26686,452],{"class":262},[145,26688,26689,26691,26693],{"class":147,"line":431},[145,26690,458],{"class":159},[145,26692,437],{"class":262},[145,26694,463],{"class":159},[145,26696,26697],{"class":147,"line":455},[145,26698,469],{"class":262},[145,26700,26701],{"class":147,"line":466},[145,26702,376],{"emptyLinePlaceholder":58},[145,26704,26705,26708,26710],{"class":147,"line":600},[145,26706,26707],{"class":155},"CHARACTER_REF",[145,26709,391],{"class":258},[145,26711,26712],{"class":159}," \"https://example.com/story-character.jpg\"\n",[145,26714,26715],{"class":147,"line":605},[145,26716,376],{"emptyLinePlaceholder":58},[145,26718,26719,26722,26724],{"class":147,"line":611},[145,26720,26721],{"class":155},"SHOT_LIST",[145,26723,391],{"class":258},[145,26725,8867],{"class":262},[145,26727,26728],{"class":147,"line":617},[145,26729,26064],{"class":262},[145,26731,26732,26735,26737,26740],{"class":147,"line":623},[145,26733,26734],{"class":159},"        \"shot_id\"",[145,26736,437],{"class":262},[145,26738,26739],{"class":159},"\"01_entrance\"",[145,26741,452],{"class":262},[145,26743,26744,26746],{"class":147,"line":628},[145,26745,1319],{"class":159},[145,26747,1322],{"class":262},[145,26749,26750],{"class":147,"line":639},[145,26751,26752],{"class":159},"            \"@Image1 is the main character. \"\n",[145,26754,26755],{"class":147,"line":654},[145,26756,26757],{"class":159},"            \"She pushes open a heavy wooden door and steps into a dimly lit room. \"\n",[145,26759,26760],{"class":147,"line":660},[145,26761,26762],{"class":159},"            \"Dust swirls in the doorway light. \"\n",[145,26764,26765],{"class":147,"line":671},[145,26766,26767],{"class":159},"            \"Camera follows her from behind, over-the-shoulder angle.\"\n",[145,26769,26770],{"class":147,"line":698},[145,26771,1342],{"class":262},[145,26773,26774,26777],{"class":147,"line":710},[145,26775,26776],{"class":159},"        \"env_images\"",[145,26778,26097],{"class":262},[145,26780,26781,26783,26785],{"class":147,"line":716},[145,26782,1347],{"class":159},[145,26784,437],{"class":262},[145,26786,26787],{"class":155},"6\n",[145,26789,26790],{"class":147,"line":722},[145,26791,22204],{"class":262},[145,26793,26794],{"class":147,"line":728},[145,26795,26064],{"class":262},[145,26797,26798,26800,26802,26805],{"class":147,"line":739},[145,26799,26734],{"class":159},[145,26801,437],{"class":262},[145,26803,26804],{"class":159},"\"02_discovery\"",[145,26806,452],{"class":262},[145,26808,26809,26811],{"class":147,"line":744},[145,26810,1319],{"class":159},[145,26812,1322],{"class":262},[145,26814,26815],{"class":147,"line":750},[145,26816,26817],{"class":159},"            \"@Image1 is the main character. @Image2 is the room interior. \"\n",[145,26819,26820],{"class":147,"line":767},[145,26821,26822],{"class":159},"            \"She walks to the center of the room and discovers a glowing object on a pedestal. \"\n",[145,26824,26825],{"class":147,"line":788},[145,26826,26827],{"class":159},"            \"Her face shows surprise. Blue light illuminates her features. \"\n",[145,26829,26830],{"class":147,"line":834},[145,26831,26832],{"class":159},"            \"Camera pushes in from medium shot to close-up on her expression.\"\n",[145,26834,26835],{"class":147,"line":839},[145,26836,1342],{"class":262},[145,26838,26839,26841,26843,26846],{"class":147,"line":845},[145,26840,26776],{"class":159},[145,26842,10841],{"class":262},[145,26844,26845],{"class":159},"\"https://example.com/mysterious-room.jpg\"",[145,26847,10847],{"class":262},[145,26849,26850,26852,26854],{"class":147,"line":863},[145,26851,1347],{"class":159},[145,26853,437],{"class":262},[145,26855,26106],{"class":155},[145,26857,26858],{"class":147,"line":872},[145,26859,22204],{"class":262},[145,26861,26862],{"class":147,"line":887},[145,26863,26064],{"class":262},[145,26865,26866,26868,26870,26873],{"class":147,"line":903},[145,26867,26734],{"class":159},[145,26869,437],{"class":262},[145,26871,26872],{"class":159},"\"03_transformation\"",[145,26874,452],{"class":262},[145,26876,26877,26879],{"class":147,"line":915},[145,26878,1319],{"class":159},[145,26880,1322],{"class":262},[145,26882,26883],{"class":147,"line":953},[145,26884,26752],{"class":159},[145,26886,26887],{"class":147,"line":959},[145,26888,26889],{"class":159},"            \"She reaches out and touches the glowing object. \"\n",[145,26891,26892],{"class":147,"line":964},[145,26893,26894],{"class":159},"            \"Light radiates outward from the point of contact. \"\n",[145,26896,26897],{"class":147,"line":970},[145,26898,26899],{"class":159},"            \"The room transforms — walls dissolve into a starfield. \"\n",[145,26901,26902],{"class":147,"line":976},[145,26903,26904],{"class":159},"            \"Camera rapidly pulls back to extreme wide shot.\"\n",[145,26906,26907],{"class":147,"line":988},[145,26908,1342],{"class":262},[145,26910,26911,26913],{"class":147,"line":993},[145,26912,26776],{"class":159},[145,26914,26097],{"class":262},[145,26916,26917,26919,26921],{"class":147,"line":5531},[145,26918,1347],{"class":159},[145,26920,437],{"class":262},[145,26922,26154],{"class":155},[145,26924,26925],{"class":147,"line":5540},[145,26926,22204],{"class":262},[145,26928,26929],{"class":147,"line":5546},[145,26930,764],{"class":262},[145,26932,26933],{"class":147,"line":5574},[145,26934,376],{"emptyLinePlaceholder":58},[145,26936,26937,26939,26942],{"class":147,"line":5605},[145,26938,526],{"class":258},[145,26940,26941],{"class":151}," submit_shot",[145,26943,26228],{"class":262},[145,26945,26946],{"class":147,"line":5625},[145,26947,26948],{"class":159},"    \"\"\"Submit a single shot for generation.\"\"\"\n",[145,26950,26951,26953,26955,26957,26959,26961,26963,26965,26968],{"class":147,"line":5631},[145,26952,6231],{"class":262},[145,26954,266],{"class":258},[145,26956,8192],{"class":262},[145,26958,26707],{"class":155},[145,26960,14931],{"class":262},[145,26962,5427],{"class":258},[145,26964,26245],{"class":262},[145,26966,26967],{"class":159},"\"env_images\"",[145,26969,764],{"class":262},[145,26971,26972,26974,26976],{"class":147,"line":5637},[145,26973,1294],{"class":262},[145,26975,266],{"class":258},[145,26977,428],{"class":262},[145,26979,26980,26982,26984,26986],{"class":147,"line":5642},[145,26981,1303],{"class":159},[145,26983,437],{"class":262},[145,26985,1308],{"class":159},[145,26987,452],{"class":262},[145,26989,26990,26992,26994,26996],{"class":147,"line":5655},[145,26991,1319],{"class":159},[145,26993,26275],{"class":262},[145,26995,5921],{"class":159},[145,26997,10847],{"class":262},[145,26999,27000,27002],{"class":147,"line":5661},[145,27001,2688],{"class":159},[145,27003,26286],{"class":262},[145,27005,27006,27008,27010,27012],{"class":147,"line":5688},[145,27007,1347],{"class":159},[145,27009,26275],{"class":262},[145,27011,5966],{"class":159},[145,27013,10847],{"class":262},[145,27015,27016,27018,27020,27022],{"class":147,"line":5728},[145,27017,1363],{"class":159},[145,27019,437],{"class":262},[145,27021,3710],{"class":159},[145,27023,452],{"class":262},[145,27025,27026,27028,27030,27032],{"class":147,"line":5747},[145,27027,1379],{"class":159},[145,27029,437],{"class":262},[145,27031,1384],{"class":159},[145,27033,452],{"class":262},[145,27035,27036,27038,27040],{"class":147,"line":5752},[145,27037,1395],{"class":159},[145,27039,437],{"class":262},[145,27041,3738],{"class":155},[145,27043,27044],{"class":147,"line":5757},[145,27045,1407],{"class":262},[145,27047,27048,27050,27052,27055,27057,27059,27061,27063,27065,27067,27069,27071,27073,27075,27077],{"class":147,"line":5762},[145,27049,1126],{"class":262},[145,27051,266],{"class":258},[145,27053,27054],{"class":262}," requests.post(",[145,27056,440],{"class":258},[145,27058,449],{"class":159},[145,27060,679],{"class":155},[145,27062,1444],{"class":159},[145,27064,400],{"class":262},[145,27066,17830],{"class":701},[145,27068,266],{"class":258},[145,27070,423],{"class":155},[145,27072,400],{"class":262},[145,27074,1858],{"class":701},[145,27076,266],{"class":258},[145,27078,27079],{"class":262},"payload)\n",[145,27081,27082,27084,27086,27088,27090],{"class":147,"line":7442},[145,27083,7218],{"class":262},[145,27085,266],{"class":258},[145,27087,20760],{"class":262},[145,27089,7693],{"class":159},[145,27091,764],{"class":262},[145,27093,27094,27096,27098,27101,27103,27105,27107,27109],{"class":147,"line":7448},[145,27095,1703],{"class":258},[145,27097,6035],{"class":262},[145,27099,27100],{"class":159},"\"shot_id\"",[145,27102,26275],{"class":262},[145,27104,27100],{"class":159},[145,27106,10755],{"class":262},[145,27108,7693],{"class":159},[145,27110,27111],{"class":262},": task_id}\n",[145,27113,27114],{"class":147,"line":7459},[145,27115,376],{"emptyLinePlaceholder":58},[145,27117,27118,27120,27123,27126,27128,27130],{"class":147,"line":7470},[145,27119,526],{"class":258},[145,27121,27122],{"class":151}," poll_until_done",[145,27124,27125],{"class":262},"(task_id, max_wait",[145,27127,266],{"class":258},[145,27129,11698],{"class":155},[145,27131,548],{"class":262},[145,27133,27134],{"class":147,"line":7481},[145,27135,27136],{"class":159},"    \"\"\"Block until task completes or fails.\"\"\"\n",[145,27138,27139,27141,27143,27145,27147,27149,27151,27153,27155,27157],{"class":147,"line":7486},[145,27140,23518],{"class":262},[145,27142,266],{"class":258},[145,27144,3358],{"class":258},[145,27146,449],{"class":159},[145,27148,679],{"class":155},[145,27150,682],{"class":159},[145,27152,685],{"class":155},[145,27154,688],{"class":262},[145,27156,691],{"class":155},[145,27158,950],{"class":159},[145,27160,27161,27163,27165],{"class":147,"line":7492},[145,27162,631],{"class":262},[145,27164,266],{"class":258},[145,27166,636],{"class":155},[145,27168,27169,27171,27173,27175],{"class":147,"line":7500},[145,27170,642],{"class":258},[145,27172,645],{"class":262},[145,27174,648],{"class":258},[145,27176,23559],{"class":262},[145,27178,27179,27181,27183,27185,27187,27189,27191],{"class":147,"line":7514},[145,27180,23580],{"class":262},[145,27182,266],{"class":258},[145,27184,1131],{"class":262},[145,27186,17830],{"class":701},[145,27188,266],{"class":258},[145,27190,423],{"class":155},[145,27192,27193],{"class":262},").json()\n",[145,27195,27196,27198,27200,27202,27204,27206,27208,27211,27213,27216],{"class":147,"line":7519},[145,27197,848],{"class":258},[145,27199,23593],{"class":262},[145,27201,761],{"class":159},[145,27203,14931],{"class":262},[145,27205,1180],{"class":258},[145,27207,1218],{"class":262},[145,27209,27210],{"class":159},"\"completed\"",[145,27212,400],{"class":262},[145,27214,27215],{"class":159},"\"failed\"",[145,27217,548],{"class":262},[145,27219,27220,27222],{"class":147,"line":7533},[145,27221,866],{"class":258},[145,27223,23656],{"class":262},[145,27225,27226,27228,27230],{"class":147,"line":7547},[145,27227,15068],{"class":262},[145,27229,1352],{"class":155},[145,27231,406],{"class":262},[145,27233,27234,27236,27238],{"class":147,"line":7579},[145,27235,979],{"class":262},[145,27237,982],{"class":258},[145,27239,20960],{"class":155},[145,27241,27242,27244],{"class":147,"line":7591},[145,27243,1703],{"class":258},[145,27245,11949],{"class":155},[145,27247,27248],{"class":147,"line":7601},[145,27249,376],{"emptyLinePlaceholder":58},[145,27251,27252],{"class":147,"line":7606},[145,27253,27254],{"class":174},"# Submit all shots in parallel\n",[145,27256,27257,27259,27261],{"class":147,"line":7613},[145,27258,21902],{"class":262},[145,27260,266],{"class":258},[145,27262,5876],{"class":262},[145,27264,27265,27267,27269,27271,27274],{"class":147,"line":7635},[145,27266,8229],{"class":258},[145,27268,26394],{"class":262},[145,27270,1180],{"class":258},[145,27272,27273],{"class":155}," SHOT_LIST",[145,27275,860],{"class":262},[145,27277,27278,27280,27282],{"class":147,"line":7666},[145,27279,1618],{"class":262},[145,27281,266],{"class":258},[145,27283,27284],{"class":262}," submit_shot(shot)\n",[145,27286,27287],{"class":147,"line":7671},[145,27288,27289],{"class":262},"    results.append(result)\n",[145,27291,27292,27294,27296,27298,27300,27302,27304,27307,27309,27311,27313,27315,27317,27319,27321,27323,27325],{"class":147,"line":7677},[145,27293,1102],{"class":155},[145,27295,794],{"class":262},[145,27297,440],{"class":258},[145,27299,26410],{"class":159},[145,27301,685],{"class":155},[145,27303,11813],{"class":262},[145,27305,27306],{"class":159},"'shot_id'",[145,27308,1535],{"class":262},[145,27310,691],{"class":155},[145,27312,23774],{"class":159},[145,27314,685],{"class":155},[145,27316,11813],{"class":262},[145,27318,19889],{"class":159},[145,27320,1535],{"class":262},[145,27322,691],{"class":155},[145,27324,449],{"class":159},[145,27326,406],{"class":262},[145,27328,27329,27331,27334],{"class":147,"line":7702},[145,27330,19902],{"class":262},[145,27332,27333],{"class":155},"0.5",[145,27335,406],{"class":262},[145,27337,27338],{"class":147,"line":7707},[145,27339,376],{"emptyLinePlaceholder":58},[145,27341,27342],{"class":147,"line":7712},[145,27343,27344],{"class":174},"# Collect results in order\n",[145,27346,27347,27350,27352],{"class":147,"line":7735},[145,27348,27349],{"class":262},"final_videos ",[145,27351,266],{"class":258},[145,27353,5876],{"class":262},[145,27355,27356,27358,27360,27362],{"class":147,"line":7745},[145,27357,8229],{"class":258},[145,27359,21822],{"class":262},[145,27361,1180],{"class":258},[145,27363,7399],{"class":262},[145,27365,27366,27368,27370,27372,27374,27376,27379,27381,27384,27386,27388,27390,27392],{"class":147,"line":7751},[145,27367,1102],{"class":155},[145,27369,794],{"class":262},[145,27371,440],{"class":258},[145,27373,449],{"class":159},[145,27375,1670],{"class":155},[145,27377,27378],{"class":159},"Polling ",[145,27380,685],{"class":155},[145,27382,27383],{"class":262},"r[",[145,27385,27306],{"class":159},[145,27387,1535],{"class":262},[145,27389,691],{"class":155},[145,27391,1119],{"class":159},[145,27393,406],{"class":262},[145,27395,27396,27399,27401,27404,27406],{"class":147,"line":7769},[145,27397,27398],{"class":262},"    data ",[145,27400,266],{"class":258},[145,27402,27403],{"class":262}," poll_until_done(r[",[145,27405,7693],{"class":159},[145,27407,1629],{"class":262},[145,27409,27410,27412,27415,27418,27420,27422,27424,27426,27428],{"class":147,"line":7774},[145,27411,2506],{"class":258},[145,27413,27414],{"class":262}," data ",[145,27416,27417],{"class":258},"and",[145,27419,23593],{"class":262},[145,27421,761],{"class":159},[145,27423,14931],{"class":262},[145,27425,854],{"class":258},[145,27427,857],{"class":159},[145,27429,860],{"class":262},[145,27431,27432,27435,27437,27439,27441,27443,27445],{"class":147,"line":7779},[145,27433,27434],{"class":262},"        video_url ",[145,27436,266],{"class":258},[145,27438,23593],{"class":262},[145,27440,21539],{"class":159},[145,27442,1562],{"class":262},[145,27444,14953],{"class":159},[145,27446,764],{"class":262},[145,27448,27449,27452,27454,27457,27459,27461,27464],{"class":147,"line":7792},[145,27450,27451],{"class":262},"        final_videos.append({",[145,27453,27100],{"class":159},[145,27455,27456],{"class":262},": r[",[145,27458,27100],{"class":159},[145,27460,10755],{"class":262},[145,27462,27463],{"class":159},"\"url\"",[145,27465,27466],{"class":262},": video_url})\n",[145,27468,27469,27471,27473,27475,27478,27480,27482,27484,27486,27488,27490,27492,27494,27496,27498],{"class":147,"line":7806},[145,27470,791],{"class":155},[145,27472,794],{"class":262},[145,27474,440],{"class":258},[145,27476,27477],{"class":159},"\"  Done: ",[145,27479,685],{"class":155},[145,27481,27383],{"class":262},[145,27483,27306],{"class":159},[145,27485,1535],{"class":262},[145,27487,691],{"class":155},[145,27489,437],{"class":159},[145,27491,685],{"class":155},[145,27493,1678],{"class":262},[145,27495,691],{"class":155},[145,27497,449],{"class":159},[145,27499,406],{"class":262},[145,27501,27502,27504],{"class":147,"line":7833},[145,27503,2542],{"class":258},[145,27505,860],{"class":262},[145,27507,27508,27510,27512,27514,27517,27519,27521,27523,27525,27527,27530],{"class":147,"line":7847},[145,27509,791],{"class":155},[145,27511,794],{"class":262},[145,27513,440],{"class":258},[145,27515,27516],{"class":159},"\"  Failed: ",[145,27518,685],{"class":155},[145,27520,27383],{"class":262},[145,27522,27306],{"class":159},[145,27524,1535],{"class":262},[145,27526,691],{"class":155},[145,27528,27529],{"class":159},": generation failed\"",[145,27531,406],{"class":262},[145,27533,27534],{"class":147,"line":10367},[145,27535,376],{"emptyLinePlaceholder":58},[145,27537,27538],{"class":147,"line":10374},[145,27539,27540],{"class":174},"# Output the ordered shot list\n",[145,27542,27543,27545,27547,27549,27551,27554],{"class":147,"line":10420},[145,27544,6584],{"class":155},[145,27546,794],{"class":262},[145,27548,449],{"class":159},[145,27550,1670],{"class":155},[145,27552,27553],{"class":159},"=== Final Shot List ===\"",[145,27555,406],{"class":262},[145,27557,27558,27560,27563,27565],{"class":147,"line":10425},[145,27559,8229],{"class":258},[145,27561,27562],{"class":262}," v ",[145,27564,1180],{"class":258},[145,27566,27567],{"class":262}," final_videos:\n",[145,27569,27570,27572,27574,27576,27578,27580,27583,27585,27587,27589,27591,27593,27595,27598,27600,27602,27604],{"class":147,"line":10430},[145,27571,1102],{"class":155},[145,27573,794],{"class":262},[145,27575,440],{"class":258},[145,27577,449],{"class":159},[145,27579,685],{"class":155},[145,27581,27582],{"class":262},"v[",[145,27584,27306],{"class":159},[145,27586,1535],{"class":262},[145,27588,691],{"class":155},[145,27590,437],{"class":159},[145,27592,685],{"class":155},[145,27594,27582],{"class":262},[145,27596,27597],{"class":159},"'url'",[145,27599,1535],{"class":262},[145,27601,691],{"class":155},[145,27603,449],{"class":159},[145,27605,406],{"class":262},[11,27607,27608,27609,27611,27612,493],{},"This pipeline produces an ordered list of video URLs that you can feed into any video editor or automated stitching tool (FFmpeg, MoviePy, etc.) to assemble the final narrative sequence. The character stays consistent across all shots because every request uses the same ",[28,27610,26707],{}," as ",[28,27613,2908],{},[92,27615,27617],{"id":27616},"handling-consistency-edge-cases","Handling Consistency Edge Cases",[11,27619,27620],{},"Even with the same reference image, slight variations can appear across shots — a character's clothing color might shift by a few shades, or proportions might change slightly in extreme wide shots. Here are strategies to minimize these variations:",[11,27622,27623,27626],{},[23,27624,27625],{},"Re-state character details in every prompt."," If your character wears a specific outfit, mention it briefly: \"@Image1 is the main character wearing a blue denim jacket.\" This reinforces the visual anchor from the reference image.",[11,27628,27629,27632],{},[23,27630,27631],{},"Avoid extreme angle changes between shots."," A front-facing medium shot followed by a top-down extreme wide shot introduces the most variation. Transition gradually: medium shot → slightly wider shot → wide shot.",[11,27634,27635,27638,27639,2959,27641,27643],{},[23,27636,27637],{},"Use the same quality and aspect ratio."," Mixing ",[28,27640,1786],{},[28,27642,1794],{}," across shots can introduce subtle rendering differences. Standardize all parameters across your shot list.",[45,27645],{},[48,27647,27649],{"id":27648},"e-commerce-product-video-end-to-end-workflow","E-Commerce Product Video: End-to-End Workflow",[11,27651,27652,27653,27656],{},"Product photography is expensive. Product ",[2619,27654,27655],{},"videography"," is even more expensive — a studio, a turntable, proper lighting, a camera operator, editing time. Seedance 2.0's image-to-video API replaces most of that pipeline with a single API call.",[92,27658,27660],{"id":27659},"the-product-video-problem","The Product Video Problem",[11,27662,27663],{},"E-commerce platforms increasingly favor video content. Amazon reports that product listings with video see higher conversion rates. Instagram and TikTok are video-first platforms. But producing even a simple 10-second product rotation video traditionally requires:",[70,27665,27666,27669,27672,27675,27678],{},[73,27667,27668],{},"A physical turntable setup",[73,27670,27671],{},"Proper lighting equipment",[73,27673,27674],{},"A videographer (or careful DIY)",[73,27676,27677],{},"Editing and color correction",[73,27679,27680],{},"Export and upload",[11,27682,27683],{},"With Seedance 2.0, the pipeline becomes:",[70,27685,27686,27689,27692],{},[73,27687,27688],{},"Take a product photo (you already have this)",[73,27690,27691],{},"Make one API call",[73,27693,27694],{},"Download the video",[92,27696,27698],{"id":27697},"single-product-watch-advertisement","Single Product: Watch Advertisement",[11,27700,27701],{},"Here's a complete workflow for generating a product showcase video from a single product image:",[136,27703,27705],{"className":338,"code":27704,"language":340,"meta":141,"style":141},"import requests\nimport time\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef wait_for_video(task_id, interval=5, max_wait=300):\n    url = f\"{BASE_URL}/tasks/{task_id}\"\n    elapsed = 0\n    while elapsed \u003C max_wait:\n        resp = requests.get(url, headers=HEADERS)\n        data = resp.json()\n        status = data[\"status\"]\n        if status == \"completed\":\n            print(f\"Video ready: {data['output']['video_url']}\")\n            return data\n        elif status == \"failed\":\n            print(f\"Failed: {data.get('error', 'Unknown error')}\")\n            return data\n        print(f\"Status: {status} ({elapsed}s)\")\n        time.sleep(interval)\n        elapsed += interval\n    return None\n\n# --- Product Video: Luxury Watch ---\npayload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"@Image1 is a luxury wristwatch. \"\n        \"The watch rotates slowly on a dark marble surface. \"\n        \"Dramatic side lighting highlights the metal bracelet and crystal face. \"\n        \"Light reflections move across the polished surfaces as the watch turns. \"\n        \"Subtle lens flare. Extreme close-up with shallow depth of field. \"\n        \"Premium product advertisement aesthetic.\"\n    ),\n    \"image_urls\": [\n        \"https://example.com/watch-product.jpg\"\n    ],\n    \"duration\": 8,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\",\n    \"generate_audio\": False\n}\n\nresp = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\nresult = resp.json()\nprint(f\"Task ID: {result['task_id']}\")\n\nvideo_data = wait_for_video(result[\"task_id\"])\n",[28,27706,27707,27713,27719,27723,27731,27739,27747,27763,27771,27775,27779,27799,27821,27829,27839,27855,27863,27875,27887,27915,27921,27933,27961,27967,27995,27999,28007,28013,28017,28022,28030,28040,28046,28051,28056,28061,28066,28071,28076,28080,28086,28091,28095,28105,28115,28125,28133,28137,28141,28149,28161,28171,28179,28183,28191,28215,28219],{"__ignoreMap":141},[145,27708,27709,27711],{"class":147,"line":148},[145,27710,347],{"class":258},[145,27712,328],{"class":262},[145,27714,27715,27717],{"class":147,"line":166},[145,27716,347],{"class":258},[145,27718,356],{"class":262},[145,27720,27721],{"class":147,"line":178},[145,27722,376],{"emptyLinePlaceholder":58},[145,27724,27725,27727,27729],{"class":147,"line":187},[145,27726,388],{"class":155},[145,27728,391],{"class":258},[145,27730,17601],{"class":159},[145,27732,27733,27735,27737],{"class":147,"line":373},[145,27734,412],{"class":155},[145,27736,391],{"class":258},[145,27738,417],{"class":159},[145,27740,27741,27743,27745],{"class":147,"line":379},[145,27742,423],{"class":155},[145,27744,391],{"class":258},[145,27746,428],{"class":262},[145,27748,27749,27751,27753,27755,27757,27759,27761],{"class":147,"line":385},[145,27750,434],{"class":159},[145,27752,437],{"class":262},[145,27754,440],{"class":258},[145,27756,443],{"class":159},[145,27758,446],{"class":155},[145,27760,449],{"class":159},[145,27762,452],{"class":262},[145,27764,27765,27767,27769],{"class":147,"line":409},[145,27766,458],{"class":159},[145,27768,437],{"class":262},[145,27770,463],{"class":159},[145,27772,27773],{"class":147,"line":420},[145,27774,469],{"class":262},[145,27776,27777],{"class":147,"line":431},[145,27778,376],{"emptyLinePlaceholder":58},[145,27780,27781,27783,27785,27787,27789,27791,27793,27795,27797],{"class":147,"line":455},[145,27782,526],{"class":258},[145,27784,529],{"class":151},[145,27786,11687],{"class":262},[145,27788,266],{"class":258},[145,27790,1352],{"class":155},[145,27792,23502],{"class":262},[145,27794,266],{"class":258},[145,27796,11698],{"class":155},[145,27798,548],{"class":262},[145,27800,27801,27803,27805,27807,27809,27811,27813,27815,27817,27819],{"class":147,"line":466},[145,27802,23518],{"class":262},[145,27804,266],{"class":258},[145,27806,3358],{"class":258},[145,27808,449],{"class":159},[145,27810,679],{"class":155},[145,27812,682],{"class":159},[145,27814,685],{"class":155},[145,27816,688],{"class":262},[145,27818,691],{"class":155},[145,27820,950],{"class":159},[145,27822,27823,27825,27827],{"class":147,"line":600},[145,27824,631],{"class":262},[145,27826,266],{"class":258},[145,27828,636],{"class":155},[145,27830,27831,27833,27835,27837],{"class":147,"line":605},[145,27832,642],{"class":258},[145,27834,645],{"class":262},[145,27836,648],{"class":258},[145,27838,23559],{"class":262},[145,27840,27841,27843,27845,27847,27849,27851,27853],{"class":147,"line":611},[145,27842,6929],{"class":262},[145,27844,266],{"class":258},[145,27846,1131],{"class":262},[145,27848,17830],{"class":701},[145,27850,266],{"class":258},[145,27852,423],{"class":155},[145,27854,406],{"class":262},[145,27856,27857,27859,27861],{"class":147,"line":617},[145,27858,23580],{"class":262},[145,27860,266],{"class":258},[145,27862,11768],{"class":262},[145,27864,27865,27867,27869,27871,27873],{"class":147,"line":623},[145,27866,753],{"class":262},[145,27868,266],{"class":258},[145,27870,23593],{"class":262},[145,27872,761],{"class":159},[145,27874,764],{"class":262},[145,27876,27877,27879,27881,27883,27885],{"class":147,"line":628},[145,27878,848],{"class":258},[145,27880,851],{"class":262},[145,27882,854],{"class":258},[145,27884,857],{"class":159},[145,27886,860],{"class":262},[145,27888,27889,27891,27893,27895,27897,27899,27901,27903,27905,27907,27909,27911,27913],{"class":147,"line":639},[145,27890,5577],{"class":155},[145,27892,794],{"class":262},[145,27894,440],{"class":258},[145,27896,11808],{"class":159},[145,27898,685],{"class":155},[145,27900,24045],{"class":262},[145,27902,17892],{"class":159},[145,27904,1562],{"class":262},[145,27906,17897],{"class":159},[145,27908,1535],{"class":262},[145,27910,691],{"class":155},[145,27912,449],{"class":159},[145,27914,406],{"class":262},[145,27916,27917,27919],{"class":147,"line":654},[145,27918,866],{"class":258},[145,27920,23656],{"class":262},[145,27922,27923,27925,27927,27929,27931],{"class":147,"line":660},[145,27924,875],{"class":258},[145,27926,851],{"class":262},[145,27928,854],{"class":258},[145,27930,882],{"class":159},[145,27932,860],{"class":262},[145,27934,27935,27937,27939,27941,27943,27945,27947,27949,27951,27953,27955,27957,27959],{"class":147,"line":671},[145,27936,5577],{"class":155},[145,27938,794],{"class":262},[145,27940,440],{"class":258},[145,27942,24088],{"class":159},[145,27944,685],{"class":155},[145,27946,23683],{"class":262},[145,27948,11865],{"class":159},[145,27950,400],{"class":262},[145,27952,943],{"class":159},[145,27954,108],{"class":262},[145,27956,691],{"class":155},[145,27958,449],{"class":159},[145,27960,406],{"class":262},[145,27962,27963,27965],{"class":147,"line":698},[145,27964,866],{"class":258},[145,27966,23656],{"class":262},[145,27968,27969,27971,27973,27975,27977,27979,27981,27983,27985,27987,27989,27991,27993],{"class":147,"line":710},[145,27970,791],{"class":155},[145,27972,794],{"class":262},[145,27974,440],{"class":258},[145,27976,11894],{"class":159},[145,27978,685],{"class":155},[145,27980,814],{"class":262},[145,27982,691],{"class":155},[145,27984,1218],{"class":159},[145,27986,685],{"class":155},[145,27988,804],{"class":262},[145,27990,691],{"class":155},[145,27992,10725],{"class":159},[145,27994,406],{"class":262},[145,27996,27997],{"class":147,"line":716},[145,27998,11918],{"class":262},[145,28000,28001,28003,28005],{"class":147,"line":722},[145,28002,979],{"class":262},[145,28004,982],{"class":258},[145,28006,11927],{"class":262},[145,28008,28009,28011],{"class":147,"line":728},[145,28010,1703],{"class":258},[145,28012,11949],{"class":155},[145,28014,28015],{"class":147,"line":739},[145,28016,376],{"emptyLinePlaceholder":58},[145,28018,28019],{"class":147,"line":744},[145,28020,28021],{"class":174},"# --- Product Video: Luxury Watch ---\n",[145,28023,28024,28026,28028],{"class":147,"line":750},[145,28025,3661],{"class":262},[145,28027,266],{"class":258},[145,28029,428],{"class":262},[145,28031,28032,28034,28036,28038],{"class":147,"line":767},[145,28033,3670],{"class":159},[145,28035,437],{"class":262},[145,28037,1308],{"class":159},[145,28039,452],{"class":262},[145,28041,28042,28044],{"class":147,"line":788},[145,28043,3681],{"class":159},[145,28045,1322],{"class":262},[145,28047,28048],{"class":147,"line":834},[145,28049,28050],{"class":159},"        \"@Image1 is a luxury wristwatch. \"\n",[145,28052,28053],{"class":147,"line":839},[145,28054,28055],{"class":159},"        \"The watch rotates slowly on a dark marble surface. \"\n",[145,28057,28058],{"class":147,"line":845},[145,28059,28060],{"class":159},"        \"Dramatic side lighting highlights the metal bracelet and crystal face. \"\n",[145,28062,28063],{"class":147,"line":863},[145,28064,28065],{"class":159},"        \"Light reflections move across the polished surfaces as the watch turns. \"\n",[145,28067,28068],{"class":147,"line":872},[145,28069,28070],{"class":159},"        \"Subtle lens flare. Extreme close-up with shallow depth of field. \"\n",[145,28072,28073],{"class":147,"line":887},[145,28074,28075],{"class":159},"        \"Premium product advertisement aesthetic.\"\n",[145,28077,28078],{"class":147,"line":903},[145,28079,3804],{"class":262},[145,28081,28082,28084],{"class":147,"line":915},[145,28083,15386],{"class":159},[145,28085,2691],{"class":262},[145,28087,28088],{"class":147,"line":953},[145,28089,28090],{"class":159},"        \"https://example.com/watch-product.jpg\"\n",[145,28092,28093],{"class":147,"line":959},[145,28094,16367],{"class":262},[145,28096,28097,28099,28101,28103],{"class":147,"line":964},[145,28098,3693],{"class":159},[145,28100,437],{"class":262},[145,28102,3698],{"class":155},[145,28104,452],{"class":262},[145,28106,28107,28109,28111,28113],{"class":147,"line":970},[145,28108,3705],{"class":159},[145,28110,437],{"class":262},[145,28112,3710],{"class":159},[145,28114,452],{"class":262},[145,28116,28117,28119,28121,28123],{"class":147,"line":976},[145,28118,3717],{"class":159},[145,28120,437],{"class":262},[145,28122,1384],{"class":159},[145,28124,452],{"class":262},[145,28126,28127,28129,28131],{"class":147,"line":988},[145,28128,3733],{"class":159},[145,28130,437],{"class":262},[145,28132,15432],{"class":155},[145,28134,28135],{"class":147,"line":993},[145,28136,469],{"class":262},[145,28138,28139],{"class":147,"line":5531},[145,28140,376],{"emptyLinePlaceholder":58},[145,28142,28143,28145,28147],{"class":147,"line":5540},[145,28144,24281],{"class":262},[145,28146,266],{"class":258},[145,28148,1432],{"class":262},[145,28150,28151,28153,28155,28157,28159],{"class":147,"line":5546},[145,28152,6538],{"class":258},[145,28154,449],{"class":159},[145,28156,679],{"class":155},[145,28158,1444],{"class":159},[145,28160,452],{"class":262},[145,28162,28163,28165,28167,28169],{"class":147,"line":5574},[145,28164,6551],{"class":701},[145,28166,266],{"class":258},[145,28168,423],{"class":155},[145,28170,452],{"class":262},[145,28172,28173,28175,28177],{"class":147,"line":5605},[145,28174,6562],{"class":701},[145,28176,266],{"class":258},[145,28178,2788],{"class":262},[145,28180,28181],{"class":147,"line":5625},[145,28182,406],{"class":262},[145,28184,28185,28187,28189],{"class":147,"line":5631},[145,28186,12238],{"class":262},[145,28188,266],{"class":258},[145,28190,11768],{"class":262},[145,28192,28193,28195,28197,28199,28201,28203,28205,28207,28209,28211,28213],{"class":147,"line":5637},[145,28194,6584],{"class":155},[145,28196,794],{"class":262},[145,28198,440],{"class":258},[145,28200,24338],{"class":159},[145,28202,685],{"class":155},[145,28204,11813],{"class":262},[145,28206,19889],{"class":159},[145,28208,1535],{"class":262},[145,28210,691],{"class":155},[145,28212,449],{"class":159},[145,28214,406],{"class":262},[145,28216,28217],{"class":147,"line":5642},[145,28218,376],{"emptyLinePlaceholder":58},[145,28220,28221,28223,28225,28227,28229],{"class":147,"line":5655},[145,28222,24366],{"class":262},[145,28224,266],{"class":258},[145,28226,24371],{"class":262},[145,28228,7693],{"class":159},[145,28230,1629],{"class":262},[92,28232,28234],{"id":28233},"demo-watch-product-video","Demo: Watch Product Video",[56,28236,60,28237],{"controls":58,"playsInline":58,"style":59},[62,28238],{"src":18162,"type":65},[11,28240,28241,14284,28243],{},[23,28242,24399],{},[2619,28244,28245],{},"\"@Image1 is a luxury wristwatch. The watch rotates slowly under dramatic studio lighting on a dark reflective surface. Light catches the polished metal case and sapphire crystal. Slow cinematic rotation. Premium advertisement quality.\"",[11,28247,28248],{},"From a single product photo, the API generates a rotating product showcase with studio-quality lighting. The watch's design details — dial markings, bracelet links, case shape — all come from the reference image.",[92,28250,28252],{"id":28251},"multi-color-product-variants","Multi-Color Product Variants",[11,28254,28255,28256,28258],{},"Many products come in multiple colorways. Instead of photographing each variant separately, you can use the ",[28,28257,23123],{}," system to showcase all variants in a single video:",[136,28260,28262],{"className":338,"code":28261,"language":340,"meta":141,"style":141},"# --- Multi-Color Product: Headphones ---\npayload = {\n    \"model\": \"seedance-2.0\",\n    \"prompt\": (\n        \"@Image1 shows premium over-ear headphones in four different colors \"\n        \"arranged on a clean surface. The camera slowly pans across all four \"\n        \"variants. Each headphone catches the studio light differently. \"\n        \"Smooth dolly movement from left to right. \"\n        \"Clean white background with subtle shadows. \"\n        \"Product catalog video style.\"\n    ),\n    \"image_urls\": [\n        \"https://example.com/headphones-all-colors.jpg\"\n    ],\n    \"duration\": 10,\n    \"quality\": \"1080p\",\n    \"aspect_ratio\": \"16:9\"\n}\n\nresp = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers=HEADERS,\n    json=payload\n)\nresult = resp.json()\nprint(f\"Task ID: {result['task_id']}\")\nvideo_data = wait_for_video(result[\"task_id\"])\n",[28,28263,28264,28269,28277,28287,28293,28298,28303,28308,28313,28318,28323,28327,28333,28338,28342,28352,28362,28370,28374,28378,28386,28398,28408,28416,28420,28428,28452],{"__ignoreMap":141},[145,28265,28266],{"class":147,"line":148},[145,28267,28268],{"class":174},"# --- Multi-Color Product: Headphones ---\n",[145,28270,28271,28273,28275],{"class":147,"line":166},[145,28272,3661],{"class":262},[145,28274,266],{"class":258},[145,28276,428],{"class":262},[145,28278,28279,28281,28283,28285],{"class":147,"line":178},[145,28280,3670],{"class":159},[145,28282,437],{"class":262},[145,28284,1308],{"class":159},[145,28286,452],{"class":262},[145,28288,28289,28291],{"class":147,"line":187},[145,28290,3681],{"class":159},[145,28292,1322],{"class":262},[145,28294,28295],{"class":147,"line":373},[145,28296,28297],{"class":159},"        \"@Image1 shows premium over-ear headphones in four different colors \"\n",[145,28299,28300],{"class":147,"line":379},[145,28301,28302],{"class":159},"        \"arranged on a clean surface. The camera slowly pans across all four \"\n",[145,28304,28305],{"class":147,"line":385},[145,28306,28307],{"class":159},"        \"variants. Each headphone catches the studio light differently. \"\n",[145,28309,28310],{"class":147,"line":409},[145,28311,28312],{"class":159},"        \"Smooth dolly movement from left to right. \"\n",[145,28314,28315],{"class":147,"line":420},[145,28316,28317],{"class":159},"        \"Clean white background with subtle shadows. \"\n",[145,28319,28320],{"class":147,"line":431},[145,28321,28322],{"class":159},"        \"Product catalog video style.\"\n",[145,28324,28325],{"class":147,"line":455},[145,28326,3804],{"class":262},[145,28328,28329,28331],{"class":147,"line":466},[145,28330,15386],{"class":159},[145,28332,2691],{"class":262},[145,28334,28335],{"class":147,"line":600},[145,28336,28337],{"class":159},"        \"https://example.com/headphones-all-colors.jpg\"\n",[145,28339,28340],{"class":147,"line":605},[145,28341,16367],{"class":262},[145,28343,28344,28346,28348,28350],{"class":147,"line":611},[145,28345,3693],{"class":159},[145,28347,437],{"class":262},[145,28349,537],{"class":155},[145,28351,452],{"class":262},[145,28353,28354,28356,28358,28360],{"class":147,"line":617},[145,28355,3705],{"class":159},[145,28357,437],{"class":262},[145,28359,3710],{"class":159},[145,28361,452],{"class":262},[145,28363,28364,28366,28368],{"class":147,"line":623},[145,28365,3717],{"class":159},[145,28367,437],{"class":262},[145,28369,2730],{"class":159},[145,28371,28372],{"class":147,"line":628},[145,28373,469],{"class":262},[145,28375,28376],{"class":147,"line":639},[145,28377,376],{"emptyLinePlaceholder":58},[145,28379,28380,28382,28384],{"class":147,"line":654},[145,28381,24281],{"class":262},[145,28383,266],{"class":258},[145,28385,1432],{"class":262},[145,28387,28388,28390,28392,28394,28396],{"class":147,"line":660},[145,28389,6538],{"class":258},[145,28391,449],{"class":159},[145,28393,679],{"class":155},[145,28395,1444],{"class":159},[145,28397,452],{"class":262},[145,28399,28400,28402,28404,28406],{"class":147,"line":671},[145,28401,6551],{"class":701},[145,28403,266],{"class":258},[145,28405,423],{"class":155},[145,28407,452],{"class":262},[145,28409,28410,28412,28414],{"class":147,"line":698},[145,28411,6562],{"class":701},[145,28413,266],{"class":258},[145,28415,2788],{"class":262},[145,28417,28418],{"class":147,"line":710},[145,28419,406],{"class":262},[145,28421,28422,28424,28426],{"class":147,"line":716},[145,28423,12238],{"class":262},[145,28425,266],{"class":258},[145,28427,11768],{"class":262},[145,28429,28430,28432,28434,28436,28438,28440,28442,28444,28446,28448,28450],{"class":147,"line":722},[145,28431,6584],{"class":155},[145,28433,794],{"class":262},[145,28435,440],{"class":258},[145,28437,24338],{"class":159},[145,28439,685],{"class":155},[145,28441,11813],{"class":262},[145,28443,19889],{"class":159},[145,28445,1535],{"class":262},[145,28447,691],{"class":155},[145,28449,449],{"class":159},[145,28451,406],{"class":262},[145,28453,28454,28456,28458,28460,28462],{"class":147,"line":728},[145,28455,24366],{"class":262},[145,28457,266],{"class":258},[145,28459,24371],{"class":262},[145,28461,7693],{"class":159},[145,28463,1629],{"class":262},[92,28465,28467],{"id":28466},"demo-headphone-color-variants","Demo: Headphone Color Variants",[56,28469,60,28470],{"controls":58,"playsInline":58,"style":59},[62,28471],{"src":18430,"type":65},[11,28473,28474,14284,28476],{},[23,28475,24399],{},[2619,28477,28478],{},"\"@Image1 shows over-ear headphones in four color variants. The camera pans smoothly across each variant under clean studio lighting. Soft reflections on the ear cups. Minimal white background. Product showcase cinematography.\"",[11,28480,28481],{},"A single product lineup photo becomes a smooth panning showcase video. Each colorway gets screen time, and the studio-lighting aesthetic matches professional product videography.",[92,28483,28485],{"id":28484},"batch-generation-for-product-catalogs","Batch Generation for Product Catalogs",[11,28487,28488],{},"If you have dozens or hundreds of products, wrap the generation logic in a batch processor:",[136,28490,28492],{"className":338,"code":28491,"language":340,"meta":141,"style":141},"import csv\nimport time\nimport requests\n\nAPI_KEY = \"YOUR_API_KEY\"\nBASE_URL = \"https://api.evolink.ai/v1\"\nHEADERS = {\n    \"Authorization\": f\"Bearer {API_KEY}\",\n    \"Content-Type\": \"application/json\"\n}\n\ndef generate_product_video(product_name, image_url, style=\"premium\"):\n    \"\"\"Generate a product video from a single product image.\"\"\"\n    style_prompts = {\n        \"premium\": (\n            f\"@Image1 is a {product_name}. \"\n            \"The product rotates slowly under dramatic studio lighting \"\n            \"on a dark reflective surface. Cinematic close-up. \"\n            \"Light reveals surface details and textures. \"\n            \"Premium advertisement quality.\"\n        ),\n        \"lifestyle\": (\n            f\"@Image1 is a {product_name}. \"\n            \"The product is shown in a lifestyle setting — \"\n            \"a modern living space with natural light. \"\n            \"Camera slowly pushes in to reveal product details. \"\n            \"Warm, inviting atmosphere.\"\n        ),\n        \"minimal\": (\n            f\"@Image1 is a {product_name}. \"\n            \"Clean white background. The product rotates 360 degrees. \"\n            \"Even, shadowless lighting. E-commerce product spin.\"\n        ),\n    }\n\n    payload = {\n        \"model\": \"seedance-2.0\",\n        \"prompt\": style_prompts[style],\n        \"image_urls\": [image_url],\n        \"duration\": 8,\n        \"quality\": \"1080p\",\n        \"aspect_ratio\": \"1:1\"\n    }\n\n    resp = requests.post(\n        f\"{BASE_URL}/videos/generations\",\n        headers=HEADERS,\n        json=payload\n    )\n    data = resp.json()\n    return data[\"task_id\"]\n\n\n# Example: process a CSV product catalog\n# CSV format: product_name, image_url, style\nproducts = [\n    (\"Wireless Earbuds\", \"https://example.com/earbuds.jpg\", \"premium\"),\n    (\"Leather Wallet\", \"https://example.com/wallet.jpg\", \"lifestyle\"),\n    (\"Running Shoes\", \"https://example.com/shoes.jpg\", \"minimal\"),\n]\n\ntasks = []\nfor name, url, style in products:\n    task_id = generate_product_video(name, url, style)\n    tasks.append((name, task_id))\n    print(f\"Submitted: {name} → {task_id}\")\n    time.sleep(1)  # Rate limiting courtesy\n\nprint(f\"\\nSubmitted {len(tasks)} product videos\")\nprint(\"Poll each task_id to retrieve the completed video URLs\")\n",[28,28493,28494,28500,28506,28512,28516,28524,28532,28540,28556,28564,28568,28572,28589,28594,28603,28610,28627,28632,28637,28642,28647,28651,28658,28672,28677,28682,28687,28692,28696,28703,28717,28722,28727,28731,28735,28739,28747,28757,28764,28770,28780,28790,28799,28803,28807,28815,28827,28837,28845,28849,28857,28867,28871,28875,28880,28885,28894,28914,28933,28952,28956,28960,28968,28980,28989,28994,29023,29034,29038,29065],{"__ignoreMap":141},[145,28495,28496,28498],{"class":147,"line":148},[145,28497,347],{"class":258},[145,28499,20112],{"class":262},[145,28501,28502,28504],{"class":147,"line":166},[145,28503,347],{"class":258},[145,28505,356],{"class":262},[145,28507,28508,28510],{"class":147,"line":178},[145,28509,347],{"class":258},[145,28511,328],{"class":262},[145,28513,28514],{"class":147,"line":187},[145,28515,376],{"emptyLinePlaceholder":58},[145,28517,28518,28520,28522],{"class":147,"line":373},[145,28519,388],{"class":155},[145,28521,391],{"class":258},[145,28523,17601],{"class":159},[145,28525,28526,28528,28530],{"class":147,"line":379},[145,28527,412],{"class":155},[145,28529,391],{"class":258},[145,28531,417],{"class":159},[145,28533,28534,28536,28538],{"class":147,"line":385},[145,28535,423],{"class":155},[145,28537,391],{"class":258},[145,28539,428],{"class":262},[145,28541,28542,28544,28546,28548,28550,28552,28554],{"class":147,"line":409},[145,28543,434],{"class":159},[145,28545,437],{"class":262},[145,28547,440],{"class":258},[145,28549,443],{"class":159},[145,28551,446],{"class":155},[145,28553,449],{"class":159},[145,28555,452],{"class":262},[145,28557,28558,28560,28562],{"class":147,"line":420},[145,28559,458],{"class":159},[145,28561,437],{"class":262},[145,28563,463],{"class":159},[145,28565,28566],{"class":147,"line":431},[145,28567,469],{"class":262},[145,28569,28570],{"class":147,"line":455},[145,28571,376],{"emptyLinePlaceholder":58},[145,28573,28574,28576,28579,28582,28584,28587],{"class":147,"line":466},[145,28575,526],{"class":258},[145,28577,28578],{"class":151}," generate_product_video",[145,28580,28581],{"class":262},"(product_name, image_url, style",[145,28583,266],{"class":258},[145,28585,28586],{"class":159},"\"premium\"",[145,28588,548],{"class":262},[145,28590,28591],{"class":147,"line":600},[145,28592,28593],{"class":159},"    \"\"\"Generate a product video from a single product image.\"\"\"\n",[145,28595,28596,28599,28601],{"class":147,"line":605},[145,28597,28598],{"class":262},"    style_prompts ",[145,28600,266],{"class":258},[145,28602,428],{"class":262},[145,28604,28605,28608],{"class":147,"line":611},[145,28606,28607],{"class":159},"        \"premium\"",[145,28609,1322],{"class":262},[145,28611,28612,28614,28617,28619,28622,28624],{"class":147,"line":617},[145,28613,674],{"class":258},[145,28615,28616],{"class":159},"\"@Image1 is a ",[145,28618,685],{"class":155},[145,28620,28621],{"class":262},"product_name",[145,28623,691],{"class":155},[145,28625,28626],{"class":159},". \"\n",[145,28628,28629],{"class":147,"line":623},[145,28630,28631],{"class":159},"            \"The product rotates slowly under dramatic studio lighting \"\n",[145,28633,28634],{"class":147,"line":628},[145,28635,28636],{"class":159},"            \"on a dark reflective surface. Cinematic close-up. \"\n",[145,28638,28639],{"class":147,"line":639},[145,28640,28641],{"class":159},"            \"Light reveals surface details and textures. \"\n",[145,28643,28644],{"class":147,"line":654},[145,28645,28646],{"class":159},"            \"Premium advertisement quality.\"\n",[145,28648,28649],{"class":147,"line":660},[145,28650,1342],{"class":262},[145,28652,28653,28656],{"class":147,"line":671},[145,28654,28655],{"class":159},"        \"lifestyle\"",[145,28657,1322],{"class":262},[145,28659,28660,28662,28664,28666,28668,28670],{"class":147,"line":698},[145,28661,674],{"class":258},[145,28663,28616],{"class":159},[145,28665,685],{"class":155},[145,28667,28621],{"class":262},[145,28669,691],{"class":155},[145,28671,28626],{"class":159},[145,28673,28674],{"class":147,"line":710},[145,28675,28676],{"class":159},"            \"The product is shown in a lifestyle setting — \"\n",[145,28678,28679],{"class":147,"line":716},[145,28680,28681],{"class":159},"            \"a modern living space with natural light. \"\n",[145,28683,28684],{"class":147,"line":722},[145,28685,28686],{"class":159},"            \"Camera slowly pushes in to reveal product details. \"\n",[145,28688,28689],{"class":147,"line":728},[145,28690,28691],{"class":159},"            \"Warm, inviting atmosphere.\"\n",[145,28693,28694],{"class":147,"line":739},[145,28695,1342],{"class":262},[145,28697,28698,28701],{"class":147,"line":744},[145,28699,28700],{"class":159},"        \"minimal\"",[145,28702,1322],{"class":262},[145,28704,28705,28707,28709,28711,28713,28715],{"class":147,"line":750},[145,28706,674],{"class":258},[145,28708,28616],{"class":159},[145,28710,685],{"class":155},[145,28712,28621],{"class":262},[145,28714,691],{"class":155},[145,28716,28626],{"class":159},[145,28718,28719],{"class":147,"line":767},[145,28720,28721],{"class":159},"            \"Clean white background. The product rotates 360 degrees. \"\n",[145,28723,28724],{"class":147,"line":788},[145,28725,28726],{"class":159},"            \"Even, shadowless lighting. E-commerce product spin.\"\n",[145,28728,28729],{"class":147,"line":834},[145,28730,1342],{"class":262},[145,28732,28733],{"class":147,"line":839},[145,28734,1407],{"class":262},[145,28736,28737],{"class":147,"line":845},[145,28738,376],{"emptyLinePlaceholder":58},[145,28740,28741,28743,28745],{"class":147,"line":863},[145,28742,1294],{"class":262},[145,28744,266],{"class":258},[145,28746,428],{"class":262},[145,28748,28749,28751,28753,28755],{"class":147,"line":872},[145,28750,1303],{"class":159},[145,28752,437],{"class":262},[145,28754,1308],{"class":159},[145,28756,452],{"class":262},[145,28758,28759,28761],{"class":147,"line":887},[145,28760,1319],{"class":159},[145,28762,28763],{"class":262},": style_prompts[style],\n",[145,28765,28766,28768],{"class":147,"line":903},[145,28767,2688],{"class":159},[145,28769,20658],{"class":262},[145,28771,28772,28774,28776,28778],{"class":147,"line":915},[145,28773,1347],{"class":159},[145,28775,437],{"class":262},[145,28777,3698],{"class":155},[145,28779,452],{"class":262},[145,28781,28782,28784,28786,28788],{"class":147,"line":953},[145,28783,1363],{"class":159},[145,28785,437],{"class":262},[145,28787,3710],{"class":159},[145,28789,452],{"class":262},[145,28791,28792,28794,28796],{"class":147,"line":959},[145,28793,1379],{"class":159},[145,28795,437],{"class":262},[145,28797,28798],{"class":159},"\"1:1\"\n",[145,28800,28801],{"class":147,"line":964},[145,28802,1407],{"class":262},[145,28804,28805],{"class":147,"line":970},[145,28806,376],{"emptyLinePlaceholder":58},[145,28808,28809,28811,28813],{"class":147,"line":976},[145,28810,1126],{"class":262},[145,28812,266],{"class":258},[145,28814,1432],{"class":262},[145,28816,28817,28819,28821,28823,28825],{"class":147,"line":988},[145,28818,1437],{"class":258},[145,28820,449],{"class":159},[145,28822,679],{"class":155},[145,28824,1444],{"class":159},[145,28826,452],{"class":262},[145,28828,28829,28831,28833,28835],{"class":147,"line":993},[145,28830,1455],{"class":701},[145,28832,266],{"class":258},[145,28834,423],{"class":155},[145,28836,452],{"class":262},[145,28838,28839,28841,28843],{"class":147,"line":5531},[145,28840,1470],{"class":701},[145,28842,266],{"class":258},[145,28844,2788],{"class":262},[145,28846,28847],{"class":147,"line":5540},[145,28848,1483],{"class":262},[145,28850,28851,28853,28855],{"class":147,"line":5546},[145,28852,27398],{"class":262},[145,28854,266],{"class":258},[145,28856,11768],{"class":262},[145,28858,28859,28861,28863,28865],{"class":147,"line":5574},[145,28860,1703],{"class":258},[145,28862,23593],{"class":262},[145,28864,7693],{"class":159},[145,28866,764],{"class":262},[145,28868,28869],{"class":147,"line":5605},[145,28870,376],{"emptyLinePlaceholder":58},[145,28872,28873],{"class":147,"line":5625},[145,28874,376],{"emptyLinePlaceholder":58},[145,28876,28877],{"class":147,"line":5631},[145,28878,28879],{"class":174},"# Example: process a CSV product catalog\n",[145,28881,28882],{"class":147,"line":5637},[145,28883,28884],{"class":174},"# CSV format: product_name, image_url, style\n",[145,28886,28887,28890,28892],{"class":147,"line":5642},[145,28888,28889],{"class":262},"products ",[145,28891,266],{"class":258},[145,28893,8867],{"class":262},[145,28895,28896,28899,28902,28904,28907,28909,28911],{"class":147,"line":5655},[145,28897,28898],{"class":262},"    (",[145,28900,28901],{"class":159},"\"Wireless Earbuds\"",[145,28903,400],{"class":262},[145,28905,28906],{"class":159},"\"https://example.com/earbuds.jpg\"",[145,28908,400],{"class":262},[145,28910,28586],{"class":159},[145,28912,28913],{"class":262},"),\n",[145,28915,28916,28918,28921,28923,28926,28928,28931],{"class":147,"line":5661},[145,28917,28898],{"class":262},[145,28919,28920],{"class":159},"\"Leather Wallet\"",[145,28922,400],{"class":262},[145,28924,28925],{"class":159},"\"https://example.com/wallet.jpg\"",[145,28927,400],{"class":262},[145,28929,28930],{"class":159},"\"lifestyle\"",[145,28932,28913],{"class":262},[145,28934,28935,28937,28940,28942,28945,28947,28950],{"class":147,"line":5688},[145,28936,28898],{"class":262},[145,28938,28939],{"class":159},"\"Running Shoes\"",[145,28941,400],{"class":262},[145,28943,28944],{"class":159},"\"https://example.com/shoes.jpg\"",[145,28946,400],{"class":262},[145,28948,28949],{"class":159},"\"minimal\"",[145,28951,28913],{"class":262},[145,28953,28954],{"class":147,"line":5728},[145,28955,764],{"class":262},[145,28957,28958],{"class":147,"line":5747},[145,28959,376],{"emptyLinePlaceholder":58},[145,28961,28962,28964,28966],{"class":147,"line":5752},[145,28963,19724],{"class":262},[145,28965,266],{"class":258},[145,28967,5876],{"class":262},[145,28969,28970,28972,28975,28977],{"class":147,"line":5757},[145,28971,8229],{"class":258},[145,28973,28974],{"class":262}," name, url, style ",[145,28976,1180],{"class":258},[145,28978,28979],{"class":262}," products:\n",[145,28981,28982,28984,28986],{"class":147,"line":5762},[145,28983,7218],{"class":262},[145,28985,266],{"class":258},[145,28987,28988],{"class":262}," generate_product_video(name, url, style)\n",[145,28990,28991],{"class":147,"line":7442},[145,28992,28993],{"class":262},"    tasks.append((name, task_id))\n",[145,28995,28996,28998,29000,29002,29005,29007,29009,29011,29013,29015,29017,29019,29021],{"class":147,"line":7448},[145,28997,1102],{"class":155},[145,28999,794],{"class":262},[145,29001,440],{"class":258},[145,29003,29004],{"class":159},"\"Submitted: ",[145,29006,685],{"class":155},[145,29008,20668],{"class":262},[145,29010,691],{"class":155},[145,29012,23774],{"class":159},[145,29014,685],{"class":155},[145,29016,688],{"class":262},[145,29018,691],{"class":155},[145,29020,449],{"class":159},[145,29022,406],{"class":262},[145,29024,29025,29027,29029,29031],{"class":147,"line":7459},[145,29026,19902],{"class":262},[145,29028,5437],{"class":155},[145,29030,19907],{"class":262},[145,29032,29033],{"class":174},"# Rate limiting courtesy\n",[145,29035,29036],{"class":147,"line":7470},[145,29037,376],{"emptyLinePlaceholder":58},[145,29039,29040,29042,29044,29046,29048,29050,29053,29055,29058,29060,29063],{"class":147,"line":7481},[145,29041,6584],{"class":155},[145,29043,794],{"class":262},[145,29045,440],{"class":258},[145,29047,449],{"class":159},[145,29049,1670],{"class":155},[145,29051,29052],{"class":159},"Submitted ",[145,29054,6270],{"class":155},[145,29056,29057],{"class":262},"(tasks)",[145,29059,691],{"class":155},[145,29061,29062],{"class":159}," product videos\"",[145,29064,406],{"class":262},[145,29066,29067,29069,29071,29074],{"class":147,"line":7486},[145,29068,6584],{"class":155},[145,29070,794],{"class":262},[145,29072,29073],{"class":159},"\"Poll each task_id to retrieve the completed video URLs\"",[145,29075,406],{"class":262},[11,29077,29078,29079,29081],{},"This batch pattern scales to any catalog size. You can extend it with callback URLs (",[28,29080,3601],{}," parameter) instead of polling, which is more efficient for large batches — the API sends a POST to your endpoint when each video completes.",[92,29083,29085],{"id":29084},"product-video-prompt-templates","Product Video Prompt Templates",[11,29087,29088],{},"Here are field-tested prompt templates for common e-commerce video needs:",[136,29090,29092],{"className":338,"code":29091,"language":340,"meta":141,"style":141},"PRODUCT_TEMPLATES = {\n    \"rotation_360\": (\n        \"@Image1 is the product. \"\n        \"Full 360-degree rotation on a clean background. \"\n        \"Consistent studio lighting throughout the rotation. \"\n        \"Smooth, steady turntable motion. \"\n        \"Product catalog photography style.\"\n    ),\n    \"unboxing_reveal\": (\n        \"@Image1 is the product. \"\n        \"The product emerges from soft tissue paper inside a premium box. \"\n        \"Hands carefully lift it into view. \"\n        \"Camera slowly pushes in as the product is revealed. \"\n        \"Luxury unboxing experience. Warm lighting.\"\n    ),\n    \"hero_shot\": (\n        \"@Image1 is the product. \"\n        \"Dramatic hero shot. The product rises into frame against a dark background. \"\n        \"Volumetric light beams hit the product from the side. \"\n        \"Slow motion. Particles float in the light. \"\n        \"Epic product launch trailer aesthetic.\"\n    ),\n    \"in_use\": (\n        \"@Image1 is the product. \"\n        \"Someone picks up the product and uses it naturally. \"\n        \"Lifestyle setting with soft natural window light. \"\n        \"Medium close-up. The camera follows the interaction. \"\n        \"Authentic, relatable product usage.\"\n    ),\n}\n",[28,29093,29094,29103,29110,29115,29120,29125,29130,29135,29139,29146,29150,29155,29160,29165,29170,29174,29181,29185,29190,29195,29200,29205,29209,29216,29220,29225,29230,29235,29240,29244],{"__ignoreMap":141},[145,29095,29096,29099,29101],{"class":147,"line":148},[145,29097,29098],{"class":155},"PRODUCT_TEMPLATES",[145,29100,391],{"class":258},[145,29102,428],{"class":262},[145,29104,29105,29108],{"class":147,"line":166},[145,29106,29107],{"class":159},"    \"rotation_360\"",[145,29109,1322],{"class":262},[145,29111,29112],{"class":147,"line":178},[145,29113,29114],{"class":159},"        \"@Image1 is the product. \"\n",[145,29116,29117],{"class":147,"line":187},[145,29118,29119],{"class":159},"        \"Full 360-degree rotation on a clean background. \"\n",[145,29121,29122],{"class":147,"line":373},[145,29123,29124],{"class":159},"        \"Consistent studio lighting throughout the rotation. \"\n",[145,29126,29127],{"class":147,"line":379},[145,29128,29129],{"class":159},"        \"Smooth, steady turntable motion. \"\n",[145,29131,29132],{"class":147,"line":385},[145,29133,29134],{"class":159},"        \"Product catalog photography style.\"\n",[145,29136,29137],{"class":147,"line":409},[145,29138,3804],{"class":262},[145,29140,29141,29144],{"class":147,"line":420},[145,29142,29143],{"class":159},"    \"unboxing_reveal\"",[145,29145,1322],{"class":262},[145,29147,29148],{"class":147,"line":431},[145,29149,29114],{"class":159},[145,29151,29152],{"class":147,"line":455},[145,29153,29154],{"class":159},"        \"The product emerges from soft tissue paper inside a premium box. \"\n",[145,29156,29157],{"class":147,"line":466},[145,29158,29159],{"class":159},"        \"Hands carefully lift it into view. \"\n",[145,29161,29162],{"class":147,"line":600},[145,29163,29164],{"class":159},"        \"Camera slowly pushes in as the product is revealed. \"\n",[145,29166,29167],{"class":147,"line":605},[145,29168,29169],{"class":159},"        \"Luxury unboxing experience. Warm lighting.\"\n",[145,29171,29172],{"class":147,"line":611},[145,29173,3804],{"class":262},[145,29175,29176,29179],{"class":147,"line":617},[145,29177,29178],{"class":159},"    \"hero_shot\"",[145,29180,1322],{"class":262},[145,29182,29183],{"class":147,"line":623},[145,29184,29114],{"class":159},[145,29186,29187],{"class":147,"line":628},[145,29188,29189],{"class":159},"        \"Dramatic hero shot. The product rises into frame against a dark background. \"\n",[145,29191,29192],{"class":147,"line":639},[145,29193,29194],{"class":159},"        \"Volumetric light beams hit the product from the side. \"\n",[145,29196,29197],{"class":147,"line":654},[145,29198,29199],{"class":159},"        \"Slow motion. Particles float in the light. \"\n",[145,29201,29202],{"class":147,"line":660},[145,29203,29204],{"class":159},"        \"Epic product launch trailer aesthetic.\"\n",[145,29206,29207],{"class":147,"line":671},[145,29208,3804],{"class":262},[145,29210,29211,29214],{"class":147,"line":698},[145,29212,29213],{"class":159},"    \"in_use\"",[145,29215,1322],{"class":262},[145,29217,29218],{"class":147,"line":710},[145,29219,29114],{"class":159},[145,29221,29222],{"class":147,"line":716},[145,29223,29224],{"class":159},"        \"Someone picks up the product and uses it naturally. \"\n",[145,29226,29227],{"class":147,"line":722},[145,29228,29229],{"class":159},"        \"Lifestyle setting with soft natural window light. \"\n",[145,29231,29232],{"class":147,"line":728},[145,29233,29234],{"class":159},"        \"Medium close-up. The camera follows the interaction. \"\n",[145,29236,29237],{"class":147,"line":739},[145,29238,29239],{"class":159},"        \"Authentic, relatable product usage.\"\n",[145,29241,29242],{"class":147,"line":744},[145,29243,3804],{"class":262},[145,29245,29246],{"class":147,"line":750},[145,29247,469],{"class":262},[45,29249],{},[48,29251,13193],{"id":13192},[11,29253,29254],{},"After hundreds of API calls, clear patterns emerge in what works and what fails. Here are the most common mistakes and their fixes.",[92,29256,29258],{"id":29257},"mistake-1-using-realistic-human-face-photos","Mistake 1: Using Realistic Human Face Photos",[11,29260,29261,29264,29265,29267,29268,29270],{},[23,29262,29263],{},"What happens:"," The API returns a ",[28,29266,3637],{}," error or a ",[28,29269,2087],{}," task status.",[11,29272,29273,29276],{},[23,29274,29275],{},"Why:"," Seedance 2.0 blocks image-to-video generation from photorealistic human face images. This is a safety policy, not a bug.",[11,29278,29279,29281],{},[23,29280,13236],{}," Use illustrated, stylized, or cartoon-style character images instead. Anime characters, oil painting portraits, 3D rendered characters, and silhouettes all work perfectly. If your workflow requires human characters, generate them first using a text-to-image model with a non-photorealistic style.",[136,29283,29285],{"className":338,"code":29284,"language":340,"meta":141,"style":141},"# Will be rejected\n\"image_urls\": [\"https://example.com/real-person-photo.jpg\"]\n\n# Works fine\n\"image_urls\": [\"https://example.com/illustrated-character.png\"]\n\"image_urls\": [\"https://example.com/3d-rendered-character.jpg\"]\n\"image_urls\": [\"https://example.com/anime-character.png\"]\n",[28,29286,29287,29292,29303,29307,29312,29323,29334],{"__ignoreMap":141},[145,29288,29289],{"class":147,"line":148},[145,29290,29291],{"class":174},"# Will be rejected\n",[145,29293,29294,29296,29298,29301],{"class":147,"line":166},[145,29295,6238],{"class":159},[145,29297,10841],{"class":262},[145,29299,29300],{"class":159},"\"https://example.com/real-person-photo.jpg\"",[145,29302,764],{"class":262},[145,29304,29305],{"class":147,"line":178},[145,29306,376],{"emptyLinePlaceholder":58},[145,29308,29309],{"class":147,"line":187},[145,29310,29311],{"class":174},"# Works fine\n",[145,29313,29314,29316,29318,29321],{"class":147,"line":373},[145,29315,6238],{"class":159},[145,29317,10841],{"class":262},[145,29319,29320],{"class":159},"\"https://example.com/illustrated-character.png\"",[145,29322,764],{"class":262},[145,29324,29325,29327,29329,29332],{"class":147,"line":379},[145,29326,6238],{"class":159},[145,29328,10841],{"class":262},[145,29330,29331],{"class":159},"\"https://example.com/3d-rendered-character.jpg\"",[145,29333,764],{"class":262},[145,29335,29336,29338,29340,29343],{"class":147,"line":385},[145,29337,6238],{"class":159},[145,29339,10841],{"class":262},[145,29341,29342],{"class":159},"\"https://example.com/anime-character.png\"",[145,29344,764],{"class":262},[92,29346,29348],{"id":29347},"mistake-2-static-prompts-that-describe-appearance-only","Mistake 2: Static Prompts That Describe Appearance Only",[11,29350,29351,29353],{},[23,29352,29263],{}," The generated video shows minimal or no movement. The subject stands still, or only minor camera drift occurs.",[11,29355,29356,29358],{},[23,29357,29275],{}," The model takes your prompt literally. If you describe a static scene (\"a cat on a windowsill\"), you get a nearly static video.",[11,29360,29361,29363],{},[23,29362,13236],{}," Always include motion verbs, sequential actions, and environmental dynamics.",[136,29365,29367],{"className":338,"code":29366,"language":340,"meta":141,"style":141},"# Static: produces near-still video\n\"prompt\": \"A beautiful sunset over the ocean with golden light\"\n\n# Dynamic: produces engaging video\n\"prompt\": (\n    \"Waves crash against rocky coastline during golden sunset. \"\n    \"Water sprays upward, catching the warm light. \"\n    \"Camera slowly descends from sky level to water level. \"\n    \"Seabirds glide across the frame. \"\n    \"Light shifts from golden to deep amber.\"\n)\n",[28,29368,29369,29374,29383,29387,29392,29398,29403,29408,29413,29418,29423],{"__ignoreMap":141},[145,29370,29371],{"class":147,"line":148},[145,29372,29373],{"class":174},"# Static: produces near-still video\n",[145,29375,29376,29378,29380],{"class":147,"line":166},[145,29377,5921],{"class":159},[145,29379,437],{"class":262},[145,29381,29382],{"class":159},"\"A beautiful sunset over the ocean with golden light\"\n",[145,29384,29385],{"class":147,"line":178},[145,29386,376],{"emptyLinePlaceholder":58},[145,29388,29389],{"class":147,"line":187},[145,29390,29391],{"class":174},"# Dynamic: produces engaging video\n",[145,29393,29394,29396],{"class":147,"line":373},[145,29395,5921],{"class":159},[145,29397,1322],{"class":262},[145,29399,29400],{"class":147,"line":379},[145,29401,29402],{"class":159},"    \"Waves crash against rocky coastline during golden sunset. \"\n",[145,29404,29405],{"class":147,"line":385},[145,29406,29407],{"class":159},"    \"Water sprays upward, catching the warm light. \"\n",[145,29409,29410],{"class":147,"line":409},[145,29411,29412],{"class":159},"    \"Camera slowly descends from sky level to water level. \"\n",[145,29414,29415],{"class":147,"line":420},[145,29416,29417],{"class":159},"    \"Seabirds glide across the frame. \"\n",[145,29419,29420],{"class":147,"line":431},[145,29421,29422],{"class":159},"    \"Light shifts from golden to deep amber.\"\n",[145,29424,29425],{"class":147,"line":455},[145,29426,406],{"class":262},[92,29428,29430],{"id":29429},"mistake-3-wrong-duration-for-the-content","Mistake 3: Wrong Duration for the Content",[11,29432,29433,29435],{},[23,29434,29263],{}," Simple actions feel stretched out and awkward, or complex sequences feel rushed and choppy.",[11,29437,29438,29440],{},[23,29439,29275],{}," Duration must match the complexity of your prompt. A simple product rotation doesn't need 15 seconds. A multi-action character sequence doesn't work in 4 seconds.",[11,29442,29443,29445],{},[23,29444,13236],{}," Match duration to prompt complexity:",[2036,29447,29448,29460],{},[2039,29449,29450],{},[2042,29451,29452,29455,29458],{},[2045,29453,29454],{},"Prompt Complexity",[2045,29456,29457],{},"Actions Described",[2045,29459,19417],{},[2052,29461,29462,29472,29482],{},[2042,29463,29464,29467,29470],{},[2057,29465,29466],{},"Simple (one motion)",[2057,29468,29469],{},"1 action",[2057,29471,19509],{},[2042,29473,29474,29477,29480],{},[2057,29475,29476],{},"Moderate (2-3 actions)",[2057,29478,29479],{},"2–3 sequential actions",[2057,29481,18340],{},[2042,29483,29484,29487,29490],{},[2057,29485,29486],{},"Complex (narrative)",[2057,29488,29489],{},"4+ actions, scene changes",[2057,29491,25230],{},[92,29493,29495],{"id":29494},"mistake-4-image-url-issues","Mistake 4: Image URL Issues",[11,29497,29498,29500],{},[23,29499,29263],{}," The API returns errors about invalid images, or the task fails during processing.",[11,29502,29503,29505],{},[23,29504,29275],{}," Several common URL problems:",[97,29507,29508,29511,29514,29517,29520],{},[73,29509,29510],{},"URL requires authentication (not publicly accessible)",[73,29512,29513],{},"URL points to a webpage, not a direct image file",[73,29515,29516],{},"Image format is unsupported (WebP sometimes fails)",[73,29518,29519],{},"Image is too large (very high resolution files may timeout)",[73,29521,29522],{},"URL has expired (pre-signed URLs with time limits)",[11,29524,29525,29527],{},[23,29526,13236],{}," Ensure your image URLs are:",[70,29529,29530,29536,29549,29555,29561],{},[73,29531,29532,29535],{},[23,29533,29534],{},"Publicly accessible"," — no auth headers needed to download",[73,29537,29538,29541,29542,400,29545,29548],{},[23,29539,29540],{},"Direct image links"," — ending in ",[28,29543,29544],{},".jpg",[28,29546,29547],{},".png",", or similar (not an HTML page)",[73,29550,29551,29554],{},[23,29552,29553],{},"Standard formats"," — JPEG and PNG are safest",[73,29556,29557,29560],{},[23,29558,29559],{},"Reasonable size"," — under 10MB per image",[73,29562,29563,29566],{},[23,29564,29565],{},"Persistent"," — won't expire during processing",[136,29568,29570],{"className":338,"code":29569,"language":340,"meta":141,"style":141},"# Problem URLs\n\"https://drive.google.com/file/d/abc123/view\"  # Requires auth\n\"https://example.com/product-page\"              # HTML page, not image\n\"https://storage.com/image.jpg?token=abc&exp=1h\" # Might expire\n\n# Good URLs\n\"https://cdn.example.com/images/product.jpg\"     # Direct CDN link\n\"https://i.imgur.com/abc123.png\"                  # Public image host\n",[28,29571,29572,29577,29585,29593,29601,29605,29610,29618],{"__ignoreMap":141},[145,29573,29574],{"class":147,"line":148},[145,29575,29576],{"class":174},"# Problem URLs\n",[145,29578,29579,29582],{"class":147,"line":166},[145,29580,29581],{"class":159},"\"https://drive.google.com/file/d/abc123/view\"",[145,29583,29584],{"class":174},"  # Requires auth\n",[145,29586,29587,29590],{"class":147,"line":178},[145,29588,29589],{"class":159},"\"https://example.com/product-page\"",[145,29591,29592],{"class":174},"              # HTML page, not image\n",[145,29594,29595,29598],{"class":147,"line":187},[145,29596,29597],{"class":159},"\"https://storage.com/image.jpg?token=abc&exp=1h\"",[145,29599,29600],{"class":174}," # Might expire\n",[145,29602,29603],{"class":147,"line":373},[145,29604,376],{"emptyLinePlaceholder":58},[145,29606,29607],{"class":147,"line":379},[145,29608,29609],{"class":174},"# Good URLs\n",[145,29611,29612,29615],{"class":147,"line":385},[145,29613,29614],{"class":159},"\"https://cdn.example.com/images/product.jpg\"",[145,29616,29617],{"class":174},"     # Direct CDN link\n",[145,29619,29620,29623],{"class":147,"line":409},[145,29621,29622],{"class":159},"\"https://i.imgur.com/abc123.png\"",[145,29624,29625],{"class":174},"                  # Public image host\n",[92,29627,29629],{"id":29628},"mistake-5-not-using-tags-with-multiple-images","Mistake 5: Not Using @Tags with Multiple Images",[11,29631,29632,29634,29635,29637],{},[23,29633,29263],{}," When you pass 3+ images without using ",[28,29636,4144],{}," tags in your prompt, the model guesses which image serves which purpose. Results are unpredictable — sometimes the background image gets used as the character, or the style reference gets treated as a scene element.",[11,29639,29640,29642,29643,29645],{},[23,29641,13236],{}," Always use ",[28,29644,4144],{}," tags when passing more than one image. Be explicit about each image's role.",[136,29647,29649],{"className":338,"code":29648,"language":340,"meta":141,"style":141},"# Ambiguous: model guesses roles\n\"prompt\": \"A character walks through a forest in watercolor style\"\n\"image_urls\": [character.jpg, forest.jpg, watercolor_ref.jpg]\n\n# Explicit: model knows each role\n\"prompt\": (\n    \"@Image1 is the character. @Image2 is the forest environment. \"\n    \"@Image3 defines the watercolor art style. \"\n    \"The character (@Image1) walks through the forest (@Image2) \"\n    \"rendered in the watercolor style of @Image3.\"\n)\n\"image_urls\": [character.jpg, forest.jpg, watercolor_ref.jpg]\n",[28,29650,29651,29656,29665,29672,29676,29681,29687,29692,29697,29702,29707,29711],{"__ignoreMap":141},[145,29652,29653],{"class":147,"line":148},[145,29654,29655],{"class":174},"# Ambiguous: model guesses roles\n",[145,29657,29658,29660,29662],{"class":147,"line":166},[145,29659,5921],{"class":159},[145,29661,437],{"class":262},[145,29663,29664],{"class":159},"\"A character walks through a forest in watercolor style\"\n",[145,29666,29667,29669],{"class":147,"line":178},[145,29668,6238],{"class":159},[145,29670,29671],{"class":262},": [character.jpg, forest.jpg, watercolor_ref.jpg]\n",[145,29673,29674],{"class":147,"line":187},[145,29675,376],{"emptyLinePlaceholder":58},[145,29677,29678],{"class":147,"line":373},[145,29679,29680],{"class":174},"# Explicit: model knows each role\n",[145,29682,29683,29685],{"class":147,"line":379},[145,29684,5921],{"class":159},[145,29686,1322],{"class":262},[145,29688,29689],{"class":147,"line":385},[145,29690,29691],{"class":159},"    \"@Image1 is the character. @Image2 is the forest environment. \"\n",[145,29693,29694],{"class":147,"line":409},[145,29695,29696],{"class":159},"    \"@Image3 defines the watercolor art style. \"\n",[145,29698,29699],{"class":147,"line":420},[145,29700,29701],{"class":159},"    \"The character (@Image1) walks through the forest (@Image2) \"\n",[145,29703,29704],{"class":147,"line":431},[145,29705,29706],{"class":159},"    \"rendered in the watercolor style of @Image3.\"\n",[145,29708,29709],{"class":147,"line":455},[145,29710,406],{"class":262},[145,29712,29713,29715],{"class":147,"line":466},[145,29714,6238],{"class":159},[145,29716,29671],{"class":262},[92,29718,29720],{"id":29719},"mistake-6-forgetting-video-url-expiration","Mistake 6: Forgetting Video URL Expiration",[11,29722,29723,29725],{},[23,29724,29263],{}," You generate a video, save the URL, try to access it the next day, and get a 403 or 404.",[11,29727,29728,29730],{},[23,29729,29275],{}," Generated video URLs expire after 24 hours.",[11,29732,29733,29735],{},[23,29734,13236],{}," Download the video file immediately after generation completes. Add a download step to your polling function:",[136,29737,29739],{"className":338,"code":29738,"language":340,"meta":141,"style":141},"import os\n\ndef download_video(video_url, output_path):\n    \"\"\"Download a video before the URL expires.\"\"\"\n    resp = requests.get(video_url, stream=True)\n    resp.raise_for_status()\n    with open(output_path, \"wb\") as f:\n        for chunk in resp.iter_content(chunk_size=8192):\n            f.write(chunk)\n    print(f\"Saved to {output_path}\")\n\n# After generation completes:\nvideo_url = video_data[\"output\"][\"video_url\"]\ndownload_video(video_url, \"output/my-product-video.mp4\")\n",[28,29740,29741,29747,29751,29760,29765,29782,29786,29803,29821,29825,29847,29851,29856,29874],{"__ignoreMap":141},[145,29742,29743,29745],{"class":147,"line":148},[145,29744,347],{"class":258},[145,29746,363],{"class":262},[145,29748,29749],{"class":147,"line":166},[145,29750,376],{"emptyLinePlaceholder":58},[145,29752,29753,29755,29757],{"class":147,"line":178},[145,29754,526],{"class":258},[145,29756,1082],{"class":151},[145,29758,29759],{"class":262},"(video_url, output_path):\n",[145,29761,29762],{"class":147,"line":187},[145,29763,29764],{"class":159},"    \"\"\"Download a video before the URL expires.\"\"\"\n",[145,29766,29767,29769,29771,29774,29776,29778,29780],{"class":147,"line":373},[145,29768,1126],{"class":262},[145,29770,266],{"class":258},[145,29772,29773],{"class":262}," requests.get(video_url, ",[145,29775,1134],{"class":701},[145,29777,266],{"class":258},[145,29779,1139],{"class":155},[145,29781,406],{"class":262},[145,29783,29784],{"class":147,"line":379},[145,29785,1146],{"class":262},[145,29787,29788,29790,29792,29795,29797,29799,29801],{"class":147,"line":385},[145,29789,1151],{"class":258},[145,29791,1154],{"class":155},[145,29793,29794],{"class":262},"(output_path, ",[145,29796,1160],{"class":159},[145,29798,1163],{"class":262},[145,29800,1166],{"class":258},[145,29802,1169],{"class":262},[145,29804,29805,29807,29809,29811,29813,29815,29817,29819],{"class":147,"line":409},[145,29806,1174],{"class":258},[145,29808,1177],{"class":262},[145,29810,1180],{"class":258},[145,29812,1183],{"class":262},[145,29814,1186],{"class":701},[145,29816,266],{"class":258},[145,29818,1191],{"class":155},[145,29820,548],{"class":262},[145,29822,29823],{"class":147,"line":420},[145,29824,1198],{"class":262},[145,29826,29827,29829,29831,29833,29836,29838,29841,29843,29845],{"class":147,"line":431},[145,29828,1102],{"class":155},[145,29830,794],{"class":262},[145,29832,440],{"class":258},[145,29834,29835],{"class":159},"\"Saved to ",[145,29837,685],{"class":155},[145,29839,29840],{"class":262},"output_path",[145,29842,691],{"class":155},[145,29844,449],{"class":159},[145,29846,406],{"class":262},[145,29848,29849],{"class":147,"line":455},[145,29850,376],{"emptyLinePlaceholder":58},[145,29852,29853],{"class":147,"line":466},[145,29854,29855],{"class":174},"# After generation completes:\n",[145,29857,29858,29861,29863,29866,29868,29870,29872],{"class":147,"line":600},[145,29859,29860],{"class":262},"video_url ",[145,29862,266],{"class":258},[145,29864,29865],{"class":262}," video_data[",[145,29867,21539],{"class":159},[145,29869,1562],{"class":262},[145,29871,14953],{"class":159},[145,29873,764],{"class":262},[145,29875,29876,29879,29882],{"class":147,"line":605},[145,29877,29878],{"class":262},"download_video(video_url, ",[145,29880,29881],{"class":159},"\"output/my-product-video.mp4\"",[145,29883,406],{"class":262},[45,29885],{},[92,29887,29889],{"id":29888},"mistake-7-conflicting-prompt-and-image-content","Mistake 7: Conflicting Prompt and Image Content",[11,29891,29892,29894],{},[23,29893,29263],{}," The output video looks confused — elements from the image and elements from the prompt fight for dominance, producing visual artifacts or incoherent scenes.",[11,29896,29897,29899],{},[23,29898,29275],{}," You described something in the prompt that directly contradicts the reference image. For example, your image shows a red car, but your prompt says \"a blue sports car races down the highway.\"",[11,29901,29902,29904,29905,29908],{},[23,29903,13236],{}," Your prompt should ",[2619,29906,29907],{},"complement"," the image, not contradict it. Describe actions, camera movements, and environmental changes — not the appearance of elements already defined by your reference images.",[136,29910,29912],{"className":338,"code":29911,"language":340,"meta":141,"style":141},"# Contradicts image (image shows red car)\n\"prompt\": \"A blue sports car races down the highway at sunset\"\n\n# Complements image (lets the image define appearance)\n\"prompt\": (\n    \"@Image1 is the car. The car accelerates down an open highway. \"\n    \"Camera tracks alongside at speed. Sunset light reflects off the hood. \"\n    \"Road stretches to the horizon. Motion blur on the asphalt.\"\n)\n",[28,29913,29914,29919,29928,29932,29937,29943,29948,29953,29958],{"__ignoreMap":141},[145,29915,29916],{"class":147,"line":148},[145,29917,29918],{"class":174},"# Contradicts image (image shows red car)\n",[145,29920,29921,29923,29925],{"class":147,"line":166},[145,29922,5921],{"class":159},[145,29924,437],{"class":262},[145,29926,29927],{"class":159},"\"A blue sports car races down the highway at sunset\"\n",[145,29929,29930],{"class":147,"line":178},[145,29931,376],{"emptyLinePlaceholder":58},[145,29933,29934],{"class":147,"line":187},[145,29935,29936],{"class":174},"# Complements image (lets the image define appearance)\n",[145,29938,29939,29941],{"class":147,"line":373},[145,29940,5921],{"class":159},[145,29942,1322],{"class":262},[145,29944,29945],{"class":147,"line":379},[145,29946,29947],{"class":159},"    \"@Image1 is the car. The car accelerates down an open highway. \"\n",[145,29949,29950],{"class":147,"line":385},[145,29951,29952],{"class":159},"    \"Camera tracks alongside at speed. Sunset light reflects off the hood. \"\n",[145,29954,29955],{"class":147,"line":409},[145,29956,29957],{"class":159},"    \"Road stretches to the horizon. Motion blur on the asphalt.\"\n",[145,29959,29960],{"class":147,"line":420},[145,29961,406],{"class":262},[45,29963],{},[48,29965,29967],{"id":29966},"api-parameter-reference","API Parameter Reference",[11,29969,29970],{},"Here's every parameter relevant to image-to-video generation in a single reference table:",[2036,29972,29973,29987],{},[2039,29974,29975],{},[2042,29976,29977,29979,29981,29983,29985],{},[2045,29978,3400],{},[2045,29980,3403],{},[2045,29982,16495],{},[2045,29984,3406],{},[2045,29986,3412],{},[2052,29988,29989,30006,30024,30043,30058,30081,30108,30125,30142,30159],{},[2042,29990,29991,29995,29997,29999,30001],{},[2057,29992,29993],{},[28,29994,1747],{},[2057,29996,3423],{},[2057,29998,4951],{},[2057,30000,3426],{},[2057,30002,30003,30004],{},"Must be ",[28,30005,1308],{},[2042,30007,30008,30012,30014,30016,30018],{},[2057,30009,30010],{},[28,30011,1762],{},[2057,30013,3423],{},[2057,30015,4951],{},[2057,30017,3426],{},[2057,30019,30020,30021,30023],{},"Motion description with optional ",[28,30022,4144],{}," tags",[2042,30025,30026,30030,30032,30035,30040],{},[2057,30027,30028],{},[28,30029,2896],{},[2057,30031,3552],{},[2057,30033,30034],{},"Yes (for i2v)",[2057,30036,30037],{},[28,30038,30039],{},"[]",[2057,30041,30042],{},"1–9 publicly accessible image URLs",[2042,30044,30045,30049,30051,30053,30055],{},[2057,30046,30047],{},[28,30048,1774],{},[2057,30050,3458],{},[2057,30052,4840],{},[2057,30054,1352],{},[2057,30056,30057],{},"Video length in seconds (4–15)",[2042,30059,30060,30064,30066,30068,30072],{},[2057,30061,30062],{},[28,30063,1782],{},[2057,30065,3423],{},[2057,30067,4840],{},[2057,30069,30070],{},[28,30071,1368],{},[2057,30073,30074,30075,400,30077,400,30079],{},"Output resolution: ",[28,30076,4013],{},[28,30078,1368],{},[28,30080,3710],{},[2042,30082,30083,30087,30089,30091,30095],{},[2057,30084,30085],{},[28,30086,1802],{},[2057,30088,3423],{},[2057,30090,4840],{},[2057,30092,30093],{},[28,30094,1384],{},[2057,30096,30097,30098,400,30100,400,30102,400,30104,400,30106],{},"Output ratio: ",[28,30099,1384],{},[28,30101,3722],{},[28,30103,6140],{},[28,30105,6145],{},[28,30107,6150],{},[2042,30109,30110,30114,30116,30118,30122],{},[2057,30111,30112],{},[28,30113,1822],{},[2057,30115,3530],{},[2057,30117,4840],{},[2057,30119,30120],{},[28,30121,2935],{},[2057,30123,30124],{},"Generate synchronized audio track",[2042,30126,30127,30131,30133,30135,30139],{},[2057,30128,30129],{},[28,30130,3567],{},[2057,30132,3552],{},[2057,30134,4840],{},[2057,30136,30137],{},[28,30138,30039],{},[2057,30140,30141],{},"0–3 video reference URLs (for mixed media)",[2042,30143,30144,30148,30150,30152,30156],{},[2057,30145,30146],{},[28,30147,3584],{},[2057,30149,3552],{},[2057,30151,4840],{},[2057,30153,30154],{},[28,30155,30039],{},[2057,30157,30158],{},"0–3 audio reference URLs (for mixed media)",[2042,30160,30161,30165,30167,30169,30171],{},[2057,30162,30163],{},[28,30164,3601],{},[2057,30166,3423],{},[2057,30168,4840],{},[2057,30170,3426],{},[2057,30172,30173],{},"Webhook URL for completion notification",[11,30175,30176,30179,30180,23774,30183,400,30185,23774,30188,400,30190,23774,30193,493],{},[23,30177,30178],{},"Limits:"," Maximum 9 images + 3 videos + 3 audio files per request. Total across all media types cannot exceed 12. Tags are assigned by array position: ",[28,30181,30182],{},"image_urls[0]",[28,30184,2908],{},[28,30186,30187],{},"video_urls[0]",[28,30189,11421],{},[28,30191,30192],{},"audio_urls[0]",[28,30194,16533],{},[45,30196],{},[48,30198,13304],{"id":13303},[92,30200,30202],{"id":30201},"can-i-use-any-image-format-with-the-seedance-20-image-to-video-api","Can I use any image format with the Seedance 2.0 image-to-video API?",[11,30204,30205],{},"JPEG and PNG are fully supported and recommended. GIF (first frame only), BMP, and TIFF generally work but are less tested. WebP support is inconsistent — convert to JPEG or PNG for reliable results. All images must be accessible via a public URL without authentication.",[92,30207,30209],{"id":30208},"how-long-does-image-to-video-generation-take","How long does image-to-video generation take?",[11,30211,30212,30213,30215,30216,30218],{},"Typical generation times range from 60 to 180 seconds depending on duration, quality setting, and current server load. A 4-second clip at 480p generates faster than a 15-second clip at 1080p. Use the polling endpoint (",[28,30214,9171],{},") or set a ",[28,30217,3601],{}," to receive a notification when processing completes.",[92,30220,30222],{"id":30221},"whats-the-maximum-number-of-images-i-can-use-in-a-single-request","What's the maximum number of images I can use in a single request?",[11,30224,30225,30226,30228],{},"You can include up to 9 images in ",[28,30227,2896],{},". The total file count across all media types (images + videos + audio) is capped at 12 per request. So if you're using 9 images, you can still add up to 3 video or audio references.",[92,30230,30232],{"id":30231},"can-i-combine-image-to-video-with-audio-generation","Can I combine image-to-video with audio generation?",[11,30234,30235,30236,30238,30239,30241,30242,30244,30245,30247],{},"Yes. Set ",[28,30237,23310],{}," in your request payload alongside ",[28,30240,2896],{},". The model generates synchronized audio that matches the visual content — footsteps for walking scenes, ambient sounds for nature scenes, mechanical sounds for product rotations. You can also provide your own audio via ",[28,30243,3584],{}," and reference it with ",[28,30246,16533],{}," in your prompt.",[92,30249,30251],{"id":30250},"how-do-i-handle-video-url-expiration-in-production","How do I handle video URL expiration in production?",[11,30253,30254,30255,30257,30258,30260],{},"Generated video URLs expire after 24 hours. For production systems, implement an immediate download step in your pipeline. After the task status changes to ",[28,30256,2084],{},", download the video file to your own storage (S3, GCS, or local disk) before returning the URL to your application. Never store the API-generated URL as a permanent reference. If you're using ",[28,30259,3601],{},", your webhook handler should include the download step as part of its processing logic.",[92,30262,30264],{"id":30263},"can-i-use-seedance-20-image-to-video-for-animated-logos-or-brand-intros","Can I use Seedance 2.0 image-to-video for animated logos or brand intros?",[11,30266,30267,30268,30270,30271,30273],{},"Yes, and this is one of the strongest use cases. Upload your logo or brand mark as ",[28,30269,2908],{}," and prompt for the animation style you want — particle assembly, liquid reveal, 3D rotation, etc. Since logos are graphic elements (not photorealistic faces), they work perfectly with the image-to-video pipeline. Set ",[28,30272,23310],{}," to add a synchronized sound effect for the reveal.",[92,30275,30277],{"id":30276},"why-was-my-image-to-video-request-rejected","Why was my image-to-video request rejected?",[11,30279,30280,30281,30283],{},"The most common rejection reason is a photorealistic human face in the input image. Seedance 2.0 automatically detects and blocks realistic face imagery for safety reasons. Other rejection causes include: inaccessible image URLs, unsupported file formats, exceeding the 9-image limit, or the total media file count exceeding 12. Check the error message in the ",[28,30282,2087],{}," task response for specific details.",[45,30285],{},[48,30287,30289],{"id":30288},"start-animating-your-images","Start Animating Your Images",[11,30291,30292,30293,30296],{},"You now have three distinct methods to turn static images into video through the Seedance 2.0 API: single-image animation for quick character or scene motion, first-last frame control for precise start-to-end transitions, and multi-image composition with ",[28,30294,30295],{},"@tags"," for complex, role-assigned scenes.",[11,30298,30299],{},"The code examples throughout this guide are complete and runnable. Copy any of them, insert your API key, point to your own images, and you'll have a generated video within minutes.",[11,30301,30302,30303,30305],{},"For product teams, the batch generation workflow turns an entire product catalog into video assets without a studio. For creative teams, the character consistency pattern enables multi-shot storytelling from a single character reference. For developers, the ",[28,30304,23123],{}," system provides a level of compositional control that no other AI video API currently offers.",[11,30307,30308],{},[23,30309,30310],{},[37,30311,30313],{"href":211,"rel":30312},[41],"Start animating your images. Sign up free on EvoLink →",[45,30315],{},[11,30317,30318],{},[2619,30319,30320,30321,400,30323,400,30326,13968,30328,493],{},"This guide is part of the Seedance 2.0 tutorial series. Previously: ",[37,30322,23033],{"href":1766},[37,30324,30325],{"href":17548},"Getting Started",[37,30327,2967],{"href":2966},[37,30329,23039],{"href":3856},[11217,30331,13442],{},{"title":141,"searchDepth":166,"depth":166,"links":30333},[30334,30340,30346,30353,30360,30367,30374,30383,30392,30393,30402],{"id":23129,"depth":166,"text":23130,"children":30335},[30336,30337,30338,30339],{"id":23143,"depth":178,"text":23144},{"id":23284,"depth":178,"text":23285},{"id":23303,"depth":178,"text":23304},{"id":23314,"depth":178,"text":23315},{"id":23323,"depth":166,"text":23324,"children":30341},[30342,30343,30344,30345],{"id":23333,"depth":178,"text":23334},{"id":23360,"depth":178,"text":23361},{"id":23379,"depth":178,"text":23380},{"id":23478,"depth":178,"text":23479},{"id":23792,"depth":166,"text":23793,"children":30347},[30348,30349,30350,30351,30352],{"id":6440,"depth":178,"text":6441},{"id":23844,"depth":178,"text":23845},{"id":24389,"depth":178,"text":24390},{"id":24411,"depth":178,"text":24412},{"id":24430,"depth":178,"text":24431},{"id":24540,"depth":166,"text":24541,"children":30354},[30355,30356,30357,30358,30359],{"id":24551,"depth":178,"text":6441},{"id":24580,"depth":178,"text":24581},{"id":24619,"depth":178,"text":24620},{"id":25139,"depth":178,"text":25140},{"id":25158,"depth":178,"text":25159},{"id":25235,"depth":166,"text":25236,"children":30361},[30362,30363,30364,30365,30366],{"id":25245,"depth":178,"text":25246},{"id":25273,"depth":178,"text":25274},{"id":25854,"depth":178,"text":25855},{"id":25875,"depth":178,"text":25876},{"id":25979,"depth":178,"text":25980},{"id":26010,"depth":166,"text":26011,"children":30368},[30369,30370,30371,30372,30373],{"id":26024,"depth":178,"text":26025},{"id":26489,"depth":178,"text":26490},{"id":26507,"depth":178,"text":26508},{"id":26609,"depth":178,"text":26610},{"id":27616,"depth":178,"text":27617},{"id":27648,"depth":166,"text":27649,"children":30375},[30376,30377,30378,30379,30380,30381,30382],{"id":27659,"depth":178,"text":27660},{"id":27697,"depth":178,"text":27698},{"id":28233,"depth":178,"text":28234},{"id":28251,"depth":178,"text":28252},{"id":28466,"depth":178,"text":28467},{"id":28484,"depth":178,"text":28485},{"id":29084,"depth":178,"text":29085},{"id":13192,"depth":166,"text":13193,"children":30384},[30385,30386,30387,30388,30389,30390,30391],{"id":29257,"depth":178,"text":29258},{"id":29347,"depth":178,"text":29348},{"id":29429,"depth":178,"text":29430},{"id":29494,"depth":178,"text":29495},{"id":29628,"depth":178,"text":29629},{"id":29719,"depth":178,"text":29720},{"id":29888,"depth":178,"text":29889},{"id":29966,"depth":166,"text":29967},{"id":13303,"depth":166,"text":13304,"children":30394},[30395,30396,30397,30398,30399,30400,30401],{"id":30201,"depth":178,"text":30202},{"id":30208,"depth":178,"text":30209},{"id":30221,"depth":178,"text":30222},{"id":30231,"depth":178,"text":30232},{"id":30250,"depth":178,"text":30251},{"id":30263,"depth":178,"text":30264},{"id":30276,"depth":178,"text":30277},{"id":30288,"depth":166,"text":30289},"Learn to animate images with Seedance 2.0 API — single image, first-last frame, multi-image workflows. Complete Python code, @tag syntax, and e-commerce demos.",{"date":23099,"image":30405,"seoTitle":30406},"/s5-hero-image-to-video.webp","Seedance 2.0 Image-to-Video API: Animate Any Image (2026)","/en/blog/seedance-2-image-to-video-api",{"title":23108,"description":30403},"en/blog/seedance-2-image-to-video-api","JBnLvqJ_PvJG1svc5iOtTrCvUmRfzAr9i1boWpBJS6k",{"id":30412,"title":13428,"body":30413,"description":32175,"extension":11279,"meta":32176,"navigation":58,"path":32179,"seo":32180,"stem":32181,"__hash__":32182},"content/en/blog/seedance-2-multimodal-tags-guide.md",{"type":8,"value":30414,"toc":32126},[30415,30421,30424,30432,30434,30438,30445,30448,30496,30499,30519,30526,30528,30532,30536,30542,30548,30551,30557,30581,30585,30674,30678,30681,30695,30701,30703,30707,30710,30714,30829,30833,30837,30843,30849,30855,30859,30864,30868,30872,30878,30883,30888,30892,30895,30901,30904,30906,30910,30917,30921,31010,31014,31018,31024,31029,31034,31038,31041,31086,31096,31100,31104,31109,31111,31115,31118,31122,31196,31200,31206,31210,31216,31221,31225,31228,31234,31237,31241,31246,31251,31254,31256,31260,31263,31267,31273,31278,31292,31296,31302,31308,31312,31317,31321,31335,31339,31345,31350,31354,31359,31363,31377,31381,31387,31392,31396,31399,31490,31496,31500,31503,31713,31716,31908,31915,31917,31921,31925,31932,31939,31942,31946,31949,31960,31964,31967,31971,31977,31981,31984,31992,32002,32006,32009,32011,32013,32017,32020,32024,32034,32038,32047,32051,32058,32062,32065,32067,32071,32074,32077,32097,32105,32110,32117,32119,32123],[11,30416,30417,30418,30420],{},"Most AI video generators take a text prompt and give you whatever they feel like. Seedance 2.0 works differently. You upload images, videos, and audio files, then use ",[23,30419,30295],{}," to tell the model exactly what each file should do — act as a first frame, define camera movement, set the music tempo, or provide a character reference.",[11,30422,30423],{},"This @tag reference system is what separates Seedance 2.0 from Sora 2, Kling 3.0, and Veo 3.1. None of them offer this level of multimodal control.",[11,30425,30426,30427,30431],{},"This guide covers every @tag type, the syntax rules, file limits, and real prompt examples you can use immediately. If you want to follow along with API calls, ",[37,30428,30430],{"href":211,"rel":30429},[41],"get your free EvoLink API key"," — it takes 30 seconds.",[45,30433],{},[48,30435,30437],{"id":30436},"what-is-the-tag-reference-system","What Is the @Tag Reference System?",[11,30439,30440,30441,30444],{},"Traditional text-to-video is a one-input, one-output process: you write a prompt, the model interprets it however it wants. Seedance 2.0 turns this into a ",[23,30442,30443],{},"multi-input, directed-output"," process.",[11,30446,30447],{},"Here's the difference:",[2036,30449,30450,30466],{},[2039,30451,30452],{},[2042,30453,30454,30457,30460,30463],{},[2045,30455,30456],{},"Approach",[2045,30458,30459],{},"Input",[2045,30461,30462],{},"Control Level",[2045,30464,30465],{},"Result",[2052,30467,30468,30482],{},[2042,30469,30470,30473,30476,30479],{},[2057,30471,30472],{},"Text-only",[2057,30474,30475],{},"\"A woman dances on stage\"",[2057,30477,30478],{},"Low — model decides everything",[2057,30480,30481],{},"Random woman, random dance, random stage",[2042,30483,30484,30487,30490,30493],{},[2057,30485,30486],{},"With @tags",[2057,30488,30489],{},"@Image1 (character) + @Video1 (dance reference) + prompt",[2057,30491,30492],{},"High — you direct each element",[2057,30494,30495],{},"Your specific character performs the exact dance you referenced",[11,30497,30498],{},"The @tag system works like a film director's shot list. Each uploaded file gets a role assignment through natural language in your prompt:",[97,30500,30501,30507,30513],{},[73,30502,30503,30506],{},[28,30504,30505],{},"@Image1 as the first frame"," — pins the opening visual",[73,30508,30509,30512],{},[28,30510,30511],{},"@Video1 for camera movement reference"," — copies the cinematography",[73,30514,30515,30518],{},[28,30516,30517],{},"@Audio1 as background music"," — sets the soundtrack and rhythm",[11,30520,30521,30522,30525],{},"You can combine up to ",[23,30523,30524],{},"12 files"," (9 images + 3 videos + 3 audio clips) in a single generation, each tagged with a specific purpose.",[45,30527],{},[48,30529,30531],{"id":30530},"tag-syntax-rules-the-complete-reference","@Tag Syntax Rules — The Complete Reference",[92,30533,30535],{"id":30534},"basic-syntax","Basic Syntax",[11,30537,30538,30539,30541],{},"The format is straightforward: ",[28,30540,11545],{}," + asset type + number.",[136,30543,30546],{"className":30544,"code":30545,"language":2185},[2183],"@Image1, @Image2, @Image3 ... @Image9\n@Video1, @Video2, @Video3\n@Audio1, @Audio2, @Audio3\n",[28,30547,30545],{"__ignoreMap":141},[11,30549,30550],{},"In your prompt, you reference these tags and describe their role in natural language:",[136,30552,30555],{"className":30553,"code":30554,"language":2185},[2183],"@Image1 as the first frame, @Image2 as character reference,\nreference @Video1's camera movement and tracking shots,\nuse @Audio1 for background music tempo.\n",[28,30556,30554],{"__ignoreMap":141},[18,30558,30559],{},[11,30560,30561,30564,30565,400,30568,400,30571,30574,30575,400,30577,400,30579,493],{},[23,30562,30563],{},"Note:"," On the Jimeng (即梦) platform, tags use Chinese format: ",[28,30566,30567],{},"@图片1",[28,30569,30570],{},"@视频1",[28,30572,30573],{},"@音频1",". Through the API, use ",[28,30576,2908],{},[28,30578,11421],{},[28,30580,16533],{},[92,30582,30584],{"id":30583},"file-limits-and-formats","File Limits and Formats",[2036,30586,30587,30605],{},[2039,30588,30589],{},[2042,30590,30591,30594,30597,30600,30603],{},[2045,30592,30593],{},"Asset Type",[2045,30595,30596],{},"Max Count",[2045,30598,30599],{},"Formats",[2045,30601,30602],{},"Size Limit",[2045,30604,19420],{},[2052,30606,30607,30623,30639,30655],{},[2042,30608,30609,30612,30615,30617,30620],{},[2057,30610,30611],{},"Images",[2057,30613,30614],{},"9",[2057,30616,3255],{},[2057,30618,30619],{},"30 MB each",[2057,30621,30622],{},"Higher resolution = better output",[2042,30624,30625,30628,30630,30633,30636],{},[2057,30626,30627],{},"Videos",[2057,30629,5056],{},[2057,30631,30632],{},"MP4, MOV",[2057,30634,30635],{},"50 MB each",[2057,30637,30638],{},"Total duration: 2–15s, resolution: 480p–720p",[2042,30640,30641,30644,30646,30649,30652],{},[2057,30642,30643],{},"Audio",[2057,30645,5056],{},[2057,30647,30648],{},"MP3, WAV",[2057,30650,30651],{},"15 MB each",[2057,30653,30654],{},"Total duration: ≤ 15s",[2042,30656,30657,30662,30667,30669,30671],{},[2057,30658,30659],{},[23,30660,30661],{},"Combined",[2057,30663,30664],{},[23,30665,30666],{},"12 total",[2057,30668,3426],{},[2057,30670,3426],{},[2057,30672,30673],{},"Mix any combination within limits",[92,30675,30677],{"id":30676},"the-two-entry-modes","The Two Entry Modes",[11,30679,30680],{},"Seedance 2.0 has two generation modes. Your input determines which one to use:",[70,30682,30683,30689],{},[73,30684,30685,30688],{},[23,30686,30687],{},"First/Last Frame Mode"," — Upload only a starting image (+ optional ending image) with a text prompt. Simple and fast.",[73,30690,30691,30694],{},[23,30692,30693],{},"All-Round Reference Mode"," — Upload any combination of images, videos, and audio with @tag assignments. This is where the full power lives.",[11,30696,30697,30700],{},[23,30698,30699],{},"Rule:"," If you upload any video or audio reference, or more than 2 images, you must use All-Round Reference mode.",[45,30702],{},[48,30704,30706],{"id":30705},"image-tags-control-visual-identity","Image @Tags — Control Visual Identity",[11,30708,30709],{},"Image references are the most versatile @tag type. A single image can serve many different purposes depending on how you describe it in your prompt.",[92,30711,30713],{"id":30712},"reference-types-for-images","Reference Types for Images",[2036,30715,30716,30726],{},[2039,30717,30718],{},[2042,30719,30720,30722,30724],{},[2045,30721,25896],{},[2045,30723,2979],{},[2045,30725,11473],{},[2052,30727,30728,30742,30757,30771,30785,30800,30815],{},[2042,30729,30730,30735,30739],{},[2057,30731,30732],{},[23,30733,30734],{},"First frame",[2057,30736,30737],{},[28,30738,30505],{},[2057,30740,30741],{},"Pins the exact opening visual of your video",[2042,30743,30744,30749,30754],{},[2057,30745,30746],{},[23,30747,30748],{},"Last frame",[2057,30750,30751],{},[28,30752,30753],{},"@Image2 as the last frame",[2057,30755,30756],{},"Defines the ending visual for transitions",[2042,30758,30759,30764,30768],{},[2057,30760,30761],{},[23,30762,30763],{},"Character identity",[2057,30765,30766],{},[28,30767,25908],{},[2057,30769,30770],{},"Maintains face/body consistency throughout",[2042,30772,30773,30777,30782],{},[2057,30774,30775],{},[23,30776,25929],{},[2057,30778,30779],{},[28,30780,30781],{},"reference @Image1's art style",[2057,30783,30784],{},"Applies painting style, color palette, or visual aesthetic",[2042,30786,30787,30792,30797],{},[2057,30788,30789],{},[23,30790,30791],{},"Scene/environment",[2057,30793,30794],{},[28,30795,30796],{},"scene references @Image3",[2057,30798,30799],{},"Sets the location, background, architecture",[2042,30801,30802,30807,30812],{},[2057,30803,30804],{},[23,30805,30806],{},"Object reference",[2057,30808,30809],{},[28,30810,30811],{},"the product in @Image1",[2057,30813,30814],{},"Maintains product details for commercials",[2042,30816,30817,30821,30826],{},[2057,30818,30819],{},[23,30820,23821],{},[2057,30822,30823],{},[28,30824,30825],{},"framing references @Image1",[2057,30827,30828],{},"Copies the camera angle and layout",[92,30830,30832],{"id":30831},"example-style-transfer-with-van-gogh","Example: Style Transfer with Van Gogh",[11,30834,30835],{},[23,30836,11996],{},[136,30838,30841],{"className":30839,"code":30840,"language":2185},[2183],"A young woman with long blonde hair in a blue dress stands on a hilltop,\ngazing at a Provençal village at sunset. Entirely rendered in @Image1's\npost-impressionist art style — thick impasto brushstrokes, swirling textures,\nrich yellows and blues.\n",[28,30842,30840],{"__ignoreMap":141},[11,30844,30845,30848],{},[23,30846,30847],{},"Input:"," One Van Gogh painting as @Image1",[11,30850,30851,30854],{},[23,30852,30853],{},"Result:"," The model renders the entire scene in Van Gogh's signature style — not a filter overlay, but genuine style transfer that maintains the brushstroke texture throughout the video.",[56,30856,60,30857],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,30858],{"src":24417,"type":65},[11,30860,30861],{},[2619,30862,30863],{},"Video: Style transfer using @Image reference — Van Gogh post-impressionist rendering",[92,30865,30867],{"id":30866},"example-product-commercial","Example: Product Commercial",[11,30869,30870],{},[23,30871,11996],{},[136,30873,30876],{"className":30874,"code":30875,"language":2185},[2183],"Commercial showcase of the handbag in @Image2.\nSide profile references @Image1.\nSurface material texture references @Image3.\nDisplay all product details with cinematic camera movement.\nGrand orchestral background music.\n",[28,30877,30875],{"__ignoreMap":141},[11,30879,30880,30882],{},[23,30881,30847],{}," 3 images — side view, main product photo, material close-up",[11,30884,30885,30887],{},[23,30886,30853],{}," A polished product video that maintains exact material textures and proportions from your reference images — no AI hallucination on product details.",[92,30889,30891],{"id":30890},"multi-image-character-consistency","Multi-Image Character Consistency",[11,30893,30894],{},"When you need the same character across multiple shots, upload several reference images from different angles:",[136,30896,30899],{"className":30897,"code":30898,"language":2185},[2183],"@Image1 and @Image2 define the main character's appearance.\nThe character walks through @Image3's environment,\nwearing the outfit from @Image4.\n",[28,30900,30898],{"__ignoreMap":141},[11,30902,30903],{},"The more reference images you provide for a character, the more consistent the output. This solves the \"face morphing\" problem that plagues single-image generation.",[45,30905],{},[48,30907,30909],{"id":30908},"video-tags-replicate-camera-motion","Video @Tags — Replicate Camera & Motion",[11,30911,30912,30913,30916],{},"Video references unlock Seedance 2.0's most impressive capability: ",[23,30914,30915],{},"precise replication of camera work and physical motion",". Upload a reference video, and the model copies the exact cinematography, action choreography, or visual effects.",[92,30918,30920],{"id":30919},"reference-types-for-videos","Reference Types for Videos",[2036,30922,30923,30934],{},[2039,30924,30925],{},[2042,30926,30927,30929,30931],{},[2045,30928,25896],{},[2045,30930,2979],{},[2045,30932,30933],{},"What Gets Copied",[2052,30935,30936,30951,30966,30980,30995],{},[2042,30937,30938,30943,30948],{},[2057,30939,30940],{},[23,30941,30942],{},"Camera movement",[2057,30944,30945],{},[28,30946,30947],{},"reference @Video1's camera movement",[2057,30949,30950],{},"Pan, tilt, dolly, tracking, zoom patterns",[2042,30952,30953,30958,30963],{},[2057,30954,30955],{},[23,30956,30957],{},"Action/choreography",[2057,30959,30960],{},[28,30961,30962],{},"perform the actions from @Video1",[2057,30964,30965],{},"Body movement, dance steps, fight choreography",[2042,30967,30968,30972,30977],{},[2057,30969,30970],{},[23,30971,11524],{},[2057,30973,30974],{},[28,30975,30976],{},"reference @Video1's transition effects",[2057,30978,30979],{},"Particle effects, style transitions, VFX",[2042,30981,30982,30987,30992],{},[2057,30983,30984],{},[23,30985,30986],{},"Rhythm/pacing",[2057,30988,30989],{},[28,30990,30991],{},"match @Video1's editing rhythm",[2057,30993,30994],{},"Cut timing, beat synchronization, tempo",[2042,30996,30997,31002,31007],{},[2057,30998,30999],{},[23,31000,31001],{},"Full replication",[2057,31003,31004],{},[28,31005,31006],{},"completely reference @Video1",[2057,31008,31009],{},"Everything — camera, action, effects, pacing",[92,31011,31013],{"id":31012},"example-cinematic-camera-replication","Example: Cinematic Camera Replication",[11,31015,31016],{},[23,31017,11996],{},[136,31019,31022],{"className":31020,"code":31021,"language":2185},[2183],"Reference @Image1's character. He is in @Image2's elevator.\nCompletely reference @Video1's camera movements and the protagonist's\nfacial expressions. Hitchcock zoom when the character is frightened,\nthen several orbiting shots inside the elevator.\nThe elevator door opens, tracking shot follows him out.\nExterior scene references @Image3.\n",[28,31023,31021],{"__ignoreMap":141},[11,31025,31026,31028],{},[23,31027,30847],{}," 3 images (character, elevator interior, exterior scene) + 1 reference video (with desired camera work)",[11,31030,31031,31033],{},[23,31032,30853],{}," The model reproduces the exact Hitchcock zoom, orbital camera movements, and tracking shots from your reference video — applied to a completely different character and setting.",[92,31035,31037],{"id":31036},"camera-techniques-you-can-replicate","Camera Techniques You Can Replicate",[11,31039,31040],{},"Seedance 2.0 can reproduce these camera movements from a reference video:",[97,31042,31043,31049,31055,31061,31066,31071,31076,31081],{},[73,31044,31045,31048],{},[23,31046,31047],{},"Hitchcock zoom"," (dolly zoom / vertigo effect)",[73,31050,31051,31054],{},[23,31052,31053],{},"360° orbit"," around the subject",[73,31056,31057,31060],{},[23,31058,31059],{},"One-shot continuous take"," (no cuts)",[73,31062,31063],{},[23,31064,31065],{},"Mechanical arm multi-angle tracking",[73,31067,31068],{},[23,31069,31070],{},"Low-angle hero shots",[73,31072,31073],{},[23,31074,31075],{},"Handheld chase camera",[73,31077,31078],{},[23,31079,31080],{},"Fish-eye lens distortion",[73,31082,31083],{},[23,31084,31085],{},"Push-pull rhythmic movement",[11,31087,31088,31091,31092,31095],{},[23,31089,31090],{},"Prompt tip:"," Be specific about which aspect of the reference video to copy. \"Reference @Video1's camera movement\" is better than just \"reference @Video1\" — it tells the model to focus on cinematography rather than trying to copy everything. For ",[37,31093,31094],{"href":3856},"camera reference examples"," with complete Python code, see our dedicated camera movement tutorial.",[92,31097,31099],{"id":31098},"example-action-parkour","Example: Action Parkour",[56,31101,60,31102],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,31103],{"src":12258,"type":65},[11,31105,31106],{},[2619,31107,31108],{},"Video: Dynamic parkour with cinematic tracking shot — generated with camera movement reference",[45,31110],{},[48,31112,31114],{"id":31113},"audio-tags-sound-design-with-references","Audio @Tags — Sound Design with References",[11,31116,31117],{},"Seedance 2.0 generates native audio with every video — sound effects, ambient noise, music, and even dialogue. Audio @tags give you control over what it sounds like.",[92,31119,31121],{"id":31120},"reference-types-for-audio","Reference Types for Audio",[2036,31123,31124,31134],{},[2039,31125,31126],{},[2042,31127,31128,31130,31132],{},[2045,31129,25896],{},[2045,31131,2979],{},[2045,31133,30933],{},[2052,31135,31136,31151,31166,31181],{},[2042,31137,31138,31143,31148],{},[2057,31139,31140],{},[23,31141,31142],{},"Background music",[2057,31144,31145],{},[28,31146,31147],{},"use @Audio1 for background music",[2057,31149,31150],{},"Musical style, tempo, instruments",[2042,31152,31153,31158,31163],{},[2057,31154,31155],{},[23,31156,31157],{},"Sound effects",[2057,31159,31160],{},[28,31161,31162],{},"sound effects reference @Audio1",[2057,31164,31165],{},"Specific sound textures and timing",[2042,31167,31168,31173,31178],{},[2057,31169,31170],{},[23,31171,31172],{},"Voice/narration style",[2057,31174,31175],{},[28,31176,31177],{},"narration voice references @Video1",[2057,31179,31180],{},"Vocal tone, speaking pace, accent",[2042,31182,31183,31188,31193],{},[2057,31184,31185],{},[23,31186,31187],{},"Beat sync",[2057,31189,31190],{},[28,31191,31192],{},"match @Audio1's rhythm for editing cuts",[2057,31194,31195],{},"Music beats drive visual transitions",[92,31197,31199],{"id":31198},"beat-synchronization-music-video-mode","Beat Synchronization (Music Video Mode)",[11,31201,31202,31203,493],{},"One of the most powerful audio features: upload a music track, and the model ",[23,31204,31205],{},"synchronizes visual cuts and transitions to the beat",[11,31207,31208],{},[23,31209,11996],{},[136,31211,31214],{"className":31212,"code":31213,"language":2185},[2183],"@Image1 through @Image7 as scene references.\nMatch @Video1's visual rhythm and beat synchronization.\nEach image appears on a music beat with dynamic transitions.\nEnhance visual impact with dramatic lighting changes on each cut.\n",[28,31215,31213],{"__ignoreMap":141},[11,31217,31218,31220],{},[23,31219,30853],{}," The model creates a music-video-style edit where scene transitions, camera movements, and lighting shifts happen precisely on the beat of your reference audio.",[92,31222,31224],{"id":31223},"using-video-audio-as-reference","Using Video Audio as Reference",[11,31226,31227],{},"You don't need a separate audio file — you can reference the audio track from an uploaded video:",[136,31229,31232],{"className":31230,"code":31231,"language":2185},[2183],"Background music references @Video1's audio.\n",[28,31233,31231],{"__ignoreMap":141},[11,31235,31236],{},"This is useful when you want to replicate the sound design of an existing video while changing the visuals.",[92,31238,31240],{"id":31239},"example-character-dialogue","Example: Character Dialogue",[56,31242,60,31243],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,31244],{"src":31245,"type":65},"https://cdn.evolink.ai/seedance2api/%E7%8C%AB%E7%8B%97%E8%B0%88%E5%BF%83.mp4",[11,31247,31248],{},[2619,31249,31250],{},"Video: AI-generated character dialogue with natural voice acting and ambient café sounds",[11,31252,31253],{},"Seedance 2.0 supports multi-language dialogue generation, including English, Chinese, Spanish, Korean, and more. Write the dialogue directly in your prompt, and the model generates matching lip-sync and voice acting.",[45,31255],{},[48,31257,31259],{"id":31258},"advanced-combinations-multi-modal-recipes","Advanced Combinations — Multi-Modal Recipes",[11,31261,31262],{},"The real power of @tags emerges when you combine multiple modalities. Here are three proven recipes for common production scenarios.",[92,31264,31266],{"id":31265},"recipe-1-cinematic-short-film","Recipe 1: Cinematic Short Film",[11,31268,31269,31272],{},[23,31270,31271],{},"Goal:"," Film-quality scene with specific character, camera work, and soundtrack",[11,31274,31275],{},[23,31276,31277],{},"Files:",[97,31279,31280,31283,31286,31289],{},[73,31281,31282],{},"@Image1: Character face/body reference",[73,31284,31285],{},"@Image2: Environment/location reference",[73,31287,31288],{},"@Video1: Camera movement reference (e.g., tracking shot from a film)",[73,31290,31291],{},"@Audio1: Background music track",[11,31293,31294],{},[23,31295,11996],{},[136,31297,31300],{"className":31298,"code":31299,"language":2185},[2183],"@Image1's character walks through @Image2's environment.\nCamera movement follows @Video1's tracking shot pattern.\nBackground music uses @Audio1.\nCinematic lighting, shallow depth of field, 24fps film grain.\n",[28,31301,31299],{"__ignoreMap":141},[11,31303,31304,31307],{},[23,31305,31306],{},"File allocation:"," 2 images + 1 video + 1 audio = 4/12 files used",[92,31309,31311],{"id":31310},"recipe-2-e-commerce-product-video","Recipe 2: E-Commerce Product Video",[11,31313,31314,31316],{},[23,31315,31271],{}," Professional product showcase from static product photos",[11,31318,31319],{},[23,31320,31277],{},[97,31322,31323,31326,31329,31332],{},[73,31324,31325],{},"@Image1: Product main shot",[73,31327,31328],{},"@Image2: Product side view",[73,31330,31331],{},"@Image3: Material/texture close-up",[73,31333,31334],{},"@Video1: Camera movement reference (orbiting product shot)",[11,31336,31337],{},[23,31338,11996],{},[136,31340,31343],{"className":31341,"code":31342,"language":2185},[2183],"Commercial showcase of the product in @Image2.\nSide profile references @Image1.\nSurface material and texture reference @Image3.\nCamera movement references @Video1's orbiting rotation.\nStudio lighting, reflective dark surface, premium aesthetic.\n",[28,31344,31342],{"__ignoreMap":141},[11,31346,31347,31349],{},[23,31348,31306],{}," 3 images + 1 video = 4/12 files used",[92,31351,31353],{"id":31352},"recipe-3-multi-character-animation","Recipe 3: Multi-Character Animation",[11,31355,31356,31358],{},[23,31357,31271],{}," Two characters interacting with choreographed action",[11,31360,31361],{},[23,31362,31277],{},[97,31364,31365,31368,31371,31374],{},[73,31366,31367],{},"@Image1, @Image2: Character A (front + side reference)",[73,31369,31370],{},"@Image3, @Image4: Character B (front + side reference)",[73,31372,31373],{},"@Image5: Background/scene reference",[73,31375,31376],{},"@Video1: Action choreography reference",[11,31378,31379],{},[23,31380,11996],{},[136,31382,31385],{"className":31383,"code":31384,"language":2185},[2183],"@Image1 and @Image2 define Character A (spear wielder).\n@Image3 and @Image4 define Character B (dual swords).\nThey fight in @Image5's autumn forest, mimicking @Video1's\ncombat choreography. White dust rises on impact.\nDramatic star-filled night sky.\n",[28,31386,31384],{"__ignoreMap":141},[11,31388,31389,31391],{},[23,31390,31306],{}," 5 images + 1 video = 6/12 files used",[92,31393,31395],{"id":31394},"the-12-file-budget-allocation-strategy","The 12-File Budget: Allocation Strategy",[11,31397,31398],{},"You have 12 slots. Here's how to allocate them for maximum impact:",[2036,31400,31401,31413],{},[2039,31402,31403],{},[2042,31404,31405,31408,31411],{},[2045,31406,31407],{},"Priority",[2045,31409,31410],{},"Allocation",[2045,31412,8272],{},[2052,31414,31415,31427,31440,31452,31465,31477],{},[2042,31416,31417,31421,31424],{},[2057,31418,31419],{},[23,31420,30763],{},[2057,31422,31423],{},"2-3 images per character",[2057,31425,31426],{},"More angles = better consistency",[2042,31428,31429,31434,31437],{},[2057,31430,31431],{},[23,31432,31433],{},"Camera/motion reference",[2057,31435,31436],{},"1 video",[2057,31438,31439],{},"One good reference is enough",[2042,31441,31442,31446,31449],{},[2057,31443,31444],{},[23,31445,30791],{},[2057,31447,31448],{},"1-2 images",[2057,31450,31451],{},"Sets the world",[2042,31453,31454,31459,31462],{},[2057,31455,31456],{},[23,31457,31458],{},"Audio/music",[2057,31460,31461],{},"1 audio or video (for its audio track)",[2057,31463,31464],{},"Sets the mood",[2042,31466,31467,31471,31474],{},[2057,31468,31469],{},[23,31470,25929],{},[2057,31472,31473],{},"1 image (if needed)",[2057,31475,31476],{},"Only if you want non-realistic style",[2042,31478,31479,31484,31487],{},[2057,31480,31481],{},[23,31482,31483],{},"Reserve",[2057,31485,31486],{},"Keep 2-3 slots free",[2057,31488,31489],{},"For iteration and additional detail",[11,31491,31492,31495],{},[23,31493,31494],{},"Pro tip:"," Don't use all 12 slots. Start with 4-6 files and add more only if the output needs more precision. Overloading with references can confuse the model.",[92,31497,31499],{"id":31498},"api-call-example","API Call Example",[11,31501,31502],{},"Here's how a multimodal generation looks through the API:",[136,31504,31506],{"className":338,"code":31505,"language":340,"meta":141,"style":141},"import requests\n\nresponse = requests.post(\n    \"https://api.evolink.ai/v1/videos/generations\",\n    headers={\"Authorization\": \"Bearer YOUR_EVOLINK_API_KEY\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as the main character. \"\n            \"@Image2 as the environment. \"\n            \"Reference @Video1's tracking shot and camera movement. \"\n            \"The character walks through a misty forest at dawn. \"\n            \"Cinematic lighting, shallow depth of field.\"\n        ),\n        \"image_urls\": [\n            \"https://your-cdn.com/character.jpg\",\n            \"https://your-cdn.com/forest.jpg\"\n        ],\n        \"video_urls\": [\n            \"https://your-cdn.com/tracking-shot.mp4\"\n        ],\n        \"duration\": 10,\n        \"quality\": \"1080p\",\n        \"generate_audio\": true\n    }\n)\n\ntask_id = response.json()[\"id\"]\nprint(f\"Generation started: {task_id}\")\n",[28,31507,31508,31514,31518,31526,31533,31551,31559,31569,31575,31580,31585,31590,31595,31600,31604,31610,31617,31622,31626,31632,31637,31641,31651,31661,31668,31672,31676,31680,31692],{"__ignoreMap":141},[145,31509,31510,31512],{"class":147,"line":148},[145,31511,347],{"class":258},[145,31513,328],{"class":262},[145,31515,31516],{"class":147,"line":166},[145,31517,376],{"emptyLinePlaceholder":58},[145,31519,31520,31522,31524],{"class":147,"line":178},[145,31521,6529],{"class":262},[145,31523,266],{"class":258},[145,31525,1432],{"class":262},[145,31527,31528,31531],{"class":147,"line":187},[145,31529,31530],{"class":159},"    \"https://api.evolink.ai/v1/videos/generations\"",[145,31532,452],{"class":262},[145,31534,31535,31537,31539,31541,31544,31546,31549],{"class":147,"line":373},[145,31536,6551],{"class":701},[145,31538,266],{"class":258},[145,31540,685],{"class":262},[145,31542,31543],{"class":159},"\"Authorization\"",[145,31545,437],{"class":262},[145,31547,31548],{"class":159},"\"Bearer YOUR_EVOLINK_API_KEY\"",[145,31550,19590],{"class":262},[145,31552,31553,31555,31557],{"class":147,"line":379},[145,31554,6562],{"class":701},[145,31556,266],{"class":258},[145,31558,1865],{"class":262},[145,31560,31561,31563,31565,31567],{"class":147,"line":385},[145,31562,1303],{"class":159},[145,31564,437],{"class":262},[145,31566,1308],{"class":159},[145,31568,452],{"class":262},[145,31570,31571,31573],{"class":147,"line":409},[145,31572,1319],{"class":159},[145,31574,1322],{"class":262},[145,31576,31577],{"class":147,"line":420},[145,31578,31579],{"class":159},"            \"@Image1 as the main character. \"\n",[145,31581,31582],{"class":147,"line":431},[145,31583,31584],{"class":159},"            \"@Image2 as the environment. \"\n",[145,31586,31587],{"class":147,"line":455},[145,31588,31589],{"class":159},"            \"Reference @Video1's tracking shot and camera movement. \"\n",[145,31591,31592],{"class":147,"line":466},[145,31593,31594],{"class":159},"            \"The character walks through a misty forest at dawn. \"\n",[145,31596,31597],{"class":147,"line":600},[145,31598,31599],{"class":159},"            \"Cinematic lighting, shallow depth of field.\"\n",[145,31601,31602],{"class":147,"line":605},[145,31603,1342],{"class":262},[145,31605,31606,31608],{"class":147,"line":611},[145,31607,2688],{"class":159},[145,31609,2691],{"class":262},[145,31611,31612,31615],{"class":147,"line":617},[145,31613,31614],{"class":159},"            \"https://your-cdn.com/character.jpg\"",[145,31616,452],{"class":262},[145,31618,31619],{"class":147,"line":623},[145,31620,31621],{"class":159},"            \"https://your-cdn.com/forest.jpg\"\n",[145,31623,31624],{"class":147,"line":628},[145,31625,2701],{"class":262},[145,31627,31628,31630],{"class":147,"line":639},[145,31629,12162],{"class":159},[145,31631,2691],{"class":262},[145,31633,31634],{"class":147,"line":654},[145,31635,31636],{"class":159},"            \"https://your-cdn.com/tracking-shot.mp4\"\n",[145,31638,31639],{"class":147,"line":660},[145,31640,2701],{"class":262},[145,31642,31643,31645,31647,31649],{"class":147,"line":671},[145,31644,1347],{"class":159},[145,31646,437],{"class":262},[145,31648,537],{"class":155},[145,31650,452],{"class":262},[145,31652,31653,31655,31657,31659],{"class":147,"line":698},[145,31654,1363],{"class":159},[145,31656,437],{"class":262},[145,31658,3710],{"class":159},[145,31660,452],{"class":262},[145,31662,31663,31665],{"class":147,"line":710},[145,31664,1395],{"class":159},[145,31666,31667],{"class":262},": true\n",[145,31669,31670],{"class":147,"line":716},[145,31671,1407],{"class":262},[145,31673,31674],{"class":147,"line":722},[145,31675,406],{"class":262},[145,31677,31678],{"class":147,"line":728},[145,31679,376],{"emptyLinePlaceholder":58},[145,31681,31682,31684,31686,31688,31690],{"class":147,"line":739},[145,31683,12204],{"class":262},[145,31685,266],{"class":258},[145,31687,12209],{"class":262},[145,31689,1626],{"class":159},[145,31691,764],{"class":262},[145,31693,31694,31696,31698,31700,31703,31705,31707,31709,31711],{"class":147,"line":744},[145,31695,6584],{"class":155},[145,31697,794],{"class":262},[145,31699,440],{"class":258},[145,31701,31702],{"class":159},"\"Generation started: ",[145,31704,685],{"class":155},[145,31706,688],{"class":262},[145,31708,691],{"class":155},[145,31710,449],{"class":159},[145,31712,406],{"class":262},[11,31714,31715],{},"Poll for the result:",[136,31717,31719],{"className":338,"code":31718,"language":340,"meta":141,"style":141},"import time\n\nwhile True:\n    status = requests.get(\n        f\"https://api.evolink.ai/v1/tasks/{task_id}\",\n        headers={\"Authorization\": \"Bearer YOUR_EVOLINK_API_KEY\"}\n    )\n    result = status.json()\n\n    if result[\"status\"] == \"completed\":\n        print(f\"Video ready: {result['results'][0]}\")\n        break\n    elif result[\"status\"] == \"failed\":\n        print(f\"Error: {result.get('error', 'Unknown error')}\")\n        break\n\n    time.sleep(5)\n",[28,31720,31721,31727,31731,31740,31748,31765,31781,31785,31794,31798,31814,31842,31847,31863,31892,31896,31900],{"__ignoreMap":141},[145,31722,31723,31725],{"class":147,"line":148},[145,31724,347],{"class":258},[145,31726,356],{"class":262},[145,31728,31729],{"class":147,"line":166},[145,31730,376],{"emptyLinePlaceholder":58},[145,31732,31733,31736,31738],{"class":147,"line":178},[145,31734,31735],{"class":258},"while",[145,31737,14859],{"class":155},[145,31739,860],{"class":262},[145,31741,31742,31744,31746],{"class":147,"line":187},[145,31743,7236],{"class":262},[145,31745,266],{"class":258},[145,31747,668],{"class":262},[145,31749,31750,31752,31755,31757,31759,31761,31763],{"class":147,"line":373},[145,31751,1437],{"class":258},[145,31753,31754],{"class":159},"\"https://api.evolink.ai/v1/tasks/",[145,31756,685],{"class":155},[145,31758,688],{"class":262},[145,31760,691],{"class":155},[145,31762,449],{"class":159},[145,31764,452],{"class":262},[145,31766,31767,31769,31771,31773,31775,31777,31779],{"class":147,"line":379},[145,31768,1455],{"class":701},[145,31770,266],{"class":258},[145,31772,685],{"class":262},[145,31774,31543],{"class":159},[145,31776,437],{"class":262},[145,31778,31548],{"class":159},[145,31780,469],{"class":262},[145,31782,31783],{"class":147,"line":385},[145,31784,1483],{"class":262},[145,31786,31787,31789,31791],{"class":147,"line":409},[145,31788,1618],{"class":262},[145,31790,266],{"class":258},[145,31792,31793],{"class":262}," status.json()\n",[145,31795,31796],{"class":147,"line":420},[145,31797,376],{"emptyLinePlaceholder":58},[145,31799,31800,31802,31804,31806,31808,31810,31812],{"class":147,"line":431},[145,31801,2506],{"class":258},[145,31803,1648],{"class":262},[145,31805,761],{"class":159},[145,31807,14931],{"class":262},[145,31809,854],{"class":258},[145,31811,857],{"class":159},[145,31813,860],{"class":262},[145,31815,31816,31818,31820,31822,31824,31826,31828,31830,31832,31834,31836,31838,31840],{"class":147,"line":455},[145,31817,791],{"class":155},[145,31819,794],{"class":262},[145,31821,440],{"class":258},[145,31823,11808],{"class":159},[145,31825,685],{"class":155},[145,31827,11813],{"class":262},[145,31829,11816],{"class":159},[145,31831,1562],{"class":262},[145,31833,783],{"class":155},[145,31835,1535],{"class":262},[145,31837,691],{"class":155},[145,31839,449],{"class":159},[145,31841,406],{"class":262},[145,31843,31844],{"class":147,"line":466},[145,31845,31846],{"class":258},"        break\n",[145,31848,31849,31851,31853,31855,31857,31859,31861],{"class":147,"line":600},[145,31850,7522],{"class":258},[145,31852,1648],{"class":262},[145,31854,761],{"class":159},[145,31856,14931],{"class":262},[145,31858,854],{"class":258},[145,31860,882],{"class":159},[145,31862,860],{"class":262},[145,31864,31865,31867,31869,31871,31874,31876,31878,31880,31882,31884,31886,31888,31890],{"class":147,"line":605},[145,31866,791],{"class":155},[145,31868,794],{"class":262},[145,31870,440],{"class":258},[145,31872,31873],{"class":159},"\"Error: ",[145,31875,685],{"class":155},[145,31877,11862],{"class":262},[145,31879,11865],{"class":159},[145,31881,400],{"class":262},[145,31883,943],{"class":159},[145,31885,108],{"class":262},[145,31887,691],{"class":155},[145,31889,449],{"class":159},[145,31891,406],{"class":262},[145,31893,31894],{"class":147,"line":611},[145,31895,31846],{"class":258},[145,31897,31898],{"class":147,"line":617},[145,31899,376],{"emptyLinePlaceholder":58},[145,31901,31902,31904,31906],{"class":147,"line":623},[145,31903,19902],{"class":262},[145,31905,1352],{"class":155},[145,31907,406],{"class":262},[11,31909,31910,31911,31914],{},"Run this code with your ",[37,31912,11348],{"href":211,"rel":31913},[41],". Sign up is free — no credit card required.",[45,31916],{},[48,31918,31920],{"id":31919},"common-mistakes-how-to-fix-them","Common Mistakes & How to Fix Them",[92,31922,31924],{"id":31923},"not-specifying-the-tags-purpose","Not specifying the @tag's purpose",[11,31926,31927,14284,31929],{},[23,31928,13202],{},[28,31930,31931],{},"@Image1 @Video1 generate a video of a dancer",[11,31933,31934,14284,31936],{},[23,31935,13218],{},[28,31937,31938],{},"@Image1 as the dancer's appearance reference. @Video1 for dance choreography and camera movement. Generate the dancer performing on a stage.",[11,31940,31941],{},"The model needs explicit role assignments. Without them, it guesses — and guesses wrong.",[92,31943,31945],{"id":31944},"low-resolution-input-files","Low-resolution input files",[11,31947,31948],{},"If your @Image1 is 480p, your output will look soft. Always use:",[97,31950,31951,31954,31957],{},[73,31952,31953],{},"Images: 2K or higher resolution",[73,31955,31956],{},"Videos: 720p, clean footage without compression artifacts",[73,31958,31959],{},"Audio: 128kbps+ MP3 or lossless WAV",[92,31961,31963],{"id":31962},"trying-to-use-all-12-file-slots","Trying to use all 12 file slots",[11,31965,31966],{},"More references doesn't mean better output. Start with 3-5 files and add only if needed. Too many conflicting references confuse the model.",[92,31968,31970],{"id":31969},"uploading-realistic-human-face-photos","Uploading realistic human face photos",[11,31972,31973,31976],{},[23,31974,31975],{},"Platform limitation:"," Seedance 2.0 currently does not support uploading images or videos containing realistic human faces. The system will automatically block these uploads. Use illustrated, anime-style, or stylized character references instead.",[92,31978,31980],{"id":31979},"mixing-up-asset-numbering","Mixing up asset numbering",[11,31982,31983],{},"When you upload 3 images and 2 videos, they are numbered independently:",[97,31985,31986,31989],{},[73,31987,31988],{},"Images: @Image1, @Image2, @Image3",[73,31990,31991],{},"Videos: @Video1, @Video2",[11,31993,31994,31995,280,31998,32001],{},"Don't write ",[28,31996,31997],{},"@File3",[28,31999,32000],{},"@Asset5"," — use the type-specific numbering.",[92,32003,32005],{"id":32004},"setting-wrong-duration-for-video-extensions","Setting wrong duration for video extensions",[11,32007,32008],{},"When extending an existing video by 5 seconds, set the generation duration to 5s (the new portion), not the total length. The extension is appended to the original.",[45,32010],{},[48,32012,13304],{"id":13303},[92,32014,32016],{"id":32015},"how-many-files-can-i-upload-in-a-single-generation","How many files can I upload in a single generation?",[11,32018,32019],{},"Up to 12 files total: maximum 9 images, 3 videos, and 3 audio clips. Videos must have a combined duration between 2 and 15 seconds. Audio clips can total up to 15 seconds.",[92,32021,32023],{"id":32022},"can-i-use-tags-through-the-api","Can I use @tags through the API?",[11,32025,32026,32027,400,32029,13968,32031,32033],{},"Yes. When calling the API, pass ",[28,32028,2896],{},[28,32030,3567],{},[28,32032,3584],{}," arrays in the JSON request body. Each array contains direct URLs to your reference files. The @tag numbering (@Image1, @Image2...) corresponds to the order of URLs in each array. The prompt text uses the same @tag syntax as the UI.",[92,32035,32037],{"id":32036},"what-happens-if-i-dont-assign-a-role-to-an-tag","What happens if I don't assign a role to an @tag?",[11,32039,32040,32041,32043,32044,32046],{},"The model will attempt to infer the purpose based on the file content and your prompt context. However, this is unreliable. Always explicitly state each tag's role — e.g., ",[28,32042,30505],{}," rather than just mentioning ",[28,32045,2908],{}," without context.",[92,32048,32050],{"id":32049},"can-i-reference-audio-from-an-uploaded-video-file","Can I reference audio from an uploaded video file?",[11,32052,32053,32054,32057],{},"Yes. Use ",[28,32055,32056],{},"background music references @Video1's audio"," in your prompt. The model extracts the audio track from the video and uses it as a sound reference without needing a separate audio file.",[92,32059,32061],{"id":32060},"what-image-and-video-formats-are-supported","What image and video formats are supported?",[11,32063,32064],{},"Images: JPEG, PNG, WebP, BMP, TIFF, GIF (max 30 MB each). Videos: MP4, MOV (max 50 MB each, 480p–720p resolution). Audio: MP3, WAV (max 15 MB each).",[45,32066],{},[48,32068,32070],{"id":32069},"start-building-with-tags","Start Building with @Tags",[11,32072,32073],{},"The @tag reference system is what makes Seedance 2.0 the most controllable AI video generator available. Instead of describing what you want and hoping for the best, you show the model exactly what you mean — then direct it like a film crew.",[11,32075,32076],{},"The key principles:",[70,32078,32079,32085,32091],{},[73,32080,32081,32084],{},[23,32082,32083],{},"Every @tag needs a role."," Don't just upload files — tell the model what each one does.",[73,32086,32087,32090],{},[23,32088,32089],{},"Start small, add precision."," Begin with 3-4 references. Add more only if the output needs it.",[73,32092,32093,32096],{},[23,32094,32095],{},"Be specific about what to copy."," \"Reference @Video1's camera movement\" beats \"reference @Video1.\"",[11,32098,32099,32100,32104],{},"Ready to direct your own AI videos? ",[37,32101,32103],{"href":211,"rel":32102},[41],"Start free on EvoLink"," — one API key for Seedance 2.0 and all major AI video models, with smart routing that saves you 20-70%.",[11,32106,32107],{},[23,32108,32109],{},"Continue learning:",[97,32111,32112],{},[73,32113,32114,32116],{},[37,32115,2211],{"href":1766}," — Master prompt writing fundamentals",[45,32118],{},[11,32120,32121],{},[2619,32122,13439],{},[11217,32124,32125],{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":141,"searchDepth":166,"depth":166,"links":32127},[32128,32129,32134,32140,32146,32152,32159,32167,32174],{"id":30436,"depth":166,"text":30437},{"id":30530,"depth":166,"text":30531,"children":32130},[32131,32132,32133],{"id":30534,"depth":178,"text":30535},{"id":30583,"depth":178,"text":30584},{"id":30676,"depth":178,"text":30677},{"id":30705,"depth":166,"text":30706,"children":32135},[32136,32137,32138,32139],{"id":30712,"depth":178,"text":30713},{"id":30831,"depth":178,"text":30832},{"id":30866,"depth":178,"text":30867},{"id":30890,"depth":178,"text":30891},{"id":30908,"depth":166,"text":30909,"children":32141},[32142,32143,32144,32145],{"id":30919,"depth":178,"text":30920},{"id":31012,"depth":178,"text":31013},{"id":31036,"depth":178,"text":31037},{"id":31098,"depth":178,"text":31099},{"id":31113,"depth":166,"text":31114,"children":32147},[32148,32149,32150,32151],{"id":31120,"depth":178,"text":31121},{"id":31198,"depth":178,"text":31199},{"id":31223,"depth":178,"text":31224},{"id":31239,"depth":178,"text":31240},{"id":31258,"depth":166,"text":31259,"children":32153},[32154,32155,32156,32157,32158],{"id":31265,"depth":178,"text":31266},{"id":31310,"depth":178,"text":31311},{"id":31352,"depth":178,"text":31353},{"id":31394,"depth":178,"text":31395},{"id":31498,"depth":178,"text":31499},{"id":31919,"depth":166,"text":31920,"children":32160},[32161,32162,32163,32164,32165,32166],{"id":31923,"depth":178,"text":31924},{"id":31944,"depth":178,"text":31945},{"id":31962,"depth":178,"text":31963},{"id":31969,"depth":178,"text":31970},{"id":31979,"depth":178,"text":31980},{"id":32004,"depth":178,"text":32005},{"id":13303,"depth":166,"text":13304,"children":32168},[32169,32170,32171,32172,32173],{"id":32015,"depth":178,"text":32016},{"id":32022,"depth":178,"text":32023},{"id":32036,"depth":178,"text":32037},{"id":32049,"depth":178,"text":32050},{"id":32060,"depth":178,"text":32061},{"id":32069,"depth":166,"text":32070},"Master Seedance 2.0's @tag reference system. Learn image, video, and audio tagging syntax with real examples and prompt templates. Start building free.",{"date":13494,"image":32177,"seoTitle":32178},"/screenshot-20260220-193326.png","Seedance 2.0 @Tags Guide: Multimodal Reference System Explained","/en/blog/seedance-2-multimodal-tags-guide",{"title":13428,"description":32175},"en/blog/seedance-2-multimodal-tags-guide","yTHIAb463EjPOkXlIDWleo4YMf1TPXEDEZPMyQe2Kv0",{"id":32184,"title":13418,"body":32185,"description":38612,"extension":11279,"meta":38613,"navigation":58,"path":38616,"seo":38617,"stem":38618,"__hash__":38619},"content/en/blog/seedance-2-prompt-guide.md",{"type":8,"value":32186,"toc":38563},[32187,32193,32201,32216,32228,32230,32234,32237,32242,32322,32326,32335,32342,32348,32352,32358,32361,32385,32388,32394,32399,32402,32407,32413,32418,32424,32428,32431,32455,32464,32470,32474,32481,32487,32493,32499,32502,32506,32509,32514,32993,32996,33002,33016,33018,33022,33027,33031,33079,33085,33091,33095,33180,33184,33258,33262,33319,33323,33326,33423,33430,33432,33436,33440,33444,33450,33454,33687,33691,33696,33700,33936,33940,33945,33950,34181,34185,34189,34200,34204,34433,34437,34445,34449,34723,34727,34735,34739,34980,34984,34993,34997,35341,35345,35349,35357,35362,35660,35664,35669,35674,35941,35945,35950,35954,36210,36214,36219,36224,36466,36470,36474,36479,36652,36656,36661,36834,36842,36844,36848,37040,37046,37048,37052,37056,37059,37347,37350,37354,37357,37398,37402,37405,37427,37433,37437,37440,37459,37469,37473,37476,37585,37588,37592,37595,37767,37770,37790,37792,37796,37800,37803,37930,37934,37937,38077,38081,38084,38240,38248,38250,38252,38256,38259,38263,38266,38297,38301,38315,38319,38322,38325,38336,38342,38346,38349,38360,38364,38378,38382,38385,38410,38414,38431,38435,38442,38446,38478,38482,38485,38502,38504,38508,38511,38514,38517,38528,38537,38553,38555,38560],[11,32188,32189,32190,493],{},"Seedance 2.0 accepts text, images, video clips, and audio files — all in a single prompt. The key to getting cinematic results lies in how you structure that prompt and reference your uploaded media with ",[28,32191,32192],{},"@Tags",[11,32194,32195,32196,32200],{},"Built on ByteDance's ",[37,32197,32199],{"href":17396,"rel":32198},[41],"Seed video foundation model",", Seedance 2.0 is the most capable multimodal video generation model available via API.",[11,32202,32203,32204,32207,32208,32211,32212,32215],{},"This guide breaks down the ",[23,32205,32206],{},"Seedance 2.0 prompt formula",", explains the ",[28,32209,32210],{},"@Tag"," reference system, and gives you ",[23,32213,32214],{},"15+ copy-paste prompt templates"," with working Python API code.",[18,32217,32218],{},[11,32219,32220,14284,32223,32227],{},[23,32221,32222],{},"Follow along with code examples:",[37,32224,32226],{"href":211,"rel":32225},[41],"Get your free API key on EvoLink"," to run every snippet below.",[45,32229],{},[48,32231,32233],{"id":32232},"the-seedance-20-prompt-formula","The Seedance 2.0 Prompt Formula",[11,32235,32236],{},"Every effective Seedance prompt follows a five-part structure:",[11,32238,32239],{},[23,32240,32241],{},"Subject + Action + Camera + Style + Constraints",[2036,32243,32244,32256],{},[2039,32245,32246],{},[2042,32247,32248,32251,32254],{},[2045,32249,32250],{},"Component",[2045,32252,32253],{},"What It Controls",[2045,32255,11473],{},[2052,32257,32258,32271,32283,32296,32309],{},[2042,32259,32260,32265,32268],{},[2057,32261,32262],{},[23,32263,32264],{},"Subject",[2057,32266,32267],{},"Who or what is on screen",[2057,32269,32270],{},"\"An astronaut in a white spacesuit on Mars\"",[2042,32272,32273,32277,32280],{},[2057,32274,32275],{},[23,32276,4823],{},[2057,32278,32279],{},"Movement and events",[2057,32281,32282],{},"\"Steps forward off the crater edge\"",[2042,32284,32285,32290,32293],{},[2057,32286,32287],{},[23,32288,32289],{},"Camera",[2057,32291,32292],{},"Angle, movement, lens",[2057,32294,32295],{},"\"Extreme wide shot, slow push-in to close-up\"",[2042,32297,32298,32303,32306],{},[2057,32299,32300],{},[23,32301,32302],{},"Style",[2057,32304,32305],{},"Visual aesthetic",[2057,32307,32308],{},"\"Sci-fi epic, IMAX 70mm, desaturated teal-orange palette\"",[2042,32310,32311,32316,32319],{},[2057,32312,32313],{},[23,32314,32315],{},"Constraints",[2057,32317,32318],{},"Duration, resolution, mood",[2057,32320,32321],{},"\"10 seconds, realistic dust physics, consistent spacesuit design\"",[92,32323,32325],{"id":32324},"why-this-formula-works","Why This Formula Works",[11,32327,32328,32329,32334],{},"Seedance 2.0 uses a dual-branch ",[37,32330,32333],{"href":32331,"rel":32332},"https://arxiv.org/abs/2212.09748",[41],"Diffusion Transformer"," architecture. One branch processes spatial information (what things look like), while the other handles temporal information (how things move over time). A well-structured prompt feeds both branches clearly.",[11,32336,32337,32338,32341],{},"Vague prompts like ",[2619,32339,32340],{},"\"a cool video of a car\""," force the model to guess spatial and temporal details. Structured prompts eliminate that guesswork.",[11,32343,32344,32345,493],{},"For the complete API parameter reference, see the ",[37,32346,32347],{"href":14385},"video generation docs",[92,32349,32351],{"id":32350},"advanced-the-shot-script-format","Advanced: The Shot-Script Format",[11,32353,32354,32355,493],{},"The five-part formula is a great starting point. But the highest-quality Seedance 2.0 outputs — the ones that go viral on social media — use a more powerful format: ",[23,32356,32357],{},"the shot script",[11,32359,32360],{},"A shot script adds three layers on top of the basic formula:",[70,32362,32363,32373,32379],{},[73,32364,32365,32368,32369,32372],{},[23,32366,32367],{},"Timecodes"," — Break your video into 3–5 second segments with explicit ",[28,32370,32371],{},"[00:00-00:05]"," markers",[73,32374,32375,32378],{},[23,32376,32377],{},"Shot language"," — Name each shot and its function: \"Shot 1: The Scale (Extreme Wide Shot)\"",[73,32380,32381,32384],{},[23,32382,32383],{},"Style anchors + physics details"," — Anchor to a specific director/film style, and describe physical reactions instead of abstract concepts",[11,32386,32387],{},"Here's the structure:",[136,32389,32392],{"className":32390,"code":32391,"language":2185},[2183],"【Style】Specific style anchor (director name / film style / art movement)\n【Duration】Total length\n\n[00:00-00:04] Shot 1: Shot Name (Camera Type).\nScene description with physical details.\nCharacter action with specific body language.\nAudio cue.\n\n[00:04-00:07] Shot 2: Shot Name (Camera Type).\n...\n\n[00:07-00:10] Shot 3: Shot Name (Camera Type).\n...\n\nConsistency constraints. Physics requirements. Palette notes.\n",[28,32393,32391],{"__ignoreMap":141},[32395,32396,32398],"h4",{"id":32397},"basic-formula-vs-shot-script-side-by-side","Basic Formula vs. Shot Script: Side-by-Side",[11,32400,32401],{},"Let's compare the same concept — an astronaut on Mars — written both ways:",[11,32403,32404],{},[23,32405,32406],{},"Basic formula (good for beginners):",[136,32408,32411],{"className":32409,"code":32410,"language":2185},[2183],"An astronaut in a white spacesuit stands at the edge of a Mars crater.\nRed dust blows across the visor. Camera slowly pushes in to reveal\nEarth reflected in the helmet. Sci-fi epic style, desaturated\nteal-orange palette. 10 seconds.\n",[28,32412,32410],{"__ignoreMap":141},[11,32414,32415],{},[23,32416,32417],{},"Shot script (used by top creators):",[136,32419,32422],{"className":32420,"code":32421,"language":2185},[2183],"【Style】Denis Villeneuve Sci-Fi Epic, IMAX 70mm, desaturated teal-orange palette.\n【Duration】10 seconds\n\n[00:00-00:04] Shot 1: The Scale (Extreme Wide Shot).\nA lone astronaut in a white spacesuit stands at the edge of an enormous\ncrater on Mars. Red dust blows across the visor in gusts. The crater\nstretches to the horizon — the scale of nature dwarfs the human figure\ncompletely. Deep rumbling bass audio.\n\n[00:04-00:07] Shot 2: The Discovery (Push-in to Close-up).\nCamera slowly pushes from the wide shot into a tight close-up of the\nastronaut's helmet visor. In the curved reflection, we see Earth — tiny,\nblue, impossibly far away. The astronaut's breathing is audible.\nAnamorphic lens flare streaks across the frame.\n\n[00:07-00:10] Shot 3: The Decision (Low Angle, Static).\nFrom below, the astronaut steps forward off the crater edge — a leap of\nfaith into the unknown. Dust particles float in slow motion around the\nboots. Camera holds steady as the figure descends. Cut to black.\n\nConsistent spacesuit design. Realistic Mars dust physics. Epic\norchestral audio swell on final shot.\n",[28,32423,32421],{"__ignoreMap":141},[32395,32425,32427],{"id":32426},"why-the-shot-script-produces-better-results","Why the Shot Script Produces Better Results",[11,32429,32430],{},"The shot script outperforms the basic formula for three reasons:",[70,32432,32433,32443,32449],{},[73,32434,32435,32438,32439,32442],{},[23,32436,32437],{},"Temporal precision."," Timecodes tell Seedance exactly ",[2619,32440,32441],{},"when"," each action happens. Without them, the model distributes actions unpredictably across the duration.",[73,32444,32445,32448],{},[23,32446,32447],{},"Narrative arc."," Named shots force you to build a story: setup → discovery → payoff. The model generates more compelling motion when it understands the emotional progression.",[73,32450,32451,32454],{},[23,32452,32453],{},"Physical grounding."," Details like \"dust particles float in slow motion around the boots\" give the physics engine concrete constraints instead of vague aesthetics.",[11,32456,32457,32458,32463],{},"Top creators on the ",[37,32459,32462],{"href":32460,"rel":32461},"https://github.com/EvoLinkAI/awesome-seedance-2-guide",[41],"awesome-seedance"," community consistently use shot-script format for their best work — from racing scenes to art-style transformations. The pattern is clear: structured timecodes + specific style anchors = cinematic output.",[11,32465,32466,32467,493],{},"We break down these camera techniques step-by-step in our ",[37,32468,32469],{"href":3856},"camera movement replication guide",[92,32471,32473],{"id":32472},"text-only-vs-multimodal-prompts","Text-Only vs. Multimodal Prompts",[11,32475,32476,32477,32480],{},"A ",[23,32478,32479],{},"text-only prompt"," relies entirely on language to describe the scene:",[136,32482,32485],{"className":32483,"code":32484,"language":2185},[2183],"A red sports car drifts around a mountain curve, tires smoking,\ndrone shot tracking from above, cinematic color grading, 10 seconds\n",[28,32486,32484],{"__ignoreMap":141},[11,32488,32476,32489,32492],{},[23,32490,32491],{},"multimodal prompt"," combines text with uploaded references:",[136,32494,32497],{"className":32495,"code":32496,"language":2185},[2183],"@Image1 as first frame, car drifts around the curve following\n@Video1 camera path, @Audio1 as engine sound, cinematic grading, 10 seconds\n",[28,32498,32496],{"__ignoreMap":141},[11,32500,32501],{},"The multimodal version gives Seedance 2.0 exact visual anchors instead of relying on the model's interpretation of \"red sports car.\"",[92,32503,32505],{"id":32504},"your-first-seedance-20-prompt-api-example","Your First Seedance 2.0 Prompt — API Example",[11,32507,32508],{},"Here's a complete text-to-video generation call using the shot-script format:",[56,32510,60,32511],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,32512],{"src":32513,"type":65},"https://cdn.evolink.ai/seedance2api/%E8%B5%9B%E8%BD%A6%E7%94%B5%E5%BD%B1%E6%84%9F.mp4",[136,32515,32517],{"className":338,"code":32516,"language":340,"meta":141,"style":141},"import requests\nimport os\nimport time\n\nAPI_KEY = os.environ.get(\"SEEDANCE_API_KEY\")\nBASE_URL = \"https://api.evolink.ai/v1\"\n\n# Submit generation task\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"【Style】Hollywood Professional Racing Movie, Cinematic Night, Rain.\\n\"\n            \"【Duration】10 seconds\\n\\n\"\n            \"[00:00-00:03] Shot 1: The Veteran (Interior/Close-up).\\n\"\n            \"Rain hammers the windshield of a high-tech race car on a night track. \"\n            \"Inside the cockpit, the veteran driver in a black helmet looks sideways \"\n            \"at his rival. Dashboard instruments glow green on his visor.\\n\"\n            \"Dialogue Cue: He gives a subtle nod and mouths 'Let's go.'\\n\\n\"\n            \"[00:03-00:06] Shot 2: The Challenger (Interior/Close-up).\\n\"\n            \"Cut to the rival car. A younger driver grips the steering wheel with \"\n            \"white knuckles. Raindrops streak across the side window. Eyes wide with \"\n            \"adrenaline through the visor slit.\\n\"\n            \"Dialogue Cue: He whispers 'Focus' to himself.\\n\\n\"\n            \"[00:06-00:10] Shot 3: The Green Light (Wide Action Shot).\\n\"\n            \"Starting lights turn GREEN. Both cars launch forward in sync on gleaming \"\n            \"wet asphalt. Massive water rooster tails spray behind them. Rain hits \"\n            \"the camera lens. Motion blur turns stadium lights into long golden streaks.\\n\\n\"\n            \"Consistent car designs. Realistic rain physics, water reflections. \"\n            \"Tension-building audio.\"\n        ),\n        \"duration\": 10,\n        \"quality\": \"1080p\"\n    }\n)\ntask = response.json()\ntask_id = task[\"id\"]\n\n# Poll for result\nwhile True:\n    status = requests.get(\n        f\"{BASE_URL}/tasks/{task_id}\",\n        headers={\"Authorization\": f\"Bearer {API_KEY}\"}\n    ).json()\n    if status[\"status\"] == \"completed\":\n        print(f\"Video ready: {status['results'][0]}\")\n        break\n    elif status[\"status\"] == \"failed\":\n        print(f\"Error: {status['error']}\")\n        break\n    time.sleep(5)\n",[28,32518,32519,32525,32531,32537,32541,32555,32563,32567,32572,32580,32592,32614,32622,32632,32638,32647,32656,32665,32670,32675,32684,32693,32702,32707,32712,32721,32730,32739,32744,32749,32758,32763,32768,32772,32782,32791,32795,32799,32807,32819,32823,32828,32836,32844,32864,32886,32891,32908,32937,32941,32957,32981,32985],{"__ignoreMap":141},[145,32520,32521,32523],{"class":147,"line":148},[145,32522,347],{"class":258},[145,32524,328],{"class":262},[145,32526,32527,32529],{"class":147,"line":166},[145,32528,347],{"class":258},[145,32530,363],{"class":262},[145,32532,32533,32535],{"class":147,"line":178},[145,32534,347],{"class":258},[145,32536,356],{"class":262},[145,32538,32539],{"class":147,"line":187},[145,32540,376],{"emptyLinePlaceholder":58},[145,32542,32543,32545,32547,32550,32553],{"class":147,"line":373},[145,32544,388],{"class":155},[145,32546,391],{"class":258},[145,32548,32549],{"class":262}," os.environ.get(",[145,32551,32552],{"class":159},"\"SEEDANCE_API_KEY\"",[145,32554,406],{"class":262},[145,32556,32557,32559,32561],{"class":147,"line":379},[145,32558,412],{"class":155},[145,32560,391],{"class":258},[145,32562,417],{"class":159},[145,32564,32565],{"class":147,"line":385},[145,32566,376],{"emptyLinePlaceholder":58},[145,32568,32569],{"class":147,"line":409},[145,32570,32571],{"class":174},"# Submit generation task\n",[145,32573,32574,32576,32578],{"class":147,"line":420},[145,32575,6529],{"class":262},[145,32577,266],{"class":258},[145,32579,1432],{"class":262},[145,32581,32582,32584,32586,32588,32590],{"class":147,"line":431},[145,32583,6538],{"class":258},[145,32585,449],{"class":159},[145,32587,679],{"class":155},[145,32589,1444],{"class":159},[145,32591,452],{"class":262},[145,32593,32594,32596,32598,32600,32602,32604,32606,32608,32610,32612],{"class":147,"line":455},[145,32595,6551],{"class":701},[145,32597,266],{"class":258},[145,32599,685],{"class":262},[145,32601,31543],{"class":159},[145,32603,437],{"class":262},[145,32605,440],{"class":258},[145,32607,443],{"class":159},[145,32609,446],{"class":155},[145,32611,449],{"class":159},[145,32613,19590],{"class":262},[145,32615,32616,32618,32620],{"class":147,"line":466},[145,32617,6562],{"class":701},[145,32619,266],{"class":258},[145,32621,1865],{"class":262},[145,32623,32624,32626,32628,32630],{"class":147,"line":600},[145,32625,1303],{"class":159},[145,32627,437],{"class":262},[145,32629,1308],{"class":159},[145,32631,452],{"class":262},[145,32633,32634,32636],{"class":147,"line":605},[145,32635,1319],{"class":159},[145,32637,1322],{"class":262},[145,32639,32640,32643,32645],{"class":147,"line":611},[145,32641,32642],{"class":159},"            \"【Style】Hollywood Professional Racing Movie, Cinematic Night, Rain.",[145,32644,1670],{"class":155},[145,32646,950],{"class":159},[145,32648,32649,32652,32654],{"class":147,"line":617},[145,32650,32651],{"class":159},"            \"【Duration】10 seconds",[145,32653,12126],{"class":155},[145,32655,950],{"class":159},[145,32657,32658,32661,32663],{"class":147,"line":623},[145,32659,32660],{"class":159},"            \"[00:00-00:03] Shot 1: The Veteran (Interior/Close-up).",[145,32662,1670],{"class":155},[145,32664,950],{"class":159},[145,32666,32667],{"class":147,"line":628},[145,32668,32669],{"class":159},"            \"Rain hammers the windshield of a high-tech race car on a night track. \"\n",[145,32671,32672],{"class":147,"line":639},[145,32673,32674],{"class":159},"            \"Inside the cockpit, the veteran driver in a black helmet looks sideways \"\n",[145,32676,32677,32680,32682],{"class":147,"line":654},[145,32678,32679],{"class":159},"            \"at his rival. Dashboard instruments glow green on his visor.",[145,32681,1670],{"class":155},[145,32683,950],{"class":159},[145,32685,32686,32689,32691],{"class":147,"line":660},[145,32687,32688],{"class":159},"            \"Dialogue Cue: He gives a subtle nod and mouths 'Let's go.'",[145,32690,12126],{"class":155},[145,32692,950],{"class":159},[145,32694,32695,32698,32700],{"class":147,"line":671},[145,32696,32697],{"class":159},"            \"[00:03-00:06] Shot 2: The Challenger (Interior/Close-up).",[145,32699,1670],{"class":155},[145,32701,950],{"class":159},[145,32703,32704],{"class":147,"line":698},[145,32705,32706],{"class":159},"            \"Cut to the rival car. A younger driver grips the steering wheel with \"\n",[145,32708,32709],{"class":147,"line":710},[145,32710,32711],{"class":159},"            \"white knuckles. Raindrops streak across the side window. Eyes wide with \"\n",[145,32713,32714,32717,32719],{"class":147,"line":716},[145,32715,32716],{"class":159},"            \"adrenaline through the visor slit.",[145,32718,1670],{"class":155},[145,32720,950],{"class":159},[145,32722,32723,32726,32728],{"class":147,"line":722},[145,32724,32725],{"class":159},"            \"Dialogue Cue: He whispers 'Focus' to himself.",[145,32727,12126],{"class":155},[145,32729,950],{"class":159},[145,32731,32732,32735,32737],{"class":147,"line":728},[145,32733,32734],{"class":159},"            \"[00:06-00:10] Shot 3: The Green Light (Wide Action Shot).",[145,32736,1670],{"class":155},[145,32738,950],{"class":159},[145,32740,32741],{"class":147,"line":739},[145,32742,32743],{"class":159},"            \"Starting lights turn GREEN. Both cars launch forward in sync on gleaming \"\n",[145,32745,32746],{"class":147,"line":744},[145,32747,32748],{"class":159},"            \"wet asphalt. Massive water rooster tails spray behind them. Rain hits \"\n",[145,32750,32751,32754,32756],{"class":147,"line":750},[145,32752,32753],{"class":159},"            \"the camera lens. Motion blur turns stadium lights into long golden streaks.",[145,32755,12126],{"class":155},[145,32757,950],{"class":159},[145,32759,32760],{"class":147,"line":767},[145,32761,32762],{"class":159},"            \"Consistent car designs. Realistic rain physics, water reflections. \"\n",[145,32764,32765],{"class":147,"line":788},[145,32766,32767],{"class":159},"            \"Tension-building audio.\"\n",[145,32769,32770],{"class":147,"line":834},[145,32771,1342],{"class":262},[145,32773,32774,32776,32778,32780],{"class":147,"line":839},[145,32775,1347],{"class":159},[145,32777,437],{"class":262},[145,32779,537],{"class":155},[145,32781,452],{"class":262},[145,32783,32784,32786,32788],{"class":147,"line":845},[145,32785,1363],{"class":159},[145,32787,437],{"class":262},[145,32789,32790],{"class":159},"\"1080p\"\n",[145,32792,32793],{"class":147,"line":863},[145,32794,1407],{"class":262},[145,32796,32797],{"class":147,"line":872},[145,32798,406],{"class":262},[145,32800,32801,32803,32805],{"class":147,"line":887},[145,32802,6575],{"class":262},[145,32804,266],{"class":258},[145,32806,736],{"class":262},[145,32808,32809,32811,32813,32815,32817],{"class":147,"line":903},[145,32810,12204],{"class":262},[145,32812,266],{"class":258},[145,32814,758],{"class":262},[145,32816,1626],{"class":159},[145,32818,764],{"class":262},[145,32820,32821],{"class":147,"line":915},[145,32822,376],{"emptyLinePlaceholder":58},[145,32824,32825],{"class":147,"line":953},[145,32826,32827],{"class":174},"# Poll for result\n",[145,32829,32830,32832,32834],{"class":147,"line":959},[145,32831,31735],{"class":258},[145,32833,14859],{"class":155},[145,32835,860],{"class":262},[145,32837,32838,32840,32842],{"class":147,"line":964},[145,32839,7236],{"class":262},[145,32841,266],{"class":258},[145,32843,668],{"class":262},[145,32845,32846,32848,32850,32852,32854,32856,32858,32860,32862],{"class":147,"line":970},[145,32847,1437],{"class":258},[145,32849,449],{"class":159},[145,32851,679],{"class":155},[145,32853,682],{"class":159},[145,32855,685],{"class":155},[145,32857,688],{"class":262},[145,32859,691],{"class":155},[145,32861,449],{"class":159},[145,32863,452],{"class":262},[145,32865,32866,32868,32870,32872,32874,32876,32878,32880,32882,32884],{"class":147,"line":976},[145,32867,1455],{"class":701},[145,32869,266],{"class":258},[145,32871,685],{"class":262},[145,32873,31543],{"class":159},[145,32875,437],{"class":262},[145,32877,440],{"class":258},[145,32879,443],{"class":159},[145,32881,446],{"class":155},[145,32883,449],{"class":159},[145,32885,469],{"class":262},[145,32887,32888],{"class":147,"line":988},[145,32889,32890],{"class":262},"    ).json()\n",[145,32892,32893,32895,32898,32900,32902,32904,32906],{"class":147,"line":993},[145,32894,2506],{"class":258},[145,32896,32897],{"class":262}," status[",[145,32899,761],{"class":159},[145,32901,14931],{"class":262},[145,32903,854],{"class":258},[145,32905,857],{"class":159},[145,32907,860],{"class":262},[145,32909,32910,32912,32914,32916,32918,32920,32923,32925,32927,32929,32931,32933,32935],{"class":147,"line":5531},[145,32911,791],{"class":155},[145,32913,794],{"class":262},[145,32915,440],{"class":258},[145,32917,11808],{"class":159},[145,32919,685],{"class":155},[145,32921,32922],{"class":262},"status[",[145,32924,11816],{"class":159},[145,32926,1562],{"class":262},[145,32928,783],{"class":155},[145,32930,1535],{"class":262},[145,32932,691],{"class":155},[145,32934,449],{"class":159},[145,32936,406],{"class":262},[145,32938,32939],{"class":147,"line":5540},[145,32940,31846],{"class":258},[145,32942,32943,32945,32947,32949,32951,32953,32955],{"class":147,"line":5546},[145,32944,7522],{"class":258},[145,32946,32897],{"class":262},[145,32948,761],{"class":159},[145,32950,14931],{"class":262},[145,32952,854],{"class":258},[145,32954,882],{"class":159},[145,32956,860],{"class":262},[145,32958,32959,32961,32963,32965,32967,32969,32971,32973,32975,32977,32979],{"class":147,"line":5574},[145,32960,791],{"class":155},[145,32962,794],{"class":262},[145,32964,440],{"class":258},[145,32966,31873],{"class":159},[145,32968,685],{"class":155},[145,32970,32922],{"class":262},[145,32972,11865],{"class":159},[145,32974,1535],{"class":262},[145,32976,691],{"class":155},[145,32978,449],{"class":159},[145,32980,406],{"class":262},[145,32982,32983],{"class":147,"line":5605},[145,32984,31846],{"class":258},[145,32986,32987,32989,32991],{"class":147,"line":5625},[145,32988,19902],{"class":262},[145,32990,1352],{"class":155},[145,32992,406],{"class":262},[11,32994,32995],{},"This produces a 10-second, 1080p video with native audio output. The shot script gives Seedance clear timecodes, camera directions, and physical details — resulting in a cinematic three-act racing sequence from a single text prompt.",[11,32997,32998,32999,33001],{},"New to the API? Start with the ",[37,33000,17549],{"href":17548}," for setup and authentication.",[18,33003,33004],{},[11,33005,33006,33008,33009,400,33011,400,33013,33015],{},[23,33007,30563],{}," All following code examples use the same setup. Copy the ",[28,33010,347],{},[28,33012,388],{},[28,33014,412],{},", and polling logic from the example above. We show only the API call with the unique prompt and parameters.",[45,33017],{},[48,33019,33021],{"id":33020},"the-tag-reference-system-explained","The @Tag Reference System Explained",[11,33023,2176,33024,33026],{},[28,33025,32210],{}," system is what makes Seedance 2.0 prompts truly multimodal. When you upload files, each one gets an automatic tag based on its type and upload order.",[92,33028,33030],{"id":33029},"syntax-rules","Syntax Rules",[97,33032,33033,33046,33059,33073],{},[73,33034,33035,14284,33038,400,33040,33042,33043,33045],{},[23,33036,33037],{},"Images:",[28,33039,2908],{},[28,33041,2918],{},", ... ",[28,33044,2954],{}," (up to 9 images)",[73,33047,33048,14284,33051,400,33053,400,33055,33058],{},[23,33049,33050],{},"Videos:",[28,33052,11421],{},[28,33054,13320],{},[28,33056,33057],{},"@Video3"," (up to 3 clips)",[73,33060,33061,14284,33064,400,33066,400,33069,33072],{},[23,33062,33063],{},"Audio:",[28,33065,16533],{},[28,33067,33068],{},"@Audio2",[28,33070,33071],{},"@Audio3"," (up to 3 files)",[73,33074,33075,33078],{},[23,33076,33077],{},"Total file limit:"," 12 files per request",[11,33080,33081,33082,33084],{},"Tags are assigned in upload order within each type. Your prompt text tells Seedance ",[2619,33083,25174],{}," to use each reference.",[11,33086,33087,33088,493],{},"For a deep dive into every @tag pattern with 8+ real-world cases, see the ",[37,33089,33090],{"href":2966},"complete @Tags guide",[92,33092,33094],{"id":33093},"_5-ways-to-use-image-references","5 Ways to Use Image References",[2036,33096,33097,33109],{},[2039,33098,33099],{},[2042,33100,33101,33104,33107],{},[2045,33102,33103],{},"Usage",[2045,33105,33106],{},"Prompt Syntax",[2045,33108,2982],{},[2052,33110,33111,33124,33137,33151,33166],{},[2042,33112,33113,33117,33121],{},[2057,33114,33115],{},[23,33116,30734],{},[2057,33118,33119],{},[28,33120,2994],{},[2057,33122,33123],{},"Video starts from this exact image",[2042,33125,33126,33130,33134],{},[2057,33127,33128],{},[23,33129,30748],{},[2057,33131,33132],{},[28,33133,3007],{},[2057,33135,33136],{},"Video ends at this image",[2042,33138,33139,33144,33148],{},[2057,33140,33141],{},[23,33142,33143],{},"Character appearance",[2057,33145,33146],{},[28,33147,3020],{},[2057,33149,33150],{},"Preserves character look throughout",[2042,33152,33153,33158,33163],{},[2057,33154,33155],{},[23,33156,33157],{},"Scene environment",[2057,33159,33160],{},[28,33161,33162],{},"@Image1 as background environment",[2057,33164,33165],{},"Uses image as scene setting",[2042,33167,33168,33173,33177],{},[2057,33169,33170],{},[23,33171,33172],{},"Style / aesthetic",[2057,33174,33175],{},[28,33176,3033],{},[2057,33178,33179],{},"Matches color palette, texture, mood",[92,33181,33183],{"id":33182},"_4-ways-to-use-video-references","4 Ways to Use Video References",[2036,33185,33186,33196],{},[2039,33187,33188],{},[2042,33189,33190,33192,33194],{},[2045,33191,33103],{},[2045,33193,33106],{},[2045,33195,2982],{},[2052,33197,33198,33213,33228,33243],{},[2042,33199,33200,33205,33210],{},[2057,33201,33202],{},[23,33203,33204],{},"Camera replication",[2057,33206,33207],{},[28,33208,33209],{},"follow @Video1 camera movement",[2057,33211,33212],{},"Copies pan, tilt, zoom pattern",[2042,33214,33215,33220,33225],{},[2057,33216,33217],{},[23,33218,33219],{},"Motion imitation",[2057,33221,33222],{},[28,33223,33224],{},"character moves like @Video1",[2057,33226,33227],{},"Transfers body motion / choreography",[2042,33229,33230,33235,33240],{},[2057,33231,33232],{},[23,33233,33234],{},"Effect replication",[2057,33236,33237],{},[28,33238,33239],{},"apply @Video1 transition effects",[2057,33241,33242],{},"Matches visual effects and transitions",[2042,33244,33245,33250,33255],{},[2057,33246,33247],{},[23,33248,33249],{},"Rhythm reference",[2057,33251,33252],{},[28,33253,33254],{},"match @Video1 pacing and cuts",[2057,33256,33257],{},"Syncs timing and scene rhythm",[92,33259,33261],{"id":33260},"_3-ways-to-use-audio-references","3 Ways to Use Audio References",[2036,33263,33264,33274],{},[2039,33265,33266],{},[2042,33267,33268,33270,33272],{},[2045,33269,33103],{},[2045,33271,33106],{},[2045,33273,2982],{},[2052,33275,33276,33290,33304],{},[2042,33277,33278,33282,33287],{},[2057,33279,33280],{},[23,33281,31142],{},[2057,33283,33284],{},[28,33285,33286],{},"@Audio1 as background soundtrack",[2057,33288,33289],{},"Sets mood with uploaded music",[2042,33291,33292,33296,33301],{},[2057,33293,33294],{},[23,33295,31157],{},[2057,33297,33298],{},[28,33299,33300],{},"@Audio1 as ambient sound",[2057,33302,33303],{},"Adds specific sound effects",[2042,33305,33306,33311,33316],{},[2057,33307,33308],{},[23,33309,33310],{},"Voice style",[2057,33312,33313],{},[28,33314,33315],{},"@Audio1 as voice style reference",[2057,33317,33318],{},"Matches vocal tone and cadence",[92,33320,33322],{"id":33321},"optimal-file-allocation-strategy","Optimal File Allocation Strategy",[11,33324,33325],{},"With a 12-file limit, here's how to distribute references for different use cases:",[2036,33327,33328,33343],{},[2039,33329,33330],{},[2042,33331,33332,33334,33336,33338,33340],{},[2045,33333,14173],{},[2045,33335,30611],{},[2045,33337,30627],{},[2045,33339,30643],{},[2045,33341,33342],{},"Total",[2052,33344,33345,33361,33376,33393,33408],{},[2042,33346,33347,33350,33353,33356,33358],{},[2057,33348,33349],{},"Product commercial",[2057,33351,33352],{},"4 (product angles)",[2057,33354,33355],{},"1 (camera ref)",[2057,33357,13176],{},[2057,33359,33360],{},"6",[2042,33362,33363,33366,33369,33372,33374],{},[2057,33364,33365],{},"Character animation",[2057,33367,33368],{},"3 (character + scene)",[2057,33370,33371],{},"2 (motion ref)",[2057,33373,13176],{},[2057,33375,33360],{},[2042,33377,33378,33381,33384,33387,33390],{},[2057,33379,33380],{},"Music video",[2057,33382,33383],{},"2 (style + character)",[2057,33385,33386],{},"2 (dance ref)",[2057,33388,33389],{},"3 (tracks)",[2057,33391,33392],{},"7",[2042,33394,33395,33398,33401,33404,33406],{},[2057,33396,33397],{},"Multi-shot narrative",[2057,33399,33400],{},"6 (scene keyframes)",[2057,33402,33403],{},"1 (style ref)",[2057,33405,13176],{},[2057,33407,3698],{},[2042,33409,33410,33413,33416,33418,33421],{},[2057,33411,33412],{},"Maximum quality single shot",[2057,33414,33415],{},"9 (all angles)",[2057,33417,783],{},[2057,33419,33420],{},"3 (audio layers)",[2057,33422,16408],{},[18,33424,33425],{},[11,33426,33427,33429],{},[23,33428,11200],{}," You rarely need all 12 slots. Fewer, higher-quality references usually outperform many low-quality ones.",[45,33431],{},[48,33433,33435],{"id":33434},"_15-ready-to-use-seedance-prompt-templates","15+ Ready-to-Use Seedance Prompt Templates",[92,33437,33439],{"id":33438},"text-to-video-prompt-templates","Text-to-Video Prompt Templates",[32395,33441,33443],{"id":33442},"t1-multi-character-dialogue-short-film","T1: Multi-Character Dialogue Short Film",[11,33445,33446,33449],{},[23,33447,33448],{},"Description:"," Two animated characters with distinct vocal personalities engage in dynamic conversation, showcasing voice acting capabilities — now in shot-script format.",[56,33451,60,33452],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,33453],{"src":31245,"type":65},[136,33455,33457],{"className":338,"code":33456,"language":340,"meta":141,"style":141},"# T1: Multi-Character Dialogue — uses setup from first example above\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"【Style】Pixar-quality 3D animation, warm color palette, expressive character acting.\\n\"\n            \"【Duration】12 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Philosopher (Medium Close-up).\\n\"\n            \"A wise old cat in round spectacles sits at a cozy cafe table, paws wrapped \"\n            \"around a tiny porcelain cup. Steam curls upward. The cat speaks in a calm, \"\n            \"measured tone: 'Experience teaches patience, young friend.' Warm afternoon \"\n            \"light through the cafe window. Subtle ear twitch.\\n\\n\"\n            \"[00:04-00:08] Shot 2: The Adventurer (Medium Close-up, Reverse Shot).\\n\"\n            \"Cut to the opposite side of the table. An energetic young golden retriever \"\n            \"bounces in his seat, tail wagging visibly behind the chair. He leans forward \"\n            \"with wide eyes and responds: 'But adventure awaits right now!' His paws \"\n            \"gesture wildly, nearly knocking over a pastry plate.\\n\\n\"\n            \"[00:08-00:12] Shot 3: The Punchline (Wide Two-Shot).\\n\"\n            \"Camera pulls back to show both at the table. The cat calmly catches the \"\n            \"falling pastry with one paw without looking — places it back. The dog's jaw \"\n            \"drops in amazement. Beat of silence. Both burst into laughter.\\n\\n\"\n            \"Consistent character designs throughout. Distinct vocal timbres per character. \"\n            \"Warm cafe lighting with bokeh background.\"\n        ),\n        \"duration\": 12,\n        \"quality\": \"1080p\"\n    }\n)\n# Poll with the same while loop from the first example\n",[28,33458,33459,33464,33472,33484,33506,33514,33524,33530,33539,33548,33557,33562,33567,33572,33581,33590,33595,33600,33605,33614,33623,33628,33633,33642,33647,33652,33656,33666,33674,33678,33682],{"__ignoreMap":141},[145,33460,33461],{"class":147,"line":148},[145,33462,33463],{"class":174},"# T1: Multi-Character Dialogue — uses setup from first example above\n",[145,33465,33466,33468,33470],{"class":147,"line":166},[145,33467,6529],{"class":262},[145,33469,266],{"class":258},[145,33471,1432],{"class":262},[145,33473,33474,33476,33478,33480,33482],{"class":147,"line":178},[145,33475,6538],{"class":258},[145,33477,449],{"class":159},[145,33479,679],{"class":155},[145,33481,1444],{"class":159},[145,33483,452],{"class":262},[145,33485,33486,33488,33490,33492,33494,33496,33498,33500,33502,33504],{"class":147,"line":187},[145,33487,6551],{"class":701},[145,33489,266],{"class":258},[145,33491,685],{"class":262},[145,33493,31543],{"class":159},[145,33495,437],{"class":262},[145,33497,440],{"class":258},[145,33499,443],{"class":159},[145,33501,446],{"class":155},[145,33503,449],{"class":159},[145,33505,19590],{"class":262},[145,33507,33508,33510,33512],{"class":147,"line":373},[145,33509,6562],{"class":701},[145,33511,266],{"class":258},[145,33513,1865],{"class":262},[145,33515,33516,33518,33520,33522],{"class":147,"line":379},[145,33517,1303],{"class":159},[145,33519,437],{"class":262},[145,33521,1308],{"class":159},[145,33523,452],{"class":262},[145,33525,33526,33528],{"class":147,"line":385},[145,33527,1319],{"class":159},[145,33529,1322],{"class":262},[145,33531,33532,33535,33537],{"class":147,"line":409},[145,33533,33534],{"class":159},"            \"【Style】Pixar-quality 3D animation, warm color palette, expressive character acting.",[145,33536,1670],{"class":155},[145,33538,950],{"class":159},[145,33540,33541,33544,33546],{"class":147,"line":420},[145,33542,33543],{"class":159},"            \"【Duration】12 seconds",[145,33545,12126],{"class":155},[145,33547,950],{"class":159},[145,33549,33550,33553,33555],{"class":147,"line":431},[145,33551,33552],{"class":159},"            \"[00:00-00:04] Shot 1: The Philosopher (Medium Close-up).",[145,33554,1670],{"class":155},[145,33556,950],{"class":159},[145,33558,33559],{"class":147,"line":455},[145,33560,33561],{"class":159},"            \"A wise old cat in round spectacles sits at a cozy cafe table, paws wrapped \"\n",[145,33563,33564],{"class":147,"line":466},[145,33565,33566],{"class":159},"            \"around a tiny porcelain cup. Steam curls upward. The cat speaks in a calm, \"\n",[145,33568,33569],{"class":147,"line":600},[145,33570,33571],{"class":159},"            \"measured tone: 'Experience teaches patience, young friend.' Warm afternoon \"\n",[145,33573,33574,33577,33579],{"class":147,"line":605},[145,33575,33576],{"class":159},"            \"light through the cafe window. Subtle ear twitch.",[145,33578,12126],{"class":155},[145,33580,950],{"class":159},[145,33582,33583,33586,33588],{"class":147,"line":611},[145,33584,33585],{"class":159},"            \"[00:04-00:08] Shot 2: The Adventurer (Medium Close-up, Reverse Shot).",[145,33587,1670],{"class":155},[145,33589,950],{"class":159},[145,33591,33592],{"class":147,"line":617},[145,33593,33594],{"class":159},"            \"Cut to the opposite side of the table. An energetic young golden retriever \"\n",[145,33596,33597],{"class":147,"line":623},[145,33598,33599],{"class":159},"            \"bounces in his seat, tail wagging visibly behind the chair. He leans forward \"\n",[145,33601,33602],{"class":147,"line":628},[145,33603,33604],{"class":159},"            \"with wide eyes and responds: 'But adventure awaits right now!' His paws \"\n",[145,33606,33607,33610,33612],{"class":147,"line":639},[145,33608,33609],{"class":159},"            \"gesture wildly, nearly knocking over a pastry plate.",[145,33611,12126],{"class":155},[145,33613,950],{"class":159},[145,33615,33616,33619,33621],{"class":147,"line":654},[145,33617,33618],{"class":159},"            \"[00:08-00:12] Shot 3: The Punchline (Wide Two-Shot).",[145,33620,1670],{"class":155},[145,33622,950],{"class":159},[145,33624,33625],{"class":147,"line":660},[145,33626,33627],{"class":159},"            \"Camera pulls back to show both at the table. The cat calmly catches the \"\n",[145,33629,33630],{"class":147,"line":671},[145,33631,33632],{"class":159},"            \"falling pastry with one paw without looking — places it back. The dog's jaw \"\n",[145,33634,33635,33638,33640],{"class":147,"line":698},[145,33636,33637],{"class":159},"            \"drops in amazement. Beat of silence. Both burst into laughter.",[145,33639,12126],{"class":155},[145,33641,950],{"class":159},[145,33643,33644],{"class":147,"line":710},[145,33645,33646],{"class":159},"            \"Consistent character designs throughout. Distinct vocal timbres per character. \"\n",[145,33648,33649],{"class":147,"line":716},[145,33650,33651],{"class":159},"            \"Warm cafe lighting with bokeh background.\"\n",[145,33653,33654],{"class":147,"line":722},[145,33655,1342],{"class":262},[145,33657,33658,33660,33662,33664],{"class":147,"line":728},[145,33659,1347],{"class":159},[145,33661,437],{"class":262},[145,33663,16408],{"class":155},[145,33665,452],{"class":262},[145,33667,33668,33670,33672],{"class":147,"line":739},[145,33669,1363],{"class":159},[145,33671,437],{"class":262},[145,33673,32790],{"class":159},[145,33675,33676],{"class":147,"line":744},[145,33677,1407],{"class":262},[145,33679,33680],{"class":147,"line":750},[145,33681,406],{"class":262},[145,33683,33684],{"class":147,"line":767},[145,33685,33686],{"class":174},"# Poll with the same while loop from the first example\n",[32395,33688,33690],{"id":33689},"t2-style-transformation-living-van-gogh-painting","T2: Style Transformation — Living Van Gogh Painting",[11,33692,33693,33695],{},[23,33694,33448],{}," Transforms a classic post-impressionist scene into a breathing, moving world — demonstrating precise artistic style control through prompt engineering.",[56,33697,60,33698],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,33699],{"src":24417,"type":65},[136,33701,33703],{"className":338,"code":33702,"language":340,"meta":141,"style":141},"# T2: Style Transformation — uses setup from first example above\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"【Style】Van Gogh Post-Impressionism, thick impasto oil paint texture, \"\n            \"swirling brushstrokes, dreamy high-saturation.\\n\"\n            \"【Duration】10 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Living Sky (Wide Shot, Slow Pan Up).\\n\"\n            \"A young woman in a flowing blue dress stands in a sunlit village square. \"\n            \"Behind her, cobblestone streets and rustic cottages are painted with thick, \"\n            \"visible brushstrokes. The entire sky swirls with golden celestial bodies \"\n            \"and flowing paint. Everything moves — the sky itself breathes.\\n\\n\"\n            \"[00:04-00:07] Shot 2: The Portrait Focus (Medium Shot, Slow Pan Down).\\n\"\n            \"Camera pushes in closer to the woman's face. Her features are rendered \"\n            \"in Van Gogh's distinctive style — bold brushstrokes define her cheekbones \"\n            \"and flowing hair. The village behind her shifts with painted texture, \"\n            \"windows glowing with warm yellow-orange light.\\n\\n\"\n            \"[00:07-00:10] Shot 3: The Immersion (Tracking Shot, Moving Into the Painting).\\n\"\n            \"Camera slowly pushes forward deeper into the painted world. We move past \"\n            \"the woman, through the village streets. Paint texture becomes visible at \"\n            \"close range. The entire world is alive with flowing brushstrokes.\\n\\n\"\n            \"Pure Van Gogh aesthetic throughout. No photorealism. Every surface is visible \"\n            \"oil paint. Blue-yellow-orange palette dominant.\"\n        ),\n        \"duration\": 10,\n        \"quality\": \"1080p\"\n    }\n)\n# Poll with the same while loop from the first example\n",[28,33704,33705,33710,33718,33730,33752,33760,33770,33776,33781,33790,33798,33807,33812,33817,33822,33831,33840,33845,33850,33855,33864,33873,33878,33883,33892,33897,33902,33906,33916,33924,33928,33932],{"__ignoreMap":141},[145,33706,33707],{"class":147,"line":148},[145,33708,33709],{"class":174},"# T2: Style Transformation — uses setup from first example above\n",[145,33711,33712,33714,33716],{"class":147,"line":166},[145,33713,6529],{"class":262},[145,33715,266],{"class":258},[145,33717,1432],{"class":262},[145,33719,33720,33722,33724,33726,33728],{"class":147,"line":178},[145,33721,6538],{"class":258},[145,33723,449],{"class":159},[145,33725,679],{"class":155},[145,33727,1444],{"class":159},[145,33729,452],{"class":262},[145,33731,33732,33734,33736,33738,33740,33742,33744,33746,33748,33750],{"class":147,"line":187},[145,33733,6551],{"class":701},[145,33735,266],{"class":258},[145,33737,685],{"class":262},[145,33739,31543],{"class":159},[145,33741,437],{"class":262},[145,33743,440],{"class":258},[145,33745,443],{"class":159},[145,33747,446],{"class":155},[145,33749,449],{"class":159},[145,33751,19590],{"class":262},[145,33753,33754,33756,33758],{"class":147,"line":373},[145,33755,6562],{"class":701},[145,33757,266],{"class":258},[145,33759,1865],{"class":262},[145,33761,33762,33764,33766,33768],{"class":147,"line":379},[145,33763,1303],{"class":159},[145,33765,437],{"class":262},[145,33767,1308],{"class":159},[145,33769,452],{"class":262},[145,33771,33772,33774],{"class":147,"line":385},[145,33773,1319],{"class":159},[145,33775,1322],{"class":262},[145,33777,33778],{"class":147,"line":409},[145,33779,33780],{"class":159},"            \"【Style】Van Gogh Post-Impressionism, thick impasto oil paint texture, \"\n",[145,33782,33783,33786,33788],{"class":147,"line":420},[145,33784,33785],{"class":159},"            \"swirling brushstrokes, dreamy high-saturation.",[145,33787,1670],{"class":155},[145,33789,950],{"class":159},[145,33791,33792,33794,33796],{"class":147,"line":431},[145,33793,32651],{"class":159},[145,33795,12126],{"class":155},[145,33797,950],{"class":159},[145,33799,33800,33803,33805],{"class":147,"line":455},[145,33801,33802],{"class":159},"            \"[00:00-00:04] Shot 1: The Living Sky (Wide Shot, Slow Pan Up).",[145,33804,1670],{"class":155},[145,33806,950],{"class":159},[145,33808,33809],{"class":147,"line":466},[145,33810,33811],{"class":159},"            \"A young woman in a flowing blue dress stands in a sunlit village square. \"\n",[145,33813,33814],{"class":147,"line":600},[145,33815,33816],{"class":159},"            \"Behind her, cobblestone streets and rustic cottages are painted with thick, \"\n",[145,33818,33819],{"class":147,"line":605},[145,33820,33821],{"class":159},"            \"visible brushstrokes. The entire sky swirls with golden celestial bodies \"\n",[145,33823,33824,33827,33829],{"class":147,"line":611},[145,33825,33826],{"class":159},"            \"and flowing paint. Everything moves — the sky itself breathes.",[145,33828,12126],{"class":155},[145,33830,950],{"class":159},[145,33832,33833,33836,33838],{"class":147,"line":617},[145,33834,33835],{"class":159},"            \"[00:04-00:07] Shot 2: The Portrait Focus (Medium Shot, Slow Pan Down).",[145,33837,1670],{"class":155},[145,33839,950],{"class":159},[145,33841,33842],{"class":147,"line":623},[145,33843,33844],{"class":159},"            \"Camera pushes in closer to the woman's face. Her features are rendered \"\n",[145,33846,33847],{"class":147,"line":628},[145,33848,33849],{"class":159},"            \"in Van Gogh's distinctive style — bold brushstrokes define her cheekbones \"\n",[145,33851,33852],{"class":147,"line":639},[145,33853,33854],{"class":159},"            \"and flowing hair. The village behind her shifts with painted texture, \"\n",[145,33856,33857,33860,33862],{"class":147,"line":654},[145,33858,33859],{"class":159},"            \"windows glowing with warm yellow-orange light.",[145,33861,12126],{"class":155},[145,33863,950],{"class":159},[145,33865,33866,33869,33871],{"class":147,"line":660},[145,33867,33868],{"class":159},"            \"[00:07-00:10] Shot 3: The Immersion (Tracking Shot, Moving Into the Painting).",[145,33870,1670],{"class":155},[145,33872,950],{"class":159},[145,33874,33875],{"class":147,"line":671},[145,33876,33877],{"class":159},"            \"Camera slowly pushes forward deeper into the painted world. We move past \"\n",[145,33879,33880],{"class":147,"line":698},[145,33881,33882],{"class":159},"            \"the woman, through the village streets. Paint texture becomes visible at \"\n",[145,33884,33885,33888,33890],{"class":147,"line":710},[145,33886,33887],{"class":159},"            \"close range. The entire world is alive with flowing brushstrokes.",[145,33889,12126],{"class":155},[145,33891,950],{"class":159},[145,33893,33894],{"class":147,"line":716},[145,33895,33896],{"class":159},"            \"Pure Van Gogh aesthetic throughout. No photorealism. Every surface is visible \"\n",[145,33898,33899],{"class":147,"line":722},[145,33900,33901],{"class":159},"            \"oil paint. Blue-yellow-orange palette dominant.\"\n",[145,33903,33904],{"class":147,"line":728},[145,33905,1342],{"class":262},[145,33907,33908,33910,33912,33914],{"class":147,"line":739},[145,33909,1347],{"class":159},[145,33911,437],{"class":262},[145,33913,537],{"class":155},[145,33915,452],{"class":262},[145,33917,33918,33920,33922],{"class":147,"line":744},[145,33919,1363],{"class":159},[145,33921,437],{"class":262},[145,33923,32790],{"class":159},[145,33925,33926],{"class":147,"line":750},[145,33927,1407],{"class":262},[145,33929,33930],{"class":147,"line":767},[145,33931,406],{"class":262},[145,33933,33934],{"class":147,"line":788},[145,33935,33686],{"class":174},[32395,33937,33939],{"id":33938},"t3-emotional-expression-anime-character-performance","T3: Emotional Expression — Anime Character Performance",[11,33941,33942,33944],{},[23,33943,33448],{}," An anime-style character reading a letter with detailed emotional expression changes, demonstrating how text-only prompts can create nuanced character acting.",[56,33946,60,33947],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,33948],{"src":33949,"type":65},"https://cdn.evolink.ai/seedance2api/%E5%8A%A8%E6%BC%AB%E4%BA%BA%E7%89%A9%E8%AF%BB%E4%BF%A1%E8%A1%A8%E6%83%85.mp4",[136,33951,33953],{"className":338,"code":33952,"language":340,"meta":141,"style":141},"# T3: Emotional Expression — uses setup from first example above\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"【Style】High-quality anime, Studio Ghibli-inspired character animation, \"\n            \"detailed facial expressions.\\n\"\n            \"【Duration】12 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Letter Arrives (Medium Close-up).\\n\"\n            \"A young anime girl with long black hair sits by a sunlit window. She holds \"\n            \"an unopened envelope with both hands, turning it over carefully. Her eyes \"\n            \"show curiosity mixed with anticipation. Soft morning light illuminates her face.\\n\\n\"\n            \"[00:04-00:08] Shot 2: The Reading (Close-up on Face).\\n\"\n            \"Camera pushes closer as she opens the letter and begins reading. Her \"\n            \"expression changes dramatically — eyes widening with surprise, then a slow \"\n            \"smile spreading across her face. Her lips part slightly as if to gasp. \"\n            \"Every micro-expression is clearly animated.\\n\\n\"\n            \"[00:08-00:12] Shot 3: The Joy (Medium Shot, Slight Pull Back).\\n\"\n            \"She clutches the letter to her chest and closes her eyes with pure happiness. \"\n            \"A single tear of joy rolls down her cheek. Cherry blossom petals drift past \"\n            \"the window behind her. Camera holds on her peaceful, radiant expression.\\n\\n\"\n            \"Consistent anime character design. Detailed emotional facial animation. \"\n            \"Natural lighting transitions.\"\n        ),\n        \"duration\": 12,\n        \"quality\": \"1080p\"\n    }\n)\n# Poll with the same while loop from the first example\n",[28,33954,33955,33960,33968,33980,34002,34010,34020,34026,34031,34040,34048,34057,34062,34067,34076,34085,34090,34095,34100,34109,34118,34123,34128,34137,34142,34147,34151,34161,34169,34173,34177],{"__ignoreMap":141},[145,33956,33957],{"class":147,"line":148},[145,33958,33959],{"class":174},"# T3: Emotional Expression — uses setup from first example above\n",[145,33961,33962,33964,33966],{"class":147,"line":166},[145,33963,6529],{"class":262},[145,33965,266],{"class":258},[145,33967,1432],{"class":262},[145,33969,33970,33972,33974,33976,33978],{"class":147,"line":178},[145,33971,6538],{"class":258},[145,33973,449],{"class":159},[145,33975,679],{"class":155},[145,33977,1444],{"class":159},[145,33979,452],{"class":262},[145,33981,33982,33984,33986,33988,33990,33992,33994,33996,33998,34000],{"class":147,"line":187},[145,33983,6551],{"class":701},[145,33985,266],{"class":258},[145,33987,685],{"class":262},[145,33989,31543],{"class":159},[145,33991,437],{"class":262},[145,33993,440],{"class":258},[145,33995,443],{"class":159},[145,33997,446],{"class":155},[145,33999,449],{"class":159},[145,34001,19590],{"class":262},[145,34003,34004,34006,34008],{"class":147,"line":373},[145,34005,6562],{"class":701},[145,34007,266],{"class":258},[145,34009,1865],{"class":262},[145,34011,34012,34014,34016,34018],{"class":147,"line":379},[145,34013,1303],{"class":159},[145,34015,437],{"class":262},[145,34017,1308],{"class":159},[145,34019,452],{"class":262},[145,34021,34022,34024],{"class":147,"line":385},[145,34023,1319],{"class":159},[145,34025,1322],{"class":262},[145,34027,34028],{"class":147,"line":409},[145,34029,34030],{"class":159},"            \"【Style】High-quality anime, Studio Ghibli-inspired character animation, \"\n",[145,34032,34033,34036,34038],{"class":147,"line":420},[145,34034,34035],{"class":159},"            \"detailed facial expressions.",[145,34037,1670],{"class":155},[145,34039,950],{"class":159},[145,34041,34042,34044,34046],{"class":147,"line":431},[145,34043,33543],{"class":159},[145,34045,12126],{"class":155},[145,34047,950],{"class":159},[145,34049,34050,34053,34055],{"class":147,"line":455},[145,34051,34052],{"class":159},"            \"[00:00-00:04] Shot 1: The Letter Arrives (Medium Close-up).",[145,34054,1670],{"class":155},[145,34056,950],{"class":159},[145,34058,34059],{"class":147,"line":466},[145,34060,34061],{"class":159},"            \"A young anime girl with long black hair sits by a sunlit window. She holds \"\n",[145,34063,34064],{"class":147,"line":600},[145,34065,34066],{"class":159},"            \"an unopened envelope with both hands, turning it over carefully. Her eyes \"\n",[145,34068,34069,34072,34074],{"class":147,"line":605},[145,34070,34071],{"class":159},"            \"show curiosity mixed with anticipation. Soft morning light illuminates her face.",[145,34073,12126],{"class":155},[145,34075,950],{"class":159},[145,34077,34078,34081,34083],{"class":147,"line":611},[145,34079,34080],{"class":159},"            \"[00:04-00:08] Shot 2: The Reading (Close-up on Face).",[145,34082,1670],{"class":155},[145,34084,950],{"class":159},[145,34086,34087],{"class":147,"line":617},[145,34088,34089],{"class":159},"            \"Camera pushes closer as she opens the letter and begins reading. Her \"\n",[145,34091,34092],{"class":147,"line":623},[145,34093,34094],{"class":159},"            \"expression changes dramatically — eyes widening with surprise, then a slow \"\n",[145,34096,34097],{"class":147,"line":628},[145,34098,34099],{"class":159},"            \"smile spreading across her face. Her lips part slightly as if to gasp. \"\n",[145,34101,34102,34105,34107],{"class":147,"line":639},[145,34103,34104],{"class":159},"            \"Every micro-expression is clearly animated.",[145,34106,12126],{"class":155},[145,34108,950],{"class":159},[145,34110,34111,34114,34116],{"class":147,"line":654},[145,34112,34113],{"class":159},"            \"[00:08-00:12] Shot 3: The Joy (Medium Shot, Slight Pull Back).",[145,34115,1670],{"class":155},[145,34117,950],{"class":159},[145,34119,34120],{"class":147,"line":660},[145,34121,34122],{"class":159},"            \"She clutches the letter to her chest and closes her eyes with pure happiness. \"\n",[145,34124,34125],{"class":147,"line":671},[145,34126,34127],{"class":159},"            \"A single tear of joy rolls down her cheek. Cherry blossom petals drift past \"\n",[145,34129,34130,34133,34135],{"class":147,"line":698},[145,34131,34132],{"class":159},"            \"the window behind her. Camera holds on her peaceful, radiant expression.",[145,34134,12126],{"class":155},[145,34136,950],{"class":159},[145,34138,34139],{"class":147,"line":710},[145,34140,34141],{"class":159},"            \"Consistent anime character design. Detailed emotional facial animation. \"\n",[145,34143,34144],{"class":147,"line":716},[145,34145,34146],{"class":159},"            \"Natural lighting transitions.\"\n",[145,34148,34149],{"class":147,"line":722},[145,34150,1342],{"class":262},[145,34152,34153,34155,34157,34159],{"class":147,"line":728},[145,34154,1347],{"class":159},[145,34156,437],{"class":262},[145,34158,16408],{"class":155},[145,34160,452],{"class":262},[145,34162,34163,34165,34167],{"class":147,"line":739},[145,34164,1363],{"class":159},[145,34166,437],{"class":262},[145,34168,32790],{"class":159},[145,34170,34171],{"class":147,"line":744},[145,34172,1407],{"class":262},[145,34174,34175],{"class":147,"line":750},[145,34176,406],{"class":262},[145,34178,34179],{"class":147,"line":767},[145,34180,33686],{"class":174},[92,34182,34184],{"id":34183},"image-to-video-prompt-templates","Image-to-Video Prompt Templates",[32395,34186,34188],{"id":34187},"i1-product-commercial-premium-headphones","I1: Product Commercial — Premium Headphones",[11,34190,34191,34193,34194,34196,34197,493],{},[23,34192,33448],{}," Transform a product photo into a premium commercial with dynamic color showcase and studio-quality lighting, using ",[28,34195,2908],{}," as the first frame. For more product video workflows including batch generation, see our ",[37,34198,34199],{"href":3381},"image-to-video tutorial",[56,34201,60,34202],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,34203],{"src":18430,"type":65},[136,34205,34207],{"className":338,"code":34206,"language":340,"meta":141,"style":141},"# I1: Product Commercial — uses setup from first example above\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as first frame.\\n\"\n            \"【Style】Premium product keynote, clean minimal aesthetic, commercial photography.\\n\"\n            \"【Duration】15 seconds\\n\\n\"\n            \"[00:00-00:02] Rapid four-frame flash cuts — black, blue, white, rose gold \"\n            \"headphones appear one by one in stylized freeze frames. Close-up on metallic \"\n            \"texture and premium finish. Voiceover: 'Sound that moves you.'\\n\\n\"\n            \"[00:02-00:06] Extreme close-up of the headphone hinge mechanism unfolding. \"\n            \"Precision engineering visible in slow motion. Studio lighting creates elegant \"\n            \"highlights on the metal surface.\\n\\n\"\n            \"[00:06-00:12] Quick-cut lifestyle montage. Urban professional commuting, \"\n            \"artist in creative studio, athlete training — each wearing different colored \"\n            \"headphones that match their aesthetic.\\n\\n\"\n            \"[00:12-00:15] All four headphones lined up on minimal white pedestal. Brand \"\n            \"text 'SoundPro Hear Everything' elegantly fades in at the bottom.\\n\\n\"\n            \"Maintain exact product proportions and details from @Image1. Commercial-grade \"\n            \"lighting. Clean, premium aesthetic throughout.\"\n        ),\n        \"image_urls\": [\"https://example.com/premium_headphones.jpg\"],\n        \"duration\": 15,\n        \"quality\": \"1080p\"\n    }\n)\n# Poll with the same while loop from the first example\n",[28,34208,34209,34214,34222,34234,34256,34264,34274,34280,34289,34298,34307,34312,34317,34326,34331,34336,34345,34350,34355,34364,34369,34378,34383,34388,34392,34403,34413,34421,34425,34429],{"__ignoreMap":141},[145,34210,34211],{"class":147,"line":148},[145,34212,34213],{"class":174},"# I1: Product Commercial — uses setup from first example above\n",[145,34215,34216,34218,34220],{"class":147,"line":166},[145,34217,6529],{"class":262},[145,34219,266],{"class":258},[145,34221,1432],{"class":262},[145,34223,34224,34226,34228,34230,34232],{"class":147,"line":178},[145,34225,6538],{"class":258},[145,34227,449],{"class":159},[145,34229,679],{"class":155},[145,34231,1444],{"class":159},[145,34233,452],{"class":262},[145,34235,34236,34238,34240,34242,34244,34246,34248,34250,34252,34254],{"class":147,"line":187},[145,34237,6551],{"class":701},[145,34239,266],{"class":258},[145,34241,685],{"class":262},[145,34243,31543],{"class":159},[145,34245,437],{"class":262},[145,34247,440],{"class":258},[145,34249,443],{"class":159},[145,34251,446],{"class":155},[145,34253,449],{"class":159},[145,34255,19590],{"class":262},[145,34257,34258,34260,34262],{"class":147,"line":373},[145,34259,6562],{"class":701},[145,34261,266],{"class":258},[145,34263,1865],{"class":262},[145,34265,34266,34268,34270,34272],{"class":147,"line":379},[145,34267,1303],{"class":159},[145,34269,437],{"class":262},[145,34271,1308],{"class":159},[145,34273,452],{"class":262},[145,34275,34276,34278],{"class":147,"line":385},[145,34277,1319],{"class":159},[145,34279,1322],{"class":262},[145,34281,34282,34285,34287],{"class":147,"line":409},[145,34283,34284],{"class":159},"            \"@Image1 as first frame.",[145,34286,1670],{"class":155},[145,34288,950],{"class":159},[145,34290,34291,34294,34296],{"class":147,"line":420},[145,34292,34293],{"class":159},"            \"【Style】Premium product keynote, clean minimal aesthetic, commercial photography.",[145,34295,1670],{"class":155},[145,34297,950],{"class":159},[145,34299,34300,34303,34305],{"class":147,"line":431},[145,34301,34302],{"class":159},"            \"【Duration】15 seconds",[145,34304,12126],{"class":155},[145,34306,950],{"class":159},[145,34308,34309],{"class":147,"line":455},[145,34310,34311],{"class":159},"            \"[00:00-00:02] Rapid four-frame flash cuts — black, blue, white, rose gold \"\n",[145,34313,34314],{"class":147,"line":466},[145,34315,34316],{"class":159},"            \"headphones appear one by one in stylized freeze frames. Close-up on metallic \"\n",[145,34318,34319,34322,34324],{"class":147,"line":600},[145,34320,34321],{"class":159},"            \"texture and premium finish. Voiceover: 'Sound that moves you.'",[145,34323,12126],{"class":155},[145,34325,950],{"class":159},[145,34327,34328],{"class":147,"line":605},[145,34329,34330],{"class":159},"            \"[00:02-00:06] Extreme close-up of the headphone hinge mechanism unfolding. \"\n",[145,34332,34333],{"class":147,"line":611},[145,34334,34335],{"class":159},"            \"Precision engineering visible in slow motion. Studio lighting creates elegant \"\n",[145,34337,34338,34341,34343],{"class":147,"line":617},[145,34339,34340],{"class":159},"            \"highlights on the metal surface.",[145,34342,12126],{"class":155},[145,34344,950],{"class":159},[145,34346,34347],{"class":147,"line":623},[145,34348,34349],{"class":159},"            \"[00:06-00:12] Quick-cut lifestyle montage. Urban professional commuting, \"\n",[145,34351,34352],{"class":147,"line":628},[145,34353,34354],{"class":159},"            \"artist in creative studio, athlete training — each wearing different colored \"\n",[145,34356,34357,34360,34362],{"class":147,"line":639},[145,34358,34359],{"class":159},"            \"headphones that match their aesthetic.",[145,34361,12126],{"class":155},[145,34363,950],{"class":159},[145,34365,34366],{"class":147,"line":654},[145,34367,34368],{"class":159},"            \"[00:12-00:15] All four headphones lined up on minimal white pedestal. Brand \"\n",[145,34370,34371,34374,34376],{"class":147,"line":660},[145,34372,34373],{"class":159},"            \"text 'SoundPro Hear Everything' elegantly fades in at the bottom.",[145,34375,12126],{"class":155},[145,34377,950],{"class":159},[145,34379,34380],{"class":147,"line":671},[145,34381,34382],{"class":159},"            \"Maintain exact product proportions and details from @Image1. Commercial-grade \"\n",[145,34384,34385],{"class":147,"line":698},[145,34386,34387],{"class":159},"            \"lighting. Clean, premium aesthetic throughout.\"\n",[145,34389,34390],{"class":147,"line":710},[145,34391,1342],{"class":262},[145,34393,34394,34396,34398,34401],{"class":147,"line":716},[145,34395,2688],{"class":159},[145,34397,10841],{"class":262},[145,34399,34400],{"class":159},"\"https://example.com/premium_headphones.jpg\"",[145,34402,10847],{"class":262},[145,34404,34405,34407,34409,34411],{"class":147,"line":722},[145,34406,1347],{"class":159},[145,34408,437],{"class":262},[145,34410,3905],{"class":155},[145,34412,452],{"class":262},[145,34414,34415,34417,34419],{"class":147,"line":728},[145,34416,1363],{"class":159},[145,34418,437],{"class":262},[145,34420,32790],{"class":159},[145,34422,34423],{"class":147,"line":739},[145,34424,1407],{"class":262},[145,34426,34427],{"class":147,"line":744},[145,34428,406],{"class":262},[145,34430,34431],{"class":147,"line":750},[145,34432,33686],{"class":174},[32395,34434,34436],{"id":34435},"i2-character-animation-painted-ladys-coffee-adventure","I2: Character Animation — Painted Lady's Coffee Adventure",[11,34438,34439,34441,34442,34444],{},[23,34440,33448],{}," Brings a painted character to life in an enchanting coffee-stealing scene, demonstrating how ",[28,34443,2908],{}," preserves character appearance across magical narrative moments.",[56,34446,60,34447],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,34448],{"src":18790,"type":65},[136,34450,34452],{"className":338,"code":34451,"language":340,"meta":141,"style":141},"# I2: Character Animation — uses setup from first example above\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as character reference.\\n\"\n            \"【Style】Cinematic realism with magical elements, warm practical lighting.\\n\"\n            \"【Duration】15 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Awakening (Medium Shot on Canvas).\\n\"\n            \"The painted noblewoman suddenly comes alive inside the canvas. Her eyes dart \"\n            \"left and right nervously. Her painted hand animates and pushes forward through \"\n            \"the surface of the painting, reaching out from inside the canvas to grab a coffee \"\n            \"cup sitting on the table in front of the frame.\\n\\n\"\n            \"[00:04-00:08] Shot 2: The Secret Sip (Close-up on Face and Hands).\\n\"\n            \"She takes a quick sip and shows a deeply satisfied expression. Her eyes close \"\n            \"with pleasure as she savors the taste. Steam from the hot coffee catches the \"\n            \"gallery lighting.\\n\\n\"\n            \"[00:08-00:12] Shot 3: The Panic (Wide Shot, Quick Action).\\n\"\n            \"Suddenly footsteps approach — she panics and quickly puts the coffee back. \"\n            \"A butler-like figure walks in, picks up the coffee from the table, and leaves. \"\n            \"The woman freezes back into painting pose.\\n\\n\"\n            \"[00:12-00:15] Shot 4: The Finale (Push-in to Product Shot).\\n\"\n            \"Camera pushes forward as the scene fades to a pure black background with a \"\n            \"single spotlight illuminating the coffee cup. Elegant text appears at the \"\n            \"bottom: 'Good coffee is worth the wait.'\\n\\n\"\n            \"Maintain @Image1 character appearance exactly. Seamless transitions between \"\n            \"painted and living states. Realistic coffee physics.\"\n        ),\n        \"image_urls\": [\"https://example.com/painted_noblewoman.jpg\"],\n        \"duration\": 15,\n        \"quality\": \"1080p\"\n    }\n)\n# Poll with the same while loop from the first example\n",[28,34453,34454,34459,34467,34479,34501,34509,34519,34525,34534,34543,34551,34560,34565,34570,34575,34584,34593,34598,34603,34612,34621,34626,34631,34640,34649,34654,34659,34668,34673,34678,34682,34693,34703,34711,34715,34719],{"__ignoreMap":141},[145,34455,34456],{"class":147,"line":148},[145,34457,34458],{"class":174},"# I2: Character Animation — uses setup from first example above\n",[145,34460,34461,34463,34465],{"class":147,"line":166},[145,34462,6529],{"class":262},[145,34464,266],{"class":258},[145,34466,1432],{"class":262},[145,34468,34469,34471,34473,34475,34477],{"class":147,"line":178},[145,34470,6538],{"class":258},[145,34472,449],{"class":159},[145,34474,679],{"class":155},[145,34476,1444],{"class":159},[145,34478,452],{"class":262},[145,34480,34481,34483,34485,34487,34489,34491,34493,34495,34497,34499],{"class":147,"line":187},[145,34482,6551],{"class":701},[145,34484,266],{"class":258},[145,34486,685],{"class":262},[145,34488,31543],{"class":159},[145,34490,437],{"class":262},[145,34492,440],{"class":258},[145,34494,443],{"class":159},[145,34496,446],{"class":155},[145,34498,449],{"class":159},[145,34500,19590],{"class":262},[145,34502,34503,34505,34507],{"class":147,"line":373},[145,34504,6562],{"class":701},[145,34506,266],{"class":258},[145,34508,1865],{"class":262},[145,34510,34511,34513,34515,34517],{"class":147,"line":379},[145,34512,1303],{"class":159},[145,34514,437],{"class":262},[145,34516,1308],{"class":159},[145,34518,452],{"class":262},[145,34520,34521,34523],{"class":147,"line":385},[145,34522,1319],{"class":159},[145,34524,1322],{"class":262},[145,34526,34527,34530,34532],{"class":147,"line":409},[145,34528,34529],{"class":159},"            \"@Image1 as character reference.",[145,34531,1670],{"class":155},[145,34533,950],{"class":159},[145,34535,34536,34539,34541],{"class":147,"line":420},[145,34537,34538],{"class":159},"            \"【Style】Cinematic realism with magical elements, warm practical lighting.",[145,34540,1670],{"class":155},[145,34542,950],{"class":159},[145,34544,34545,34547,34549],{"class":147,"line":431},[145,34546,34302],{"class":159},[145,34548,12126],{"class":155},[145,34550,950],{"class":159},[145,34552,34553,34556,34558],{"class":147,"line":455},[145,34554,34555],{"class":159},"            \"[00:00-00:04] Shot 1: The Awakening (Medium Shot on Canvas).",[145,34557,1670],{"class":155},[145,34559,950],{"class":159},[145,34561,34562],{"class":147,"line":466},[145,34563,34564],{"class":159},"            \"The painted noblewoman suddenly comes alive inside the canvas. Her eyes dart \"\n",[145,34566,34567],{"class":147,"line":600},[145,34568,34569],{"class":159},"            \"left and right nervously. Her painted hand animates and pushes forward through \"\n",[145,34571,34572],{"class":147,"line":605},[145,34573,34574],{"class":159},"            \"the surface of the painting, reaching out from inside the canvas to grab a coffee \"\n",[145,34576,34577,34580,34582],{"class":147,"line":611},[145,34578,34579],{"class":159},"            \"cup sitting on the table in front of the frame.",[145,34581,12126],{"class":155},[145,34583,950],{"class":159},[145,34585,34586,34589,34591],{"class":147,"line":617},[145,34587,34588],{"class":159},"            \"[00:04-00:08] Shot 2: The Secret Sip (Close-up on Face and Hands).",[145,34590,1670],{"class":155},[145,34592,950],{"class":159},[145,34594,34595],{"class":147,"line":623},[145,34596,34597],{"class":159},"            \"She takes a quick sip and shows a deeply satisfied expression. Her eyes close \"\n",[145,34599,34600],{"class":147,"line":628},[145,34601,34602],{"class":159},"            \"with pleasure as she savors the taste. Steam from the hot coffee catches the \"\n",[145,34604,34605,34608,34610],{"class":147,"line":639},[145,34606,34607],{"class":159},"            \"gallery lighting.",[145,34609,12126],{"class":155},[145,34611,950],{"class":159},[145,34613,34614,34617,34619],{"class":147,"line":654},[145,34615,34616],{"class":159},"            \"[00:08-00:12] Shot 3: The Panic (Wide Shot, Quick Action).",[145,34618,1670],{"class":155},[145,34620,950],{"class":159},[145,34622,34623],{"class":147,"line":660},[145,34624,34625],{"class":159},"            \"Suddenly footsteps approach — she panics and quickly puts the coffee back. \"\n",[145,34627,34628],{"class":147,"line":671},[145,34629,34630],{"class":159},"            \"A butler-like figure walks in, picks up the coffee from the table, and leaves. \"\n",[145,34632,34633,34636,34638],{"class":147,"line":698},[145,34634,34635],{"class":159},"            \"The woman freezes back into painting pose.",[145,34637,12126],{"class":155},[145,34639,950],{"class":159},[145,34641,34642,34645,34647],{"class":147,"line":710},[145,34643,34644],{"class":159},"            \"[00:12-00:15] Shot 4: The Finale (Push-in to Product Shot).",[145,34646,1670],{"class":155},[145,34648,950],{"class":159},[145,34650,34651],{"class":147,"line":716},[145,34652,34653],{"class":159},"            \"Camera pushes forward as the scene fades to a pure black background with a \"\n",[145,34655,34656],{"class":147,"line":722},[145,34657,34658],{"class":159},"            \"single spotlight illuminating the coffee cup. Elegant text appears at the \"\n",[145,34660,34661,34664,34666],{"class":147,"line":728},[145,34662,34663],{"class":159},"            \"bottom: 'Good coffee is worth the wait.'",[145,34665,12126],{"class":155},[145,34667,950],{"class":159},[145,34669,34670],{"class":147,"line":739},[145,34671,34672],{"class":159},"            \"Maintain @Image1 character appearance exactly. Seamless transitions between \"\n",[145,34674,34675],{"class":147,"line":744},[145,34676,34677],{"class":159},"            \"painted and living states. Realistic coffee physics.\"\n",[145,34679,34680],{"class":147,"line":750},[145,34681,1342],{"class":262},[145,34683,34684,34686,34688,34691],{"class":147,"line":767},[145,34685,2688],{"class":159},[145,34687,10841],{"class":262},[145,34689,34690],{"class":159},"\"https://example.com/painted_noblewoman.jpg\"",[145,34692,10847],{"class":262},[145,34694,34695,34697,34699,34701],{"class":147,"line":788},[145,34696,1347],{"class":159},[145,34698,437],{"class":262},[145,34700,3905],{"class":155},[145,34702,452],{"class":262},[145,34704,34705,34707,34709],{"class":147,"line":834},[145,34706,1363],{"class":159},[145,34708,437],{"class":262},[145,34710,32790],{"class":159},[145,34712,34713],{"class":147,"line":839},[145,34714,1407],{"class":262},[145,34716,34717],{"class":147,"line":845},[145,34718,406],{"class":262},[145,34720,34721],{"class":147,"line":863},[145,34722,33686],{"class":174},[32395,34724,34726],{"id":34725},"i3-style-transfer-realistic-to-ink-wash-painting","I3: Style Transfer — Realistic to Ink Wash Painting",[11,34728,34729,34731,34732,34734],{},[23,34730,33448],{}," Transforms a realistic landscape photograph into a living traditional Chinese ink wash painting (水墨画), demonstrating style transfer with ",[28,34733,2908],{}," as scene composition reference.",[56,34736,60,34737],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,34738],{"src":25145,"type":65},[136,34740,34742],{"className":338,"code":34741,"language":340,"meta":141,"style":141},"# I3: Style Transfer — uses setup from first example above\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as scene composition reference.\\n\"\n            \"【Style】Traditional Chinese ink wash painting (水墨画), monochrome with faint indigo, meditative.\\n\"\n            \"【Duration】12 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Transformation Begins (Wide, Static).\\n\"\n            \"The photorealistic landscape slowly dissolves into flowing black ink. Mountain \"\n            \"peaks render as bold wet brushstrokes on rice paper texture. Realistic details \"\n            \"fade as traditional ink wash aesthetics take over.\\n\\n\"\n            \"[00:04-00:08] Shot 2: Life Emerges in Ink (Medium Shot, Slow Pan Right).\\n\"\n            \"Mist begins drifting between the valleys — visible as diluted ink wash spreading \"\n            \"on wet paper. A crane takes flight from behind a mountain, leaving elegant ink \"\n            \"trails across the sky. Water effects spread ink at mountain bases.\\n\\n\"\n            \"[00:08-00:12] Shot 3: Completion (Wide, Slow Zoom Out).\\n\"\n            \"Camera slowly pulls back to reveal the entire scene as a traditional scroll \"\n            \"painting being unrolled on a wooden desk. An unseen hand dips a brush in ink \"\n            \"at the edge of frame. The painting breathes — clouds still drift, crane still flies.\\n\\n\"\n            \"Visible rice paper texture and authentic brushstroke quality throughout. \"\n            \"No photorealism. Pure traditional ink wash aesthetic.\"\n        ),\n        \"image_urls\": [\"https://example.com/realistic_landscape.jpg\"],\n        \"duration\": 12,\n        \"quality\": \"1080p\"\n    }\n)\n# Poll with the same while loop from the first example\n",[28,34743,34744,34749,34757,34769,34791,34799,34809,34815,34824,34833,34841,34850,34855,34860,34869,34878,34883,34888,34897,34906,34911,34916,34925,34930,34935,34939,34950,34960,34968,34972,34976],{"__ignoreMap":141},[145,34745,34746],{"class":147,"line":148},[145,34747,34748],{"class":174},"# I3: Style Transfer — uses setup from first example above\n",[145,34750,34751,34753,34755],{"class":147,"line":166},[145,34752,6529],{"class":262},[145,34754,266],{"class":258},[145,34756,1432],{"class":262},[145,34758,34759,34761,34763,34765,34767],{"class":147,"line":178},[145,34760,6538],{"class":258},[145,34762,449],{"class":159},[145,34764,679],{"class":155},[145,34766,1444],{"class":159},[145,34768,452],{"class":262},[145,34770,34771,34773,34775,34777,34779,34781,34783,34785,34787,34789],{"class":147,"line":187},[145,34772,6551],{"class":701},[145,34774,266],{"class":258},[145,34776,685],{"class":262},[145,34778,31543],{"class":159},[145,34780,437],{"class":262},[145,34782,440],{"class":258},[145,34784,443],{"class":159},[145,34786,446],{"class":155},[145,34788,449],{"class":159},[145,34790,19590],{"class":262},[145,34792,34793,34795,34797],{"class":147,"line":373},[145,34794,6562],{"class":701},[145,34796,266],{"class":258},[145,34798,1865],{"class":262},[145,34800,34801,34803,34805,34807],{"class":147,"line":379},[145,34802,1303],{"class":159},[145,34804,437],{"class":262},[145,34806,1308],{"class":159},[145,34808,452],{"class":262},[145,34810,34811,34813],{"class":147,"line":385},[145,34812,1319],{"class":159},[145,34814,1322],{"class":262},[145,34816,34817,34820,34822],{"class":147,"line":409},[145,34818,34819],{"class":159},"            \"@Image1 as scene composition reference.",[145,34821,1670],{"class":155},[145,34823,950],{"class":159},[145,34825,34826,34829,34831],{"class":147,"line":420},[145,34827,34828],{"class":159},"            \"【Style】Traditional Chinese ink wash painting (水墨画), monochrome with faint indigo, meditative.",[145,34830,1670],{"class":155},[145,34832,950],{"class":159},[145,34834,34835,34837,34839],{"class":147,"line":431},[145,34836,33543],{"class":159},[145,34838,12126],{"class":155},[145,34840,950],{"class":159},[145,34842,34843,34846,34848],{"class":147,"line":455},[145,34844,34845],{"class":159},"            \"[00:00-00:04] Shot 1: The Transformation Begins (Wide, Static).",[145,34847,1670],{"class":155},[145,34849,950],{"class":159},[145,34851,34852],{"class":147,"line":466},[145,34853,34854],{"class":159},"            \"The photorealistic landscape slowly dissolves into flowing black ink. Mountain \"\n",[145,34856,34857],{"class":147,"line":600},[145,34858,34859],{"class":159},"            \"peaks render as bold wet brushstrokes on rice paper texture. Realistic details \"\n",[145,34861,34862,34865,34867],{"class":147,"line":605},[145,34863,34864],{"class":159},"            \"fade as traditional ink wash aesthetics take over.",[145,34866,12126],{"class":155},[145,34868,950],{"class":159},[145,34870,34871,34874,34876],{"class":147,"line":611},[145,34872,34873],{"class":159},"            \"[00:04-00:08] Shot 2: Life Emerges in Ink (Medium Shot, Slow Pan Right).",[145,34875,1670],{"class":155},[145,34877,950],{"class":159},[145,34879,34880],{"class":147,"line":617},[145,34881,34882],{"class":159},"            \"Mist begins drifting between the valleys — visible as diluted ink wash spreading \"\n",[145,34884,34885],{"class":147,"line":623},[145,34886,34887],{"class":159},"            \"on wet paper. A crane takes flight from behind a mountain, leaving elegant ink \"\n",[145,34889,34890,34893,34895],{"class":147,"line":628},[145,34891,34892],{"class":159},"            \"trails across the sky. Water effects spread ink at mountain bases.",[145,34894,12126],{"class":155},[145,34896,950],{"class":159},[145,34898,34899,34902,34904],{"class":147,"line":639},[145,34900,34901],{"class":159},"            \"[00:08-00:12] Shot 3: Completion (Wide, Slow Zoom Out).",[145,34903,1670],{"class":155},[145,34905,950],{"class":159},[145,34907,34908],{"class":147,"line":654},[145,34909,34910],{"class":159},"            \"Camera slowly pulls back to reveal the entire scene as a traditional scroll \"\n",[145,34912,34913],{"class":147,"line":660},[145,34914,34915],{"class":159},"            \"painting being unrolled on a wooden desk. An unseen hand dips a brush in ink \"\n",[145,34917,34918,34921,34923],{"class":147,"line":671},[145,34919,34920],{"class":159},"            \"at the edge of frame. The painting breathes — clouds still drift, crane still flies.",[145,34922,12126],{"class":155},[145,34924,950],{"class":159},[145,34926,34927],{"class":147,"line":698},[145,34928,34929],{"class":159},"            \"Visible rice paper texture and authentic brushstroke quality throughout. \"\n",[145,34931,34932],{"class":147,"line":710},[145,34933,34934],{"class":159},"            \"No photorealism. Pure traditional ink wash aesthetic.\"\n",[145,34936,34937],{"class":147,"line":716},[145,34938,1342],{"class":262},[145,34940,34941,34943,34945,34948],{"class":147,"line":722},[145,34942,2688],{"class":159},[145,34944,10841],{"class":262},[145,34946,34947],{"class":159},"\"https://example.com/realistic_landscape.jpg\"",[145,34949,10847],{"class":262},[145,34951,34952,34954,34956,34958],{"class":147,"line":728},[145,34953,1347],{"class":159},[145,34955,437],{"class":262},[145,34957,16408],{"class":155},[145,34959,452],{"class":262},[145,34961,34962,34964,34966],{"class":147,"line":739},[145,34963,1363],{"class":159},[145,34965,437],{"class":262},[145,34967,32790],{"class":159},[145,34969,34970],{"class":147,"line":744},[145,34971,1407],{"class":262},[145,34973,34974],{"class":147,"line":750},[145,34975,406],{"class":262},[145,34977,34978],{"class":147,"line":767},[145,34979,33686],{"class":174},[32395,34981,34983],{"id":34982},"i4-multi-image-one-shot-narrative-urban-parkour","I4: Multi-Image One-Shot Narrative — Urban Parkour",[11,34985,34986,34988,34989,34992],{},[23,34987,33448],{}," Seamlessly connects multiple location images into one continuous tracking shot of a parkour runner, creating an epic urban journey using shot-script format for precise timing. This technique builds on the ",[37,34990,34991],{"href":3856},"camera movement replication"," patterns.",[56,34994,60,34995],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,34996],{"src":12258,"type":65},[136,34998,35000],{"className":338,"code":34999,"language":340,"meta":141,"style":141},"# I4: Multi-Image One-Shot Narrative — uses setup from first example above\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 @Image2 @Image3 @Image4 @Image5 seamless one-shot tracking camera \"\n            \"following a parkour runner sprinting through city streets leaping up staircases \"\n            \"crossing a pedestrian bridge vaulting onto rooftops finally standing at the \"\n            \"rooftop edge overlooking the entire city skyline. Golden sunset light fills \"\n            \"the frame. Dynamic powerful full of freedom and energy.\\n\"\n            \"【Style】Cinematic action sports, dynamic tracking shot, golden hour lighting.\\n\"\n            \"【Duration】15 seconds\\n\\n\"\n            \"[00:00-00:03] Urban Sprint (@Image1 as environment).\\n\"\n            \"Tracking camera follows a parkour athlete in athletic gear sprinting at full \"\n            \"speed through busy city streets. Low angle emphasizes power and speed. \"\n            \"Pedestrians blur past. Urban architecture creates dynamic leading lines.\\n\\n\"\n            \"[00:03-00:06] Staircase Vault (@Image2 as environment).\\n\"\n            \"Runner leaps up a concrete staircase in a single fluid motion — camera follows \"\n            \"the arc of movement. Each step is a launching pad. Concrete textures and \"\n            \"architectural details sharp in focus.\\n\\n\"\n            \"[00:06-00:09] Bridge Crossing (@Image3 as environment).\\n\"\n            \"Athlete vaults over the pedestrian bridge railing and lands on the walkway. \"\n            \"Camera maintains tracking speed. City traffic flows below. Wind catches \"\n            \"the runner's clothing.\\n\\n\"\n            \"[00:09-00:12] Rooftop Ascent (@Image4 as environment).\\n\"\n            \"A powerful jump and climb sequence onto building rooftops. Camera cranes up \"\n            \"to follow the vertical movement. Urban landscape spreads out below.\\n\\n\"\n            \"[00:12-00:15] Victory Moment (@Image5 as environment).\\n\"\n            \"Runner stands at the rooftop edge overlooking the entire city skyline. \"\n            \"Golden sunset light silhouettes the figure. Camera slowly pulls back to \"\n            \"reveal the epic scale of the journey completed.\\n\\n\"\n            \"Consistent runner character (same outfit, build, movement style) across all scenes. \"\n            \"Realistic parkour physics. Golden hour lighting throughout.\"\n        ),\n        \"image_urls\": [\n            \"https://example.com/city_street.jpg\",\n            \"https://example.com/staircase.jpg\",\n            \"https://example.com/pedestrian_bridge.jpg\",\n            \"https://example.com/rooftop_building.jpg\",\n            \"https://example.com/city_skyline.jpg\"\n        ],\n        \"duration\": 15,\n        \"quality\": \"1080p\"\n    }\n)\n# Poll with the same while loop from the first example\n",[28,35001,35002,35007,35015,35027,35049,35057,35067,35073,35078,35083,35088,35093,35102,35111,35119,35128,35133,35138,35147,35156,35161,35166,35175,35184,35189,35194,35203,35212,35217,35226,35235,35240,35245,35254,35259,35264,35268,35274,35281,35288,35295,35302,35307,35311,35321,35329,35333,35337],{"__ignoreMap":141},[145,35003,35004],{"class":147,"line":148},[145,35005,35006],{"class":174},"# I4: Multi-Image One-Shot Narrative — uses setup from first example above\n",[145,35008,35009,35011,35013],{"class":147,"line":166},[145,35010,6529],{"class":262},[145,35012,266],{"class":258},[145,35014,1432],{"class":262},[145,35016,35017,35019,35021,35023,35025],{"class":147,"line":178},[145,35018,6538],{"class":258},[145,35020,449],{"class":159},[145,35022,679],{"class":155},[145,35024,1444],{"class":159},[145,35026,452],{"class":262},[145,35028,35029,35031,35033,35035,35037,35039,35041,35043,35045,35047],{"class":147,"line":187},[145,35030,6551],{"class":701},[145,35032,266],{"class":258},[145,35034,685],{"class":262},[145,35036,31543],{"class":159},[145,35038,437],{"class":262},[145,35040,440],{"class":258},[145,35042,443],{"class":159},[145,35044,446],{"class":155},[145,35046,449],{"class":159},[145,35048,19590],{"class":262},[145,35050,35051,35053,35055],{"class":147,"line":373},[145,35052,6562],{"class":701},[145,35054,266],{"class":258},[145,35056,1865],{"class":262},[145,35058,35059,35061,35063,35065],{"class":147,"line":379},[145,35060,1303],{"class":159},[145,35062,437],{"class":262},[145,35064,1308],{"class":159},[145,35066,452],{"class":262},[145,35068,35069,35071],{"class":147,"line":385},[145,35070,1319],{"class":159},[145,35072,1322],{"class":262},[145,35074,35075],{"class":147,"line":409},[145,35076,35077],{"class":159},"            \"@Image1 @Image2 @Image3 @Image4 @Image5 seamless one-shot tracking camera \"\n",[145,35079,35080],{"class":147,"line":420},[145,35081,35082],{"class":159},"            \"following a parkour runner sprinting through city streets leaping up staircases \"\n",[145,35084,35085],{"class":147,"line":431},[145,35086,35087],{"class":159},"            \"crossing a pedestrian bridge vaulting onto rooftops finally standing at the \"\n",[145,35089,35090],{"class":147,"line":455},[145,35091,35092],{"class":159},"            \"rooftop edge overlooking the entire city skyline. Golden sunset light fills \"\n",[145,35094,35095,35098,35100],{"class":147,"line":466},[145,35096,35097],{"class":159},"            \"the frame. Dynamic powerful full of freedom and energy.",[145,35099,1670],{"class":155},[145,35101,950],{"class":159},[145,35103,35104,35107,35109],{"class":147,"line":600},[145,35105,35106],{"class":159},"            \"【Style】Cinematic action sports, dynamic tracking shot, golden hour lighting.",[145,35108,1670],{"class":155},[145,35110,950],{"class":159},[145,35112,35113,35115,35117],{"class":147,"line":605},[145,35114,34302],{"class":159},[145,35116,12126],{"class":155},[145,35118,950],{"class":159},[145,35120,35121,35124,35126],{"class":147,"line":611},[145,35122,35123],{"class":159},"            \"[00:00-00:03] Urban Sprint (@Image1 as environment).",[145,35125,1670],{"class":155},[145,35127,950],{"class":159},[145,35129,35130],{"class":147,"line":617},[145,35131,35132],{"class":159},"            \"Tracking camera follows a parkour athlete in athletic gear sprinting at full \"\n",[145,35134,35135],{"class":147,"line":623},[145,35136,35137],{"class":159},"            \"speed through busy city streets. Low angle emphasizes power and speed. \"\n",[145,35139,35140,35143,35145],{"class":147,"line":628},[145,35141,35142],{"class":159},"            \"Pedestrians blur past. Urban architecture creates dynamic leading lines.",[145,35144,12126],{"class":155},[145,35146,950],{"class":159},[145,35148,35149,35152,35154],{"class":147,"line":639},[145,35150,35151],{"class":159},"            \"[00:03-00:06] Staircase Vault (@Image2 as environment).",[145,35153,1670],{"class":155},[145,35155,950],{"class":159},[145,35157,35158],{"class":147,"line":654},[145,35159,35160],{"class":159},"            \"Runner leaps up a concrete staircase in a single fluid motion — camera follows \"\n",[145,35162,35163],{"class":147,"line":660},[145,35164,35165],{"class":159},"            \"the arc of movement. Each step is a launching pad. Concrete textures and \"\n",[145,35167,35168,35171,35173],{"class":147,"line":671},[145,35169,35170],{"class":159},"            \"architectural details sharp in focus.",[145,35172,12126],{"class":155},[145,35174,950],{"class":159},[145,35176,35177,35180,35182],{"class":147,"line":698},[145,35178,35179],{"class":159},"            \"[00:06-00:09] Bridge Crossing (@Image3 as environment).",[145,35181,1670],{"class":155},[145,35183,950],{"class":159},[145,35185,35186],{"class":147,"line":710},[145,35187,35188],{"class":159},"            \"Athlete vaults over the pedestrian bridge railing and lands on the walkway. \"\n",[145,35190,35191],{"class":147,"line":716},[145,35192,35193],{"class":159},"            \"Camera maintains tracking speed. City traffic flows below. Wind catches \"\n",[145,35195,35196,35199,35201],{"class":147,"line":722},[145,35197,35198],{"class":159},"            \"the runner's clothing.",[145,35200,12126],{"class":155},[145,35202,950],{"class":159},[145,35204,35205,35208,35210],{"class":147,"line":728},[145,35206,35207],{"class":159},"            \"[00:09-00:12] Rooftop Ascent (@Image4 as environment).",[145,35209,1670],{"class":155},[145,35211,950],{"class":159},[145,35213,35214],{"class":147,"line":739},[145,35215,35216],{"class":159},"            \"A powerful jump and climb sequence onto building rooftops. Camera cranes up \"\n",[145,35218,35219,35222,35224],{"class":147,"line":744},[145,35220,35221],{"class":159},"            \"to follow the vertical movement. Urban landscape spreads out below.",[145,35223,12126],{"class":155},[145,35225,950],{"class":159},[145,35227,35228,35231,35233],{"class":147,"line":750},[145,35229,35230],{"class":159},"            \"[00:12-00:15] Victory Moment (@Image5 as environment).",[145,35232,1670],{"class":155},[145,35234,950],{"class":159},[145,35236,35237],{"class":147,"line":767},[145,35238,35239],{"class":159},"            \"Runner stands at the rooftop edge overlooking the entire city skyline. \"\n",[145,35241,35242],{"class":147,"line":788},[145,35243,35244],{"class":159},"            \"Golden sunset light silhouettes the figure. Camera slowly pulls back to \"\n",[145,35246,35247,35250,35252],{"class":147,"line":834},[145,35248,35249],{"class":159},"            \"reveal the epic scale of the journey completed.",[145,35251,12126],{"class":155},[145,35253,950],{"class":159},[145,35255,35256],{"class":147,"line":839},[145,35257,35258],{"class":159},"            \"Consistent runner character (same outfit, build, movement style) across all scenes. \"\n",[145,35260,35261],{"class":147,"line":845},[145,35262,35263],{"class":159},"            \"Realistic parkour physics. Golden hour lighting throughout.\"\n",[145,35265,35266],{"class":147,"line":863},[145,35267,1342],{"class":262},[145,35269,35270,35272],{"class":147,"line":872},[145,35271,2688],{"class":159},[145,35273,2691],{"class":262},[145,35275,35276,35279],{"class":147,"line":887},[145,35277,35278],{"class":159},"            \"https://example.com/city_street.jpg\"",[145,35280,452],{"class":262},[145,35282,35283,35286],{"class":147,"line":903},[145,35284,35285],{"class":159},"            \"https://example.com/staircase.jpg\"",[145,35287,452],{"class":262},[145,35289,35290,35293],{"class":147,"line":915},[145,35291,35292],{"class":159},"            \"https://example.com/pedestrian_bridge.jpg\"",[145,35294,452],{"class":262},[145,35296,35297,35300],{"class":147,"line":953},[145,35298,35299],{"class":159},"            \"https://example.com/rooftop_building.jpg\"",[145,35301,452],{"class":262},[145,35303,35304],{"class":147,"line":959},[145,35305,35306],{"class":159},"            \"https://example.com/city_skyline.jpg\"\n",[145,35308,35309],{"class":147,"line":964},[145,35310,2701],{"class":262},[145,35312,35313,35315,35317,35319],{"class":147,"line":970},[145,35314,1347],{"class":159},[145,35316,437],{"class":262},[145,35318,3905],{"class":155},[145,35320,452],{"class":262},[145,35322,35323,35325,35327],{"class":147,"line":976},[145,35324,1363],{"class":159},[145,35326,437],{"class":262},[145,35328,32790],{"class":159},[145,35330,35331],{"class":147,"line":988},[145,35332,1407],{"class":262},[145,35334,35335],{"class":147,"line":993},[145,35336,406],{"class":262},[145,35338,35339],{"class":147,"line":5531},[145,35340,33686],{"class":174},[92,35342,35344],{"id":35343},"multimodal-tag-templates","Multimodal @Tag Templates",[32395,35346,35348],{"id":35347},"m1-advanced-camera-movement-replication-crystal-dungeon-exploration","M1: Advanced Camera Movement Replication — Crystal Dungeon Exploration",[11,35350,35351,35353,35354,493],{},[23,35352,33448],{}," Precisely replicates complex camera movements from a reference video while applying them to completely new fantasy content with multiple image references. Learn the full camera replication workflow in our ",[37,35355,35356],{"href":3856},"dedicated camera movement guide",[56,35358,60,35359],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,35360],{"src":35361,"type":65},"https://cdn.evolink.ai/seedance2api/%E6%B0%B4%E6%99%B6%E6%8E%A2%E9%99%A9.mp4",[136,35363,35365],{"className":338,"code":35364,"language":340,"meta":141,"style":141},"# M1: Camera Movement Replication — uses setup from first example above\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Use @Image1 as the opening first frame. First-person POV perspective. \"\n            \"Reference @Video1 camera movement style exactly. The scene above references \"\n            \"@Image2, the left scene references @Image3, the right scene references @Image4. \"\n            \"A hand holds a glowing magic lantern, exploring an ancient dungeon. Firelight \"\n            \"flickers across stone walls, casting dancing shadows.\\n\"\n            \"【Style】Fantasy adventure, realistic lighting, atmospheric.\\n\"\n            \"【Duration】9 seconds\\n\\n\"\n            \"[00:00-00:03] Entrance Discovery.\\n\"\n            \"First-person view entering the dungeon. The magical lantern illuminates ancient \"\n            \"stone architecture. Camera follows @Video1 movement pattern — smooth forward \"\n            \"motion with subtle tilts to examine details.\\n\\n\"\n            \"[00:03-00:06] Chamber Exploration.\\n\"\n            \"Camera pans upward to reveal @Image2 crystal formations on the ceiling, \"\n            \"then tilts left toward @Image3 dark passage, creating suspense. Lantern \"\n            \"light creates dynamic shadows on dungeon walls.\\n\\n\"\n            \"[00:06-00:09] Final Discovery.\\n\"\n            \"Camera turns right to reveal @Image4 hidden chamber with treasure. \"\n            \"Replicate @Video1 final movement — slow push-in with slight upward tilt. \"\n            \"Golden light from treasures mingles with lantern glow.\\n\\n\"\n            \"Maintain exact @Video1 camera timing and movement speed. Realistic fire physics \"\n            \"and shadow casting. Atmospheric dungeon ambiance.\"\n        ),\n        \"image_urls\": [\n            \"https://example.com/dungeon_entrance.png\",\n            \"https://example.com/crystal_ceiling.png\",\n            \"https://example.com/left_passage.png\",\n            \"https://example.com/right_chamber.png\"\n        ],\n        \"video_urls\": [\"https://example.com/camera_movement_ref.mp4\"],\n        \"duration\": 9,\n        \"quality\": \"1080p\"\n    }\n)\n# Poll with the same while loop from the first example\n",[28,35366,35367,35372,35380,35392,35414,35422,35432,35438,35443,35448,35453,35458,35467,35476,35485,35494,35499,35504,35513,35522,35527,35532,35541,35550,35555,35560,35569,35574,35579,35583,35589,35596,35603,35610,35615,35619,35630,35640,35648,35652,35656],{"__ignoreMap":141},[145,35368,35369],{"class":147,"line":148},[145,35370,35371],{"class":174},"# M1: Camera Movement Replication — uses setup from first example above\n",[145,35373,35374,35376,35378],{"class":147,"line":166},[145,35375,6529],{"class":262},[145,35377,266],{"class":258},[145,35379,1432],{"class":262},[145,35381,35382,35384,35386,35388,35390],{"class":147,"line":178},[145,35383,6538],{"class":258},[145,35385,449],{"class":159},[145,35387,679],{"class":155},[145,35389,1444],{"class":159},[145,35391,452],{"class":262},[145,35393,35394,35396,35398,35400,35402,35404,35406,35408,35410,35412],{"class":147,"line":187},[145,35395,6551],{"class":701},[145,35397,266],{"class":258},[145,35399,685],{"class":262},[145,35401,31543],{"class":159},[145,35403,437],{"class":262},[145,35405,440],{"class":258},[145,35407,443],{"class":159},[145,35409,446],{"class":155},[145,35411,449],{"class":159},[145,35413,19590],{"class":262},[145,35415,35416,35418,35420],{"class":147,"line":373},[145,35417,6562],{"class":701},[145,35419,266],{"class":258},[145,35421,1865],{"class":262},[145,35423,35424,35426,35428,35430],{"class":147,"line":379},[145,35425,1303],{"class":159},[145,35427,437],{"class":262},[145,35429,1308],{"class":159},[145,35431,452],{"class":262},[145,35433,35434,35436],{"class":147,"line":385},[145,35435,1319],{"class":159},[145,35437,1322],{"class":262},[145,35439,35440],{"class":147,"line":409},[145,35441,35442],{"class":159},"            \"Use @Image1 as the opening first frame. First-person POV perspective. \"\n",[145,35444,35445],{"class":147,"line":420},[145,35446,35447],{"class":159},"            \"Reference @Video1 camera movement style exactly. The scene above references \"\n",[145,35449,35450],{"class":147,"line":431},[145,35451,35452],{"class":159},"            \"@Image2, the left scene references @Image3, the right scene references @Image4. \"\n",[145,35454,35455],{"class":147,"line":455},[145,35456,35457],{"class":159},"            \"A hand holds a glowing magic lantern, exploring an ancient dungeon. Firelight \"\n",[145,35459,35460,35463,35465],{"class":147,"line":466},[145,35461,35462],{"class":159},"            \"flickers across stone walls, casting dancing shadows.",[145,35464,1670],{"class":155},[145,35466,950],{"class":159},[145,35468,35469,35472,35474],{"class":147,"line":600},[145,35470,35471],{"class":159},"            \"【Style】Fantasy adventure, realistic lighting, atmospheric.",[145,35473,1670],{"class":155},[145,35475,950],{"class":159},[145,35477,35478,35481,35483],{"class":147,"line":605},[145,35479,35480],{"class":159},"            \"【Duration】9 seconds",[145,35482,12126],{"class":155},[145,35484,950],{"class":159},[145,35486,35487,35490,35492],{"class":147,"line":611},[145,35488,35489],{"class":159},"            \"[00:00-00:03] Entrance Discovery.",[145,35491,1670],{"class":155},[145,35493,950],{"class":159},[145,35495,35496],{"class":147,"line":617},[145,35497,35498],{"class":159},"            \"First-person view entering the dungeon. The magical lantern illuminates ancient \"\n",[145,35500,35501],{"class":147,"line":623},[145,35502,35503],{"class":159},"            \"stone architecture. Camera follows @Video1 movement pattern — smooth forward \"\n",[145,35505,35506,35509,35511],{"class":147,"line":628},[145,35507,35508],{"class":159},"            \"motion with subtle tilts to examine details.",[145,35510,12126],{"class":155},[145,35512,950],{"class":159},[145,35514,35515,35518,35520],{"class":147,"line":639},[145,35516,35517],{"class":159},"            \"[00:03-00:06] Chamber Exploration.",[145,35519,1670],{"class":155},[145,35521,950],{"class":159},[145,35523,35524],{"class":147,"line":654},[145,35525,35526],{"class":159},"            \"Camera pans upward to reveal @Image2 crystal formations on the ceiling, \"\n",[145,35528,35529],{"class":147,"line":660},[145,35530,35531],{"class":159},"            \"then tilts left toward @Image3 dark passage, creating suspense. Lantern \"\n",[145,35533,35534,35537,35539],{"class":147,"line":671},[145,35535,35536],{"class":159},"            \"light creates dynamic shadows on dungeon walls.",[145,35538,12126],{"class":155},[145,35540,950],{"class":159},[145,35542,35543,35546,35548],{"class":147,"line":698},[145,35544,35545],{"class":159},"            \"[00:06-00:09] Final Discovery.",[145,35547,1670],{"class":155},[145,35549,950],{"class":159},[145,35551,35552],{"class":147,"line":710},[145,35553,35554],{"class":159},"            \"Camera turns right to reveal @Image4 hidden chamber with treasure. \"\n",[145,35556,35557],{"class":147,"line":716},[145,35558,35559],{"class":159},"            \"Replicate @Video1 final movement — slow push-in with slight upward tilt. \"\n",[145,35561,35562,35565,35567],{"class":147,"line":722},[145,35563,35564],{"class":159},"            \"Golden light from treasures mingles with lantern glow.",[145,35566,12126],{"class":155},[145,35568,950],{"class":159},[145,35570,35571],{"class":147,"line":728},[145,35572,35573],{"class":159},"            \"Maintain exact @Video1 camera timing and movement speed. Realistic fire physics \"\n",[145,35575,35576],{"class":147,"line":739},[145,35577,35578],{"class":159},"            \"and shadow casting. Atmospheric dungeon ambiance.\"\n",[145,35580,35581],{"class":147,"line":744},[145,35582,1342],{"class":262},[145,35584,35585,35587],{"class":147,"line":750},[145,35586,2688],{"class":159},[145,35588,2691],{"class":262},[145,35590,35591,35594],{"class":147,"line":767},[145,35592,35593],{"class":159},"            \"https://example.com/dungeon_entrance.png\"",[145,35595,452],{"class":262},[145,35597,35598,35601],{"class":147,"line":788},[145,35599,35600],{"class":159},"            \"https://example.com/crystal_ceiling.png\"",[145,35602,452],{"class":262},[145,35604,35605,35608],{"class":147,"line":834},[145,35606,35607],{"class":159},"            \"https://example.com/left_passage.png\"",[145,35609,452],{"class":262},[145,35611,35612],{"class":147,"line":839},[145,35613,35614],{"class":159},"            \"https://example.com/right_chamber.png\"\n",[145,35616,35617],{"class":147,"line":845},[145,35618,2701],{"class":262},[145,35620,35621,35623,35625,35628],{"class":147,"line":863},[145,35622,12162],{"class":159},[145,35624,10841],{"class":262},[145,35626,35627],{"class":159},"\"https://example.com/camera_movement_ref.mp4\"",[145,35629,10847],{"class":262},[145,35631,35632,35634,35636,35638],{"class":147,"line":872},[145,35633,1347],{"class":159},[145,35635,437],{"class":262},[145,35637,30614],{"class":155},[145,35639,452],{"class":262},[145,35641,35642,35644,35646],{"class":147,"line":887},[145,35643,1363],{"class":159},[145,35645,437],{"class":262},[145,35647,32790],{"class":159},[145,35649,35650],{"class":147,"line":903},[145,35651,1407],{"class":262},[145,35653,35654],{"class":147,"line":915},[145,35655,406],{"class":262},[145,35657,35658],{"class":147,"line":953},[145,35659,33686],{"class":174},[32395,35661,35663],{"id":35662},"m2-character-camera-movement-sync-stage-dance-performance","M2: Character + Camera Movement Sync — Stage Dance Performance",[11,35665,35666,35668],{},[23,35667,33448],{}," Combines character reference from an image with camera movement and dance choreography from video reference, creating synchronized performance art.",[56,35670,60,35671],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,35672],{"src":35673,"type":65},"https://cdn.evolink.ai/seedance2api/%E5%A5%B3%E7%94%9F%E8%B7%B3%E8%88%9E.mp4",[136,35675,35677],{"className":338,"code":35676,"language":340,"meta":141,"style":141},"# M2: Character + Camera Sync — uses setup from first example above\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 dancer as the main subject. Reference @Video1 camera movement style \"\n            \"rhythmic push-pull pan and tilt movements. The dancer choreography also \"\n            \"references @Video1 dance moves. Performing energetically on a colorful \"\n            \"LED-lit stage. Spotlights shift colors in sync with the rhythm.\\n\"\n            \"【Style】Concert performance, dynamic stage lighting, high energy.\\n\"\n            \"【Duration】12 seconds\\n\\n\"\n            \"[00:00-00:04] Opening Sequence.\\n\"\n            \"Camera starts wide showing @Image1 dancer center stage. LED lights pulse \"\n            \"in blue and purple. Dancer begins with @Video1 opening choreography — \"\n            \"fluid arm movements and spins. Camera matches @Video1 initial push-in timing.\\n\\n\"\n            \"[00:04-00:08] Dynamic Performance.\\n\"\n            \"Camera follows @Video1 rhythmic push-pull pattern as dancer performs high-energy \"\n            \"moves. Stage lights shift to warm orange and pink. Smoke effects catch the \"\n            \"colored lighting, creating atmospheric depth.\\n\\n\"\n            \"[00:08-00:12] Finale Moment.\\n\"\n            \"Camera matches @Video1 final tilt movement as dancer strikes a powerful \"\n            \"finishing pose. All stage lights converge into a brilliant white spotlight. \"\n            \"Sparkle effects cascade down around the performer.\\n\\n\"\n            \"Maintain @Image1 character appearance exactly. Synchronized camera and \"\n            \"choreography timing from @Video1. Professional stage lighting effects.\"\n        ),\n        \"image_urls\": [\"https://example.com/stage_dancer.png\"],\n        \"video_urls\": [\"https://example.com/dance_movement_ref.mp4\"],\n        \"duration\": 12,\n        \"quality\": \"1080p\"\n    }\n)\n# Poll with the same while loop from the first example\n",[28,35678,35679,35684,35692,35704,35726,35734,35744,35750,35755,35760,35765,35774,35783,35791,35800,35805,35810,35819,35828,35833,35838,35847,35856,35861,35866,35875,35880,35885,35889,35900,35911,35921,35929,35933,35937],{"__ignoreMap":141},[145,35680,35681],{"class":147,"line":148},[145,35682,35683],{"class":174},"# M2: Character + Camera Sync — uses setup from first example above\n",[145,35685,35686,35688,35690],{"class":147,"line":166},[145,35687,6529],{"class":262},[145,35689,266],{"class":258},[145,35691,1432],{"class":262},[145,35693,35694,35696,35698,35700,35702],{"class":147,"line":178},[145,35695,6538],{"class":258},[145,35697,449],{"class":159},[145,35699,679],{"class":155},[145,35701,1444],{"class":159},[145,35703,452],{"class":262},[145,35705,35706,35708,35710,35712,35714,35716,35718,35720,35722,35724],{"class":147,"line":187},[145,35707,6551],{"class":701},[145,35709,266],{"class":258},[145,35711,685],{"class":262},[145,35713,31543],{"class":159},[145,35715,437],{"class":262},[145,35717,440],{"class":258},[145,35719,443],{"class":159},[145,35721,446],{"class":155},[145,35723,449],{"class":159},[145,35725,19590],{"class":262},[145,35727,35728,35730,35732],{"class":147,"line":373},[145,35729,6562],{"class":701},[145,35731,266],{"class":258},[145,35733,1865],{"class":262},[145,35735,35736,35738,35740,35742],{"class":147,"line":379},[145,35737,1303],{"class":159},[145,35739,437],{"class":262},[145,35741,1308],{"class":159},[145,35743,452],{"class":262},[145,35745,35746,35748],{"class":147,"line":385},[145,35747,1319],{"class":159},[145,35749,1322],{"class":262},[145,35751,35752],{"class":147,"line":409},[145,35753,35754],{"class":159},"            \"@Image1 dancer as the main subject. Reference @Video1 camera movement style \"\n",[145,35756,35757],{"class":147,"line":420},[145,35758,35759],{"class":159},"            \"rhythmic push-pull pan and tilt movements. The dancer choreography also \"\n",[145,35761,35762],{"class":147,"line":431},[145,35763,35764],{"class":159},"            \"references @Video1 dance moves. Performing energetically on a colorful \"\n",[145,35766,35767,35770,35772],{"class":147,"line":455},[145,35768,35769],{"class":159},"            \"LED-lit stage. Spotlights shift colors in sync with the rhythm.",[145,35771,1670],{"class":155},[145,35773,950],{"class":159},[145,35775,35776,35779,35781],{"class":147,"line":466},[145,35777,35778],{"class":159},"            \"【Style】Concert performance, dynamic stage lighting, high energy.",[145,35780,1670],{"class":155},[145,35782,950],{"class":159},[145,35784,35785,35787,35789],{"class":147,"line":600},[145,35786,33543],{"class":159},[145,35788,12126],{"class":155},[145,35790,950],{"class":159},[145,35792,35793,35796,35798],{"class":147,"line":605},[145,35794,35795],{"class":159},"            \"[00:00-00:04] Opening Sequence.",[145,35797,1670],{"class":155},[145,35799,950],{"class":159},[145,35801,35802],{"class":147,"line":611},[145,35803,35804],{"class":159},"            \"Camera starts wide showing @Image1 dancer center stage. LED lights pulse \"\n",[145,35806,35807],{"class":147,"line":617},[145,35808,35809],{"class":159},"            \"in blue and purple. Dancer begins with @Video1 opening choreography — \"\n",[145,35811,35812,35815,35817],{"class":147,"line":623},[145,35813,35814],{"class":159},"            \"fluid arm movements and spins. Camera matches @Video1 initial push-in timing.",[145,35816,12126],{"class":155},[145,35818,950],{"class":159},[145,35820,35821,35824,35826],{"class":147,"line":628},[145,35822,35823],{"class":159},"            \"[00:04-00:08] Dynamic Performance.",[145,35825,1670],{"class":155},[145,35827,950],{"class":159},[145,35829,35830],{"class":147,"line":639},[145,35831,35832],{"class":159},"            \"Camera follows @Video1 rhythmic push-pull pattern as dancer performs high-energy \"\n",[145,35834,35835],{"class":147,"line":654},[145,35836,35837],{"class":159},"            \"moves. Stage lights shift to warm orange and pink. Smoke effects catch the \"\n",[145,35839,35840,35843,35845],{"class":147,"line":660},[145,35841,35842],{"class":159},"            \"colored lighting, creating atmospheric depth.",[145,35844,12126],{"class":155},[145,35846,950],{"class":159},[145,35848,35849,35852,35854],{"class":147,"line":671},[145,35850,35851],{"class":159},"            \"[00:08-00:12] Finale Moment.",[145,35853,1670],{"class":155},[145,35855,950],{"class":159},[145,35857,35858],{"class":147,"line":698},[145,35859,35860],{"class":159},"            \"Camera matches @Video1 final tilt movement as dancer strikes a powerful \"\n",[145,35862,35863],{"class":147,"line":710},[145,35864,35865],{"class":159},"            \"finishing pose. All stage lights converge into a brilliant white spotlight. \"\n",[145,35867,35868,35871,35873],{"class":147,"line":716},[145,35869,35870],{"class":159},"            \"Sparkle effects cascade down around the performer.",[145,35872,12126],{"class":155},[145,35874,950],{"class":159},[145,35876,35877],{"class":147,"line":722},[145,35878,35879],{"class":159},"            \"Maintain @Image1 character appearance exactly. Synchronized camera and \"\n",[145,35881,35882],{"class":147,"line":728},[145,35883,35884],{"class":159},"            \"choreography timing from @Video1. Professional stage lighting effects.\"\n",[145,35886,35887],{"class":147,"line":739},[145,35888,1342],{"class":262},[145,35890,35891,35893,35895,35898],{"class":147,"line":744},[145,35892,2688],{"class":159},[145,35894,10841],{"class":262},[145,35896,35897],{"class":159},"\"https://example.com/stage_dancer.png\"",[145,35899,10847],{"class":262},[145,35901,35902,35904,35906,35909],{"class":147,"line":750},[145,35903,12162],{"class":159},[145,35905,10841],{"class":262},[145,35907,35908],{"class":159},"\"https://example.com/dance_movement_ref.mp4\"",[145,35910,10847],{"class":262},[145,35912,35913,35915,35917,35919],{"class":147,"line":767},[145,35914,1347],{"class":159},[145,35916,437],{"class":262},[145,35918,16408],{"class":155},[145,35920,452],{"class":262},[145,35922,35923,35925,35927],{"class":147,"line":788},[145,35924,1363],{"class":159},[145,35926,437],{"class":262},[145,35928,32790],{"class":159},[145,35930,35931],{"class":147,"line":834},[145,35932,1407],{"class":262},[145,35934,35935],{"class":147,"line":839},[145,35936,406],{"class":262},[145,35938,35939],{"class":147,"line":845},[145,35940,33686],{"class":174},[32395,35942,35944],{"id":35943},"m3-chase-scene-mysterious-figure-in-red-coat","M3: Chase Scene — Mysterious Figure in Red Coat",[11,35946,35947,35949],{},[23,35948,33448],{}," Creates an intense chase sequence through urban streets with a mysterious figure in a red coat, demonstrating thriller cinematography and dramatic tension building.",[56,35951,60,35952],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,35953],{"src":25985,"type":65},[136,35955,35957],{"className":338,"code":35956,"language":340,"meta":141,"style":141},"# M3: Chase Scene — uses setup from first example above\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as character reference — mysterious figure in distinctive red coat.\\n\"\n            \"【Style】Thriller cinematography, urban chase scene, dramatic shadows, high contrast.\\n\"\n            \"【Duration】12 seconds\\n\\n\"\n            \"[00:00-00:04] Shot 1: The Pursuit Begins (Wide Shot, Tracking).\\n\"\n            \"The red-coated figure sprints through narrow city alleyways at night. \"\n            \"Streetlights cast long dramatic shadows. Camera tracks from behind — we \"\n            \"see only the billowing red coat and rapid footsteps on wet pavement. \"\n            \"Tension-building audio undertones.\\n\\n\"\n            \"[00:04-00:08] Shot 2: Urban Obstacles (Medium Shot, Side Tracking).\\n\"\n            \"Figure vaults over parked cars and dodges between concrete pillars. Camera \"\n            \"follows from the side, maintaining speed. Red coat stands out against the \"\n            \"monochrome urban environment. Breathing is audible and labored.\\n\\n\"\n            \"[00:08-00:12] Shot 3: The Escape (Low Angle, Wide Shot).\\n\"\n            \"Figure reaches a fire escape and begins climbing rapidly upward. Camera \"\n            \"tilts up from below — dramatic low angle emphasizes the vertical escape. \"\n            \"Red coat flutters in the wind. City lights twinkle in the background as \"\n            \"the figure disappears into the night.\\n\\n\"\n            \"Maintain @Image1 character appearance — especially the distinctive red coat. \"\n            \"Realistic chase physics. High-contrast noir lighting. Mysterious identity \"\n            \"preserved throughout.\"\n        ),\n        \"image_urls\": [\"https://example.com/red_coat_figure.jpg\"],\n        \"duration\": 12,\n        \"quality\": \"1080p\"\n    }\n)\n# Poll with the same while loop from the first example\n",[28,35958,35959,35964,35972,35984,36006,36014,36024,36030,36039,36048,36056,36065,36070,36075,36080,36089,36098,36103,36108,36117,36126,36131,36136,36141,36150,36155,36160,36165,36169,36180,36190,36198,36202,36206],{"__ignoreMap":141},[145,35960,35961],{"class":147,"line":148},[145,35962,35963],{"class":174},"# M3: Chase Scene — uses setup from first example above\n",[145,35965,35966,35968,35970],{"class":147,"line":166},[145,35967,6529],{"class":262},[145,35969,266],{"class":258},[145,35971,1432],{"class":262},[145,35973,35974,35976,35978,35980,35982],{"class":147,"line":178},[145,35975,6538],{"class":258},[145,35977,449],{"class":159},[145,35979,679],{"class":155},[145,35981,1444],{"class":159},[145,35983,452],{"class":262},[145,35985,35986,35988,35990,35992,35994,35996,35998,36000,36002,36004],{"class":147,"line":187},[145,35987,6551],{"class":701},[145,35989,266],{"class":258},[145,35991,685],{"class":262},[145,35993,31543],{"class":159},[145,35995,437],{"class":262},[145,35997,440],{"class":258},[145,35999,443],{"class":159},[145,36001,446],{"class":155},[145,36003,449],{"class":159},[145,36005,19590],{"class":262},[145,36007,36008,36010,36012],{"class":147,"line":373},[145,36009,6562],{"class":701},[145,36011,266],{"class":258},[145,36013,1865],{"class":262},[145,36015,36016,36018,36020,36022],{"class":147,"line":379},[145,36017,1303],{"class":159},[145,36019,437],{"class":262},[145,36021,1308],{"class":159},[145,36023,452],{"class":262},[145,36025,36026,36028],{"class":147,"line":385},[145,36027,1319],{"class":159},[145,36029,1322],{"class":262},[145,36031,36032,36035,36037],{"class":147,"line":409},[145,36033,36034],{"class":159},"            \"@Image1 as character reference — mysterious figure in distinctive red coat.",[145,36036,1670],{"class":155},[145,36038,950],{"class":159},[145,36040,36041,36044,36046],{"class":147,"line":420},[145,36042,36043],{"class":159},"            \"【Style】Thriller cinematography, urban chase scene, dramatic shadows, high contrast.",[145,36045,1670],{"class":155},[145,36047,950],{"class":159},[145,36049,36050,36052,36054],{"class":147,"line":431},[145,36051,33543],{"class":159},[145,36053,12126],{"class":155},[145,36055,950],{"class":159},[145,36057,36058,36061,36063],{"class":147,"line":455},[145,36059,36060],{"class":159},"            \"[00:00-00:04] Shot 1: The Pursuit Begins (Wide Shot, Tracking).",[145,36062,1670],{"class":155},[145,36064,950],{"class":159},[145,36066,36067],{"class":147,"line":466},[145,36068,36069],{"class":159},"            \"The red-coated figure sprints through narrow city alleyways at night. \"\n",[145,36071,36072],{"class":147,"line":600},[145,36073,36074],{"class":159},"            \"Streetlights cast long dramatic shadows. Camera tracks from behind — we \"\n",[145,36076,36077],{"class":147,"line":605},[145,36078,36079],{"class":159},"            \"see only the billowing red coat and rapid footsteps on wet pavement. \"\n",[145,36081,36082,36085,36087],{"class":147,"line":611},[145,36083,36084],{"class":159},"            \"Tension-building audio undertones.",[145,36086,12126],{"class":155},[145,36088,950],{"class":159},[145,36090,36091,36094,36096],{"class":147,"line":617},[145,36092,36093],{"class":159},"            \"[00:04-00:08] Shot 2: Urban Obstacles (Medium Shot, Side Tracking).",[145,36095,1670],{"class":155},[145,36097,950],{"class":159},[145,36099,36100],{"class":147,"line":623},[145,36101,36102],{"class":159},"            \"Figure vaults over parked cars and dodges between concrete pillars. Camera \"\n",[145,36104,36105],{"class":147,"line":628},[145,36106,36107],{"class":159},"            \"follows from the side, maintaining speed. Red coat stands out against the \"\n",[145,36109,36110,36113,36115],{"class":147,"line":639},[145,36111,36112],{"class":159},"            \"monochrome urban environment. Breathing is audible and labored.",[145,36114,12126],{"class":155},[145,36116,950],{"class":159},[145,36118,36119,36122,36124],{"class":147,"line":654},[145,36120,36121],{"class":159},"            \"[00:08-00:12] Shot 3: The Escape (Low Angle, Wide Shot).",[145,36123,1670],{"class":155},[145,36125,950],{"class":159},[145,36127,36128],{"class":147,"line":660},[145,36129,36130],{"class":159},"            \"Figure reaches a fire escape and begins climbing rapidly upward. Camera \"\n",[145,36132,36133],{"class":147,"line":671},[145,36134,36135],{"class":159},"            \"tilts up from below — dramatic low angle emphasizes the vertical escape. \"\n",[145,36137,36138],{"class":147,"line":698},[145,36139,36140],{"class":159},"            \"Red coat flutters in the wind. City lights twinkle in the background as \"\n",[145,36142,36143,36146,36148],{"class":147,"line":710},[145,36144,36145],{"class":159},"            \"the figure disappears into the night.",[145,36147,12126],{"class":155},[145,36149,950],{"class":159},[145,36151,36152],{"class":147,"line":716},[145,36153,36154],{"class":159},"            \"Maintain @Image1 character appearance — especially the distinctive red coat. \"\n",[145,36156,36157],{"class":147,"line":722},[145,36158,36159],{"class":159},"            \"Realistic chase physics. High-contrast noir lighting. Mysterious identity \"\n",[145,36161,36162],{"class":147,"line":728},[145,36163,36164],{"class":159},"            \"preserved throughout.\"\n",[145,36166,36167],{"class":147,"line":739},[145,36168,1342],{"class":262},[145,36170,36171,36173,36175,36178],{"class":147,"line":744},[145,36172,2688],{"class":159},[145,36174,10841],{"class":262},[145,36176,36177],{"class":159},"\"https://example.com/red_coat_figure.jpg\"",[145,36179,10847],{"class":262},[145,36181,36182,36184,36186,36188],{"class":147,"line":750},[145,36183,1347],{"class":159},[145,36185,437],{"class":262},[145,36187,16408],{"class":155},[145,36189,452],{"class":262},[145,36191,36192,36194,36196],{"class":147,"line":767},[145,36193,1363],{"class":159},[145,36195,437],{"class":262},[145,36197,32790],{"class":159},[145,36199,36200],{"class":147,"line":788},[145,36201,1407],{"class":262},[145,36203,36204],{"class":147,"line":834},[145,36205,406],{"class":262},[145,36207,36208],{"class":147,"line":839},[145,36209,33686],{"class":174},[32395,36211,36213],{"id":36212},"bonus-street-crowd-chase-scene","Bonus: Street Crowd Chase Scene",[11,36215,36216,36218],{},[23,36217,33448],{}," An additional example showing a crowd running scene, perfect for action sequences requiring multiple characters and urban energy.",[56,36220,60,36221],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,36222],{"src":36223,"type":65},"https://cdn.evolink.ai/seedance2api/%E8%A1%97%E5%A4%B4%E4%B8%80%E5%A0%86%E4%BA%BA%E5%9C%A8%E8%B7%91.mp4",[136,36225,36227],{"className":338,"code":36226,"language":340,"meta":141,"style":141},"# Bonus: Street Crowd Chase — uses setup from first example above\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"@Image1 as scene reference for crowd composition and urban environment.\\n\"\n            \"【Style】Action thriller, handheld camera, urgent pacing, realistic movement.\\n\"\n            \"【Duration】8 seconds\\n\\n\"\n            \"[00:00-00:03] Mass Movement Begins.\\n\"\n            \"A crowd of people suddenly breaks into a run down a busy street. Camera \"\n            \"is handheld, in the middle of the action. Multiple individuals in different \"\n            \"clothing all moving in the same direction with urgent purpose.\\n\\n\"\n            \"[00:03-00:06] Chaos and Urgency.\\n\"\n            \"Camera weaves through the running crowd. Close-ups on determined faces, \"\n            \"flying hair, scattered personal items. People help each other maintain \"\n            \"pace. Urban storefronts blur past in the background.\\n\\n\"\n            \"[00:06-00:08] Dispersal.\\n\"\n            \"The crowd reaches an intersection and scatters in different directions. \"\n            \"Camera tilts up to show the scope of the mass movement from a high angle \"\n            \"as people disappear down various streets.\\n\\n\"\n            \"Realistic crowd physics and natural human movement. Handheld camera shake \"\n            \"for authenticity. Urban street environment based on @Image1.\"\n        ),\n        \"image_urls\": [\"https://example.com/street_crowd.jpg\"],\n        \"duration\": 8,\n        \"quality\": \"1080p\"\n    }\n)\n# Poll with the same while loop from the first example\n",[28,36228,36229,36234,36242,36254,36276,36284,36294,36300,36309,36318,36327,36336,36341,36346,36355,36364,36369,36374,36383,36392,36397,36402,36411,36416,36421,36425,36436,36446,36454,36458,36462],{"__ignoreMap":141},[145,36230,36231],{"class":147,"line":148},[145,36232,36233],{"class":174},"# Bonus: Street Crowd Chase — uses setup from first example above\n",[145,36235,36236,36238,36240],{"class":147,"line":166},[145,36237,6529],{"class":262},[145,36239,266],{"class":258},[145,36241,1432],{"class":262},[145,36243,36244,36246,36248,36250,36252],{"class":147,"line":178},[145,36245,6538],{"class":258},[145,36247,449],{"class":159},[145,36249,679],{"class":155},[145,36251,1444],{"class":159},[145,36253,452],{"class":262},[145,36255,36256,36258,36260,36262,36264,36266,36268,36270,36272,36274],{"class":147,"line":187},[145,36257,6551],{"class":701},[145,36259,266],{"class":258},[145,36261,685],{"class":262},[145,36263,31543],{"class":159},[145,36265,437],{"class":262},[145,36267,440],{"class":258},[145,36269,443],{"class":159},[145,36271,446],{"class":155},[145,36273,449],{"class":159},[145,36275,19590],{"class":262},[145,36277,36278,36280,36282],{"class":147,"line":373},[145,36279,6562],{"class":701},[145,36281,266],{"class":258},[145,36283,1865],{"class":262},[145,36285,36286,36288,36290,36292],{"class":147,"line":379},[145,36287,1303],{"class":159},[145,36289,437],{"class":262},[145,36291,1308],{"class":159},[145,36293,452],{"class":262},[145,36295,36296,36298],{"class":147,"line":385},[145,36297,1319],{"class":159},[145,36299,1322],{"class":262},[145,36301,36302,36305,36307],{"class":147,"line":409},[145,36303,36304],{"class":159},"            \"@Image1 as scene reference for crowd composition and urban environment.",[145,36306,1670],{"class":155},[145,36308,950],{"class":159},[145,36310,36311,36314,36316],{"class":147,"line":420},[145,36312,36313],{"class":159},"            \"【Style】Action thriller, handheld camera, urgent pacing, realistic movement.",[145,36315,1670],{"class":155},[145,36317,950],{"class":159},[145,36319,36320,36323,36325],{"class":147,"line":431},[145,36321,36322],{"class":159},"            \"【Duration】8 seconds",[145,36324,12126],{"class":155},[145,36326,950],{"class":159},[145,36328,36329,36332,36334],{"class":147,"line":455},[145,36330,36331],{"class":159},"            \"[00:00-00:03] Mass Movement Begins.",[145,36333,1670],{"class":155},[145,36335,950],{"class":159},[145,36337,36338],{"class":147,"line":466},[145,36339,36340],{"class":159},"            \"A crowd of people suddenly breaks into a run down a busy street. Camera \"\n",[145,36342,36343],{"class":147,"line":600},[145,36344,36345],{"class":159},"            \"is handheld, in the middle of the action. Multiple individuals in different \"\n",[145,36347,36348,36351,36353],{"class":147,"line":605},[145,36349,36350],{"class":159},"            \"clothing all moving in the same direction with urgent purpose.",[145,36352,12126],{"class":155},[145,36354,950],{"class":159},[145,36356,36357,36360,36362],{"class":147,"line":611},[145,36358,36359],{"class":159},"            \"[00:03-00:06] Chaos and Urgency.",[145,36361,1670],{"class":155},[145,36363,950],{"class":159},[145,36365,36366],{"class":147,"line":617},[145,36367,36368],{"class":159},"            \"Camera weaves through the running crowd. Close-ups on determined faces, \"\n",[145,36370,36371],{"class":147,"line":623},[145,36372,36373],{"class":159},"            \"flying hair, scattered personal items. People help each other maintain \"\n",[145,36375,36376,36379,36381],{"class":147,"line":628},[145,36377,36378],{"class":159},"            \"pace. Urban storefronts blur past in the background.",[145,36380,12126],{"class":155},[145,36382,950],{"class":159},[145,36384,36385,36388,36390],{"class":147,"line":639},[145,36386,36387],{"class":159},"            \"[00:06-00:08] Dispersal.",[145,36389,1670],{"class":155},[145,36391,950],{"class":159},[145,36393,36394],{"class":147,"line":654},[145,36395,36396],{"class":159},"            \"The crowd reaches an intersection and scatters in different directions. \"\n",[145,36398,36399],{"class":147,"line":660},[145,36400,36401],{"class":159},"            \"Camera tilts up to show the scope of the mass movement from a high angle \"\n",[145,36403,36404,36407,36409],{"class":147,"line":671},[145,36405,36406],{"class":159},"            \"as people disappear down various streets.",[145,36408,12126],{"class":155},[145,36410,950],{"class":159},[145,36412,36413],{"class":147,"line":698},[145,36414,36415],{"class":159},"            \"Realistic crowd physics and natural human movement. Handheld camera shake \"\n",[145,36417,36418],{"class":147,"line":710},[145,36419,36420],{"class":159},"            \"for authenticity. Urban street environment based on @Image1.\"\n",[145,36422,36423],{"class":147,"line":716},[145,36424,1342],{"class":262},[145,36426,36427,36429,36431,36434],{"class":147,"line":722},[145,36428,2688],{"class":159},[145,36430,10841],{"class":262},[145,36432,36433],{"class":159},"\"https://example.com/street_crowd.jpg\"",[145,36435,10847],{"class":262},[145,36437,36438,36440,36442,36444],{"class":147,"line":728},[145,36439,1347],{"class":159},[145,36441,437],{"class":262},[145,36443,3698],{"class":155},[145,36445,452],{"class":262},[145,36447,36448,36450,36452],{"class":147,"line":739},[145,36449,1363],{"class":159},[145,36451,437],{"class":262},[145,36453,32790],{"class":159},[145,36455,36456],{"class":147,"line":744},[145,36457,1407],{"class":262},[145,36459,36460],{"class":147,"line":750},[145,36461,406],{"class":262},[145,36463,36464],{"class":147,"line":767},[145,36465,33686],{"class":174},[92,36467,36469],{"id":36468},"video-extension-templates","Video Extension Templates",[32395,36471,36473],{"id":36472},"e1-forward-extension-with-brand-finale","E1: Forward Extension with Brand Finale",[11,36475,36476,36478],{},[23,36477,33448],{}," Extends an existing video by adding new scenes and a professional brand conclusion with logo and tagline.",[136,36480,36482],{"className":338,"code":36481,"language":340,"meta":141,"style":141},"# E1: Forward Extension — uses setup from first example above\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Extend @Video1 forward with 8 additional seconds.\\n\"\n            \"【Style】Match @Video1 style exactly.\\n\"\n            \"【Duration】8 seconds extension\\n\\n\"\n            \"Continue the existing narrative: if it ends with product showcase, add lifestyle usage scene. \"\n            \"Show the product being used in natural environment with satisfied users. \"\n            \"Final 2 seconds: elegant brand logo animation with company tagline appearing below. \"\n            \"Maintain consistent lighting and color grading throughout. \"\n            \"Smooth transition from original content to extension.\"\n        ),\n        \"video_urls\": [\"https://example.com/existing_video.mp4\"],\n        \"duration\": 8,\n        \"quality\": \"1080p\"\n    }\n)\n# Poll with the same while loop from the first example\n",[28,36483,36484,36489,36497,36509,36531,36539,36549,36555,36564,36573,36582,36587,36592,36597,36602,36607,36611,36622,36632,36640,36644,36648],{"__ignoreMap":141},[145,36485,36486],{"class":147,"line":148},[145,36487,36488],{"class":174},"# E1: Forward Extension — uses setup from first example above\n",[145,36490,36491,36493,36495],{"class":147,"line":166},[145,36492,6529],{"class":262},[145,36494,266],{"class":258},[145,36496,1432],{"class":262},[145,36498,36499,36501,36503,36505,36507],{"class":147,"line":178},[145,36500,6538],{"class":258},[145,36502,449],{"class":159},[145,36504,679],{"class":155},[145,36506,1444],{"class":159},[145,36508,452],{"class":262},[145,36510,36511,36513,36515,36517,36519,36521,36523,36525,36527,36529],{"class":147,"line":187},[145,36512,6551],{"class":701},[145,36514,266],{"class":258},[145,36516,685],{"class":262},[145,36518,31543],{"class":159},[145,36520,437],{"class":262},[145,36522,440],{"class":258},[145,36524,443],{"class":159},[145,36526,446],{"class":155},[145,36528,449],{"class":159},[145,36530,19590],{"class":262},[145,36532,36533,36535,36537],{"class":147,"line":373},[145,36534,6562],{"class":701},[145,36536,266],{"class":258},[145,36538,1865],{"class":262},[145,36540,36541,36543,36545,36547],{"class":147,"line":379},[145,36542,1303],{"class":159},[145,36544,437],{"class":262},[145,36546,1308],{"class":159},[145,36548,452],{"class":262},[145,36550,36551,36553],{"class":147,"line":385},[145,36552,1319],{"class":159},[145,36554,1322],{"class":262},[145,36556,36557,36560,36562],{"class":147,"line":409},[145,36558,36559],{"class":159},"            \"Extend @Video1 forward with 8 additional seconds.",[145,36561,1670],{"class":155},[145,36563,950],{"class":159},[145,36565,36566,36569,36571],{"class":147,"line":420},[145,36567,36568],{"class":159},"            \"【Style】Match @Video1 style exactly.",[145,36570,1670],{"class":155},[145,36572,950],{"class":159},[145,36574,36575,36578,36580],{"class":147,"line":431},[145,36576,36577],{"class":159},"            \"【Duration】8 seconds extension",[145,36579,12126],{"class":155},[145,36581,950],{"class":159},[145,36583,36584],{"class":147,"line":455},[145,36585,36586],{"class":159},"            \"Continue the existing narrative: if it ends with product showcase, add lifestyle usage scene. \"\n",[145,36588,36589],{"class":147,"line":466},[145,36590,36591],{"class":159},"            \"Show the product being used in natural environment with satisfied users. \"\n",[145,36593,36594],{"class":147,"line":600},[145,36595,36596],{"class":159},"            \"Final 2 seconds: elegant brand logo animation with company tagline appearing below. \"\n",[145,36598,36599],{"class":147,"line":605},[145,36600,36601],{"class":159},"            \"Maintain consistent lighting and color grading throughout. \"\n",[145,36603,36604],{"class":147,"line":611},[145,36605,36606],{"class":159},"            \"Smooth transition from original content to extension.\"\n",[145,36608,36609],{"class":147,"line":617},[145,36610,1342],{"class":262},[145,36612,36613,36615,36617,36620],{"class":147,"line":623},[145,36614,12162],{"class":159},[145,36616,10841],{"class":262},[145,36618,36619],{"class":159},"\"https://example.com/existing_video.mp4\"",[145,36621,10847],{"class":262},[145,36623,36624,36626,36628,36630],{"class":147,"line":628},[145,36625,1347],{"class":159},[145,36627,437],{"class":262},[145,36629,3698],{"class":155},[145,36631,452],{"class":262},[145,36633,36634,36636,36638],{"class":147,"line":639},[145,36635,1363],{"class":159},[145,36637,437],{"class":262},[145,36639,32790],{"class":159},[145,36641,36642],{"class":147,"line":654},[145,36643,1407],{"class":262},[145,36645,36646],{"class":147,"line":660},[145,36647,406],{"class":262},[145,36649,36650],{"class":147,"line":671},[145,36651,33686],{"class":174},[32395,36653,36655],{"id":36654},"e2-backward-extension-with-backstory","E2: Backward Extension with Backstory",[11,36657,36658,36660],{},[23,36659,33448],{}," Adds context and setup before the existing video content, creating a more complete narrative.",[136,36662,36664],{"className":338,"code":36663,"language":340,"meta":141,"style":141},"# E2: Backward Extension — uses setup from first example above\nresponse = requests.post(\n    f\"{BASE_URL}/videos/generations\",\n    headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": (\n            \"Create 6 seconds of backstory before @Video1 begins.\\n\"\n            \"【Style】Match @Video1 visual style exactly.\\n\"\n            \"【Duration】6 seconds extension\\n\\n\"\n            \"If @Video1 shows action, show the calm setup or preparation moment. \"\n            \"If @Video1 shows a reveal, show the mystery or anticipation beforehand. \"\n            \"Match the visual style, lighting, and character appearances exactly. \"\n            \"Create narrative tension that builds toward the existing video's opening moment. \"\n            \"Seamless transition into original content.\"\n        ),\n        \"video_urls\": [\"https://example.com/main_video.mp4\"],\n        \"duration\": 6,\n        \"quality\": \"1080p\"\n    }\n)\n# Poll with the same while loop from the first example\n",[28,36665,36666,36671,36679,36691,36713,36721,36731,36737,36746,36755,36764,36769,36774,36779,36784,36789,36793,36804,36814,36822,36826,36830],{"__ignoreMap":141},[145,36667,36668],{"class":147,"line":148},[145,36669,36670],{"class":174},"# E2: Backward Extension — uses setup from first example above\n",[145,36672,36673,36675,36677],{"class":147,"line":166},[145,36674,6529],{"class":262},[145,36676,266],{"class":258},[145,36678,1432],{"class":262},[145,36680,36681,36683,36685,36687,36689],{"class":147,"line":178},[145,36682,6538],{"class":258},[145,36684,449],{"class":159},[145,36686,679],{"class":155},[145,36688,1444],{"class":159},[145,36690,452],{"class":262},[145,36692,36693,36695,36697,36699,36701,36703,36705,36707,36709,36711],{"class":147,"line":187},[145,36694,6551],{"class":701},[145,36696,266],{"class":258},[145,36698,685],{"class":262},[145,36700,31543],{"class":159},[145,36702,437],{"class":262},[145,36704,440],{"class":258},[145,36706,443],{"class":159},[145,36708,446],{"class":155},[145,36710,449],{"class":159},[145,36712,19590],{"class":262},[145,36714,36715,36717,36719],{"class":147,"line":373},[145,36716,6562],{"class":701},[145,36718,266],{"class":258},[145,36720,1865],{"class":262},[145,36722,36723,36725,36727,36729],{"class":147,"line":379},[145,36724,1303],{"class":159},[145,36726,437],{"class":262},[145,36728,1308],{"class":159},[145,36730,452],{"class":262},[145,36732,36733,36735],{"class":147,"line":385},[145,36734,1319],{"class":159},[145,36736,1322],{"class":262},[145,36738,36739,36742,36744],{"class":147,"line":409},[145,36740,36741],{"class":159},"            \"Create 6 seconds of backstory before @Video1 begins.",[145,36743,1670],{"class":155},[145,36745,950],{"class":159},[145,36747,36748,36751,36753],{"class":147,"line":420},[145,36749,36750],{"class":159},"            \"【Style】Match @Video1 visual style exactly.",[145,36752,1670],{"class":155},[145,36754,950],{"class":159},[145,36756,36757,36760,36762],{"class":147,"line":431},[145,36758,36759],{"class":159},"            \"【Duration】6 seconds extension",[145,36761,12126],{"class":155},[145,36763,950],{"class":159},[145,36765,36766],{"class":147,"line":455},[145,36767,36768],{"class":159},"            \"If @Video1 shows action, show the calm setup or preparation moment. \"\n",[145,36770,36771],{"class":147,"line":466},[145,36772,36773],{"class":159},"            \"If @Video1 shows a reveal, show the mystery or anticipation beforehand. \"\n",[145,36775,36776],{"class":147,"line":600},[145,36777,36778],{"class":159},"            \"Match the visual style, lighting, and character appearances exactly. \"\n",[145,36780,36781],{"class":147,"line":605},[145,36782,36783],{"class":159},"            \"Create narrative tension that builds toward the existing video's opening moment. \"\n",[145,36785,36786],{"class":147,"line":611},[145,36787,36788],{"class":159},"            \"Seamless transition into original content.\"\n",[145,36790,36791],{"class":147,"line":617},[145,36792,1342],{"class":262},[145,36794,36795,36797,36799,36802],{"class":147,"line":623},[145,36796,12162],{"class":159},[145,36798,10841],{"class":262},[145,36800,36801],{"class":159},"\"https://example.com/main_video.mp4\"",[145,36803,10847],{"class":262},[145,36805,36806,36808,36810,36812],{"class":147,"line":628},[145,36807,1347],{"class":159},[145,36809,437],{"class":262},[145,36811,33360],{"class":155},[145,36813,452],{"class":262},[145,36815,36816,36818,36820],{"class":147,"line":639},[145,36817,1363],{"class":159},[145,36819,437],{"class":262},[145,36821,32790],{"class":159},[145,36823,36824],{"class":147,"line":654},[145,36825,1407],{"class":262},[145,36827,36828],{"class":147,"line":660},[145,36829,406],{"class":262},[145,36831,36832],{"class":147,"line":671},[145,36833,33686],{"class":174},[18,36835,36836],{},[11,36837,36838],{},[37,36839,36841],{"href":211,"rel":36840},[41],"Run these advanced templates with your EvoLink API key. Sign up free →",[45,36843],{},[48,36845,36847],{"id":36846},"common-seedance-prompt-mistakes-and-how-to-fix-them","Common Seedance Prompt Mistakes and How to Fix Them",[2036,36849,36850,36866],{},[2039,36851,36852],{},[2042,36853,36854,36857,36860,36863],{},[2045,36855,36856],{},"#",[2045,36858,36859],{},"Mistake",[2045,36861,36862],{},"Why It Fails",[2045,36864,36865],{},"Fix",[2052,36867,36868,36884,36903,36925,36941,36957,36973,36989,37005,37021],{},[2042,36869,36870,36872,36878,36881],{},[2057,36871,5437],{},[2057,36873,36874,36877],{},[23,36875,36876],{},"Too vague"," — \"A nice video of a dog\"",[2057,36879,36880],{},"Model guesses breed, action, camera, style",[2057,36882,36883],{},"\"A golden retriever catches a frisbee mid-air, slow-motion side angle, park setting, sunny\"",[2042,36885,36886,36888,36897,36900],{},[2057,36887,5418],{},[2057,36889,36890,36893,36894,36896],{},[23,36891,36892],{},"Wrong @tag numbering"," — Using ",[28,36895,2921],{}," when only 2 images uploaded",[2057,36898,36899],{},"Tag references a non-existent file; generation fails or ignores it",[2057,36901,36902],{},"Double-check upload order; tags start at 1 and increment per type",[2042,36904,36905,36907,36913,36916],{},[2057,36906,5056],{},[2057,36908,36909,36912],{},[23,36910,36911],{},"Missing constraints"," — No duration or resolution specified",[2057,36914,36915],{},"Model defaults may not match your needs",[2057,36917,36918,36919,2959,36921,36924],{},"Always specify ",[28,36920,1774],{},[28,36922,36923],{},"resolution"," in both prompt text and API parameters",[2042,36926,36927,36929,36935,36938],{},[2057,36928,3998],{},[2057,36930,36931,36934],{},[23,36932,36933],{},"Conflicting modalities"," — Image shows daytime, prompt says \"dark night scene\"",[2057,36936,36937],{},"Model gets mixed signals, produces inconsistent lighting",[2057,36939,36940],{},"Align prompt descriptions with reference content",[2042,36942,36943,36945,36951,36954],{},[2057,36944,1352],{},[2057,36946,36947,36950],{},[23,36948,36949],{},"Overloaded prompt"," — 200+ words describing every micro-detail",[2057,36952,36953],{},"Model prioritizes poorly; key instructions get diluted",[2057,36955,36956],{},"Keep prompts under 150 words; use references for visual details instead of text",[2042,36958,36959,36961,36967,36970],{},[2057,36960,33360],{},[2057,36962,36963,36966],{},[23,36964,36965],{},"No camera direction"," — Prompt describes scene but not how camera moves",[2057,36968,36969],{},"Static or randomly moving output",[2057,36971,36972],{},"Add explicit camera instruction: \"slow dolly-in\" or \"static wide shot\"",[2042,36974,36975,36977,36983,36986],{},[2057,36976,33392],{},[2057,36978,36979,36982],{},[23,36980,36981],{},"Realistic face uploads"," — Uploading real human face photos",[2057,36984,36985],{},"Blocked by compliance filters; request rejected",[2057,36987,36988],{},"Use illustrated, stylized, or non-photorealistic character references",[2042,36990,36991,36993,36999,37002],{},[2057,36992,3698],{},[2057,36994,36995,36998],{},[23,36996,36997],{},"Exceeding file limits"," — Uploading 10 images",[2057,37000,37001],{},"Max is 9 images; request rejected",[2057,37003,37004],{},"Stay within limits: ≤9 images, ≤3 videos, ≤3 audio, ≤12 total",[2042,37006,37007,37009,37015,37018],{},[2057,37008,30614],{},[2057,37010,37011,37014],{},[23,37012,37013],{},"No style anchor"," — Using generic \"cinematic\" instead of a specific reference",[2057,37016,37017],{},"Output looks generic and unfocused",[2057,37019,37020],{},"Anchor to a specific director, film, or art style: \"Denis Villeneuve sci-fi epic\" or \"Van Gogh post-impressionism\"",[2042,37022,37023,37025,37031,37034],{},[2057,37024,537],{},[2057,37026,37027,37030],{},[23,37028,37029],{},"No timecodes"," — Writing prose instead of structured shot scripts",[2057,37032,37033],{},"Actions distributed unpredictably across the duration",[2057,37035,37036,37037,37039],{},"Use ",[28,37038,32371],{}," timecodes to control exactly when each action happens",[11,37041,37042,37043,493],{},"For detailed error handling patterns and retry logic, see the ",[37,37044,37045],{"href":14385},"API documentation",[45,37047],{},[48,37049,37051],{"id":37050},"prompt-engineering-best-practices-for-api-developers","Prompt Engineering Best Practices for API Developers",[92,37053,37055],{"id":37054},"templatize-prompts-for-batch-generation","Templatize Prompts for Batch Generation",[11,37057,37058],{},"When generating videos at scale, define reusable prompt templates with variables:",[136,37060,37062],{"className":338,"code":37061,"language":340,"meta":141,"style":141},"PRODUCT_TEMPLATE = (\n    \"@Image1 as first frame.\\n\"\n    \"【Style】{style}\\n\"\n    \"【Duration】{duration} seconds\\n\\n\"\n    \"[00:00-00:03] Product slowly begins rotating clockwise. \"\n    \"{lighting_description}. Every texture detail remains razor-sharp.\\n\\n\"\n    \"[00:03-00:06] Rotation continues to 180 degrees. Camera subtly lowers angle \"\n    \"to reveal the product's profile.\\n\\n\"\n    \"[00:06-{end_tc}] Rotation slows to a stop at the most photogenic angle. \"\n    \"Clean, minimal, premium.\\n\\n\"\n    \"Maintain exact product proportions from @Image1. {background}. Commercial-grade lighting.\"\n)\n\n# Generate multiple product videos\nproducts = [\n    {\"style\": \"Clean white infinity cove, premium commercial\",\n     \"duration\": 8, \"end_tc\": \"00:08\",\n     \"lighting_description\": \"Soft studio lighting creates a gentle gradient\",\n     \"background\": \"White background throughout\"},\n    {\"style\": \"Warm wooden surface, artisan craft aesthetic\",\n     \"duration\": 10, \"end_tc\": \"00:10\",\n     \"lighting_description\": \"Warm golden spotlight from above\",\n     \"background\": \"Natural wood grain texture visible\"},\n]\n\nfor product in products:\n    prompt = PRODUCT_TEMPLATE.format(**product)\n    # Submit to API using the prompt...\n",[28,37063,37064,37073,37082,37092,37107,37112,37127,37132,37141,37152,37161,37172,37176,37180,37185,37193,37206,37227,37239,37251,37264,37283,37294,37305,37309,37313,37324,37342],{"__ignoreMap":141},[145,37065,37066,37069,37071],{"class":147,"line":148},[145,37067,37068],{"class":155},"PRODUCT_TEMPLATE",[145,37070,391],{"class":258},[145,37072,19696],{"class":262},[145,37074,37075,37078,37080],{"class":147,"line":166},[145,37076,37077],{"class":159},"    \"@Image1 as first frame.",[145,37079,1670],{"class":155},[145,37081,950],{"class":159},[145,37083,37084,37087,37090],{"class":147,"line":178},[145,37085,37086],{"class":159},"    \"【Style】",[145,37088,37089],{"class":155},"{style}\\n",[145,37091,950],{"class":159},[145,37093,37094,37097,37100,37103,37105],{"class":147,"line":187},[145,37095,37096],{"class":159},"    \"【Duration】",[145,37098,37099],{"class":155},"{duration}",[145,37101,37102],{"class":159}," seconds",[145,37104,12126],{"class":155},[145,37106,950],{"class":159},[145,37108,37109],{"class":147,"line":373},[145,37110,37111],{"class":159},"    \"[00:00-00:03] Product slowly begins rotating clockwise. \"\n",[145,37113,37114,37117,37120,37123,37125],{"class":147,"line":379},[145,37115,37116],{"class":159},"    \"",[145,37118,37119],{"class":155},"{lighting_description}",[145,37121,37122],{"class":159},". Every texture detail remains razor-sharp.",[145,37124,12126],{"class":155},[145,37126,950],{"class":159},[145,37128,37129],{"class":147,"line":385},[145,37130,37131],{"class":159},"    \"[00:03-00:06] Rotation continues to 180 degrees. Camera subtly lowers angle \"\n",[145,37133,37134,37137,37139],{"class":147,"line":409},[145,37135,37136],{"class":159},"    \"to reveal the product's profile.",[145,37138,12126],{"class":155},[145,37140,950],{"class":159},[145,37142,37143,37146,37149],{"class":147,"line":420},[145,37144,37145],{"class":159},"    \"[00:06-",[145,37147,37148],{"class":155},"{end_tc}",[145,37150,37151],{"class":159},"] Rotation slows to a stop at the most photogenic angle. \"\n",[145,37153,37154,37157,37159],{"class":147,"line":431},[145,37155,37156],{"class":159},"    \"Clean, minimal, premium.",[145,37158,12126],{"class":155},[145,37160,950],{"class":159},[145,37162,37163,37166,37169],{"class":147,"line":455},[145,37164,37165],{"class":159},"    \"Maintain exact product proportions from @Image1. ",[145,37167,37168],{"class":155},"{background}",[145,37170,37171],{"class":159},". Commercial-grade lighting.\"\n",[145,37173,37174],{"class":147,"line":466},[145,37175,406],{"class":262},[145,37177,37178],{"class":147,"line":600},[145,37179,376],{"emptyLinePlaceholder":58},[145,37181,37182],{"class":147,"line":605},[145,37183,37184],{"class":174},"# Generate multiple product videos\n",[145,37186,37187,37189,37191],{"class":147,"line":611},[145,37188,28889],{"class":262},[145,37190,266],{"class":258},[145,37192,8867],{"class":262},[145,37194,37195,37197,37199,37201,37204],{"class":147,"line":617},[145,37196,19562],{"class":262},[145,37198,21233],{"class":159},[145,37200,437],{"class":262},[145,37202,37203],{"class":159},"\"Clean white infinity cove, premium commercial\"",[145,37205,452],{"class":262},[145,37207,37208,37211,37213,37215,37217,37220,37222,37225],{"class":147,"line":623},[145,37209,37210],{"class":159},"     \"duration\"",[145,37212,437],{"class":262},[145,37214,3698],{"class":155},[145,37216,400],{"class":262},[145,37218,37219],{"class":159},"\"end_tc\"",[145,37221,437],{"class":262},[145,37223,37224],{"class":159},"\"00:08\"",[145,37226,452],{"class":262},[145,37228,37229,37232,37234,37237],{"class":147,"line":628},[145,37230,37231],{"class":159},"     \"lighting_description\"",[145,37233,437],{"class":262},[145,37235,37236],{"class":159},"\"Soft studio lighting creates a gentle gradient\"",[145,37238,452],{"class":262},[145,37240,37241,37244,37246,37249],{"class":147,"line":639},[145,37242,37243],{"class":159},"     \"background\"",[145,37245,437],{"class":262},[145,37247,37248],{"class":159},"\"White background throughout\"",[145,37250,19590],{"class":262},[145,37252,37253,37255,37257,37259,37262],{"class":147,"line":654},[145,37254,19562],{"class":262},[145,37256,21233],{"class":159},[145,37258,437],{"class":262},[145,37260,37261],{"class":159},"\"Warm wooden surface, artisan craft aesthetic\"",[145,37263,452],{"class":262},[145,37265,37266,37268,37270,37272,37274,37276,37278,37281],{"class":147,"line":660},[145,37267,37210],{"class":159},[145,37269,437],{"class":262},[145,37271,537],{"class":155},[145,37273,400],{"class":262},[145,37275,37219],{"class":159},[145,37277,437],{"class":262},[145,37279,37280],{"class":159},"\"00:10\"",[145,37282,452],{"class":262},[145,37284,37285,37287,37289,37292],{"class":147,"line":671},[145,37286,37231],{"class":159},[145,37288,437],{"class":262},[145,37290,37291],{"class":159},"\"Warm golden spotlight from above\"",[145,37293,452],{"class":262},[145,37295,37296,37298,37300,37303],{"class":147,"line":698},[145,37297,37243],{"class":159},[145,37299,437],{"class":262},[145,37301,37302],{"class":159},"\"Natural wood grain texture visible\"",[145,37304,19590],{"class":262},[145,37306,37307],{"class":147,"line":710},[145,37308,764],{"class":262},[145,37310,37311],{"class":147,"line":716},[145,37312,376],{"emptyLinePlaceholder":58},[145,37314,37315,37317,37320,37322],{"class":147,"line":722},[145,37316,8229],{"class":258},[145,37318,37319],{"class":262}," product ",[145,37321,1180],{"class":258},[145,37323,28979],{"class":262},[145,37325,37326,37329,37331,37334,37337,37339],{"class":147,"line":728},[145,37327,37328],{"class":262},"    prompt ",[145,37330,266],{"class":258},[145,37332,37333],{"class":155}," PRODUCT_TEMPLATE",[145,37335,37336],{"class":262},".format(",[145,37338,16797],{"class":258},[145,37340,37341],{"class":262},"product)\n",[145,37343,37344],{"class":147,"line":739},[145,37345,37346],{"class":174},"    # Submit to API using the prompt...\n",[11,37348,37349],{},"This approach keeps prompts consistent and makes A/B testing straightforward.",[92,37351,37353],{"id":37352},"use-the-shot-script-format-for-complex-scenes","Use the Shot-Script Format for Complex Scenes",[11,37355,37356],{},"For any video longer than 5 seconds or involving multiple actions, use the shot-script format:",[70,37358,37359,37371,37380,37386,37392],{},[73,37360,37361,37364,37365,2959,37368],{},[23,37362,37363],{},"Declare style and duration"," at the top with ",[28,37366,37367],{},"【Style】",[28,37369,37370],{},"【Duration】",[73,37372,37373,37376,37377,37379],{},[23,37374,37375],{},"Break into 3–5 second segments"," with ",[28,37378,32371],{}," timecodes",[73,37381,37382,37385],{},[23,37383,37384],{},"Name each shot"," with its function: \"Shot 1: The Reveal\"",[73,37387,37388,37391],{},[23,37389,37390],{},"Add physics details"," — describe what physically happens (water splashes, dust rises) not abstract concepts",[73,37393,37394,37397],{},[23,37395,37396],{},"End with constraints"," — consistency rules, palette notes, physics requirements",[92,37399,37401],{"id":37400},"maintain-character-consistency-across-generations","Maintain Character Consistency Across Generations",[11,37403,37404],{},"To keep the same character across multiple videos:",[70,37406,37407,37415,37421],{},[73,37408,37409,37412,37413],{},[23,37410,37411],{},"Use the same reference image"," in every request via ",[28,37414,3020],{},[73,37416,37417,37420],{},[23,37418,37419],{},"Include explicit appearance descriptors"," in the prompt — \"same red jacket, short black hair\" — even when using an image reference",[73,37422,37423,37426],{},[23,37424,37425],{},"Generate sequentially"," and use the last frame of video N as the first frame image for video N+1",[11,37428,37429,37430,493],{},"We cover advanced multi-shot consistency patterns — including batch generation and character locking — in the ",[37,37431,37432],{"href":3381},"image-to-video guide",[92,37434,37436],{"id":37435},"optimize-costs","Optimize Costs",[11,37438,37439],{},"Video references increase generation cost compared to text-only or image-only prompts. Use this decision tree:",[97,37441,37442,37447,37453],{},[73,37443,37444,37446],{},[23,37445,30472],{}," — cheapest; use when you need generic scenes or have no reference material",[73,37448,37449,37452],{},[23,37450,37451],{},"Image references"," — moderate cost; use for character/scene consistency",[73,37454,37455,37458],{},[23,37456,37457],{},"Video references"," — highest cost; use only when you specifically need camera replication or motion transfer",[18,37460,37461],{},[11,37462,37463,37464,37468],{},"Exact pricing varies by resolution and duration. Check ",[37,37465,22927],{"href":37466,"rel":37467},"https://evolink.ai/#pricing",[41]," for current rates (as of Feb 2026).",[92,37470,37472],{"id":37471},"version-control-your-prompts","Version-Control Your Prompts",[11,37474,37475],{},"Treat prompts like code. Store them in version control with metadata:",[136,37477,37479],{"className":338,"code":37478,"language":340,"meta":141,"style":141},"PROMPT_REGISTRY = {\n    \"product_hero_v3\": {\n        \"version\": \"3.0\",\n        \"prompt\": \"【Style】Clean white infinity cove...\",\n        \"model\": \"seedance-2.0\",\n        \"duration\": 10,\n        \"test_results\": {\"ctr\": 0.24, \"conversion\": 0.087},\n        \"created\": \"2026-02-19\"\n    }\n}\n",[28,37480,37481,37490,37497,37509,37520,37530,37540,37567,37577,37581],{"__ignoreMap":141},[145,37482,37483,37486,37488],{"class":147,"line":148},[145,37484,37485],{"class":155},"PROMPT_REGISTRY",[145,37487,391],{"class":258},[145,37489,428],{"class":262},[145,37491,37492,37495],{"class":147,"line":166},[145,37493,37494],{"class":159},"    \"product_hero_v3\"",[145,37496,1943],{"class":262},[145,37498,37499,37502,37504,37507],{"class":147,"line":178},[145,37500,37501],{"class":159},"        \"version\"",[145,37503,437],{"class":262},[145,37505,37506],{"class":159},"\"3.0\"",[145,37508,452],{"class":262},[145,37510,37511,37513,37515,37518],{"class":147,"line":187},[145,37512,1319],{"class":159},[145,37514,437],{"class":262},[145,37516,37517],{"class":159},"\"【Style】Clean white infinity cove...\"",[145,37519,452],{"class":262},[145,37521,37522,37524,37526,37528],{"class":147,"line":373},[145,37523,1303],{"class":159},[145,37525,437],{"class":262},[145,37527,1308],{"class":159},[145,37529,452],{"class":262},[145,37531,37532,37534,37536,37538],{"class":147,"line":379},[145,37533,1347],{"class":159},[145,37535,437],{"class":262},[145,37537,537],{"class":155},[145,37539,452],{"class":262},[145,37541,37542,37545,37547,37550,37552,37555,37557,37560,37562,37565],{"class":147,"line":385},[145,37543,37544],{"class":159},"        \"test_results\"",[145,37546,20481],{"class":262},[145,37548,37549],{"class":159},"\"ctr\"",[145,37551,437],{"class":262},[145,37553,37554],{"class":155},"0.24",[145,37556,400],{"class":262},[145,37558,37559],{"class":159},"\"conversion\"",[145,37561,437],{"class":262},[145,37563,37564],{"class":155},"0.087",[145,37566,19590],{"class":262},[145,37568,37569,37572,37574],{"class":147,"line":409},[145,37570,37571],{"class":159},"        \"created\"",[145,37573,437],{"class":262},[145,37575,37576],{"class":159},"\"2026-02-19\"\n",[145,37578,37579],{"class":147,"line":420},[145,37580,1407],{"class":262},[145,37582,37583],{"class":147,"line":431},[145,37584,469],{"class":262},[11,37586,37587],{},"This enables prompt A/B testing and rollback to previous versions if needed.",[92,37589,37591],{"id":37590},"handle-generation-failures-gracefully","Handle Generation Failures Gracefully",[11,37593,37594],{},"Not every prompt succeeds. Build retry logic with exponential backoff:",[136,37596,37598],{"className":338,"code":37597,"language":340,"meta":141,"style":141},"import time\nimport random\n\ndef generate_with_retry(prompt_data, max_retries=3):\n    for attempt in range(max_retries):\n        try:\n            response = requests.post(f\"{BASE_URL}/videos/generations\", \n                                   json=prompt_data, headers=headers)\n            if response.status_code == 200:\n                return response.json()\n        except Exception as e:\n            if attempt == max_retries - 1:\n                raise e\n            time.sleep(2 ** attempt + random.uniform(0, 1))\n    return None\n",[28,37599,37600,37606,37612,37616,37632,37644,37650,37669,37685,37697,37703,37713,37731,37738,37761],{"__ignoreMap":141},[145,37601,37602,37604],{"class":147,"line":148},[145,37603,347],{"class":258},[145,37605,356],{"class":262},[145,37607,37608,37610],{"class":147,"line":166},[145,37609,347],{"class":258},[145,37611,5037],{"class":262},[145,37613,37614],{"class":147,"line":178},[145,37615,376],{"emptyLinePlaceholder":58},[145,37617,37618,37620,37623,37626,37628,37630],{"class":147,"line":187},[145,37619,526],{"class":258},[145,37621,37622],{"class":151}," generate_with_retry",[145,37624,37625],{"class":262},"(prompt_data, max_retries",[145,37627,266],{"class":258},[145,37629,5056],{"class":155},[145,37631,548],{"class":262},[145,37633,37634,37636,37638,37640,37642],{"class":147,"line":373},[145,37635,5119],{"class":258},[145,37637,5122],{"class":262},[145,37639,1180],{"class":258},[145,37641,5127],{"class":155},[145,37643,5130],{"class":262},[145,37645,37646,37648],{"class":147,"line":379},[145,37647,5135],{"class":258},[145,37649,860],{"class":262},[145,37651,37652,37654,37656,37658,37660,37662,37664,37666],{"class":147,"line":385},[145,37653,5142],{"class":262},[145,37655,266],{"class":258},[145,37657,27054],{"class":262},[145,37659,440],{"class":258},[145,37661,449],{"class":159},[145,37663,679],{"class":155},[145,37665,1444],{"class":159},[145,37667,37668],{"class":262},", \n",[145,37670,37671,37674,37676,37679,37681,37683],{"class":147,"line":409},[145,37672,37673],{"class":701},"                                   json",[145,37675,266],{"class":258},[145,37677,37678],{"class":262},"prompt_data, ",[145,37680,17830],{"class":701},[145,37682,266],{"class":258},[145,37684,17835],{"class":262},[145,37686,37687,37689,37691,37693,37695],{"class":147,"line":420},[145,37688,5210],{"class":258},[145,37690,2509],{"class":262},[145,37692,854],{"class":258},[145,37694,2514],{"class":155},[145,37696,860],{"class":262},[145,37698,37699,37701],{"class":147,"line":431},[145,37700,5223],{"class":258},[145,37702,736],{"class":262},[145,37704,37705,37707,37709,37711],{"class":147,"line":455},[145,37706,5534],{"class":258},[145,37708,7062],{"class":155},[145,37710,7065],{"class":258},[145,37712,5652],{"class":262},[145,37714,37715,37717,37719,37721,37724,37727,37729],{"class":147,"line":466},[145,37716,5210],{"class":258},[145,37718,5122],{"class":262},[145,37720,854],{"class":258},[145,37722,37723],{"class":262}," max_retries ",[145,37725,37726],{"class":258},"-",[145,37728,21261],{"class":155},[145,37730,860],{"class":262},[145,37732,37733,37735],{"class":147,"line":600},[145,37734,5335],{"class":258},[145,37736,37737],{"class":262}," e\n",[145,37739,37740,37743,37745,37747,37749,37751,37753,37755,37757,37759],{"class":147,"line":605},[145,37741,37742],{"class":262},"            time.sleep(",[145,37744,5418],{"class":155},[145,37746,5421],{"class":258},[145,37748,5122],{"class":262},[145,37750,5427],{"class":258},[145,37752,5430],{"class":262},[145,37754,783],{"class":155},[145,37756,400],{"class":262},[145,37758,5437],{"class":155},[145,37760,8801],{"class":262},[145,37762,37763,37765],{"class":147,"line":611},[145,37764,1703],{"class":258},[145,37766,11949],{"class":155},[11,37768,37769],{},"Common failure modes:",[97,37771,37772,37778,37784],{},[73,37773,37774,37777],{},[23,37775,37776],{},"Content policy violations"," — often caused by realistic human faces",[73,37779,37780,37783],{},[23,37781,37782],{},"Resource exhaustion"," — retry after a longer delay",[73,37785,37786,37789],{},[23,37787,37788],{},"Invalid @tag references"," — check file upload order",[45,37791],{},[48,37793,37795],{"id":37794},"advanced-techniques-for-pro-users","Advanced Techniques for Pro Users",[92,37797,37799],{"id":37798},"chaining-multiple-generations","Chaining Multiple Generations",[11,37801,37802],{},"Create longer narratives by using the last frame of one video as the first frame of the next:",[136,37804,37806],{"className":338,"code":37805,"language":340,"meta":141,"style":141},"# Step 1: Generate opening scene\nscene1_result = generate_video({\n    \"prompt\": \"A detective enters a dark office...\",\n    \"duration\": 8\n})\n\n# Step 2: Extract last frame and use as first frame for scene 2\nlast_frame = extract_frame(scene1_result[\"video_url\"], timestamp=-1)\n\nscene2_result = generate_video({\n    \"files\": [(\"references\", last_frame)],\n    \"prompt\": \"@Image1 as first frame. The detective discovers a clue...\",\n    \"duration\": 10\n})\n",[28,37807,37808,37813,37823,37834,37842,37847,37851,37856,37880,37884,37893,37907,37918,37926],{"__ignoreMap":141},[145,37809,37810],{"class":147,"line":148},[145,37811,37812],{"class":174},"# Step 1: Generate opening scene\n",[145,37814,37815,37818,37820],{"class":147,"line":166},[145,37816,37817],{"class":262},"scene1_result ",[145,37819,266],{"class":258},[145,37821,37822],{"class":262}," generate_video({\n",[145,37824,37825,37827,37829,37832],{"class":147,"line":178},[145,37826,3681],{"class":159},[145,37828,437],{"class":262},[145,37830,37831],{"class":159},"\"A detective enters a dark office...\"",[145,37833,452],{"class":262},[145,37835,37836,37838,37840],{"class":147,"line":187},[145,37837,3693],{"class":159},[145,37839,437],{"class":262},[145,37841,26106],{"class":155},[145,37843,37844],{"class":147,"line":373},[145,37845,37846],{"class":262},"})\n",[145,37848,37849],{"class":147,"line":379},[145,37850,376],{"emptyLinePlaceholder":58},[145,37852,37853],{"class":147,"line":385},[145,37854,37855],{"class":174},"# Step 2: Extract last frame and use as first frame for scene 2\n",[145,37857,37858,37861,37863,37866,37868,37870,37873,37876,37878],{"class":147,"line":409},[145,37859,37860],{"class":262},"last_frame ",[145,37862,266],{"class":258},[145,37864,37865],{"class":262}," extract_frame(scene1_result[",[145,37867,14953],{"class":159},[145,37869,10755],{"class":262},[145,37871,37872],{"class":701},"timestamp",[145,37874,37875],{"class":258},"=-",[145,37877,5437],{"class":155},[145,37879,406],{"class":262},[145,37881,37882],{"class":147,"line":420},[145,37883,376],{"emptyLinePlaceholder":58},[145,37885,37886,37889,37891],{"class":147,"line":431},[145,37887,37888],{"class":262},"scene2_result ",[145,37890,266],{"class":258},[145,37892,37822],{"class":262},[145,37894,37895,37898,37901,37904],{"class":147,"line":455},[145,37896,37897],{"class":159},"    \"files\"",[145,37899,37900],{"class":262},": [(",[145,37902,37903],{"class":159},"\"references\"",[145,37905,37906],{"class":262},", last_frame)],\n",[145,37908,37909,37911,37913,37916],{"class":147,"line":466},[145,37910,3681],{"class":159},[145,37912,437],{"class":262},[145,37914,37915],{"class":159},"\"@Image1 as first frame. The detective discovers a clue...\"",[145,37917,452],{"class":262},[145,37919,37920,37922,37924],{"class":147,"line":600},[145,37921,3693],{"class":159},[145,37923,437],{"class":262},[145,37925,26154],{"class":155},[145,37927,37928],{"class":147,"line":605},[145,37929,37846],{"class":262},[92,37931,37933],{"id":37932},"dynamic-prompt-generation","Dynamic Prompt Generation",[11,37935,37936],{},"Use AI to generate variations of successful prompts:",[136,37938,37940],{"className":338,"code":37939,"language":340,"meta":141,"style":141},"def generate_prompt_variations(base_prompt, num_variations=3):\n    variations = []\n    for i in range(num_variations):\n        # Use OpenAI/Claude to generate stylistic variations\n        variation = ai_rephrase(base_prompt, style=f\"variation_{i}\")\n        variations.append(variation)\n    return variations\n\n# Test multiple versions for A/B optimization\nbase = \"【Style】Cinematic product showcase...\"\nfor variation in generate_prompt_variations(base):\n    result = generate_video({\"prompt\": variation})\n    # Track performance metrics...\n",[28,37941,37942,37958,37967,37981,37986,38015,38020,38027,38031,38036,38046,38058,38072],{"__ignoreMap":141},[145,37943,37944,37946,37949,37952,37954,37956],{"class":147,"line":148},[145,37945,526],{"class":258},[145,37947,37948],{"class":151}," generate_prompt_variations",[145,37950,37951],{"class":262},"(base_prompt, num_variations",[145,37953,266],{"class":258},[145,37955,5056],{"class":155},[145,37957,548],{"class":262},[145,37959,37960,37963,37965],{"class":147,"line":166},[145,37961,37962],{"class":262},"    variations ",[145,37964,266],{"class":258},[145,37966,5876],{"class":262},[145,37968,37969,37971,37974,37976,37978],{"class":147,"line":178},[145,37970,5119],{"class":258},[145,37972,37973],{"class":262}," i ",[145,37975,1180],{"class":258},[145,37977,5127],{"class":155},[145,37979,37980],{"class":262},"(num_variations):\n",[145,37982,37983],{"class":147,"line":187},[145,37984,37985],{"class":174},"        # Use OpenAI/Claude to generate stylistic variations\n",[145,37987,37988,37991,37993,37996,37998,38000,38002,38005,38007,38009,38011,38013],{"class":147,"line":373},[145,37989,37990],{"class":262},"        variation ",[145,37992,266],{"class":258},[145,37994,37995],{"class":262}," ai_rephrase(base_prompt, ",[145,37997,11217],{"class":701},[145,37999,266],{"class":258},[145,38001,440],{"class":258},[145,38003,38004],{"class":159},"\"variation_",[145,38006,685],{"class":155},[145,38008,6329],{"class":262},[145,38010,691],{"class":155},[145,38012,449],{"class":159},[145,38014,406],{"class":262},[145,38016,38017],{"class":147,"line":379},[145,38018,38019],{"class":262},"        variations.append(variation)\n",[145,38021,38022,38024],{"class":147,"line":385},[145,38023,1703],{"class":258},[145,38025,38026],{"class":262}," variations\n",[145,38028,38029],{"class":147,"line":409},[145,38030,376],{"emptyLinePlaceholder":58},[145,38032,38033],{"class":147,"line":420},[145,38034,38035],{"class":174},"# Test multiple versions for A/B optimization\n",[145,38037,38038,38041,38043],{"class":147,"line":431},[145,38039,38040],{"class":262},"base ",[145,38042,266],{"class":258},[145,38044,38045],{"class":159}," \"【Style】Cinematic product showcase...\"\n",[145,38047,38048,38050,38053,38055],{"class":147,"line":455},[145,38049,8229],{"class":258},[145,38051,38052],{"class":262}," variation ",[145,38054,1180],{"class":258},[145,38056,38057],{"class":262}," generate_prompt_variations(base):\n",[145,38059,38060,38062,38064,38067,38069],{"class":147,"line":466},[145,38061,1618],{"class":262},[145,38063,266],{"class":258},[145,38065,38066],{"class":262}," generate_video({",[145,38068,5921],{"class":159},[145,38070,38071],{"class":262},": variation})\n",[145,38073,38074],{"class":147,"line":600},[145,38075,38076],{"class":174},"    # Track performance metrics...\n",[92,38078,38080],{"id":38079},"automated-quality-assessment","Automated Quality Assessment",[11,38082,38083],{},"Score generated videos automatically before manual review:",[136,38085,38087],{"className":338,"code":38086,"language":340,"meta":141,"style":141},"def assess_video_quality(video_url):\n    scores = {}\n    \n    # Motion smoothness (analyze frame-to-frame changes)\n    scores[\"motion\"] = calculate_motion_smoothness(video_url)\n    \n    # Visual consistency (check for flickering/artifacts)\n    scores[\"consistency\"] = detect_visual_artifacts(video_url)\n    \n    # Prompt adherence (use CLIP to compare with text description)\n    scores[\"adherence\"] = measure_prompt_alignment(video_url, prompt)\n    \n    return scores\n\n# Only proceed with high-quality generations\nresult = generate_video(prompt_data)\nif assess_video_quality(result[\"video_url\"])[\"overall\"] > 0.8:\n    publish_video(result[\"video_url\"])\n",[28,38088,38089,38099,38108,38112,38117,38132,38136,38141,38155,38159,38164,38178,38182,38189,38193,38198,38207,38231],{"__ignoreMap":141},[145,38090,38091,38093,38096],{"class":147,"line":148},[145,38092,526],{"class":258},[145,38094,38095],{"class":151}," assess_video_quality",[145,38097,38098],{"class":262},"(video_url):\n",[145,38100,38101,38104,38106],{"class":147,"line":166},[145,38102,38103],{"class":262},"    scores ",[145,38105,266],{"class":258},[145,38107,16814],{"class":262},[145,38109,38110],{"class":147,"line":178},[145,38111,563],{"class":262},[145,38113,38114],{"class":147,"line":187},[145,38115,38116],{"class":174},"    # Motion smoothness (analyze frame-to-frame changes)\n",[145,38118,38119,38122,38125,38127,38129],{"class":147,"line":373},[145,38120,38121],{"class":262},"    scores[",[145,38123,38124],{"class":159},"\"motion\"",[145,38126,14931],{"class":262},[145,38128,266],{"class":258},[145,38130,38131],{"class":262}," calculate_motion_smoothness(video_url)\n",[145,38133,38134],{"class":147,"line":379},[145,38135,563],{"class":262},[145,38137,38138],{"class":147,"line":385},[145,38139,38140],{"class":174},"    # Visual consistency (check for flickering/artifacts)\n",[145,38142,38143,38145,38148,38150,38152],{"class":147,"line":409},[145,38144,38121],{"class":262},[145,38146,38147],{"class":159},"\"consistency\"",[145,38149,14931],{"class":262},[145,38151,266],{"class":258},[145,38153,38154],{"class":262}," detect_visual_artifacts(video_url)\n",[145,38156,38157],{"class":147,"line":420},[145,38158,563],{"class":262},[145,38160,38161],{"class":147,"line":431},[145,38162,38163],{"class":174},"    # Prompt adherence (use CLIP to compare with text description)\n",[145,38165,38166,38168,38171,38173,38175],{"class":147,"line":455},[145,38167,38121],{"class":262},[145,38169,38170],{"class":159},"\"adherence\"",[145,38172,14931],{"class":262},[145,38174,266],{"class":258},[145,38176,38177],{"class":262}," measure_prompt_alignment(video_url, prompt)\n",[145,38179,38180],{"class":147,"line":466},[145,38181,563],{"class":262},[145,38183,38184,38186],{"class":147,"line":600},[145,38185,1703],{"class":258},[145,38187,38188],{"class":262}," scores\n",[145,38190,38191],{"class":147,"line":605},[145,38192,376],{"emptyLinePlaceholder":58},[145,38194,38195],{"class":147,"line":611},[145,38196,38197],{"class":174},"# Only proceed with high-quality generations\n",[145,38199,38200,38202,38204],{"class":147,"line":617},[145,38201,12238],{"class":262},[145,38203,266],{"class":258},[145,38205,38206],{"class":262}," generate_video(prompt_data)\n",[145,38208,38209,38211,38214,38216,38219,38222,38224,38226,38229],{"class":147,"line":623},[145,38210,1719],{"class":258},[145,38212,38213],{"class":262}," assess_video_quality(result[",[145,38215,14953],{"class":159},[145,38217,38218],{"class":262},"])[",[145,38220,38221],{"class":159},"\"overall\"",[145,38223,14931],{"class":262},[145,38225,5992],{"class":258},[145,38227,38228],{"class":155}," 0.8",[145,38230,860],{"class":262},[145,38232,38233,38236,38238],{"class":147,"line":628},[145,38234,38235],{"class":262},"    publish_video(result[",[145,38237,14953],{"class":159},[145,38239,1629],{"class":262},[18,38241,38242],{},[11,38243,38244],{},[37,38245,38247],{"href":211,"rel":38246},[41],"Access advanced Seedance features with EvoLink Pro plans",[45,38249],{},[48,38251,9065],{"id":9064},[92,38253,38255],{"id":38254},"whats-the-difference-between-seedance-10-and-20","What's the difference between Seedance 1.0 and 2.0?",[11,38257,38258],{},"Seedance 2.0 introduces multimodal input (@tag references), longer generation support (4 to 15 seconds), and significantly improved temporal consistency. The prompt structure remains similar, but 2.0 handles complex scenes much better.",[92,38260,38262],{"id":38261},"why-do-my-tag-references-sometimes-get-ignored","Why do my @tag references sometimes get ignored?",[11,38264,38265],{},"Common causes:",[70,38267,38268,38276,38285,38291],{},[73,38269,38270,7926,38273,38275],{},[23,38271,38272],{},"Wrong numbering",[28,38274,2921],{}," when you only uploaded 2 images",[73,38277,38278,38281,38282,38284],{},[23,38279,38280],{},"File type mismatch"," — referencing ",[28,38283,16533],{}," when you uploaded an image",[73,38286,38287,38290],{},[23,38288,38289],{},"Conflicting instructions"," — asking for \"dark night scene\" with a bright daytime image",[73,38292,38293,38296],{},[23,38294,38295],{},"Upload order confusion"," — tags are assigned by upload order within each type",[92,38298,38300],{"id":38299},"how-do-i-maintain-character-consistency-across-multiple-videos","How do I maintain character consistency across multiple videos?",[70,38302,38303,38306,38309,38312],{},[73,38304,38305],{},"Use the exact same reference image in every generation",[73,38307,38308],{},"Include explicit character descriptors in text (\"same blue jacket, shoulder-length brown hair\")",[73,38310,38311],{},"Use the last frame of video N as the first frame of video N+1",[73,38313,38314],{},"Keep character descriptions identical across prompts",[92,38316,38318],{"id":38317},"can-i-modify-an-existing-video","Can I modify an existing video?",[11,38320,38321],{},"Yes! Upload your existing video via video_urls and use @Video1 references in the prompt to edit it — replace characters, modify scenes, extend duration, or change the storyline.",[11,38323,38324],{},"However, you can also:",[97,38326,38327,38330,38333],{},[73,38328,38329],{},"Use @Video1 to reference the original and describe your edits in the prompt",[73,38331,38332],{},"Upload reference images via image_urls to replace characters or add elements",[73,38334,38335],{},"Use extension prompts to add content before or after the original video",[11,38337,38338,38339,38341],{},"See our ",[37,38340,22983],{"href":22982}," for the full editing parameter spec.",[92,38343,38345],{"id":38344},"whats-the-maximum-video-length","What's the maximum video length?",[11,38347,38348],{},"Seedance 2.0 supports 4 to 15 seconds per generation. For longer content beyond the 15-second limit, consider:",[97,38350,38351,38354,38357],{},[73,38352,38353],{},"Breaking into multiple scenes and chaining them",[73,38355,38356],{},"Using shot-script format with clear timecodes",[73,38358,38359],{},"Focusing on single concepts per generation",[92,38361,38363],{"id":38362},"how-do-i-avoid-content-policy-violations","How do I avoid content policy violations?",[97,38365,38366,38369,38372,38375],{},[73,38367,38368],{},"Don't upload realistic human face photos",[73,38370,38371],{},"Avoid copyrighted characters or celebrities",[73,38373,38374],{},"Use illustrated/stylized character references instead of photos",[73,38376,38377],{},"Focus on original concepts rather than recreating existing media",[92,38379,38381],{"id":38380},"why-do-some-prompts-cost-more-than-others","Why do some prompts cost more than others?",[11,38383,38384],{},"Generation cost factors:",[70,38386,38387,38392,38398,38404],{},[73,38388,38389,38391],{},[23,38390,18337],{}," — longer videos cost more",[73,38393,38394,38397],{},[23,38395,38396],{},"Resolution"," — 1080p costs more than 720p",[73,38399,38400,38403],{},[23,38401,38402],{},"Number of references"," — video refs cost more than image refs",[73,38405,38406,38409],{},[23,38407,38408],{},"Complexity"," — multi-character scenes may use more compute",[92,38411,38413],{"id":38412},"how-do-i-get-the-best-results-from-shot-script-format","How do I get the best results from shot-script format?",[70,38415,38416,38419,38422,38425,38428],{},[73,38417,38418],{},"Keep each shot segment to 3-5 seconds maximum",[73,38420,38421],{},"Use specific style anchors (\"Christopher Nolan thriller\" vs \"cinematic\")",[73,38423,38424],{},"Describe physical actions, not abstract concepts",[73,38426,38427],{},"Include camera movement instructions for each shot",[73,38429,38430],{},"End with consistency constraints and physics requirements",[92,38432,38434],{"id":38433},"can-i-use-seedance-for-commercial-projects","Can I use Seedance for commercial projects?",[11,38436,38437,38438,38441],{},"Yes, with appropriate licensing. Check the current terms at ",[37,38439,213],{"href":211,"rel":38440},[41]," as policies may vary by subscription tier.",[92,38443,38445],{"id":38444},"how-do-i-troubleshoot-failed-generations","How do I troubleshoot failed generations?",[70,38447,38448,38454,38460,38466,38472],{},[73,38449,38450,38453],{},[23,38451,38452],{},"Check file limits"," — ≤9 images, ≤3 videos, ≤3 audio",[73,38455,38456,38459],{},[23,38457,38458],{},"Verify @tag numbering"," matches your uploaded files",[73,38461,38462,38465],{},[23,38463,38464],{},"Simplify the prompt"," if it's over 200 words",[73,38467,38468,38471],{},[23,38469,38470],{},"Remove conflicting instructions"," between text and references",[73,38473,38474,38477],{},[23,38475,38476],{},"Try text-only"," first, then add references gradually",[92,38479,38481],{"id":38480},"what-makes-a-prompt-professional-quality","What makes a prompt \"professional quality\"?",[11,38483,38484],{},"Professional prompts typically include:",[97,38486,38487,38490,38493,38496,38499],{},[73,38488,38489],{},"Shot-script format with timecodes",[73,38491,38492],{},"Specific style anchors (director names, art movements)",[73,38494,38495],{},"Physical action descriptions rather than abstract concepts",[73,38497,38498],{},"Consistency constraints and physics requirements",[73,38500,38501],{},"Appropriate reference file selection and @tag usage",[45,38503],{},[48,38505,38507],{"id":38506},"conclusion","Conclusion",[11,38509,38510],{},"Mastering Seedance 2.0 prompts is about understanding the balance between text descriptions and multimodal references. The shot-script format gives you cinematic control, while @tag references provide visual consistency.",[11,38512,38513],{},"Start with the text-only templates in this guide, then gradually incorporate image and video references as you become comfortable with the syntax. Focus on clear, specific instructions rather than overly complex descriptions.",[11,38515,38516],{},"The templates here cover the most common use cases — from product commercials to character animations to style transformations. Adapt them to your specific needs by changing the style anchors, timecodes, and reference files.",[11,38518,38519,38520,38523,38524,38527],{},"Most importantly: ",[23,38521,38522],{},"experiment",". Each prompt teaches you something about how Seedance 2.0 interprets instructions. The community at ",[37,38525,32462],{"href":32460,"rel":38526},[41]," shares successful prompt patterns and breakthrough techniques.",[11,38529,38530,14284,38533,38536],{},[23,38531,38532],{},"Ready to start creating?",[37,38534,9058],{"href":211,"rel":38535},[41]," and run every template in this guide. The future of video creation is multimodal — and it's available today.",[11,38538,38539,38542,38543,38546,38547,38549,38550,38552],{},[23,38540,38541],{},"Next up:"," Master the @tag reference system → ",[37,38544,38545],{"href":2966},"Multimodal Guide"," | ",[37,38548,23042],{"href":3381}," | Learn ",[37,38551,34991],{"href":3856}," with complete Python examples",[45,38554],{},[11,38556,38557],{},[2619,38558,38559],{},"Last updated: February 19, 2026 | Written by J, Growth Lead at EvoLink",[11217,38561,38562],{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}",{"title":141,"searchDepth":166,"depth":166,"links":38564},[38565,38571,38578,38584,38585,38593,38598,38611],{"id":32232,"depth":166,"text":32233,"children":38566},[38567,38568,38569,38570],{"id":32324,"depth":178,"text":32325},{"id":32350,"depth":178,"text":32351},{"id":32472,"depth":178,"text":32473},{"id":32504,"depth":178,"text":32505},{"id":33020,"depth":166,"text":33021,"children":38572},[38573,38574,38575,38576,38577],{"id":33029,"depth":178,"text":33030},{"id":33093,"depth":178,"text":33094},{"id":33182,"depth":178,"text":33183},{"id":33260,"depth":178,"text":33261},{"id":33321,"depth":178,"text":33322},{"id":33434,"depth":166,"text":33435,"children":38579},[38580,38581,38582,38583],{"id":33438,"depth":178,"text":33439},{"id":34183,"depth":178,"text":34184},{"id":35343,"depth":178,"text":35344},{"id":36468,"depth":178,"text":36469},{"id":36846,"depth":166,"text":36847},{"id":37050,"depth":166,"text":37051,"children":38586},[38587,38588,38589,38590,38591,38592],{"id":37054,"depth":178,"text":37055},{"id":37352,"depth":178,"text":37353},{"id":37400,"depth":178,"text":37401},{"id":37435,"depth":178,"text":37436},{"id":37471,"depth":178,"text":37472},{"id":37590,"depth":178,"text":37591},{"id":37794,"depth":166,"text":37795,"children":38594},[38595,38596,38597],{"id":37798,"depth":178,"text":37799},{"id":37932,"depth":178,"text":37933},{"id":38079,"depth":178,"text":38080},{"id":9064,"depth":166,"text":9065,"children":38599},[38600,38601,38602,38603,38604,38605,38606,38607,38608,38609,38610],{"id":38254,"depth":178,"text":38255},{"id":38261,"depth":178,"text":38262},{"id":38299,"depth":178,"text":38300},{"id":38317,"depth":178,"text":38318},{"id":38344,"depth":178,"text":38345},{"id":38362,"depth":178,"text":38363},{"id":38380,"depth":178,"text":38381},{"id":38412,"depth":178,"text":38413},{"id":38433,"depth":178,"text":38434},{"id":38444,"depth":178,"text":38445},{"id":38480,"depth":178,"text":38481},{"id":38506,"depth":166,"text":38507},"Master Seedance 2.0 prompts with @tag syntax, multimodal references, and 15+ ready-to-use templates. Includes Python API code examples.",{"date":38614,"image":38615,"pinned":58},"2026-02-19","/111.png","/en/blog/seedance-2-prompt-guide",{"title":13418,"description":38612},"en/blog/seedance-2-prompt-guide","Ab8pQuA8E3WwKeHWsjxgIHdJi6TLeTlKq55KpC4BCcs",{"id":38621,"title":38622,"body":38623,"description":41503,"extension":11279,"meta":41504,"navigation":58,"path":41525,"seo":41526,"stem":41527,"__hash__":41528},"content/en/blog/seedance-2-vs-sora-2-api-comparison.md","Seedance 2.0 vs Sora 2: Real API Tests with Identical Prompts (2026)",{"type":8,"value":38624,"toc":41460},[38625,38628,38631,38648,38661,38665,38668,38688,38694,38700,38703,38709,38773,38776,38779,38783,38787,38792,38795,38800,38860,38866,38869,38875,38878,38883,38933,38938,38941,38946,38950,38956,38962,38965,38970,39032,39035,39039,39043,39048,39051,39056,39110,39115,39121,39124,39127,39130,39135,39189,39195,39198,39204,39208,39214,39217,39224,39229,39288,39291,39294,39298,39302,39307,39310,39315,39369,39374,39377,39380,39383,39388,39438,39444,39447,39451,39457,39460,39465,39525,39528,39531,39537,39541,39544,39713,39718,39736,39740,39743,39747,39750,40328,40334,40467,40473,40477,40678,40681,40687,40693,40699,40704,40715,40719,40722,40726,40787,40798,40809,40813,40819,40822,40892,40899,40905,40909,40955,40959,40962,40966,41006,41010,41036,41040,41043,41046,41274,41277,41281,41284,41286,41290,41293,41297,41308,41312,41315,41319,41325,41329,41336,41340,41347,41349,41353,41430,41433,41446,41457],[23112,38626,38622],{"id":38627},"seedance-20-vs-sora-2-real-api-tests-with-identical-prompts-2026",[11,38629,38630],{},"Most \"Seedance vs Sora\" articles compare spec sheets. We ran both models through the same three prompts, recorded the outputs, and scored them frame by frame. Here's what we found — with video evidence, API code you can copy, and a pricing breakdown that might change which model you pick.",[11,38632,38633,38634,38639,38640,38643,38644,38647],{},"Seedance 2.0 (by ByteDance's ",[37,38635,38638],{"href":38636,"rel":38637},"https://seed.bytedance.com/en",[41],"Seed team",") scored ",[23,38641,38642],{},"8.5/10 overall"," versus Sora 2's ",[23,38645,38646],{},"8.0/10"," across our tests. The gap wasn't where we expected it.",[38649,38650,38652],"callout",{"type":38651},"info",[11,38653,38654,14284,38657,38660],{},[23,38655,38656],{},"Want to run these tests yourself?",[37,38658,38659],{"href":16474},"Get a free EvoLink API key"," and use the exact prompts below.",[48,38662,38664],{"id":38663},"the-test-setup","The Test Setup",[11,38666,38667],{},"We designed three prompts to stress-test different capabilities:",[70,38669,38670,38676,38682],{},[73,38671,38672,38675],{},[23,38673,38674],{},"Slow-motion physics"," — a porcelain vase shattering (particle dynamics, material rendering)",[73,38677,38678,38681],{},[23,38679,38680],{},"Dynamic human motion"," — rooftop breakdancing at night (anatomy, motion blur, neon lighting)",[73,38683,38684,38687],{},[23,38685,38686],{},"Facial expression & lighting"," — an elderly woman discovering a magical book (micro-expressions, volumetric light)",[11,38689,38690,38693],{},[23,38691,38692],{},"Methodology:"," Each prompt was submitted verbatim to both APIs. No cherry-picking — we used the first generation from each model. Videos are 15 seconds, unedited. Scoring uses six dimensions: image quality, prompt adherence, physics/anatomy realism, lighting, motion fluidity, and detail richness.",[11,38695,38696,38699],{},[23,38697,38698],{},"Why this matters:"," If you're building a product on top of an AI video API, you need to know which model handles your use case. Spec sheets won't tell you that Sora 2's human anatomy breaks down on pause, or that Seedance's 60fps makes slow-motion scenes noticeably smoother.",[11,38701,38702],{},"Every existing \"Seedance vs Sora\" article we found relies on feature-list comparisons or single cherry-picked examples. None uses controlled, identical prompts with systematic scoring. That's the gap this test fills.",[11,38704,38705,38708],{},[23,38706,38707],{},"What we didn't test:"," We didn't evaluate text-overlay quality, multi-scene narratives, or audio-sync accuracy in this round. Those deserve their own dedicated tests. We also limited ourselves to text-to-video mode — image-to-video and video-to-video comparisons are planned for a follow-up.",[2036,38710,38711,38722],{},[2039,38712,38713],{},[2042,38714,38715,38717,38719],{},[2045,38716,3400],{},[2045,38718,17398],{"align":13812},[2045,38720,38721],{"align":13812},"Sora 2",[2052,38723,38724,38734,38745,38753,38763],{},[2042,38725,38726,38728,38731],{},[2057,38727,38396],{},[2057,38729,38730],{"align":13812},"1280×720 (720p)",[2057,38732,38733],{"align":13812},"1792×1024 (~1080p)",[2042,38735,38736,38739,38742],{},[2057,38737,38738],{},"Frame Rate",[2057,38740,38741],{"align":13812},"60fps",[2057,38743,38744],{"align":13812},"30fps",[2042,38746,38747,38749,38751],{},[2057,38748,18337],{},[2057,38750,4075],{"align":13812},[2057,38752,4075],{"align":13812},[2042,38754,38755,38758,38761],{},[2057,38756,38757],{},"Codec",[2057,38759,38760],{"align":13812},"H.264",[2057,38762,38760],{"align":13812},[2042,38764,38765,38767,38770],{},[2057,38766,30643],{},[2057,38768,38769],{"align":13812},"AAC 44.1kHz stereo",[2057,38771,38772],{"align":13812},"AAC 96kHz stereo",[11,38774,38775],{},"Seedance trades resolution for double the frame rate. Sora delivers ~2.5× more pixels per frame. Both choices have real consequences for different content types — as you'll see below.",[11,38777,38778],{},"A quick note on audio: both models generate synchronized audio (dialogue, SFX, music), but their sample rates differ. Sora's 96kHz output exceeds CD quality, while Seedance's 44.1kHz matches standard CD audio. In practice, most delivery platforms (YouTube, TikTok, Instagram) downsample to 48kHz or lower, so this difference rarely matters for final distribution.",[48,38780,38782],{"id":38781},"test-1-slow-motion-physics-porcelain-vase","Test 1 — Slow-Motion Physics (Porcelain Vase)",[11,38784,38785],{},[23,38786,11996],{},[18,38788,38789],{},[11,38790,38791],{},"A porcelain vase falls from a marble table in slow motion. Camera starts with a close-up of the vase wobbling on the edge, then follows it downward with a smooth tracking shot as it shatters on a stone floor. Fragments scatter in all directions. Dust particles float in warm afternoon sunlight streaming through a window. Shallow depth of field, 24fps cinematic look",[92,38793,17398],{"id":38794},"seedance-20",[56,38796,60,38797],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,38798],{"src":38799,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/seedance2.0%E7%93%B7%E5%99%A8%E6%8E%89%E5%9C%B0%E4%B8%8A.mp4",[2036,38801,38802,38814],{},[2039,38803,38804],{},[2042,38805,38806,38809,38812],{},[2045,38807,38808],{},"Dimension",[2045,38810,38811],{"align":13812},"Score",[2045,38813,19420],{},[2052,38815,38816,38827,38838,38849],{},[2042,38817,38818,38821,38824],{},[2057,38819,38820],{},"Image Quality",[2057,38822,38823],{"align":13812},"8.5/10",[2057,38825,38826],{},"Near-cinematic. Blue-white porcelain texture crisp, marble grain realistic",[2042,38828,38829,38832,38835],{},[2057,38830,38831],{},"Prompt Adherence",[2057,38833,38834],{"align":13812},"7.5/10",[2057,38836,38837],{},"Vase, marble table, warm light, shallow DoF — all present. Dust particles missing",[2042,38839,38840,38843,38846],{},[2057,38841,38842],{},"Physics Realism",[2057,38844,38845],{"align":13812},"7.0/10",[2057,38847,38848],{},"Fall trajectory reasonable but fragments cluster too tightly. Missing motion blur gives a \"floating\" feel",[2042,38850,38851,38854,38857],{},[2057,38852,38853],{},"Lighting",[2057,38855,38856],{"align":13812},"9.0/10",[2057,38858,38859],{},"Afternoon warmth from window is consistent. Specular highlights on glaze are accurate",[11,38861,38862,38865],{},[23,38863,38864],{},"Standout:"," The bokeh and warm-light rendering feel genuinely filmic. At 60fps, the slow-motion fall is buttery smooth — you can track individual fragments frame by frame without any judder. The blue-white porcelain glaze catches afternoon light exactly the way real celadon does, with soft specular highlights that shift naturally as the vase rotates during its fall.",[11,38867,38868],{},"The shallow depth-of-field execution deserves special mention. Background elements blur with a natural gradient, not the hard-edged mask you see in cheaper implementations. The marble table's golden edge trim stays crisp in the foreground while the room behind falls off convincingly.",[11,38870,38871,38874],{},[23,38872,38873],{},"Weakness:"," Fragments don't scatter far enough for a hard stone floor impact. Real porcelain hitting stone at that velocity would send shards several feet in all directions — here they cluster within a tight radius. There's no visible dust or ceramic powder, which the prompt specifically requested. The falling vase also lacks motion blur, creating a slight \"floating\" quality in mid-air frames.",[92,38876,38721],{"id":38877},"sora-2",[56,38879,60,38880],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,38881],{"src":38882,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/sora2%E7%93%B7%E5%99%A8%E6%8E%89%E5%9C%B0%E4%B8%8A.mp4",[2036,38884,38885,38895],{},[2039,38886,38887],{},[2042,38888,38889,38891,38893],{},[2045,38890,38808],{},[2045,38892,38811],{"align":13812},[2045,38894,19420],{},[2052,38896,38897,38906,38915,38924],{},[2042,38898,38899,38901,38903],{},[2057,38900,38820],{},[2057,38902,38856],{"align":13812},[2057,38904,38905],{},"Higher resolution reveals more detail. Cross-section of broken ceramic (grey body under glaze) is impressive",[2042,38907,38908,38910,38912],{},[2057,38909,38831],{},[2057,38911,38834],{"align":13812},[2057,38913,38914],{},"Main elements present. Also missing dust particles",[2042,38916,38917,38919,38921],{},[2057,38918,38842],{},[2057,38920,38646],{"align":13812},[2057,38922,38923],{},"Fracture mechanics more convincing — uneven thickness, irregular break edges match brittle fracture behavior",[2042,38925,38926,38928,38930],{},[2057,38927,38853],{},[2057,38929,38856],{"align":13812},[2057,38931,38932],{},"Warm light from right. Correct differentiation between glossy ceramic and matte stone surfaces",[11,38934,38935,38937],{},[23,38936,38864],{}," The fracture detail is superior. You can see the grey ceramic body (the bisque) beneath the glaze at break points — a subtle but physically accurate detail that most 3D renders don't even attempt. The neck staying intact while the body shatters matches real ceramic stress distribution: the neck is the thickest, most structurally reinforced part of a vase.",[11,38939,38940],{},"Fragment edges show irregular, conchoidal fracture patterns consistent with brittle material failure. Some pieces have thin edges where the glaze chipped away from the body, others show thicker cross-sections. This level of fracture variance is what separates \"convincing\" from \"obviously CG.\"",[11,38942,38943,38945],{},[23,38944,38873],{}," Despite the superior fracture physics, some fragments still exhibit a slight \"hovering\" quality — they decelerate too quickly after impact rather than bouncing and sliding on the stone. Dust particles are absent, same as Seedance. The fragment count is also lower than expected for a vase of this size hitting a hard surface.",[92,38947,38949],{"id":38948},"test-1-verdict","Test 1 Verdict",[11,38951,38952,38955],{},[23,38953,38954],{},"Sora 2 wins on fracture detail and raw resolution."," The higher pixel count and more convincing break physics make this a clear edge for static-heavy or close-up content.",[11,38957,38958,38961],{},[23,38959,38960],{},"Seedance 2.0 wins on motion smoothness."," The 60fps frame rate makes the slow-motion fall visually smoother. If your use case is actual slow-motion video (ads, product demos), that frame rate matters.",[11,38963,38964],{},"Both models failed to generate floating dust particles in sunlight — a shared limitation of current AI video generation. Volumetric particle effects (dust, smoke, mist) remain a weak point across all diffusion-based video models, likely because training data rarely isolates these subtle atmospheric elements.",[11,38966,38967],{},[23,38968,38969],{},"Score summary for Test 1:",[2036,38971,38972,38992],{},[2039,38973,38974],{},[2042,38975,38976,38978,38980,38982,38985,38987],{},[2045,38977,17185],{},[2045,38979,38820],{"align":13812},[2045,38981,38831],{"align":13812},[2045,38983,38984],{"align":13812},"Physics",[2045,38986,38853],{"align":13812},[2045,38988,38989],{"align":13812},[23,38990,38991],{},"Average",[2052,38993,38994,39015],{},[2042,38995,38996,38998,39001,39004,39007,39010],{},[2057,38997,17398],{},[2057,38999,39000],{"align":13812},"8.5",[2057,39002,39003],{"align":13812},"7.5",[2057,39005,39006],{"align":13812},"7.0",[2057,39008,39009],{"align":13812},"9.0",[2057,39011,39012],{"align":13812},[23,39013,39014],{},"8.0",[2042,39016,39017,39019,39021,39023,39025,39027],{},[2057,39018,38721],{},[2057,39020,39009],{"align":13812},[2057,39022,39003],{"align":13812},[2057,39024,39014],{"align":13812},[2057,39026,39009],{"align":13812},[2057,39028,39029],{"align":13812},[23,39030,39031],{},"8.4",[11,39033,39034],{},"Sora 2 takes this round by a narrow margin, driven by superior fracture physics and resolution. But if your use case prioritizes smooth slow-motion playback over freeze-frame detail, the 60fps advantage tips back toward Seedance.",[48,39036,39038],{"id":39037},"test-2-dynamic-human-motion-rooftop-breakdance","Test 2 — Dynamic Human Motion (Rooftop Breakdance)",[11,39040,39041],{},[23,39042,11996],{},[18,39044,39045],{},[11,39046,39047],{},"A street dancer performs an explosive breakdance routine on a rain-soaked city rooftop at night. Neon lights from surrounding buildings reflect off the wet surface. Camera circles the dancer in a dynamic 360-degree orbit. The dancer transitions from a power move into a freeze pose. Dramatic rim lighting, cinematic color grading with teal and orange tones",[92,39049,17398],{"id":39050},"seedance-20-1",[56,39052,60,39053],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,39054],{"src":39055,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/seedance2.0%E5%A4%9C%E6%99%AF%E8%A1%97%E8%88%9E.mp4",[2036,39057,39058,39068],{},[2039,39059,39060],{},[2042,39061,39062,39064,39066],{},[2045,39063,38808],{},[2045,39065,38811],{"align":13812},[2045,39067,19420],{},[2052,39069,39070,39079,39089,39099],{},[2042,39071,39072,39074,39076],{},[2057,39073,38820],{},[2057,39075,38856],{"align":13812},[2057,39077,39078],{},"Stunning night rendering. Neon reflections on wet surfaces are almost photographic",[2042,39080,39081,39084,39086],{},[2057,39082,39083],{},"Anatomy Accuracy",[2057,39085,38823],{"align":13812},[2057,39087,39088],{},"B-boy floor work poses are recognizable. Wrist-forearm-shoulder force lines align correctly",[2042,39090,39091,39094,39096],{},[2057,39092,39093],{},"Motion Dynamics",[2057,39095,38856],{"align":13812},[2057,39097,39098],{},"Motion blur direction matches movement. Low center of gravity fits breakdance mechanics. 60fps keeps fast transitions smooth",[2042,39100,39101,39104,39107],{},[2057,39102,39103],{},"Lighting & Atmosphere",[2057,39105,39106],{"align":13812},"9.5/10",[2057,39108,39109],{},"Near-perfect neon reflections on wet ground. Rim lighting + backlit silhouette creates cinematic drama",[11,39111,39112,39114],{},[23,39113,38864],{}," This is where Seedance 2.0 truly shines. The teal-and-orange color grading is executed precisely. Neon reflections on the rain-soaked rooftop are stunning — red and cyan complementary colors map naturally onto the wet surface. The atmosphere is immersive enough for a professional music video.",[11,39116,39117,39120],{},[23,39118,39119],{},"The 60fps advantage is decisive here."," Fast arm sweeps, power moves, and transitions look fluid rather than stuttery. Clothing has weight and drapes correctly during motion — the hoodie fabric stretches and bunches at the shoulders in ways that suggest real textile physics.",[11,39122,39123],{},"The color grading deserves a closer look. Teal and orange are complementary colors, and the prompt specifically requested this combination. Seedance didn't just tint the image — it placed warm orange neon sources behind the dancer (creating rim light) and cool cyan sources in front, then let the wet rooftop surface mix both colors in reflections. This is how a cinematographer would actually light this scene.",[11,39125,39126],{},"Water behavior on the rooftop is also convincing. The surface has a thin, even layer of water that reflects the cityscape above. When the dancer moves, you can see subtle disturbance patterns radiating outward from points of contact. It's not perfect fluid simulation, but it reads as \"wet ground\" instantly.",[92,39128,38721],{"id":39129},"sora-2-1",[56,39131,60,39132],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,39133],{"src":39134,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/sora2%E5%A4%9C%E6%99%AF%E8%A1%97%E8%88%9E.mp4",[2036,39136,39137,39147],{},[2039,39138,39139],{},[2042,39140,39141,39143,39145],{},[2045,39142,38808],{},[2045,39144,38811],{"align":13812},[2045,39146,19420],{},[2052,39148,39149,39158,39171,39180],{},[2042,39150,39151,39153,39155],{},[2057,39152,38820],{},[2057,39154,38646],{"align":13812},[2057,39156,39157],{},"Strong cyberpunk aesthetic, detailed city background. But has an \"AI sheen\" — everything looks too perfectly graded",[2042,39159,39160,39162,39165],{},[2057,39161,39083],{},[2057,39163,39164],{"align":13812},"6.5/10",[2057,39166,16126,39167,39170],{},[23,39168,39169],{},"Major weakness."," Hand-ground contact is blurry, fingers indistinguishable. Torso narrows unnaturally during handstand. Feet/shoe edges have a \"melting\" quality",[2042,39172,39173,39175,39177],{},[2057,39174,39093],{},[2057,39176,38646],{"align":13812},[2057,39178,39179],{},"Water splash effects are good, rotational momentum is credible. But some water droplets look more like noise than real droplets",[2042,39181,39182,39184,39186],{},[2057,39183,39103],{},[2057,39185,38823],{"align":13812},[2057,39187,39188],{},"Dual-source contrast (warm orange backlight + cool cyan front) handled well. But immersion falls short of Seedance",[11,39190,39191,39194],{},[23,39192,39193],{},"The anatomy problem is serious."," During freeze poses and handstands, the dancer's hands dissolve into the ground contact surface — individual fingers are indistinguishable. The torso becomes tube-like rather than showing realistic ribcage-to-pelvis structure, losing the natural width variation between chest, waist, and hips. A second arm disappears entirely in some frames, creating an anatomical gap that breaks the illusion.",[11,39196,39197],{},"Foot and shoe edges exhibit a \"melting\" quality, where the boundary between footwear and air becomes soft and undefined. This is a common failure mode in diffusion-based video models when limbs overlap or contact surfaces.",[11,39199,39200,39203],{},[23,39201,39202],{},"It looks fine while playing at normal speed. Pause any frame during a freeze pose and things fall apart."," For content that will only be viewed as video (social media, ads), this may be acceptable. For anything that might be screenshotted, thumbnailed, or analyzed, it's a dealbreaker.",[92,39205,39207],{"id":39206},"test-2-verdict","Test 2 Verdict",[11,39209,39210,39213],{},[23,39211,39212],{},"Seedance 2.0 wins decisively."," The anatomy accuracy gap (8.5 vs 6.5) is the largest single-dimension difference across all three tests. For any content involving dynamic human movement — dance, sports, action sequences — Seedance is the more reliable choice right now.",[11,39215,39216],{},"The 60fps frame rate compounds this advantage. At 30fps, fast breakdance movements produce noticeable judder. At 60fps, they're smooth.",[11,39218,39219,39220,39223],{},"If you're building a product that generates human-motion content through an ",[37,39221,39222],{"href":14385},"AI video API",", this result should heavily influence your model selection.",[11,39225,39226],{},[23,39227,39228],{},"Score summary for Test 2:",[2036,39230,39231,39251],{},[2039,39232,39233],{},[2042,39234,39235,39237,39239,39242,39245,39247],{},[2045,39236,17185],{},[2045,39238,38820],{"align":13812},[2045,39240,39241],{"align":13812},"Anatomy",[2045,39243,39244],{"align":13812},"Motion",[2045,39246,38853],{"align":13812},[2045,39248,39249],{"align":13812},[23,39250,38991],{},[2052,39252,39253,39270],{},[2042,39254,39255,39257,39259,39261,39263,39266],{},[2057,39256,17398],{},[2057,39258,39009],{"align":13812},[2057,39260,39000],{"align":13812},[2057,39262,39009],{"align":13812},[2057,39264,39265],{"align":13812},"9.5",[2057,39267,39268],{"align":13812},[23,39269,39009],{},[2042,39271,39272,39274,39276,39279,39281,39283],{},[2057,39273,38721],{},[2057,39275,39014],{"align":13812},[2057,39277,39278],{"align":13812},"6.5",[2057,39280,39014],{"align":13812},[2057,39282,39000],{"align":13812},[2057,39284,39285],{"align":13812},[23,39286,39287],{},"7.75",[11,39289,39290],{},"This is the widest gap across all three tests. Seedance outperforms in every single dimension. The anatomy accuracy delta (8.5 vs 6.5) alone should be disqualifying for Sora in human-motion applications where frame-level quality matters.",[11,39292,39293],{},"For developers working on fitness apps, dance content platforms, sports highlights, or any product featuring dynamic human movement, this test provides strong evidence for defaulting to Seedance 2.0.",[48,39295,39297],{"id":39296},"test-3-facial-expression-lighting-elder-bookshop","Test 3 — Facial Expression & Lighting (Elder Bookshop)",[11,39299,39300],{},[23,39301,11996],{},[18,39303,39304],{},[11,39305,39306],{},"A wise elderly woman with silver hair and round spectacles sits in a cluttered antique bookshop. She picks up a leather-bound book, opens it, and her expression shifts from curiosity to wonder as golden light emanates from the pages. The light illuminates her face and the surrounding book spines. Camera slowly pushes in from medium shot to close-up on her face. Warm tungsten lighting mixed with the magical golden glow.",[92,39308,17398],{"id":39309},"seedance-20-2",[56,39311,60,39312],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,39313],{"src":39314,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/seedance2.0%E8%80%81%E4%BA%BA%E5%A5%87%E9%81%87.mp4",[2036,39316,39317,39327],{},[2039,39318,39319],{},[2042,39320,39321,39323,39325],{},[2045,39322,38808],{},[2045,39324,38811],{"align":13812},[2045,39326,19420],{},[2052,39328,39329,39339,39349,39359],{},[2042,39330,39331,39334,39336],{},[2057,39332,39333],{},"Facial Quality",[2057,39335,38823],{"align":13812},[2057,39337,39338],{},"Wrinkles, crow's feet, nasolabial folds render naturally. Round spectacles sit correctly on nose bridge with subtle refraction",[2042,39340,39341,39344,39346],{},[2057,39342,39343],{},"Expression Transition",[2057,39345,38823],{"align":13812},[2057,39347,39348],{},"Quiet focus → wonder is conveyed through widening eyes, slightly raised brows, parting lips. Layered micro-expressions",[2042,39350,39351,39354,39356],{},[2057,39352,39353],{},"Environment Detail",[2057,39355,38856],{"align":13812},[2057,39357,39358],{},"⭐ Richest scene of all tests. Floor-to-ceiling leather book spines, rolling library ladder, globe desk lamp, ink bottles, brass instruments",[2042,39360,39361,39364,39366],{},[2057,39362,39363],{},"Golden Light Effect",[2057,39365,38856],{"align":13812},[2057,39367,39368],{},"Volumetric golden light radiates upward from pages. Correctly illuminates chin, cheeks, under-nose. Blends naturally with existing warm tungsten",[11,39370,39371,39373],{},[23,39372,38864],{}," The bookshop environment is extraordinary. It feels like a real, lived-in space — books stacked chaotically on floors and tables, period-appropriate props scattered naturally. The scene evokes a Dickensian bookshop or an Oxford study. Seedance built the entire world around the character, not just the character.",[11,39375,39376],{},"The golden light has actual volume. It interacts correctly with silver hair edges and fabric folds, creating natural rim highlights. The light doesn't just illuminate the face — it casts subtle warm reflections on the nearest book spines and creates a gentle glow on the table surface. This kind of multi-surface light interaction is what sells the \"magical\" quality of the scene.",[11,39378,39379],{},"The expression transition is worth examining in detail. It's not a simple cut from \"neutral\" to \"amazed.\" You can see a sequence: concentration as she opens the book → slight confusion as the light first appears → recognition → genuine wonder with slightly parted lips and widened eyes. This micro-expression layering is what separates AI-generated faces that feel \"alive\" from those that feel \"posed.\"",[92,39381,38721],{"id":39382},"sora-2-2",[56,39384,60,39385],{"autoPlay":58,"loop":58,"muted":58,"playsInline":58,"style":59},[62,39386],{"src":39387,"type":65},"https://cdn.evolink.ai/skills-media/seedance2/sora2%E8%80%81%E4%BA%BA%E5%A5%87%E9%81%87.mp4",[2036,39389,39390,39400],{},[2039,39391,39392],{},[2042,39393,39394,39396,39398],{},[2045,39395,38808],{},[2045,39397,38811],{"align":13812},[2045,39399,19420],{},[2052,39401,39402,39411,39420,39429],{},[2042,39403,39404,39406,39408],{},[2057,39405,39333],{},[2057,39407,38834],{"align":13812},[2057,39409,39410],{},"Passable but \"waxy.\" Forehead and cheeks are too smooth. Aging inconsistent — some areas look 70+, others 50",[2042,39412,39413,39415,39417],{},[2057,39414,39343],{},[2057,39416,38646],{"align":13812},[2057,39418,39419],{},"Wonder comes through (mouth opens, eyes widen). But eyelid and brow expressiveness is less nuanced than Seedance",[2042,39421,39422,39424,39426],{},[2057,39423,39353],{},[2057,39425,38823],{"align":13812},[2057,39427,39428],{},"Good atmosphere with green banker's lamp. Depth of field handled well. But less layered — missing ladder, floor books, desk props",[2042,39430,39431,39433,39435],{},[2057,39432,39363],{},[2057,39434,38856],{"align":13812},[2057,39436,39437],{},"Upward lighting direction correct. Golden particle effects add magical feel. Good subsurface scattering on skin",[11,39439,39440,39443],{},[23,39441,39442],{},"The \"wax face\" problem:"," Sora 2 renders elderly skin that's simultaneously wrinkled and oddly smooth. The forehead lacks the texture density you'd expect — age spots, pore visibility, and the slight translucency of thin elderly skin are all muted. Some areas of the face read as 70+ years old (around the eyes), while others look closer to 50 (forehead, cheeks). This inconsistency breaks the uncanny valley in close-up shots — exactly the shot this prompt calls for.",[11,39445,39446],{},"The bookshop environment, while atmospheric, is less layered than Seedance's version. It has a green banker's lamp and well-handled depth of field, but lacks the rolling ladder, floor-level book stacks, brass instruments, ink bottles, and other period props that make Seedance's version feel like a real space rather than a set.",[92,39448,39450],{"id":39449},"test-3-verdict","Test 3 Verdict",[11,39452,39453,39456],{},[23,39454,39455],{},"Seedance 2.0 wins on facial detail and environmental richness."," For character-driven content — storytelling, narrative ads, emotional close-ups — Seedance produces more believable faces and richer worlds.",[11,39458,39459],{},"Both models nail the golden magical light effect. That's a tie.",[11,39461,39462],{},[23,39463,39464],{},"Score summary for Test 3:",[2036,39466,39467,39489],{},[2039,39468,39469],{},[2042,39470,39471,39473,39476,39479,39482,39485],{},[2045,39472,17185],{},[2045,39474,39475],{"align":13812},"Face Quality",[2045,39477,39478],{"align":13812},"Expression",[2045,39480,39481],{"align":13812},"Environment",[2045,39483,39484],{"align":13812},"Light Effect",[2045,39486,39487],{"align":13812},[23,39488,38991],{},[2052,39490,39491,39508],{},[2042,39492,39493,39495,39497,39499,39501,39503],{},[2057,39494,17398],{},[2057,39496,39000],{"align":13812},[2057,39498,39000],{"align":13812},[2057,39500,39009],{"align":13812},[2057,39502,39009],{"align":13812},[2057,39504,39505],{"align":13812},[23,39506,39507],{},"8.75",[2042,39509,39510,39512,39514,39516,39518,39520],{},[2057,39511,38721],{},[2057,39513,39003],{"align":13812},[2057,39515,39014],{"align":13812},[2057,39517,39000],{"align":13812},[2057,39519,39009],{"align":13812},[2057,39521,39522],{"align":13812},[23,39523,39524],{},"8.25",[11,39526,39527],{},"Seedance wins this round through more convincing facial aging and a richer environment. The \"wax face\" issue with Sora is particularly problematic in close-up shots, which are exactly what this prompt demands with its \"medium shot to close-up\" camera push.",[11,39529,39530],{},"For narrative content, short films, character-driven ads, or any application where emotional authenticity matters, Seedance's facial rendering is a meaningful advantage.",[11,39532,39533,39534,493],{},"For more on getting the best results from Seedance prompts, see our ",[37,39535,39536],{"href":1766},"prompt engineering guide",[48,39538,39540],{"id":39539},"technical-specs-comparison","Technical Specs Comparison",[11,39542,39543],{},"Here's the full technical breakdown based on our actual output analysis:",[2036,39545,39546,39557],{},[2039,39547,39548],{},[2042,39549,39550,39553,39555],{},[2045,39551,39552],{},"Specification",[2045,39554,17398],{"align":13812},[2045,39556,38721],{"align":13812},[2052,39558,39559,39569,39582,39593,39606,39619,39629,39639,39652,39665,39678,39689,39701],{},[2042,39560,39561,39565,39567],{},[2057,39562,39563],{},[23,39564,38396],{},[2057,39566,38730],{"align":13812},[2057,39568,38733],{"align":13812},[2042,39570,39571,39576,39579],{},[2057,39572,39573],{},[23,39574,39575],{},"Pixels per frame",[2057,39577,39578],{"align":13812},"921,600",[2057,39580,39581],{"align":13812},"1,835,008 (~2×)",[2042,39583,39584,39589,39591],{},[2057,39585,39586],{},[23,39587,39588],{},"Frame rate",[2057,39590,38741],{"align":13812},[2057,39592,38744],{"align":13812},[2042,39594,39595,39600,39603],{},[2057,39596,39597],{},[23,39598,39599],{},"Total frames (15s)",[2057,39601,39602],{"align":13812},"900",[2057,39604,39605],{"align":13812},"450",[2042,39607,39608,39613,39616],{},[2057,39609,39610],{},[23,39611,39612],{},"Duration range",[2057,39614,39615],{"align":13812},"4–15s",[2057,39617,39618],{"align":13812},"Up to 20s",[2042,39620,39621,39625,39627],{},[2057,39622,39623],{},[23,39624,38757],{},[2057,39626,38760],{"align":13812},[2057,39628,38760],{"align":13812},[2042,39630,39631,39635,39637],{},[2057,39632,39633],{},[23,39634,30643],{},[2057,39636,38769],{"align":13812},[2057,39638,38772],{"align":13812},[2042,39640,39641,39646,39649],{},[2057,39642,39643],{},[23,39644,39645],{},"Audio generation",[2057,39647,39648],{"align":13812},"Built-in (voice, SFX, music)",[2057,39650,39651],{"align":13812},"Built-in",[2042,39653,39654,39659,39662],{},[2057,39655,39656],{},[23,39657,39658],{},"Aspect ratios",[2057,39660,39661],{"align":13812},"16:9, 9:16, 1:1, 4:3, 3:4, 21:9",[2057,39663,39664],{"align":13812},"16:9, 9:16, 1:1",[2042,39666,39667,39672,39675],{},[2057,39668,39669],{},[23,39670,39671],{},"Input modes",[2057,39673,39674],{"align":13812},"Text, image, video, audio → video",[2057,39676,39677],{"align":13812},"Text, image → video",[2042,39679,39680,39685,39687],{},[2057,39681,39682],{},[23,39683,39684],{},"Max input images",[2057,39686,30614],{"align":13812},[2057,39688,5437],{"align":13812},[2042,39690,39691,39696,39698],{},[2057,39692,39693],{},[23,39694,39695],{},"Max input videos",[2057,39697,5056],{"align":13812},[2057,39699,39700],{"align":13812},"N/A",[2042,39702,39703,39708,39711],{},[2057,39704,39705],{},[23,39706,39707],{},"@-reference system",[2057,39709,39710],{"align":13812},"✅ (multimodal tags)",[2057,39712,13835],{"align":13812},[11,39714,39715],{},[23,39716,39717],{},"Key takeaways:",[97,39719,39720,39723,39726,39733],{},[73,39721,39722],{},"Seedance's 60fps produces 2× more frames in the same duration, which is why motion looks smoother",[73,39724,39725],{},"Sora's higher resolution is better for content that will be paused or screenshotted",[73,39727,39728,39729,39732],{},"Seedance's ",[37,39730,39731],{"href":2966},"multimodal @-reference system"," allows combining image, video, and audio inputs in a single prompt — a capability Sora 2 doesn't offer",[73,39734,39735],{},"Seedance supports 1080p output as well (see API parameters below), though our tests used the default 720p",[48,39737,39739],{"id":39738},"api-access-code-examples","API Access & Code Examples",[11,39741,39742],{},"Both models are accessible via REST APIs. Here's how to call each one.",[92,39744,39746],{"id":39745},"seedance-20-via-evolink-api","Seedance 2.0 via EvoLink API",[11,39748,39749],{},"EvoLink provides unified API access to Seedance 2.0 with async task processing. Here's a complete Python example:",[136,39751,39753],{"className":338,"code":39752,"language":340,"meta":141,"style":141},"import requests\nimport time\n\nAPI_KEY = \"your-evolink-api-key\"  # Get one at evolink.ai/dashboard/keys\nBASE_URL = \"https://api.evolink.ai/v1\"\n\ndef generate_video(prompt: str, duration: int = 15, quality: str = \"720p\") -> str:\n    \"\"\"Generate a video with Seedance 2.0 and return the video URL.\"\"\"\n\n    # Step 1: Submit generation task\n    response = requests.post(\n        f\"{BASE_URL}/video/generations\",\n        headers={\n            \"Authorization\": f\"Bearer {API_KEY}\",\n            \"Content-Type\": \"application/json\",\n        },\n        json={\n            \"model\": \"seedance-2.0\",\n            \"prompt\": prompt,\n            \"duration\": duration,\n            \"quality\": quality,\n            \"aspect_ratio\": \"16:9\",\n            \"generate_audio\": True,\n        },\n    )\n    response.raise_for_status()\n    task_id = response.json()[\"task_id\"]\n    print(f\"Task submitted: {task_id}\")\n\n    # Step 2: Poll for completion\n    while True:\n        status_resp = requests.get(\n            f\"{BASE_URL}/tasks/{task_id}\",\n            headers={\"Authorization\": f\"Bearer {API_KEY}\"},\n        )\n        status_resp.raise_for_status()\n        task = status_resp.json()\n\n        if task[\"status\"] == \"completed\":\n            video_url = task[\"output\"][\"video_url\"]\n            print(f\"Done! Video URL (valid 24h): {video_url}\")\n            return video_url\n        elif task[\"status\"] == \"failed\":\n            raise RuntimeError(f\"Task failed: {task.get('error', 'Unknown error')}\")\n\n        print(f\"Status: {task['status']}... waiting 5s\")\n        time.sleep(5)\n\n\n# Run the porcelain vase test\nvideo = generate_video(\n    prompt=(\n        \"A porcelain vase falls from a marble table in slow motion. \"\n        \"Camera starts with a close-up of the vase wobbling on the edge, \"\n        \"then follows it downward with a smooth tracking shot as it shatters \"\n        \"on a stone floor. Fragments scatter in all directions. \"\n        \"Dust particles float in warm afternoon sunlight streaming through a window. \"\n        \"Shallow depth of field, 24fps cinematic look\"\n    ),\n    duration=15,\n    quality=\"720p\",\n)\n",[28,39754,39755,39761,39767,39771,39782,39790,39794,39829,39834,39838,39843,39851,39864,39872,39889,39901,39906,39914,39924,39930,39936,39942,39953,39964,39968,39972,39976,39988,40008,40012,40017,40025,40033,40053,40075,40079,40083,40091,40095,40111,40127,40148,40155,40171,40201,40205,40231,40239,40243,40247,40252,40262,40270,40275,40280,40285,40290,40295,40300,40304,40314,40324],{"__ignoreMap":141},[145,39756,39757,39759],{"class":147,"line":148},[145,39758,347],{"class":258},[145,39760,328],{"class":262},[145,39762,39763,39765],{"class":147,"line":166},[145,39764,347],{"class":258},[145,39766,356],{"class":262},[145,39768,39769],{"class":147,"line":178},[145,39770,376],{"emptyLinePlaceholder":58},[145,39772,39773,39775,39777,39779],{"class":147,"line":187},[145,39774,388],{"class":155},[145,39776,391],{"class":258},[145,39778,14678],{"class":159},[145,39780,39781],{"class":174},"  # Get one at evolink.ai/dashboard/keys\n",[145,39783,39784,39786,39788],{"class":147,"line":373},[145,39785,412],{"class":155},[145,39787,391],{"class":258},[145,39789,417],{"class":159},[145,39791,39792],{"class":147,"line":379},[145,39793,376],{"emptyLinePlaceholder":58},[145,39795,39796,39798,39800,39802,39804,39807,39809,39811,39813,39816,39818,39820,39823,39825,39827],{"class":147,"line":385},[145,39797,526],{"class":258},[145,39799,14736],{"class":151},[145,39801,15837],{"class":262},[145,39803,8673],{"class":155},[145,39805,39806],{"class":262},", duration: ",[145,39808,17756],{"class":155},[145,39810,391],{"class":258},[145,39812,5995],{"class":155},[145,39814,39815],{"class":262},", quality: ",[145,39817,8673],{"class":155},[145,39819,391],{"class":258},[145,39821,39822],{"class":159}," \"720p\"",[145,39824,15842],{"class":262},[145,39826,8673],{"class":155},[145,39828,860],{"class":262},[145,39830,39831],{"class":147,"line":409},[145,39832,39833],{"class":159},"    \"\"\"Generate a video with Seedance 2.0 and return the video URL.\"\"\"\n",[145,39835,39836],{"class":147,"line":420},[145,39837,376],{"emptyLinePlaceholder":58},[145,39839,39840],{"class":147,"line":431},[145,39841,39842],{"class":174},"    # Step 1: Submit generation task\n",[145,39844,39845,39847,39849],{"class":147,"line":455},[145,39846,1427],{"class":262},[145,39848,266],{"class":258},[145,39850,1432],{"class":262},[145,39852,39853,39855,39857,39859,39862],{"class":147,"line":466},[145,39854,1437],{"class":258},[145,39856,449],{"class":159},[145,39858,679],{"class":155},[145,39860,39861],{"class":159},"/video/generations\"",[145,39863,452],{"class":262},[145,39865,39866,39868,39870],{"class":147,"line":600},[145,39867,1455],{"class":701},[145,39869,266],{"class":258},[145,39871,1865],{"class":262},[145,39873,39874,39877,39879,39881,39883,39885,39887],{"class":147,"line":605},[145,39875,39876],{"class":159},"            \"Authorization\"",[145,39878,437],{"class":262},[145,39880,440],{"class":258},[145,39882,443],{"class":159},[145,39884,446],{"class":155},[145,39886,449],{"class":159},[145,39888,452],{"class":262},[145,39890,39891,39894,39896,39899],{"class":147,"line":611},[145,39892,39893],{"class":159},"            \"Content-Type\"",[145,39895,437],{"class":262},[145,39897,39898],{"class":159},"\"application/json\"",[145,39900,452],{"class":262},[145,39902,39903],{"class":147,"line":617},[145,39904,39905],{"class":262},"        },\n",[145,39907,39908,39910,39912],{"class":147,"line":623},[145,39909,1470],{"class":701},[145,39911,266],{"class":258},[145,39913,1865],{"class":262},[145,39915,39916,39918,39920,39922],{"class":147,"line":628},[145,39917,8477],{"class":159},[145,39919,437],{"class":262},[145,39921,1308],{"class":159},[145,39923,452],{"class":262},[145,39925,39926,39928],{"class":147,"line":639},[145,39927,8488],{"class":159},[145,39929,8491],{"class":262},[145,39931,39932,39934],{"class":147,"line":654},[145,39933,8496],{"class":159},[145,39935,16866],{"class":262},[145,39937,39938,39940],{"class":147,"line":660},[145,39939,8507],{"class":159},[145,39941,16874],{"class":262},[145,39943,39944,39947,39949,39951],{"class":147,"line":671},[145,39945,39946],{"class":159},"            \"aspect_ratio\"",[145,39948,437],{"class":262},[145,39950,1384],{"class":159},[145,39952,452],{"class":262},[145,39954,39955,39958,39960,39962],{"class":147,"line":698},[145,39956,39957],{"class":159},"            \"generate_audio\"",[145,39959,437],{"class":262},[145,39961,1139],{"class":155},[145,39963,452],{"class":262},[145,39965,39966],{"class":147,"line":710},[145,39967,39905],{"class":262},[145,39969,39970],{"class":147,"line":716},[145,39971,1483],{"class":262},[145,39973,39974],{"class":147,"line":722},[145,39975,2797],{"class":262},[145,39977,39978,39980,39982,39984,39986],{"class":147,"line":728},[145,39979,7218],{"class":262},[145,39981,266],{"class":258},[145,39983,12209],{"class":262},[145,39985,7693],{"class":159},[145,39987,764],{"class":262},[145,39989,39990,39992,39994,39996,39998,40000,40002,40004,40006],{"class":147,"line":739},[145,39991,1102],{"class":155},[145,39993,794],{"class":262},[145,39995,440],{"class":258},[145,39997,6591],{"class":159},[145,39999,685],{"class":155},[145,40001,688],{"class":262},[145,40003,691],{"class":155},[145,40005,449],{"class":159},[145,40007,406],{"class":262},[145,40009,40010],{"class":147,"line":744},[145,40011,376],{"emptyLinePlaceholder":58},[145,40013,40014],{"class":147,"line":750},[145,40015,40016],{"class":174},"    # Step 2: Poll for completion\n",[145,40018,40019,40021,40023],{"class":147,"line":767},[145,40020,642],{"class":258},[145,40022,14859],{"class":155},[145,40024,860],{"class":262},[145,40026,40027,40029,40031],{"class":147,"line":788},[145,40028,14866],{"class":262},[145,40030,266],{"class":258},[145,40032,668],{"class":262},[145,40034,40035,40037,40039,40041,40043,40045,40047,40049,40051],{"class":147,"line":834},[145,40036,674],{"class":258},[145,40038,449],{"class":159},[145,40040,679],{"class":155},[145,40042,682],{"class":159},[145,40044,685],{"class":155},[145,40046,688],{"class":262},[145,40048,691],{"class":155},[145,40050,449],{"class":159},[145,40052,452],{"class":262},[145,40054,40055,40057,40059,40061,40063,40065,40067,40069,40071,40073],{"class":147,"line":839},[145,40056,702],{"class":701},[145,40058,266],{"class":258},[145,40060,685],{"class":262},[145,40062,31543],{"class":159},[145,40064,437],{"class":262},[145,40066,440],{"class":258},[145,40068,443],{"class":159},[145,40070,446],{"class":155},[145,40072,449],{"class":159},[145,40074,19590],{"class":262},[145,40076,40077],{"class":147,"line":845},[145,40078,713],{"class":262},[145,40080,40081],{"class":147,"line":863},[145,40082,14907],{"class":262},[145,40084,40085,40087,40089],{"class":147,"line":872},[145,40086,731],{"class":262},[145,40088,266],{"class":258},[145,40090,14916],{"class":262},[145,40092,40093],{"class":147,"line":887},[145,40094,376],{"emptyLinePlaceholder":58},[145,40096,40097,40099,40101,40103,40105,40107,40109],{"class":147,"line":903},[145,40098,848],{"class":258},[145,40100,758],{"class":262},[145,40102,761],{"class":159},[145,40104,14931],{"class":262},[145,40106,854],{"class":258},[145,40108,857],{"class":159},[145,40110,860],{"class":262},[145,40112,40113,40115,40117,40119,40121,40123,40125],{"class":147,"line":915},[145,40114,7404],{"class":262},[145,40116,266],{"class":258},[145,40118,758],{"class":262},[145,40120,21539],{"class":159},[145,40122,1562],{"class":262},[145,40124,14953],{"class":159},[145,40126,764],{"class":262},[145,40128,40129,40131,40133,40135,40138,40140,40142,40144,40146],{"class":147,"line":953},[145,40130,5577],{"class":155},[145,40132,794],{"class":262},[145,40134,440],{"class":258},[145,40136,40137],{"class":159},"\"Done! Video URL (valid 24h): ",[145,40139,685],{"class":155},[145,40141,1678],{"class":262},[145,40143,691],{"class":155},[145,40145,449],{"class":159},[145,40147,406],{"class":262},[145,40149,40150,40152],{"class":147,"line":959},[145,40151,866],{"class":258},[145,40153,40154],{"class":262}," video_url\n",[145,40156,40157,40159,40161,40163,40165,40167,40169],{"class":147,"line":964},[145,40158,875],{"class":258},[145,40160,758],{"class":262},[145,40162,761],{"class":159},[145,40164,14931],{"class":262},[145,40166,854],{"class":258},[145,40168,882],{"class":159},[145,40170,860],{"class":262},[145,40172,40173,40175,40177,40179,40181,40183,40185,40187,40189,40191,40193,40195,40197,40199],{"class":147,"line":970},[145,40174,906],{"class":258},[145,40176,909],{"class":155},[145,40178,794],{"class":262},[145,40180,440],{"class":258},[145,40182,15011],{"class":159},[145,40184,685],{"class":155},[145,40186,17940],{"class":262},[145,40188,11865],{"class":159},[145,40190,400],{"class":262},[145,40192,943],{"class":159},[145,40194,108],{"class":262},[145,40196,691],{"class":155},[145,40198,449],{"class":159},[145,40200,406],{"class":262},[145,40202,40203],{"class":147,"line":976},[145,40204,376],{"emptyLinePlaceholder":58},[145,40206,40207,40209,40211,40213,40215,40217,40219,40222,40224,40226,40229],{"class":147,"line":988},[145,40208,791],{"class":155},[145,40210,794],{"class":262},[145,40212,440],{"class":258},[145,40214,11894],{"class":159},[145,40216,685],{"class":155},[145,40218,1529],{"class":262},[145,40220,40221],{"class":159},"'status'",[145,40223,1535],{"class":262},[145,40225,691],{"class":155},[145,40227,40228],{"class":159},"... waiting 5s\"",[145,40230,406],{"class":262},[145,40232,40233,40235,40237],{"class":147,"line":993},[145,40234,15068],{"class":262},[145,40236,1352],{"class":155},[145,40238,406],{"class":262},[145,40240,40241],{"class":147,"line":5531},[145,40242,376],{"emptyLinePlaceholder":58},[145,40244,40245],{"class":147,"line":5540},[145,40246,376],{"emptyLinePlaceholder":58},[145,40248,40249],{"class":147,"line":5546},[145,40250,40251],{"class":174},"# Run the porcelain vase test\n",[145,40253,40254,40257,40259],{"class":147,"line":5574},[145,40255,40256],{"class":262},"video ",[145,40258,266],{"class":258},[145,40260,40261],{"class":262}," generate_video(\n",[145,40263,40264,40266,40268],{"class":147,"line":5605},[145,40265,17039],{"class":701},[145,40267,266],{"class":258},[145,40269,912],{"class":262},[145,40271,40272],{"class":147,"line":5625},[145,40273,40274],{"class":159},"        \"A porcelain vase falls from a marble table in slow motion. \"\n",[145,40276,40277],{"class":147,"line":5631},[145,40278,40279],{"class":159},"        \"Camera starts with a close-up of the vase wobbling on the edge, \"\n",[145,40281,40282],{"class":147,"line":5637},[145,40283,40284],{"class":159},"        \"then follows it downward with a smooth tracking shot as it shatters \"\n",[145,40286,40287],{"class":147,"line":5642},[145,40288,40289],{"class":159},"        \"on a stone floor. Fragments scatter in all directions. \"\n",[145,40291,40292],{"class":147,"line":5655},[145,40293,40294],{"class":159},"        \"Dust particles float in warm afternoon sunlight streaming through a window. \"\n",[145,40296,40297],{"class":147,"line":5661},[145,40298,40299],{"class":159},"        \"Shallow depth of field, 24fps cinematic look\"\n",[145,40301,40302],{"class":147,"line":5688},[145,40303,3804],{"class":262},[145,40305,40306,40308,40310,40312],{"class":147,"line":5728},[145,40307,17066],{"class":701},[145,40309,266],{"class":258},[145,40311,3905],{"class":155},[145,40313,452],{"class":262},[145,40315,40316,40318,40320,40322],{"class":147,"line":5747},[145,40317,17077],{"class":701},[145,40319,266],{"class":258},[145,40321,1368],{"class":159},[145,40323,452],{"class":262},[145,40325,40326],{"class":147,"line":5752},[145,40327,406],{"class":262},[11,40329,40330,40333],{},[23,40331,40332],{},"Multimodal input example"," — using an image as the first frame:",[136,40335,40337],{"className":338,"code":40336,"language":340,"meta":141,"style":141},"response = requests.post(\n    f\"{BASE_URL}/video/generations\",\n    headers={\n        \"Authorization\": f\"Bearer {API_KEY}\",\n        \"Content-Type\": \"application/json\",\n    },\n    json={\n        \"model\": \"seedance-2.0\",\n        \"prompt\": \"@Image1 as first frame, the vase begins to wobble and fall\",\n        \"image_urls\": [\"https://example.com/porcelain-vase.jpg\"],\n        \"duration\": 10,\n        \"quality\": \"1080p\",\n    },\n)\n",[28,40338,40339,40347,40359,40367,40384,40395,40399,40407,40417,40428,40439,40449,40459,40463],{"__ignoreMap":141},[145,40340,40341,40343,40345],{"class":147,"line":148},[145,40342,6529],{"class":262},[145,40344,266],{"class":258},[145,40346,1432],{"class":262},[145,40348,40349,40351,40353,40355,40357],{"class":147,"line":166},[145,40350,6538],{"class":258},[145,40352,449],{"class":159},[145,40354,679],{"class":155},[145,40356,39861],{"class":159},[145,40358,452],{"class":262},[145,40360,40361,40363,40365],{"class":147,"line":178},[145,40362,6551],{"class":701},[145,40364,266],{"class":258},[145,40366,1865],{"class":262},[145,40368,40369,40372,40374,40376,40378,40380,40382],{"class":147,"line":187},[145,40370,40371],{"class":159},"        \"Authorization\"",[145,40373,437],{"class":262},[145,40375,440],{"class":258},[145,40377,443],{"class":159},[145,40379,446],{"class":155},[145,40381,449],{"class":159},[145,40383,452],{"class":262},[145,40385,40386,40389,40391,40393],{"class":147,"line":373},[145,40387,40388],{"class":159},"        \"Content-Type\"",[145,40390,437],{"class":262},[145,40392,39898],{"class":159},[145,40394,452],{"class":262},[145,40396,40397],{"class":147,"line":379},[145,40398,22204],{"class":262},[145,40400,40401,40403,40405],{"class":147,"line":385},[145,40402,6562],{"class":701},[145,40404,266],{"class":258},[145,40406,1865],{"class":262},[145,40408,40409,40411,40413,40415],{"class":147,"line":409},[145,40410,1303],{"class":159},[145,40412,437],{"class":262},[145,40414,1308],{"class":159},[145,40416,452],{"class":262},[145,40418,40419,40421,40423,40426],{"class":147,"line":420},[145,40420,1319],{"class":159},[145,40422,437],{"class":262},[145,40424,40425],{"class":159},"\"@Image1 as first frame, the vase begins to wobble and fall\"",[145,40427,452],{"class":262},[145,40429,40430,40432,40434,40437],{"class":147,"line":431},[145,40431,2688],{"class":159},[145,40433,10841],{"class":262},[145,40435,40436],{"class":159},"\"https://example.com/porcelain-vase.jpg\"",[145,40438,10847],{"class":262},[145,40440,40441,40443,40445,40447],{"class":147,"line":455},[145,40442,1347],{"class":159},[145,40444,437],{"class":262},[145,40446,537],{"class":155},[145,40448,452],{"class":262},[145,40450,40451,40453,40455,40457],{"class":147,"line":466},[145,40452,1363],{"class":159},[145,40454,437],{"class":262},[145,40456,3710],{"class":159},[145,40458,452],{"class":262},[145,40460,40461],{"class":147,"line":600},[145,40462,22204],{"class":262},[145,40464,40465],{"class":147,"line":605},[145,40466,406],{"class":262},[11,40468,40469,40470,493],{},"For advanced multimodal workflows with @Image, @Video, and @Audio references, see our ",[37,40471,40472],{"href":2966},"@Tags guide",[92,40474,40476],{"id":40475},"sora-2-via-openai-api","Sora 2 via OpenAI API",[136,40478,40480],{"className":338,"code":40479,"language":340,"meta":141,"style":141},"from openai import OpenAI\n\nclient = OpenAI()  # Uses OPENAI_API_KEY env var\n\n# Submit video generation\nresponse = client.responses.create(\n    model=\"sora\",\n    input=[{\n        \"type\": \"text\",\n        \"text\": (\n            \"A porcelain vase falls from a marble table in slow motion. \"\n            \"Camera starts with a close-up of the vase wobbling on the edge, \"\n            \"then follows it downward with a smooth tracking shot as it shatters \"\n            \"on a stone floor. Fragments scatter in all directions. \"\n            \"Dust particles float in warm afternoon sunlight streaming through a window. \"\n            \"Shallow depth of field, 24fps cinematic look\"\n        ),\n    }],\n    resolution=\"1080p\",\n    duration=15,\n)\n\n# Get the video URL from the response\nvideo_url = response.output[0].url\nprint(f\"Video URL: {video_url}\")\n",[28,40481,40482,40494,40498,40511,40515,40520,40529,40541,40551,40563,40570,40575,40580,40585,40590,40595,40600,40604,40609,40620,40630,40634,40638,40643,40657],{"__ignoreMap":141},[145,40483,40484,40486,40489,40491],{"class":147,"line":148},[145,40485,6728],{"class":258},[145,40487,40488],{"class":262}," openai ",[145,40490,347],{"class":258},[145,40492,40493],{"class":262}," OpenAI\n",[145,40495,40496],{"class":147,"line":166},[145,40497,376],{"emptyLinePlaceholder":58},[145,40499,40500,40503,40505,40508],{"class":147,"line":178},[145,40501,40502],{"class":262},"client ",[145,40504,266],{"class":258},[145,40506,40507],{"class":262}," OpenAI()  ",[145,40509,40510],{"class":174},"# Uses OPENAI_API_KEY env var\n",[145,40512,40513],{"class":147,"line":187},[145,40514,376],{"emptyLinePlaceholder":58},[145,40516,40517],{"class":147,"line":373},[145,40518,40519],{"class":174},"# Submit video generation\n",[145,40521,40522,40524,40526],{"class":147,"line":379},[145,40523,6529],{"class":262},[145,40525,266],{"class":258},[145,40527,40528],{"class":262}," client.responses.create(\n",[145,40530,40531,40534,40536,40539],{"class":147,"line":385},[145,40532,40533],{"class":701},"    model",[145,40535,266],{"class":258},[145,40537,40538],{"class":159},"\"sora\"",[145,40540,452],{"class":262},[145,40542,40543,40546,40548],{"class":147,"line":409},[145,40544,40545],{"class":701},"    input",[145,40547,266],{"class":258},[145,40549,40550],{"class":262},"[{\n",[145,40552,40553,40556,40558,40561],{"class":147,"line":420},[145,40554,40555],{"class":159},"        \"type\"",[145,40557,437],{"class":262},[145,40559,40560],{"class":159},"\"text\"",[145,40562,452],{"class":262},[145,40564,40565,40568],{"class":147,"line":431},[145,40566,40567],{"class":159},"        \"text\"",[145,40569,1322],{"class":262},[145,40571,40572],{"class":147,"line":455},[145,40573,40574],{"class":159},"            \"A porcelain vase falls from a marble table in slow motion. \"\n",[145,40576,40577],{"class":147,"line":466},[145,40578,40579],{"class":159},"            \"Camera starts with a close-up of the vase wobbling on the edge, \"\n",[145,40581,40582],{"class":147,"line":600},[145,40583,40584],{"class":159},"            \"then follows it downward with a smooth tracking shot as it shatters \"\n",[145,40586,40587],{"class":147,"line":605},[145,40588,40589],{"class":159},"            \"on a stone floor. Fragments scatter in all directions. \"\n",[145,40591,40592],{"class":147,"line":611},[145,40593,40594],{"class":159},"            \"Dust particles float in warm afternoon sunlight streaming through a window. \"\n",[145,40596,40597],{"class":147,"line":617},[145,40598,40599],{"class":159},"            \"Shallow depth of field, 24fps cinematic look\"\n",[145,40601,40602],{"class":147,"line":623},[145,40603,1342],{"class":262},[145,40605,40606],{"class":147,"line":628},[145,40607,40608],{"class":262},"    }],\n",[145,40610,40611,40614,40616,40618],{"class":147,"line":639},[145,40612,40613],{"class":701},"    resolution",[145,40615,266],{"class":258},[145,40617,3710],{"class":159},[145,40619,452],{"class":262},[145,40621,40622,40624,40626,40628],{"class":147,"line":654},[145,40623,17066],{"class":701},[145,40625,266],{"class":258},[145,40627,3905],{"class":155},[145,40629,452],{"class":262},[145,40631,40632],{"class":147,"line":660},[145,40633,406],{"class":262},[145,40635,40636],{"class":147,"line":671},[145,40637,376],{"emptyLinePlaceholder":58},[145,40639,40640],{"class":147,"line":698},[145,40641,40642],{"class":174},"# Get the video URL from the response\n",[145,40644,40645,40647,40649,40652,40654],{"class":147,"line":710},[145,40646,29860],{"class":262},[145,40648,266],{"class":258},[145,40650,40651],{"class":262}," response.output[",[145,40653,783],{"class":155},[145,40655,40656],{"class":262},"].url\n",[145,40658,40659,40661,40663,40665,40668,40670,40672,40674,40676],{"class":147,"line":716},[145,40660,6584],{"class":155},[145,40662,794],{"class":262},[145,40664,440],{"class":258},[145,40666,40667],{"class":159},"\"Video URL: ",[145,40669,685],{"class":155},[145,40671,1678],{"class":262},[145,40673,691],{"class":155},[145,40675,449],{"class":159},[145,40677,406],{"class":262},[11,40679,40680],{},"Both APIs follow a similar pattern: submit a prompt, get back a video. But the differences go beyond just the endpoint.",[11,40682,40683,40686],{},[23,40684,40685],{},"Async vs sync:"," The EvoLink API for Seedance is asynchronous — you submit a task and poll for completion (or use a webhook callback). Sora via OpenAI returns directly. For production pipelines processing many videos, the async pattern is often preferable since you can submit batches without blocking.",[11,40688,40689,40692],{},[23,40690,40691],{},"Input flexibility:"," Seedance's @-reference system lets you combine up to 9 images, 3 videos, and 3 audio tracks in a single prompt. You can say \"@Image1 as first frame, replicate @Video1 camera movement, sync to @Audio1 beat.\" Sora 2 supports image input but doesn't offer this kind of multimodal composition.",[11,40694,40695,40698],{},[23,40696,40697],{},"Output options:"," Seedance lets you toggle audio generation on or off per request, choose from six aspect ratios (including 21:9 ultrawide), and select 480p/720p/1080p resolution. Sora offers fewer output configuration options but delivers higher default resolution.",[11,40700,40701,40703],{},[23,40702,22037],{}," EvoLink video URLs expire after 24 hours — download or cache them immediately. Plan your pipeline accordingly.",[38649,40705,40706],{"type":21862},[11,40707,40708,14284,40711,40714],{},[23,40709,40710],{},"Run this comparison yourself.",[37,40712,40713],{"href":16474},"Get your EvoLink API key"," and test with your own prompts. The code above works out of the box.",[48,40716,40718],{"id":40717},"pricing-breakdown","Pricing Breakdown",[11,40720,40721],{},"Cost per 15-second video at default settings, as of February 2026:",[92,40723,40725],{"id":40724},"sora-2-via-openai-evolink","Sora 2 (via OpenAI / EvoLink)",[2036,40727,40728,40739],{},[2039,40729,40730],{},[2042,40731,40732,40734,40736],{},[2045,40733,38396],{},[2045,40735,18337],{"align":13812},[2045,40737,40738],{"align":13812},"Price per video",[2052,40740,40741,40752,40763,40775],{},[2042,40742,40743,40745,40747],{},[2057,40744,1786],{},[2057,40746,4069],{"align":13812},[2057,40748,40749],{"align":13812},[23,40750,40751],{},"$0.50",[2042,40753,40754,40756,40758],{},[2057,40755,1786],{},[2057,40757,4072],{"align":13812},[2057,40759,40760],{"align":13812},[23,40761,40762],{},"$1.00",[2042,40764,40765,40767,40770],{},[2057,40766,1786],{},[2057,40768,40769],{"align":13812},"12s",[2057,40771,40772],{"align":13812},[23,40773,40774],{},"$1.20",[2042,40776,40777,40779,40782],{},[2057,40778,1786],{},[2057,40780,40781],{"align":13812},"20s",[2057,40783,40784],{"align":13812},[23,40785,40786],{},"$2.00",[11,40788,40789,40790,40793,40794,40797],{},"That works out to ",[23,40791,40792],{},"$0.10/second"," at 720p standard tier. Our 15-second test videos cost approximately ",[23,40795,40796],{},"$1.50 each"," on Sora 2.",[11,40799,40800],{},[2619,40801,40802,40803,40808],{},"Source: ",[37,40804,40807],{"href":40805,"rel":40806},"https://seedance2api.app/pricing",[41],"seedance2api.app/pricing",", as of Feb 2026",[92,40810,40812],{"id":40811},"seedance-20-via-evolink","Seedance 2.0 (via EvoLink)",[11,40814,40815,40818],{},[23,40816,40817],{},"Pricing coming soon."," Seedance 2.0 pricing will be announced at launch. The model supports 480p, 720p, and 1080p output with optional audio generation.",[11,40820,40821],{},"For context, here's how it stacks up against other models in the market:",[2036,40823,40824,40839],{},[2039,40825,40826],{},[2042,40827,40828,40830,40833,40836],{},[2045,40829,17185],{},[2045,40831,40832],{"align":13812},"Cost per second",[2045,40834,40835],{"align":13812},"Est. cost per video",[2045,40837,40838],{"align":13812},"Max resolution",[2052,40840,40841,40852,40865,40879],{},[2042,40842,40843,40845,40848,40850],{},[2057,40844,17398],{},[2057,40846,40847],{"align":13812},"Coming soon",[2057,40849,40847],{"align":13812},[2057,40851,1794],{"align":13812},[2042,40853,40854,40856,40859,40862],{},[2057,40855,38721],{},[2057,40857,40858],{"align":13812},"$0.10 (720p)",[2057,40860,40861],{"align":13812},"$1.20 / 12s",[2057,40863,40864],{"align":13812},"720p (Std) / 1080p (Pro)",[2042,40866,40867,40870,40873,40876],{},[2057,40868,40869],{},"Kling 3.0",[2057,40871,40872],{"align":13812},"$0.112 (1080p)",[2057,40874,40875],{"align":13812},"$1.12 / 10s",[2057,40877,40878],{"align":13812},"4K",[2042,40880,40881,40884,40887,40890],{},[2057,40882,40883],{},"Veo 3.1",[2057,40885,40886],{"align":13812},"$0.40 (1080p)",[2057,40888,40889],{"align":13812},"$3.20 / 8s",[2057,40891,40878],{"align":13812},[11,40893,40894],{},[2619,40895,40802,40896],{},[37,40897,40807],{"href":40805,"rel":40898},[41],[11,40900,40901,40904],{},[37,40902,40903],{"href":16474},"Get early access"," to lock in launch pricing when it's announced.",[92,40906,40908],{"id":40907},"cost-considerations","Cost Considerations",[97,40910,40911,40917,40923,40929,40939,40945],{},[73,40912,40913,40916],{},[23,40914,40915],{},"Resolution tradeoff:"," Seedance at 720p costs less than Sora at 1080p, but delivers 60fps vs 30fps. Depending on your use case, the higher frame rate may be more valuable than the higher resolution.",[73,40918,40919,40922],{},[23,40920,40921],{},"Audio bundling:"," Both models can generate synchronized audio. Factor this into your per-video cost if you'd otherwise need separate audio generation.",[73,40924,40925,40928],{},[23,40926,40927],{},"Volume matters:"," For production workloads generating hundreds of videos, even small per-second differences compound. Test both with your actual prompts before committing.",[73,40930,40931,40934,40935,40938],{},[23,40932,40933],{},"Intellectual property:"," Seedance 2.0 outputs include ",[37,40936,40937],{"href":9202},"commercial usage rights"," — verify the latest terms for your use case.",[73,40940,40941,40944],{},[23,40942,40943],{},"Hidden costs:"," Don't forget bandwidth, storage, and post-processing. Sora's higher resolution means larger file sizes (~2× per frame). If you're serving these videos to end users, CDN costs scale with file size. Seedance's 60fps means more frames per second but at lower resolution, resulting in comparable file sizes.",[73,40946,40947,40950,40951,40954],{},[23,40948,40949],{},"Free tier testing:"," Before committing to either API for production, run your actual prompts through both. The results from these three prompts may not generalize to your specific content domain. EvoLink offers a ",[37,40952,40953],{"href":16474},"free API key"," to get started with Seedance testing.",[48,40956,40958],{"id":40957},"when-to-choose-which","When to Choose Which",[11,40960,40961],{},"Picking a model isn't about \"which is better\" — it's about matching capabilities to your specific use case.",[92,40963,40965],{"id":40964},"choose-seedance-20-when","Choose Seedance 2.0 when:",[97,40967,40968,40974,40980,40986,40994,41000],{},[73,40969,40970,40973],{},[23,40971,40972],{},"Dynamic human content"," — dance, sports, action, fitness. The anatomy accuracy gap (8.5 vs 6.5 in our test) is significant.",[73,40975,40976,40979],{},[23,40977,40978],{},"Slow-motion or high-motion content"," — 60fps makes a visible difference in ads, product demos, and cinematic sequences.",[73,40981,40982,40985],{},[23,40983,40984],{},"Character close-ups"," — facial detail and micro-expression rendering are more convincing, especially for elderly or highly detailed faces.",[73,40987,40988,40991,40992,493],{},[23,40989,40990],{},"Multimodal workflows"," — you need to combine reference images, videos, and audio in a single generation using the ",[37,40993,39707],{"href":2966},[73,40995,40996,40999],{},[23,40997,40998],{},"Rich environment scenes"," — Seedance builds more detailed, \"lived-in\" environments with more props and depth layers.",[73,41001,41002,41005],{},[23,41003,41004],{},"Flexible aspect ratios"," — 21:9 ultrawide and 4:3 formats aren't available on Sora.",[92,41007,41009],{"id":41008},"choose-sora-2-when","Choose Sora 2 when:",[97,41011,41012,41018,41024,41030],{},[73,41013,41014,41017],{},[23,41015,41016],{},"Maximum resolution matters"," — if your output will be displayed at 1080p+ or screenshotted/paused frequently, Sora's higher pixel count wins.",[73,41019,41020,41023],{},[23,41021,41022],{},"Object destruction physics"," — fracture detail on breaking objects is more convincing (uneven thickness, visible internal material layers).",[73,41025,41026,41029],{},[23,41027,41028],{},"Static or slow-moving scenes"," — when the 60fps advantage doesn't apply, Sora's resolution advantage is uncontested.",[73,41031,41032,41035],{},[23,41033,41034],{},"Existing OpenAI integration"," — if your stack already uses the OpenAI SDK, adding Sora requires minimal new infrastructure.",[92,41037,41039],{"id":41038},"the-hybrid-approach","The hybrid approach",[11,41041,41042],{},"For production pipelines, consider using both. Generate character/motion content with Seedance 2.0 and object/environment establishing shots with Sora 2. Both APIs follow standard REST patterns, making it straightforward to route prompts based on content type.",[11,41044,41045],{},"A simple routing heuristic based on our test results:",[136,41047,41049],{"className":338,"code":41048,"language":340,"meta":141,"style":141},"def choose_model(prompt: str, needs_pause_quality: bool = False) -> str:\n    \"\"\"Route to the better model based on content type.\"\"\"\n    motion_keywords = [\"dance\", \"run\", \"fight\", \"sport\", \"action\", \"slow motion\", \"jump\"]\n    face_keywords = [\"close-up\", \"expression\", \"portrait\", \"face\", \"emotion\", \"elderly\"]\n    \n    prompt_lower = prompt.lower()\n    \n    if any(kw in prompt_lower for kw in motion_keywords):\n        return \"seedance-2.0\"  # Better anatomy + 60fps\n    if any(kw in prompt_lower for kw in face_keywords):\n        return \"seedance-2.0\"  # Better facial detail\n    if needs_pause_quality:\n        return \"sora\"          # Higher resolution for screenshots\n    return \"seedance-2.0\"      # Default to higher overall score\n",[28,41050,41051,41079,41084,41128,41167,41171,41179,41183,41208,41218,41239,41248,41255,41265],{"__ignoreMap":141},[145,41052,41053,41055,41058,41060,41062,41065,41068,41070,41073,41075,41077],{"class":147,"line":148},[145,41054,526],{"class":258},[145,41056,41057],{"class":151}," choose_model",[145,41059,15837],{"class":262},[145,41061,8673],{"class":155},[145,41063,41064],{"class":262},", needs_pause_quality: ",[145,41066,41067],{"class":155},"bool",[145,41069,391],{"class":258},[145,41071,41072],{"class":155}," False",[145,41074,15842],{"class":262},[145,41076,8673],{"class":155},[145,41078,860],{"class":262},[145,41080,41081],{"class":147,"line":166},[145,41082,41083],{"class":159},"    \"\"\"Route to the better model based on content type.\"\"\"\n",[145,41085,41086,41089,41091,41093,41096,41098,41101,41103,41106,41108,41111,41113,41116,41118,41121,41123,41126],{"class":147,"line":178},[145,41087,41088],{"class":262},"    motion_keywords ",[145,41090,266],{"class":258},[145,41092,8192],{"class":262},[145,41094,41095],{"class":159},"\"dance\"",[145,41097,400],{"class":262},[145,41099,41100],{"class":159},"\"run\"",[145,41102,400],{"class":262},[145,41104,41105],{"class":159},"\"fight\"",[145,41107,400],{"class":262},[145,41109,41110],{"class":159},"\"sport\"",[145,41112,400],{"class":262},[145,41114,41115],{"class":159},"\"action\"",[145,41117,400],{"class":262},[145,41119,41120],{"class":159},"\"slow motion\"",[145,41122,400],{"class":262},[145,41124,41125],{"class":159},"\"jump\"",[145,41127,764],{"class":262},[145,41129,41130,41133,41135,41137,41140,41142,41145,41147,41150,41152,41155,41157,41160,41162,41165],{"class":147,"line":187},[145,41131,41132],{"class":262},"    face_keywords ",[145,41134,266],{"class":258},[145,41136,8192],{"class":262},[145,41138,41139],{"class":159},"\"close-up\"",[145,41141,400],{"class":262},[145,41143,41144],{"class":159},"\"expression\"",[145,41146,400],{"class":262},[145,41148,41149],{"class":159},"\"portrait\"",[145,41151,400],{"class":262},[145,41153,41154],{"class":159},"\"face\"",[145,41156,400],{"class":262},[145,41158,41159],{"class":159},"\"emotion\"",[145,41161,400],{"class":262},[145,41163,41164],{"class":159},"\"elderly\"",[145,41166,764],{"class":262},[145,41168,41169],{"class":147,"line":373},[145,41170,563],{"class":262},[145,41172,41173,41175,41177],{"class":147,"line":379},[145,41174,15856],{"class":262},[145,41176,266],{"class":258},[145,41178,15861],{"class":262},[145,41180,41181],{"class":147,"line":385},[145,41182,563],{"class":262},[145,41184,41185,41187,41190,41193,41195,41198,41200,41203,41205],{"class":147,"line":409},[145,41186,2506],{"class":258},[145,41188,41189],{"class":155}," any",[145,41191,41192],{"class":262},"(kw ",[145,41194,1180],{"class":258},[145,41196,41197],{"class":262}," prompt_lower ",[145,41199,8229],{"class":258},[145,41201,41202],{"class":262}," kw ",[145,41204,1180],{"class":258},[145,41206,41207],{"class":262}," motion_keywords):\n",[145,41209,41210,41212,41215],{"class":147,"line":420},[145,41211,7193],{"class":258},[145,41213,41214],{"class":159}," \"seedance-2.0\"",[145,41216,41217],{"class":174},"  # Better anatomy + 60fps\n",[145,41219,41220,41222,41224,41226,41228,41230,41232,41234,41236],{"class":147,"line":431},[145,41221,2506],{"class":258},[145,41223,41189],{"class":155},[145,41225,41192],{"class":262},[145,41227,1180],{"class":258},[145,41229,41197],{"class":262},[145,41231,8229],{"class":258},[145,41233,41202],{"class":262},[145,41235,1180],{"class":258},[145,41237,41238],{"class":262}," face_keywords):\n",[145,41240,41241,41243,41245],{"class":147,"line":455},[145,41242,7193],{"class":258},[145,41244,41214],{"class":159},[145,41246,41247],{"class":174},"  # Better facial detail\n",[145,41249,41250,41252],{"class":147,"line":466},[145,41251,2506],{"class":258},[145,41253,41254],{"class":262}," needs_pause_quality:\n",[145,41256,41257,41259,41262],{"class":147,"line":600},[145,41258,7193],{"class":258},[145,41260,41261],{"class":159}," \"sora\"",[145,41263,41264],{"class":174},"          # Higher resolution for screenshots\n",[145,41266,41267,41269,41271],{"class":147,"line":605},[145,41268,1703],{"class":258},[145,41270,41214],{"class":159},[145,41272,41273],{"class":174},"      # Default to higher overall score\n",[11,41275,41276],{},"This is intentionally simplistic — your production router would use more sophisticated classification. But the principle holds: match the model to the content's primary requirement.",[92,41278,41280],{"id":41279},"what-about-other-models","What about other models?",[11,41282,41283],{},"This comparison focused exclusively on Seedance 2.0 and Sora 2 because they represent the current production-grade tier of AI video APIs. Other models like Runway Gen-3, Pika, and Kling are viable alternatives but weren't included in this specific test. We may cover broader comparisons in future articles.",[48,41285,13304],{"id":13303},[92,41287,41289],{"id":41288},"is-seedance-20-better-than-sora-2","Is Seedance 2.0 better than Sora 2?",[11,41291,41292],{},"In our tests, Seedance 2.0 scored higher overall (8.5 vs 8.0), with particular strengths in human anatomy accuracy, motion fluidity (60fps), lighting, and facial detail. Sora 2 wins on resolution and object fracture physics. Neither is universally \"better\" — it depends on your content type.",[92,41294,41296],{"id":41295},"can-i-access-seedance-20-through-an-api","Can I access Seedance 2.0 through an API?",[11,41298,41299,41300,41304,41305,493],{},"Yes. Seedance 2.0 is available through the ",[37,41301,41303],{"href":16153,"rel":41302},[41],"EvoLink API"," with standard REST endpoints. It supports text-to-video, image-to-video, and video-to-video generation. ",[37,41306,41307],{"href":16474},"Get an API key here",[92,41309,41311],{"id":41310},"whats-the-actual-output-quality-difference-at-720p","What's the actual output quality difference at 720p?",[11,41313,41314],{},"At matched 720p resolution, Seedance delivers 60fps while Sora delivers 30fps. This means Seedance produces twice as many frames per second, resulting in noticeably smoother motion — especially in fast-moving scenes. For static content, the visual quality is comparable at the same resolution.",[92,41316,41318],{"id":41317},"do-both-models-generate-audio","Do both models generate audio?",[11,41320,41321,41322,41324],{},"Yes. Both Seedance 2.0 and Sora 2 can generate synchronized audio including voice, sound effects, and background music. Seedance allows you to control audio generation with a ",[28,41323,1822],{}," parameter and can align output to reference audio tracks via the @Audio tag.",[92,41326,41328],{"id":41327},"which-model-is-more-cost-effective-for-production-use","Which model is more cost-effective for production use?",[11,41330,41331,41332,41335],{},"It depends on volume and content type. Sora 2 standard tier costs $0.10/second for 720p — a 15-second video runs about $1.50. Seedance 2.0 pricing hasn't been announced yet (coming at launch). Check ",[37,41333,40807],{"href":40805,"rel":41334},[41]," for the latest. If your content is motion-heavy, Seedance's 60fps at 720p may deliver better perceived quality per dollar than Sora's 30fps at the same resolution.",[92,41337,41339],{"id":41338},"can-i-use-seedance-20-outputs-commercially","Can I use Seedance 2.0 outputs commercially?",[11,41341,41342,41343,41346],{},"Seedance 2.0 outputs through the EvoLink API include commercial usage rights, but terms vary. Read our ",[37,41344,41345],{"href":9202},"detailed copyright and licensing guide"," for the full breakdown of what's allowed, including monetization on YouTube, use in client work, and redistribution rights. Always verify the latest terms before production deployment.",[45,41348],{},[48,41350,41352],{"id":41351},"final-scores","Final Scores",[2036,41354,41355,41365],{},[2039,41356,41357],{},[2042,41358,41359,41361,41363],{},[2045,41360,38808],{},[2045,41362,17398],{"align":13812},[2045,41364,38721],{"align":13812},[2052,41366,41367,41377,41386,41396,41406,41415],{},[2042,41368,41369,41371,41374],{},[2057,41370,38820],{},[2057,41372,41373],{"align":13812},"8.7",[2057,41375,41376],{"align":13812},"8.3",[2042,41378,41379,41381,41383],{},[2057,41380,38831],{},[2057,41382,41376],{"align":13812},[2057,41384,41385],{"align":13812},"7.8",[2042,41387,41388,41391,41393],{},[2057,41389,41390],{},"Physics/Anatomy Realism",[2057,41392,39014],{"align":13812},[2057,41394,41395],{"align":13812},"7.3",[2042,41397,41398,41400,41403],{},[2057,41399,38853],{},[2057,41401,41402],{"align":13812},"9.2",[2057,41404,41405],{"align":13812},"8.8",[2042,41407,41408,41411,41413],{},[2057,41409,41410],{},"Motion Fluidity",[2057,41412,39000],{"align":13812},[2057,41414,41385],{"align":13812},[2042,41416,41417,41422,41426],{},[2057,41418,41419],{},[23,41420,41421],{},"Overall",[2057,41423,41424],{"align":13812},[23,41425,39000],{},[2057,41427,41428],{"align":13812},[23,41429,39014],{},[11,41431,41432],{},"Both models represent the state of the art in AI video generation as of early 2026. Neither can generate floating dust particles. Neither produces perfect hands every time. But for production API use, these results should guide your model selection based on what you're actually building.",[11,41434,41435,41436,41440,41441,493],{},"For the latest on Seedance model capabilities, see the official ",[37,41437,41439],{"href":38636,"rel":41438},[41],"ByteDance Seed research page",". For Sora documentation and updates, refer to ",[37,41442,41445],{"href":41443,"rel":41444},"https://platform.openai.com/docs",[41],"OpenAI's official platform docs",[38649,41447,41449],{"type":41448},"primary",[11,41450,41451,14284,41454,41456],{},[23,41452,41453],{},"Start building with Seedance 2.0.",[37,41455,9058],{"href":16474}," and generate your first video in under a minute.",[11217,41458,41459],{},"html pre.shiki code .snl16, html code.shiki .snl16{--shiki-default:#F97583}html pre.shiki code .s95oV, html code.shiki .s95oV{--shiki-default:#E1E4E8}html pre.shiki code .sDLfK, html code.shiki .sDLfK{--shiki-default:#79B8FF}html pre.shiki code .sU2Wk, html code.shiki .sU2Wk{--shiki-default:#9ECBFF}html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .svObZ, html code.shiki .svObZ{--shiki-default:#B392F0}html pre.shiki code .s9osk, html code.shiki .s9osk{--shiki-default:#FFAB70}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":141,"searchDepth":166,"depth":166,"links":41461},[41462,41463,41468,41473,41478,41479,41483,41488,41494,41502],{"id":38663,"depth":166,"text":38664},{"id":38781,"depth":166,"text":38782,"children":41464},[41465,41466,41467],{"id":38794,"depth":178,"text":17398},{"id":38877,"depth":178,"text":38721},{"id":38948,"depth":178,"text":38949},{"id":39037,"depth":166,"text":39038,"children":41469},[41470,41471,41472],{"id":39050,"depth":178,"text":17398},{"id":39129,"depth":178,"text":38721},{"id":39206,"depth":178,"text":39207},{"id":39296,"depth":166,"text":39297,"children":41474},[41475,41476,41477],{"id":39309,"depth":178,"text":17398},{"id":39382,"depth":178,"text":38721},{"id":39449,"depth":178,"text":39450},{"id":39539,"depth":166,"text":39540},{"id":39738,"depth":166,"text":39739,"children":41480},[41481,41482],{"id":39745,"depth":178,"text":39746},{"id":40475,"depth":178,"text":40476},{"id":40717,"depth":166,"text":40718,"children":41484},[41485,41486,41487],{"id":40724,"depth":178,"text":40725},{"id":40811,"depth":178,"text":40812},{"id":40907,"depth":178,"text":40908},{"id":40957,"depth":166,"text":40958,"children":41489},[41490,41491,41492,41493],{"id":40964,"depth":178,"text":40965},{"id":41008,"depth":178,"text":41009},{"id":41038,"depth":178,"text":41039},{"id":41279,"depth":178,"text":41280},{"id":13303,"depth":166,"text":13304,"children":41495},[41496,41497,41498,41499,41500,41501],{"id":41288,"depth":178,"text":41289},{"id":41295,"depth":178,"text":41296},{"id":41310,"depth":178,"text":41311},{"id":41317,"depth":178,"text":41318},{"id":41327,"depth":178,"text":41328},{"id":41338,"depth":178,"text":41339},{"id":41351,"depth":166,"text":41352},"We tested Seedance 2.0 and Sora 2 with identical prompts. See real output comparisons, frame-by-frame analysis, API code, and pricing breakdown.",{"head":41505,"slug":41512,"date":41513,"image":41514,"tags":41515,"keywords":41521},{"meta":41506},[41507,41510],{"name":41508,"content":41509},"og:title","Seedance 2.0 vs Sora 2 API: Side-by-Side Tests | 2026",{"name":41511,"content":41503},"og:description","seedance-2-vs-sora-2-api-comparison","2026-02-24","/seedance2-vs-sora2-hero.png",[41516,41517,41518,41519,41520],"seedance 2.0","sora 2","ai video api","api comparison","video generation",[41522,41523,41524],"seedance 2.0 vs sora 2","seedance vs sora api","ai video api comparison","/en/blog/seedance-2-vs-sora-2-api-comparison",{"title":38622,"description":41503},"en/blog/seedance-2-vs-sora-2-api-comparison","rb_foIidd7nyFAW4etq9yB86DdKU3c6YysUor7lBdo0",1775067558503]