RelayAPI

Instagram API

Schedule and automate Instagram posts with RelayAPI — feed posts, carousels, stories, reels, collaborators, and user tags.

Quick Reference

PropertyValue
Platform keyinstagram
Auth methodOAuth 2.0 (via Facebook Business)
Character limit2,200 (caption)
Images per post1 (feed), 10 (carousel)
Videos per post1
Image formatsJPEG, PNG
Image max size8 MB (auto-compressed)
Video formatsMP4, MOV
Video max size300 MB (feed/reels), 100 MB (stories)
Video max duration90 sec (reels), 60 min (feed), 60 sec (story)
Post typesFeed, Carousel, Story, Reel
SchedulingYes
AnalyticsYes (impressions, reach, likes, comments, shares, saves, views)

SDK sourceTypeScript · Python · Go · Java · REST API

Before You Start

Instagram requires a Business or Creator account — personal accounts cannot post via the API. Media is required for all Instagram posts; there are no text-only posts. Google Drive, Dropbox, and OneDrive URLs do not work as media sources because they return HTML pages, not raw media bytes. Always use direct CDN URLs. Instagram enforces a hard limit of 100 posts per 24-hour rolling window across all content types.

Quick Start

Post a photo to your Instagram feed:

import Relay from '@relayapi/sdk';
const client = new Relay();

const post = await client.posts.create({
  content: 'Beautiful sunset today #photography',
  targets: ['instagram'],
  media: [
    { url: 'https://cdn.example.com/sunset.jpg', type: 'image' },
  ],
  scheduled_at: 'now',
});

console.log(post.id); // post_abc123
from relay import Relay

client = Relay()

post = client.posts.create(
    content='Beautiful sunset today #photography',
    targets=['instagram'],
    media=[
        {'url': 'https://cdn.example.com/sunset.jpg', 'type': 'image'},
    ],
    scheduled_at='now',
)

print(post.id)  # post_abc123
client := relaygo.NewClient()

post, err := client.Posts.New(context.TODO(), relaygo.PostNewParams{
    Content:     relaygo.F("Beautiful sunset today #photography"),
    Targets:     relaygo.F([]string{"instagram"}),
    ScheduledAt: relaygo.F("now"),
    Media: relaygo.F([]relaygo.PostNewParamsMedia{
        {URL: relaygo.F("https://cdn.example.com/sunset.jpg"), Type: relaygo.F(relaygo.PostNewParamsMediaTypeImage)},
    }),
})

fmt.Println(post.ID) // post_abc123
RelayClient client = RelayOkHttpClient.fromEnv();

PostCreateResponse post = client.posts().create(PostCreateParams.builder()
    .content("Beautiful sunset today #photography")
    .addTarget("instagram")
    .addMedia(PostCreateParams.Media.builder()
        .url("https://cdn.example.com/sunset.jpg")
        .type(PostCreateParams.Media.Type.IMAGE)
        .build())
    .scheduledAt("now")
    .build());

System.out.println(post.id()); // post_abc123
curl -X POST https://api.relayapi.dev/v1/posts \
  -H "Authorization: Bearer $RELAY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Beautiful sunset today #photography",
    "targets": ["instagram"],
    "media": [
      {"url": "https://cdn.example.com/sunset.jpg", "type": "image"}
    ],
    "scheduled_at": "now"
  }'

Content Types

Feed Post (Single Image)

A single image post on the Instagram feed. Only the first 125 characters are visible before the "more" fold.

const post = await client.posts.create({
  content: 'Beautiful sunset today #photography',
  targets: ['instagram'],
  media: [
    { url: 'https://cdn.example.com/sunset.jpg', type: 'image' },
  ],
  scheduled_at: 'now',
});
post = client.posts.create(
    content='Beautiful sunset today #photography',
    targets=['instagram'],
    media=[
        {'url': 'https://cdn.example.com/sunset.jpg', 'type': 'image'},
    ],
    scheduled_at='now',
)
post, err := client.Posts.New(context.TODO(), relaygo.PostNewParams{
    Content:     relaygo.F("Beautiful sunset today #photography"),
    Targets:     relaygo.F([]string{"instagram"}),
    ScheduledAt: relaygo.F("now"),
    Media: relaygo.F([]relaygo.PostNewParamsMedia{
        {URL: relaygo.F("https://cdn.example.com/sunset.jpg"), Type: relaygo.F(relaygo.PostNewParamsMediaTypeImage)},
    }),
})
PostCreateResponse post = client.posts().create(PostCreateParams.builder()
    .content("Beautiful sunset today #photography")
    .addTarget("instagram")
    .addMedia(PostCreateParams.Media.builder()
        .url("https://cdn.example.com/sunset.jpg")
        .type(PostCreateParams.Media.Type.IMAGE)
        .build())
    .scheduledAt("now")
    .build());
