TikTok requirements
Account requirements
- Any TikTok account works — personal, creator or business. You log in with TikTok and approve Relay on TikTok's consent screen.
- Relay asks for five permissions:
user.info.basic,user.info.profileanduser.info.stats(name, @username, avatar, follower and video counts),video.publish(post directly to the profile) andvideo.upload(send to the TikTok inbox). TikTok lets you untick any of them; an unticked posting permission turns that post mode off for the account.accounts_listreports them ascan_direct_postandcan_upload. - TikTok caps every creator at roughly 15 posts a day, shared across every app they post from, and at 5 uploads waiting in the inbox per day.
Connecting an account
Start from Accounts → Connect TikTok. TikTok issues an access token that lasts 24 hours and a refresh token that lasts a year. Relay stores both encrypted (AES-256-GCM), renews the access token on its own whenever it needs one, and rotates the refresh token every week.
| Health | Meaning | Can publish? |
|---|---|---|
| connected | Authorized, with more than 7 days left on the year-long authorization. | Yes |
| expiring | The authorization ends within 7 days — TikTok authorizations last at most a year. | Yes, until it ends. Reconnect to renew it. |
| reconnect_required | TikTok rejected the token or refresh token (expired, revoked, account changed). | No — reconnect the account. |
| disconnected | Removed from Relay, or Relay was removed in TikTok’s own settings (TikTok tells Relay immediately). | No |
Post types
| Relay post_type | On TikTok | Media |
|---|---|---|
| reel | Video post | Exactly 1 MP4/MOV video |
| feed | Photo post | Exactly 1 JPEG image |
| carousel | Photo post (swipeable) | Images only — 2–35 on a TikTok-only post, 2–10 when an Instagram account is also targeted |
| story | — | Not available: TikTok has no stories |
One post can target Instagram and TikTok accounts together; each platform gets its own version. A post with an Instagram target is held to Instagram's rules as well, so a mixed-media carousel or a story can't include TikTok accounts.
TikTok settings on every post
Every post with a TikTok account carries a tiktok object. TikTok requires the creator to choose these themselves, so Relay never fills in a default — not for privacy, and not for interactions.
| Field | Values | Notes |
|---|---|---|
| mode | direct (default) · inbox | direct posts to the profile. inbox sends it to the creator’s TikTok inbox; they choose the sound and settings and post it from the TikTok app. |
| privacy_level | PUBLIC_TO_EVERYONE · MUTUAL_FOLLOW_FRIENDS · FOLLOWER_OF_CREATOR · SELF_ONLY | Required for direct. Must be one this account offers right now — ask tiktok_creator_info. |
| allow_comment | boolean, default false | Forced off if the creator turned comments off in TikTok. |
| allow_duet · allow_stitch | boolean, default false | Videos only. Forced off if the creator turned them off in TikTok. |
| brand_organic | boolean | Promotes your own brand. TikTok labels the post “Promotional content”. |
| brand_content | boolean | A paid partnership with another brand. TikTok labels it “Paid partnership”. Cannot be SELF_ONLY. |
| is_aigc | boolean | Adds TikTok’s AI-generated content label. |
| caption | 1–2,200 characters | TikTok-only caption; the post caption is used when absent. |
| title | 1–90 characters | Photo posts only. |
| photo_cover_index | integer | Photo posts: which image is the cover. |
| auto_add_music | boolean | Photo posts: let TikTok add a sound. |
| cover_timestamp_ms | integer | Videos: which frame is the cover. |
{
"targets": ["7c2a…"],
"caption": "Every colourway, one drop. #fall",
"media": ["https://cdn.example.com/fall.mp4"],
"tiktok": {
"privacy_level": "PUBLIC_TO_EVERYONE",
"allow_comment": true,
"brand_organic": true
}
}Check what an account allows first with GET /v1/accounts/:id/tiktok/creator-info (MCP: tiktok_creator_info): its privacy options, which interactions the creator has turned off, the longest video it may post, and whether it can post at all right now.
Media specifications
Video
| Property | TikTok | Enforced by Relay |
|---|---|---|
| Container | MP4 (recommended), MOV, WebM | MP4 and MOV only |
| Codec | H.264 (recommended), H.265, VP8, VP9 | No |
| Frame rate | 23–60 FPS | No |
| Resolution | 360–4096 px on each side | No |
| Duration | Up to the creator’s limit — 3, 5 or 10 minutes | Yes — read from the file at upload and checked against the creator before posting |
| File size | ≤ 4 GB | 100 MB (Relay’s cap) |
Photos
| Property | TikTok | Enforced by Relay |
|---|---|---|
| Format | JPEG or WebP | JPEG (the dashboard converts anything) |
| Size | ≤ 20 MB each | 8 MB each |
| Resolution | At most 1080p | Warned in the composer |
| Count | 1–35 per post | Yes |
TikTok downloads the media from Relay's media domain when the post goes out, so nothing is uploaded from your side at publish time.
Timing & statuses
Relay asks TikTok what the account allows, starts the post, then polls TikTok every scheduler tick until it settles. TikTok processes the media and runs its own review before a post is public — usually about a minute, occasionally longer.
processing— TikTok is downloading or processing the media.publishedwith apermalink— live and public.publishedwithout a permalink — posted, but TikTok hasn't assigned a public link yet (still in review, or the post isSELF_ONLY). Relay fills the link in when TikTok reports it.publishedwitherror.code: tiktok_inbox— delivered to the TikTok inbox; the creator finishes it in the app.
Failure reference
| Code | Cause | What to do |
|---|---|---|
| quota_exceeded | The creator hit TikTok’s daily post cap (or 5 waiting inbox uploads). | Nothing — Relay retries for up to a day. Not terminal. |
| quota_timeout | Still capped a day after the post was due. | Retry the post later. |
| tiktok_settings_missing | The post has TikTok accounts but no tiktok settings. | Edit the post and choose them. |
| tiktok_privacy_unavailable | The account no longer offers the chosen visibility. | Edit the post and choose another. |
| tiktok_video_too_long | Longer than this account may post. | Trim the video and retry. |
| tiktok_scope_not_authorized | The account unticked the permission this post mode needs. | Reconnect and leave it ticked, or switch post mode. |
| auth_reconnect_required | TikTok rejected the authorization. | Reconnect the account. |
| tiktok_unaudited_client_can_only_post_to_private_accounts | Relay’s TikTok app is awaiting TikTok’s audit: posts must be SELF_ONLY on private accounts. | Post as “Only me”, or send to the inbox. |
| tiktok_<fail_reason> | TikTok failed the post while processing (e.g. video_pull_failed, duration_check_failed, spam_risk_text). | Read the message — it says what TikTok objected to. |
| processing_timeout | TikTok never finished processing. | Retry; re-encode the video if it repeats. |
Not supported
- Stories, and videos mixed with photos. TikTok posts are one video or a set of photos.
- First comments. TikTok's API can't comment;
first_commentneeds an Instagram target and is posted there only. - Per-slide captions. An Instagram carousel feature; a TikTok photo post has one caption (and an optional title).
- Choosing a sound. TikTok's API can't attach a specific track — let TikTok add one to a photo post, or use inbox mode and pick it in the app.
- Editing or deleting a published post. Use the TikTok app.
See the REST API reference, the MCP tool reference, and the Instagram requirements for the other half of a cross-posted post.