# Grok 视频 {#grok-video-15-视频接口--分组-155 .rd-guide-title}

使用 `grok-imagine-video-1.5` 生成视频，查询进度并获取播放和下载链接。

## 1 快速开始 {#quickstart}

使用 **155 分组**的 API Key。示例创建一条 **1 秒、480p** 视频，查询进度、下载 MP4 并打开。运行一次创建一个任务，按分组价格计费。 选下面一种方式运行即可，切换示例并重新发送会产生新的调用。

### 1.1 Python 3：完整流程 {#quick-python}

适用于 Windows、macOS 和 Linux。只使用 Python 标准库，无需安装 SDK。

将下面的代码保存为 `grok-video-quickstart.py`，在终端运行 `python3 grok-video-quickstart.py`（Windows 可用 `py -3 grok-video-quickstart.py`），按提示输入 API Key。程序会打印文件路径，并尝试用浏览器打开本地结果。

``` python
import getpass
import json
from pathlib import Path
import re
import shutil
import time
from datetime import datetime, timezone
from urllib.error import HTTPError
from urllib.parse import quote
from urllib.request import Request, urlopen
import uuid
import webbrowser

BASE_URL = "https://yyds.seqnode.com"
TASK_ID = ""  # 续查时填入原任务 ID；留空会创建一条视频并计费。
PAYLOAD = {
    "model": "grok-imagine-video-1.5",
    "prompt": "一只橘猫在窗边伸懒腰，晨光柔和，镜头固定，无文字。",
    "duration": 1,
    "resolution": "480p",
    "aspect_ratio": "16:9"
}


def request_json(url, headers, payload=None):
    body = None if payload is None else json.dumps(payload, ensure_ascii=False).encode("utf-8")
    request = Request(url, data=body, headers=headers)
    with urlopen(request, timeout=180 if body else 60) as response:
        return json.load(response)


def main():
    api_key = getpass.getpass("输入绑定 155 分组的 API Key：").strip()
    if not api_key:
        raise ValueError("请输入有效的 API Key。")
    headers = {"Authorization": "Bearer " + api_key, "Content-Type": "application/json; charset=utf-8"}
    task_id = TASK_ID
    if not task_id:
        created = request_json(BASE_URL + "/v1/videos/generations", headers, PAYLOAD)
        task_id = created.get("request_id")
        if not isinstance(task_id, str) or not task_id:
            raise ValueError("未获得任务 ID。先检查使用记录，避免重复创建。")
    print(f"任务 ID：{task_id}（请保存，后续查询使用原 ID）")
    task_url = BASE_URL + "/v1/videos/" + quote(task_id, safe="")
    deadline = time.monotonic() + 300
    while time.monotonic() < deadline:
        result = request_json(task_url, headers)
        status, delivery = result.get("status"), result.get("delivery_status")
        print(f"生成：{status}；进度：{result.get('progress')}；转存：{delivery}")
        if status in ("failed", "expired") or delivery in ("failed", "expired"):
            raise RuntimeError(f"任务 {task_id} 未就绪或已过期。检查原任务和 /content 接口，勿重新创建。")
        if status in ("done", "completed") and delivery == "ready":
            break
        time.sleep(5)
    else:
        raise TimeoutError(f"等待超时。将 {task_id} 填入顶部 TASK_ID 后继续查询。")
    video = result.get("video", {})
    play_url, download_url = video.get("url", ""), video.get("download_url", "")
    if not re.fullmatch(r"https://yyds\.seqnode\.com/(?:video-files/)?[0-9a-f]{32}\.mp4", play_url) or download_url != play_url + "?download=1":
        raise ValueError("视频 URL 格式异常，请检查原任务的响应。")
    expires = datetime.fromtimestamp(video["expires_at"], timezone.utc) if type(video["expires_at"]) is int else datetime.fromisoformat(video["expires_at"].replace("Z", "+00:00"))
    if expires.tzinfo is None or expires <= datetime.now(timezone.utc):
        raise ValueError("视频链接已过期或到期时间格式异常。")
    print(f"在线播放：{play_url}\n到期时间：{expires.astimezone().isoformat()}")
    path = Path.cwd() / ("grok-video-" + uuid.uuid4().hex + ".mp4")
    # 播放和下载直链无需 API Key。
    with urlopen(Request(download_url, headers={"User-Agent": "YM2API-Quickstart/1.0"}), timeout=180) as response:
        if response.status != 200 or response.headers.get_content_type() != "video/mp4":
            raise ValueError("下载结果不是 MP4。保留原任务 ID，稍后重试下载。")
        with path.open("xb") as output:
            try:
                shutil.copyfileobj(response, output)
                if output.tell() == 0:
                    raise ValueError("下载的视频为空。")
            except Exception:
                output.close()
                path.unlink()
                raise
    print(f"视频已保存：{path}")
    if not webbrowser.open(path.as_uri()):
        print("请到以上路径手动打开视频。")


if __name__ == "__main__":
    try:
        main()
    except HTTPError as error:
        print(f"HTTP {error.code}：{error.read(2000).decode('utf-8', errors='replace')}")
        raise SystemExit(1)
    except Exception as error:
        print(f"运行失败：{error}（已有任务 ID 时请继续查询原任务。）")
        raise SystemExit(1)
```

