Skip to content
UGC API

How to post to TikTok, Instagram, YouTube and Facebook at once

Posting the same clip to four apps by hand means four uploads, four captions and four sets of settings. With one request, or one click in the dashboard, the clip goes to TikTok, Instagram Reels and Stories, Facebook Reels and YouTube Shorts with the right options for each.

Updated

How this differs from repurposing by hand

Our repurposing guide covers the manual craft: clean exports, captions per platform and timing. This guide is the automated version. You prepare the clip once, then one post goes to every platform, and you get one result per account and placement back.

What one post becomes

You choose a format once. Each platform turns it into its own placement.

FormatTikTokInstagramFacebook PageYouTube
videoVideo postReel, optional grid and StoryReel, optional StoryShort
slideshowPhoto post, optional auto musicCarousel at 4:5, optional Story framesMulti-photo postNot supported
imagePhoto post with one imageFeed image, optional StoryPhoto post, optional StoryNot supported

For all four platforms, use video. A slideshow can't go to YouTube, and a post that mixes them is rejected before anything is scheduled. If you want a slideshow on YouTube, render it as a video first.

One clip that fits everywhere

  • MP4, H.264 video, AAC audio, 1080x1920, 9:16.
  • 3 to 90 seconds fits TikTok, Reels, Facebook Page Reels and Shorts. Keep it to 60 seconds if it will also run as a Facebook Page Story.
  • No watermark from another app.
  • Original or licensed audio, since a TikTok library sound may not be cleared elsewhere.

The request

bash
curl https://ugcapi.dev/v1/posts \
  -H "Authorization: Bearer ugc_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "accounts": ["acc_tt_01", "acc_ig_01", "acc_fb_01", "acc_yt_01"],
    "format": "video",
    "media": ["https://cdn.example.com/clip.mp4"],
    "caption": "How I pack a carry-on for 10 days #travel",
    "scheduled_at": "2026-11-05T17:00:00Z",
    "external_id": "clip-551",
    "options": {
      "tiktok": { "privacy": "PUBLIC_TO_EVERYONE", "ai_generated": false },
      "instagram": { "grid": true, "story": true },
      "facebook": { "story": false },
      "youtube": { "title": "Carry-on packing for 10 days", "privacy": "public" }
    }
  }'

This creates five results: a TikTok video, an Instagram Reel, an Instagram Story, a Facebook Reel and a YouTube Short. Each result is one post credit, so this costs 5 credits, or 5 cents at $10 per 1,000. Leave out scheduled_at to publish now.

Per-platform options

TikTok

  • privacy sets who can see the post. It must be one the creator's account allows, from GET /v1/accounts/:id/creator_info.
  • ai_generated applies TikTok's AI-generated content label. Use it for AI avatars and synthetic UGC.
  • title replaces the caption on TikTok only, if you want different text there.
  • draft: true sends the clip to the creator's inbox to finish in the app instead of publishing.

Instagram

  • grid: true shows the Reel on the profile grid as well as the Reels tab.
  • story: true also posts the clip as a Story. That is an extra result and credit.
  • feed: false skips the Reel and posts only the Story.

Facebook

  • Video goes to the Page as a Reel.
  • story: true also posts it as a Page Story, 60 seconds maximum.

YouTube

  • title sets the Short's title, up to 100 characters. Write it for search, since Shorts titles show in YouTube results.
  • privacy is public, unlisted or private.
  • The caption becomes the description. Vertical videos up to 3 minutes are classified as Shorts.

Options for platforms not in the post are ignored, so you can send the same options object every time. Full list in formats and options.

If you build posts in code, keep one options object per client or brand and reuse it. A brand that always discloses paid content, always posts Stories, and always uses the same YouTube privacy then needs only the media, caption and accounts per post. That keeps mistakes like a missing AI label from creeping in when someone new builds the batch.

One click in the dashboard

In the dashboard composer, add the clip, tick accounts on each platform, and fill in the per-platform fields that appear: TikTok privacy and AI label, Instagram Story and grid, YouTube title. The preview shows each placement before you post or schedule.

Results come back per placement

json
{
  "id": "post_abc",
  "status": "scheduled",
  "external_id": "clip-551",
  "results": [
    { "account_id": "acc_tt_01", "platform": "tiktok", "placement": "video", "status": "scheduled", "url": null, "error": null },
    { "account_id": "acc_ig_01", "platform": "instagram", "placement": "reel", "status": "scheduled", "url": null, "error": null },
    { "account_id": "acc_ig_01", "platform": "instagram", "placement": "story", "status": "scheduled", "url": null, "error": null },
    { "account_id": "acc_fb_01", "platform": "facebook", "placement": "reel", "status": "scheduled", "url": null, "error": null },
    { "account_id": "acc_yt_01", "platform": "youtube", "placement": "short", "status": "scheduled", "url": null, "error": null }
  ]
}

Each result publishes or fails on its own. If YouTube rejects the clip, the other four still go out, and the failed one is refunded. You get a post.published or post.failed webhook per result. POST /v1/posts/:id/retry resends only the failed ones. See webhooks.

Same minute or staggered

Posting everywhere at once is simplest. Some teams prefer TikTok first and the rest a few hours later, so they can pull a weak clip before it spreads. That is two posts: one to the TikTok account, and one to the other three with a later scheduled_at. Cancel the second with DELETE /v1/posts/:id if the first flops.

Captions that work on every platform

One caption goes to every platform unless you override it, so write it to travel. Put the hook in the first line, since every app cuts long captions. Keep hashtags to a few relevant ones at the end. Avoid platform words like "link in bio" if the YouTube description will carry it too. Use tiktok.title and youtube.title when a platform needs different words, such as a search-friendly YouTube title.

Checklist before a cross-post

  1. Clip is 9:16 MP4, 3 to 90 seconds, with no watermark.
  2. Each Instagram account is Business or Creator.
  3. TikTok privacy is set to a level the creator allows.
  4. AI-made content has tiktok.ai_generated set to true.
  5. YouTube has a title written for search.
  6. A webhook is set so you hear about failures per platform.

Cross-posting across many creators

For many clips over many accounts, use a campaign with spread: false to send each post to every account, or the default spread: true to rotate posts across accounts. Many teams run one campaign per platform so each gets its own cadence.

FAQ

Can one API call post to all four platforms?

Yes. List accounts from TikTok, Instagram, Facebook and YouTube in the same post. Each account and placement gets its own result.

How many credits does a cross-post use?

One per result. A clip to four platforms is 4 credits, or 5 with an Instagram Story.

What if one platform rejects the video?

Only that result fails and it is refunded. The others publish normally. You can retry the failed result after fixing the cause.

Can I use different captions per platform?

Partly. TikTok has its own title option and YouTube its own title. For fully different captions, create one post per platform.

Can I cross-post a TikTok slideshow to YouTube?

No. YouTube doesn't accept slideshows. Render the slides as a video and post that to Shorts.

Related