メインコンテンツへスキップ

パスパラメータ

id
string
必須
動画作成リクエストから返されるタスクID。idtask_id は同じ非同期識別子として扱ってください。
作成レスポンスが poll_url を返す場合は、その正確な URL を呼び出してください。これが /v1/tasks/{id} を指す場合は、それを正準の固定ステータスエンドポイントとして扱ってください。タスクが存在しない、または公開された非同期タスク契約を通じて解決できない場合、TokenLab は async_task_not_found を返し、メッセージ Task not found or no longer available. を返します。

レスポンス

id
string
正準の非同期タスク識別子。
task_id
string
非同期タスク識別子の別名。
poll_url
string
作成レスポンスが提供する場合の推奨ポーリングURL。
billing_transaction_id
string
決済がすでに完了している場合に返される TokenLab の請求トランザクション ID です。dashboard / 照合で使う取引識別子であり、非同期 id / task_id とは別物です。
status
string
タスクのステータス: pending, processing, completed, failed
progress
number
任意の進捗値です。実際の進捗値が利用できる場合のみ返されます。完了判定には status を使用してください。
video_url
string
生成されたビデオの URL(完了時)。
video
object
利用可能な場合に urldurationwidthheight を含む単一ビデオペイロード。
videos
array
生成タスクが複数の出力を返す場合の複数ビデオペイロード。
error
string
エラーメッセージ(失敗時)。
created
integer
作成タイムスタンプ。
updated
integer
最終更新タイムスタンプ。
model
string
タスクに使用されたモデル。
curl "https://api.tokenlab.sh/v1/tasks/ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \
  -H "Authorization: Bearer sk-your-api-key"
import requests
import time

task_id = "ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

while True:
    response = requests.get(
        f"https://api.tokenlab.sh/v1/tasks/{task_id}",
        headers={"Authorization": "Bearer sk-your-api-key"}
    )

    data = response.json()
    print(f"Status: {data['status']}")

    if data["status"] == "completed":
        print(f"Video URL: {data['video_url']}")
        break
    elif data["status"] == "failed":
        print(f"Error: {data['error']}")
        break

    time.sleep(5)  # Poll every 5 seconds
const taskId = 'ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';

async function pollForVideo() {
  while (true) {
    const response = await fetch(
      `https://api.tokenlab.sh/v1/tasks/${taskId}`,
      { headers: { 'Authorization': 'Bearer sk-your-api-key' } }
    );

    const data = await response.json();
    console.log(`Status: ${data.status}`);

    if (data.status === 'completed') {
      console.log(`Video URL: ${data.video_url}`);
      return data.video_url;
    } else if (data.status === 'failed') {
      throw new Error(data.error);
    }

    await new Promise(r => setTimeout(r, 5000));
  }
}
package main

import (
    "encoding/json"
    "fmt"
    "net/http"
    "time"
)

func main() {
    taskID := "ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"

    for {
        req, _ := http.NewRequest("GET",
            fmt.Sprintf("https://api.tokenlab.sh/v1/tasks/%s", taskID), nil)
        req.Header.Set("Authorization", "Bearer sk-your-api-key")

        client := &http.Client{}
        resp, _ := client.Do(req)

        var result map[string]interface{}
        json.NewDecoder(resp.Body).Decode(&result)
        resp.Body.Close()

        fmt.Printf("Status: %s\n", result["status"])

        if result["status"] == "completed" {
            fmt.Printf("Video URL: %s\n", result["video_url"])
            break
        } else if result["status"] == "failed" {
            fmt.Printf("Error: %s\n", result["error"])
            break
        }

        time.Sleep(5 * time.Second)
    }
}
<?php
$taskId = 'ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';

while (true) {
    $ch = curl_init("https://api.tokenlab.sh/v1/tasks/{$taskId}");

    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            'Authorization: Bearer sk-your-api-key'
        ]
    ]);

    $response = curl_exec($ch);
    curl_close($ch);

    $data = json_decode($response, true);
    echo "Status: {$data['status']}\n";

    if ($data['status'] === 'completed') {
        echo "Video URL: {$data['video_url']}\n";
        break;
    } elseif ($data['status'] === 'failed') {
        echo "Error: {$data['error']}\n";
        break;
    }

    sleep(5);
}
{
  "id": "ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "task_id": "ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "poll_url": "/v1/tasks/ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "status": "pending",
  "model": "veo3.1",
  "created": 1706000000,
  "updated": 1706000000
}
{
  "id": "ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "task_id": "ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "poll_url": "/v1/tasks/ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "status": "processing",
  "model": "veo3.1",
  "created": 1706000000,
  "updated": 1706000030
}
{
  "id": "ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "task_id": "ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "poll_url": "/v1/tasks/ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "billing_transaction_id": "cmo164zyc0s48jpgegi80vqv4",
  "status": "completed",
  "video_url": "https://assets.tokenlab.sh/videos/abc123.mp4",
  "model": "veo3.1",
  "created": 1706000000,
  "updated": 1706000060
}
{
  "id": "ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "task_id": "ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "poll_url": "/v1/tasks/ldtask_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa",
  "status": "failed",
  "error": "Content policy violation",
  "model": "veo3.1",
  "created": 1706000000,
  "updated": 1706000060
}

ポーリングのベストプラクティス

  • 5〜10秒ごとにポーリングする
  • 長時間のタスクには指数バックオフを実装する
  • 最大タイムアウトを設定する(例: 10分)
  • failed ステータスを適切に処理する
import time

def wait_for_video(task_id, max_wait=600, interval=5):
    """Wait for video with timeout."""
    start = time.time()

    while time.time() - start < max_wait:
        response = requests.get(
            f"https://api.tokenlab.sh/v1/tasks/{task_id}",
            headers={"Authorization": "Bearer sk-your-api-key"}
        )
        data = response.json()

        if data["status"] == "completed":
            return data["video_url"]
        elif data["status"] == "failed":
            raise Exception(data.get("error", "Video generation failed"))

        time.sleep(interval)

    raise TimeoutError("Video generation timed out")