[下载 Python 示例](grok-video-quickstart.py)。如未自动打开结果，按输出路径手动打开。

请保存输出的任务 ID。查询中断或超时时，将原 ID 填入顶部 `TASK_ID` 再运行，继续查询原任务。公开链接从转存完成起有效 1 小时，本地 MP4 可长期保存。

### 1.2 PowerShell 7：完整流程 {#quick-powershell}

适合已有 PowerShell 7 的 Windows 用户。复制整段代码到终端，只按提示输入 API Key。

``` powershell
$apiKey = Read-Host "输入绑定 155 分组的 API Key" -MaskInput
if ([string]::IsNullOrWhiteSpace($apiKey)) { throw "请输入有效的 API Key。" }
$baseUrl = "https://yyds.seqnode.com"
$headers = @{ Authorization = "Bearer $apiKey" }
$taskId = "" # 继续已有任务时，在这里填入原任务 ID；留空会创建并计费。
if ([string]::IsNullOrWhiteSpace($taskId)) {
    $payload = @{
        model = "grok-imagine-video-1.5"
        prompt = "一只橘猫在窗边伸懒腰，晨光柔和，镜头固定，无文字。"
        duration = 1
        resolution = "480p"
        aspect_ratio = "16:9"
    }
    $request = @{
        Uri = "$baseUrl/v1/videos/generations"
        Method = "Post"
        Headers = $headers
        ContentType = "application/json; charset=utf-8"
        Body = [Text.Encoding]::UTF8.GetBytes(($payload | ConvertTo-Json))
        TimeoutSec = 180
        ErrorAction = "Stop"
    }
    $created = Invoke-RestMethod @request
    $taskId = [string]$created.request_id
    if (-not $taskId) { throw "未获得任务 ID。先检查使用记录，避免重复创建。" }
}
Write-Host "任务 ID：$taskId（请保存，后续查询使用原 ID）"
$taskUrl = "$baseUrl/v1/videos/$([uri]::EscapeDataString($taskId))"
$deadline = [DateTimeOffset]::UtcNow.AddMinutes(5)
$ready = $false
while ([DateTimeOffset]::UtcNow -lt $deadline) {
    $result = Invoke-RestMethod -Uri $taskUrl -Headers $headers -TimeoutSec 60 -ErrorAction Stop
    Write-Host "生成：$($result.status)；进度：$($result.progress)；转存：$($result.delivery_status)"
    if ($result.status -in @("failed", "expired")) {
        throw "任务 $taskId 已结束：$($result.error | ConvertTo-Json -Compress)"
    }
    if ($result.delivery_status -in @("failed", "expired")) {
        throw "任务 $taskId 的直链未就绪或已过期。生成已完成时可检查原 /content 接口，勿重新创建。"
    }
    if ($result.delivery_status -eq "ready" -and $result.status -in @("done", "completed")) {
        $ready = $true
        break
    }
    Start-Sleep -Seconds 5
}
if (-not $ready) { throw "等待超时。保留任务 ID $taskId，填回脚本顶部后继续查询。" }
$playUrl = [string]$result.video.url
$downloadUrl = [string]$result.video.download_url
if ($playUrl -notmatch '^https://yyds\.seqnode\.com/(?:video-files/)?[0-9a-f]{32}\.mp4$' -or
    $downloadUrl -ne ($playUrl + '?download=1')) { throw "视频 URL 格式异常，请检查任务 $taskId 的响应。" }
$expires = if ($result.video.expires_at -is [string]) { [DateTimeOffset]::Parse($result.video.expires_at) } else { [DateTimeOffset]::FromUnixTimeSeconds($result.video.expires_at) }
if ($expires -le [DateTimeOffset]::UtcNow) { throw "视频链接已过期。" }
Write-Host "在线播放：$playUrl"
Write-Host "下载链接：$downloadUrl"
Write-Host "到期时间：$($expires.ToLocalTime())"
$file = Join-Path $PWD ("grok-video-" + [guid]::NewGuid().ToString("N") + ".mp4")
$partial = "$file.part"
try {
    # 播放和下载直链无需 API Key。
    $download = Invoke-WebRequest -Uri $downloadUrl -OutFile $partial -PassThru -TimeoutSec 180 -ErrorAction Stop
    if ($download.StatusCode -ne 200 -or [string]$download.Headers['Content-Type'] -notmatch '^video/mp4(?:;|$)' -or
        (Get-Item -LiteralPath $partial).Length -eq 0) { throw "下载结果不是有效的视频响应。保留原任务 ID 后重试下载。" }
    Move-Item -LiteralPath $partial -Destination $file -ErrorAction Stop
} finally {
    if (Test-Path -LiteralPath $partial) { Remove-Item -LiteralPath $partial -ErrorAction Stop }
}
Write-Host "视频已保存：$file"
Invoke-Item -LiteralPath $file -ErrorAction Continue
```

