Nguồn tin và chiến dịch

Hai cách để hệ thống tự dựng video theo thời gian: quét feed khi có bài mới, hoặc rải lịch theo chủ đề.

Chọn cái nào

Nguồn tinChiến dịch
Kích hoạt bởiCó bài mới trên feedTới giờ trong lịch đã rải
Nội dung lấy từChính bài báo được quétDanh sách chủ đề bạn khai
Chạy tới khi nàoCho tới khi bạn tắtHết số ngày đã đặt, trừ khi bật tự gia hạn

Nguồn tin

GET    /sources
GET    /sources/{id}
POST   /sources
PATCH  /sources/{id}
DELETE /sources/{id}

POST /sources cần header Idempotency-Key. Bản vá PATCH chỉ đổi những trường có mặt trong thân — trường không gửi thì giữ nguyên.

TrườngÝ nghĩa
feedUrlĐịa chỉ RSS hoặc trang danh sách bài
enabledTắt tạm mà không xoá cấu hình
autoConnectionIdsKênh nhận video dựng từ nguồn này. Trong phản hồi trường này tên là channelIds.
maxItemsPerPollTrần SỐ VIDEO mỗi lượt quét — không phải số bài được thử
maxItemsPerDayTrần số video mỗi ngày
scanMode, scanTimes, scanDays, scanTimezoneLịch quét: quét đều theo chu kỳ, hay chỉ vào các mốc giờ đã đặt
includeKeywords, excludeKeywordsLọc bài theo từ khoá trước khi dựng
maxAgeHoursBỏ qua bài cũ hơn mốc này
stopWhenCreditBelowTự dừng quét khi số dư tụt dưới mức này — chốt an toàn nên đặt
scheduleMode, scheduleDelayMinutes, immediateSpacingMinutesĐăng ngay hay hẹn giờ, và giãn cách giữa các bài
commentBình luận tự đăng kèm. Gửi null để tắt; không gửi thì giữ nguyên cấu hình cũ.

Phản hồi có nextScanAt, lastPolledAt và lastSuccessAt để biết nguồn còn sống hay đã im.

lastSuccessAt không nói gì về việc có ra video hay không

Một lượt quét thành công vẫn có thể ra 0 video: feed không có bài mới, bài bị lọc bởi từ khoá, hoặc trang nguồn đổi cấu trúc nên không bóc được ảnh. Muốn biết thật sự có gì thì đọc GET /sources/{id}/items.

Bài đã quét

GET /sources/{id}/items?page=1&pageSize=25

Mỗi phần tử là một bài đã phát hiện, kèm status, attempts và videoId — id của video đã dựng từ bài đó, khớp với GET /videos/{id}. Bài chưa dựng thì videoId là null.

Chiến dịch

GET  /campaigns?page=1&pageSize=25&status=ACTIVE
GET  /campaigns/{id}
POST /campaigns

status nhận DRAFT, ACTIVE, PAUSED, COMPLETED hoặc CANCELLED.

POST /campaigns tạo chiến dịch ở dạng nháp: chưa rải lịch và chưa trừ tiền. Cần header chống trùng.

{
  "name": "Kiến thức tài chính tháng 10",
  "kind": "video-talk",
  "connectionIds": ["4e1c…"],
  "durationDays": 30,
  "startAt": "2026-10-01T00:00:00.000Z",
  "videosPerDay": 2,
  "timezone": "Asia/Ho_Chi_Minh",
  "timeWindows": ["08:00", "20:00"],
  "topics": ["Lãi kép", "Quỹ dự phòng"],
  "autoRenew": false
}
  • timeWindows là các mốc giờ trong ngày, tính theo timezone chứ không theo giờ máy chủ. Số mốc nên khớp videosPerDay.
  • topics được quay vòng để sinh nội dung. Hết danh sách thì quay lại từ đầu.
  • autoRenew bật thì hết chu kỳ chiến dịch tự chạy tiếp và tiếp tục tiêu credit.

Vòng đời chiến dịch

POST /campaigns/{id}/launch   → 202
POST /campaigns/{id}/pause    → 200
POST /campaigns/{id}/resume   → 200
POST /campaigns/{id}/cancel   → 200
LệnhLàm gìLùi lại được?
launchRải lịch cho toàn bộ thời gian chạy. Từ đây mỗi ô tới giờ sẽ tiêu credit.Không — nhưng tạm dừng được ngay sau đó
pauseNgừng dựng và đăng cho tới khi chạy tiếpCó
resumeChạy tiếp, và tiêu credit trở lạiCó
cancelDừng hẳn. Những ô chưa tới giờ sẽ không còn được chạy.KHÔNG — không mở lại được

Cả bốn lệnh đều đọc lại chiến dịch sau khi đổi trạng thái rồi mới trả về, nên bạn nhận được trạng thái mới chứ không phải trạng thái cũ. Không lệnh nào đòi header chống trùng: gọi hai lần cho kết quả giống gọi một lần.

Tạm dừng, đừng huỷ, nếu chỉ muốn ngưng một lúc

cancel không mở lại được. Muốn ngưng tạm thì dùng pause.

Ô lịch

GET /campaigns/{id}/slots?page=1&pageSize=25

Mỗi ô là một lượt dựng-và-đăng đã hẹn: scheduledAt, topic, status, attempts, và videoId khi video đã dựng. Ô hỏng có errorCode và errorDetail.

Ô lỡ giờ không đăng bù. Hệ thống chỉ dời sang mốc kế tiếp, vì đăng dồn mấy bài cùng lúc vào kênh thật là cách nhanh nhất để bị nền tảng hạn chế.

Muốn xem chi phí, đọc creditSpent (tổng đã trừ tích luỹ) và unitCost (đơn giá một video) ở chi tiết chiến dịch. Xem thêm Chiến dịch trên giao diện web.

Số liệu nhanh

renderedVideoCount và failedSlotCount ở chi tiết cho biết chiến dịch đang chạy trơn hay đang hỏng đều — theo dõi hai số này thay vì đếm tay qua danh sách ô.