TikTok Publishing

βœ… Production Ready - TikTok integration is fully approved and operational. All features work with public videos.

Learn how to connect TikTok accounts and upload videos to TikTok.

Connecting TikTok Account

Prerequisites

Connection Steps

  1. Click the "Connect TikTok" button on the dashboard
  2. Sign in to TikTok (if not already logged in)
  3. Review and grant the required permissions:
    • video.upload - Upload videos to your account
    • video.publish - Publish videos
    • user.info.basic - Basic user information
    • user.info.profile - Profile information
    • user.info.stats - User statistics
    • video.list - List your videos
  4. Click "Authorize" to complete the authorization

Your TikTok account will now appear in the Authorized Accounts list with:

Token Information

Privacy Settings

Videos are published with PUBLIC_TO_EVERYONE privacy by default, making them visible to all TikTok users.

Supported Content Types

TikTok supports video uploads and photo carousel posts:

Feature Description Required Limits
Video Video file URL Either video or photos required MP4 format recommended, up to 4GB, 10 min max
Photos Image file URLs (carousel) Either video or photos required JPEG/WEBP only, up to 35 images. PNG auto-converted to JPEG.
Caption Video/photo caption No Max 2200 characters
Privacy Privacy setting Yes Must be selected by user
Draft Send to inbox as draft No Creator publishes manually in TikTok app

TikTok Options (Required)

As per TikTok Content Posting API compliance, additional options must be provided when publishing:

Parameter Type Required Description
privacyLevel string Yes Privacy level (no default, must be selected). Values: PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY
allowComment boolean No Allow comments on the video (default: false)
allowDuet boolean No Allow duet on the video (default: false)
allowStitch boolean No Allow stitch on the video (default: false)
brandContentToggle boolean No Branded content / paid partnership (default: false)
brandOrganicToggle boolean No Your brand / promotional content (default: false)
draft boolean No Send to TikTok inbox as draft instead of publishing directly (default: false)

Privacy Level Restrictions

Commercial Content Disclosure

When disclosing commercial content:

Consent Statement

By publishing to TikTok, users agree to:

Publishing Examples

1. Photo Carousel (Public)

{
  "post": {
    "accountId": "your-tiktok-account-id",
    "content": {
      "text": "Check out these amazing shots! πŸ“Έ #photography #tiktok",
      "mediaUrls": [
        "https://example.com/photo1.jpg",
        "https://example.com/photo2.jpg",
        "https://example.com/photo3.jpg"
      ],
      "platform": "tiktok"
    }
  }
}

Result: Public photo carousel post. PNG images are automatically converted to JPEG.

Note: TikTok only accepts JPEG and WEBP for photos. Boring automatically converts PNG/BMP/GIF/TIFF to JPEG and resizes to max 1080px.

2. Photo Draft (Send to Inbox)

{
  "post": {
    "accountId": "your-tiktok-account-id",
    "content": {
      "text": "Draft caption - edit in TikTok app",
      "mediaUrls": ["https://example.com/photo.jpg"],
      "platform": "tiktok"
    },
    "tiktokOptions": {
      "draft": true
    }
  }
}

Result: Photos sent to creator's TikTok inbox as draft. Creator edits and publishes manually in the TikTok app.

3. Basic Video Upload (Public)

{
  "post": {
    "accountId": "your-tiktok-account-id",
    "content": {
      "text": "Check out this amazing video! #tiktok #trending",
      "mediaUrls": ["https://example.com/video.mp4"],
      "platform": "tiktok"
    },
    "tiktokOptions": {
      "privacyLevel": "PUBLIC_TO_EVERYONE",
      "allowComment": true,
      "allowDuet": true,
      "allowStitch": true
    }
  }
}

Result: Public video with comments, duet, and stitch enabled.

2. Private Video (Friends Only)

{
  "post": {
    "accountId": "your-tiktok-account-id",
    "content": {
      "text": "Just for my friends! 🀫",
      "mediaUrls": ["https://example.com/video.mp4"],
      "platform": "tiktok"
    },
    "tiktokOptions": {
      "privacyLevel": "MUTUAL_FOLLOW_FRIENDS",
      "allowComment": true,
      "allowDuet": false,
      "allowStitch": false
    }
  }
}

