Post a video or photo post to TikTok
post_to_tiktokPublish videos or photo slideshows to TikTok as a live post or draft, with captions, cover selection, and privacy controls.
Instructions
Publish to the user’s connected TikTok account — a finished VIDEO, or a PHOTO POST (TikTok’s photo/slideshow format). A photo post carries 1 to 35 images and ONE image is simply a one-slide photo post, so there is nothing special to do for a single picture: pass imageUrls, in the order the slides should appear, and optionally coverIndex. Pass videoUrl for a video. Never pass both — TikTok has no mixed post. TWO destinations either way: destination:"post" puts it LIVE on their profile now — that requires privacy, and you must call tiktok_creator_info first, show the creator’s real privacy options and get an explicit yes before calling. destination:"draft" (the default, and the safer one) sends it to TikTok for the user to finish and post themselves from the app. Pass Hermoso render URLs (or upload_file urls for local/external files). Needs TikTok connected (Settings ▸ Connectors ▸ TikTok).
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| hook | No | WHAT ANGLE THIS POST IS BUILT ON — the single most valuable field here, and the only moment it can ever be recorded. post_performance groups on it to answer "which hooks work", and it needs 5 posts sharing ONE hook before it will call anything a winner, so REUSE THE SAME WORDING across a campaign instead of rephrasing it every time. Best of all, pass a hook id from list_hooks (e.g. "direct_callout", "mid_problem", "before_after") — those fold onto a stable key however they are spelled, so a whole brand accumulates evidence on one row. Your own wording is fine too; it just only groups when you repeat it exactly. Omitting it means this post can never vote on which hook works. | |
| title | No | the caption — hashtags go here (video ≤2200 chars, photo post ≤4000) | |
| privacy | No | REQUIRED for destination:"post", for photos and video alike. Must be one the creator actually allows — read them from tiktok_creator_info, never guess. | |
| subject | No | WHAT THIS POST IS ABOUT — the product, feature, offer or theme (e.g. "winter coat", "free trial", "founder story"). The second grouping axis in post_performance. Same rule as hook: reuse the exact wording so posts about one subject land in one group. | |
| videoUrl | No | the video to post — a Hermoso render URL or an upload_file url. Omit for a photo post. | |
| imageUrls | No | a PHOTO POST: 1–35 image URLs in slide order. One url = a single-image photo post. Do not combine with videoUrl. | |
| yourBrand | No | discloses that this promotes the creator’s own brand | |
| coverIndex | No | photo posts: which slide is the cover, 0-based. Default 0 (the first slide). | |
| photoTitle | No | photo posts only: a short title above the caption (≤90 chars). Defaults to the caption’s first line. | |
| destination | No | "post" = live on the profile now (needs privacy + an explicit user yes); "draft" = to TikTok for the user to review and post themselves. Default "draft". | |
| disableDuet | No | video only — TikTok has no duet on a photo post | |
| autoAddMusic | No | photo posts only: let TikTok add a recommended track (default true — a silent slideshow reads as broken) | |
| disableStitch | No | video only — TikTok has no stitch on a photo post | |
| brandedContent | No | discloses a paid partnership — cannot be combined with SELF_ONLY privacy | |
| disableComment | No | ||
| coverTimestampMs | No | video only: which frame to use as the cover, in ms |