curl -X POST https://api.relayapi.dev/v1/posts \
  -H "Authorization: Bearer $RELAY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Beautiful sunset today #photography",
    "targets": ["instagram"],
    "media": [
      {"url": "https://cdn.example.com/sunset.jpg", "type": "image"}
    ],
    "scheduled_at": "now"
  }'

Mix images and videos in a swipeable carousel. The first item determines the aspect ratio for all items.

const post = await client.posts.create({
  content: 'Trip highlights from last weekend',
  targets: ['instagram'],
  media: [
    { url: 'https://cdn.example.com/photo1.jpg', type: 'image' },
    { url: 'https://cdn.example.com/photo2.jpg', type: 'image' },
    { url: 'https://cdn.example.com/clip.mp4', type: 'video' },
    { url: 'https://cdn.example.com/photo3.jpg', type: 'image' },
  ],
  scheduled_at: 'now',
});
post = client.posts.create(
    content='Trip highlights from last weekend',
    targets=['instagram'],
    media=[
        {'url': 'https://cdn.example.com/photo1.jpg', 'type': 'image'},
        {'url': 'https://cdn.example.com/photo2.jpg', 'type': 'image'},
        {'url': 'https://cdn.example.com/clip.mp4', 'type': 'video'},
        {'url': 'https://cdn.example.com/photo3.jpg', 'type': 'image'},
    ],
    scheduled_at='now',
)
post, err := client.Posts.New(context.TODO(), relaygo.PostNewParams{
    Content:     relaygo.F("Trip highlights from last weekend"),
    Targets:     relaygo.F([]string{"instagram"}),
    ScheduledAt: relaygo.F("now"),
    Media: relaygo.F([]relaygo.PostNewParamsMedia{
        {URL: relaygo.F("https://cdn.example.com/photo1.jpg"), Type: relaygo.F(relaygo.PostNewParamsMediaTypeImage)},
        {URL: relaygo.F("https://cdn.example.com/photo2.jpg"), Type: relaygo.F(relaygo.PostNewParamsMediaTypeImage)},
        {URL: relaygo.F("https://cdn.example.com/clip.mp4"), Type: relaygo.F(relaygo.PostNewParamsMediaTypeVideo)},
        {URL: relaygo.F("https://cdn.example.com/photo3.jpg"), Type: relaygo.F(relaygo.PostNewParamsMediaTypeImage)},
    }),
})
PostCreateResponse post = client.posts().create(PostCreateParams.builder()
    .content("Trip highlights from last weekend")
    .addTarget("instagram")
    .addMedia(PostCreateParams.Media.builder()
        .url("https://cdn.example.com/photo1.jpg")
        .type(PostCreateParams.Media.Type.IMAGE)
        .build())
    .addMedia(PostCreateParams.Media.builder()
        .url("https://cdn.example.com/photo2.jpg")
        .type(PostCreateParams.Media.Type.IMAGE)
        .build())
    .addMedia(PostCreateParams.Media.builder()
        .url("https://cdn.example.com/clip.mp4")
        .type(PostCreateParams.Media.Type.VIDEO)
        .build())
    .addMedia(PostCreateParams.Media.builder()
        .url("https://cdn.example.com/photo3.jpg")
        .type(PostCreateParams.Media.Type.IMAGE)
        .build())
    .scheduledAt("now")
    .build());
curl -X POST https://api.relayapi.dev/v1/posts \
  -H "Authorization: Bearer $RELAY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Trip highlights from last weekend",
    "targets": ["instagram"],
    "media": [
      {"url": "https://cdn.example.com/photo1.jpg", "type": "image"},
      {"url": "https://cdn.example.com/photo2.jpg", "type": "image"},
      {"url": "https://cdn.example.com/clip.mp4", "type": "video"},
      {"url": "https://cdn.example.com/photo3.jpg", "type": "image"}
    ],
    "scheduled_at": "now"
  }'

