Everything the Instagram Graph API asks of you: access prerequisites, the create-container → poll → publish flow, the 50-post daily ceiling, the error codes and the 60-day tokens. Then the shortcut - one POST that publishes Reels, carousels, Stories and photos for you.
✓ 5 minutes to first post ✓ 99.92% uptime ✓ Reels, carousels & Stories
curl https://api.outstand.so/v1/posts/ \
-H "Authorization: Bearer $OUTSTAND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "New drop is live 🔥 #launch",
"accounts": ["YOUR_INSTAGRAM_ACCOUNT_ID"],
"media": [{ "url": "https://media.outstand.so/reel.mp4", "filename": "reel.mp4" }]
}'A video publishes as a Reel automatically. One image → a feed photo. Two-to-ten → a carousel.
Instagram has no simple "post" endpoint. Publishing through the Instagram Graph API means a Business or Creator account, Meta App Review, a two-step create-container → poll → publish flow, publicly-hosted media URLs and tokens that quietly expire. Outstand turns all of it into a single request.
What the official API actually requires, in the order you hit it. Written against the endpoints our own integration calls in production (Graph API v24.0 at the time of writing) - Meta moves fast, so check their changelog before you rely on a version.
graph.instagram.comInstagram Professional accounts that log in with Instagram directly. This is the route Outstand uses.
instagram_business_basic, instagram_business_content_publish, instagram_business_manage_comments, instagram_business_manage_insights
graph.facebook.comApps that already sit on the Meta Business stack and need Page-level access alongside Instagram.
instagram_basic, instagram_content_publish, pages_show_list, pages_read_engagement, business_management
There is no single "post to Instagram" endpoint. Publishing is always two calls with a wait in between, and carousels multiply that by the number of items.
POST /{ig-user-id}/media with image_url or video_url, the caption, and media_type=REELS for video. Returns a creation ID.
GET /{container-id}?fields=status_code until it reports FINISHED. ERROR and EXPIRED are terminal - large videos can transcode for ten minutes or more.
POST /{ig-user-id}/media_publish with creation_id set to the container. Only then does the post exist on Instagram.
Create one child container per item with is_carousel_item=true, then a parent container with media_type=CAROUSEL and the children array, then publish the parent. Meta documents a maximum of 10 items.
media_type=REELS. You can set cover_url or thumb_offset (not both - Meta ignores thumb_offset when cover_url is present) and invite up to 3 collaborators.
media_type=STORIES with a single image or video, no caption and no carousel. In our own integration Meta rejects Stories for Creator accounts - Business only.
# 1. Create the container
curl -X POST "https://graph.instagram.com/v24.0/{ig-user-id}/media" \
-d "media_type=REELS" \
-d "video_url=https://yourcdn.com/launch.mp4" \
-d "caption=Our Q2 launch is live" \
-d "access_token=$IG_LONG_LIVED_TOKEN"
# → { "id": "17..." }
# 2. Poll until the container finishes transcoding
curl "https://graph.instagram.com/v24.0/17...?fields=status_code&access_token=$IG_LONG_LIVED_TOKEN"
# → IN_PROGRESS … FINISHED | ERROR | EXPIRED
# 3. Publish it
curl -X POST "https://graph.instagram.com/v24.0/{ig-user-id}/media_publish" \
-d "creation_id=17..." \
-d "access_token=$IG_LONG_LIVED_TOKEN"
# Check what is left of today's 50-post allowance
curl "https://graph.instagram.com/v24.0/{ig-user-id}/content_publishing_limit?access_token=$IG_LONG_LIVED_TOKEN"Large videos can stay IN_PROGRESS for ten minutes or more, so poll with backoff rather than a fixed sleep. Meta also offers a resumable upload endpoint for reels when you would rather push bytes than host a public URL.
Meta returns these inside an error object with an optional error_subcode, and the message text is often more useful than the code. Log both - the same code 100 covers a typo in a field name and a Story that has already expired.
OAuth hands you a short-lived token. You exchange it for a long-lived token that lasts 60 days, then refresh that token to get another 60 - a refresh only works on a token that is at least 24 hours old and has not already expired. Miss the window and every call comes back as error 190 and your user has to reauthorize. This is the single most common way an Instagram integration breaks in production, because nothing fails until two months after you ship. Outstand refreshes tokens for every connected account so you never see a 190.
Instagram is one of the networks Outstand ships a reviewed OAuth app for. Your users authorize against it, and every requirement above becomes our problem.
Weeks, and the review clock is not yours to control.
curl -X POST https://api.outstand.so/v1/posts/ \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"containers": [
{
"content": "Our Q2 launch is live 🚀",
"media": [
{ "url": "https://media.outstand.so/org_abc/med_abc.mp4", "filename": "launch.mp4" }
]
}
],
"accounts": ["YOUR_INSTAGRAM_ACCOUNT_ID"]
}'One call. We create the container, poll it, publish it, count it against the daily limit and refresh the token. Already through App Review yourself? Drop your own Meta app credentials in and the OAuth screen says your brand instead of ours - the same setup behind our white label social media management platform.
Building an agent instead of an app? The same account works with our Instagram MCP server and our social media API for AI agents.
Every content type and capability available on Instagram via Outstand today.
Plus collaborators (invite up to 3), user tags, location and alt text. Reposting and deleting feed posts are not supported by Instagram's API.
The same accounts array also fans out to X, LinkedIn, TikTok and 8 more - one request, many platforms.
curl https://api.outstand.so/v1/posts/ \
-H "Authorization: Bearer $OUTSTAND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "Behind the scenes of the shoot 🎬 #reels",
"accounts": ["YOUR_INSTAGRAM_ACCOUNT_ID"],
"media": [{ "url": "https://media.outstand.so/bts.mp4", "filename": "bts.mp4" }],
"instagram": { "reelThumbOffset": 1500 }
}'curl https://api.outstand.so/v1/posts/ \
-H "Authorization: Bearer $OUTSTAND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "Swipe for the full lookbook →",
"accounts": ["YOUR_INSTAGRAM_ACCOUNT_ID"],
"media": [
{ "url": "https://media.outstand.so/1.jpg", "filename": "1.jpg" },
{ "url": "https://media.outstand.so/2.jpg", "filename": "2.jpg" },
{ "url": "https://media.outstand.so/3.jpg", "filename": "3.jpg" }
],
"instagram": { "collaborators": ["partner_brand"] }
}'curl https://api.outstand.so/v1/posts/ \
-H "Authorization: Bearer $OUTSTAND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "",
"accounts": ["YOUR_INSTAGRAM_ACCOUNT_ID"],
"media": [{ "url": "https://media.outstand.so/story.jpg", "filename": "story.jpg" }],
"instagram": { "publishAsStory": true }
}'curl https://api.outstand.so/v1/posts/ \
-H "Authorization: Bearer $OUTSTAND_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "Drops Friday at noon ⏰",
"accounts": ["YOUR_INSTAGRAM_ACCOUNT_ID"],
"media": [{ "url": "https://media.outstand.so/teaser.jpg", "filename": "teaser.jpg" }],
"scheduledAt": "2026-07-03T16:00:00Z"
}'curl https://api.outstand.so/v1/posts/{id}/analytics \
-H "Authorization: Bearer $OUTSTAND_API_KEY"
# → impressions, reach, likes, comments, saves, shares, views, engagement_rate# Read the comments on a published Instagram post
curl "https://api.outstand.so/v1/posts/{id}/replies?network=instagram" \
-H "Authorization: Bearer $OUTSTAND_API_KEY"
# Reply to a comment (or comment on your own post)
curl https://api.outstand.so/v1/posts/{id}/replies \
-H "Authorization: Bearer $OUTSTAND_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "content": "Thanks for the love! 🙌", "account_username": "yourbrand" }'From signup to your first published Reel in about five minutes.
Your user authorizes via OAuth. We store and refresh the long-lived token. Use our Managed Keys, or bring your own Meta app for white-label.
Send text and media with accounts: ["YOUR_INSTAGRAM_ACCOUNT_ID"]. Add scheduledAt to schedule it for later.
Container creation, status polling, retries and rate-limit handling - returned as a unified response with the published post ID.
Meta does not bill you for the Instagram Graph API. It bills you in review cycles, account prerequisites and container plumbing - here is what each route actually costs.
Instagram caps content publishing at 50 posts per rolling 24 hours per account. Outstand queues against that ceiling rather than burning your quota on retries.
One integration that grows with everything you ship next.
The same request publishes to Instagram, X, LinkedIn, TikTok and the rest. Same JSON shape everywhere.
Skip Meta App Review with our keys, or bring your own app for white-label OAuth under your brand.
Intelligent rate limiting, automatic token refresh, webhook events and media processing.
$19/mo includes 3,000 posts, then from $0.007/post. No seats, no annual lock-in.
Same endpoints, same data shapes - pick what you ship.
Let your users queue and auto-publish Instagram content from your app.
Give Claude or GPT a tool to post to Instagram. MCP server included.
Pull Instagram reach and engagement alongside every other platform.
Run Instagram posting for clients under your own brand and Meta app.
The questions developers ask before they build.
Meta charges no licence fee and no per-request price for the Instagram API - in that sense it is free. The cost is access: an Instagram Professional account, a Meta app, App Review for the publishing permissions and Business Verification before your first post goes out, then the engineering time around containers, polling and 60-day tokens.
Convert the account to Instagram Professional (Business or Creator), link a Facebook Page, create a Meta app with the Instagram product, then submit App Review for the publishing permissions and complete Business Verification. Until review passes, your app can only act on accounts that hold a role on it. Outstand ships an already-reviewed app, so your users can authorize with OAuth today.
Only to accounts that have a role on your own Meta app while it is in development mode - fine for testing, useless for customers. To publish for anyone else you either pass App Review yourself or authorize against an app that already has, which is what Outstand provides.
Two separate ceilings. The Content Publishing Limit is 50 published posts per rolling 24 hours per Instagram account, readable at GET /{ig-user-id}/content_publishing_limit. On top of that, Meta applies platform rate limiting per app (Business Use Case rate limits), so all of your tenants share one budget. Exceeding either returns error 4 or 613.
Yes. Create the container with media_type=REELS and a public video_url, poll until status_code is FINISHED, then publish it. You can set a cover_url or a thumb_offset - not both - and invite up to 3 collaborators. Outstand does the whole sequence behind one POST /v1/posts/.
Yes, with media_type=STORIES and a single image or video - no captions and no carousels, and the story expires after 24 hours. In our own integration Meta rejects Story publishing for Creator accounts, so a Business account is the safe requirement.
Yes - the Instagram Graph API (part of the Meta Graph API) lets approved apps publish posts, Reels, Stories and read insights for Business and Creator accounts. Outstand is a managed layer on top of it, so you skip the setup.
Yes. Send a video file to POST /v1/posts/ with accounts: ["YOUR_INSTAGRAM_ACCOUNT_ID"] and Outstand publishes it as a Reel - you can set a thumbnail offset and invite collaborators.
Yes. Add a scheduledAt ISO-8601 timestamp (up to 30 days ahead) and Outstand publishes it automatically - no cron or queue on your side.
Yes - Instagram only allows API publishing for Business or Creator accounts (a Meta requirement, not ours). Personal accounts cannot publish via any Instagram API.
Yes. Set instagram.publishAsStory: true with a single image or video. Stories do not support carousels or captions and expire after 24 hours.
With Outstand you do not manage tokens manually - your user connects through OAuth and we store and auto-refresh the long-lived token. Bring your own Meta app for white-label, or use our Managed Keys.
Instagram caps content publishing at 50 published posts per rolling 24 hours per account, and separately applies app-level platform rate limits. Outstand queues and throttles requests under the hood, so you never handle a 429 yourself.
Yes. Read the comments on a published post with GET /v1/posts/{id}/replies and post a reply with POST /v1/posts/{id}/replies. Comment management requires a Business or Creator account.
Not officially - the Graph API is the only sanctioned way to publish. Outstand uses it for you so you get a clean REST endpoint instead of the container-and-polling flow.
Meta charges no licence fee for the Instagram Graph API - the cost is App Review, a linked Facebook Page and the engineering time around the container flow. Outstand costs $19/month including 3,000 posts, then $0.007/post dropping to $0.005 at volume, on an app that is already reviewed.
Free to call, not free to reach. Meta does not bill you per request, but publishing permissions require App Review, a Business or Creator account and a linked Facebook Page before a single post goes out. Outstand removes that setup - you get an API key and publish the same day.
Instagram does not issue a plain API key. You create a Meta app, request the instagram_content_publish permission, pass App Review, then exchange OAuth codes for long-lived tokens that you refresh every 60 days. Outstand gives you one bearer token that works across Instagram and 11 other networks and refreshes the Meta tokens behind it.
Meta shut it down in December 2024. Apps that relied on it had to move to the Instagram Graph API or the Instagram API with Instagram Login. Publishing has always run through the Graph API, which is what Outstand calls on your behalf.
Yes. Send 2 to 10 media items in the media array and Outstand assembles the child containers in order and publishes them as one carousel - including mixed images and video.
Grab an API key and publish your first Reel in the next five minutes. 3,000 posts included, then $0.007/post - dropping to $0.005 at volume.
Read the Instagram setup guide , or see how the same request works on every other platform.