Docs

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
Text2,200 characters
Files per post1 file, a video is required
Imagesnot supported
VideosMP4, MOV or WebM
File sizeUp 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:

FieldType
privacyLevelPUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLYrequired
allowCommentbooleandefault false
allowDuetbooleandefault false
allowStitchbooleandefault false
brandOrganicbooleanpromotes your own business, labeled "Promotional content"
brandedContentbooleanpaid partnership with another brand, labeled "Paid partnership". Cannot be SELF_ONLY
aiGeneratedbooleanmarks 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
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
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):

CodeCauseFix
content_too_longMore than 2,200 charactersShorten the caption, or give TikTok its own text in targets
media_requiredThe post has no videoAdd one video
too_many_mediaMore than one fileKeep one video
media_type_unsupportedAn image or other filePost one video (MP4, MOV or WebM)
tiktok_privacy_requiredoptions.tiktok.privacyLevel is missingLet the user choose a privacy level
tiktok_branded_content_privatebrandedContent with SELF_ONLYPick another privacy level

While publishing (in targets[].error, see Publishing errors). Rate limits and outages are retried automatically:

CodeCauseFix
account_needs_reauthThe user removed FeedHorizon on TikTokReconnect the account, then retry
platform_auth_failedTikTok refused the token or a permission is missingReconnect the account, then retry
platform_rejectedTikTok 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 reasonFix it, then retry