TikTok
Publish and schedule TikTok videos with the privacy, interaction and disclosure settings TikTok requires.
Beta. Until TikTok has approved FeedHorizon for public posting, videos can only be posted with privacy SELF_ONLY (visible to the account owner).
Connecting an account
TikTok connects with TikTok sign-in (Login Kit). Open Connections in the dashboard, or send a connect link (POST /api/v1/platform-invites with "platform": "tiktok", see Connect links).
FeedHorizon asks TikTok for user.info.basic, video.upload and video.publish.
TikTok access tokens last 24 hours. FeedHorizon renews them with the refresh token whenever a post needs one, so the connection keeps working for a year of use. When the user removes FeedHorizon in their TikTok settings, the account turns needs_reauth and the account.needs_reauth webhook is sent.
The platform id in the API is tiktok.
What you can post
| Limit | |
|---|---|
| Text | 2,200 characters |
| Files per post | 1 file, a video is required |
| Images | not supported |
| Videos | MP4, MOV or WebM |
| File size | Up to 100 MB by URL import or 5 GB by upload. The platform may refuse large files when publishing |
The post text is the caption. A video can be as long as the account allows, see What the account allows.
Required settings
TikTok asks the poster to decide these for every video, so there are no defaults. Pass them as options.tiktok on the target:
| Field | Type | |
|---|---|---|
privacyLevel | PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY | required |
allowComment | boolean | default false |
allowDuet | boolean | default false |
allowStitch | boolean | default false |
brandOrganic | boolean | promotes your own business, labeled "Promotional content" |
brandedContent | boolean | paid partnership with another brand, labeled "Paid partnership". Cannot be SELF_ONLY |
aiGenerated | boolean | marks the video as AI-generated |
By posting with brandedContent the user agrees to TikTok's Branded Content Policy; every post falls under the Music Usage Confirmation. Show this to your users before they post.
What the account allows
The creator's TikTok settings decide which privacy levels can be used, whether comments, duets and stitches can be switched on, and how long a video may be. Read them before you offer the choices:
curl https://feedhorizon.com/api/v1/accounts/acc_…/tiktok-creator \
-H "Authorization: Bearer fh_YOUR_API_KEY"{
"data": {
"creatorNickname": "Soup Club",
"creatorUsername": "soupclub",
"privacyLevelOptions": ["PUBLIC_TO_EVERYONE", "FOLLOWER_OF_CREATOR", "SELF_ONLY"],
"commentDisabled": false,
"duetDisabled": true,
"stitchDisabled": true,
"maxVideoPostDurationSec": 600
}
}Show the creator's name next to the post. FeedHorizon checks these settings again when the video is published; a setting the creator has since turned off is left off. In the MCP server the same data comes from get_tiktok_creator.
Example
curl -X POST https://feedhorizon.com/api/v1/posts \
-H "Authorization: Bearer fh_YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"profileId": "prof_…",
"content": "Five-minute tomato soup #recipe",
"mediaIds": ["med_…"],
"targets": [{
"accountId": "acc_…",
"options": { "tiktok": { "privacyLevel": "FOLLOWER_OF_CREATOR", "allowComment": true } }
}],
"scheduledFor": "2026-11-10T18:00:00+01:00"
}'After publishing
TikTok processes the video after the upload. It can take a few minutes until it appears on the profile. The TikTok target's platformUrl links to the video, or to the profile while TikTok is still processing.
Errors
Checked before the post is stored (400, see Errors):
| Code | Cause | Fix |
|---|---|---|
content_too_long | More than 2,200 characters | Shorten the caption, or give TikTok its own text in targets |
media_required | The post has no video | Add one video |
too_many_media | More than one file | Keep one video |
media_type_unsupported | An image or other file | Post one video (MP4, MOV or WebM) |
tiktok_privacy_required | options.tiktok.privacyLevel is missing | Let the user choose a privacy level |
tiktok_branded_content_private | brandedContent with SELF_ONLY | Pick another privacy level |
While publishing (in targets[].error, see Publishing errors). Rate limits and outages are retried automatically:
| Code | Cause | Fix |
|---|---|---|
account_needs_reauth | The user removed FeedHorizon on TikTok | Reconnect the account, then retry |
platform_auth_failed | TikTok refused the token or a permission is missing | Reconnect the account, then retry |
platform_rejected | TikTok refused the video. Examples: the account does not offer that privacy level (yet), the video is longer than maxVideoPostDurationSec, or TikTok's checks failed after processing. error.message has the reason | Fix it, then retry |