Đăng bài
Đăng bài
Đăng video, ảnh hoặc chỉ chữ lên một hay nhiều nền tảng, ngay hoặc theo giờ hẹn.
https://api.sangtao.ai/v2/publishing/postsXác thực
X-Api-Keystring · headerbắt buộcAPI key của bạn, tạo ở trang API key trong tài khoản.
Body
teamIdstring (guid)bắt buộcNhóm dùng để đăng — bài đi qua các tài khoản đã kết nối của nhóm
platformsobject[]bắt buộcMỗi nền tảng cần đăng một phần tử, ít nhất một
Hiện thuộc tính conẨn thuộc tính con
platformstringbắt buộcNền tảng, không phân biệt hoa thường. Nhận X thay cho Twitter. Phải đã kết nối trong nhóm
Giá trị có thể:
TikTokYouTubeInstagramFacebookThreadsTwittercaptionstringNội dung bài — TikTok, Facebook, Instagram, Threads, X. Bắt buộc cho mọi nền tảng của bài chỉ có chữ
titlestringTiêu đề video — YouTube
descriptionstringMô tả video — YouTube
typestringLoại bài, để thay loại mặc định (bảng Loại bài mặc định bên dưới)
Giá trị có thể:
POSTREELSTORYSHORTVIDEOIMAGEprivacystringTikTok: PUBLIC_TO_EVERYONE, SELF_ONLY, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR. YouTube: PUBLIC, PRIVATE, UNLISTED. Bỏ trống: công khai
Giá trị có thể:
PUBLIC_TO_EVERYONESELF_ONLYMUTUAL_FOLLOW_FRIENDSFOLLOWER_OF_CREATORPUBLICPRIVATEUNLISTEDtextFormatPresetIdstringBài chỉ có chữ trên Facebook (không có jobId, videoUrl, imageUrls): nền màu phía sau phần chữ. Bỏ trống: bài chữ thường. Có ảnh hoặc video thì Facebook bỏ nền; nền tảng khác bỏ qua. Lấy ID từ GET /publishing/facebook/text-presets (trang Nền chữ Facebook). ID không có thật vẫn được nhận và hỏng lúc đăng
musicSoundIdstringBài ảnh TikTok: songClipId của một bản nhạc lấy từ GET /publishing/tiktok/music (trang Nhạc TikTok). Bỏ trống: TikTok tự chọn. Bài video và nền tảng khác bỏ qua
jobIdstringMột job video đã xong của bạn trên sangtao.ai: đăng video của job (và ảnh bìa, nếu bỏ trống thumbnailUrl). Được ưu tiên hơn videoUrl
videoUrlstringURL công khai của video — tải được không cần đăng nhập và còn hạn tới lúc đăng
imageUrlsstring[]URL ảnh công khai, tối đa 35; mỗi nền tảng chỉ lấy đến mức nó cho phép (TikTok 35, Instagram 20, Threads 20, Facebook 10, X 4)
thumbnailUrlstringẢnh bìa cho YouTube, Facebook, Instagram. TikTok lấy một khung hình trong video — xem coverTimeMs
coverTimeMsnumberVideo TikTok: thời điểm trong video làm ảnh bìa, tính bằng mili-giây, 0–600000. Bỏ trống: đầu video
scheduleAtstringThời điểm đăng (ISO 8601, UTC). Bỏ trống: đăng ngay
firstCommentstringBình luận tự động sau khi bài lên. Hiện chỉ áp dụng cho Facebook
idempotencyKeystringGửi lại cùng khoá, cùng nội dung trong 24 giờ: nhận lại đúng bài cũ (idempotentReplay: true), không đăng và không trừ tiền lần hai. Cùng khoá mà nội dung khác: 422 IDEMPOTENCY_KEY_REUSED. Gửi qua header Idempotency-Key cũng được
webhookUrlstringURL https công khai (cổng 443) để nhận kết quả của bài này khi xong — xem Webhook. URL sai trả 422 INVALID_WEBHOOK_URL, trước khi tạo bài hay trừ tiền
webhookSecretstringDùng để ký các lần giao đó (X-Sangtao-Signature). Tối đa 200 ký tự. Không gửi thì không có chữ ký
Gửi một trong jobId, videoUrl hoặc imageUrls — hoặc không gửi cái nào để đăng bài chỉ có chữ (chỉ Facebook, X, Threads, xem bên dưới).
ID cho textFormatPresetId: Nền chữ Facebook. Bản nhạc cho musicSoundId: Nhạc TikTok.
Bài chỉ có chữ
Bỏ jobId, videoUrl và imageUrls để đăng chỉ có chữ. Khi đó mọi nền tảng phải là Facebook, X (Twitter) hoặc Threads — TikTok, YouTube, Instagram cần video hoặc ảnh (400 VALIDATION_ERROR nêu tên các nền tảng đó). Mỗi nền tảng cần caption; type là POST hoặc bỏ trống. Với Facebook, textFormatPresetId thêm nền màu; không có thì là bài chữ thường. Giá như một lượt đăng bình thường.
{
"teamId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"platforms": [
{ "platform": "Facebook", "type": "POST", "caption": "Nội dung bài", "textFormatPresetId": "249307305544279" },
{ "platform": "X", "caption": "Nội dung bài" }
]
}Loại bài mặc định
| Nền tảng | Video | Chỉ có ảnh | Chỉ có chữ |
|---|---|---|---|
| TikTok | VIDEO | IMAGE | — |
| YouTube | VIDEO | — | — |
| REEL | POST | — | |
| REEL | POST | POST | |
| Threads | POST | POST | POST |
| Twitter (X) | POST | POST | POST |
Mỗi nền tảng tự đặt giới hạn — độ dài video, tỉ lệ khung, độ dài caption. Không được kiểm trước khi đăng; bài vi phạm sẽ thất bại trên nền tảng đó, lý do ở platforms[].error.
Response
postIdstring (guid)bắt buộcID bài đăng — theo dõi bằng Lấy một bài đăng
statusstringbắt buộcPending: đã nhận, đang chờ xử lý
statusMessagestring | nullGhi chú ngắn về trạng thái
idempotentReplaybooleanChỉ có (true) khi đây là lần gọi lại cùng idempotencyKey: bài đã tạo từ trước
Chi phí một lượt đăng
Mỗi lần gọi endpoint này là một lượt đăng, dù đăng lên bao nhiêu nền tảng. Bài hẹn giờ được tính ngay lúc gọi.
| Tính bằng | Cách tính |
|---|---|
| Credits | Một số credit cố định cho mỗi lượt được khoá khi lệnh gọi được nhận (thiếu thì 402 INSUFFICIENT_CREDITS). Credit bị trừ khi bài đã được gửi đi đăng — kể cả khi về sau một nền tảng từ chối — và được hoàn nếu hỏng trước bước đó, hoặc nếu bạn xoá bài khi còn Pending. |
| Gói tháng | Mỗi lượt dùng một lượt trong hạn mức tháng của gói (cộng lượt mua thêm). Bài Failed và Cancelled không tính. Hết lượt: 400 QUOTA_EXCEEDED. |
Mã lỗi
| Mã | errorCode | Khi nào |
|---|---|---|
| 400 | VALIDATION_ERROR | Body rỗng, thiếu platforms / platforms rỗng, tên nền tảng không hợp lệ, coverTimeMs ngoài khoảng cho phép — hoặc khi không có jobId / videoUrl / imageUrls: platforms có TikTok, YouTube hoặc Instagram (cần video hoặc ảnh; error nêu tên), một nền tảng thiếu caption, hoặc type khác POST |
| 400 | JOB_NOT_READY | Video của job chưa render xong |
| 400 | NO_CONNECTED_ACCOUNT | Một nền tảng trong platforms chưa kết nối trong nhóm — kết nối trên sangtao.ai trước |
| 400 | QUOTA_EXCEEDED | Gói đăng bài theo tháng: đã hết lượt trong kỳ |
| 402 | INSUFFICIENT_CREDITS | Không đủ credit cho lượt đăng |
| 403 | NO_API_ACCESS | Gói đăng bài theo tháng không có quyền dùng API |
| 404 | TEAM_NOT_FOUND | Không có nhóm nào của bạn với teamId này |
| 404 | JOB_NOT_FOUND | Không có job nào của bạn với jobId này |
| 409 | ACCOUNT_NEEDS_ATTENTION | Trang đăng bài của một nền tảng bị đổi hoặc mất quyền — chọn lại trang trên sangtao.ai; chưa đăng, chưa trừ tiền. details[0].params: platform, reason |
| 422 | INVALID_WEBHOOK_URL | webhookUrl không phải URL https công khai cổng 443 — chưa đăng, chưa trừ tiền |
| 422 | IDEMPOTENCY_KEY_REUSED | idempotencyKey này đã dùng cho nội dung khác — dùng khoá mới |
| 500 | NO_SUBSCRIPTION | Lỗi cấu hình phía sangtao.ai, không phải lỗi của bạn — liên hệ hỗ trợ |
| 502 | PUBLISH_FAILED | Gửi bài lên các nền tảng không được — thử lại |
/publishing/postscurl -X POST "https://api.sangtao.ai/v2/publishing/posts" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"teamId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"videoUrl": "https://cdn.example.com/video.mp4",
"thumbnailUrl": "https://cdn.example.com/cover.jpg",
"platforms": [
{
"platform": "TikTok",
"caption": "Iced coffee in 3 steps #coffee",
"privacy": "PUBLIC_TO_EVERYONE"
},
{
"platform": "YouTube",
"title": "How to make iced coffee at home",
"description": "A three-step recipe.",
"type": "SHORT"
}
],
"scheduleAt": "2026-11-09T02:00:00Z",
"idempotencyKey": "550e8400-e29b-41d4-a716-446655440000"
}'{
"success": true,
"data": {
"postId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "Pending",
"statusMessage": "Đang chờ xử lý..."
}
}/publishing/postscurl -X POST "https://api.sangtao.ai/v2/publishing/posts" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"teamId": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"videoUrl": "https://cdn.example.com/video.mp4",
"thumbnailUrl": "https://cdn.example.com/cover.jpg",
"platforms": [
{
"platform": "TikTok",
"caption": "Iced coffee in 3 steps #coffee",
"privacy": "PUBLIC_TO_EVERYONE"
},
{
"platform": "YouTube",
"title": "How to make iced coffee at home",
"description": "A three-step recipe.",
"type": "SHORT"
}
],
"scheduleAt": "2026-11-09T02:00:00Z",
"idempotencyKey": "550e8400-e29b-41d4-a716-446655440000"
}'{
"success": true,
"data": {
"postId": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "Pending",
"statusMessage": "Đang chờ xử lý..."
}
}