Story

Stories are ephemeral (24 hours). Text captions are not displayed on stories. Link stickers are not available via the API.

const post = await client.posts.create({
  targets: ['instagram'],
  media: [
    { url: 'https://cdn.example.com/story.jpg', type: 'image' },
  ],
  scheduled_at: 'now',
  target_options: {
    instagram: {
      content_type: 'story',
    },
  },
});
post = client.posts.create(
    targets=['instagram'],
    media=[
        {'url': 'https://cdn.example.com/story.jpg', 'type': 'image'},
    ],
    scheduled_at='now',
    target_options={
        'instagram': {
            'content_type': 'story',
        },
    },
)
post, err := client.Posts.New(context.TODO(), relaygo.PostNewParams{
    Targets:     relaygo.F([]string{"instagram"}),
    ScheduledAt: relaygo.F("now"),
    Media: relaygo.F([]relaygo.PostNewParamsMedia{
        {URL: relaygo.F("https://cdn.example.com/story.jpg"), Type: relaygo.F(relaygo.PostNewParamsMediaTypeImage)},
    }),
    TargetOptions: relaygo.F(map[string]interface{}{
        "instagram": map[string]interface{}{
            "content_type": "story",
        },
    }),
})
PostCreateResponse post = client.posts().create(PostCreateParams.builder()
    .addTarget("instagram")
    .addMedia(PostCreateParams.Media.builder()
        .url("https://cdn.example.com/story.jpg")
        .type(PostCreateParams.Media.Type.IMAGE)
        .build())
    .scheduledAt("now")
    .targetOptions(PostCreateParams.TargetOptions.builder()
        .putAdditionalProperty("instagram", JsonValue.from(Map.of(
            "content_type", "story"
        )))
        .build())
    .build());
curl -X POST https://api.relayapi.dev/v1/posts \
  -H "Authorization: Bearer $RELAY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "targets": ["instagram"],
    "media": [
      {"url": "https://cdn.example.com/story.jpg", "type": "image"}
    ],
    "scheduled_at": "now",
    "target_options": {
      "instagram": {
        "content_type": "story"
      }
    }
  }'

Reel

Vertical video (9:16), max 90 seconds. Reels appear on the Reels tab and optionally on your profile feed.

const post = await client.posts.create({
  content: 'New tutorial!',
  targets: ['instagram'],
  media: [
    { url: 'https://cdn.example.com/reel.mp4', type: 'video' },
  ],
  scheduled_at: 'now',
  target_options: {
    instagram: {
      content_type: 'reels',
      share_to_feed: true,
      first_comment: 'Link in bio!',
    },
  },
});
post = client.posts.create(
    content='New tutorial!',
    targets=['instagram'],
    media=[
        {'url': 'https://cdn.example.com/reel.mp4', 'type': 'video'},
    ],
    scheduled_at='now',
    target_options={
        'instagram': {
            'content_type': 'reels',
            'share_to_feed': True,
            'first_comment': 'Link in bio!',
        },
    },
)
post, err := client.Posts.New(context.TODO(), relaygo.PostNewParams{
    Content:     relaygo.F("New tutorial!"),
    Targets:     relaygo.F([]string{"instagram"}),
    ScheduledAt: relaygo.F("now"),
    Media: relaygo.F([]relaygo.PostNewParamsMedia{
        {URL: relaygo.F("https://cdn.example.com/reel.mp4"), Type: relaygo.F(relaygo.PostNewParamsMediaTypeVideo)},
    }),
    TargetOptions: relaygo.F(map[string]interface{}{
        "instagram": map[string]interface{}{
            "content_type":  "reels",
            "share_to_feed": true,
            "first_comment": "Link in bio!",
        },
    }),
})
PostCreateResponse post = client.posts().create(PostCreateParams.builder()
    .content("New tutorial!")
    .addTarget("instagram")
    .addMedia(PostCreateParams.Media.builder()
        .url("https://cdn.example.com/reel.mp4")
        .type(PostCreateParams.Media.Type.VIDEO)
        .build())
    .scheduledAt("now")
    .targetOptions(PostCreateParams.TargetOptions.builder()
        .putAdditionalProperty("instagram", JsonValue.from(Map.of(
            "content_type", "reels",
            "share_to_feed", true,
            "first_comment", "Link in bio!"
        )))
        .build())
    .build());
