Platforms

Instagram

Connect an Instagram professional account, publish photos, carousels, Reels and Stories, moderate comments, answer direct messages and read post and account analytics.

Publish photos, carousels, Reels and Stories, answer comments and direct messages, and read post and account analytics.

Quick Reference

PropertyValue
Account typesBusiness or Creator accounts
Connection methodOAuth, Instagram Login or Facebook Login
Post typesimage, multi_image, video (published as reel), reel, stories
Max media per post10
Text limit2,200 characters
ThreadsNo
QuotesNo
Remote deleteFacebook Login only
Comments
LikesNo
RepostsNo
BookmarksNo
Direct messages
Post analytics
Account analyticsStats and insights

Every post needs media. video and reel publish the same Reel. Deleting posts, catalog audio and the paid partnership label need Facebook Login.

Connect

You need a Business or Creator account, not a personal one. Connect it in Dashboard → Connections, or from your app with a connect session for platform: "instagram", as described in Connect Accounts.

Login Methods

loginMethod defaults to instagram_login. Facebook Login needs a linked Facebook Page and unlocks the extra features below.

FeatureInstagram LoginFacebook Login
Publish, comments, messages, analytics
Catalog audio on ReelsNo
Paid partnership labelNo
Delete published postsNo

On Instagram Login, those options return 400 VALIDATION_ERROR.

import { Configuration, ConnectApi } from "@onepostly/sdk";

const connectApi = new ConnectApi(
  new Configuration({ accessToken: process.env.ONEPOSTLY_API_KEY })
);

const response = await connectApi.createConnectSession({
  createConnectSessionBody: {
    "platform": "instagram",
    "loginMethod": "facebook_login",
    "redirectUrl": "https://app.example.com/onepostly/connected"
  },
});
console.log(response);
{
  "url": "https://www.facebook.com/v26.0/dialog/oauth?client_id=2938475610293847&response_type=code&scope=instagram_basic%2Cinstagram_content_publish%2Cinstagram_manage_comments%2Cinstagram_manage_insights%2Cinstagram_manage_messages%2Cinstagram_manage_contents%2Cpages_show_list%2Cpages_read_engagement%2Cbusiness_management%2Cpublic_profile&state=eyJwIjoiaW5zdGFncmFtIiwibiI6IjNmOWMxYTJiIn0.Xk2pQ8vRt4mN7sL1&auth_type=rerequest",
  "expiresAt": "2027-03-15T09:10:00.000Z"
}

Facebook Login shows an account picker of the Instagram accounts linked to the person's Pages. For your own picker, add headless: true, see Pick a Page or Account. To switch an account to Facebook Login, connect it again.

Permissions

ScopeUsed for
instagram_business_basicId, username and avatar
instagram_business_content_publishPublishing
instagram_business_manage_commentsComments
instagram_business_manage_insightsAnalytics
instagram_business_manage_messagesMessages and private replies

Staying Connected

Access renews itself, so canAutoRenew is true. You only need to reconnect in the cases below, and the account id stays the same.

  • status is not active, or you get TOKEN_INVALID, such as after a password change.
  • A *_PERMISSION code, which a reconnect grants.
  • CONNECTION_BROKEN on Facebook Login, when the Page is unlinked.

Publish

import { Configuration, PostsApi } from "@onepostly/sdk";

const postsApi = new PostsApi(
  new Configuration({ accessToken: process.env.ONEPOSTLY_API_KEY })
);