[下载 PowerShell 示例](grok-video-start.ps1)。

### 1.3 cURL / JSON：检查原始请求 {#quick-http}

JSON 是请求体，需要由 cURL、Postman 或 Apifox 发送。先将下面内容保存为 UTF-8 的 `grok-video-request.json`，也可[下载请求 JSON](grok-video-request.json)。

``` json
{
  "model": "grok-imagine-video-1.5",
  "prompt": "一只橘猫在窗边伸懒腰，晨光柔和，镜头固定，无文字。",
  "duration": 1,
  "resolution": "480p",
  "aspect_ratio": "16:9"
}
```

在该文件所在目录，用 Bash（Linux、macOS 或 Git Bash）运行下面的命令，只输入 API Key。响应保存到 `response.json`，已有同名文件会被覆盖；终端显示 HTTP 状态码。

``` bash
read -rsp 'API Key: ' API_KEY; printf '\n'
curl --silent --show-error --fail-with-body --max-time 300 "https://yyds.seqnode.com/v1/videos/generations" \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  --data-binary '@grok-video-request.json' \
  --output response.json --write-out 'HTTP %{http_code}\n'
unset API_KEY
```

Postman / Apifox：新建 **POST** 请求，URL 填 `https://yyds.seqnode.com/v1/videos/generations`，Body 选择 **raw → JSON** 并粘贴上面的 JSON；请求头设置 `Content-Type: application/json` 和 `Authorization: Bearer YOUR_API_KEY`，将 `YOUR_API_KEY` 替换为自己的 Key。

HTTP 200 和 `request_id` 只表示创建成功。继续使用同一把 Key 查询原任务，进度、下载和播放方法见下方"调试教程"。需要自动完成整个流程时，直接使用 Python 或 PowerShell 示例。

## 2 接入信息与调用流程 {#1-接口与鉴权}

**调用顺序：** 创建一次 → 保存任务 ID → 查询原任务 → 确认交付就绪 → 播放或下载。创建成功只表示任务受理，不代表视频已生成。

  -------------------------------------------------------------------------------------------------
  用途                    方法与路径                           格式
  ----------------------- ------------------------------------ ------------------------------------
  查看当前模型            `GET /v1/models`                     JSON

  创建视频，推荐          `POST /v1/videos/generations`        xAI/Grok JSON

  创建视频，兼容入口      `POST /v1/videos`                    OpenAI 视频协议，JSON 或 multipart

  查询任务                `GET /v1/videos/{TASK_ID}`           JSON

  下载完成的视频          `GET /v1/videos/{TASK_ID}/content`   视频内容
  -------------------------------------------------------------------------------------------------