curl -X POST https://api.relayapi.dev/v1/posts \
  -H "Authorization: Bearer $RELAY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "New tutorial!",
    "targets": ["instagram"],
    "media": [
      {"url": "https://cdn.example.com/reel.mp4", "type": "video"}
    ],
    "scheduled_at": "now",
    "target_options": {
      "instagram": {
        "content_type": "reels",
        "share_to_feed": true,
        "first_comment": "Link in bio!"
      }
    }
  }'

Post with Collaborators and User Tags

Tag collaborators (up to 3) and users in images. Collaborators receive an invite to co-author the post.

const post = await client.posts.create({
  content: 'Collab post with our partners!',
  targets: ['instagram'],
  media: [
    { url: 'https://cdn.example.com/photo.jpg', type: 'image' },
  ],
  scheduled_at: 'now',
  target_options: {
    instagram: {
      collaborators: ['brandpartner', 'creator123'],
      user_tags: [
        { username: 'friend', x: 0.5, y: 0.5 },
      ],
    },
  },
});
post = client.posts.create(
    content='Collab post with our partners!',
    targets=['instagram'],
    media=[
        {'url': 'https://cdn.example.com/photo.jpg', 'type': 'image'},
    ],
    scheduled_at='now',
    target_options={
        'instagram': {
            'collaborators': ['brandpartner', 'creator123'],
            'user_tags': [
                {'username': 'friend', 'x': 0.5, 'y': 0.5},
            ],
        },
    },
)
post, err := client.Posts.New(context.TODO(), relaygo.PostNewParams{
    Content:     relaygo.F("Collab post with our partners!"),
    Targets:     relaygo.F([]string{"instagram"}),
    ScheduledAt: relaygo.F("now"),
    Media: relaygo.F([]relaygo.PostNewParamsMedia{
        {URL: relaygo.F("https://cdn.example.com/photo.jpg"), Type: relaygo.F(relaygo.PostNewParamsMediaTypeImage)},
    }),
    TargetOptions: relaygo.F(map[string]interface{}{
        "instagram": map[string]interface{}{
            "collaborators": []string{"brandpartner", "creator123"},
            "user_tags": []map[string]interface{}{
                {"username": "friend", "x": 0.5, "y": 0.5},
            },
        },
    }),
})
PostCreateResponse post = client.posts().create(PostCreateParams.builder()
    .content("Collab post with our partners!")
    .addTarget("instagram")
    .addMedia(PostCreateParams.Media.builder()
        .url("https://cdn.example.com/photo.jpg")
        .type(PostCreateParams.Media.Type.IMAGE)
        .build())
    .scheduledAt("now")
    .targetOptions(PostCreateParams.TargetOptions.builder()
        .putAdditionalProperty("instagram", JsonValue.from(Map.of(
            "collaborators", List.of("brandpartner", "creator123"),
            "user_tags", List.of(Map.of(
                "username", "friend",
                "x", 0.5,
                "y", 0.5
            ))
        )))
        .build())
    .build());
curl -X POST https://api.relayapi.dev/v1/posts \
  -H "Authorization: Bearer $RELAY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "Collab post with our partners!",
    "targets": ["instagram"],
    "media": [
      {"url": "https://cdn.example.com/photo.jpg", "type": "image"}
    ],
    "scheduled_at": "now",
    "target_options": {
      "instagram": {
        "collaborators": ["brandpartner", "creator123"],
        "user_tags": [
          {"username": "friend", "x": 0.5, "y": 0.5}
        ]
      }
    }
  }'

Post with First Comment

Automatically post a first comment after publishing. Useful for hashtag blocks or calls to action.