const response = await postsApi.createPost({
  createPostBody: {
    "text": "Golden hour at the harbor #sunset",
    "mediaKind": "image",
    "media": [
      {
        "url": "https://cdn.onepostly.com/media/harbor.jpg"
      }
    ],
    "accounts": [
      {
        "accountId": "acc_YOUR_INSTAGRAM_ACCOUNT_ID"
      }
    ]
  },
});
console.log(response);
{
  "groupId": "grp_7d2e5b1a9c4f4a68b3e07f1c2d9a6e45",
  "data": [
    {
      "id": "pst_3c8a2d6e91b44f7a8e250d6b4c1f9a73",
      "groupId": "grp_7d2e5b1a9c4f4a68b3e07f1c2d9a6e45",
      "accountId": "acc_YOUR_INSTAGRAM_ACCOUNT_ID",
      "platform": "instagram",
      "source": "onepostly",
      "status": "publishing",
      "text": "Golden hour at the harbor #sunset",
      "mediaKind": "image",
      "media": [
        {
          "url": "https://cdn.onepostly.com/media/harbor.jpg"
        }
      ],
      "thread": [],
      "scheduledFor": null,
      "timezone": null,
      "options": {},
      "platformPostId": null,
      "url": null,
      "error": null,
      "publishedAt": null,
      "metrics": null,
      "createdAt": "2027-03-15T09:00:00.000Z",
      "updatedAt": "2027-03-15T09:00:00.000Z"
    }
  ]
}

Once published, url is the Instagram permalink. See Post Status.

Post Types

mediaKindPublishesMedia
imageFeed photo1 image
multi_imageCarousel2 to 10 images or videos, mixed
video, reelReel1 video
storiesStory, for 24 hours1 image or video
  • Captions go up to 2,200 characters. Stories show no caption.
  • The files set the kind, so set mediaKind only for stories.
  • A Reel always reads mediaKind: "reel", even sent as video.
  • A carousel follows the order of media. Over 10 items fails with INVALID_MULTI_IMAGE.

Reel

A Reel shows on the Reels tab and the grid. shareToFeed: false keeps it off the grid. The cover is coverUrl or the thumbOffset frame, and coverUrl wins. audioName sets a new name for the audio, once.

Reel options work only on reel or video. Elsewhere, including a video in a carousel or Story, they return 400 VALIDATION_ERROR.

import { Configuration, PostsApi } from "@onepostly/sdk";

const postsApi = new PostsApi(
  new Configuration({ accessToken: process.env.ONEPOSTLY_API_KEY })
);

const response = await postsApi.createPost({
  createPostBody: {
    "text": "How we pack an order in 30 seconds",
    "mediaKind": "reel",
    "media": [
      {
        "url": "https://cdn.onepostly.com/media/packing.mp4"
      }
    ],
    "accounts": [
      {
        "accountId": "acc_YOUR_INSTAGRAM_ACCOUNT_ID",
        "instagram": {
          "coverUrl": "https://cdn.onepostly.com/media/packing-cover.jpg",
          "audioName": "Packing day"
        }
      }
    ]
  },
});
console.log(response);
{
  "groupId": "grp_7d2e5b1a9c4f4a68b3e07f1c2d9a6e45",
  "data": [
    {
      "id": "pst_3c8a2d6e91b44f7a8e250d6b4c1f9a73",
      "groupId": "grp_7d2e5b1a9c4f4a68b3e07f1c2d9a6e45",
      "accountId": "acc_YOUR_INSTAGRAM_ACCOUNT_ID",
      "platform": "instagram",
      "source": "onepostly",
      "status": "publishing",
      "text": "How we pack an order in 30 seconds",
      "mediaKind": "reel",
      "media": [
        {
          "url": "https://cdn.onepostly.com/media/packing.mp4"
        }
      ],
      "thread": [],
      "scheduledFor": null,
      "timezone": null,
      "options": {
        "instagram": {
          "coverUrl": "https://cdn.onepostly.com/media/packing-cover.jpg",
          "audioName": "Packing day"
        }
      },
      "platformPostId": null,
      "url": null,
      "error": null,
      "publishedAt": null,
      "metrics": null,
      "createdAt": "2027-03-15T09:00:00.000Z",
      "updatedAt": "2027-03-15T09:00:00.000Z"
    }
  ]
}

Story

A Story takes only userTags. Any other option returns 400 VALIDATION_ERROR. Stories have no comments, so a comment list returns UNSUPPORTED_MEDIA.

import { Configuration, PostsApi } from "@onepostly/sdk";

const postsApi = new PostsApi(
  new Configuration({ accessToken: process.env.ONEPOSTLY_API_KEY })
);

