Instagram publishing options
Connect an Instagram account through Instagram or through Facebook, and publish to the feed, as a story or as a reel, with collaborators, user tags, reel covers and trial reels.
Updated September 2026
Connecting a new Instagram account is coming soon. Accounts already connected publish, schedule and report analytics exactly as described below.
How do you connect an Instagram account?
Two ways, and you choose. POST /api/v1/accounts with
"platform": "instagram" takes an optional via:
# Sign in with Instagram. This is what happens if you say nothing
curl -X POST https://chirpie.ai/api/v1/accounts \
-H "Authorization: Bearer chirpie_sk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "platform": "instagram", "via": "instagram" }'
# Sign in with Facebook, and connect the Instagram accounts linked to your Pages
curl -X POST https://chirpie.ai/api/v1/accounts \
-H "Authorization: Bearer chirpie_sk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{ "platform": "instagram", "via": "facebook" }'| Route | via | What you sign in with | What it needs |
|---|---|---|---|
"instagram" (the default) | An Instagram professional account (Business or Creator). No Facebook Page | ||
| Instagram via Facebook | "facebook" | The Instagram professional account linked to a Facebook Page you share |
Each connected account reports which route it came from as oauth_variant on
GET /api/v1/accounts: "instagram" or
"facebook".
An unrecognised value is refused before anything starts, with 400 bad_request:
Unknown Instagram connect route 'meta'. Supported: instagram, facebook.
What is different between the two routes?
One thing: whether Chirpie can delete a post it published.
| Instagram via Facebook | ||
|---|---|---|
| Feed posts, carousels, stories, reels | Yes | Yes |
| Every publishing option below | Yes | Yes |
| Threads, scheduling, drafts | Yes | Yes |
| Analytics, comments, first comment | Yes | Yes |
| Several accounts from one connection | No | Yes, one per linked Page |
| Delete a published post | No. 501 delete_unsupported | Yes |
Everything else is identical. No publishing option is accepted on one route and refused on the other.
Which should you pick?
Pick Instagram via Facebook if you want DELETE /api/v1/posts/:id to take a
post down, or if you run several Instagram accounts across several Pages and
want them connected in one go. Pick Instagram if the account is not linked
to a Facebook Page, or you would rather not sign in with Facebook.
Can you switch an account from one route to the other?
Yes, and it is one connect. Connect an account you already have through the
other route and Chirpie moves the connection you already had rather than
adding a second one: it keeps its account id and everything it has published,
and its oauth_variant changes to the route you just used, so what it can do
changes with it. Nothing is scheduled twice, nothing has to be set up again.
Which way you go is the whole difference:
| You switch | What you gain | What you lose |
|---|---|---|
| Instagram to Instagram via Facebook | DELETE /api/v1/posts/{id} takes a post down from Instagram | Nothing |
| Instagram via Facebook to Instagram | Nothing | DELETE /api/v1/posts/{id} answers 501 delete_unsupported again |
Everything else, posting, threads, scheduling, drafts, analytics, comments and the first comment, is identical on both. In the dashboard the Instagram card has a Via Instagram and a Via Facebook button, and the one that would cost you deleting asks before it starts.
Where the two routes report different Instagram accounts, you get a second
entry instead, listed on the same Instagram card. Either way,
GET /api/v1/accounts is the answer: check the id and oauth_variant of what
you have before you post.
Connecting several accounts at once
One Facebook authorization can carry several Pages, and Chirpie connects the
Instagram professional account linked to each of them, one account row per
Page. Accounts beyond your plan's account limit are stored switched off with
inactive_reason: "plan_limit" rather than dropped, and you choose which ones
to activate with
PATCH /api/v1/accounts/{id}.
Send "reconnect": true alongside "via": "facebook" when the person has
authorized before, so Facebook asks again about anything they turned down last
time.
If the connection finds nothing, Chirpie says which case you hit:
| What you see | Fix |
|---|---|
| No Facebook Page was shared | Start again and, in the Facebook window, choose Edit settings, then keep Show a list of the Pages you manage turned on, with every Page you want connected ticked |
| No Instagram professional account is linked to the Pages you shared | Link your Instagram account to the Page in the Instagram app (Settings, then Account type and tools), or connect Instagram on its own instead |
How do you publish an Instagram story or reel through the API?
Send a configuration block with POST /api/v1/posts naming the placement you
want. configuration.instagram.placement takes feed (the default), story
or reel, and everything else Instagram offers hangs off that choice.
curl -X POST https://chirpie.ai/api/v1/posts \
-H "Authorization: Bearer chirpie_sk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"account_id": "550e8400-e29b-41d4-a716-446655440000",
"text": "Behind the scenes of this week.",
"media_urls": ["https://example.com/clip.mp4"],
"configuration": {
"instagram": { "placement": "reel", "share_to_feed": true }
}
}'Leave configuration out and the post publishes to the feed, exactly as it
always did.
What does each placement publish?
| Placement | What it publishes | Caption | Media | First comment |
|---|---|---|---|---|
feed (default) | A post on the profile grid, one image or a carousel | Up to 2,200 characters | 1 to 10 images | Yes |
story | A story, visible for 24 hours | None. Send empty text | Exactly one image or video | No |
reel | A reel | Up to 2,200 characters | Exactly one video | Yes |
A story and a reel are each a single post, so a thread asking for either
placement is refused. Send it with POST /api/v1/posts
instead.
Which options does each placement carry?
| Option | Type | Placements | What it does |
|---|---|---|---|
placement | "feed" | "story" | "reel" | all | Where the post goes. feed when you do not say |
collaborators | string[] | feed, reel | Up to 3 Instagram usernames, without the @, invited as co-authors. The post appears on a collaborator's profile once they accept the invitation on Instagram |
user_tags | { username, x, y }[] | all | Up to 20 people to tag. x and y are 0 to 1, measured from the left and top edges |
cover | string (media id) | reel | An uploaded image to use as the reel's cover. A scheduled reel keeps its own copy, so the cover is still there when it publishes. A draft does not: an uploaded file a draft names as its cover expires on the usual seven-day schedule, and promoting the draft afterwards answers 404 media_not_found naming it |
video_cover_timestamp_ms | integer | reel | A frame of the reel itself to use as its cover, in milliseconds. Use this or cover, never both |
share_to_feed | boolean | reel | Whether the reel also appears on the profile grid |
trial_reel | { graduation: "manual" | "performance" } | reel | Publish as a trial reel, shown to people who do not follow you first. manual waits for you to release it to your followers, performance releases it once Instagram decides it is doing well |
Coordinates on a user tag
The coordinate rule changes with the placement, because Instagram reads the coordinates on some placements and not on others.
| Placement | x and y |
|---|---|
feed | Required. Both, on every tag |
story | Optional. Send both or neither, never one of the two |
reel | Not accepted. Send username on its own |
Tags go on one image. Instagram tags people per picture, and a carousel is
several pictures with one user_tags list between them, so a carousel carrying
tags is refused rather than tagging somebody in a photo they are not in.
What are the media rules per placement?
| Placement | Images | Max image size | Max images | Video | Max video size |
|---|---|---|---|---|---|
feed | JPEG, PNG | 8 MB | 10 (carousel) | Not supported | n/a |
story | JPEG, PNG | 8 MB | 1 | MP4, MOV | 100 MB |
reel | Not supported | n/a | 0 | MP4, MOV | 300 MB |
Instagram requires media on every placement: a call with no media is refused
with 400 bad_request, and the message is worded for the placement ("need one
video file", "need one image or video"). A story and a reel carry no alt text,
so a description sent with one is kept in Chirpie and not published.
What can Chirpie not check before publishing?
Chirpie stores a file's type and its size and never decodes it, so the
following are Instagram's own checks. A file that breaks one of them is refused
by Instagram when the post goes out, and Chirpie passes the reason straight
back as 502 upstream_error.
Stories
- A story video runs from 3 to 60 seconds.
- Instagram shows a story at 9:16 and accepts 0.1:1 to 10:1.
- A story image is 4:5 to 1.91:1, at least 320 pixels wide.
Reels
- A reel runs from 3 seconds to 15 minutes.
- Instagram shows a reel at 9:16 and accepts 0.01:1 to 10:1.
- H.264 or HEVC video and AAC audio, at 23 to 60 frames per second, up to 1920 pixels wide.
- Instagram documents JPEG for a reel cover, up to 8 MB. Chirpie accepts a PNG too and lets Instagram decide.
What is refused, and what does the error say?
Nothing in a configuration block is quietly dropped. An option the platform
or the placement does not carry is refused with 400 configuration_unsupported
naming the field, before anything publishes.
| You sent | What comes back |
|---|---|
An option this placement does not carry, such as cover on a story | configuration_unsupported: "Instagram stories do not take cover. Remove configuration.instagram.cover, or change the placement." |
Both cover and video_cover_timestamp_ms | configuration_unsupported, because Instagram reads the cover image and ignores the timestamp, so one of the two things you asked for would be lost |
A user tag missing x or y on a feed post, or carrying them on a reel | configuration_unsupported, naming the tag |
user_tags on a carousel | configuration_unsupported: Instagram tags people per image, and one list says nothing about which picture a tag belongs to. Tag people on a single-image post |
| Text with a story | configuration_unsupported: a story carries no caption. Send the post with empty text |
first_comment with a story | configuration_unsupported: a story takes no first comment |
A story or a reel on POST /api/v1/threads | configuration_unsupported: either placement is a single post |
An instagram block on a request addressing no Instagram account | configuration_unsupported |
Can a published post be deleted?
It depends on how the account was connected.
On an account connected via Facebook, DELETE /api/v1/posts/:id really
removes the post from Instagram: feed posts, carousels, stories and reels
alike. A carousel is deleted whole, as the one post it is.
On an account connected through Instagram, Chirpie cannot delete a
published post, so the call answers 501 delete_unsupported and nothing
changes:
{
"error": {
"code": "delete_unsupported",
"message": "Chirpie cannot delete posts from an Instagram account connected through Instagram. Delete it in the Instagram app, or connect this account through Facebook to delete posts from Chirpie. The post stays in Chirpie with its history; hide it from your listings with POST /api/v1/posts/{id}/hide if you do not want to see it."
}
}Either way, hiding takes the post out of your Chirpie listings, is reversible, and reaches no platform.
Frequently asked questions
How do I change a queued post from a feed post to a reel?
Send the new block on PATCH /api/v1/posts/:id
while the post is still a draft or still scheduled. The media is checked again
against the new placement, so a reel needs a video attached. configuration: {}
puts the post back to a plain feed post.
Can one request publish a reel to one account and a feed post to another?
Yes. A top-level configuration applies to every Instagram account in the
request, and an entry in account_configurations replaces the whole block for
one account. See Post to several accounts at once.
Do collaborators and tagged people have to accept?
A collaborator does. The post appears on their profile only once they accept the invitation, which happens on Instagram and never through this API. A user tag is applied as the post publishes.
Can a story carry a caption or a first comment?
No. The Instagram story API takes the picture or the video and nothing else, so a story publishes with empty text and no first comment. Put the wording in the image itself.
Can stories and reels be scheduled?
Yes. schedule_at works on every placement, and the placement is stored with
the post, so the scheduler publishes it exactly as you
asked.
Build a Telegram Announcement Bot with the SDK
Use @chirpie/sdk to push deploy notices, changelogs, and release announcements into a Telegram channel from your own code.
Facebook publishing options
Publish a Facebook Page post to the feed or as a Page story, attach a link preview, and know which of the two can be deleted.