Why Your TikTok API Posts Stay Private (SELF_ONLY)
You wired up a script, an AI agent or an n8n flow to automate TikTok posting for your app. The API call returns success, and the post shows up visible only to you, or it sits in your inbox waiting for you to finish it by hand. Nothing is broken. This is what TikTok's Content Posting API does for every client that has not passed its audit.
Here is what the docs say, what the audit asks for, and how to decide whether building your own poster is worth it.
What an unaudited client is allowed to do
TikTok's Content Sharing Guidelines spell out three limits for an unaudited API client:
- SELF_ONLY visibility. "Unaudited API Clients can only post contents in
SELF_ONLYviewership." - Private accounts only. "All user accounts using the API client to post must be set to private at the time of posting."
- A small user cap. Up to 5 users can post in a 24 hour window.
So the TikTok API posts private only, and the account itself has to be private while you post. If you try a public account, the Direct Post reference lists the 403 error you will get: unaudited_client_can_only_post_to_private_accounts.
You can flip things by hand afterwards. The guidelines say the owner must first change the account to public, then change each post's privacy to "Everyone". That is two manual steps per post, on an account that has to go private again before the next API call. As a marketing channel for an app, it does not work.
Why some posts land in the inbox instead
There are two scopes, and they behave differently:
video.publishis Direct Post. The post goes to the profile (privately, until you are audited).video.uploadsends the file to the user's TikTok inbox. TikTok's upload guide says users "must click on inbox notifications to continue the editing flow in TikTok and complete the post."
Many Zapier and n8n style connectors use the upload scope, which is why your "automated" post ends as a notification on your phone.
What the call looks like
A correct Direct Post flow has two requests. First ask TikTok which privacy options this creator has, then start the post with one of them.
# 1. Ask what this account is allowed to post
curl -X POST 'https://open.tiktokapis.com/v2/post/publish/creator_info/query/' \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Content-Type: application/json; charset=UTF-8'
# 2. Start the post (an unaudited client must use SELF_ONLY)
curl -X POST 'https://open.tiktokapis.com/v2/post/publish/video/init/' \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H 'Content-Type: application/json; charset=UTF-8' \
-d '{
"post_info": {
"title": "Scan your fridge, get a recipe #cooking",
"privacy_level": "SELF_ONLY",
"disable_comment": false,
"disable_duet": false,
"disable_stitch": false,
"is_aigc": true
},
"source_info": {
"source": "PULL_FROM_URL",
"video_url": "https://cdn.example.com/post-042.mp4"
}
}'
The privacy_level you send must be one of the privacy_level_options returned by the first call. PULL_FROM_URL needs a URL TikTok's servers can reach, and each user token is limited to 6 requests per minute. Set is_aigc to true when the video is AI generated, so TikTok adds its AI-generated label.
What the TikTok Content Posting API audit asks for
The audit checks your client against the Content Sharing Guidelines. Read them as a founder with a cron job and two lines stand out.
First, the kind of app. The guidelines list this as not acceptable: "A utility tool to help upload contents to the account(s) you or your team manages." They add that clients "should be intended for a wide audience, not limited to internal groups/private use." A personal auto-poster for your own app's account is the example TikTok gives of what it will not approve.
Second, the screen. An audited client needs a real posting UI in front of a real person:
- It shows the creator's nickname, so the user knows which account receives the post.
- It shows a preview of the content, and the caption and hashtags stay editable.
- The privacy level is picked by hand from a dropdown with "no default value".
- Comment, duet and stitch are off until the user turns them on.
- A consent line sits before the publish button: "By posting, you agree to TikTok's Music Usage Confirmation".
- Nothing is sent to TikTok until "the user has expressly consent to the upload".
Put together, a pipeline where an agent renders a video and publishes it with no human in between is exactly the design that fails. TikTok wants a person to look at each post and press the button.
How long it takes
TikTok does not publish a timeline for the audit. Third-party guides quote anything from a few business days to two to six weeks, and one of them points out that the only official figure is for app review, which "may take several days to two weeks after submission" and is a separate step. Plan for weeks, plus rework if your UI is sent back, and that assumes you are building a product for other people in the first place.
Why unofficial web uploaders are a bad trade
The usual next idea is a headless browser that logs in with your session cookies and drives TikTok's web upload page. It posts publicly today, and it puts the account you are trying to grow at risk. TikTok's Terms of Service restrict using automated scripts to interact with the service, and TikTok can suspend or terminate accounts that break them. These tools also break whenever the upload page changes, and they need your login session stored on a server.
For an app maker, the TikTok account is an asset that compounds. A new account already starts slow. Losing it after three months of posts costs far more than the hours the script saved.
The build-versus-use test
Ask one question: is the thing you want to ship a posting product, or posts for your app?
Build and go through the audit if you are making a tool other people will connect their TikTok accounts to. The audit is designed for that, and the consent screen is part of your product anyway.
Use an approved tool if the goal is TikTok automation for your app. You need a client whose direct public posting is already approved, and you keep the approval tap, because TikTok requires that step from everyone.
When you compare tools, check these four things:
- It posts through the official Content Posting API after you connect your account with TikTok login. No password or cookie sharing.
- Direct public posting is approved, so posts go to your profile and not to SELF_ONLY or the inbox.
- Every post has a review screen with caption, privacy, comments, duet and stitch.
- AI-made content is disclosed on each post.
Social Studio is built this way. You give it your app's link, product photos and logo. It plans a calendar of ideas, makes each post (photo videos with on-screen text, music and a voiceover, plus carousels and single images) and publishes through TikTok's official Content Posting API to the account you connected. Direct public posting is approved. Nothing goes out until you press Post on the review screen, where caption, privacy, comments, duet and stitch are set, and an AI-generated-content disclosure ships with every post. You can see real output on the samples page, and there is more on how it fits app makers at TikTok marketing for apps.
What to do today
- If your posts land private, check your app's status in the TikTok developer portal. An unaudited client explains it.
- If they land in the inbox, check the scope.
video.uploadalways ends with a manual step in the TikTok app. - If you were about to ship a cookie-based uploader, stop and weigh the account against the hours saved.
- If you only need posts for your own app, skip the audit queue and pick a tool that already has direct posting approved. Spend the saved weeks on hooks and formats, which is where views come from.