const response = await postsApi.createPost({
  createPostBody: {
    "mediaKind": "stories",
    "media": [
      {
        "url": "https://cdn.onepostly.com/media/flash-sale.jpg"
      }
    ],
    "accounts": [
      {
        "accountId": "acc_YOUR_INSTAGRAM_ACCOUNT_ID"
      }
    ]
  },
});
console.log(response);
{
  "groupId": "grp_7d2e5b1a9c4f4a68b3e07f1c2d9a6e45",
  "data": [
    {
      "id": "pst_3c8a2d6e91b44f7a8e250d6b4c1f9a73",
      "groupId": "grp_7d2e5b1a9c4f4a68b3e07f1c2d9a6e45",
      "accountId": "acc_YOUR_INSTAGRAM_ACCOUNT_ID",
      "platform": "instagram",
      "source": "onepostly",
      "status": "publishing",
      "text": "",
      "mediaKind": "stories",
      "media": [
        {
          "url": "https://cdn.onepostly.com/media/flash-sale.jpg"
        }
      ],
      "thread": [],
      "scheduledFor": null,
      "timezone": null,
      "options": {},
      "platformPostId": null,
      "url": null,
      "error": null,
      "publishedAt": null,
      "metrics": null,
      "createdAt": "2027-03-15T09:00:00.000Z",
      "updatedAt": "2027-03-15T09:00:00.000Z"
    }
  ]
}

Options

Options go under instagram. On the wrong media kind, they return 400.

Prop

Type

firstComment, commentsEnabled, collaborators, locationId, isAiGenerated and the paid partnership fields work on photos, carousels and Reels. If Instagram refuses firstComment or commentsEnabled, the post still publishes.

Tags and Location

userTags takes a username, @ optional, and x and y from 0 to 1, from the top left. A photo needs x and y. Without them it passes on create but fails at publish. They are optional on Stories and ignored on Reels.

locationId and tags cover a whole carousel.

import { Configuration, PostsApi } from "@onepostly/sdk";

const postsApi = new PostsApi(
  new Configuration({ accessToken: process.env.ONEPOSTLY_API_KEY })
);

const response = await postsApi.createPost({
  createPostBody: {
    "text": "Opening night with the team",
    "mediaKind": "image",
    "media": [
      {
        "url": "https://cdn.onepostly.com/media/opening.jpg"
      }
    ],
    "accounts": [
      {
        "accountId": "acc_YOUR_INSTAGRAM_ACCOUNT_ID",
        "instagram": {
          "userTags": [
            {
              "username": "studio.north",
              "x": 0.32,
              "y": 0.6
            }
          ],
          "collaborators": [
            "studio.north"
          ],
          "locationId": "110843418940484"
        }
      }
    ]
  },
});
console.log(response);
{
  "groupId": "grp_7d2e5b1a9c4f4a68b3e07f1c2d9a6e45",
  "data": [
    {
      "id": "pst_3c8a2d6e91b44f7a8e250d6b4c1f9a73",
      "groupId": "grp_7d2e5b1a9c4f4a68b3e07f1c2d9a6e45",
      "accountId": "acc_YOUR_INSTAGRAM_ACCOUNT_ID",
      "platform": "instagram",
      "source": "onepostly",
      "status": "publishing",
      "text": "Opening night with the team",
      "mediaKind": "image",
      "media": [
        {
          "url": "https://cdn.onepostly.com/media/opening.jpg"
        }
      ],
      "thread": [],
      "scheduledFor": null,
      "timezone": null,
      "options": {
        "instagram": {
          "userTags": [
            {
              "username": "studio.north",
              "x": 0.32,
              "y": 0.6
            }
          ],
          "collaborators": [
            "studio.north"
          ],
          "locationId": "110843418940484"
        }
      },
      "platformPostId": null,
      "url": null,
      "error": null,
      "publishedAt": null,
      "metrics": null,
      "createdAt": "2027-03-15T09:00:00.000Z",
      "updatedAt": "2027-03-15T09:00:00.000Z"
    }
  ]
}

Trial Reels

trialReel: true shows a Reel to non-followers first.

trialGraduationStrategyFollowers see it when
manual (default)You share it in the Instagram app
ss_performanceIt performs well

