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.
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_levelstringoptionalWho 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_commentbooleanoptionalTurn comments off for this post. Default: false (comments allowed).
tiktok.disable_duetbooleanoptionalTurn Duet off. Videos only. Default: false.
tiktok.disable_stitchbooleanoptionalTurn Stitch off. Videos only. Default: false.
tiktok.self_brandbooleanoptionalYour brand: the post promotes yourself or your own business. TikTok labels it as "Promotional content". Default: false.
tiktok.brand_contentbooleanoptionalBranded 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.isDraftbooleanoptionalSend 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_indexintegeroptionalPhoto 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_musicbooleanoptionalPhoto posts only: let TikTok add recommended music. Default: true.
Validation (HTTP 400)
brand_content: truetogether withprivacy_level: "SELF_ONLY"(not for drafts): "Branded content cannot be private (privacy_level SELF_ONLY)"photo_cover_indexthat is not a whole number of 0 or more: "Invalid tiktok.photo_cover_index"privacy_levelthat 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"
tiktokthat is not an object: "Invalid tiktok settings"
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:
TikTok does not support text-only posts via the Crosspostify API. The /post/text endpoint is available for Facebook and Threads only.
/post/videoPost 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 /mediaand use the returnedmediaId captionis sent as the TikTok video text (cut to 2,000 characters).titleis not used for videos.captionsupports hashtags (e.g.#fyp) and emojis- Use
thumbnailTimestamp(milliseconds) to pick the cover frame - Set
is_aigc: trueif the video was generated or significantly edited by AI - Privacy, comments, Duet, Stitch, commercial content and drafts are set in the
tiktokobject (see TikTok Settings) scheduledDatetakes any ISO 8601 date-time:Zor an offset such as+01:00(converted to UTC). Without an offset it is read as UTC.- Omit
scheduledDateto post immediately (queued) - In
GET /posts,PUBLISHEDmeans TikTok accepted the upload;postUrlis empty at first and filled in within about 10 minutes
Request Body
mediaIdstringrequiredThe ID of the uploaded video file. Obtain this from POST /media.
scheduledDatestringoptionalOptional. 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.
postsarrayrequiredArray of post objects. Include one object per TikTok account you want to post to.
posts[].accountIdstringrequiredThe id of the connected TikTok account from GET /social-accounts (Crosspostify's account ID, not the TikTok user ID).
posts[].captionstringoptionalOptional (default empty). The video text, including hashtags and emojis. Cut to 2,000 characters without an error.
posts[].titlestringoptionalNot used for TikTok videos (ignored): the caption is sent as TikTok's title. Only photo posts use title.
posts[].thumbnailTimestampintegeroptionalCover frame in milliseconds from the start of the video (1500 = 1.5 s). Default: 0 (first frame). Ignored for drafts (isDraft).
posts[].is_aigcbooleanoptionalSet to true to label this video as AI-generated content per TikTok's policy. Default: false.
posts[].tiktokobjectoptionalTikTok settings: privacy_level, disable_comment, disable_duet, disable_stitch, self_brand, brand_content, isDraft. See TikTok Settings.
Response (202 Accepted)
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/imagePost a single photo to TikTok. TikTok displays single photos as a photo post in the feed.
TikTok Photo Notes
titleis used as the photo title on TikTok (up to 90 characters; longer text is cut)captionbecomes 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
scheduledDatetakes any ISO 8601 date-time:Zor an offset such as+01:00(converted to UTC). Without an offset it is read as UTC.- In
GET /posts,postUrlis empty at first and filled in within about 10 minutes afterPUBLISHED
Request Body
mediaIdstringrequiredThe ID of the uploaded image file. Obtain this from POST /media.
scheduledDatestringoptionalOptional. 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.
postsarrayrequiredArray of post objects. Include one object per TikTok account.
posts[].accountIdstringrequiredThe id of the connected TikTok account from GET /social-accounts (Crosspostify's account ID, not the TikTok user ID).
posts[].captionstringoptionalOptional (default empty). The photo description. Supports hashtags and emojis. Cut to 2,200 characters without an error.
posts[].titlestringoptionalThe photo title shown on TikTok. Max 90 characters (longer text is cut).
posts[].is_aigcbooleanoptionalSet to true to label the photo as AI-generated content. Default: false.
posts[].tiktokobjectoptionalTikTok settings: privacy_level, disable_comment, self_brand, brand_content, isDraft, auto_add_music. See TikTok Settings.
Response (202 Accepted)
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/imagesPost 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 titleis used as the slideshow title on TikTok (up to 90 characters);captionas 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
scheduledDatetakes any ISO 8601 date-time:Zor an offset such as+01:00(converted to UTC). Without an offset it is read as UTC.- In
GET /posts,postUrlis empty at first and filled in within about 10 minutes afterPUBLISHED
Request Body
mediaIdsarrayrequiredOrdered array of 1 to 35 image media IDs. Images appear in this order in the slideshow.
scheduledDatestringoptionalOptional. 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.
postsarrayrequiredArray of post objects. Include one object per TikTok account.
posts[].accountIdstringrequiredThe id of the connected TikTok account from GET /social-accounts (Crosspostify's account ID, not the TikTok user ID).
posts[].captionstringoptionalOptional (default empty). The slideshow description. Supports hashtags and emojis. Cut to 2,200 characters without an error.
posts[].titlestringoptionalThe slideshow title shown on TikTok. Max 90 characters (longer text is cut).
posts[].is_aigcbooleanoptionalSet to true to label the slideshow as AI-generated content. Default: false.
posts[].tiktokobjectoptionalTikTok settings: privacy_level, disable_comment, self_brand, brand_content, isDraft, photo_cover_index, auto_add_music. See TikTok Settings.
Response (202 Accepted)
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: truein the post object to apply TikTok's AIGC label - Applies to
POST /post/video,/post/imageand/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
falseif omitted. Acceptstrue/false,"true"/"false"or1/0; any other value returns HTTP 400 "Invalid is_aigc" tiktok.is_aigcinside thetiktokobject (used by older clients) still works and overrides the top-levelis_aigcfor TikTok- TikTok may independently apply AIGC labels based on their own detection
When to use is_aigc
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.