LIN AI

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. 1. Địa chỉ và khoá
  2. 2. Quy ước chung
  3. 3. Giá khi gọi bằng API
  4. 4. Tạo một tập phim, từng bước
  5. 5. Video trending
  6. 6. Các đường thường dùng
  7. 7. Giới hạn
  8. 8. Mã lỗi

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ường code có 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ách issues theo 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à header Retry-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ệcTrên webGọ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ạch8 linh thạch
Một video trending20 linh thạch30 linh thạch
Tạo tập, ảnh nhân vật, ghép tập, đọc dữ liệumiễ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_castCòn nhân vật chưa có ảnh được duyệt
validatedSẵ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
stitchingMọi cảnh đã xong, đang ghép
doneĐã có video cả tập
partialCó 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.

6. Các đường thường dùng

GET/api/meTài khoản, số dư linh thạch, giá và giới hạn hiện hành
POST/api/episodes/draftHệ 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/episodesTạ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/episodesDanh 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}/imageXin 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}/uploadTả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}/approveDuyệ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}/renderGử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}/stitchGhép hoặc ghép lại thành một video. Miễn phí
GET/api/scenes/{id}/videoChuyển hướng tới video của một cảnh; thêm ?download=1 để tải về
GET/api/episodes/{id}/downloadChuyển hướng tới link tải video cả tập
GET/api/trendsCá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/trendsGử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}/videoChuyển hướng tới video kết quả; thêm ?download=1 để tải về
GET/api/walletSố 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 header Retry-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ậptối đa 10
Thời lượng mỗi cảnh6 tới 6 giây
Lời đọc mỗi cảnh15 tới 35 từ
Prompt hình mỗi cảnhtối đa 1000 ký tự
Nhân vậttối đa 10 mỗi tập, 5 mỗi cảnh
Tạo lại ảnh nhân vật30 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êntối đa 8 MB
Video trendinglấ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ữ videovideo đã 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

400Dữ liệu gửi lên sai hoặc thiếu (tham số, file quá nặng, sai định dạng).
401Thiếu khoá, khoá sai hoặc đã bị thu hồi.
402Không đủ linh thạch cho việc này.
403Khô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ị).
404Không tìm thấy, hoặc không thuộc tài khoản của bạn.
409Chư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.
422Kị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.
429Quá 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).
500Lỗi máy chủ. Thử lại sau; lặp lại thì báo contact@lin.vn.
503Máy chủ chưa sẵn sàng.

Giá trị của code

BAD_IMAGE_PATH400File ảnh không hợp lệ.
BAD_SPEED400Tốc độ video phải từ 0,5x tới 2x.
BAD_TREND_KIND400Loại video trending không hợp lệ.
CHARACTER_KEY_OVERLAP400Khoá 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_SCENE400Danh sách cảnh bị trùng.
NO_SCENES400Chưa chọn cảnh nào để gửi.
ORDER_MISMATCH400Danh sách tập không khớp với dự án.
PROMPT_REQUIRED400Cảnh chưa có prompt.
INSUFFICIENT_BALANCE402Số dư linh thạch không đủ.
BLOCKED403Tài khoản đang bị khoá.
CHARACTER_NOT_FOUND404Không tìm thấy nhân vật.
EPISODE_NOT_FOUND404Không tìm thấy tập.
IMAGE_NOT_FOUND404Không tìm thấy ảnh này của nhân vật.
PROFILE_NOT_FOUND404Không tìm thấy tài khoản.
PROJECT_NOT_FOUND404Không tìm thấy dự án.
SCENE_NOT_FOUND404Không tìm thấy cảnh.
TREND_NOT_FOUND404Không tìm thấy video.
ASPECT_LOCKED409Khung hình khoá lại khi đã có cảnh gửi đi render.
CAST_LOCKED409Đ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_READY409Cả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_BUSY409Ảnh nhân vật đang được tạo.
CHARACTER_CONFLICT409Tậ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_EXISTS409Khoá nhân vật này đã có.
CHARACTER_LIMIT409Tập đã đủ số nhân vật tối đa.
CHARACTER_NOT_REVIEWABLE409Nhân vật chưa có ảnh chờ duyệt.
LAST_SCENE409Tập phải còn ít nhất một cảnh.
PROJECT_BUSY409Dự á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_BUSY409Cảnh đang chờ hoặc đang render, chưa thao tác được.
SCENE_NOT_REVIEWABLE409Cảnh này chưa ở trạng thái duyệt được.
SCENES_NOT_APPROVED409Còn cảnh chưa duyệt.
SCENES_NOT_READY409Còn cảnh chưa render xong.
STITCH_BUSY409Tập đang được ghép.
STITCH_UP_TO_DATE409Bản ghép hiện tại đã là bản mới nhất.
TREND_BUSY409Video đang được dựng, chưa xoá được.
VOICE_LOCKED409Giọng đọc khoá lại khi đã có cảnh gửi đi render.
DAILY_LIMIT429Đã hết lượt tạo lại ảnh nhân vật hôm nay.
RATE_LIMITED429Gọ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.