上表 API 请求使用 `Authorization: Bearer YOUR_GROUP_155_API_KEY`。转存完成后返回的播放、下载 URL 使用本站域名和随机文件名，不包含上游地址、账号信息或内部目录，访问时无需鉴权。创建与查询使用同一把 Key；视频任务接口不是聊天接口，不要使用 `/v1/chat/completions` 代替。

``` bash
export BASE_URL='https://yyds.seqnode.com'
export API_KEY='YOUR_GROUP_155_API_KEY'
curl --fail-with-body "$BASE_URL/v1/models" \
  -H "Authorization: Bearer $API_KEY"
```

## 3 创建视频：文生视频与图生视频 {#3-创建视频}

### 3.1 文生视频：JSON {#video-text}

新接入建议使用 JSON 格式的 `/v1/videos/generations`，显式填写时长、分辨率与比例。

  ------------------------------------------------------------------------------------------------------------------------------------
  字段                    示例                                            说明
  ----------------------- ----------------------------------------------- ------------------------------------------------------------
  `model`                 `grok-imagine-video-1.5`                        使用当前分组开放的完整模型名

  `prompt`                一段清楚的视频描述                              描述主体、动作、镜头和环境

  `duration`              `5`                                             整数秒；当前网关支持 1～15 秒

  `resolution`            `720p`                                          `480p`、`720p`、`1080p`

  `aspect_ratio`          `16:9`                                          示例使用横屏；其他比例受上游校验约束

  `image`                 `{"url":"https://example.com/reference.png"}`   可选，图生视频的参考图对象；替换为上游可读取的实际图片地址
  ------------------------------------------------------------------------------------------------------------------------------------

``` bash
curl --fail-with-body "$BASE_URL/v1/videos/generations" \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{
    "model": "grok-imagine-video-1.5",
    "prompt": "一只橘猫在窗边伸懒腰，晨光柔和，镜头缓慢推进",
    "duration": 5,
    "resolution": "720p",
    "aspect_ratio": "16:9"
  }'
```

