Bản lưu ngày / Snapshot of 2026-10-12 · Xem bản mới nhất / See the latest version
WanduraDocsBeta
BetaDocs đang ở bản beta và còn thay đổi. Thấy chỗ sai, khó hiểu hoặc còn thiếu? Hãy cho chúng tôi biết.
Bạn đang đọc một bản tài liệu cũ: v1 · Sang bản mới nhất (v2)
Lịch sử thay đổi

Lịch sử: Xin playback

Mọi lần sửa trang này, mới nhất ở trên. Mở từng mục để xem đã đổi gì.

← Xin playback

  1. 02/10/2026 · +4 −1 dòng
    Xem thay đổi
    ⋯
      ```bash
      curl -s -X POST https://www.wandura.ai/api/delivery/v1/playback \
    -   -H "Authorization: Bearer $WANDURA_PLAYBACK_KEY" \
    +   -H "Authorization: Bearer $WANDURA_API_KEY" \
        -H "Content-Type: application/json" \
        -d '{
    ⋯
      | `Wandura-API-Status` | mọi response | Trạng thái API. Hiện là `beta`, ở mọi response, thành công hay lỗi. |
      | `Wandura-Version` | mọi response | Phiên bản API theo ngày (YYYY-MM-DD) mà response này dùng: bản ghim vào API key của bạn, hoặc bản bạn gửi trong header request `Wandura-Version`. Key tạo trước khi có phiên bản ngày dùng `2026-10-02`. |
    + | `Wandura-Request-Id` | mọi response | Mã định danh mờ của request này (`req_` và 26 ký tự). Mọi response đều có, kể cả lỗi, và body lỗi lặp lại nó ở `request_id`. Hãy ghi log nó, và gửi kèm khi liên hệ Wandura về một request: nó tìm đúng request đó trong log của chúng tôi. Đừng phân tích chuỗi này. |
    + | `Cache-Control` | mọi response | Luôn là `no-store`. Đừng lưu các response này trong cache dùng chung. |
      | `Deprecation` | 200 | Chỉ có khi endpoint này, hoặc phiên bản ngày đang phục vụ response, đã bị ngừng hỗ trợ (RFC 9745): `@<giây unix>` của ngày ngừng. Hãy ghi nó vào hệ giám sát. |
      | `Sunset` | 200 | Chỉ có khi endpoint hay phiên bản ngày đã bị ngừng có ngày thôi chạy (RFC 8594), dạng ngày HTTP. |
    ⋯
      | 503 | `service_unavailable` | Wandura chưa kiểm được API key kịp thời. Key không sai: thử lại sau số giây trong `Retry-After`, có backoff. |
      | 503 | `service_unavailable` | Nhà cung cấp video chưa trả lời kịp (`The video provider did not answer in time — retry`). Tập phim không bị thiếu: thử lại sau số giây trong `Retry-After`, có backoff. |
    + | 503 | `service_unavailable` | Wandura chưa kiểm được giấy phép hoặc tập phim kịp thời (`Could not check the licence or episode right now — retry`). Điều này không nói gì về giấy phép hay tập phim: cứ tiếp tục bán, và thử lại sau số giây trong `Retry-After`, có backoff. |
      
      Ví dụ `403`:
    ⋯
  2. 02/10/2026 · +10 −13 dòng
    Xem thay đổi
      # Xin playback
      
    - Cấp một vé playback ngắn hạn cho một tập. Backend của bạn gọi endpoint này mỗi khi người xem bắt đầu một tập và chuyển kết quả cho Player SDK trên thiết bị của người xem.
    + Cấp vé playback ngắn hạn: cho một tập, hoặc một batch tối đa 3 tập (tập người xem bắt đầu cộng tối đa hai tập prefetch). Backend của bạn gọi endpoint này mỗi khi người xem bắt đầu một tập và chuyển kết quả cho Player SDK trên thiết bị của người xem. Quy tắc về thời hạn, tái sử dụng và batch: [Hành vi chuẩn của API](behaviour.md#tickets).
      
      ```
    ⋯
      ```
      
    - **Scope:** `playback` (tự tạo trên **Developers** → **Stream films in an app**; nếu key bị lộ, bất kỳ ai cũng stream được phim bạn được cấp phép, nên hãy thu hồi ngay)
    + **Scope:** `playback` (**Developers** → **Stream films in an app**; xem [Xác thực](../authentication.md#scopes))
      
    - ## Mô tả
    + ## Mô tả {#description}
      
      Ở mọi request, Wandura kiểm tra rằng tổ chức của bạn đang hoạt động và giấy phép streaming cho phim chứa tập đó đang hoạt động và nằm trong khung thời gian. Sau đó Wandura trả về một play token gắn với thiết bị của người xem. Các tập được cấp phép đều đã mã hoá và chỉ phát được qua Player SDK, nên bạn phải gửi các giá trị thiết bị `union_info` và `drm_kek`. Xem [Playback](../concepts/playback.md).
    ⋯
      Chỉ gọi endpoint này từ backend. Endpoint không gửi header CORS.
      
    - ## Tham số request
    + ## Tham số request {#request-parameters}
      
      | Tên | Vị trí | Kiểu | Bắt buộc | Mô tả |
    ⋯
      | `Content-Type` | header | string | Nên có | `application/json`. Body phải là JSON. |
      | `Wandura-Version` | header | string | Không | Tuỳ chọn. Một phiên bản API theo ngày (YYYY-MM-DD) dùng cho request này thay cho bản ghim vào API key của bạn. Giá trị lạ hoặc đã ngừng trả 400 với `error_code` `unsupported_version`. |
    + | `Wandura-Simulate` | header | string | Không | Tuỳ chọn, chỉ với tổ chức thử. Yêu cầu Wandura trả một lỗi giả lập để bạn thử cách app xử lý nó, ví dụ `rate_limited`, `service_unavailable` hay `not_entitled:outside_window`. Response giả lập có cùng status, body và header với response thật, cộng header `Wandura-Simulated` nêu tên kịch bản. Nó không cấp vé và không tính vào rate limit, trừ `partial_batch` (phần tử đầu là vé thật). Response giả lập có giới hạn riêng 300 lần mỗi phút mỗi tổ chức. Key của tổ chức production bỏ qua hoàn toàn header này. Giá trị lạ, hoặc kịch bản endpoint không hỗ trợ, bị bỏ qua và request chạy bình thường. Xem hướng dẫn Testing để biết danh sách kịch bản. |
      | `episode_id` | body | string (UUID) | Một trong hai: `episode_id` hoặc `film_ref` + `episode_no` | `id` của tập lấy từ catalog. Được ưu tiên nếu bạn gửi kèm `film_ref`. |
      | `film_ref` | body | string | Cùng `episode_no`, nếu không có `episode_id` | `id` hoặc `slug` của phim. |
    ⋯
      | `next` | body | integer | Không | Lô dạng B — cùng một tập neo (`episode_id`, hoặc `film_ref` + `episode_no`), cấp thêm vé cho N tập kế tiếp của cùng phim. Các tập kế được ghi là `prefetch`. Tập vượt quá cuối phim hoặc chưa publish là lỗi 404 `not_ready` của riêng phần tử đó. Gửi `next` (kể cả 0) là chuyển response sang dạng lô. |
      
    - `union_info` và `drm_kek` bị từ chối với `400` `invalid_device_info` khi, sau khi bỏ khoảng trắng hai đầu, một giá trị ngắn hơn 8 ký tự hoặc là một trong `(null)`, `null`, `nil`, `undefined`, `nan`, `<null>`, `none` (chữ hoa hay thường đều tính).
    - 
    - ## Ví dụ request
    + ## Ví dụ request {#request-example}
      
      ```bash
    ⋯
      ```
      
    - ## Response
    + ## Response {#response}
      
      `200 OK`
    ⋯
      | `items[].retry_after` | integer | Số giây cần chờ trước khi thử lại phần tử này (503 và 429). |
      
    - Phụ đề được trả về theo thứ tự `lang`.
    - 
    - ## Ví dụ response
    + ## Ví dụ response {#response-example}
      
      ```json
    ⋯
      | `X-RateLimit-Window` | 429 | Độ dài cửa sổ tính bằng giây. |
      
    - ## Lỗi
    + ## Lỗi {#errors}
      
      | Status | `error_code` | Khi nào |
    ⋯
      ```
      
    - Xem [Lỗi](../concepts/errors.md#playback-errors) để biết cách xử lý từng trường hợp.
    + Cách xử lý từng trường hợp: [Lỗi](../concepts/errors.md#playback-errors).
  3. 02/10/2026 · +4 −4 dòng
    Xem thay đổi
    ⋯
      | `drm_kek` | body | string | Có, với tập đã mã hoá | Device public key do Player SDK tạo ra. Gửi cùng `union_info`. Kiểm như `union_info`. Khoá riêng tương ứng không bao giờ rời thiết bị. |
      | `intent` | body | string | Không | `play` khi người xem chạm vào tập, `prefetch` khi app tải tập trước khi người xem chạm. Request prefetch không tính là lượt phát. Thiếu trường này hoặc giá trị khác được ghi nhận là không xác định, không bao giờ bị từ chối, và vẫn tính là lượt phát. |
    - | `viewer_ref` | body | string | Không | Định danh phiên hoặc thiết bị opaque của riêng bạn, được lưu cùng vé để tra cứu khi hỗ trợ (tối đa 256 ký tự). Đừng đưa dữ liệu cá nhân vào. |
    + | `viewer_ref` | body | string | Không | Định danh phiên hoặc thiết bị opaque của riêng bạn, được lưu cùng vé để tra cứu khi hỗ trợ (tối đa 256 ký tự). Đừng đưa dữ liệu cá nhân vào. Khi bạn gửi trường này, xin lại cùng một tập với cùng `viewer_ref`, intent (`play` hay `prefetch`) và giá trị thiết bị trong lúc vé trước còn ít nhất 5 phút sẽ nhận lại đúng vé đó (cùng `expires_at`, không gia hạn) và không bị tính vào rate limit. |
      | `episodes` | body | array | Không | Lô dạng A — tối đa 3 tập trong một lần gọi (thường là tập đang xem + 2 tập kế). Không dùng chung với `episode_id` / `film_ref` / `episode_no` ở cấp ngoài hay với `next`. Phần tử 0 lấy `intent` cấp ngoài; các phần tử sau mặc định là `prefetch` trừ khi tự khai. |
      | `episodes[].episode_id` | body | string (UUID) | Không | Episode ID. Hoặc gửi `film_ref` + `episode_no`. |
    ⋯
      | `subtitles[].url` | string | URL của file phụ đề. Không gắn với thời hạn của vé. |
      | `subtitles[].format` | string | Luôn là `webvtt`. |
    - | `items` | array | Chỉ có ở lô — mỗi tập được hỏi một phần tử, theo thứ tự hỏi. Khi `status` là 200 phần tử còn có `episode_id`, `episode_no` và các trường vé như response một tập; ngược lại có `error`, `error_code`, `reason` (403, nếu có) và `retry_after` (503), không có dữ liệu tập. |
    + | `items` | array | Chỉ có ở lô — mỗi tập được hỏi một phần tử, theo thứ tự hỏi. Khi `status` là 200 phần tử còn có `episode_id`, `episode_no` và các trường vé như response một tập; ngược lại có `error`, `error_code`, `reason` (403, và 429 `prefetch_shed`, nếu có) và `retry_after` (503 và 429), không có dữ liệu tập. |
      | `items[].request` | object | Lặp lại thứ đã hỏi cho phần tử này. |
      | `items[].status` | integer | Status kiểu HTTP của riêng phần tử này. |
    ⋯
      | `items[].subtitles[].url` | string | URL của file phụ đề. Không gắn với thời hạn của vé. |
      | `items[].subtitles[].format` | string | Luôn là `webvtt`. |
    - | `items[].retry_after` | integer | Số giây cần chờ trước khi thử lại phần tử này (chỉ với 503). |
    + | `items[].retry_after` | integer | Số giây cần chờ trước khi thử lại phần tử này (503 và 429). |
      
      Phụ đề được trả về theo thứ tự `lang`.
    ⋯
      | 404 | `not_ready` | Phim hoặc tập không tồn tại, chưa publish, hoặc chưa sẵn sàng để stream. |
      | 409 | `sdk_required` | Tập đã mã hoá và request không có giá trị thiết bị. Body còn kèm `protection`. |
    - | 429 | `rate_limited` | Đã chạm rate limit của playback. Xem `Retry-After`. |
    + | 429 | `rate_limited` | Đã chạm rate limit của playback, hoặc (khi `reason` là `prefetch_shed`) prefetch bị tạm dừng vì lưu lượng playback của bạn đã gần mức đó. Xem `Retry-After`. |
      | 502 | không có | Không chuẩn bị được stream hoặc không ký được play token. Retry với backoff. |
      | 503 | `not_ready` | Hiện chưa có phiên bản phát được của tập. |
    ⋯
  4. 02/10/2026 · +6 −0 dòng
    Xem thay đổi
    ⋯
      | `Authorization` | header | string | Có | `Bearer <API key>` của một key có scope `playback`. |
      | `Content-Type` | header | string | Nên có | `application/json`. Body phải là JSON. |
    + | `Wandura-Version` | header | string | Không | Tuỳ chọn. Một phiên bản API theo ngày (YYYY-MM-DD) dùng cho request này thay cho bản ghim vào API key của bạn. Giá trị lạ hoặc đã ngừng trả 400 với `error_code` `unsupported_version`. |
      | `episode_id` | body | string (UUID) | Một trong hai: `episode_id` hoặc `film_ref` + `episode_no` | `id` của tập lấy từ catalog. Được ưu tiên nếu bạn gửi kèm `film_ref`. |
      | `film_ref` | body | string | Cùng `episode_no`, nếu không có `episode_id` | `id` hoặc `slug` của phim. |
    ⋯
      |---|---|---|
      | `Wandura-API-Status` | mọi response | Trạng thái API. Hiện là `beta`, ở mọi response, thành công hay lỗi. |
    + | `Wandura-Version` | mọi response | Phiên bản API theo ngày (YYYY-MM-DD) mà response này dùng: bản ghim vào API key của bạn, hoặc bản bạn gửi trong header request `Wandura-Version`. Key tạo trước khi có phiên bản ngày dùng `2026-10-02`. |
    + | `Deprecation` | 200 | Chỉ có khi endpoint này, hoặc phiên bản ngày đang phục vụ response, đã bị ngừng hỗ trợ (RFC 9745): `@<giây unix>` của ngày ngừng. Hãy ghi nó vào hệ giám sát. |
    + | `Sunset` | 200 | Chỉ có khi endpoint hay phiên bản ngày đã bị ngừng có ngày thôi chạy (RFC 8594), dạng ngày HTTP. |
    + | `Link` | 200 | Có kèm `Deprecation`: `<https://docs.wandura.ai/…>; rel="deprecation"` (và `rel="sunset"`) trỏ tới trang giải thích dùng gì thay thế. |
      | `Retry-After` | 429, 503 | Số giây cần chờ trước khi thử lại. Có ở response 429 và các response 503 nên thử lại. |
      | `X-RateLimit-Limit` | 429 | Số request (với playback là số vé) được phép trong một cửa sổ cho nhóm endpoint này và tổ chức của bạn. |
    ⋯
      | 400 | `invalid_request` | Chỉ gửi một trong hai `union_info` và `drm_kek`, hoặc lô sai dạng (`episodes` rỗng hay dài hơn 3, một phần tử không chỉ tập nào, `episodes` dùng chung với trường tập cấp ngoài hay với `next`, `next` ngoài 0–2 hoặc không có tập neo). |
      | 400 | `invalid_device_info` | Một giá trị thiết bị trông như rỗng hoặc quá ngắn. Mảng `fields` nêu tên giá trị đó. |
    + | 400 | `unsupported_version` | Header `Wandura-Version`, hoặc bản ghim của key, là bản lạ hay đã ngừng. Body có thêm `supported_versions` và `latest_version` (và `upgrade_to` khi bản ghim đã ngừng). |
      | 401 | không có | Thiếu header `Authorization: Bearer`, hoặc key không tồn tại hay đã bị thu hồi. |
      | 403 | không có | Key thiếu scope `playback`. |
    ⋯
  5. 02/10/2026 · +30 −7 dòng
    Xem thay đổi
    ⋯
      | `film_ref` | body | string | Cùng `episode_no`, nếu không có `episode_id` | `id` hoặc `slug` của phim. |
      | `episode_no` | body | integer | Cùng `film_ref`, nếu không có `episode_id` | Số tập, bắt đầu từ 1. Phải là số JSON, không phải string. |
    - | `union_info` | body | string | Có, với tập đã mã hoá | Device ID do Player SDK tạo ra trên thiết bị của người xem. Gửi cùng `drm_kek`. |
    - | `drm_kek` | body | string | Có, với tập đã mã hoá | Device public key do Player SDK tạo ra. Gửi cùng `union_info`. |
    + | `union_info` | body | string | Có, với tập đã mã hoá | Device ID do Player SDK tạo ra trên thiết bị của người xem. Gửi cùng `drm_kek`. Bị từ chối với 400 `invalid_device_info` khi, sau khi bỏ khoảng trắng hai đầu, giá trị ngắn hơn 8 ký tự hoặc là một trong `(null)`, `null`, `nil`, `undefined`, `nan`, `<null>`, `none` (chữ hoa hay thường đều tính). |
    + | `drm_kek` | body | string | Có, với tập đã mã hoá | Device public key do Player SDK tạo ra. Gửi cùng `union_info`. Kiểm như `union_info`. Khoá riêng tương ứng không bao giờ rời thiết bị. |
      | `intent` | body | string | Không | `play` khi người xem chạm vào tập, `prefetch` khi app tải tập trước khi người xem chạm. Request prefetch không tính là lượt phát. Thiếu trường này hoặc giá trị khác được ghi nhận là không xác định, không bao giờ bị từ chối, và vẫn tính là lượt phát. |
    - | `viewer_ref` | body | string | Không | Định danh phiên hoặc thiết bị opaque của riêng bạn, được lưu cùng vé để tra cứu khi hỗ trợ. Đừng đưa dữ liệu cá nhân vào. |
    + | `viewer_ref` | body | string | Không | Định danh phiên hoặc thiết bị opaque của riêng bạn, được lưu cùng vé để tra cứu khi hỗ trợ (tối đa 256 ký tự). Đừng đưa dữ liệu cá nhân vào. |
    + | `episodes` | body | array | Không | Lô dạng A — tối đa 3 tập trong một lần gọi (thường là tập đang xem + 2 tập kế). Không dùng chung với `episode_id` / `film_ref` / `episode_no` ở cấp ngoài hay với `next`. Phần tử 0 lấy `intent` cấp ngoài; các phần tử sau mặc định là `prefetch` trừ khi tự khai. |
    + | `episodes[].episode_id` | body | string (UUID) | Không | Episode ID. Hoặc gửi `film_ref` + `episode_no`. |
    + | `episodes[].film_ref` | body | string | Không | `id` hoặc `slug` của phim, đi cùng `episode_no`. |
    + | `episodes[].episode_no` | body | integer | Không | Số tập (số nguyên từ 1), đi cùng `film_ref`. |
    + | `episodes[].intent` | body | string | Không | Intent của phần tử này. |
    + | `next` | body | integer | Không | Lô dạng B — cùng một tập neo (`episode_id`, hoặc `film_ref` + `episode_no`), cấp thêm vé cho N tập kế tiếp của cùng phim. Các tập kế được ghi là `prefetch`. Tập vượt quá cuối phim hoặc chưa publish là lỗi 404 `not_ready` của riêng phần tử đó. Gửi `next` (kể cả 0) là chuyển response sang dạng lô. |
      
      `union_info` và `drm_kek` bị từ chối với `400` `invalid_device_info` khi, sau khi bỏ khoảng trắng hai đầu, một giá trị ngắn hơn 8 ký tự hoặc là một trong `(null)`, `null`, `nil`, `undefined`, `nan`, `<null>`, `none` (chữ hoa hay thường đều tính).
    ⋯
      | Trường | Kiểu | Mô tả |
      |---|---|---|
    - | `vid` | string | Video ID để tải trong Player SDK. |
    + | `vid` | string | Video ID để tải trong Player SDK. Đi cùng `play_auth_token`. |
      | `play_auth_token` | string | Play token để đưa cho Player SDK. Giữ bí mật và không ghi log. |
    - | `expires_at` | string (ISO 8601, UTC) | Thời điểm vé hết hạn: 30 phút sau khi được cấp. |
    + | `manifest_url` | string | Link stream đã ký, thay cho `vid` + `play_auth_token`, chỉ có với nội dung Wandura giao cho tổ chức của bạn không mã hoá theo thoả thuận (khi đó `protection` là `signed-url-only`). Dùng được tới `expires_at`. |
    + | `expires_at` | string (ISO 8601, UTC) | Thời điểm vé hết hạn: 30 phút sau khi được cấp (15 phút với `manifest_url`). |
      | `protection` | string | Mức bảo vệ của nội dung bạn nhận được. `private-encrypted` với các tập được cấp phép. Chỉ bán tập trả phí khi giá trị là `private-encrypted`. |
    - | `subtitles` | array | Phụ đề gắn với tập. Rỗng khi chưa có phụ đề nào. |
    + | `subtitles` | array | Phụ đề gắn với tập, theo thứ tự `lang`. Rỗng khi chưa có phụ đề nào. |
      | `subtitles[].lang` | string | Mã ngôn ngữ, ví dụ `en`, `vi` hoặc `pt-BR`. |
      | `subtitles[].url` | string | URL của file phụ đề. Không gắn với thời hạn của vé. |
      | `subtitles[].format` | string | Luôn là `webvtt`. |
    + | `items` | array | Chỉ có ở lô — mỗi tập được hỏi một phần tử, theo thứ tự hỏi. Khi `status` là 200 phần tử còn có `episode_id`, `episode_no` và các trường vé như response một tập; ngược lại có `error`, `error_code`, `reason` (403, nếu có) và `retry_after` (503), không có dữ liệu tập. |
    + | `items[].request` | object | Lặp lại thứ đã hỏi cho phần tử này. |
    + | `items[].status` | integer | Status kiểu HTTP của riêng phần tử này. |
    + | `items[].subtitles[].lang` | string | Mã ngôn ngữ, ví dụ `en`, `vi` hoặc `pt-BR`. |
    + | `items[].subtitles[].url` | string | URL của file phụ đề. Không gắn với thời hạn của vé. |
    + | `items[].subtitles[].format` | string | Luôn là `webvtt`. |
    + | `items[].retry_after` | integer | Số giây cần chờ trước khi thử lại phần tử này (chỉ với 503). |
      
      Phụ đề được trả về theo thứ tự `lang`.
    ⋯
      ```
      
    + ## Header của response {#response-headers}
    + 
    + | Header | Response | Mô tả |
    + |---|---|---|
    + | `Wandura-API-Status` | mọi response | Trạng thái API. Hiện là `beta`, ở mọi response, thành công hay lỗi. |
    + | `Retry-After` | 429, 503 | Số giây cần chờ trước khi thử lại. Có ở response 429 và các response 503 nên thử lại. |
    + | `X-RateLimit-Limit` | 429 | Số request (với playback là số vé) được phép trong một cửa sổ cho nhóm endpoint này và tổ chức của bạn. |
    + | `X-RateLimit-Window` | 429 | Độ dài cửa sổ tính bằng giây. |
    + 
      ## Lỗi
      
    ⋯
      |---|---|---|
      | 400 | không có | Body không phải JSON hợp lệ, hoặc không có `episode_id` cũng không có `film_ref` kèm `episode_no` dạng số. |
    - | 400 | `invalid_request` | Chỉ gửi một trong hai `union_info` và `drm_kek`. |
    + | 400 | `invalid_request` | Chỉ gửi một trong hai `union_info` và `drm_kek`, hoặc lô sai dạng (`episodes` rỗng hay dài hơn 3, một phần tử không chỉ tập nào, `episodes` dùng chung với trường tập cấp ngoài hay với `next`, `next` ngoài 0–2 hoặc không có tập neo). |
      | 400 | `invalid_device_info` | Một giá trị thiết bị trông như rỗng hoặc quá ngắn. Mảng `fields` nêu tên giá trị đó. |
      | 401 | không có | Thiếu header `Authorization: Bearer`, hoặc key không tồn tại hay đã bị thu hồi. |
    ⋯
  6. 01/10/2026 · +2 −1 dòng
    Xem thay đổi
    ⋯
      ```
      
    - **Scope:** `playback` (chỉ Wandura cấp)
    + **Scope:** `playback` (tự tạo trên **Developers** → **Stream films in an app**; nếu key bị lộ, bất kỳ ai cũng stream được phim bạn được cấp phép, nên hãy thu hồi ngay)
      
      ## Mô tả
    ⋯
      | 503 | `not_ready` | Hiện chưa có phiên bản phát được của tập. |
      | 503 | `service_unavailable` | Wandura chưa kiểm được API key kịp thời. Key không sai: thử lại sau số giây trong `Retry-After`, có backoff. |
    + | 503 | `service_unavailable` | Nhà cung cấp video chưa trả lời kịp (`The video provider did not answer in time — retry`). Tập phim không bị thiếu: thử lại sau số giây trong `Retry-After`, có backoff. |
      
      Ví dụ `403`:
    ⋯
  7. 01/10/2026 · +3 −2 dòng
    Xem thay đổi
    ⋯
      | `union_info` | body | string | Có, với tập đã mã hoá | Device ID do Player SDK tạo ra trên thiết bị của người xem. Gửi cùng `drm_kek`. |
      | `drm_kek` | body | string | Có, với tập đã mã hoá | Device public key do Player SDK tạo ra. Gửi cùng `union_info`. |
    - | `intent` | body | string | Không | `play` khi người xem chạm vào tập, `prefetch` khi app tải tập trước khi người xem chạm. Request prefetch không tính là lượt phát. Giá trị khác được ghi nhận là không xác định và không bao giờ bị từ chối. |
    + | `intent` | body | string | Không | `play` khi người xem chạm vào tập, `prefetch` khi app tải tập trước khi người xem chạm. Request prefetch không tính là lượt phát. Thiếu trường này hoặc giá trị khác được ghi nhận là không xác định, không bao giờ bị từ chối, và vẫn tính là lượt phát. |
      | `viewer_ref` | body | string | Không | Định danh phiên hoặc thiết bị opaque của riêng bạn, được lưu cùng vé để tra cứu khi hỗ trợ. Đừng đưa dữ liệu cá nhân vào. |
      
    - `union_info` và `drm_kek` bị từ chối với `400` `invalid_device_info` khi trông như rỗng (ví dụ `"(null)"`, `"null"`, `"nil"`, `"undefined"`, `"none"`) hoặc ngắn hơn 8 ký tự.
    + `union_info` và `drm_kek` bị từ chối với `400` `invalid_device_info` khi, sau khi bỏ khoảng trắng hai đầu, một giá trị ngắn hơn 8 ký tự hoặc là một trong `(null)`, `null`, `nil`, `undefined`, `nan`, `<null>`, `none` (chữ hoa hay thường đều tính).
      
      ## Ví dụ request
    ⋯
      | 502 | không có | Không chuẩn bị được stream hoặc không ký được play token. Retry với backoff. |
      | 503 | `not_ready` | Hiện chưa có phiên bản phát được của tập. |
    + | 503 | `service_unavailable` | Wandura chưa kiểm được API key kịp thời. Key không sai: thử lại sau số giây trong `Retry-After`, có backoff. |
      
      Ví dụ `403`:
    ⋯
  8. 29/09/2026 · Tạo trang
↑↓ chọnEnter mởEsc đóng

Gửi góp ý

Góp ý được gửi thẳng tới đội Wandura, kèm địa chỉ trang này.

0 / 4000