A trial Reel with sponsors fails with INVALID_TRIAL_REEL.

Catalog Audio

audioId adds a track to a Reel on Facebook Login. Find ids with Search Instagram Audio. Omit q for trending tracks or set type=original_sound.

import { Configuration, PostsApi } from "@onepostly/sdk";

const postsApi = new PostsApi(
  new Configuration({ accessToken: process.env.ONEPOSTLY_API_KEY })
);

const response = await postsApi.createPost({
  createPostBody: {
    "text": "Weekend mood",
    "mediaKind": "reel",
    "media": [
      {
        "url": "https://cdn.onepostly.com/media/beach.mp4"
      }
    ],
    "accounts": [
      {
        "accountId": "acc_YOUR_INSTAGRAM_ACCOUNT_ID",
        "instagram": {
          "audioId": "587784541076604",
          "audioVolume": 80,
          "videoVolume": 30
        }
      }
    ]
  },
});
console.log(response);
{
  "groupId": "grp_7d2e5b1a9c4f4a68b3e07f1c2d9a6e45",
  "data": [
    {
      "id": "pst_3c8a2d6e91b44f7a8e250d6b4c1f9a73",
      "groupId": "grp_7d2e5b1a9c4f4a68b3e07f1c2d9a6e45",
      "accountId": "acc_YOUR_INSTAGRAM_ACCOUNT_ID",
      "platform": "instagram",
      "source": "onepostly",
      "status": "publishing",
      "text": "Weekend mood",
      "mediaKind": "reel",
      "media": [
        {
          "url": "https://cdn.onepostly.com/media/beach.mp4"
        }
      ],
      "thread": [],
      "scheduledFor": null,
      "timezone": null,
      "options": {
        "instagram": {
          "audioId": "587784541076604",
          "audioVolume": 80,
          "videoVolume": 30
        }
      },
      "platformPostId": null,
      "url": null,
      "error": null,
      "publishedAt": null,
      "metrics": null,
      "createdAt": "2027-03-15T09:00:00.000Z",
      "updatedAt": "2027-03-15T09:00:00.000Z"
    }
  ]
}

On Facebook Login, isPaidPartnership: true adds the label. brandedContentSponsors adds it with up to 2 named sponsors.

A sponsor username must be a public professional account, or the post fails with INVALID_SPONSOR. A numeric id always works.

import { Configuration, PostsApi } from "@onepostly/sdk";

const postsApi = new PostsApi(
  new Configuration({ accessToken: process.env.ONEPOSTLY_API_KEY })
);

const response = await postsApi.createPost({
  createPostBody: {
    "text": "Our new spring line, made with Fieldwork",
    "mediaKind": "multi_image",
    "media": [
      {
        "url": "https://cdn.onepostly.com/media/spring-1.jpg"
      },
      {
        "url": "https://cdn.onepostly.com/media/spring-2.jpg"
      }
    ],
    "accounts": [
      {
        "accountId": "acc_YOUR_INSTAGRAM_ACCOUNT_ID",
        "instagram": {
          "brandedContentSponsors": [
            "fieldwork.co"
          ]
        }
      }
    ]
  },
});
console.log(response);
{
  "groupId": "grp_7d2e5b1a9c4f4a68b3e07f1c2d9a6e45",
  "data": [
    {
      "id": "pst_3c8a2d6e91b44f7a8e250d6b4c1f9a73",
      "groupId": "grp_7d2e5b1a9c4f4a68b3e07f1c2d9a6e45",
      "accountId": "acc_YOUR_INSTAGRAM_ACCOUNT_ID",
      "platform": "instagram",
      "source": "onepostly",
      "status": "publishing",
      "text": "Our new spring line, made with Fieldwork",
      "mediaKind": "multi_image",
      "media": [
        {
          "url": "https://cdn.onepostly.com/media/spring-1.jpg"
        },
        {
          "url": "https://cdn.onepostly.com/media/spring-2.jpg"
        }
      ],
      "thread": [],
      "scheduledFor": null,
      "timezone": null,
      "options": {
        "instagram": {
          "brandedContentSponsors": [
            "fieldwork.co"
          ]
        }
      },
      "platformPostId": null,
      "url": null,
      "error": null,
      "publishedAt": null,
      "metrics": null,
      "createdAt": "2027-03-15T09:00:00.000Z",
      "updatedAt": "2027-03-15T09:00:00.000Z"
    }
  ]
}

