You’ve decided to automate Instagram publishing, either with a scheduler or with an integration your developer builds. That’s when the questions start, and every landing page answers them with the same cheerful “we support everything”: Can it post Stories? Add music to Reels? Handle a PNG? Fix a caption after publishing?

The real answers are scattered across Meta’s developer docs and shift every few months. Here’s the 2026 summary: what the Instagram Content Publishing API actually supports, exact file specs, how publishing works under the hood, what’s missing by design, and how to read the errors. The difference between the official API and “grey” tools that ask for your password is covered in our Instagram auto-posting guide; this article goes one level deeper.

Who can use the API and what you need

Only professional accounts, Business or Creator, can publish through the API. A personal profile can’t be connected at all; that’s a Meta restriction, not a tool’s limitation.

There are two ways to authorize:

  • Instagram Login (introduced in 2024). The account connects directly, no Facebook Page required. Permissions: instagram_business_basic and instagram_business_content_publish.
  • Facebook Login. The classic route through an Instagram account linked to a Facebook Page. Permissions: instagram_basic and instagram_content_publish, plus the Page permissions.

For your own integration you’ll need an app in Meta for Developers. In development mode only accounts with a role on the app can publish, which is plenty for a single shop or studio, no App Review needed. A tool for clients must pass Meta’s review: weeks of back-and-forth and a recorded screencast.

Access tokens live for 60 days and must be refreshed. A decent scheduler does this silently; if your home-grown script “suddenly stopped posting” two months in, the token expired.

How publishing works: container first, then publish

A post is never sent in a single request. There are always two steps:

  1. Create a container. POST /{ig-user-id}/media with a link to the file, the caption and parameters. You get back a container ID.
  2. Publish. POST /{ig-user-id}/media_publish with that ID. Only now does the post appear in the feed.

For photos the two steps run back to back and take seconds. For video and Reels there’s processing in between: the container sits in IN_PROGRESS and can only be published once it reaches FINISHED, usually 30–120 seconds, longer for lengthy Reels. ERROR and EXPIRED mean there’s nothing to publish: a container lives 24 hours, after that you start over.

The big practical consequence: you can’t upload a file directly. The API only accepts a public URL: your image or video has to sit on a server Instagram can reach by direct link, and a Google Drive “share” link doesn’t count. The one exception is Reels, which support resumable upload in chunks. This is why every scheduler first copies your media into its own storage and serves it to Instagram from there. Asking where your files are stored and for how long is a fair question.

What you can publish and the exact file specs

FormatFileRequirements
Feed photoJPEG onlyup to 8 MB, aspect ratio 4:5 to 1.91:1, width 320–1440 px, sRGB
ReelsMP4 or MOVH.264 or HEVC video, AAC audio, 23–60 fps, 3 seconds to 15 minutes, up to 1 GB, 9:16 recommended
Carousel2–10 itemsphotos and videos can be mixed; carousel videos up to 60 seconds
Storiesphoto or videovideo up to 60 seconds, vertical 9:16

Two things trip people up most. First: PNG and HEIC are rejected. iPhone photos come out as HEIC, and either the tool converts them or you do. Second: a 1:1 square passes, but a 2:3 vertical (the default camera ratio) has to be cropped to 4:5.

Captions: up to 2,200 characters, 30 hashtags, 20 @mentions. Beyond the caption, the API accepts:

  • alt text for photos (alt_text);
  • a location via location_id (the Facebook Page ID of the place, not coordinates);
  • people tags on photos with x/y coordinates;
  • collaborators (up to 3 accounts), who get an invite in the app and show the post in their profile once accepted;
  • a Reels cover, either your own image (cover_url) or a frame at a chosen second (thumb_offset), plus share_to_feed to keep the Reel out of the main feed.

If a tool advertises “Reels support” but you can’t pick a cover, test that first during the trial. The cover on your grid decides whether anyone taps the video a month later.

Limits: 50 posts and 200 calls

50 published posts per rolling 24 hours per account. Rolling is the key word: post 50 times between 10 am and 11 pm and the quota won’t reset at midnight. It frees up one slot at a time as each post turns 24 hours old. A carousel counts as one post; Stories count toward the same limit. Check the remaining quota with GET /{ig-user-id}/content_publishing_limit, which returns quota_usage. For a single account, 50 a day is a ceiling only news publishers ever approach.

The call limit is roughly 200 requests per hour per connected user. For publishing it barely matters: one post costs 2–3 calls (create container, check status, publish). For analytics it matters a lot: a tool that refreshes stats for 30 posts every five minutes hits this limit long before the publishing one.

What the API can’t do, and no tool can work around

An honest 2026 list. If a service promises any of this “through the official API”, it’s either doing it by hand or not through the API.

  • Interactive Stories. No polls, quizzes, sliders, link, music or mention stickers. Through the API a Story is just an image or a video; “swipe up” has to be baked into the design.
  • Music from Instagram’s library in Reels. The audio has to be in the file already, which means you need the rights to it.
  • Filters and effects. Process the video before uploading.
  • Editing and deleting. A post published via the API can’t be edited or deleted via the API, only by hand in the app. Proofread the caption before publishing, not after.
  • Scheduling itself. The API publishes “now”. A scheduled post is a queue on the tool’s side: if its server goes down at 7 pm, your 7 pm post doesn’t go out. Ask how retries work and whether you get notified.
  • Promoting a post. Ads live in a separate Marketing API with its own permissions and review.

What the API does offer and people forget: replying to and hiding comments, reading mentions, and pulling post and account stats. Moderation and analytics can be built on it too, the way the tools in our SMM automation overview do.

Common errors and what they mean

Graph API messages are terse, so here’s a translation of the most frequent ones:

  • “Media type is not supported”: you sent PNG, HEIC, WebP or GIF. Convert to JPEG (photo) or MP4 (video).
  • “The aspect ratio is not supported”: proportions outside 4:5–1.91:1. Crop.
  • “Media URL is not accessible”: the link isn’t public or redirects. Open it in an incognito window. If the image doesn’t load instantly, Instagram won’t see it either.
  • Status ERROR on video: usually the codec (VP9, WebM), frame rate above 60 or bitrate above 25 Mbps. Re-encode to H.264 at 30 fps.
  • “Application request limit reached”: you hit 50 posts in 24 hours or the call limit. Check content_publishing_limit and wait.
  • “Invalid OAuth access token”: the token expired or access was revoked. Reconnect the account.

A real case: a Brooklyn coffee roaster “lost” every second post for three weeks because iPhone photos arrived as HEIC and the tool silently dropped them. A tool that converts and shows the error in plain words fixed it in an evening.

Checklist for choosing a scheduler

Seven questions to ask before paying, or to check on a free plan:

  1. Does it connect via OAuth, with no Instagram password? If it asks for a password, it isn’t the API.
  2. Does it convert HEIC/PNG to JPEG and crop to 4:5 on its own?
  3. Can you pick a Reels cover and turn off feed sharing?
  4. Are carousels with video and Stories supported?
  5. Are alt text, location and collaborators available?
  6. What happens when a publish fails: retry, notification, and where does it arrive?
  7. Can you see the remaining 50-post quota, and does the tool warn you in advance?

How to avoid a block even on the official API, what checkpoints look like, which signals Instagram treats as suspicious and how to warm up a new account: that’s a separate article, Instagram auto-posting without a ban.

Repost21 works with Instagram only through the official Graph API: photos, videos, Reels with a cover, carousels and Stories. Media is converted and hosted on the service side, a failed publish triggers a Telegram bot notification, and the Luna assistant helps with the caption before it becomes uneditable. Per-platform details are in the docs, and you can try it free.