Publishing to Instagram via the Octopost API
Instagram supports feed images, carousels, Reels, and Stories -- but no text-only posts. Every post must include at least one image or video. Octopost handles Meta's container creation, media processing, carousel assembly, and Reel cover images automatically -- you just send us your content with the media attached.
Content Limits
| Constraint | Limit |
|---|---|
| Caption | 2,200 characters |
| Hashtags | 30 per post (exceeding this may cause silent failures) |
| Carousel items | 10 images or videos |
| Reel duration | 3 seconds to 15 minutes |
| Reel aspect ratio | 9:16 (1080x1920 recommended) |
| Story expiry | 24 hours |
| Image formats | JPEG, PNG |
| Video formats | MP4, MOV |
| Media URLs | Must be publicly accessible |
Good to Know
- No text-only posts. This is Instagram's biggest constraint. If you send a post to Instagram without any media, Octopost will return an error immediately:
"Instagram requires at least one image or video. Text-only posts are not supported." - 30 hashtags is a hard ceiling. Going over 30 can cause the post to fail silently on Instagram's side, or reduce visibility. Octopost warns you if you exceed this.
- Captions don't support clickable links. URLs in captions appear as plain text. Instagram does not make them tappable. This is a platform limitation, not an Octopost one.
- Carousel items should share an aspect ratio. Mixed aspect ratios will be cropped by Instagram. For best results, keep all items consistent (1:1, 4:5, or 1.91:1).
- Media must be at a public URL. Instagram fetches images and videos from the URLs you provide. They must be accessible from Meta's servers -- no auth-gated or localhost URLs.
- Stories disappear after 24 hours. This is by design. Stories are not permanent feed content.
- Instagram Business or Creator account required. Users connect their Instagram through Octopost's account settings. Personal accounts cannot use the Instagram API. The account also needs to be linked to a Facebook Page (even if the Page is unused).
- You must specify the post type. Tell Octopost whether you're creating a feed post, carousel, Reel, or Story so it can use the correct publishing flow.
Platform-Specific Features
Feed Images
Single image or multi-image posts to the main feed. Recommended aspect ratios: 1:1 (square), 4:5 (portrait), 1.91:1 (landscape).
{
"content": "Beautiful sunset today",
"platforms": ["instagram"],
"media": {
"images": ["https://example.com/sunset.jpg"]
}
}Carousels
Up to 10 images or videos in a swipeable carousel:
{
"content": "Trip highlights",
"platforms": ["instagram"],
"media": {
"images": [
"https://example.com/day1.jpg",
"https://example.com/day2.jpg",
"https://example.com/day3.jpg"
]
}
}Octopost creates each child container, assembles the parent carousel container, and publishes it all from this single request.
Reels
Vertical video posts. Use 9:16 aspect ratio at 1080x1920 for best results:
{
"content": "Quick tutorial",
"platforms": ["instagram"],
"media": {
"video": "https://example.com/tutorial.mp4"
},
"instagram": {
"post_type": "reel"
}
}Octopost handles Reel-specific container creation and cover image processing.
Stories
Ephemeral content that expires after 24 hours:
{
"platforms": ["instagram"],
"media": {
"images": ["https://example.com/promo.jpg"]
},
"instagram": {
"post_type": "story"
}
}Rate Limits
Instagram's rate limits are tied to Meta's Graph API quotas. Octopost tracks your usage and paces requests to stay within safe limits.
Things Octopost Handles for You
You don't need to worry about any of this, but in case you're curious:
- Facebook OAuth flow. Instagram API access goes through Facebook's OAuth system with
instagram_basic,instagram_content_publish, andpages_show_listscopes. Octopost manages the full connection, including linking the Instagram account to the required Facebook Page. - Two-step container publishing. Like Threads, Instagram requires creating a media container first, then publishing it in a separate API call. Octopost handles both steps seamlessly.
- Processing status polling. After creating a container, Instagram may need time to process the media before it can be published. Octopost polls the container status and only publishes once processing is complete, so you never hit a "media not ready" error.
- Carousel item assembly. Each carousel item must be created as its own child container, then a parent container is created referencing all children. Octopost builds this entire chain from the flat list of URLs you provide.
- Reel cover images. Reels can have a custom cover image. Octopost handles the cover image container and attachment if you provide one.
- Content validation. Octopost validates the 2,200-character caption limit, the 30-hashtag limit, and the media requirement before sending anything to Meta, giving you immediate feedback instead of opaque API errors.
- Error reporting. If something fails -- media URL not accessible, account not properly connected, missing media for a required-media platform -- Octopost reports exactly what went wrong.
Example
{
"content": "New product launch! Check out the full collection.",
"platforms": ["instagram"],
"media": {
"images": ["https://example.com/product.jpg"]
}
}That's it. Octopost takes care of the rest.