Trên trang này
TL;DR — Rẽ nhánh theo
error_code(với creatives:codedạng số), không bao giờ theo thông điệp. Luôn có nhánh mặc định: mã lạ được xử lý theo nhóm HTTP status (429và5xxthì retry, các4xxkhác thì không). Trang này liệt kê mọi status và mã mà từng endpoint trả về, kèm việc app hiển thị gì và backend làm gì. Khi nào retry và retry thế nào: chính sách retry.
Định dạng lỗi
Định dạng phẳng
Catalog, playback, cấu hình và video mở dùng một object phẳng:
{
"error": "Episode not found or not ready to stream",
"error_code": "not_ready"
}| Trường | Kiểu | Mô tả |
|---|---|---|
error |
string | Thông điệp để ghi log. Đừng hiển thị cho người xem và đừng parse, trừ những dòng bên dưới ghi rằng mã nằm trong error. |
error_code |
string | Mã máy đọc được. Rẽ nhánh theo trường này. Một số lỗi không có trường này (bảng bên dưới ghi là không có). |
reason |
string | Với not_entitled, và với 429 prefetch_shed: lý do chi tiết. |
fields |
mảng string | Với invalid_device_info: các giá trị thiết bị bị từ chối. |
protection |
string | Với sdk_required: mức bảo vệ của tập. |
supported_versions, latest_version, upgrade_to |
Với unsupported_version: những gì bạn có thể gửi thay thế. |
Một vài response 4xx không có error_code mà đặt một mã ổn định trong error: org_suspended, app_not_registered, collection_not_found và video_not_found. Hãy so sánh nguyên chuỗi.
Envelope của creatives
Các endpoint creatives bọc lỗi trong một envelope với code dạng số. Lỗi không có trường data:
{
"code": 4011,
"message": "Invalid or revoked API key",
"server_time": 1790679032
}code có bốn chữ số: ba chữ số đầu là HTTP status. Hai response của creatives dùng định dạng phẳng thay vì envelope: 429 rate_limited và 400 unsupported_version.
Request id
Mọi response mang header Wandura-Request-Id (ví dụ req_01J9Z3W2N8V4K7D5QX6T0B1C2M), và mọi body lỗi JSON, phẳng hay envelope, có trường request_id cùng giá trị. Hãy ghi log giá trị này, và trích dẫn khi liên hệ hỗ trợ: nó giúp tìm đúng request trong log của Wandura.
Trong lúc tính năng này chưa chạy, hãy gửi kèm endpoint, thời điểm theo UTC chính xác tới giây, status, mã lỗi và tiền tố key của bạn.
Xử lý lỗi theo mã
| Bạn nhận được | Làm gì |
|---|---|
| Một mã có trong trang này | Làm theo dòng của mã đó. |
Một error_code lạ với 429 |
Chờ hết Retry-After, rồi retry. |
Một error_code lạ với một 4xx khác |
Không retry. Hiển thị lỗi chung và báo cho kỹ sư của bạn. |
Một error_code lạ với 5xx |
Retry với backoff, như 503. |
| Không có body, hoặc body không phải JSON | Quyết định theo nhóm status, cùng cách như trên. |
Mã mới có thể xuất hiện trong v1 bất cứ lúc nào; app không có nhánh mặc định sẽ hiện màn hình trắng khi gặp mã mới. Không bao giờ hiển thị error hay message cho người xem: hãy ánh xạ mã sang nội dung của riêng bạn.
Retry-After
Được gửi kèm mọi 429, và các 503 được ghi "Sau Retry-After" bên dưới. Không bao giờ retry sớm hơn. 503 not_ready, các 503 của creatives, 502 và 500 không có header này: hãy dùng backoff.
Thông báo cho người xem
Cột "App hiển thị" bên dưới dùng bốn thông báo này. Hãy dùng câu chữ của riêng bạn.
| Thông báo | Khi nào |
|---|---|
| Không khả dụng — "Phim này không còn khả dụng" | Giấy phép không hoạt động. |
| Chưa có — "Chưa khả dụng" | Lúc này tập chưa phát được. |
| Bận — "Hệ thống đang bận, thử lại sau giây lát" | Đã retry mà vẫn lỗi tạm thời. |
| Hỏng — "Không tải được tập này" | Lỗi trong tích hợp của bạn. Báo cho kỹ sư của bạn. |
Mọi endpoint
Mọi path
| Status | Mã | Khi nào | Retry? | Làm gì |
|---|---|---|---|---|
| 404 | not_found |
Path lạ dưới /api/delivery/v1/, với bất kỳ method nào. Không có header Wandura-Version. |
Không | Sửa path. |
| 405 | không có (empty body) | Path có thật nhưng sai method, ví dụ GET /playback. Header Allow liệt kê method đúng. |
Không | Sửa method. |
Catalog
GET /api/delivery/v1/catalog
| Status | Mã | Khi nào | Retry? | App hiển thị | Backend làm gì |
|---|---|---|---|---|---|
| 400 | invalid_request |
limit không nằm trong 1–200, hoặc cursor bị sửa. |
Không | — | Sửa request. Đi lại từ trang đầu. |
| 400 | unsupported_version |
Header Wandura-Version, hoặc phiên bản key của bạn đang ghim, không tồn tại hoặc đã ngừng. |
Không | — | Gửi một phiên bản còn hỗ trợ; xem Chuyển phiên bản. |
| 401 | không có | Thiếu header, hoặc key không tồn tại hay đã bị thu hồi. | Không | — | Kiểm tra key. Giữ catalog cũ của bạn. |
| 403 | không có | Key thiếu metadata:read. |
Không | — | Dùng key có scope đó. |
| 403 | org_suspended (in error) |
Tổ chức của bạn đang bị tạm ngưng. | Không | — | Giữ bản sao, ngừng bán, liên hệ Wandura. |
| 429 | rate_limited |
Đã chạm ngưỡng catalog. | Sau Retry-After |
— | Chờ, rồi tìm vòng lặp gây ra. |
| 503 | service_unavailable |
Wandura chưa kiểm được key kịp lúc. Key không sai. | Sau Retry-After |
— | Retry. Không bao giờ xoay key vì lỗi này. |
| 503 | service_unavailable |
Wandura chưa đọc được catalog kịp lúc (Could not read the catalog in time — retry). |
Sau Retry-After |
— | Retry. Không bao giờ coi đây là catalog rỗng. |
Liệt kê bộ phim
GET /api/delivery/v1/series
| Status | Mã | Khi nào | Retry? | Backend làm gì |
|---|---|---|---|---|
| 400 | unsupported_version (flat) |
Phiên bản theo ngày không tồn tại hoặc đã ngừng. | Không | Gửi một phiên bản còn hỗ trợ. |
| 401 | 4010 |
Không có header Authorization: Bearer. |
Không | Sửa request. |
| 401 | 4011 |
Key không tồn tại hoặc đã bị thu hồi. | Không | Kiểm tra key. |
| 403 | 4030 |
Key thiếu metadata:read. |
Không | Dùng key có scope đó. |
| 403 | 4031 |
Tổ chức của bạn đang bị tạm ngưng. | Không | Liên hệ Wandura. |
| 422 | 4220 |
limit không nằm trong 1–100, updated_since không phải giây epoch, hoặc cursor không phải giá trị endpoint này trả về. |
Không | Sửa request; bắt đầu lại từ checkpoint gần nhất. |
| 429 | rate_limited (flat) |
Đã chạm ngưỡng catalog (dùng chung với catalog). | Sau Retry-After |
Chờ; đồng bộ thưa hơn. |
| 503 | 5030 |
Danh sách tạm thời không khả dụng. | Backoff | Retry; giữ checkpoint. |
| 503 | 5031 |
Wandura chưa kiểm được key kịp lúc. | Backoff | Retry. Đừng xoay key. |
Lấy metadata một bộ phim
GET /api/delivery/v1/series/{code}
| Status | Mã | Khi nào | Retry? | Backend làm gì |
|---|---|---|---|---|
| 400 | unsupported_version (flat) |
Phiên bản theo ngày không tồn tại hoặc đã ngừng. | Không | Gửi một phiên bản còn hỗ trợ. |
| 401 | 4010 |
Không có header Authorization: Bearer. |
Không | Sửa request. |
| 401 | 4011 |
Key không tồn tại hoặc đã bị thu hồi. | Không | Kiểm tra key. |
| 403 | 4030 |
Key thiếu metadata:read. |
Không | Dùng key có scope đó. |
| 403 | 4031 |
Tổ chức của bạn đang bị tạm ngưng. | Không | Liên hệ Wandura. |
| 404 | 4040 |
Không có bộ này, hoặc tổ chức của bạn không được stream nó (cố ý trả cùng một câu). | Không | Ngừng hiển thị bộ đó; xem lại danh sách. |
| 429 | rate_limited (flat) |
Đã chạm ngưỡng catalog (dùng chung với catalog). | Sau Retry-After |
Chờ. |
| 503 | 5030 |
Bộ phim tạm thời không khả dụng. | Backoff | Retry. |
| 503 | 5031 |
Wandura chưa kiểm được key kịp lúc. | Backoff | Retry. |
Playback
POST /api/delivery/v1/playback. Trong một lô, các dòng cấp request trả lời cho cả request; các dòng cấp vé nằm trong items[], mỗi phần tử có status riêng (và retry_after thay cho header).
Cả request
| Status | Mã | Khi nào | Retry? | App hiển thị | Backend làm gì |
|---|---|---|---|---|---|
| 400 | không có | Body không phải JSON, hoặc không có episode_id cũng không có film_ref kèm episode_no dạng số. |
Không | Hỏng | Sửa request. |
| 400 | invalid_request |
Chỉ có một trong hai union_info và drm_kek, hoặc lô sai định dạng. |
Không | Hỏng | Sửa request. |
| 400 | invalid_device_info |
Một giá trị thiết bị trông như rỗng, ví dụ "(null)", hoặc ngắn hơn 8 ký tự. fields nêu tên giá trị đó. |
Không | Hỏng | Sửa cách app đọc giá trị từ Player SDK. Báo động. |
| 400 | unsupported_version |
Phiên bản theo ngày không tồn tại hoặc đã ngừng. | Không | Hỏng | Xem Chuyển phiên bản. |
| 401 | không có | Thiếu header, hoặc key không tồn tại hay đã bị thu hồi. | Không | Hỏng | Kiểm tra key. Báo động. |
| 403 | không có | Key thiếu playback. |
Không | Hỏng | Dùng một playback key. |
| 429 | rate_limited |
Đã chạm ngưỡng playback với mọi phần tử. Kèm "reason": "prefetch_shed": prefetch đang tạm dừng vì gần chạm ngưỡng. |
Sau Retry-After |
Bận (play); không hiện gì (prefetch) | Retry các lượt play; bỏ các prefetch. Xem Rate limit. |
| 503 | service_unavailable |
Wandura chưa kiểm được key kịp lúc. | Sau Retry-After |
Bận | Retry. Đừng xoay key. |
| 500 | không có (rare) | Lỗi không lường trước. | Backoff | Bận | Retry một lần; báo lại kèm thời điểm. |
Từng vé (ở cấp ngoài cùng khi xin một tập, hoặc một phần tử của lô)
| Status | Mã | Khi nào | Retry? | App hiển thị | Backend làm gì |
|---|---|---|---|---|---|
| 403 | not_entitled |
Lúc này tổ chức của bạn không được stream phim này. reason cho biết lý do (bảng bên dưới). |
Không | Không khả dụng | Ghi log reason. Ngừng bán phim khi lần đồng bộ catalog kế tiếp xác nhận phim đã không còn. |
| 404 | not_ready |
Tập hoặc phim không tồn tại, chưa publish hoặc chưa sẵn sàng. | Không | Chưa có | Làm mới catalog. |
| 409 | sdk_required |
Tập đã mã hoá mà không có giá trị thiết bị. | Không | Hỏng | Gửi union_info và drm_kek. Báo động. |
| 429 | rate_limited |
Phần tử này không được nhận (chỉ trong lô). reason prefetch_shed với prefetch bị tạm dừng. |
Sau retry_after |
Không hiện gì với prefetch | Chỉ retry phần tử này. |
| 502 | không có | Không chuẩn bị được stream, hoặc không ký được play token. | Backoff | Bận | Retry, rồi báo lại. |
| 503 | not_ready |
Lúc này chưa có phiên bản phát được của tập. Không có Retry-After. |
Không phải bây giờ | Chưa có | Thử lại sau (lượt phát hoặc lần đồng bộ kế tiếp). |
| 503 | service_unavailable |
Nhà cung cấp video chưa trả lời kịp (The video provider did not answer in time — retry). |
Sau Retry-After (2 giây) |
Bận | Retry. Tập phim không hề bị thiếu. |
| 503 | service_unavailable |
Lúc này chưa cấp được vé (Could not issue this grant right now — retry). |
Sau Retry-After |
Bận | Retry. |
Đừng làm việc không đảo ngược được chỉ vì một câu trả lời. Trước khi ngừng bán phim hoặc hoàn tiền cho người xem vì
not_entitledhaynot_ready, hãy xác nhận bằng lần đồng bộ catalog kế tiếp: phim bị rút sẽ biến mất khỏi catalog.
Nếu trong lúc cấp vé Wandura chưa kiểm được giấy phép hoặc tập kịp lúc, Wandura trả 503 service_unavailable (Could not check the licence or episode right now — retry) kèm Retry-After, không bao giờ trả 404 hay 403. Cứ tiếp tục bán, và retry.
Các reason của not_entitled
Ghi log reason và trích dẫn khi liên hệ hỗ trợ, nhưng hiển thị cùng một màn hình cho mọi lý do: có thể có lý do mới được thêm vào.
reason |
Ý nghĩa |
|---|---|
org_suspended |
Quyền truy cập của tổ chức bạn đang bị tạm ngưng. |
entitlement_not_found |
Tổ chức của bạn không có giấy phép cho phim này. |
entitlement_suspended |
Giấy phép của bạn cho phim này đang bị tạm ngưng. |
streaming_disabled |
Giấy phép của bạn cho phim này không gồm quyền streaming. |
outside_window |
Hôm nay (UTC) nằm ngoài khung thời gian của giấy phép. |
Cấu hình
GET /api/delivery/v1/config
| Status | Mã | Khi nào | Retry? | Backend làm gì |
|---|---|---|---|---|
| 400 | unsupported_version |
Phiên bản theo ngày không tồn tại hoặc đã ngừng. | Không | Gửi một phiên bản còn hỗ trợ. |
| 401 | không có | Thiếu header, hoặc key không tồn tại hay đã bị thu hồi. | Không | Kiểm tra key. |
| 403 | org_suspended (in error) |
Tổ chức của bạn đang bị tạm ngưng. | Không | Liên hệ Wandura. |
| 429 | rate_limited |
Đã chạm ngưỡng cấu hình. | Sau Retry-After |
Đọc thưa hơn: lúc khởi động hoặc vài giờ một lần. |
| 503 | service_unavailable |
Wandura chưa kiểm được key kịp lúc. | Sau Retry-After |
Retry; giữ cấu hình đang có. |
| 503 | service_unavailable |
Wandura chưa đọc được cấu hình của bạn kịp lúc (Could not read your configuration in time — retry). |
Sau Retry-After |
Retry; giữ cấu hình đang có. |
Liệt kê creative
GET /api/delivery/v1/creatives
| Status | Mã | Khi nào | Retry? | Backend làm gì |
|---|---|---|---|---|
| 400 | unsupported_version (flat) |
Phiên bản theo ngày không tồn tại hoặc đã ngừng. | Không | Gửi một phiên bản còn hỗ trợ. |
| 401 | 4010 |
Không có header Authorization: Bearer. |
Không | Sửa request. |
| 401 | 4011 |
Key không tồn tại hoặc đã bị thu hồi. | Không | Kiểm tra key. |
| 403 | 4030 |
Key thiếu creatives:export. |
Không | Dùng key có scope đó. |
| 403 | 4031 |
Tổ chức của bạn đang bị tạm ngưng. | Không | Liên hệ Wandura. |
| 422 | 4220 |
limit không nằm trong 1–100 (limit= rỗng được tính là 0). |
Không | Sửa request. |
| 422 | 4221 |
updated_since không phải giây epoch. |
Không | Sửa request. |
| 422 | 4222 |
cursor không hợp lệ. |
Không | Bắt đầu lại từ checkpoint gần nhất. |
| 429 | rate_limited (flat) |
Đã chạm ngưỡng creatives. | Sau Retry-After |
Chờ; đồng bộ thưa hơn. |
| 503 | 5030 |
Feed tạm thời không khả dụng. | Backoff | Retry; giữ checkpoint. |
| 503 | 5031 |
Wandura chưa kiểm được key kịp lúc. | Backoff | Retry. Đừng xoay key. |
Lấy một creative
GET /api/delivery/v1/creatives/{id}
| Status | Mã | Khi nào | Retry? | Backend làm gì |
|---|---|---|---|---|
| 400 | unsupported_version (flat) |
Phiên bản theo ngày không tồn tại hoặc đã ngừng. | Không | Gửi một phiên bản còn hỗ trợ. |
| 401 | 4010 |
Không có header Authorization: Bearer. |
Không | Sửa request. |
| 401 | 4011 |
Key không tồn tại hoặc đã bị thu hồi. | Không | Kiểm tra key. |
| 403 | 4030 |
Key thiếu creatives:export. |
Không | Dùng key có scope đó. |
| 403 | 4031 |
Tổ chức của bạn đang bị tạm ngưng. | Không | Liên hệ Wandura. |
| 404 | 4040 |
Không có creative đã duyệt nào với ID này cho tổ chức của bạn (cũng vậy khi ID không phải UUID). | Không | Gỡ nó khỏi tập đang dùng của bạn. |
| 429 | rate_limited (flat) |
Đã chạm ngưỡng creatives (dùng chung với endpoint danh sách). | Sau Retry-After |
Chờ. |
| 503 | 5030 |
Feed tạm thời không khả dụng. | Backoff | Retry. |
| 503 | 5031 |
Wandura chưa kiểm được key kịp lúc. | Backoff | Retry. |
Liệt kê video mở
GET /api/delivery/v1/videos
| Status | Mã | Khi nào | Retry? | Backend làm gì |
|---|---|---|---|---|
| 400 | không có | cursor không phải token do endpoint này cấp, hoặc limit không nằm trong 1–200. |
Không | Sửa request; quét lại từ đầu. |
| 400 | unsupported_version |
Phiên bản theo ngày không tồn tại hoặc đã ngừng. | Không | Gửi một phiên bản còn hỗ trợ. |
| 401 | không có | Thiếu header, hoặc key không tồn tại hay đã bị thu hồi. | Không | Kiểm tra key. |
| 403 | không có | Key thiếu videos:read. |
Không | Dùng key video mở của app. |
| 403 | app_not_registered (in error) |
Key không gắn với app nào. | Không | Đăng ký app; dùng key của app đó. |
| 403 | org_suspended (in error) |
Tổ chức của bạn đang bị tạm ngưng. | Không | Liên hệ Wandura. |
| 404 | collection_not_found (in error) |
Không tồn tại, chưa publish hoặc không được cấp cho bạn. | Không | Kiểm tra mã bộ sưu tập. |
| 429 | rate_limited |
Đã chạm ngưỡng danh sách. | Sau Retry-After |
Chờ; cache danh sách. |
| 500 | không có | Không đọc được danh sách. | Backoff | Retry; tiếp tục phục vụ danh sách cũ. |
| 503 | service_unavailable |
Wandura chưa kiểm được key kịp lúc. | Sau Retry-After |
Retry. |
Lấy một video mở
GET /api/delivery/v1/videos/{id}
| Status | Mã | Khi nào | Retry? | Backend làm gì |
|---|---|---|---|---|
| 400 | không có | id không phải UUID. |
Không | Dùng id lấy từ danh sách. |
| 400 | unsupported_version |
Phiên bản theo ngày không tồn tại hoặc đã ngừng. | Không | Gửi một phiên bản còn hỗ trợ. |
| 401 | không có | Thiếu header, hoặc key không tồn tại hay đã bị thu hồi. | Không | Kiểm tra key. |
| 403 | không có | Key thiếu videos:read. |
Không | Dùng key video mở của app. |
| 403 | app_not_registered (in error) |
Key không gắn với app nào. | Không | Đăng ký app. |
| 403 | org_suspended (in error) |
Tổ chức của bạn đang bị tạm ngưng. | Không | Liên hệ Wandura. |
| 404 | video_not_found (in error) |
Không tồn tại, không được cấp, chưa publish, đã lưu trữ hoặc chưa phát được. | Không | Bỏ nó khỏi danh sách của bạn. |
| 429 | rate_limited |
Đã chạm ngưỡng một video (bộ đếm riêng). | Sau Retry-After |
Chờ; ưu tiên dùng danh sách đã cache. |
| 500 | không có | Không đọc được video. | Backoff | Retry. |
| 503 | service_unavailable |
Wandura chưa kiểm được key kịp lúc. | Sau Retry-After |
Retry. |
Liên quan
- Hành vi chuẩn của API: chính sách retry, rate limit, độ mới.
- Xử lý sự cố: từ triệu chứng tới cách sửa.
- Hỗ trợ: cần gửi gì khi lỗi kéo dài.
Cập nhật 05/10/2026 · Lịch sử thay đổi (9)