const post = await client.posts.create({
  content: 'New product launch!',
  targets: ['instagram'],
  media: [
    { url: 'https://cdn.example.com/product.jpg', type: 'image' },
  ],
  scheduled_at: 'now',
  target_options: {
    instagram: {
      first_comment: '#newproduct #launch #startup #tech #innovation',
    },
  },
});
post = client.posts.create(
    content='New product launch!',
    targets=['instagram'],
    media=[
        {'url': 'https://cdn.example.com/product.jpg', 'type': 'image'},
    ],
    scheduled_at='now',
    target_options={
        'instagram': {
            'first_comment': '#newproduct #launch #startup #tech #innovation',
        },
    },
)
post, err := client.Posts.New(context.TODO(), relaygo.PostNewParams{
    Content:     relaygo.F("New product launch!"),
    Targets:     relaygo.F([]string{"instagram"}),
    ScheduledAt: relaygo.F("now"),
    Media: relaygo.F([]relaygo.PostNewParamsMedia{
        {URL: relaygo.F("https://cdn.example.com/product.jpg"), Type: relaygo.F(relaygo.PostNewParamsMediaTypeImage)},
    }),
    TargetOptions: relaygo.F(map[string]interface{}{
        "instagram": map[string]interface{}{
            "first_comment": "#newproduct #launch #startup #tech #innovation",
        },
    }),
})
PostCreateResponse post = client.posts().create(PostCreateParams.builder()
    .content("New product launch!")
    .addTarget("instagram")
    .addMedia(PostCreateParams.Media.builder()
        .url("https://cdn.example.com/product.jpg")
        .type(PostCreateParams.Media.Type.IMAGE)
        .build())
    .scheduledAt("now")
    .targetOptions(PostCreateParams.TargetOptions.builder()
        .putAdditionalProperty("instagram", JsonValue.from(Map.of(
            "first_comment", "#newproduct #launch #startup #tech #innovation"
        )))
        .build())
    .build());
curl -X POST https://api.relayapi.dev/v1/posts \
  -H "Authorization: Bearer $RELAY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "content": "New product launch!",
    "targets": ["instagram"],
    "media": [
      {"url": "https://cdn.example.com/product.jpg", "type": "image"}
    ],
    "scheduled_at": "now",
    "target_options": {
      "instagram": {
        "first_comment": "#newproduct #launch #startup #tech #innovation"
      }
    }
  }'

First comments work on feed posts and carousels only. They are not supported on stories or reels.

Media Requirements

Images

PropertyFeedStoryCarousel
Max images1110
FormatsJPEG, PNGJPEG, PNGJPEG, PNG
Max file size8 MB8 MB8 MB each
Recommended1080 x 1350 px1080 x 1920 px1080 x 1080 px

Aspect Ratios

OrientationRatioDimensionsNotes
Portrait4:51080 x 1350 pxBest engagement for feed posts
Square1:11080 x 1080 pxStandard feed and carousel
Landscape1.91:11080 x 566 pxWidest allowed for feed
Vertical9:161080 x 1920 pxStories and Reels only

Feed posts accept aspect ratios between 4:5 (0.8) and 1.91:1. Outside that range, the content must be a Story or Reel.

Videos

PropertyFeedReelStory
FormatsMP4, MOVMP4, MOVMP4, MOV
Max size300 MB300 MB100 MB
Max duration60 min90 sec60 sec
Min duration3 sec3 sec3 sec
Aspect ratio4:5 to 1.91:19:169:16
Recommended1080px wide1080 x 1920 px1080 x 1920 px
CodecH.264H.264H.264

target_options Fields

All fields go inside target_options.instagram on your post request.

FieldTypeDescription
contentstringOverride caption for Instagram specifically
mediaobject[]Override media for Instagram specifically
content_typestring"story" or "reels" (default: feed post)
share_to_feedbooleanReels: also show on profile feed grid (default: true)
collaboratorsstring[]Up to 3 usernames to invite as collaborators (feed and reels only)
user_tagsobject[]{username, x, y, media_index?} — tag users in images. Coordinates are 0-1 range.
first_commentstringAuto-posted first comment (feed and carousels only)
thumb_offsetnumberMillisecond offset for Reel cover thumbnail
audio_namestringCustom audio name for Reels

Common Errors

ErrorCauseFix
Cannot process video from URLCloud storage sharing link used (Drive, Dropbox)Use a direct CDN URL that returns raw media bytes, not an HTML page
100 posts per day limitInstagram hard 24-hour rolling limit reachedReduce posting volume. This limit includes all content types.
Instagram blocked requestAutomation detection triggeredReduce frequency and vary content between posts
Duplicate contentIdentical content posted recentlyModify caption or swap media files
Media fetch failedMedia URL is inaccessible or returns HTMLVerify URL returns actual media bytes with correct Content-Type header
Token expiredOAuth token expired or revokedReconnect the account via the dashboard or Connect API

