---
title: "Instagram"
description: "Publishing to Instagram via the Octopost API"
---

# Instagram

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).

```json
{
  "content": "Beautiful sunset today",
  "platforms": ["instagram"],
  "media": {
    "images": ["https://example.com/sunset.jpg"]
  }
}
```

### Carousels

Up to 10 images or videos in a swipeable carousel:

```json
{
  "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:

```json
{
  "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:

```json
{
  "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`, and `pages_show_list` scopes. 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

```json
{
  "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.
