> ## Documentation Index
> Fetch the complete documentation index at: https://apidoc.cometapi.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Dùng polling và webhook cho tạo video

> Theo dõi quá trình tạo video trên CometAPI bằng polling và webhook thông qua việc lưu task ID, kiểm tra trạng thái task và xử lý lỗi phân phối callback.

Dùng polling làm phương án cơ bản cho việc tạo video vì mọi job bất đồng bộ đều trả về một task ID mà bạn có thể truy vấn. Chỉ thêm webhook khi endpoint video được chọn hỗ trợ callback URL, và vẫn dùng polling làm nguồn xác thực chính cho các callback bị bỏ lỡ hoặc việc phân phối callback mang tính đặc thù của từng nhà cung cấp.

## Tạo một video task

Yêu cầu sau tạo một video task tối thiểu và lưu ID được trả về. Chỉ thêm các trường duration, resolution hoặc callback khi trang model được chọn có tài liệu mô tả các trường đó.

```bash theme={null}
curl https://api.cometapi.com/v1/videos \
  -H "Authorization: Bearer $COMETAPI_KEY" \
  -F "model=doubao-seedance-2-0" \
  -F "prompt=A cinematic shot of a paper airplane crossing a desk"
```

Phản hồi bao gồm task ID và trạng thái:

```json theme={null}
{
  "id": "task_example",
  "task_id": "task_example",
  "object": "video",
  "model": "doubao-seedance-2-0",
  "status": "queued",
  "progress": 0,
  "created_at": 1779872000
}
```

## Poll trạng thái

Yêu cầu sau kiểm tra trạng thái của video task:

```bash theme={null}
curl https://api.cometapi.com/v1/videos/task_example \
  -H "Authorization: Bearer $COMETAPI_KEY"
```

Phản hồi sẽ thay đổi theo tiến trình của task. Các phản hồi hoàn tất có thể bao gồm `video_url` khi model adapter có URL kết quả; nếu không, hãy dùng các trường kết quả đặc thù của model hoặc route nội dung `/v1/videos/{id}/content` khi model đó hỗ trợ tải xuống được proxy.

```json theme={null}
{
  "id": "task_example",
  "object": "video",
  "model": "doubao-seedance-2-0",
  "status": "completed",
  "progress": 100,
  "completed_at": 1779872300,
  "video_url": "<generated-video-url>"
}
```

## Nhận một webhook

CometAPI không định nghĩa một payload callback phổ quát cho mọi model video. Hãy coi callback là các sự kiện pass-through đặc thù theo từng nhà cung cấp, lưu phần body thô và đối chiếu trạng thái cuối cùng bằng polling.

Trình xử lý Express sau chấp nhận một callback video và lưu sự kiện:

```javascript theme={null}
import express from "express";

const app = express();
app.use(express.json({ limit: "2mb" }));

app.post("/cometapi/video-webhook", async (request, response) => {
  const event = request.body;

  console.log("Task ID:", event.task_id || event.id);
  console.log("Status:", event.status);

  response.status(200).json({ received: true });
});

app.listen(3000);
```

Một payload callback thường bao gồm các trường nhận dạng task và trạng thái, nhưng cấu trúc lồng chính xác phụ thuộc vào model hoặc nhà cung cấp được chọn:

```json theme={null}
{
  "task_id": "task_example",
  "status": "completed",
  "progress": 100,
  "result": {
    "video_url": "https://example.com/result.mp4"
  }
}
```

## Các lỗi thường gặp

| Error                                       | Cách khắc phục                                                                                                                       |
| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| Callback bị mất                             | Poll theo task ID cho đến khi ứng dụng của bạn đã lưu một trạng thái kết thúc.                                                       |
| Callback trùng lặp                          | Xử lý callback theo cách idempotent dựa trên task ID.                                                                                |
| Callback bị từ chối                         | Trả về phản hồi `2xx` nhanh chóng, sau đó xử lý job ở nền.                                                                           |
| Payload đặc thù của nhà cung cấp không khớp | Lưu payload callback thô và chuẩn hóa nó trong ứng dụng của bạn.                                                                     |
| Thiếu `video_url`                           | Xem `video_url` là tùy chọn và dùng polling cùng với các trường kết quả đặc thù của model hoặc `/v1/videos/{id}/content` khi có sẵn. |

## Liên kết liên quan

* [Video Models](/api/video)
* [Tạo video](/api/video/sora-2/create)
* [Truy xuất video](/api/video/sora-2/retrieve)
* [Trang models](/vi/overview/models)
* [Thư mục model](https://www.cometapi.com/models/)
* [Bảng giá](https://www.cometapi.com/pricing/)

<script type="application/ld+json">
  {`
    {
    "@context": "https://schema.org",
    "@graph": [
      {
        "@type": "TechArticle",
        "@id": "https://apidoc.cometapi.com/guides/webhook-and-polling-for-video-generation",
        "headline": "Làm thế nào để sử dụng webhook và polling cho việc tạo video?",
        "description": "Sử dụng polling và webhook cho việc tạo video trên CometAPI bằng cách lưu trữ ID tác vụ, kiểm tra trạng thái tác vụ và xử lý lỗi gửi callback.",
        "url": "https://apidoc.cometapi.com/guides/webhook-and-polling-for-video-generation",
        "author": {
          "@type": "Organization",
          "name": "CometAPI"
        },
        "publisher": {
          "@type": "Organization",
          "name": "CometAPI",
          "url": "https://www.cometapi.com"
        }
      },
      {
        "@type": "BreadcrumbList",
        "itemListElement": [
          {
            "@type": "ListItem",
            "position": 1,
            "name": "Tài liệu CometAPI",
            "item": "https://apidoc.cometapi.com/"
          },
          {
            "@type": "ListItem",
            "position": 2,
            "name": "Hướng dẫn",
            "item": "https://apidoc.cometapi.com/guides/use-cometapi-with-openai-sdk"
          },
          {
            "@type": "ListItem",
            "position": 3,
            "name": "Làm thế nào để sử dụng webhook và polling cho việc tạo video?",
            "item": "https://apidoc.cometapi.com/guides/webhook-and-polling-for-video-generation"
          }
        ]
      }
    ]
    }
    `}
</script>
