TikTok post status: PUBLISH_COMPLETE vs a public post ID
TikTok's Get Post Status returns five statuses. PUBLISH_COMPLETE is not proof the video is public; the post ID appears only after moderation approves it.

TikTok's Get Post Status call reports one of five states: PROCESSING_UPLOAD, PROCESSING_DOWNLOAD, SEND_TO_USER_INBOX, PUBLISH_COMPLETE or FAILED. PUBLISH_COMPLETE means the content was posted, but the publicaly_available_post_id (spelled that way in TikTok's docs) is returned only after the post is public and has passed TikTok's moderation, so do not treat a complete status as a live public URL.
What does each status mean?
The table lists each value as described on TikTok's Get Post Status page. The status check allows 30 requests per minute per access token, which is higher than the 6 per minute that applies to starting a post.
| Status | Meaning | Applies to |
|---|---|---|
| PROCESSING_UPLOAD | Upload in progress | FILE_UPLOAD only |
| PROCESSING_DOWNLOAD | TikTok is downloading from your URL | PULL_FROM_URL only |
| SEND_TO_USER_INBOX | A notification was sent to the creator to finish the draft | Inbox flow |
| PUBLISH_COMPLETE | Content was posted | Both flows |
| FAILED | Processing hit an error | Both flows |
Why can a clip fail after you thought it was fine?
The same page groups failure reasons: file format, duration, frame rate and picture size; download failures from a URL, which time out after one hour; account issues such as spam detection, too many posts within 24 hours, or a banned account; and policy hits on risky description text. Most of the technical ones you can check before you post.
If the clip came from Sume, run the cheap checks first. Video inspect probes a hosted clip without cost for the probe, and Video trim can cut it to a duration and conform its frame rate.
How do you wait for the public ID?
Poll status at a calm pace, or use TikTok's webhooks, which per the same page cover failed publishes, completed posts, inbox delivery, public availability and removal from public view. Store the publish ID you got at init and only write the public ID into your database when publicaly_available_post_id appears.
The loop below shows the decision, not a live call, because the exact status URL is not in the pages read for this post.
def ready_to_link(status: dict) -> bool:
if status.get("status") != "PUBLISH_COMPLETE":
return False
ids = status.get("publicaly_available_post_id") or []
return len(ids) > 0
print(ready_to_link({"status": "PUBLISH_COMPLETE"}))
print(ready_to_link({"status": "PUBLISH_COMPLETE", "publicaly_available_post_id": ["123"]}))What does Sume do and not do?
Sume makes and prepares the media. It does not post to TikTok and does not see these statuses. Keep Sume's receipt and TikTok's status as two separate records in your system, joined by the file URL.
Sources
Related posts
More in Developers
- TikTok upload URL 403 expired and 416 Content-Range mismatch
A chunked TikTok upload returns 206 per chunk and 201 at the end. 403 means the upload_url expired after one hour; 416 means Content-Range does not match.
- Timeline 1.0 warnings after stitching shots: which need a fix
Timeline 1.0 returns soft warnings, not failures. A list of the codes you will see on a stitched AI film, what each means, and which ones are worth acting on.
- TTS boundary_lead_ms: why sentence slices end 70 ms after a word
Sume TTS sentence segments cut boundary_lead_ms after a sentence's last word: 70 ms by default, 0 to 500. The next segment absorbs the pause, and no gap opens.
- tts_duration_exceeded: split long scripts for Sume TTS
Sume TTS fails with tts_duration_exceeded when audio would pass 1,200 seconds, and takes at most 20,000 characters. Split rules and how to join the parts.
Written by Sume