Instagram: posting rules and settings
What a Instagram channel accepts in Postemi: media, limits, required fields, and the fields of the settings object for the API.
Basics
instagram, instagram-standalonePost types
The same channel accepts more than one kind of post, and each kind has different requirements. The table shows what you need for each.
| Type | Media | Notes |
|---|---|---|
| Feed, one image | 1 image, required | post_type: post. |
| Feed, carousel | 2 or more images | Multiple images automatically become a swipeable carousel. |
| Reels | 1 video | post_type: post, with a video. Instagram decides whether it appears as a Reel. |
| Story | 1 image or video | post_type: story. Only one item is allowed. |
Rules
- There are two kinds of connection. "instagram" is a business account linked to a Facebook Page, "instagram-standalone" is an account connected directly. The settings fields are the same.
- A Story can only go out if the account is allowed to publish Stories on the platform.
Settings fields
These fields go into the post's settings object, alongside the __type field. In the UI, you fill in the same ones in the channel's settings section.
| Field | Type | Required | What it does |
|---|---|---|---|
| post_type | "post" | "story" | yes | Feed post or Story. |
| collaborators | array, each item { label: string } | no | Usernames of collaborator accounts. |
| audio | object | no | The music track ID, optionally with artist, title, and audio and video volume (between 0 and 100). |
| is_trial_reel | boolean | no | Publishes it as a trial Reel. |
| graduation_strategy | "MANUAL" | "SS_PERFORMANCE" | no | For a trial Reel: you move it to the main feed by hand, or it moves automatically based on performance. |
Allowed values
The fields below only accept these values. Any other value returns a 400, and the response names the field.
post_type
| Value | Meaning |
|---|---|
| post | Feed post. |
| story | Story, for 24 hours. |
graduation_strategy
| Value | Meaning |
|---|---|
| MANUAL | You move the trial Reel into the main feed. |
| SS_PERFORMANCE | Instagram moves it if it performs well. |
Examples
Each example is one item in the POST /public/v1/posts request's posts array. The envelope around it is always this:
{
"type": "schedule",
"date": "2026-09-15T09:00:00.000Z",
"shortLink": false,
"posts": [ /* the item below */ ]
}Feed post with one image
{
"integration": { "id": "<instagram-channel>" },
"value": [{
"content": "<p>New in our range.</p>",
"image": [{ "id": "<media>", "path": "https://uploads.posty.hu/image.jpg" }]
}],
"settings": { "__type": "instagram", "post_type": "post" }
}Carousel, with three images
{
"integration": { "id": "<instagram-channel>" },
"value": [{
"content": "<p>Swipe through for the details.</p>",
"image": [
{ "id": "<media-1>", "path": "https://uploads.posty.hu/1.jpg" },
{ "id": "<media-2>", "path": "https://uploads.posty.hu/2.jpg" },
{ "id": "<media-3>", "path": "https://uploads.posty.hu/3.jpg" }
]
}],
"settings": { "__type": "instagram", "post_type": "post" }
}Story
A single image or video. The platform rejects it if there is more than one item.
{
"integration": { "id": "<instagram-channel>" },
"value": [{
"content": "<p>We open today.</p>",
"image": [{ "id": "<media>", "path": "https://uploads.posty.hu/story.jpg" }]
}],
"settings": { "__type": "instagram", "post_type": "story" }
}With a collaborator account
The collaborators items expect usernames, without the @ sign.
{
"integration": { "id": "<instagram-channel>" },
"value": [{
"content": "<p>A joint project.</p>",
"image": [{ "id": "<media>", "path": "https://uploads.posty.hu/image.jpg" }]
}],
"settings": {
"__type": "instagram",
"post_type": "post",
"collaborators": [{ "label": "other_account" }]
}
}The channel ID comes from the channel list, and the path values for images and videos from media upload. The exact schema for the connected account comes from the settings schema endpoint. From the command line, the same thing is the --settings flag. See the CLI examples.