# TikTok (/docs/platforms/tiktok)



**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 [#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](/docs/guides/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 [#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](#what-the-account-allows).

Required settings [#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](https://www.tiktok.com/legal/page/global/bc-policy/en); every post falls under the [Music Usage Confirmation](https://www.tiktok.com/legal/page/global/music-usage-confirmation/en). Show this to your users before they post.

What the account allows [#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:

```bash title="cURL"
curl https://feedhorizon.com/api/v1/accounts/acc_…/tiktok-creator \
  -H "Authorization: Bearer fh_YOUR_API_KEY"
```

```json
{
  "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 [#example]

```bash title="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 [#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 [#errors]

Checked before the post is stored (`400`, see [Errors](/docs/api/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](/docs/api/errors#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                |
