Post to TikTok with 0bull
0bull rents real iPhones by the month. A post is published by driving the TikTok app on one of those phones, so publishing is asynchronous: you queue a submission and poll it until it reaches a final status.
Before you start
The 0bull MCP server must be connected:
openclaw mcp add 0bull --url https://0bull.net/mcp --transport streamable-http
openclaw mcp login 0bull
If list-accounts-tool is missing, stop and tell the user to run those two commands. You
are authorized as that user, so you only ever see their accounts and phones.
Publish a video
Pick the account. Call
list-accounts-toolwithplatform: "tiktok"and use the account'sidasaccount_id. If several accounts match what the user described, ask which one rather than guessing. A TikTok account is bound to a phone slot, and one slot holds up to four TikTok accounts.Provide the video through exactly one of:
video_url: a public https URL the server downloads.upload_id: callcreate-upload-url-tool(no parameters), then POST or PUT the raw video to the returnedupload_urlwithin 15 minutes, then pass theupload_id.
Supplying both, or neither, is rejected.
Write the caption with the user, never invented on their behalf. It is optional and holds up to 2200 characters.
Queue it. Call
create-submission-toolwithplatform: "tiktok",account_id, the video and thecaption. Adddraft: trueto save it in the TikTok app instead of posting. The call returns the submission immediately inpending; nothing is live yet.Poll
get-submission-toolwith the returnedsubmission_id. Publishing a real video takes minutes, so leave a second or two between calls.
Statuses
| Status | Meaning |
|---|---|
scheduled |
Queued for a future run. |
pending |
Queued, not picked up yet. |
ingesting |
The video is being fetched or prepared. |
driving |
The phone is being driven through the TikTok app. |
published |
Posted. Final. |
drafted |
Saved as a draft on the phone. Final. |
failed |
The run failed. Final. |
cancelled |
Cancelled before finishing. Final. |
Report the final status plainly. Never say a video is live before the status says
published.
When something goes wrong
- It stays in one status. Look at the phone:
phone-snapshot-toolfor the account's slot shows what the screen is doing. A login wall or a stuck dialog is obvious in the picture. - Stop it early.
cancel-submission-toolworks while it ispending,ingestingordriving. Once a status is final, usedelete-submission-toolinstead. - "Account not found". The id belongs to another platform or another user. Check that you passed a TikTok account id.
- The account has no phone assigned. The call is refused until one is.
- Calls start failing in bursts. The limit is 250 requests a minute.
Do not
- Do not call
start-rental-toolorrequest-phones-tool. Those spend the user's money. If more phones are needed, say so and let the user go to https://0bull.net. - Do not retry a failed submission automatically. A failure usually means the phone needs attention, and a retry posts twice.
For YouTube Shorts, use the 0bull-youtube-post skill: the title rules are different.