Media Requirements

These are Instagram's limits, on top of the Media URL Requirements.

MediaFormatsMax size
ImagesJPEG8 MB
ReelsMP4 and MOV300 MB
Story videosMP4 and MOV100 MB
Carousel videosMP4 and MOV1 GB

A file outside these formats and sizes is refused. See Platform Limits.

Images

PropertyRequirement
Aspect ratio4:5 to 1.91:1 on feed and carousel
Width320 to 1440, resized outside it
Common sizes1080 × 1350, 1080 × 1080, 1080 × 566
Stories1080 × 1920 (9:16)

A 3:4 image, such as 1080 × 1440, is too narrow for the feed.

Videos

PropertyReelStory
Duration3 s to 15 min3 to 60 s
Aspect ratio9:169:16
Max width19201920
VideoH.264 or HEVC, 23 to 60 fpsSame
AudioAAC, up to 48 kHzSame

A URL ending in .mp4, .mov, .m4v, .webm or .avi is a video, anything else an image. Slow processing fails with MEDIA_PROCESSING_TIMEOUT.

Scheduling, Editing and Deleting

Scheduling and editing work as usual. Published posts cannot be edited.

Only Facebook Login can delete a published post, including one made outside Onepostly. Instagram Login returns MEDIA_DELETE_UNSUPPORTED, so delete it in the app.

Engagement

See Comments for the requests. Instagram has no likes, reposts or bookmarks.

ActionSupportedNotes
List commentsNot on Stories, which return UNSUPPORTED_MEDIA
Comment or replyUp to 2,200 characters
Delete a commentOn the account's own media
Hide or unhide
Private replyOne per comment, within 7 days, up to 1,000 characters
Like a commentNoUNSUPPORTED_PLATFORM
Like, repost, bookmarkNoUNSUPPORTED_PLATFORM

Outside posts work once synced. New comments send comment.received.

import { Configuration, CommentsApi } from "@onepostly/sdk";

const commentsApi = new CommentsApi(
  new Configuration({ accessToken: process.env.ONEPOSTLY_API_KEY })
);

const response = await commentsApi.sendPrivateReply({
  id: "cmt_YOUR_COMMENT",
  privateReplyBody: {
    "text": "Hi! Here is the size chart you asked about."
  },
});
console.log(response);
{
  "id": "aWdfZAG1faXRlbToxOklHTWVzc2FnZAUlEOjE3ODQxNDAwMTIzNDU2Nzg5OjM0MDI4MjM2Njg0MTcxMDMwMTI0NDI1OTc5NjAzNjg0NTQ0NDQ1NgZDZD",
  "commentId": "cmt_YOUR_COMMENT",
  "text": "Hi! Here is the size chart you asked about.",
  "createdAt": "2027-03-15T10:00:00.000Z"
}

Inbox

Both logins have an inbox. See Inbox for the requests and rich messages.

ActionSupportedNotes
List and readmuted is always false
Start a conversationBy username or user id
Send textUp to 1,000 characters, within 24 hours
Rich messagesAttachments, quick replies, buttons, cards
AutomationsA comment_to_dm uses the comment's private reply
Outside the 24-hour windowNo

Use a username for public professional accounts, or else a senderId.

import { Configuration, InboxApi } from "@onepostly/sdk";

const inboxApi = new InboxApi(
  new Configuration({ accessToken: process.env.ONEPOSTLY_API_KEY })
);

