Channels
How an agent publishes to Instagram through uplika: feed, reels and stories, what each takes, and what the API does not offer.
Quick reference
| Name | Type | Description |
|---|---|---|
characters | text | 2,200 |
images | media | up to 10 per post; more than that and the first 10 go out with a warning |
carousel | media | 2-10 items, images and video can be mixed |
video | media | 1 per post |
text alone | media | media required |
posts / 24h | limit | 100 |
deletes / 24h | limit | Instagram only on accounts connected via Facebook, with no documented daily cap |
status | state | live |
These numbers come from the same file the server validates against. Instagram never publishes text alone: every post needs at least one image or video, and only JPEG images go through, so we convert other formats before publishing and leave your original untouched. A feed image has to sit between 4:5 and 1.91:1. One outside that range, such as a 3:4 phone photo, is center-cropped to the nearer of the two on a copy, and the post's warning says how many were cropped.
Two ways to connect, one channel
An Instagram account can connect directly (Instagram login) or through the Facebook Page it is linked to (Facebook login). Both publish the same way. The difference shows up in what else is allowed: deleting a post through uplika works only on accounts connected via Facebook, because the direct login has no delete permission. Liking a post or a comment is the same: it exists only on accounts connected via Facebook. An account connected via Facebook before Meta approved that permission in October 2026 gets it by reconnecting once.
Feed, reel or story?
options.instagram.contentType picks it. Leave it out and a single video becomes a reel and everything else a feed post. A story takes exactly one image or video, shows no caption and takes no first comment. A carousel is two to ten items in one feed post.
Music on reels
options.instagram.audio puts music, or another reel's original sound, on a reel. Find an id with search_instagram_audio (MCP) or GET /v1/channels/instagram/audio for the account you publish to, then pass { "id": "...", "volume": 20, "videoVolume": 100 }. volume is the added audio and videoVolume the video's own sound, each a whole number from 0 to 100; Instagram defaults both to 100, which can drown a voice-over. Audio works on reels only, and only for accounts connected via Facebook. Without a search word you get what is trending for that account; with one, music comes only from Meta's royalty-free Sound Collection. Instagram cannot preview a reel with audio before it is published. The audio plays once from its beginning (the API cannot choose the start) and is not repeated, so pick audio at least as long as the reel.
How do I publish my first post?
Upload an image, then call publish with the media id. contentType is optional.
curl -X POST https://api.uplika.com/v1/posts \
-H "Authorization: Bearer $UPLIKA_KEY" \
-H "Content-Type: application/json" \
-d '{
"content": "Caption under the photo",
"accountIds": ["conn_..."],
"mediaIds": ["med_..."],
"options": { "instagram": { "contentType": "feed", "firstComment": "#hashtags #here" } }
}'What options.instagram takes
| Name | Type | Description |
|---|---|---|
contentType | feed | story | reel | What kind of post. Defaults to reel for a single video and feed otherwise. Stories show no caption and take one image or video. |
shareToFeed | boolean | Reels only. false keeps the reel out of the main feed. |
coverMediaId | string | Media id of a JPEG, PNG or WebP image up to 8MB to use as the reel cover; Uplika sends it to Instagram as a JPEG. Reels only. |
thumbOffsetMs | number | Reel cover frame in milliseconds. Ignored when coverMediaId is set. |
audio | object | Music or a sound from search_instagram_audio to put on a reel. Reels only, and only on Instagram accounts connected via Facebook. Instagram defaults both volumes to 100, which can drown a voice-over; for narration try volume 20 and videoVolume 100. Instagram cannot preview the mix before it is published. The audio plays once from its beginning (you cannot choose the start) and is not repeated, so pick one at least as long as the reel. (API only; the dashboard does not draw it.) |
collaborators | string[] | Up to 3 public professional accounts to invite as collaborators. They appear only after accepting. Not on stories. |
userTags | object[] | Tag accounts on the media. Photos need x and y between 0 and 1; videos take the username alone. mediaIndex picks the carousel slide. (API only; the dashboard does not draw it.) |
isAiGenerated | boolean | Set true to label the media as AI-generated on Instagram. An attached media marked aiGenerated turns this on automatically unless you set it to false. |
firstComment | string | A comment we post right after publishing, often used for hashtags. Not on stories. If it fails the post still goes up, with a warning. |
content | string | Text for this channel only. When set it replaces the shared content for this channel, and the length and media checks use it. Leave it out to use the shared content. |
Generated from the same schema the server validates with. GET /v1/platforms returns it too.
What is not available?
Editing a published post (Instagram has no edit API), direct messages, and deleting on accounts connected with Instagram login. Insights come through get_insights for feed posts and reels; stories expire and report nothing after 24 hours.
Frequently asked
Why was my PNG converted?
Instagram accepts JPEG only. We convert other images to JPEG before publishing and keep your original file as you uploaded it.
Why does my story have no caption?
Stories show no caption at all. If you sent text it was not lost; it simply has no place on a story. Put it in a feed post instead.
Can I delete a post?
Only on accounts connected through Facebook. The Instagram login has no delete permission, so on those accounts delete it in the Instagram app.