---
title: "TikTok"
description: "Publishing to TikTok via the Octopost API"
---

# TikTok

TikTok is a **video-only** platform -- no text-only or image-only posts. Give Octopost a publicly accessible video URL and your caption, and Octopost handles the upload, async processing, and status polling automatically -- you just send us your content.

## Content Limits

| Field | Limit | Notes |
|---|---|---|
| Caption | **2,200 characters** | First ~150 characters visible in the feed |
| Hashtags | No separate field | Included in caption, counts toward the 2,200 limit |
| Video duration | 3 seconds -- 10 minutes | Up to 60 minutes with TikTok approval |
| Video file size | **4 GB** max | |
| Recommended format | MP4, H.264, 1080x1920 (9:16) | WebM also supported |

## Good to Know

- **Video is non-negotiable.** If you send a post to TikTok without a video URL, Octopost will reject it immediately with a clear error. There is no workaround.
- **Only the first ~150 characters of your caption show in the feed.** Put your hook up front. Hashtags can go at the end.
- **You cannot attach TikTok music library tracks via the API.** Any audio must be baked into your video file before upload.
- **No editing after publish.** Once a video is live on TikTok, it cannot be modified through the API.
- **The TikTok account must be a Creator or Business account.** Standard personal accounts cannot publish through the API. This is a TikTok requirement, not an Octopost limitation.

## Platform-Specific Features

### Privacy Levels

Control who can see your video by setting `privacy_level` in `platform_options`:

| Level | Description |
|---|---|
| `PUBLIC_TO_EVERYONE` | Visible to all TikTok users (default) |
| `MUTUAL_FOLLOW_FRIENDS` | Visible only to mutual followers |
| `SELF_ONLY` | Visible only to the creator |

### Interaction Controls

You can disable specific interaction types per video:

```json
{
  "platform_options": {
    "tiktok": {
      "privacy_level": "PUBLIC_TO_EVERYONE",
      "disable_comment": false,
      "disable_duet": false,
      "disable_stitch": false
    }
  }
}
```

### Content Disclosure

TikTok requires content disclosure for branded content or paid partnerships. Set this at publish time through `platform_options` if applicable.

## Rate Limits

Octopost tracks TikTok's rate limits for you. TikTok does not publish specific public rate limits for the Content Posting API, but Octopost monitors responses and will queue or report rate limit errors if they occur.

## Things Octopost Handles for You

You do not need to worry about any of this, but in case you are curious:

- **OAuth 2.0 authentication.** Octopost manages the full OAuth flow, including the `user.info.basic`, `video.publish`, and `video.upload` scopes. Token refresh is automatic.
- **Upload initialization.** Octopost uses TikTok's `PULL_FROM_URL` method. You provide a video URL, Octopost sends it to TikTok's Content Posting API, and TikTok pulls the video from your URL.
- **Async status polling.** TikTok processes videos asynchronously -- your video is not immediately live. Octopost polls the status endpoint through the full lifecycle: `PROCESSING_UPLOAD` to `PROCESSING_DOWNLOAD` to `PUBLISH_COMPLETE`. Polling runs for up to 5 minutes before reporting a timeout.
- **Error reporting.** If TikTok rejects the video (inaccessible URL, invalid format, processing failure), Octopost translates the error into a clear message in the publish result.
- **App-level approval.** TikTok's Content Posting API requires app-level approval from TikTok. Octopost already has this approval -- you do not need to apply separately.
- **Video URL accessibility.** Your video URL must be publicly accessible and the server should support range requests for large files. If the URL is not reachable, TikTok will fail during processing and Octopost will report the error.

## Example

```json
{
  "content": "Check out this tutorial! #coding #webdev",
  "platforms": ["tiktok"],
  "media": {
    "video": "https://example.com/tutorial.mp4"
  },
  "platform_options": {
    "tiktok": {
      "privacy_level": "PUBLIC_TO_EVERYONE"
    }
  }
}
```

That's it. Octopost takes care of the rest.
