Mọi request gửi và nhận JSON. Phản hồi luôn có trường ok; khi lỗi có thêm error mô tả bằng tiếng Việt.
http://localhost:3000Gửi API key ở header của mọi request. Chấp nhận cả hai kiểu — dùng kiểu nào tool của bạn hỗ trợ.
X-API-Key: vk_xxxxx
# hoac, neu tool cua ban chi co o "Bearer token":
Authorization: Bearer vk_xxxxx| Loại | Credit | Thành tiền |
|---|---|---|
| Video 5 giây | 5.000 | 5.000đ |
| Video 10 giây | 10.000 | 10.000đ |
| Ảnh AI | 100 | 100đ |
Credit bị trừ ngay khi tạo job. Nếu tạo thất bại vì lỗi hệ thống, credit được hoàn lại tự động. Xem bảng giá chi tiết từng model, hoặc gọi GET /api/v1/models để lấy bảng giá theo thời gian thực thay vì ghi cứng số trong code.
POST/api/v1/videos
| Trường | Kiểu | Mô tả |
|---|---|---|
prompt * | string | Mô tả nội dung video. Từ 3 ký tự. |
duration | int | Số giây, mặc định 10. Không chọn model thì dùng 5 hoặc 10. Có chọn model thì tuỳ model — trong kho có model nhận tới 30 giây. Danh sách chính xác nằm ở durations_avail của GET /api/v1/models. |
ratio | string | 9:16, 16:9 hoặc 1:1. Mặc định 9:16. |
model | string | Mã model nếu muốn dùng model cao cấp. Xem GET /api/v1/models. |
server_id | int | Chọn server. Bỏ trống là dùng server mặc định. Mỗi server có kho model riêng, nên server_id phải khớp với server của model bạn chọn — sai server thì trả về lỗi 400 và không trừ credit. Xem danh sách ở GET /api/v1/models hoặc trang bảng giá. |
resolution | string | Ví dụ 720p, 1080p. Chỉ với model hỗ trợ — xem resolutions_avail. |
mode | string | Chế độ render của model, ví dụ standard, professional, fast, turbo. Giá đổi theo chế độ, có model chênh nhau vài lần. Mỗi model có bộ chế độ riêng — lấy đúng tên ở price_combos. |
image_url | string | URL ảnh tham chiếu để tạo video từ ảnh. Lấy qua POST /api/v1/upload-image. |
image_urls | string[] | Nhiều ảnh tham chiếu, tối đa 5. Được ưu tiên nếu gửi cùng image_url. |
video_url | string | URL video nguồn, cho các model sửa/chuyển động video. |
curl -X POST http://localhost:3000/api/v1/videos \
-H "X-API-Key: vk_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Chú mèo phi hành gia trôi trong vũ trụ, ánh sáng rực rỡ",
"duration": 10,
"ratio": "9:16"
}'{
"ok": true,
"video": {
"id": "cms8rhkln0001vne0gfseyy7x",
"status": "queued",
"prompt": "Chú mèo phi hành gia...",
"duration": 10,
"ratio": "9:16",
"credit_cost": 10000,
"video_url": null,
"error": null,
"created_at": "2026-07-31T09:50:14.411Z",
"done_at": null
},
"balance": 458000
}GET/api/v1/models
Không gửi model thì hệ thống dùng cấu hình mặc định. Muốn chọn cụ thể thì lấy danh sách ở đây — đừng ghi cứng vào code, kho model đổi theo thời gian.
{
"ok": true,
"servers": [{
"id": 2,
"name": "Máy chủ chính",
"models": [{
"model": "kling_video_3_0",
"name": "Kling AI 3.0",
"media_type": "video",
"durations_avail": ["5", "10"],
"resolutions_avail": [],
"credit_cost_matrix": { "5||standard": 5, "10||standard": 10 },
"price_combos": ["5||standard", "10||standard"],
"requires": null
}]
}]
}Khoá trong credit_cost_matrix có dạng duration|resolution|mode — phần nào model không dùng thì để trống. Giá trị chính là số credit sẽ bị trừ.
| Khoá | Gửi lên |
|---|---|
10|1080p|professional | { "duration": 10, "resolution": "1080p", "mode": "professional" } |
5||standard | { "duration": 5, "mode": "standard" } |
|| | chỉ cần prompt, model có một mức giá duy nhất |
requiresimage — model bắt buộc có image_url. video — bắt buộc có video_url. null — chỉ cần prompt.400 ngay và không bị trừ credit — hệ thống chặn trước khi gọi đi, không để bạn mất tiền vào một job chắc chắn hỏng.Kho model đi theo nhà cung cấp: model nào đang bán được thì có trong danh sách này. Vì vậy hãy gọi lại định kỳ thay vì lưu một bản chép cứng.
GET/api/v1/videos/{id}
Hỏi lại mỗi 15–30 giây. Khi status là done thì video_url có link tải.
curl http://localhost:3000/api/v1/videos/cms8rhkln0001vne0gfseyy7x \
-H "X-API-Key: vk_xxxxx"| status | Ý nghĩa |
|---|---|
queued | Đang xếp hàng chờ xử lý |
processing | Đang render |
done | Xong — video_url đã sẵn sàng |
failed | Thất bại — xem error, credit đã được hoàn |
Thêm callback_url khi tạo job, hệ thống sẽ gọi về địa chỉ đó ngay khi xong. Một video 30 phút mà hỏi lại mỗi 20 giây là ~90 request rỗng; có webhook thì còn đúng một.
curl -X POST http://localhost:3000/api/v1/videos \
-H "Authorization: Bearer vk_xxxxx" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Chú mèo phi hành gia",
"duration": 10,
"callback_url": "https://server-cua-ban.com/webhook"
}'POST https://server-cua-ban.com/webhook
X-Webhook-Timestamp: 1785600000
X-Webhook-Signature: sha256=a3f1...
{
"event": "video.completed",
"video": {
"id": "cms...",
"status": "done",
"video_url": "https://...mp4",
"credit_cost": 10000,
"error": null
}
}Ai biết địa chỉ webhook của bạn cũng gửi được thông báo giả. Hãy kiểm tra chữ ký trước khi tin. Lấy khoá bí mật ở trang chính, mục Webhook.
// Node.js
const crypto = require('crypto')
app.post('/webhook', express.raw({ type: '*/*' }), (req, res) => {
const ts = req.headers['x-webhook-timestamp']
const sig = req.headers['x-webhook-signature']
const body = req.body.toString()
const mong = 'sha256=' + crypto
.createHmac('sha256', process.env.WEBHOOK_SECRET)
.update(ts + '.' + body)
.digest('hex')
if (sig !== mong) return res.status(401).end()
// Quá 5 phút thì bỏ — chặn phát lại request cũ
if (Math.abs(Date.now()/1000 - Number(ts)) > 300) return res.status(401).end()
const data = JSON.parse(body)
console.log('xong:', data.video.video_url)
res.status(200).end() // trả 200, nếu không hệ thống sẽ gửi lại
})GET /api/v1/videos/{id} — webhook chỉ là đường nhanh hơn, không phải đường duy nhất.Địa chỉ phải dùng https và trỏ ra Internet công cộng. Địa chỉ nội bộ (localhost, 10.x, 192.168.x…) bị từ chối vì lý do bảo mật.
Dùng qua lớp tương thích thì đặt tên trường theo nhà đó: fal_webhook (query, fal.ai), callBackUrl (kie.ai), config.webhook_config.endpoint (PiAPI).
POST/api/v1/upload-image
Gửi multipart/form-data, field tên image. Nhận png/jpg/webp, tối đa 10MB. Bước này không tốn credit.
# 1) Tải ảnh lên
curl -X POST http://localhost:3000/api/v1/upload-image \
-H "X-API-Key: vk_xxxxx" \
-F "image=@nhan-vat.png"
# → { "ok": true, "image_url": "https://..." }
# 2) Tạo video từ ảnh đó
curl -X POST http://localhost:3000/api/v1/videos \
-H "X-API-Key: vk_xxxxx" \
-H "Content-Type: application/json" \
-d '{"prompt":"Nhân vật vẫy tay chào, camera zoom nhẹ","image_url":"https://..."}'POST/api/v1/chat/completions
Đúng chuẩn OpenAI — tool nào nói được với OpenAI thì chỉ cần đổi Base URL sang địa chỉ này, không phải sửa gì thêm.
curl -X POST http://localhost:3000/api/v1/chat/completions -H "X-API-Key: vk_xxxxx" -H "Content-Type: application/json" -d '{
"model": "gpt-5.5",
"messages": [
{"role": "user", "content": "Viết kịch bản video 15 giây quảng cáo quán tạp hoá"}
],
"max_tokens": 1000
}'Model dùng được: gpt-5.5 và claude-opus-4-8. Trả về đúng hình dạng choices[0].message.content và usage như OpenAI, kèm hai trường thêm credit_cost và balance để bạn biết vừa tiêu bao nhiêu mà khỏi gọi thêm request.
max_tokens, gọi xong biết số token thật thì trả lại phần thừa ngay. Nên đặt max_tokens sát nhu cầu để không bị giữ tạm quá nhiều — tiền vẫn về đủ, nhưng trong lúc chờ thì số dư khả dụng thấp hơn.POST/api/v1/audio/transcriptions
Gửi multipart/form-data. Cũng theo chuẩn OpenAI.
# Cach 1 — gui thang file (chi hop voi file nho)
curl -X POST http://localhost:3000/api/v1/audio/transcriptions -H "X-API-Key: vk_xxxxx" -F "file=@ghi-am.mp3"
# Cach 2 — dua dia chi, he thong tu tai ve
curl -X POST http://localhost:3000/api/v1/audio/transcriptions -H "X-API-Key: vk_xxxxx" -F "file_url=https://server-cua-ban.com/ghi-am.mp3"file_url| Trường | Mô tả |
|---|---|
file | File âm thanh gửi kèm. mp3, m4a, wav, webm… |
file_url | Địa chỉ file, dùng thay cho file |
model | Bỏ trống là dùng loại rẻ nhất. Xem GET /api/v1/models. |
Trả về text (nội dung), duration (số giây), credit_cost và balance.
POST/api/v1/estimate
Trả về số credit sẽ bị trừ mà không trừ đồng nào. Gọi cái này trước khi tạo job thì tool của bạn biết trước chi phí, và biết cả lựa chọn rẻ hơn.
curl -X POST http://localhost:3000/api/v1/estimate -H "X-API-Key: vk_xxxxx" -H "Content-Type: application/json" -d '{"kind":"image","model":"google_image_gen_banana_pro"}'{
"ok": true,
"credit_cost": 7000,
"vnd": 7000,
"balance": 124374,
"du_credit": true,
"re_hon": [
{ "model": "gemini-3.0-pro-image-portrait", "name": "Gemini 3.0 Pro — Ảnh dọc", "tu_khoang": "28 credit" },
{ "model": "gpt-image-2", "name": "GPT Image 2", "tu_khoang": "500 credit" }
]
}| Trường | Mô tả | |
|---|---|---|
kind * | string | video, image, text hoặc transcribe. |
model | string | Bỏ trống thì báo giá cho lựa chọn rẻ nhất của loại đó. |
duration | int | Số giây, cho video. |
resolution | string | Cho video và ảnh có nhiều mức. |
mode | string | Chế độ render — giá đổi theo nó. |
max_tokens | int | Cho kind: text. Giá cuối vẫn tính theo token thật. |
duration_seconds | int | Cho kind: transcribe. Không gửi thì báo giá cho 1 phút. |
re_honPOST/api/v1/images/edits
Gửi multipart/form-data với file ảnh đính kèm, đúng chuẩn OpenAI. Khác với /api/v1/images ở chỗ nhận thẳng file thay vì bắt bạn tự đưa ảnh lên đâu đó lấy địa chỉ.
# Tach nen, giu nguyen chu tren bao bi
curl -X POST http://localhost:3000/api/v1/images/edits -H "X-API-Key: vk_xxxxx" -F "image=@san-pham.png" -F "prompt=Tach nen, giu nguyen chu the va chu tren bao bi" -F "background=transparent"
# Ghep hai anh — dua ca hai vao cung luc
curl -X POST http://localhost:3000/api/v1/images/edits -H "X-API-Key: vk_xxxxx" -F "image[]=@san-pham.png" -F "image[]=@nhan-vat.png" -F "prompt=Nhan vat cam san pham tren tay"| Trường | Mô tả | |
|---|---|---|
image * | file | Ảnh gốc. Dùng image[] để gửi nhiều ảnh — tối đa 5, mỗi ảnh tối đa 4MB. |
prompt * | string | Mô tả việc cần làm với ảnh. |
model | string | Bỏ trống là dùng model rẻ nhất. Xem GET /api/v1/models. |
background | string | Đặt transparent để ra nền trong suốt — dùng cho tách nền. |
input_fidelity | string | Mức giữ chi tiết ảnh gốc. Mặc định đã là high, chỉ gửi khi muốn hạ xuống. |
quality | string | low, medium, high. |
size | string | Tỉ lệ khung ảnh, ví dụ 1:1. |
input_fidelity quan trọngPhản hồi trả về job giống /api/v1/images, kèm input_urls — địa chỉ ảnh bạn vừa gửi, dùng lại được cho lần sau mà không phải tải lên nữa.
| Method | Đường dẫn | Trả về |
|---|---|---|
| POST | /api/v1/images | Tạo ảnh AI. Tham số như tạo video nhưng không có duration. |
| GET | /api/v1/images/{id} | Trạng thái ảnh, có image_url khi xong. |
| GET | /api/v1/videos | Danh sách video. Phân trang bằng page và per_page (tối đa 50). |
| GET | /api/v1/images | Danh sách ảnh. |
| GET | /api/v1/balance | Số dư credit và quy đổi ra VNĐ. |
| GET | /api/v1/pricing | Bảng giá hiện hành. |
| POST | /api/v1/estimate | Hỏi giá trước, không trừ credit — xem mục Hỏi giá trước khi làm. |
| POST | /api/v1/images/edits | Sửa ảnh, tách nền, ghép ảnh — xem mục Sửa ảnh ở trên. |
| POST | /api/v1/chat/completions | Viết kịch bản, tóm tắt, dịch — xem mục Viết kịch bản ở trên. |
| POST | /api/v1/audio/transcriptions | Bóc lời từ audio — xem mục Bóc lời từ audio ở trên. |
| GET | /api/v1/models | Danh sách model kèm giá từng tổ hợp — xem mục Chọn model ở trên. |
Nếu tool của bạn không cho điền API tuỳ ý mà chỉ hỗ trợ một số nhà cung cấp, hãy chọn nhà tương ứng bên dưới rồi đổi Base URL sang địa chỉ ở cột giữa. Key vẫn là key của bạn, credit vẫn trừ trong cùng một ví.
| Chọn trong tool | Base URL điền vào | Ô API key |
|---|---|---|
| fal.ai | http://localhost:3000/compat/fal | dán key như bình thường |
| PiAPI | http://localhost:3000/compat/piapi | dán key như bình thường |
| kie.ai | http://localhost:3000/compat/kie | dán key như bình thường |
kling-2.6 sẽ ra model Kling tương ứng. Khớp không nổi thì dùng cấu hình mặc định (5.000 credit cho 5 giây, 10.000 credit cho 10 giây).Lớp tương thích chỉ đổi hình dạng request. Giá, hạn mức và cách trừ credit hoàn toàn giống khi gọi /api/v1 trực tiếp.
| HTTP | Ý nghĩa | Nên làm gì |
|---|---|---|
400 | Dữ liệu sai, hoặc model đòi ảnh/video mà không gửi kèm | Sửa request. Thử lại y hệt cũng sẽ lỗi. |
401 | Thiếu, sai, hoặc key đã bị thu hồi | Kiểm tra header X-API-Key. |
402 | Không đủ credit | Nạp thêm ở trang chính. |
403 | Tài khoản bị khoá | Liên hệ hỗ trợ. |
404 | Không tìm thấy job | Kiểm tra lại id. |
429 | Gọi quá nhanh hoặc quá nhiều job cùng lúc | Chờ theo header Retry-After rồi thử lại. |
503 | Hệ thống quá tải hoặc đang bảo trì | Thử lại sau vài phút. Credit chưa bị trừ. |