TikTok API

Use the Crosspostify API to post videos, photos, and slideshows directly to TikTok — with full support for scheduling, privacy and interaction settings, commercial content disclosure, AI-generated content labeling, drafts, and multi-account publishing.

Post Types
Video · Photo · Slideshow
Max Slideshow Images
35 images
AIGC Labeling
Supported (video + photo)

TikTok is one of the most widely used short-form video platforms. With the Crosspostify TikTok API integration, you can automate posting workflows, schedule content in advance, and publish across multiple TikTok accounts simultaneously — all via a single REST API call.

This page covers everything specific to TikTok when using the Crosspostify API. For general authentication, rate limits, and error handling, see the full API Reference.

TikTok-Specific Parameters

When targeting a TikTok account in your posts[] array, the following parameters are relevant. Parameters not listed here are either ignored or not applicable to TikTok.

accountId✓ AppliesRequired. The id of the connected TikTok account from GET /social-accounts (Crosspostify's account ID, not the TikTok user ID).
caption✓ AppliesOptional. Video text or photo description. Supports hashtags and emojis.
title✓ AppliesPhoto posts only (/post/image, /post/images): TikTok photo title, max 90 characters. Ignored for videos.
thumbnailTimestamp✓ AppliesOptional, /post/video only: cover frame in milliseconds (1500 = 1.5 s). Default 0. Not used for drafts.
is_aigc✓ AppliesOptional. Marks the post as AI-generated content. Video and photo posts.
tiktok✓ AppliesOptional object: privacy, interactions, commercial content, draft and photo options. See TikTok Settings below.
boardId✗ IgnoredPinterest only — ignored for TikTok.
link✗ IgnoredPinterest and Tumblr only — ignored for TikTok.
facebookFirstComment✗ IgnoredFacebook only — ignored for TikTok.
textFormatPresetId✗ IgnoredFacebook only — ignored for TikTok.
instagram / facebook / youtube✗ IgnoredInstagram / Facebook / YouTube only — ignored for TikTok.

TikTok Settings

Add an optional tiktok object to a post to control how it appears on TikTok. Every field is optional; when you leave the object out, the post is published publicly with comments, Duet and Stitch allowed.

On/off options accept true/false, the strings "true"/"false" (any case) and 1/0. Any other value is rejected with HTTP 400, for example "Invalid tiktok.disable_duet".

tiktok.privacy_levelstringoptional

Who can view the post: PUBLIC_TO_EVERYONE (default), MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR or SELF_ONLY. Any other value is rejected with HTTP 400. For direct posts (not drafts): if the account does not offer the chosen level (for example a private account cannot post publicly), the post uses the first level TikTok allows for that account.

tiktok.disable_commentbooleanoptional

Turn comments off for this post. Default: false (comments allowed).

tiktok.disable_duetbooleanoptional

Turn Duet off. Videos only. Default: false.

tiktok.disable_stitchbooleanoptional

Turn Stitch off. Videos only. Default: false.

tiktok.self_brandbooleanoptional

Your brand: the post promotes yourself or your own business. TikTok labels it as "Promotional content". Default: false.

tiktok.brand_contentbooleanoptional

Branded content: the post promotes another brand or a third party. TikTok labels it as "Paid partnership". Cannot be combined with privacy_level SELF_ONLY. Default: false.

tiktok.isDraftbooleanoptional

Send the post to the creator's TikTok inbox instead of publishing it. The creator finishes and publishes it in the TikTok app, where privacy, interactions and labels are set. thumbnailTimestamp is not used for drafts. In GET /posts a draft shows status PUBLISHED once TikTok accepts it into the inbox, and it never gets a postUrl. Default: false.

tiktok.photo_cover_indexintegeroptional

Photo posts only: which image is the cover, counted from 0 in the order of mediaIds. Default: 0 (first image). A number past the last image falls back to the first image.

tiktok.auto_add_musicbooleanoptional

Photo posts only: let TikTok add recommended music. Default: true.

Validation (HTTP 400)

  • brand_content: true together with privacy_level: "SELF_ONLY" (not for drafts): "Branded content cannot be private (privacy_level SELF_ONLY)"
  • photo_cover_index that is not a whole number of 0 or more: "Invalid tiktok.photo_cover_index"
  • privacy_level that is not one of the four values above: "Invalid tiktok.privacy_level"
  • An on/off option that is not true/false, "true"/"false" or 1/0: "Invalid tiktok.<field>", e.g. "Invalid tiktok.isDraft"
  • tiktok that is not an object: "Invalid tiktok settings"
Building a posting screen for your own users?

TikTok's Content Sharing Guidelines apply to apps that post on behalf of creators: show the creator's nickname, let them choose who can view the post and whether comments, Duet and Stitch are allowed, ask about commercial content, and show TikTok's Music Usage Confirmation (plus the Branded Content Policy for branded content) before posting.

Supported Endpoints

TikTok supports the following Crosspostify API endpoints:

Text-only posts not supported

TikTok does not support text-only posts via the Crosspostify API. The /post/text endpoint is available for Facebook and Threads only.

POST/post/video

Post a video to TikTok. This is the primary post type for TikTok and supports all TikTok-specific options including AIGC labeling and scheduling.

TikTok Video Notes

  • Upload your video first via POST /media and use the returned mediaId
  • caption is sent as the TikTok video text (cut to 2,000 characters). title is not used for videos.
  • caption supports hashtags (e.g. #fyp) and emojis
  • Use thumbnailTimestamp (milliseconds) to pick the cover frame
  • Set is_aigc: true if the video was generated or significantly edited by AI
  • Privacy, comments, Duet, Stitch, commercial content and drafts are set in the tiktok object (see TikTok Settings)
  • scheduledDate takes any ISO 8601 date-time: Z or an offset such as +01:00 (converted to UTC). Without an offset it is read as UTC.
  • Omit scheduledDate to post immediately (queued)
  • In GET /posts, PUBLISHED means TikTok accepted the upload; postUrl is empty at first and filled in within about 10 minutes

Request Body

mediaIdstringrequired

The ID of the uploaded video file. Obtain this from POST /media.

scheduledDatestringoptional

Optional. A future ISO 8601 date-time, e.g. 2030-01-15T10:00:00Z. Offsets such as +01:00 are converted to UTC; a value without offset is read as UTC. Omit it (or send null) to post immediately.

postsarrayrequired

Array of post objects. Include one object per TikTok account you want to post to.

posts[].accountIdstringrequired

The id of the connected TikTok account from GET /social-accounts (Crosspostify's account ID, not the TikTok user ID).

posts[].captionstringoptional

Optional (default empty). The video text, including hashtags and emojis. Cut to 2,000 characters without an error.

posts[].titlestringoptional

Not used for TikTok videos (ignored): the caption is sent as TikTok's title. Only photo posts use title.

posts[].thumbnailTimestampintegeroptional

Cover frame in milliseconds from the start of the video (1500 = 1.5 s). Default: 0 (first frame). Ignored for drafts (isDraft).

posts[].is_aigcbooleanoptional

Set to true to label this video as AI-generated content per TikTok's policy. Default: false.

posts[].tiktokobjectoptional

TikTok settings: privacy_level, disable_comment, disable_duet, disable_stitch, self_brand, brand_content, isDraft. See TikTok Settings.

Response (202 Accepted)

{ "mediaId": "vid_12345", "message": "Video post created successfully", "posts": [ { "id": "7f3c9a2e-1b4d-4c8e-9f60-2a5b7d1e3c48", "platform": "tiktok", "socialAccountId": "acc_tiktok_789", "status": "SCHEDULED" } ] }

status is SCHEDULED when scheduledDate is set, otherwise QUEUED. Publishing happens afterwards: check the result with GET /posts?id=<id>.

Code Example

curl -X POST "https://v1.api.crosspostify.com/post/video" \
  -H "X-API-Key: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "mediaId": "vid_12345",
    "scheduledDate": "2030-01-15T10:00:00Z",
    "posts": [
      {
        "accountId": "acc_tiktok_789",
        "caption": "My latest TikTok video 🎬 #fyp #viral",
        "thumbnailTimestamp": 1500,
        "is_aigc": false,
        "tiktok": {
          "privacy_level": "PUBLIC_TO_EVERYONE",
          "disable_comment": false,
          "disable_duet": false,
          "disable_stitch": false
        }
      }
    ]
  }'
POST/post/image

Post a single photo to TikTok. TikTok displays single photos as a photo post in the feed.

TikTok Photo Notes

  • title is used as the photo title on TikTok (up to 90 characters; longer text is cut)
  • caption becomes the photo description (up to 2,200 characters; longer text is cut) and supports hashtags and emojis
  • TikTok adds recommended music unless you set tiktok.auto_add_music: false
  • Recommended image aspect ratio: 9:16 (vertical) for best feed presentation
  • Crosspostify scales images larger than 1080×1920 down (aspect ratio kept) before sending them to TikTok
  • scheduledDate takes any ISO 8601 date-time: Z or an offset such as +01:00 (converted to UTC). Without an offset it is read as UTC.
  • In GET /posts, postUrl is empty at first and filled in within about 10 minutes after PUBLISHED

Request Body

mediaIdstringrequired

The ID of the uploaded image file. Obtain this from POST /media.

scheduledDatestringoptional

Optional. A future ISO 8601 date-time, e.g. 2030-01-15T10:00:00Z. Offsets such as +01:00 are converted to UTC; a value without offset is read as UTC. Omit it (or send null) to post immediately.

postsarrayrequired

Array of post objects. Include one object per TikTok account.

posts[].accountIdstringrequired

The id of the connected TikTok account from GET /social-accounts (Crosspostify's account ID, not the TikTok user ID).

posts[].captionstringoptional

Optional (default empty). The photo description. Supports hashtags and emojis. Cut to 2,200 characters without an error.

posts[].titlestringoptional

The photo title shown on TikTok. Max 90 characters (longer text is cut).

posts[].is_aigcbooleanoptional

Set to true to label the photo as AI-generated content. Default: false.

posts[].tiktokobjectoptional

TikTok settings: privacy_level, disable_comment, self_brand, brand_content, isDraft, auto_add_music. See TikTok Settings.

Response (202 Accepted)

{ "mediaId": "img_12345", "message": "Image post created successfully", "posts": [ { "id": "7f3c9a2e-1b4d-4c8e-9f60-2a5b7d1e3c48", "platform": "tiktok", "socialAccountId": "acc_tiktok_789", "status": "SCHEDULED" } ] }

status is SCHEDULED when scheduledDate is set, otherwise QUEUED. Publishing happens afterwards: check the result with GET /posts?id=<id>.

Code Example

curl -X POST "https://v1.api.crosspostify.com/post/image" \
  -H "X-API-Key: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "mediaId": "img_12345",
    "scheduledDate": "2030-01-15T10:00:00Z",
    "posts": [
      {
        "accountId": "acc_tiktok_789",
        "caption": "Check out this photo! 📸 #tiktok",
        "title": "My Photo Post"
      }
    ]
  }'
POST/post/images

Post a photo slideshow to TikTok. TikTok renders multiple images as a swipeable carousel in the feed — great for product showcases, tutorials, or storytelling.

TikTok Slideshow Notes

  • 1 to 35 images per post (one image is posted as a normal photo post)
  • Images are displayed in the order provided in mediaIds
  • The first image is the cover unless you set tiktok.photo_cover_index
  • TikTok adds recommended music unless you set tiktok.auto_add_music: false
  • title is used as the slideshow title on TikTok (up to 90 characters); caption as the description (up to 2,200 characters). Longer text is cut.
  • Recommended image aspect ratio: 9:16 (vertical) for best presentation
  • All images should have a consistent aspect ratio for best results
  • Crosspostify scales images larger than 1080×1920 down (aspect ratio kept) before sending them to TikTok
  • scheduledDate takes any ISO 8601 date-time: Z or an offset such as +01:00 (converted to UTC). Without an offset it is read as UTC.
  • In GET /posts, postUrl is empty at first and filled in within about 10 minutes after PUBLISHED

Request Body

mediaIdsarrayrequired

Ordered array of 1 to 35 image media IDs. Images appear in this order in the slideshow.

scheduledDatestringoptional

Optional. A future ISO 8601 date-time, e.g. 2030-01-15T10:00:00Z. Offsets such as +01:00 are converted to UTC; a value without offset is read as UTC. Omit it (or send null) to post immediately.

postsarrayrequired

Array of post objects. Include one object per TikTok account.

posts[].accountIdstringrequired

The id of the connected TikTok account from GET /social-accounts (Crosspostify's account ID, not the TikTok user ID).

posts[].captionstringoptional

Optional (default empty). The slideshow description. Supports hashtags and emojis. Cut to 2,200 characters without an error.

posts[].titlestringoptional

The slideshow title shown on TikTok. Max 90 characters (longer text is cut).

posts[].is_aigcbooleanoptional

Set to true to label the slideshow as AI-generated content. Default: false.

posts[].tiktokobjectoptional

TikTok settings: privacy_level, disable_comment, self_brand, brand_content, isDraft, photo_cover_index, auto_add_music. See TikTok Settings.

Response (202 Accepted)

{ "mediaIds": ["img_001", "img_002", "img_003", "img_004"], "message": "Multiple images post created successfully", "posts": [ { "id": "7f3c9a2e-1b4d-4c8e-9f60-2a5b7d1e3c48", "platform": "tiktok", "socialAccountId": "acc_tiktok_789", "status": "SCHEDULED" } ] }

status is SCHEDULED when scheduledDate is set, otherwise QUEUED. Publishing happens afterwards: check the result with GET /posts?id=<id>.

Code Example

curl -X POST "https://v1.api.crosspostify.com/post/images" \
  -H "X-API-Key: your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "mediaIds": ["img_001", "img_002", "img_003", "img_004"],
    "scheduledDate": "2030-01-15T10:00:00Z",
    "posts": [
      {
        "accountId": "acc_tiktok_789",
        "caption": "Swipe through our collection 👀 #tiktok #slideshow",
        "title": "Product Collection",
        "tiktok": {
          "photo_cover_index": 0,
          "auto_add_music": true
        }
      }
    ]
  }'

Content Guidelines

TikTok enforces its own content policies on all posts. Content that violates TikTok's Community Guidelines may be rejected or removed after publishing.

Posting requests return 202 before TikTok is contacted. If TikTok refuses the post, GET /posts shows status FAILED and TikTok's reason in error. PUBLISHED means TikTok accepted the upload; the public postUrl appears up to about 10 minutes later.

Video Requirements

  • Format: MP4 or MOV (other formats are rejected at upload)
  • Max file size: 100 MB via Crosspostify
  • Aspect ratio: 9:16 recommended (vertical)
  • Min resolution: 720p recommended
  • TikTok decides the maximum video length per account

Image Requirements

  • Format: JPG, PNG or WEBP (converted to JPEG on upload)
  • Max file size: 20 MB via Crosspostify
  • Aspect ratio: 9:16 recommended (vertical)
  • Min resolution: 720×1280px recommended

Caption Best Practices

  • Videos: max 2,000 characters; photo posts: 2,200 (longer text is cut, no error)
  • Use relevant hashtags for discoverability
  • Emojis are fully supported
  • Avoid excessive hashtag stuffing

Scheduling

  • Any future time works: no minimum lead time
  • Published within about a minute of the scheduled time
  • ISO 8601 with Z or an offset (e.g. +01:00); no offset = UTC
  • Omit scheduledDate to post immediately
  • No maximum scheduling window

AI-Generated Content (AIGC)

TikTok requires creators to label content that is realistically altered or generated by AI — such as AI-generated faces, voices, or scenes. The Crosspostify API exposes this via the is_aigc parameter on video and photo posts.

How it works

  • Set is_aigc: true in the post object to apply TikTok's AIGC label
  • Applies to POST /post/video, /post/image and /post/images
  • The same flag also sets the AI label on Instagram (images, carousels, Reels) and Facebook (Reels and video Stories) in the same request
  • Defaults to false if omitted. Accepts true/false, "true"/"false" or 1/0; any other value returns HTTP 400 "Invalid is_aigc"
  • tiktok.is_aigc inside the tiktok object (used by older clients) still works and overrides the top-level is_aigc for TikTok
  • TikTok may independently apply AIGC labels based on their own detection

When to use is_aigc

AI-generated video (e.g. Sora, Runway)is_aigc: true
AI voice-over or AI-cloned voiceis_aigc: true
AI-generated face or deepfake-style contentis_aigc: true
Standard video with AI-assisted editing (color grading, captions)is_aigc: false
Organic video with no AI involvementis_aigc: false
TikTok policy compliance

Failing to label AI-generated content when required may result in post removal or account penalties per TikTok's policies. When in doubt, set is_aigc: true.