Tài liệu API
Mọi việc bạn làm trên trang LIN AI đều gọi được từ script: viết kịch bản từ ý tưởng, tạo tập, tạo ảnh nhân vật, gửi dựng, tải video, và video trending. Giới hạn giống khi dùng trang web; giá của vài việc khác, xem mục Giá khi gọi bằng API.
Mục lục
1. Địa chỉ và khoá
Địa chỉ gốc: https://lin-ai-video.hkdq.space. Tạo khoá ở trang API trong studio rồi gửi kèm mọi yêu cầu trong header Authorization:
curl https://lin-ai-video.hkdq.space/api/me \ -H "Authorization: Bearer lin_KHOA_CUA_BAN"
- Khoá chỉ hiện một lần lúc tạo. Mất khoá thì thu hồi và tạo khoá mới; mỗi tài khoản có tối đa 5 khoá.
- Một khoá làm được mọi việc tài khoản làm được, kể cả trừ linh thạch. Đừng đưa khoá vào mã chạy trên trình duyệt hay kho mã công khai.
- Khoá không dùng được cho việc tạo, thu hồi khoá và các đường quản trị.
2. Quy ước chung
- Gửi và nhận JSON (trừ các đường tải file lên, dùng form nhiều phần).
- Lỗi trả mã HTTP từ 400 trở lên kèm
{ "error": "câu báo tiếng Việt", "code": "MÃ" }. Trườngcodecó khi lỗi thuộc loại định sẵn. - Các mã hay gặp: 401 khoá sai hoặc đã thu hồi; 402 không đủ linh thạch; 409 việc chưa làm được lúc này (cảnh đang dựng, nhân vật chưa có ảnh:
CAST_NOT_READY); 422 kịch bản sai khuôn, kèm danh sáchissuestheo từng cảnh. - Giới hạn tần suất cho mỗi tài khoản: đọc (GET) 120 lần mỗi phút, ghi (POST, PATCH, DELETE) 20 lần mỗi phút. Vượt mức trả 429 với
"code": "RATE_LIMITED"và headerRetry-After(số giây cần chờ). Gửi khoá sai nhiều lần liên tiếp thì bị chặn tạm một phút. - Ba việc trừ linh thạch: viết kịch bản từ ý tưởng, gửi cảnh đi dựng và gửi video trending. Lượt lỗi được hoàn tự động.
- Việc dựng chạy nền. Hỏi lại trạng thái mỗi 5 đến 15 giây là đủ.
3. Giá khi gọi bằng API
Gọi bằng khoá API, các việc tạo nội dung tính giá riêng: dựng cảnh và video trending bằng giá trên web nhân 150%, làm tròn lên. Ưu đãi lần đầu (video đầu tiên, lượt trending đầu tiên) chỉ có khi dùng trang web; gọi bằng API không được giảm và cũng không làm mất ưu đãi đó.
| Việc | Trên web | Gọi bằng API |
|---|---|---|
| Viết kịch bản từ ý tưởng (mỗi lần) | miễn phí | 2 linh thạch |
| Dựng một cảnh (cả khi làm lại) | 5 linh thạch | 8 linh thạch |
| Một video trending | 20 linh thạch | 30 linh thạch |
| Tạo tập, ảnh nhân vật, ghép tập, đọc dữ liệu | miễn phí | miễn phí |
Giá hiện hành luôn có trong GET /api/me, mục pricing.api. Báo giá trong GET /api/episodes/{id} (quote) đã theo giá API khi gọi bằng khoá. Mỗi lần trừ trả về charged; sổ linh thạch ghi thêm "(API)". Viết kịch bản không thành thì được hoàn ngay.
4. Tạo một tập phim, từng bước
Sáu bước dưới đây đúng với các bước bạn bấm trên trang web. Bản chạy được trọn vẹn có trong file ví dụ Python ở đầu trang.
Bước 1. Hệ thống viết kịch bản từ ý tưởng (miễn phí)
curl -X POST https://lin-ai-video.hkdq.space/api/episodes/draft \
-H "Authorization: Bearer $LIN_AI_KEY" -H "Content-Type: application/json" \
-d '{"idea": "Thỏ và Rùa chạy thi lần hai, kết thúc bất ngờ.", "sceneCount": 5, "voiceGender": "female"}'
# Trả về: { "json": "<chuỗi JSON prompt>", "issues": [] }JSON prompt có khuôn { title, style, characters: [{ key, name, description }], scenes: [{ prompt, voice }] }. Bạn sửa được trước khi tạo tập, hoặc tự viết cả JSON và bỏ qua bước này. Nhân vật có mặt trong cảnh nào thì prompt của cảnh đó phải nhắc đúng key của nhân vật.
Bước 2. Tạo tập (miễn phí)
curl -X POST https://lin-ai-video.hkdq.space/api/episodes \
-H "Authorization: Bearer $LIN_AI_KEY" -H "Content-Type: application/json" \
-d '{"json": "<chuỗi JSON prompt ở bước 1>", "aspect": "9:16", "voiceGender": "female", "captions": true}'
# Trả về: { "id": "<mã tập>" }Bước 3. Ảnh nhân vật (miễn phí)
Đọc tập để lấy danh sách nhân vật, xin tạo ảnh cho từng nhân vật, chờ trạng thái thành pending_review rồi duyệt. Có ảnh riêng thì tải lên thay cho việc tạo, ảnh tải lên được duyệt luôn.
curl https://lin-ai-video.hkdq.space/api/episodes/$TAP -H "Authorization: Bearer $LIN_AI_KEY"
# episode.cast: [{ "id": "...", "key": "character_tho", "status": "no_image" }, ...]
curl -X POST https://lin-ai-video.hkdq.space/api/characters/episode/$NHAN_VAT/image -H "Authorization: Bearer $LIN_AI_KEY"
curl -X POST https://lin-ai-video.hkdq.space/api/characters/episode/$NHAN_VAT/approve -H "Authorization: Bearer $LIN_AI_KEY"
# Hoặc dùng ảnh của bạn:
curl -X POST https://lin-ai-video.hkdq.space/api/characters/episode/$NHAN_VAT/upload \
-H "Authorization: Bearer $LIN_AI_KEY" -F "image=@tho.jpg;type=image/jpeg"Bước 4. Gửi dựng (trừ linh thạch)
curl -X POST https://lin-ai-video.hkdq.space/api/episodes/$TAP/render \
-H "Authorization: Bearer $LIN_AI_KEY" -H "Content-Type: application/json" -d '{}'
# Trả về: { "charged": 50, "scenes": 5, "balance": 450 }Số sẽ trừ có sẵn ở quote.total khi đọc tập. Làm lại vài cảnh thì gửi {"sceneIds": ["<mã cảnh>"]}.
Bước 5. Chờ dựng và ghép
Đọc lại tập cho tới khi episode.status là done. Ở chế độ ghép tự động, cảnh cuối xong là hệ thống tự ghép.
| waiting_cast | Còn nhân vật chưa có ảnh được duyệt |
| validated | Sẵn sàng gửi dựng |
| rendering | Đang dựng cảnh. Hết tài khoản dựng hình thì tập đứng ở trạng thái này cho tới khi có lại, không báo lỗi |
| stitching | Mọi cảnh đã xong, đang ghép |
| done | Đã có video cả tập |
| partial | Có cảnh lỗi. Cảnh lỗi đã được hoàn linh thạch; gửi lại bằng sceneIds |
Bước 6. Tải video
curl -L -o episode.mp4 https://lin-ai-video.hkdq.space/api/episodes/$TAP/download -H "Authorization: Bearer $LIN_AI_KEY"
Video được giữ có hạn (xem keepDays ở /api/me). Hết hạn thì video bị xoá, kịch bản và nhân vật vẫn còn.
5. Video trending
Gửi một ảnh nhân vật kèm một video nguồn (file, hoặc link TikTok). Hệ thống thay nhân vật chính của video bằng nhân vật trong ảnh và giữ tiếng gốc.
curl -X POST https://lin-ai-video.hkdq.space/api/trends \
-H "Authorization: Bearer $LIN_AI_KEY" \
-F "character=@character.jpg;type=image/jpeg" \
-F "video=@source.mp4;type=video/mp4"
# hoặc thay dòng video bằng: -F "url=https://www.tiktok.com/@.../video/..."
# Trả về: { "id": "<mã video>", "cost": 30 }
curl https://lin-ai-video.hkdq.space/api/trends -H "Authorization: Bearer $LIN_AI_KEY"
# trends: [{ "id": "...", "status": "queued | processing | done | failed | expired", "error": null }], terms: { "cost": 30, "maxSeconds": 30 }
curl -L -o result.mp4 "https://lin-ai-video.hkdq.space/api/trends/$VIDEO/video?download=1" -H "Authorization: Bearer $LIN_AI_KEY"Phải ghi rõ kiểu file trong form (type=image/jpeg, type=video/mp4); máy chủ kiểm tra theo đó. Giá và số giây được dùng nằm ở terms.
6. Các đường thường dùng
| GET | /api/me | Tài khoản, số dư linh thạch, giá và giới hạn hiện hành |
| POST | /api/episodes/draft | Hệ thống viết kịch bản (JSON prompt) từ ý tưởng: idea (tối đa 2.000 ký tự), sceneCount, voiceGender, projectId. TRỪ LINH THẠCH khi gọi bằng khoá API (không viết được thì hoàn); trả về charged |
| POST | /api/episodes | Tạo tập từ JSON prompt: json, idea, aspect (9:16 hoặc 16:9), voiceGender (male mặc định, hoặc female), speed (1, 1.1 mặc định, 1.2, 1.25, 1.5), captions, stitchMode (auto hoặc review), projectId, autoCharacterImages (mặc định true: tự xếp việc vẽ ảnh cho nhân vật chưa có ảnh; false nếu bạn tự tải ảnh lên). Miễn phí |
| GET | /api/episodes | Danh sách tập: limit, offset, projectId hoặc loose=1 |
| GET | /api/episodes/{id} | Một tập: trạng thái, nhân vật, từng cảnh, kèm báo giá (quote) |
| PATCH | /api/episodes/{id} | Đổi tiêu đề, phong cách, khung hình, phụ đề, chế độ ghép |
| DELETE | /api/episodes/{id} | Xoá tập |
| POST | /api/characters/episode/{id}/image | Xin tạo ảnh cho một nhân vật của tập. Miễn phí, có hạn mức tạo lại mỗi ngày |
| POST | /api/characters/episode/{id}/upload | Tải ảnh của bạn lên cho nhân vật: form nhiều phần, trường image. Ảnh được duyệt luôn |
| POST | /api/characters/episode/{id}/approve | Duyệt ảnh nhân vật |
| PATCH | /api/scenes/{id} | Sửa prompt hình hoặc lời đọc của một cảnh chưa gửi dựng |
| POST | /api/episodes/{id}/render | Gửi dựng và TRỪ LINH THẠCH. Không truyền gì: mọi cảnh nháp. sceneIds: làm lại các cảnh đó |
| POST | /api/episodes/{id}/stitch | Ghép hoặc ghép lại thành một video. Miễn phí |
| GET | /api/scenes/{id}/video | Chuyển hướng tới video của một cảnh; thêm ?download=1 để tải về |
| GET | /api/episodes/{id}/download | Chuyển hướng tới link tải video cả tập |
| GET | /api/trends | Các video trending của bạn, số dư, và terms: giá lượt kế tiếp, số giây được dùng |
| POST | /api/trends | Gửi một video trending và TRỪ LINH THẠCH: form nhiều phần, kind (loại video, mặc định swap_character: thay thế nhân vật), character (ảnh) cùng video (file) hoặc url (link TikTok) |
| GET | /api/trends/{id}/video | Chuyển hướng tới video kết quả; thêm ?download=1 để tải về |
| GET | /api/wallet | Số dư và sổ linh thạch |
7. Giới hạn
Giới hạn tần suất, chỉ tính khi gọi bằng khoá API, đếm theo từng phút cho mỗi tài khoản (mọi khoá của một tài khoản dùng chung):
- Đọc (GET): 120 lần mỗi phút.
- Ghi (POST, PATCH, DELETE): 20 lần mỗi phút.
- Gửi khoá sai 20 lần trong một phút từ cùng một địa chỉ IP thì mọi khoá từ IP đó bị chặn tới hết phút.
- Vượt mức: HTTP 429,
{ "code": "RATE_LIMITED", "retryAfter": 37 }, kèm headerRetry-After,X-RateLimit-Limit,X-RateLimit-Remaining.
Giới hạn nội dung đang áp dụng (giống khi dùng trang web; số mới nhất luôn có trong GET /api/me, mục limits):
| Số cảnh mỗi tập | tối đa 10 |
| Thời lượng mỗi cảnh | 6 tới 6 giây |
| Lời đọc mỗi cảnh | 15 tới 35 từ |
| Prompt hình mỗi cảnh | tối đa 1000 ký tự |
| Nhân vật | tối đa 10 mỗi tập, 5 mỗi cảnh |
| Tạo lại ảnh nhân vật | 30 lần mỗi ngày cho cả tài khoản (ảnh tạo lần đầu không tính) |
| Ảnh nhân vật tải lên | tối đa 8 MB |
| Video trending | lấy 30 giây đầu; video nguồn dài tối đa 60 giây, nặng tối đa 80 MB; ảnh nhân vật tối đa 8 MB |
| Giữ video | video đã ghép giữ 3 ngày; cảnh của tập chưa ghép giữ 7 ngày |
8. Mã lỗi
Mọi lỗi trả về JSON { "error": "câu báo tiếng Việt", "code": "MÃ" }. Dựa vào code khi có để xử lý trong script; câu trong error có thể đổi chữ.
Mã HTTP
| 400 | Dữ liệu gửi lên sai hoặc thiếu (tham số, file quá nặng, sai định dạng). |
| 401 | Thiếu khoá, khoá sai hoặc đã bị thu hồi. |
| 402 | Không đủ linh thạch cho việc này. |
| 403 | Không có quyền: tài khoản bị khoá, hoặc việc chỉ làm được khi đăng nhập trên web (quản lý khoá API, quản trị). |
| 404 | Không tìm thấy, hoặc không thuộc tài khoản của bạn. |
| 409 | Chưa làm được lúc này vì trạng thái hiện tại (cảnh đang dựng, nhân vật chưa có ảnh, tập đang ghép…). Xem code. |
| 422 | Kịch bản sai khuôn hoặc vượt giới hạn, kèm danh sách issues theo từng cảnh. |
| 429 | Quá giới hạn tần suất (RATE_LIMITED) hoặc hết lượt tạo lại ảnh nhân vật trong ngày (DAILY_LIMIT). |
| 500 | Lỗi máy chủ. Thử lại sau; lặp lại thì báo contact@lin.vn. |
| 503 | Máy chủ chưa sẵn sàng. |
Giá trị của code
| BAD_IMAGE_PATH | 400 | File ảnh không hợp lệ. |
| BAD_SPEED | 400 | Tốc độ video phải từ 0,5x tới 2x. |
| BAD_TREND_KIND | 400 | Loại video trending không hợp lệ. |
| CHARACTER_KEY_OVERLAP | 400 | Khoá nhân vật này nằm trong (hoặc chứa) một khoá khác. Đổi tên để không nhận nhầm. |
| DUPLICATE_SCENE | 400 | Danh sách cảnh bị trùng. |
| NO_SCENES | 400 | Chưa chọn cảnh nào để gửi. |
| ORDER_MISMATCH | 400 | Danh sách tập không khớp với dự án. |
| PROMPT_REQUIRED | 400 | Cảnh chưa có prompt. |
| INSUFFICIENT_BALANCE | 402 | Số dư linh thạch không đủ. |
| BLOCKED | 403 | Tài khoản đang bị khoá. |
| CHARACTER_NOT_FOUND | 404 | Không tìm thấy nhân vật. |
| EPISODE_NOT_FOUND | 404 | Không tìm thấy tập. |
| IMAGE_NOT_FOUND | 404 | Không tìm thấy ảnh này của nhân vật. |
| PROFILE_NOT_FOUND | 404 | Không tìm thấy tài khoản. |
| PROJECT_NOT_FOUND | 404 | Không tìm thấy dự án. |
| SCENE_NOT_FOUND | 404 | Không tìm thấy cảnh. |
| TREND_NOT_FOUND | 404 | Không tìm thấy video. |
| ASPECT_LOCKED | 409 | Khung hình khoá lại khi đã có cảnh gửi đi render. |
| CAST_LOCKED | 409 | Đang có tập tạo cảnh hoặc ghép video dùng nhân vật này nên chưa đổi ảnh được. Chờ tập đó xong rồi đổi. |
| CAST_NOT_READY | 409 | Cảnh có nhân vật chưa có ảnh đã duyệt. Tạo hoặc tải ảnh lên rồi duyệt trước khi tạo video. |
| CHARACTER_BUSY | 409 | Ảnh nhân vật đang được tạo. |
| CHARACTER_CONFLICT | 409 | Tập và dự án có ảnh khác nhau cho cùng một nhân vật. Chọn giữ ảnh nào. |
| CHARACTER_EXISTS | 409 | Khoá nhân vật này đã có. |
| CHARACTER_LIMIT | 409 | Tập đã đủ số nhân vật tối đa. |
| CHARACTER_NOT_REVIEWABLE | 409 | Nhân vật chưa có ảnh chờ duyệt. |
| LAST_SCENE | 409 | Tập phải còn ít nhất một cảnh. |
| PROJECT_BUSY | 409 | Dự án còn việc đang chạy (dựng cảnh, vẽ ảnh nhân vật hoặc ghép tập). Chờ xong rồi xoá. |
| SCENE_BUSY | 409 | Cảnh đang chờ hoặc đang render, chưa thao tác được. |
| SCENE_NOT_REVIEWABLE | 409 | Cảnh này chưa ở trạng thái duyệt được. |
| SCENES_NOT_APPROVED | 409 | Còn cảnh chưa duyệt. |
| SCENES_NOT_READY | 409 | Còn cảnh chưa render xong. |
| STITCH_BUSY | 409 | Tập đang được ghép. |
| STITCH_UP_TO_DATE | 409 | Bản ghép hiện tại đã là bản mới nhất. |
| TREND_BUSY | 409 | Video đang được dựng, chưa xoá được. |
| VOICE_LOCKED | 409 | Giọng đọc khoá lại khi đã có cảnh gửi đi render. |
| DAILY_LIMIT | 429 | Đã hết lượt tạo lại ảnh nhân vật hôm nay. |
| RATE_LIMITED | 429 | Gọi quá giới hạn tần suất của khoá API. Chờ số giây trong retryAfter (hoặc header Retry-After) rồi gọi lại. |