Quick reference
Connect an account
Instagram has its own OAuth (since the 2024 Instagram Login product) — distinct from Facebook Login. There is no FB fan-out anymore; connecting Instagram does not also connect Facebook.POST /v1/accounts/connect/instagram produces an authorize URL at instagram.com/oauth/authorize. After the user grants, the callback runs three Graph calls:
- Exchange
code→ short-lived token (1 h). - Swap short-lived → long-lived (60 d).
GET /me?fields=id,user_id,username,account_type— the Content Publishing API expectsid(the IG-scoped user id), notuser_id— the provider persistsidasplatformAccountId. Ifaccount_type === "PERSONAL"the connect is rejected.
Scopes
extended scopes (off by default) cover comment + insight reads — not required for publishing.
Token lifecycle
Long-lived tokens last 60 days and are refreshable any time after the first 24 hours viaGET /refresh_access_token. The provider refreshes on schedule; token.expiring fires before expiry.
Post types
Single image
single-image.json
Single video (Reels)
Single-video posts route through theREELS container — Instagram retired the legacy VIDEO product surface in 2024.
reels.json
Carousel (2 – 10, mixed)
Carousel children can mix image and video items.carousel.json
is_carousel_item=true), polls each to FINISHED, then creates a CAROUSEL parent with the child ids and publishes the parent.
Wisdom (platform-specific things that bite)
Common errors
What you can’t do (yet)
- Stories (Stories use a separate
STORIEScontainer type not in v1). - Direct messages.
- First comment as the author.
- Tagging users or product tags.
- Editing or deleting a published post.
- Posting from a Personal Instagram account (Meta’s API restriction — switch to Business or Creator).
- Reading comments, replies, or insights (requires
extendedscopes plus read endpoints not in v1).
API reference
POST /v1/posts— primary publish.POST /v1/media— upload images/videos formediaIdreferences.POST /v1/accounts/connect/instagram— start an Instagram OAuth flow.

