ChirpieDocs
Platforms

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" }'
RouteviaWhat you sign in withWhat it needs
Instagram"instagram" (the default)InstagramAn Instagram professional account (Business or Creator). No Facebook Page
Instagram via Facebook"facebook"FacebookThe 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.

InstagramInstagram via Facebook
Feed posts, carousels, stories, reelsYesYes
Every publishing option belowYesYes
Threads, scheduling, draftsYesYes
Analytics, comments, first commentYesYes
Several accounts from one connectionNoYes, one per linked Page
Delete a published postNo. 501 delete_unsupportedYes

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 switchWhat you gainWhat you lose
Instagram to Instagram via FacebookDELETE /api/v1/posts/{id} takes a post down from InstagramNothing
Instagram via Facebook to InstagramNothingDELETE /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 seeFix
No Facebook Page was sharedStart 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 sharedLink 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?

PlacementWhat it publishesCaptionMediaFirst comment
feed (default)A post on the profile grid, one image or a carouselUp to 2,200 characters1 to 10 imagesYes
storyA story, visible for 24 hoursNone. Send empty textExactly one image or videoNo
reelA reelUp to 2,200 charactersExactly one videoYes

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?

OptionTypePlacementsWhat it does
placement"feed" | "story" | "reel"allWhere the post goes. feed when you do not say
collaboratorsstring[]feed, reelUp 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 }[]allUp to 20 people to tag. x and y are 0 to 1, measured from the left and top edges
coverstring (media id)reelAn 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_msintegerreelA frame of the reel itself to use as its cover, in milliseconds. Use this or cover, never both
share_to_feedbooleanreelWhether the reel also appears on the profile grid
trial_reel{ graduation: "manual" | "performance" }reelPublish 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.

Placementx and y
feedRequired. Both, on every tag
storyOptional. Send both or neither, never one of the two
reelNot 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?

PlacementImagesMax image sizeMax imagesVideoMax video size
feedJPEG, PNG8 MB10 (carousel)Not supportedn/a
storyJPEG, PNG8 MB1MP4, MOV100 MB
reelNot supportedn/a0MP4, MOV300 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 sentWhat comes back
An option this placement does not carry, such as cover on a storyconfiguration_unsupported: "Instagram stories do not take cover. Remove configuration.instagram.cover, or change the placement."
Both cover and video_cover_timestamp_msconfiguration_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 reelconfiguration_unsupported, naming the tag
user_tags on a carouselconfiguration_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 storyconfiguration_unsupported: a story carries no caption. Send the post with empty text
first_comment with a storyconfiguration_unsupported: a story takes no first comment
A story or a reel on POST /api/v1/threadsconfiguration_unsupported: either placement is a single post
An instagram block on a request addressing no Instagram accountconfiguration_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.

On this page