Instagram posting API for Reels, carousels and Stories
UGC API publishes to Instagram professional accounts: Reels, carousels, single images, Stories and multi-frame Story sequences. Send the content once and pick which placements you want.
Updated
Placements you can publish
| You send | Instagram gets | Option |
|---|---|---|
format: 'video' | A Reel | default |
format: 'video' | The Reel also shown on the profile grid | instagram.grid: true |
format: 'video' | The same video as a Story | instagram.story: true |
format: 'slideshow' | A carousel (up to 20 items, cropped to 4:5) | default |
format: 'slideshow' | Story frames, one per slide or just the first | instagram.story: true, story_slides: 'all' | 'first' |
format: 'image' | A single feed image | default, or Story with story: true |
Each Story frame is its own Instagram media object, so each frame counts as one post credit. A 6-slide carousel plus all 6 Story frames is 7 posts. A carousel alone is 1 post. Details are on the Instagram Story API page.
What Instagram requires
- A professional account. Meta's content publishing API only works with Instagram Business and Creator accounts. Personal accounts must switch first. It is free and takes a minute in the Instagram app.
- Public media URLs. Meta fetches the media from a URL at publish time. When you upload to
POST /v1/mediawe host it until 3 days after the last post that uses it. - JPEG images. Meta's publishing docs list JPEG for feed images, so export slides as JPEG.
- A daily publishing limit. Meta limits API-published posts per account in a rolling 24 hours. Its docs currently state 100 in one place and 50 in another, and a carousel counts as one. Plan your volume around the lower number.
Publish a Reel with a Story
curl https://ugcapi.dev/v1/posts \
-H "Authorization: Bearer ugc_live_..." \
-H "Content-Type: application/json" \
-d '{
"accounts": ["acc_ig_01", "acc_ig_02"],
"format": "video",
"media": ["https://cdn.example.com/hook-12.mp4"],
"caption": "I tried this for 30 days #ugc",
"scheduled_at": "2026-11-03T16:00:00Z",
"options": { "instagram": { "grid": true, "story": true } }
}'That call uses 4 credits: a Reel and a Story on each of 2 accounts. Each result in GET /v1/posts/:id carries the permalink per placement.
Why not build it yourself
Instagram publishing is a two-step container flow. You create a media container, poll its status until it is FINISHED, then publish it. Containers expire after 24 hours. Carousels need a child container per slide. On top of that, your Meta app needs App Review for the content publish permission before it can post for accounts you don't own. Our Meta App Review guide and Reels publishing guide cover both paths.
Pricing
$10 per 1,000 posts, with 50 free posts to try. No monthly plan and no fee per connected account. See pricing.
FAQ
Can I post Instagram Stories through the API?
Yes, to professional accounts. Set instagram.story to true on a video, image or slideshow. For slideshows, story_slides chooses all frames or only the first.
Does a carousel count as one post?
Yes. A carousel to one account is one credit. Story frames are extra, one credit per frame, because Instagram creates one Story per frame.
Can I publish to personal Instagram accounts?
No. Meta's publishing API only supports Business and Creator accounts. Switching is free in the Instagram app settings.
What happens if an account hits Instagram's daily limit?
Instagram rejects the extra posts and they fail with platform_rejected. Spread volume across days with a campaign cadence instead.