const response = await inboxApi.createConversation({
  id: "acc_YOUR_INSTAGRAM_ACCOUNT_ID",
  createConversationBody: {
    "recipient": "17841400987654321"
  },
});
console.log(response);
{
  "id": "cnv_BBh0Fb9Jm3kot2rw9sXz01Wph6BsppQzHdFeEz3M57nTn5Hq1Vaxue9BreJNIcZngbmoCxHC",
  "accountId": "acc_YOUR_INSTAGRAM_ACCOUNT_ID",
  "members": [
    {
      "id": "17841400123456789",
      "username": null,
      "displayName": null
    },
    {
      "id": "17841400987654321",
      "username": null,
      "displayName": null
    }
  ],
  "muted": false,
  "unreadCount": 0,
  "lastMessage": null
}

A new conversation opens with its first message. Until then you get CONVO_NOT_FOUND. The person must have written in the last 24 hours, or you get MESSAGE_WINDOW_EXPIRED and must wait for them to write.

With attachmentUrl, Instagram shows only the attachment and not your text, so send anything important as its own message.

Inbox webhooks cover received, sent, read, reactions, postbacks and unsent messages. Their conversationId may differ from List Conversations, and both work everywhere. See Conversation Ids for which call returns which.

Analytics

Metrics

FieldInstagram metricNotes
impressionsviewsInstagram dropped impressions
reachreachUnique accounts
viewsviews
likeslikesnull on Stories
commentscommentsnull on Stories
sharesshares
savessavednull on Stories
engagementtotal_interactionsA count. Else the sum of the four

A metric the media type lacks is null, not 0.

Read Post Analytics

import { Configuration, AnalyticsApi } from "@onepostly/sdk";

const analyticsApi = new AnalyticsApi(
  new Configuration({ accessToken: process.env.ONEPOSTLY_API_KEY })
);

const response = await analyticsApi.getPostAnalytics({
  id: "pst_YOUR_INSTAGRAM_POST",
});
console.log(response);
{
  "postId": "pst_YOUR_INSTAGRAM_POST",
  "accountId": "acc_1699f4157fb643f49d2ac447491f32a8",
  "platform": "instagram",
  "status": "ready",
  "metrics": {
    "impressions": 2140,
    "reach": 1630,
    "likes": 184,
    "comments": 21,
    "shares": 9,
    "saves": 37,
    "views": 2140,
    "engagement": 251
  },
  "fetchedAt": "2027-03-15T10:00:00.000Z",
  "error": null
}

Outside posts work once synced. A fresh post often reads pending. A deleted one reads unavailable with POST_NOT_FOUND, for good. Posts follow the shared freshness. Stories update about hourly while live, then keep their last values.

Account Stats

Get Account Stats returns the account's live counts. videoCount counts all media, photos included. likesCount is always null.

Account Insights

Get Account Analytics reads insights live. By default it returns views, reach, accounts_engaged and total_interactions. See Account Insights.

import { Configuration, AnalyticsApi } from "@onepostly/sdk";

const analyticsApi = new AnalyticsApi(
  new Configuration({ accessToken: process.env.ONEPOSTLY_API_KEY })
);

const response = await analyticsApi.getAccountAnalytics({
  id: "acc_YOUR_INSTAGRAM_ACCOUNT_ID",
  metrics: "follower_demographics",
  period: "lifetime",
  breakdown: "country",
  timeframe: "this_month",
});
console.log(response);
{
  "accountId": "acc_YOUR_INSTAGRAM_ACCOUNT_ID",
  "platform": "instagram",
  "metrics": [
    {
      "name": "follower_demographics",
      "period": "lifetime",
      "values": []
    }
  ],
  "demographics": {
    "follower_demographics": {
      "US": 4120,
      "GB": 1380,
      "DE": 960,
      "TR": 845,
      "BR": 610
    }
  }
}
ParameterInstagram values
metricsUp to 20 Instagram metric names
periodday (default), week, days_28, lifetime
breakdownage, city, country, gender, or a metric's own breakdown
timeframethis_week or this_month
metricTypetotal_value or time_series
  • Demographics are follower_demographics and engaged_audience_demographics.
  • They need period=lifetime, a breakdown and a timeframe.
  • follower_count and online_followers come only as a daily series.
  • Leave out metricType to get each metric in its native form.
  • A value Instagram refuses returns 400 VALIDATION_ERROR with its reason.

Recent Posts

