Instagram API
Use the Crosspostify API to publish photos, Reels, carousels and Stories to Instagram — with scheduling support and multi-account publishing in a single API call.
Instagram is one of the world's largest visual platforms. The Crosspostify Instagram API integration lets you automate publishing of photos, videos (Reels), and carousels — scheduled or immediate — across multiple Instagram accounts from a single REST API call.
This page covers everything specific to Instagram when using the Crosspostify API. For general authentication, rate limits, and error handling, see the full API Reference.
Instagram-Specific Parameters
When targeting an Instagram account in your posts[] array, the following parameters apply. Parameters not listed as applicable are silently ignored for Instagram.
accountId✓ AppliesRequired. The id of the connected Instagram account from GET /social-accounts (Crosspostify's account ID, not the Instagram user ID).caption✓ AppliesOptional. Supports hashtags, emojis and @mentions. Not shown on Stories.title✗ IgnoredNot used for Instagram — ignored.is_aigc✓ AppliesOptional. Adds Instagram's AI label to images, carousels and Reels. Not applied to Stories.instagram✓ AppliesOptional object: Story, trial reel and show-in-feed options. See Instagram Settings below.boardId✗ IgnoredPinterest only — ignored for Instagram.link✗ IgnoredPinterest and Tumblr only — ignored for Instagram.thumbnailTimestamp✗ IgnoredTikTok only — ignored for Instagram.facebookFirstComment✗ IgnoredFacebook only — ignored for Instagram.textFormatPresetId✗ IgnoredFacebook only — ignored for Instagram.tiktok / facebook / youtube✗ IgnoredTikTok / Facebook / YouTube only — ignored for Instagram.Instagram Settings
Add an optional instagram object to a post to publish it as a Story or to control how a Reel is shared. Every field is optional; without the object, images become feed posts and videos become Reels.
On/off options (as_story, share_to_feed and the top-level is_aigc) accept true/false, the strings "true"/"false" (any case) and 1/0. Any other value is rejected with HTTP 400, for example "Invalid instagram.as_story".
instagram.as_storybooleanoptionalPublish as a Story (visible for 24 hours) instead of a feed post or Reel. Works with /post/image (one image) and /post/video (one video; Instagram's limit is 3–60 seconds). Stories show no caption and get no AI label. Story images are scaled to fit 1080×1920 and keep their aspect ratio (no padding). Default: false.
instagram.trial_reelstringoptionalReels only: publish as a trial reel, which Instagram shows to non-followers first. MANUAL = you decide later in Instagram whether to share it with your followers; SS_PERFORMANCE = Instagram shares it with your followers if it performs well. Available to professional accounts that Instagram has enabled for trial reels.
instagram.share_to_feedbooleanoptionalReels only: true shows the Reel in the feed and on the profile grid as well as in the Reels tab; false shows it in the Reels tab only. If omitted, Instagram's default applies (currently: shown in the feed).
Validation (HTTP 400)
trial_reelother thanMANUALorSS_PERFORMANCE: "Invalid instagram.trial_reel"instagramthat is not an object: "Invalid instagram settings"as_story: trueon/post/imageswith more than one image: "A Story takes exactly one image or one video"- An on/off option that is not true/false, "true"/"false" or 1/0: "Invalid instagram.as_story", "Invalid instagram.share_to_feed" or "Invalid is_aigc"
Example: post an image as a Story
curl -X POST "https://v1.api.crosspostify.com/post/image" \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"mediaId": "img_12345",
"posts": [
{
"accountId": "acc_instagram_789",
"caption": "",
"instagram": {
"as_story": true
}
}
]
}'Supported Endpoints
Instagram supports the following Crosspostify API endpoints:
Instagram does not support text-only posts via the Crosspostify API. All posts require a media file (image or video). To post a Story, use /post/image or /post/video with instagram.as_story: true.
/post/videoPublish a video to Instagram as a Reel. Crosspostify always publishes videos as Reels; whether a Reel also appears in the feed is set with instagram.share_to_feed.
Instagram Reel Notes
- Videos are published as Reels — Instagram's primary short-form video format
- Upload your video first via
POST /mediaand use the returnedmediaId captionsupports hashtags, emojis, and @mentions- Recommended aspect ratio: 9:16 (vertical) for Reels; Instagram accepts Reels of 3 seconds to 15 minutes (the 100 MB upload limit usually comes first)
- Trial reels, show-in-feed and Stories are set in the
instagramobject (see Instagram Settings) scheduledDatetakes any ISO 8601 date-time:Zor an offset such as+01:00(converted to UTC). Without an offset it is read as UTC.- Omit
scheduledDateto post immediately (queued)
Request Body
mediaIdstringrequiredThe ID of the uploaded video file. Obtain this from POST /media.
scheduledDatestringoptionalOptional. A future ISO 8601 date-time, e.g. 2030-01-15T10:00:00Z. Offsets such as +01:00 are converted to UTC; a value without offset is read as UTC. Omit it (or send null) to post immediately.
postsarrayrequiredArray of post objects. Include one object per Instagram account you want to post to.
posts[].accountIdstringrequiredThe id of the connected Instagram account from GET /social-accounts (Crosspostify's account ID, not the Instagram user ID).
posts[].captionstringoptionalOptional (default empty). The Reel caption. Supports hashtags, emojis, and @mentions. Max 2,200 characters: longer text is cut; hashtags after the 30th are removed.
posts[].is_aigcbooleanoptionalSet to true to add Instagram's AI label to the Reel. Default: false.
posts[].instagramobjectoptionalInstagram settings: as_story, trial_reel, share_to_feed. See Instagram Settings.
Response (202 Accepted)
status is SCHEDULED when scheduledDate is set, otherwise QUEUED. Publishing happens afterwards: check the result with GET /posts?id=<id>.
Code Example
curl -X POST "https://v1.api.crosspostify.com/post/video" \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"mediaId": "vid_12345",
"scheduledDate": "2030-01-15T10:00:00Z",
"posts": [
{
"accountId": "acc_instagram_789",
"caption": "New Reel just dropped 🎬✨ #reels #instagram #fyp",
"is_aigc": false,
"instagram": {
"share_to_feed": true
}
}
]
}'/post/imagePublish a single photo to Instagram as a standard feed post.
Instagram Photo Notes
- Supported aspect ratios: 1:1 (square), 4:5 (portrait), 1.91:1 (landscape)
- Crosspostify scales each image to fit 1080×1920. Images narrower than 4:5 or wider than 1.91:1 are padded with white bars before posting, never cropped. Crop them yourself to avoid bars.
- Story images (
instagram.as_story: true) are scaled to fit 1080×1920 and keep their aspect ratio (no padding) captionsupports hashtags, emojis, and @mentionsscheduledDatetakes any ISO 8601 date-time:Zor an offset such as+01:00(converted to UTC). Without an offset it is read as UTC.
Request Body
mediaIdstringrequiredThe ID of the uploaded image file. Obtain this from POST /media.
scheduledDatestringoptionalOptional. A future ISO 8601 date-time, e.g. 2030-01-15T10:00:00Z. Offsets such as +01:00 are converted to UTC; a value without offset is read as UTC. Omit it (or send null) to post immediately.
postsarrayrequiredArray of post objects. Include one object per Instagram account.
posts[].accountIdstringrequiredThe id of the connected Instagram account from GET /social-accounts (Crosspostify's account ID, not the Instagram user ID).
posts[].captionstringoptionalOptional (default empty). The photo caption. Supports hashtags, emojis, and @mentions. Max 2,200 characters: longer text is cut; hashtags after the 30th are removed.
posts[].is_aigcbooleanoptionalSet to true to add Instagram's AI label to the photo. Default: false.
posts[].instagramobjectoptionalInstagram settings: as_story (post the image as a Story). See Instagram Settings.
Response (202 Accepted)
status is SCHEDULED when scheduledDate is set, otherwise QUEUED. Publishing happens afterwards: check the result with GET /posts?id=<id>.
Code Example
curl -X POST "https://v1.api.crosspostify.com/post/image" \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"mediaId": "img_12345",
"scheduledDate": "2030-01-15T10:00:00Z",
"posts": [
{
"accountId": "acc_instagram_789",
"caption": "Golden hour never gets old 🌅 #photography #instagram"
}
]
}'/post/imagesPublish a carousel post to Instagram. Carousels let users swipe through up to 10 images in a single post — ideal for product showcases, step-by-step guides, or photo series. A request with one image is posted as a normal photo.
Instagram Carousel Notes
- 1 to 10 images per post (one image is posted as a normal photo)
- Images are displayed in the order provided in
mediaIds - All images in a carousel should share the same aspect ratio
- Supported aspect ratios: 1:1 (square), 4:5 (portrait), 1.91:1 (landscape)
- Each image is scaled to fit 1080×1920 and padded with white bars if it is narrower than 4:5 or wider than 1.91:1 (never cropped)
captionapplies to the whole carousel post, not individual slides- Carousels cannot be posted as a Story
scheduledDatetakes any ISO 8601 date-time:Zor an offset such as+01:00(converted to UTC). Without an offset it is read as UTC.
Request Body
mediaIdsarrayrequiredOrdered array of 1 to 10 image media IDs (one image is posted as a normal photo). Images appear in this order in the carousel.
scheduledDatestringoptionalOptional. A future ISO 8601 date-time, e.g. 2030-01-15T10:00:00Z. Offsets such as +01:00 are converted to UTC; a value without offset is read as UTC. Omit it (or send null) to post immediately.
postsarrayrequiredArray of post objects. Include one object per Instagram account.
posts[].accountIdstringrequiredThe id of the connected Instagram account from GET /social-accounts (Crosspostify's account ID, not the Instagram user ID).
posts[].captionstringoptionalOptional (default empty). The carousel caption. Supports hashtags, emojis, and @mentions. Max 2,200 characters: longer text is cut; hashtags after the 30th are removed.
posts[].is_aigcbooleanoptionalSet to true to add Instagram's AI label to the carousel. Default: false.
Response (202 Accepted)
status is SCHEDULED when scheduledDate is set, otherwise QUEUED. Publishing happens afterwards: check the result with GET /posts?id=<id>.
Code Example
curl -X POST "https://v1.api.crosspostify.com/post/images" \
-H "X-API-Key: your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"mediaIds": [
"img_001", "img_002", "img_003",
"img_004", "img_005"
],
"scheduledDate": "2030-01-15T10:00:00Z",
"posts": [
{
"accountId": "acc_instagram_789",
"caption": "Swipe to see the full collection 👉 #fashion #ootd"
}
]
}'Content Guidelines
Instagram enforces strict media requirements. Images are padded to Instagram's allowed ratios automatically; videos must meet Instagram's specs below.
Instagram allows 50 published posts per account in 24 hours. Crosspostify checks this quota before publishing; when it is used up, the post becomes FAILED with the error "Publishing limit reached for the last 24 hours (usage: N/50)".
Reel (Video) Requirements
- Format: MP4 or MOV (H.264 + AAC recommended)
- Max file size: 100 MB via Crosspostify
- Aspect ratio: 9:16 recommended
- Min resolution: 720×1280px recommended
- Duration: 3 seconds – 15 minutes (Instagram's limit)
Photo Requirements
- Format: JPG, PNG or WEBP (converted to JPEG on upload)
- Max file size: 20 MB via Crosspostify
- Supported ratios: 1:1, 4:5, 1.91:1 (others are padded with white, not cropped)
- Min resolution: 320px on shortest side
- Larger images are scaled down to fit 1080×1920 automatically
Caption Best Practices
- Max 2,200 characters (longer text is cut)
- Max 30 hashtags (extra hashtags are removed automatically)
- @mentions are fully supported
- Line breaks are preserved (unless the caption has more than 30 hashtags)
- Instagram shows only the first lines before "more"; put key text first
Scheduling
- Any future time works: no minimum lead time
- Published within about a minute of the scheduled time
- ISO 8601 with Z or an offset (e.g. +01:00); no offset = UTC
- Omit scheduledDate to post immediately
- No maximum scheduling window
Account Types
The Instagram API (used by Crosspostify under the hood) only supports Business and Creator accounts. Personal Instagram accounts cannot be connected or posted to via the API.
In the Instagram app's settings, switch the account to a professional account (Business or Creator) and follow the prompts. This is free.