Known Quirks

  • Media is required for all posts — Instagram does not support text-only posts.
  • Business or Creator account required — personal accounts cannot post via the API.
  • First 125 characters visible before the "more" fold. Front-load your most important message.
  • Google Drive, Dropbox, OneDrive URLs do not work — they return HTML download pages, not media bytes. Always use direct CDN URLs.
  • Stories do not display text captions — text is ignored. Link stickers are not available via the API.
  • Carousel first item determines aspect ratio for all subsequent items in the carousel.
  • Images over 8 MB are auto-compressed by Instagram, which may degrade quality.
  • 100 posts per 24-hour rolling limit includes feed posts, carousels, stories, and reels combined.
  • User tags only work on images — not videos or stories. For carousels, use media_index to target specific slides.

Automations

The automations engine supports Instagram as a Tier 1 platform — both inbound conversational events (DMs, comments, mentions) and outbound send actions.

Triggers

TypeFires onNotes
instagram_dmInbound direct messageRequires Instagram Login app + Messaging API permission
instagram_commentNew comment on a post or reelPayload includes comment_id, post_id, parent_id, text
instagram_story_replyReserved for story repliesNot runtime-supported yet
instagram_story_mentionAccount @-mentioned in a story
instagram_mentionAccount @-mentioned in post/comment
instagram_reactionMessage reaction added/removed
instagram_live_commentComment during a LiveTime-sensitive
instagram_postbackStructured button / ice-breaker postback
instagram_referralUser arrives via an IG Ref URL

Instagram does not expose a follower webhook via the public Graph API. The follow-to-dm template uses a manual trigger — you enroll new followers explicitly via the API or a separate polling job.

Send nodes

All Instagram send nodes hit https://graph.instagram.com/v25.0/{ig-user-id}/messages (or the associated comment endpoints). See the Instagram Messaging API.

NodePurposeRequired fields
instagram_send_textPlain text DMtext (supports merge tags)
instagram_send_mediaImage / video / audio DMurl, media_type (default image)
instagram_send_buttonsButton template (≤3 buttons)text, buttons[] with `type: postback
instagram_send_quick_repliesText + quick-reply chips (≤13)text, quick_replies[] with title, payload?
instagram_send_generic_templateCarousel of cards (≤10)elements[] with title, optional subtitle, image_url, buttons[]
instagram_typingSender actionoff: boolean — true sends typing_off, false sends typing_on
instagram_mark_seenSender action
instagram_reply_to_commentPublic comment replytext (+ optional comment_id; defaults to the trigger's comment_id)
instagram_hide_commentHide a commentcomment_id (+ falls back to trigger's comment_id)

Quick example: comment → DM

await client.automations.templates.commentToDm({
  name: 'Spring launch comment → DM',
  account_id: 'acc_instagram_xyz',
  keywords: ['LINK', 'INFO'],
  match_mode: 'contains',
  dm_message: 'Hey {{first_name}}, here is the link you asked for: https://example.com/offer',
  public_reply: 'Check your DMs! 📨',
  once_per_user: true,
});
curl -X POST https://api.relayapi.dev/v1/automations/templates/comment-to-dm \
  -H "Authorization: Bearer $RELAY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Spring launch comment → DM",
    "account_id": "acc_instagram_xyz",
    "keywords": ["LINK", "INFO"],
    "dm_message": "Here is the link: https://example.com/offer",
    "public_reply": "Check your DMs!"
  }'

Rate limits + constraints

  • Messaging: Instagram enforces the 24-hour customer-service window. Inside 24h of the contact's last message you may DM freely; outside it, only HUMAN_AGENT-tagged messages are allowed (and those require a human-agent UX — not fully automated flows).
  • Comment reply cap: Graph API limits reply volume per post; avoid high-frequency reply bursts.
  • Token routing: Instagram Login tokens (IGAA prefix) route through graph.instagram.com; Facebook-auth legacy tokens use graph.facebook.com. The node handlers use graph.instagram.com by default — reconnect via Instagram Login if you hit a #100 scope error.

Found something wrong? Help us improve this page.

On this page

Submit an Issue
Requires a GitHub account.View repo