**提交后：** 保存响应的任务 ID，再[查询原任务](#查询进度与成功响应)。受理响应的格式见[提交与任务 ID](#用-postman-apifox-创建-1-秒测试)，不要直接把提交响应当作视频文件。

### 3.2 图生视频：增加参考图 {#video-image}

**接口：** `POST /v1/videos/generations`，JSON。沿用文生视频的模型、时长和分辨率参数，将 `image.url` 替换为真实、可访问的图片地址。下方是完整请求体。

图生视频沿用同一地址，在 JSON 中增加 `image`：

``` json
{
  "model": "grok-imagine-video-1.5",
  "prompt": "保持参考图中的主体外观，让主体缓慢转身，镜头固定",
  "duration": 5,
  "resolution": "720p",
  "aspect_ratio": "16:9",
  "image": {"url": "https://example.com/reference.png"}
}
```

**提交后：** 保存响应的任务 ID，再[查询原任务](#查询进度与成功响应)。受理响应的格式见[提交与任务 ID](#用-postman-apifox-创建-1-秒测试)，不要直接把提交响应当作视频文件。

### 3.3 兼容入口：multipart {#video-compat}

用于需要 OpenAI 视频协议的客户端。`POST /v1/videos`；字段与推荐入口有差异，按下例填写。

OpenAI 视频兼容入口使用 `seconds` 表示时长，推荐 multipart。让 cURL 自动设置 multipart 的 Content-Type：

``` bash
curl --fail-with-body "$BASE_URL/v1/videos" \
  -H "Authorization: Bearer $API_KEY" \
  -F 'model=grok-imagine-video-1.5' \
  -F 'prompt=海边日出，镜头缓慢推进' \
  -F 'seconds=5' \
  -F 'resolution=720p' \
  -F 'aspect_ratio=16:9'
```

两套字段不要混填：推荐入口用 `duration`，OpenAI 兼容入口用 `seconds`。避免同时发送含义冲突的 `size`、`quality` 和 `resolution`。

**提交后：** 保存响应的任务 ID，再[查询原任务](#查询进度与成功响应)。受理响应的格式见[提交与任务 ID](#用-postman-apifox-创建-1-秒测试)，不要直接把提交响应当作视频文件。

### 3.4 Postman / Apifox：提交与任务 ID {#用-postman-apifox-创建-1-秒测试}

方法选择 **POST**，地址为 `https://yyds.seqnode.com/v1/videos/generations`。Authorization 选择 **Bearer Token**，填入 API Key；Body 选择 JSON，请求头为 `Content-Type: application/json`：

``` json
{
  "model": "grok-imagine-video-1.5",
  "prompt": "一只橘猫在窗边伸懒腰，晨光柔和，镜头固定，无文字",
  "duration": 1,
  "resolution": "480p",
  "aspect_ratio": "16:9"
}
```

该入口使用 `duration` 表示整数秒。成功受理返回 HTTP 200，例如：

``` json
{
  "request_id": "REPLACE_WITH_RETURNED_TASK_ID",
  "delivery_status": "processing"
}
```

保存 `request_id`。**受理成功不代表生成完成；重复点击创建会产生多个任务及费用。** 创建请求超时时，已有任务 ID 就继续查询原任务；没有取得 ID 时先检查使用记录，不要盲目重试 POST。

## 4 查询进度、下载与播放 {#4-查询任务与下载}

使用 **2 号站公网接口** `https://yyds.seqnode.com`，准备一把绑定 **#155「【视频】多模型按秒计费」** 的 API Key。流程为：创建一次 → 查询原任务 → 获取播放、下载 URL。示例 URL 和任务 ID 均为占位值，请使用实际响应。

### 4.1 查询原任务与判断状态 {#查询进度与成功响应}

每隔 **3～5 秒**，使用同一把 Key 请求 `GET https://yyds.seqnode.com/v1/videos/TASK_ID`。客户端可设置 5 分钟等待上限，超时后保留任务 ID，稍后继续查询。后台处理不会因客户端停止查询而停止。

生成或转存期间通常返回 HTTP 202，例如：

``` json
{
  "status": "pending",
  "progress": 99,
  "delivery_status": "processing"
}
```

转存成功后 HTTP 200，主要字段如下。**实际返回的 URL 已脱敏为本站域名加随机文件名。下面的 VIDEO_ID 和时间为示例占位值；查看或下载视频时，请使用实际响应中的完整地址，不要用任务 ID 拼接。**

``` json
{
  "model": "grok-imagine-video-1.5",
  "status": "done",
  "progress": 100,
  "delivery_status": "ready",
  "video": {
    "duration": 1,
    "url": "https://yyds.seqnode.com/VIDEO_ID.mp4",
    "download_url": "https://yyds.seqnode.com/VIDEO_ID.mp4?download=1",
    "expires_at": 1893459600
  }
}
```

`done` / `completed` 是生成成功状态；使用公开链接还应检查 `delivery_status: "ready"`。`pending`、`queued`、`in_progress` 时继续查询；生成状态 `failed` / `expired` 时停止并检查 `error`。

Bash 查询示例：

``` bash
BASE_URL='https://yyds.seqnode.com'
API_KEY='YOUR_GROUP_155_API_KEY'
TASK_ID='REPLACE_WITH_RETURNED_TASK_ID'
curl --fail-with-body "$BASE_URL/v1/videos/$TASK_ID" \
  -H "Authorization: Bearer $API_KEY"
```

### 4.2 读取交付链接与有效期 {#自动转存与-1-小时有效期}

创建任务后，2 号站后台会自动跟踪生成进度并转存 MP4，客户关闭页面或停止查询后仍会继续处理。客户无需先下载再上传。创建和查询任务继续使用同一把 #155 分组 API Key；**转存成功后的播放、下载 URL 无需 API Key**。

查询结果中，`status` 表示生成进度，`delivery_status` 表示交付状态。使用直链前，请确认 `delivery_status` 为 `ready`，并读取服务端返回的 URL，不要自行用任务 ID 拼接文件地址。

  -------------------------------------------------------------------------------------------------
  字段                                  用途
  ------------------------------------- -----------------------------------------------------------
  `video.url`                           完整 HTTPS 播放 URL，可直接在浏览器打开，支持视频拖动播放

  `video.download_url`                  完整 HTTPS 下载 URL，浏览器访问时触发文件下载

  `video.expires_at`                    链接到期时间，整数 Unix 时间戳（秒）

  `url`、`download_url`、`expires_at`   与上述字段含义相同的顶层兼容字段
  -------------------------------------------------------------------------------------------------

**视频链接从转存保存成功起有效 1 小时（3600 秒）**，不是从创建任务或第一次打开链接起计时。查询、播放和下载不会延长有效期；以 `expires_at` 为准。到期后新请求返回 HTTP 404，文件随后自动清理。需要长期保存时，请在到期前下载到自己的设备或存储。

链接持有者在有效期内可以访问视频，请只分享给需要查看的人。播放和下载请求不要附加 API Key，也不要把 Key 放进 URL。图片转存仍使用原来的 24 小时保留策略。

  ---------------------------------------------------------------------------------------------------------------------------------------------
  `delivery_status`                   处理方式
  ----------------------------------- ---------------------------------------------------------------------------------------------------------
  `processing`                        继续查询原任务。生成完成但仍在转存时，会暂时返回 `pending` / `in_progress`，进度可能为 99

  `ready`                             转存完成，在 `expires_at` 前使用播放、下载 URL

  `failed`                            转存未完成，不等同于生成失败；检查 `status`。若生成已完成，可尝试原鉴权 `/content` 接口，勿重新创建任务

  `expired`                           本站公开链接已到期；原鉴权 `/content` 是否仍可用取决于原任务和上游结果的保留情况
  ---------------------------------------------------------------------------------------------------------------------------------------------

生成状态为 `failed` 或 `expired` 时停止轮询，保留任务 ID 和错误信息。原 `/v1/videos/{TASK_ID}/content` 接口继续保留，仍需创建时的 API Key；它不承诺永久保存，也不会延长公开链接的有效期。

后台跟踪也会触发现有生成计费，因此不查询或关闭页面不代表任务取消。重复查询、访问已转存的播放/下载 URL 不会再次创建视频或重复收取生成费用；具体费用以本站使用记录为准。

### 4.3 下载 MP4、播放与网页嵌入 {#播放下载和网页嵌入}

在 Postman / Apifox 中，继续带 Key 查询原任务；看到 `delivery_status: "ready"` 后，复制响应中的 `video.url` 到浏览器即可播放。复制 `video.download_url` 到浏览器可下载 MP4。无需在浏览器配置 Bearer Token。

Bash / Linux / macOS 下载示例，将变量替换为**本次响应实际返回的完整下载 URL**，不添加 Authorization：

``` bash
VIDEO_DOWNLOAD_URL='REPLACE_WITH_RETURNED_VIDEO_DOWNLOAD_URL'
curl --fail --location "$VIDEO_DOWNLOAD_URL" --output generated-video.mp4
```

网页嵌入示例，两个占位值分别替换为响应中的播放和下载 URL：

``` html
<video controls playsinline preload="metadata"
       src="REPLACE_WITH_RETURNED_VIDEO_URL"
       style="max-width:100%">
  您的浏览器不支持视频播放，请使用下方下载链接。
</video>
<a href="REPLACE_WITH_RETURNED_VIDEO_DOWNLOAD_URL">下载视频</a>
```

视频播放支持 Range 分段请求及跨域读取。链接到期后，网页应提示用户链接已过期；不要通过重复提交生成请求来刷新链接。

若转存失败、但生成状态已完成，可使用以下兼容下载方式。它与上述免 Key 直链是两种不同入口：

``` bash
curl --fail --location "https://yyds.seqnode.com/v1/videos/$TASK_ID/content" \
  -H "Authorization: Bearer $API_KEY" \
  --output generated-video.mp4
```

### 4.4 继续查询已有任务 {#windows-powershell-7创建查询并打开播放链接}

需要自动创建、查询和打开视频时，使用顶部[PowerShell 完整示例](#quick-powershell)或[Python 完整示例](#quick-python)。已有任务 ID 时输入原 ID 继续查询，不要留空重新创建。

## 5 常见错误与重试 {#用量记录与常见问题}

在本站控制台的**使用记录**中，按调用时间和模型 `grok-imagine-video-1.5` 筛选，核对时长、分辨率及实际扣费。响应中的上游 `usage` 字段不等于本站账单。

  ---------------------------------------------------------------------------------------------------------------
  现象                                    处理方式
  --------------------------------------- -----------------------------------------------------------------------
  创建或查询 HTTP 401                     检查 Key 和 Bearer 鉴权；创建、查询使用同一把 Key

  HTTP 400                                检查模型、整数时长、分辨率；本创建入口使用 `duration`

  `delivery_status=processing`，进度 99   视频正在转存，继续查询原任务

  `delivery_status=failed`                检查生成状态；已生成时尝试原鉴权 `/content`，保留任务 ID 排查

  播放或下载直链 HTTP 404                 检查 `expires_at`，链接可能已过期；查询不会延长 1 小时有效期

  `delivery_status=expired`               公开链接已到期；若未保存，可尝试仍可用的原鉴权 `/content`，不保证恢复

  HTTP 429 / 503                          按服务端提示等待，避免重复创建

  下载文件打不开                          检查状态码与内容类型；错误 JSON 或 HTML 不是 MP4
  ---------------------------------------------------------------------------------------------------------------

## 6 模型、价格与费用核对 {#2-当前模型与价格}

  请求模型                             480p，元/秒   720p，元/秒   1080p，元/秒
  ---------------------------------- --------------- --------------- ----------------
  `grok-imagine-video-1.5`                      0.05            0.08             0.12
  `grok-imagine-video-1.5-preview`              0.05            0.08             0.12

视频独立倍率为 **1**。计费公式：该模型与分辨率的每秒单价 × 计费秒数 × 视频数量 × 视频倍率。单条 5 秒视频分别为 **\$0.25 / \$0.40 / \$0.60**。

`1.5-preview` 在当前网关归一化为 `grok-imagine-video-1.5` 计价，二者共用同一张价格表。模型是否可调用以该分组 Key 请求 `/v1/models` 的结果为准。

## 7 支持范围与验证记录 {#section-1}

  ------------------------------------------------------------------------------------------------------------------
  项目                                支持范围
  ----------------------------------- ------------------------------------------------------------------------------
  模型                                `grok-imagine-video-1.5`、`grok-imagine-video-1.5-preview`

  创建端点                            `POST /v1/videos/generations`；兼容 `POST /v1/videos`

  时长                                整数 1～15 秒

  分辨率                              `480p`、`720p`、`1080p`

  输入                                文本；可选单张 `image.url`

  查询 / 兼容下载                     `GET /v1/videos/{TASK_ID}`、`GET /v1/videos/{TASK_ID}/content`（需 Key）

  自动转存交付                        `video.url` 播放、`video.download_url` 下载，无需 Key；保存成功后有效 1 小时
  ------------------------------------------------------------------------------------------------------------------

  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  日期                                结果
  ----------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  2026-10-10                          自动转存实测通过：客户端未查询时后台完成转存；免 Key 下载 HTTP 200、Range HTTP 206、下载 HEAD HTTP 200；连续查询三次只有一条生成计费，实际扣费 \$0.05。链接有效期为保存成功后 3600 秒。

  2026-10-10                          2 号站公网接口实测通过：grok-imagine-video-1.5，1 秒、480p、16:9；创建 HTTP 200，查询由 HTTP 202 pending 转为 HTTP 200 done，下载 HTTP 200；MP4 为 848×480、24 fps，容器时长约 1.04 秒；本站按 1 秒计费 \$0.05。此结果仅覆盖本次文本生视频参数，其他分辨率与参考图效果需分别验证。
  ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

[返回本地 API 文档首页](index.html)

## 8 相关模型文档 {#5-一个分组放多个视频模型}

当前 Key 开放的模型以 `/v1/models` 为准。切换视频模型前，先查对应文档的时长、参考图字段和价格，不把同分组理解为参数完全通用。

### 8.1 Wan 视频 {#wan-3.0-视频接口}

同一 #155 分组也提供 Wan 视频接口。模型、时长、参考素材及价格请查看 [Wan 视频文档](wan-video-api.html)，实际开放模型以该分组 Key 请求 `/v1/models` 的结果为准。Wan 使用同一套自动转存和 1 小时链接交付流程。