List Account Media lists recent posts with likes and comments. Their shares and views are null. Add kind=stories for active Stories.

import { Configuration, AccountsApi } from "@onepostly/sdk";

const accountsApi = new AccountsApi(
  new Configuration({ accessToken: process.env.ONEPOSTLY_API_KEY })
);

const response = await accountsApi.listAccountMedia({
  id: "acc_YOUR_INSTAGRAM_ACCOUNT_ID",
  kind: "stories",
});
console.log(response);
{
  "data": [
    {
      "id": "18063412987650214",
      "title": null,
      "description": null,
      "coverUrl": "https://scontent.cdninstagram.com/v/t51.29350-15/story-thumbnail.jpg",
      "url": "https://www.instagram.com/stories/yourbrand/3581234567890123456/",
      "createdAt": "2027-03-15T08:30:00.000Z",
      "durationSec": null,
      "metrics": {
        "likes": null,
        "comments": null,
        "shares": null,
        "views": null
      }
    },
    {
      "id": "18047129563820471",
      "title": null,
      "description": null,
      "coverUrl": null,
      "url": "https://www.instagram.com/stories/yourbrand/3580987654321098765/",
      "createdAt": "2027-03-14T19:05:00.000Z",
      "durationSec": null,
      "metrics": {
        "likes": null,
        "comments": null,
        "shares": null,
        "views": null
      }
    }
  ],
  "nextCursor": null,
  "hasMore": false
}

Limitations

Not available for Instagram through Onepostly.

  • Text-only posts
  • Editing a published post
  • Likes, reposts, quotes, bookmarks and threads
  • Comments on Stories
  • Story stickers, product tags and Live
  • Messages outside the 24-hour window
  • Deletes, catalog audio and paid partnership on Instagram Login

Errors

Breaking a rule on this page returns 400 VALIDATION_ERROR and creates nothing. Instagram's own limits are checked at publish and fail the post. The tables below list the Instagram codes, and every code is in Errors.

Publish Errors

CodeCauseFix
INVALID_MULTI_IMAGEOver 10 carousel itemsSend 2 to 10
INVALID_TRIAL_REELA trial Reel with sponsorsDrop the sponsors
INVALID_AUDIOaudioId, but the account moved to Instagram LoginReconnect with Facebook Login
INVALID_SPONSORA sponsor is not public and professional, or the account moved to Instagram LoginUse a numeric id, or Facebook Login
INVALID_MEDIAInstagram rejected the fileSee Media Requirements
CONTAINER_FAILEDInstagram could not process the mediaCheck format, size and dimensions
MEDIA_PROCESSING_TIMEOUTThe video took too longUse a smaller or shorter file
MEDIA_DELETE_UNSUPPORTEDA delete on Instagram LoginUse Facebook Login, or the app
DELETE_PERMISSIONInstagram refused the deleteReconnect with Facebook Login
PUBLISH_FAILEDInstagram rejected the postRead error.message

Engagement and Inbox Errors

CodeCauseFix
UNSUPPORTED_MEDIAThe post is a StoryUse a photo, carousel or Reel
UNSUPPORTED_PLATFORMA like, repost or bookmarkNot offered on Instagram
COMMENTS_PERMISSIONA missing permission, or not your mediaReconnect, or delete only your own
PRIVATE_REPLY_FAILEDA second reply, or after 7 daysOne per comment, within 7 days
RECIPIENT_NOT_FOUNDThe username is not public and professionalUse the numeric user id
RECIPIENT_UNREACHABLEThe person blocked or turned off messagesWait for them to write
CONVO_NOT_FOUNDNo conversation, or no message yetSend the first message
MESSAGE_WINDOW_EXPIREDTheir last message is over 24 hours oldWait for them to write
CONNECTION_BROKENFacebook Login lost its PageReconnect and pick the Page

Analytics Errors

CodeCauseFix
ANALYTICS_PENDINGNo metrics yetRead again later
POST_NOT_FOUNDDeleted on InstagramNone, this is final
VALIDATION_ERRORInstagram refused an insights parameterFix the one in the message
STATS_FAILEDStats did not loadRead again later