我们在任何 Seedance 模型的发布页面中均未找到已发布的权重,也未找到模型许可证。字节跳动的 Seedance 2.5 发布博文和模型页面描述了通过 Jimeng AI、Doubao 以及 BytePlus ModelArk API 进行访问的方式,且这些页面均未链接到检查点(checkpoint)。Hugging Face 上的 ByteDance-Seed 组织和 GitHub 上的 ByteDance-Seed 组织发布了其他模型,但其中均不包含 Seedance 模型。我们目录中的五个 Seedance 条目均未关联 Hugging Face ID。
这就回答了标题所提出的问题,但有一个边界条件。我们检查了字节跳动的一级页面、两个官方的 ByteDance-Seed 组织以及我们自己的目录。我们无法排除存在未被发现的发布版本的可能性。如果字节跳动发布了权重,该检查点将出现在上述任一组织下,届时我们将更新本文。
本文涵盖了开放权重(open-weight)和开源(open-source)对视频模型意味着什么、GitHub 和 Hugging Face 上名为 Seedance 的仓库包含什么内容、何时需要检查点作为硬性要求,以及如何通过 OpenRouter 上的异步视频端点运行 Seedance 任务。如需了解输出质量、每条片段的成本以及 Seedance 2.5 与 Seedance 2.0、Wan 3.0 和 Veo 3.1 的对比,请阅读我们的 Seedance 2.5 评测 。
摘要
我们在字节跳动的一级页面、GitHub 和 Hugging Face 上的 ByteDance-Seed 组织,以及 OpenRouter 目录中,均未找到 Seedance 2.5、Seedance 2.0、Seedance 2.0 Fast、Seedance 2.0 Mini 或 Seedance 1.5 Pro 的已发布检查点或模型许可证。
我们审查的名为 Seedance 的 GitHub 和 Hugging Face 项目均为 API 客户端和托管服务。它们不包含权重,也不会占用您的硬件资源运行任何内容。
离线使用、物理隔离部署以及在您自己的素材上进行微调均需要检查点。如果您需要检查点,Seedance 并非候选方案。Kimi K3 以及 Qwen 3.8 系列模型中的四个模型发布了可下载的权重。
在 OpenRouter 上,所有五个 Seedance 模型均通过 POST /api/v1/videos 运行。您提交任务后,通过轮询或 Webhook 等待终端状态,然后使用您的 API 密钥下载文件。
开放权重与开源
通过订阅,您同意接收 OpenRouter 通讯:包括模型使用数据、产品更新和研究报告,每周约一封电子邮件。您可以通过每封电子邮件中的链接随时退订。请参阅我们的隐私政策 。
开放权重意味着发布者发布了模型的参数,以便您可以下载并运行它们。开源意味着许可证在开放源代码促进会(Open Source Initiative)批准的列表中,并授予使用、修改和重新分发的权利。一个模型可以在自定义许可下成为开放权重,而不属于开源。Kimi K3 是本系列前文提到的例子。Moonshot AI 在其自己的 Kimi K3 License 下于 Hugging Face 发布了检查点,该许可证未获 OSI 批准。
在我们查阅的资料中,Seedance 既非开放权重,也非开源。由于没有公开的检查点,因此不存在由模型许可证规范的工件。适用的唯一许可证是您调用的任何托管平台的服务条款,包括 ours 。
我们查找的位置
我们检查了四个地方。如果存在公开的 Seedance 发布版本,这些位置将是其出现的地方。
字节跳动的一级页面。Seedance 2.5 发布博文称该模型正在 Jimeng AI 和 Doubao 上推出,并通过 BytePlus ModelArk 提供 API 访问。Seedance 2.5 和 Seedance 2.0 的模型页面描述了托管访问方式。这三个页面均未链接检查点、仓库或模型许可证。
GitHub 上的 ByteDance-Seed 组织。截至撰写本文时,该组织拥有 63 个公开仓库,包括已发布的模型如 Seed-Coder、Seed-OSS、BAGEL 和 SeedVR2。其中没有一个是 Seedance 仓库。
Hugging Face 上的 ByteDance-Seed 组织。该组织拥有 59 个公开仓库,同样包括 Seed-Coder、Seed-OSS、BAGEL 和 SeedVR2。其中没有一个是 Seedance 模型。在 Hugging Face 上以作者为 ByteDance-Seed 搜索 Seedance 返回无结果。
OpenRouter 目录。当发布者发布了检查点(checkpoint)时,我们的模型记录会包含一个 hugging_face_id 字段。所有五条 Seedance 记录的该字段均返回 null。仅凭这一点,只能说明我们的目录链接指向何处,因此我们将其列在最后,并不将其视为除我们自身数据之外的任何证据。
名为 Seedance 的仓库包含什么内容
在 Hugging Face 上搜索 Seedance(不带作者过滤器)确实会返回结果。我们检查过的这些结果是第三方仓库,名称如 Seedance-2-AI-Video-Generator 和 Seedance-API。其中第一个包含两个文件:.gitattributes 和 README.md,其 README 声明该模型仅在维护者的平台上托管,用户无需下载权重。这是对托管服务的描述,而非模型发布。
GitHub 上名为 Seedance generator 或开源 Seedance 的项目,以及暴露 Seedance 的 ComfyUI 节点也遵循同样的模式。它们调用的是托管端点。设置说明会告诉你具体是哪个端点。如果第一步是粘贴 API 密钥,那么该项目就是他人服务器的客户端,你的机器上不会运行任何内容。访问 API 的 ComfyUI 节点就是一个带有图形用户界面的客户端。
这并不意味着这些项目毫无用处。它们只是没有回答开源问题。它们继承了托管端点所适用的条款、定价和数据政策。
何时需要检查点
有三种部署模式需要可下载的权重,而在我们检查的来源中,Seedance 不符合其中任何一种。
离线或空气隔离推理。如果生成视频的设备无法访问互联网,模型必须位于该设备上。没有可供放置的 Seedance 工件。
在自有素材上进行微调。使用自有数据训练模型需要访问其参数。不存在可供你训练的公开 Seedance 参数。
出于数据驻留原因的自托管。在你自己的区域、受你自己控制地运行模型需要权重。通过我们等途径提供的托管访问意味着提供商处理请求。
如果上述某一点是你的需求,请评估发布检查点的模型。在本系列中,Kimi K3 在 Hugging Face 上以自定义许可证发布其检查点,而四个 Qwen 3.8 模型中有三个可下载。它们都不是视频模型。对于发布权重的视频模型,请查看视频模型列表中的 hugging_face_id 字段,并确认链接模型卡片上的许可证。
如果你的担忧是供应商锁定而非本地执行,托管访问仍然提供一样东西。你发送到 /api/v1/videos 的请求体在我们目录中的所有视频模型之间都是相同的,因此从 Seedance 切换到另一个模型只需更改模型字符串。
OpenRouter 上的五个 Seedance 模型
我们通过 Seed 提供商提供五个 Seedance 模型。下表列出了我们的目录为每个模型公开的参数。数据来源于 2026-09-11 的 /api/v1/videos/models。
| 模型 | 输入模态 | 时长 | 分辨率 | 帧图像 | 音频输出 |
|---|---|---|---|---|---|
| bytedance/seedance-2.5 | 文本、图像、音频、视频 | 4 到 30 秒 | 480p, 720p | 首帧和末帧 | 是 |
| bytedance/seedance-2.0 | 文本、图像、音频、视频 | 4 到 15 秒 | 480p, 720p, 1080p, 4K | 首帧和末帧 | 是 |
| bytedance/seedance-2.0-fast | 文本、图像、音频、视频 | 4 到 15 秒 | 480p, 720p | 首帧和末帧 | 是 |
| bytedance/seedance-2.0-mini | 文本、图像、音频、视频 | 4 到 15 秒 | 480p, 720p | 首帧和末帧 | 是 |
| bytedance/seedance-1-5-pro | 文本、图像 | 4 到 12 秒 | 480p, 720p, 1080p | 首帧和末帧 | 是 |
Seedance 2.5 是唯一能运行超过 15 秒的模型。Seedance 2.0 是唯一能达到 4K 分辨率的模型,而 Seedance 2.0 和 Seedance 1.5 Pro 是唯一能达到 1080p 分辨率的模型。定价按视频令牌计算。视频模型列表中的 pricing_skus 字段提供了每个模型的费率,Seedance 2.5 列出了带音频、不带音频以及带视频输入的作业的不同费率。Seedance 2.5 的评测详细说明了每个分辨率下片段的价格。
如何在 OpenRouter 上调用 Seedance
在 OpenRouter 上进行视频生成是异步的。你提交作业后会立即获得一个作业 ID。片段在提供商端渲染,你可以轮询结果,或者当作业达到终止状态时接收 webhook。目录中所有视频模型的请求格式均相同。
提交
POST https://openrouter.ai/api/v1/videos 需要 model 和 prompt 作为必填字段。可选字段包括 duration(时长)、resolution(分辨率)、aspect_ratio(宽高比)、用于首尾帧控制的 frame_images、用于参考图像的 input_references、generate_audio(生成音频)、seed(随机种子)以及用于 webhook 的 callback_url。响应为 202 Accepted,包含作业的 id、polling_url(轮询 URL),且 status 设置为 pending(待定)。
{
"id" : "abc123" ,
"polling_url" : "https://openrouter.ai/api/v1/videos/abc123" ,
"status" : "pending"
}
提交即开始计费工作。如果你的 HTTP 客户端默认重试失败的请求,超时或 5xx 错误后的重试可能会启动第二个付费作业。请关闭提交调用的重试功能,并保留轮询的重试功能,因为轮询是只读的。
等待
以一定间隔轮询 GET https://openrouter.ai/api/v1/videos/{id},即提交响应中的 polling_url。状态会从 pending 变为 in_progress(进行中),然后变为四个终止值之一。completed 表示文件已就绪。failed 包含 error 字段。cancelled(已取消)和 expired(已过期)是另外两个终止状态,webhook 文档涵盖了所有四种情况。如果你在请求或工作区级别设置了 callback_url,当作业达到终止状态时,我们会向该 URL 发送 HTTPS POST,你可以跳过轮询。我们可能会多次投递同一事件,因此请根据 X-OpenRouter-Idempotency-Key 标头去重投递,其格式为
完成的作业如下所示。unsigned_urls 数组和 usage 块仅在完成时出现。
{
"id" : "abc123" ,
"generation_id" : "gen-1234567890-abcdef" ,
"polling_url" : "https://openrouter.ai/api/v1/videos/abc123" ,
"status" : "completed" ,
"unsigned_urls" : [
"https://openrouter.ai/api/v1/videos/abc123/content?index=0"
],
"usage" : {
"cost" : 0.25 ,
"is_byok" : false
}
}
下载
unsigned_urls 中的条目指向 GET https://openrouter.ai/api/v1/videos/{id}/content?index=0 。它们不是预签名的 URL。发送你用于提交时的相同 Authorization: Bearer 标头。文件可能在状态显示为 completed 后几秒才可下载,因此在此路由出现错误时,请在将其视为失败之前在一个有限的时间窗口内重试。下载是只读的,因此重试不会启动第二个作业。
curl "https://openrouter.ai/api/v1/videos/abc123/content?index=0" \
-H "Authorization: Bearer $OPENROUTER_API_KEY " \
--output seedance.mp4
使用 TypeScript SDK 的完整运行示例
此示例提交一个 20 秒的 Seedance 2.5 片段,每 30 秒轮询一次,并下载结果。如果失败是 HTTP 错误或连接断开,则每 5 秒重试下载,最多持续 2 分钟。SDK 将 REST 字段名称映射为 camelCase(驼峰命名法),因此 generate_audio 变为 generateAudio,aspect_ratio 变为 aspectRatio。提交调用上的 retries 选项禁用了该请求的 SDK 默认重试策略,因此瞬态错误无法启动第二个计费作业。轮询保留默认策略。
import { writeFile } from "node:fs/promises" ;
import { OpenRouter } from "@openrouter/sdk" ;
const apiKey = process.env. OPENROUTER_API_KEY ;
if ( ! apiKey) {
throw new Error ( "Set OPENROUTER_API_KEY first." );
}
const openRouter = new OpenRouter ({ apiKey });
const job = await openRouter.videoGeneration. generate (
{
videoGenerationRequest: {
model: "bytedance/seedance-2.5" ,
prompt:
"A slow dolly shot along a rain-soaked market street at dusk, lanterns reflecting in puddles, realistic motion" ,
duration: 20 ,
resolution: "720p" ,
aspectRatio: "16:9" ,
generateAudio: true ,
},
},
{ retries: { strategy: "none" } },
);
console. log (job.id, job.status);
let current = job;
while ( ! [ "completed" , "failed" , "cancelled" , "expired" ]. includes (current.status)) {
await new Promise (( resolve ) => setTimeout (resolve, 30_000 ));
current = await openRouter.videoGeneration. getGeneration ({ jobId: job.id });
}
if (current.status !== "completed" || ! current.unsignedUrls?.[ 0 ]) {
throw new Error (current.error ?? Video generation ${ current . status }. );
}
async function downloadWithRetry ( url : string ) : Promise < Buffer > {
const deadline = Date. now () + 120_000 ;
let lastError = "no attempt made" ;
while (Date. now () < deadline) {
try {
const response = await fetch (url, {
headers: { Authorization: Bearer ${ apiKey } },
signal: AbortSignal. timeout (deadline - Date. now ()),
});
if (response.ok) {
return Buffer. from ( await response. arrayBuffer ());
}
lastError = HTTP ${ response . status } ;
await response.body?. cancel ();
} catch (error) {
lastError = error instanceof Error ? error.message : String (error);
}
await new Promise (( resolve ) => setTimeout (resolve, 5_000 ));
}
throw new Error ( Download failed after retrying for 2 minutes. Last error: ${ lastError } );
}
await writeFile ( "seedance.mp4" , await downloadWithRetry (current.unsignedUrls[ 0 ]));
console. log ( "Saved seedance.mp4" , current.usage?.cost);
我们使用严格的 TypeScript 设置针对 @openrouter/sdk 编译了此示例。由于本文未针对付费端点运行该代码,因此请将其视为起点,并查阅视频生成的文档以获取当前的请求架构。
零数据保留
视频生成不符合零数据保留(Zero Data Retention)的条件。提供商必须保存完成的文件直到您下载它,这与无保留保证不兼容。如果您的工作区或您的请求强制执行 ZDR,我们将不会路由视频请求。这也是开源问题对某些团队重要的第二个原因。纯托管模式无法满足“没有任何第三方保留输出”的要求,而且也没有 Seedance 检查点可供在内部运行。
常见问题解答
Seedance 2.5 是开源的吗?
在我们能找到的任何地方都不是。字节跳动的 Seedance 2.5 发布文章和模型页面描述了通过 Jimeng AI、Doubao 和 BytePlus ModelArk API 的访问方式。它们没有链接检查点或模型许可证。GitHub 和 Hugging Face 上的 ByteDance-Seed 组织发布了其他模型,但没有 Seedance 模型,我们目录中的五个 Seedance 条目也没有携带 Hugging Face ID。
Seedance 2.0 是开源的吗?
我们也未发现 Seedance 2.0、Seedance 2.0 Fast 或 Seedance 2.0 Mini 的已发布权重或模型许可证。字节跳动的 Seedance 2.0 页面将该模型呈现为托管产品,GitHub 和 Hugging Face 上的官方 ByteDance-Seed 仓库中也不包含它。
您可以在本地运行 Seedance 吗?
从我们找到的任何工件来看都不行。在您的硬件上运行模型需要检查点,而我们未发现任何 Seedance 版本的检查点。我们检查过的名为 Seedance 的 GitHub 和 Hugging Face 项目,例如 Hugging Face 仓库 Seedance-2-AI-Video-Generator,是第三方包装器,并非由字节跳动发布。它们调用托管 API 并提示您粘贴 API 密钥,因此它们在本地不运行任何内容。
开放权重(open-weight)与开源(open-source)有什么区别?
开放权重(Open-weight)意味着发布者已上传模型检查点,您可以下载并运行它。开源(Open-source)则意味着该模型的许可证列于开源促进会(Open Source Initiative)批准的列表中,并授予用户使用、修改和再分发的权利。一个模型可以在自定义许可证下属于开放权重,但并不一定符合开源标准。根据我们查阅的资料,Seedance 既不属于开放权重,也不属于开源,因为目前并没有可供授权使用的公开检查点。
如何在 OpenRouter 上调用 Seedance?
向 https://openrouter.ai/api/v1/videos 发送 POST 请求,并在 model 字段中指定 Seedance 的模型标识符,例如 bytedance/seedance-2.5。响应将返回一个任务对象,包含 id、polling_url 以及状态(status),此时状态为 pending(待处理)。您需要轮询 polling_url 或等待 webhook 通知,直到状态变为
We found no published weights and no model license for any Seedance model. ByteDance’s Seedance 2.5 launch post and model page describe access through Jimeng AI, Doubao, and the BytePlus ModelArk API, and neither links a checkpoint. The ByteDance-Seed organization on Hugging Face and the ByteDance-Seed organization on GitHub publish other models, and neither includes a Seedance model. None of the five Seedance entries in our catalog carry a Hugging Face ID.
That answers the question the title asks, with one boundary. We checked ByteDance’s first-party pages, both official ByteDance-Seed organizations, and our own catalog. We can’t rule out a release we didn’t find. If ByteDance publishes weights, the checkpoint would appear under one of those organizations, and we’ll update this post.
This post covers what open-weight and open-source mean for a video model, what the repositories named Seedance on GitHub and Hugging Face contain, when a checkpoint is a hard requirement, and how to run a Seedance job through the asynchronous video endpoint on OpenRouter. For output quality, per-clip cost, and how Seedance 2.5 compares with Seedance 2.0, Wan 3.0, and Veo 3.1, read our Seedance 2.5 review .
Summary
We found no published checkpoint or model license for Seedance 2.5, Seedance 2.0, Seedance 2.0 Fast, Seedance 2.0 Mini, or Seedance 1.5 Pro in ByteDance’s first-party pages, the ByteDance-Seed organizations on GitHub and Hugging Face, or the OpenRouter catalog.
The GitHub and Hugging Face projects named Seedance that we examined are API clients and hosted services. They don’t contain weights and they run nothing on your hardware.
Offline use, air-gapped deployment, and fine-tuning on your own footage all require a checkpoint. If you need one, Seedance isn’t a candidate. Kimi K3 and three of the four Qwen 3.8 models publish downloadable weights.
On OpenRouter, all five Seedance models run through POST /api/v1/videos . You submit a job, wait for a terminal status by polling or by webhook, then download the file with your API key.
Open-weight versus open-source
By subscribing you agree to receive the OpenRouter newsletter: model usage data, product updates, and research reports, about one email a week. Unsubscribe anytime via the link in every email. See our Privacy Policy .
Open-weight means the publisher posted the model’s parameters so you can download and run them. Open-source means the license is on the Open Source Initiative approved list and grants use, modification, and redistribution. A model can be open-weight under a custom license without being open-source. Kimi K3 is the example from earlier in this series. Moonshot AI posted the checkpoint on Hugging Face under its own Kimi K3 License, which is not OSI-approved.
Seedance is neither, in the sources we checked. There is no public checkpoint, so there is no artifact for a model license to govern. The only licenses that apply are the terms of service of whichever hosted platform you call, including ours .
Where we looked
We checked four places. Each one is where a public Seedance release would appear if it existed.
ByteDance’s first-party pages. The Seedance 2.5 launch post says the model is rolling out on Jimeng AI and Doubao, with API access through BytePlus ModelArk. The Seedance 2.5 and Seedance 2.0 model pages describe hosted access. None of the three pages links a checkpoint, a repository, or a model license.
The ByteDance-Seed organization on GitHub. The organization has 63 public repositories at the time of writing, including released models such as Seed-Coder, Seed-OSS, BAGEL, and SeedVR2. None is a Seedance repository.
The ByteDance-Seed organization on Hugging Face. The organization has 59 public repositories, again including Seed-Coder, Seed-OSS, BAGEL, and SeedVR2. None is a Seedance model. A Hugging Face search for Seedance with the author set to ByteDance-Seed returns no results.
The OpenRouter catalog. Our model records carry a hugging_face_id field when the publisher has posted a checkpoint. All five Seedance records return null for that field. On its own that tells you only what our catalog links to, so we list it last and don’t treat it as proof of anything beyond our own data.
What the repositories named Seedance contain
A Hugging Face search for Seedance without an author filter does return results. The ones we examined are third-party repositories with names such as Seedance-2-AI-Video-Generator and Seedance-API. The first of those contains two files, a .gitattributes and a README.md , and its README states that the model is hosted exclusively on the maintainer’s platform and that users don’t need to download weights. That is a description of a hosted service, not a model release.
The same pattern applies to GitHub projects named Seedance generator or open-source Seedance, and to ComfyUI nodes that expose Seedance. They call a hosted endpoint. The setup instructions tell you which one. If the first step is to paste an API key, the project is a client for someone else’s server, and nothing runs on your machine. A ComfyUI node that hits an API is a client with a graph UI in front of it.
None of that makes these projects useless. It means they don’t answer the open-source question. They inherit whatever terms, pricing, and data policy the hosted endpoint applies.
When a checkpoint is the requirement
Three deployment patterns require weights you can download, and Seedance doesn’t fit any of them in the sources we checked.
Offline or air-gapped inference. If the machine that generates video can’t reach the internet, the model has to be on that machine. There is no Seedance artifact to put there.
Fine-tuning on your own footage. Training a model on your own data requires access to its parameters. No public Seedance parameters exist for you to train.
Self-hosting for data-residency reasons. Running a model in your own region under your own controls requires the weights. Hosted access, including through us, means the provider processes the request.
If one of these is your requirement, evaluate a model that publishes a checkpoint. In this series, Kimi K3 posts its checkpoint on Hugging Face under a custom license, and three of the four Qwen 3.8 models are downloadable. Neither is a video model. For video models that publish weights, check the hugging_face_id field in the video models list and confirm the license on the linked model card.
If your concern was vendor lock-in rather than local execution, hosted access still gives you one thing. The request body you send to /api/v1/videos is the same for every video model in our catalog, so switching from Seedance to another model is a change to the model string.
The five Seedance models on OpenRouter
We serve five Seedance models, all through the Seed provider. This table lists the parameters our catalog exposes for each one. It comes from /api/v1/videos/models on 2026-09-11.
Model Input modalities Durations Resolutions Frame images Audio output
bytedance/seedance-2.5 Text, image, audio, video 4 to 30 seconds 480p, 720p First and last frame Yes
bytedance/seedance-2.0 Text, image, audio, video 4 to 15 seconds 480p, 720p, 1080p, 4K First and last frame Yes
bytedance/seedance-2.0-fast Text, image, audio, video 4 to 15 seconds 480p, 720p First and last frame Yes
bytedance/seedance-2.0-mini Text, image, audio, video 4 to 15 seconds 480p, 720p First and last frame Yes
bytedance/seedance-1-5-pro Text, image 4 to 12 seconds 480p, 720p, 1080p First and last frame Yes
Seedance 2.5 is the only one that runs past 15 seconds. Seedance 2.0 is the only one that reaches 4K, and Seedance 2.0 and Seedance 1.5 Pro are the only ones that reach 1080p. Pricing is per video token. The pricing_skus field in the video models list gives each model’s rates, and Seedance 2.5 lists separate rates for jobs with audio, without audio, and with video input. The Seedance 2.5 review works through what a clip costs at each resolution.
How to call Seedance on OpenRouter
Video generation on OpenRouter is asynchronous. You submit a job and get a job ID back immediately. The clip renders on the provider’s side, and you either poll for the result or receive a webhook when the job reaches a terminal state. The same request shape works for every video model in the catalog.
Submit
POST https://openrouter.ai/api/v1/videos takes model and prompt as required fields. Optional fields include duration , resolution , aspect_ratio , frame_images for first and last frame control, input_references for reference images, generate_audio , seed , and callback_url for a webhook. The response is 202 Accepted with the job’s id , its polling_url , and status set to pending .
{
"id" : "abc123" ,
"polling_url" : "https://openrouter.ai/api/v1/videos/abc123" ,
"status" : "pending"
}
Submitting starts billable work. If your HTTP client retries failed requests by default, a retry after a timeout or a 5xx can start a second paid job. Turn retries off for the submit call and keep them on for polling, which is read-only.
Wait
Poll GET https://openrouter.ai/api/v1/videos/{id} , which is the polling_url from the submit response, on an interval. The status moves from pending to in_progress and then to one of four terminal values. completed means the file is ready. failed carries an error field. cancelled and expired are the two other terminal states, and the webhook documentation covers all four. If you set callback_url on the request or at the workspace level, we send an HTTPS POST to that URL when the job reaches a terminal state, and you can skip polling. We can deliver the same event more than once, so deduplicate deliveries on the X-OpenRouter-Idempotency-Key header, which has the form
A completed job looks like this. The unsigned_urls array and the usage block appear only on completion.
{
"id" : "abc123" ,
"generation_id" : "gen-1234567890-abcdef" ,
"polling_url" : "https://openrouter.ai/api/v1/videos/abc123" ,
"status" : "completed" ,
"unsigned_urls" : [
"https://openrouter.ai/api/v1/videos/abc123/content?index=0"
],
"usage" : {
"cost" : 0.25 ,
"is_byok" : false
}
}
Download
The entries in unsigned_urls point at GET https://openrouter.ai/api/v1/videos/{id}/content?index=0 . They aren’t pre-signed. Send the same Authorization: Bearer header you used to submit. The file can become downloadable a few seconds after the status reads completed , so retry an error from this route for a bounded window before you treat it as a failure. The download is read-only, so a retry can’t start a second job.
curl "https://openrouter.ai/api/v1/videos/abc123/content?index=0" \
-H "Authorization: Bearer $OPENROUTER_API_KEY " \
--output seedance.mp4
A complete run with the TypeScript SDK
This example submits a 20-second Seedance 2.5 clip, polls every 30 seconds, and downloads the result, retrying the download every 5 seconds for up to 2 minutes, whether the failure is an HTTP error or a dropped connection. The SDK maps the REST field names to camelCase, so generate_audio becomes generateAudio and aspect_ratio becomes aspectRatio . The retries option on the submit call disables the SDK’s default retry policy for that one request, so a transient error can’t start a second billable job. Polling keeps the default policy.
import { writeFile } from "node:fs/promises" ;
import { OpenRouter } from "@openrouter/sdk" ;
const apiKey = process.env. OPENROUTER_API_KEY ;
if ( ! apiKey) {
throw new Error ( "Set OPENROUTER_API_KEY first." );
}
const openRouter = new OpenRouter ({ apiKey });
const job = await openRouter.videoGeneration. generate (
{
videoGenerationRequest: {
model: "bytedance/seedance-2.5" ,
prompt:
"A slow dolly shot along a rain-soaked market street at dusk, lanterns reflecting in puddles, realistic motion" ,
duration: 20 ,
resolution: "720p" ,
aspectRatio: "16:9" ,
generateAudio: true ,
},
},
{ retries: { strategy: "none" } },
);
console. log (job.id, job.status);
let current = job;
while ( ! [ "completed" , "failed" , "cancelled" , "expired" ]. includes (current.status)) {
await new Promise (( resolve ) => setTimeout (resolve, 30_000 ));
current = await openRouter.videoGeneration. getGeneration ({ jobId: job.id });
}
if (current.status !== "completed" || ! current.unsignedUrls?.[ 0 ]) {
throw new Error (current.error ?? Video generation ${ current . status }. );
}
async function downloadWithRetry ( url : string ) : Promise < Buffer > {
const deadline = Date. now () + 120_000 ;
let lastError = "no attempt made" ;
while (Date. now () < deadline) {
try {
const response = await fetch (url, {
headers: { Authorization: Bearer ${ apiKey } },
signal: AbortSignal. timeout (deadline - Date. now ()),
});
if (response.ok) {
return Buffer. from ( await response. arrayBuffer ());
}
lastError = HTTP ${ response . status } ;
await response.body?. cancel ();
} catch (error) {
lastError = error instanceof Error ? error.message : String (error);
}
await new Promise (( resolve ) => setTimeout (resolve, 5_000 ));
}
throw new Error ( Download failed after retrying for 2 minutes. Last error: ${ lastError } );
}
await writeFile ( "seedance.mp4" , await downloadWithRetry (current.unsignedUrls[ 0 ]));
console. log ( "Saved seedance.mp4" , current.usage?.cost);
We compiled this example against @openrouter/sdk with strict TypeScript settings. We didn’t run it against the paid endpoint for this post, so treat the code as a starting point and check the video generation documentation for the current request schema.
Zero Data Retention
Video generation isn’t eligible for Zero Data Retention . The provider has to hold the finished file until you download it, which is incompatible with a no-retention guarantee. If your workspace or your request enforces ZDR, we won’t route video requests. This is a second reason the open-source question matters for some teams. A hosted-only model can’t meet a requirement that no third party retains output, and no Seedance checkpoint exists to run in-house instead.
FAQ
Is Seedance 2.5 open source?
Not in any source we could find. ByteDance’s Seedance 2.5 launch post and model page describe access through Jimeng AI, Doubao, and the BytePlus ModelArk API. They don’t link a checkpoint or a model license. The ByteDance-Seed organizations on GitHub and Hugging Face publish other models but no Seedance model, and none of the five Seedance entries in our catalog carry a Hugging Face ID.
Is Seedance 2.0 open source?
We found no published weights or model license for Seedance 2.0, Seedance 2.0 Fast, or Seedance 2.0 Mini either. ByteDance’s Seedance 2.0 page presents the model as a hosted product, and the official ByteDance-Seed repositories on GitHub and Hugging Face don’t include it.
Can you run Seedance locally?
Not from any artifact we could locate. Running a model on your own hardware requires a checkpoint, and we found none for any Seedance version. The GitHub and Hugging Face projects named Seedance that we examined, such as the Hugging Face repository Seedance-2-AI-Video-Generator, are third-party wrappers that are not published by ByteDance. They call a hosted API and tell you to paste an API key, so they run nothing locally.
What is the difference between open-weight and open-source?
Open-weight means the publisher posted the checkpoint so you can download and run it. Open-source means the license is on the Open Source Initiative approved list and grants use, modification, and redistribution. A model can be open-weight under a custom license without being open-source. Seedance is neither in the sources we checked, because there is no public checkpoint to license.
How do I call Seedance on OpenRouter?
Send a POST request to https://openrouter.ai/api/v1/videos with a Seedance slug such as bytedance/seedance-2.5 in the model field. The response is a job with an id , a polling_url , and status set to pending . Poll the polling_url or receive a webhook until the status is
首次收录 · 2026-09-26 · 9.95 分