Fit to platform: send any file, once
You send one file and one caption. UGC API checks each destination's rules and makes a version that fits: JPEG for Instagram, the right aspect ratio, captions within limits. Anything it changes or skips is listed in warnings, and a dry run shows them before anything posts.
Updated
What it does for you
| Destination | Platform rule | What UGC API does |
|---|---|---|
| Instagram posts and carousels | JPEG only, aspect 4:5 to 1.91:1 | Converts PNG and WebP to JPEG; pads (or crops) images outside the range |
| Instagram carousels | Up to 10 images | Uses the first 10 and tells you |
| Instagram Stories | JPEG images | Converts PNG and WebP to JPEG |
| Instagram captions | 2,200 characters, 30 hashtags | Keeps the first 30 hashtags, trims at a word |
| TikTok photo posts | JPEG or WebP | Converts PNG to JPEG |
| TikTok video | 3 seconds to 10 minutes | Skips the account for clips outside it |
| Facebook Reels | 3–90 seconds | Skips Facebook for longer clips (it doesn't post a cut version) |
| YouTube | Video only; Shorts up to 3 minutes | Skips YouTube for photo posts; notes when a clip will be a regular video |
| Any vertical placement | 9:16 | Notes landscape videos, which show with bars |
Choose what happens to images that don't fit
Set options.fit on a post or in a campaign's defaults: pad (default, white bars), crop (centre crop) or skip (leave that placement out).
curl https://ugcapi.dev/v1/posts \
-H "Authorization: Bearer ugc_live_..." -H "Content-Type: application/json" \
-d '{
"dry_run": true,
"accounts": ["acc_tt_01", "acc_ig_01", "acc_yt_01"],
"format": "slideshow",
"media": ["https://cdn.example.com/1.png", "https://cdn.example.com/2.webp"],
"caption": "3 things I wish I knew",
"options": { "fit": "crop", "tiktok": { "privacy": "PUBLIC_TO_EVERYONE" } }
}'{
"dry_run": true,
"credits_needed": 2,
"warnings": [
{ "platform": "instagram", "placement": "carousel", "action": "converted", "message": "Image 1: PNG → JPEG, cropped to 4:5 for Instagram carousel." },
{ "platform": "instagram", "placement": "carousel", "action": "converted", "message": "Image 2: WEBP → JPEG for Instagram carousel." },
{ "platform": "tiktok", "placement": "photos", "action": "converted", "message": "Image 1: PNG → JPEG for TikTok photo post." },
{ "platform": "youtube", "placement": "short", "action": "skipped", "message": "YouTube takes video only (Shorts); this photo post skips YouTube." }
]
}Warnings
converted: a version of a file was made for that placement (stored next to the original, reused for later posts).adjusted: the caption or the number of images was changed to fit.skipped: that placement was left out, so no credit is used for it.note: nothing changed, but you may want to know (a landscape video on a vertical feed).POST /v1/postsandPOST /v1/campaignsboth returnwarnings; withdry_run: truethey return them without posting. If nothing is left to post, the request fails withnothing_to_publish.
FAQ
Do I need to resize images for Instagram?
No. Send any JPEG, PNG or WebP. UGC API makes a JPEG in Instagram's 4:5 to 1.91:1 range for Instagram and leaves the other platforms' copies as they are.
What happens to a 2-minute video sent to Facebook Reels?
Facebook Reels can be up to 90 seconds, so that account is skipped with a warning and no credit is used. The other platforms still get it.
Can I see the changes before posting?
Yes. Add dry_run: true to the same request and read warnings.