Result: Video visible only to friends, comments enabled.

3. Branded Content (Paid Partnership)

{
  "post": {
    "accountId": "your-tiktok-account-id",
    "content": {
      "text": "Amazing product from @brand! #ad #sponsored",
      "mediaUrls": ["https://storage.googleapis.com/my-bucket/sponsored-video.mp4"],
      "platform": "tiktok"
    },
    "tiktokOptions": {
      "privacyLevel": "PUBLIC_TO_EVERYONE",
      "allowComment": true,
      "allowDuet": false,
      "allowStitch": false,
      "brandContentToggle": true
    }
  }
}

Result: Public video labeled as "Paid partnership".

Note: Branded content (brandContentToggle: true) cannot be set to private (SELF_ONLY).

4. Promotional Content (Your Brand)

{
  "post": {
    "accountId": "your-tiktok-account-id",
    "content": {
      "text": "Check out my new course! Link in bio πŸŽ“",
      "mediaUrls": ["https://example.com/promo-video.mp4"],
      "platform": "tiktok"
    },
    "tiktokOptions": {
      "privacyLevel": "PUBLIC_TO_EVERYONE",
      "allowComment": true,
      "allowDuet": true,
      "allowStitch": true,
      "brandOrganicToggle": true
    }
  }
}

Result: Public video labeled as "Promotional content".

Implementation Details

Upload Process

TikTok uses a specialized chunked upload process:

  1. Download: Video is downloaded from the provided URL
  2. Chunk Calculation:
    • Files < 5MB: Uploaded as single chunk
    • Files β‰₯ 5MB: Split into 10MB chunks using floor division
    • Formula: total_chunks = floor(file_size / chunk_size)
    • Last chunk absorbs all remaining bytes (can exceed 10MB, max 128MB)
  3. Initialize: Upload session is initialized with chunk count
  4. Upload Chunks: Each chunk is uploaded with Content-Range headers
  5. Processing: TikTok processes the video (takes 10-30 seconds)
  6. Publish: Video is published to your account

Example Chunk Calculation

For a 29.9MB video (29,957,059 bytes):

Response Format

Successful Response

{
  "success": true,
  "postSubmissionId": "ca5b8e50-9376-4fbb-b2fc-b619849e3574",
  "platform": "tiktok",
  "post_type": "video",
  "publish_id": "v_pub_file~v2-1.7577571164748499000",
  "status": "PUBLISH_COMPLETE",
  "message": "Post published successfully"
}

Failed Response

{
  "success": false,
  "error": "Account is not a TikTok account",
  "platform": "tiktok"
}

Common Issues

1. "Account is not a TikTok account"

Cause: The provided accountId belongs to a different platform.

Solution:

2. "total chunk count is invalid"

Cause: Internal error with chunk calculation (should not happen with current implementation).

Solution: Contact support if you encounter this error.

3. "url_ownership_unverified"

Cause: Trying to use PULL_FROM_URL method without domain verification.

Solution: This should not occur - Boring automatically uses FILE_UPLOAD method which doesn't require URL verification.

Performance Metrics

After publishing, you can view your TikTok video performance:

  1. Click "View Performance" next to your TikTok account
  2. View metrics for your videos:
    • Views: Number of times your video was viewed
    • Likes: Number of likes on your video
    • Comments: Number of comments
    • Shares: Number of times your video was shared
    • Video Description: Caption text
    • Duration: Video length in seconds
    • Create Time: When the video was published

Best Practices

  1. Video Format: Use MP4 format for best compatibility
  2. File Size: Keep videos under 100MB for faster upload
  3. Captions: Use engaging captions with relevant hashtags
  4. Hashtags: Include 3-5 relevant hashtags for better discoverability
  5. Video Quality: Upload in 1080p or higher for best quality
  6. Duration: Keep videos between 15-60 seconds for best engagement
  7. Testing: Use the "Test Upload" button before API integration

Rate Limits

TikTok API has the following rate limits:

Exceeding these limits will result in 429 Too Many Requests errors.

Next Steps