> **Building with AI coding agents?** Install the authstack plugin with one command. This equips your agent with accurate Scalekit implementation patterns.
>
> **Recommended** (the `-y` flags skip prompts, so the command runs without an interactive terminal):
> ```bash
> npx -y @scalekit-inc/cli setup -y
> ```
>
> Global:
> ```bash
> npm install -g @scalekit-inc/cli
> scalekit setup -y
> ```
>
> Supports Claude Code, Cursor, GitHub Copilot, Codex + skills for other Agent Skills-compatible agents in `~/.agents/skills`.
> Skills: integrate-agentkit, implement-saaskit, add-mcp-oauth, implement-sso, implement-scim.
> [Full setup guide](https://docs.scalekit.com/dev-kit/build-with-ai/)

---

# Connect AI agents to Instagram

The Instagram connector lets your AI agent act in each user's Instagram account. Each user signs in to Instagram once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 30 tools.

**Authentication:** OAuth 2.0
**Categories:** Marketing, Communication
**Tools:** 30: 21 read, 8 write, 1 destructive
**Users sign in with:** OAuth
**OAuth app:** Your own Instagram app
**Built by:** Scalekit connector
**Try it:** [Playground in the Scalekit dashboard](https://app.scalekit.com/ws/signup?sk_intent=playground&provider=INSTAGRAM)

## Setup

1. ### Install the SDK

   **Node.js**

   ```bash
   npm install @scalekit-sdk/node dotenv
   ```

   **Python**

   ```bash
   pip install scalekit-sdk-python python-dotenv
   ```

2. ### Set your credentials

   Add your Scalekit credentials to your `.env` file. Find values in **[app.scalekit.com](https://app.scalekit.com)** > **Developers** > **API Credentials**.

   ```sh title=".env"
   SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
   SCALEKIT_CLIENT_ID=<your-client-id>
   SCALEKIT_CLIENT_SECRET=<your-client-secret>
   ```

3. ### Create the Instagram connection

   In **AgentKit > Connections**, create an Instagram connection and copy its redirect URI. The name you give it is the `connection_name` your code passes. See [Configure connections](/agentkit/connections/).

4. ### Register an OAuth app

   Instagram connections use your own OAuth app. Register one with Instagram and add the redirect URI you copied.

   Then enter the app's Client ID and Client Secret on the Instagram connection.

   **Console steps with screenshots:**

   Create a Meta app with Facebook Login enabled so Scalekit can authorize access to your Instagram Business or Creator account on behalf of your users. You'll register the Scalekit redirect URI in the app, then add the app's ID and secret to your Scalekit connection.

   1. ### Create or open a Meta app

      - Go to the [Meta for Developers](https://developers.facebook.com/apps) dashboard.
      - Select an existing app or click **Create App** and choose the **Business** app type.

        > Image: Meta app dashboard showing app ID, app mode, and available products

   2. ### Add the Instagram Graph API and Facebook Login products

      - From the app's **Add Product** page, add **Instagram Graph API** so the app can read and publish content on Instagram Business and Creator accounts.
      - Add **Facebook Login** as well, since Scalekit uses it to run the OAuth authorization flow.

        > Image: App switcher dropdown for selecting or creating a Meta app

   3. ### Copy the redirect URI from Scalekit

      - In the [Scalekit dashboard](https://app.scalekit.com), go to **AgentKit** > **Connections** > **Create Connection**. Find **Instagram** and click **Create**.

        > tip: Testing vs. production
        >
        > By default, Scalekit creates the connection using its own shared credentials. This works for testing. Before going to production, follow the steps below to use your own Meta app.

      - Click **Use your own credentials** and copy the redirect URI. It looks like `https://<SCALEKIT_ENVIRONMENT_URL>/sso/v1/oauth/<CONNECTION_ID>/callback`.

   4. ### Add the redirect URI to Facebook Login settings

      - In your Meta app, go to **Facebook Login** > **Settings**.
      - Paste the redirect URI you copied into **Valid OAuth Redirect URIs** and save changes.

        > Image: Facebook Login settings showing the Valid OAuth Redirect URIs list

   5. ### Copy your App ID and App secret

      - Go to **App settings** > **Basic**.
      - Copy the **App ID** and click **Show** to reveal and copy the **App secret**.

        > Image: App settings Basic page showing App ID and App secret fields

   6. ### Add credentials in Scalekit

      - Return to the connection you created in Scalekit and enter:
        - **Client ID** — your Meta app's App ID
        - **Client Secret** — your Meta app's App secret
      - Click **Save**.

        > note: Account type requirement
        >
        > The Instagram account must be a Business or Creator account connected to a Facebook Page. Personal accounts can't authorize this connection.

5. ### Authorize a user and make your first call

   **Node.js** (`quickstart.mts`)

   ```typescript
   import { ScalekitClient } from '@scalekit-sdk/node'
   import 'dotenv/config'
   import { createInterface } from 'node:readline/promises'

   const scalekit = new ScalekitClient(
     process.env.SCALEKIT_ENVIRONMENT_URL,
     process.env.SCALEKIT_CLIENT_ID,
     process.env.SCALEKIT_CLIENT_SECRET,
   )
   const actions = scalekit.actions

   const connector = 'instagram'
   const identifier = 'user_123'

   // Generate an authorization link for the user
   const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
   console.log('Authorize Instagram:', link)
   const rl = createInterface({ input: process.stdin, output: process.stdout })
   await rl.question('Press Enter after authorizing...')
   rl.close()

   // Make your first call
   const result = await actions.executeTool({
     connector,
     identifier,
     toolName: 'instagram_comment_replies_list',
     toolInput: { comment_id: 'YOUR_COMMENT_ID' },
   })
   console.log(result)
   ```

   ```bash
   npx tsx quickstart.mts
   ```

   **Python** (`quickstart.py`)

   ```python
   import os
   from scalekit import ScalekitClient
   from dotenv import load_dotenv
   load_dotenv()

   scalekit_client = ScalekitClient(
       env_url=os.getenv("SCALEKIT_ENVIRONMENT_URL"),
       client_id=os.getenv("SCALEKIT_CLIENT_ID"),
       client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
   )
   actions = scalekit_client.actions

   connection_name = "instagram"
   identifier = "user_123"

   # Generate an authorization link for the user
   link_response = actions.get_authorization_link(
       connection_name=connection_name,
       identifier=identifier,
   )
   print("Authorize Instagram:", link_response.link)
   input("Press Enter after authorizing...")

   # Make your first call
   result = actions.execute_tool(
       tool_input={"comment_id":"YOUR_COMMENT_ID"},
       tool_name="instagram_comment_replies_list",
       connection_name=connection_name,
       identifier=identifier,
   )
   print(result)
   ```

   ```bash
   python quickstart.py
   ```

   Each user signs in once. See [Authorize a user](/agentkit/tools/authorize/) for the full flow and statuses.

## Tools

Pass the exact name to `execute_tool`, with an input like each tool's example. To ask for a tool that's missing, use the [request form](https://scalekitsupport.portal.usepylon.com/forms/request-a-connector-tool).

**Node.js**

```typescript
const result = await actions.executeTool({
  toolName: 'instagram_account_insights_get',
  toolInput: {
    ig_user_id: '<ig_user_id>',
    metric: '<metric>',
  },
  connector: 'instagram',
  identifier: 'user_123',
})
```

**Python**

```python
result = actions.execute_tool(
    tool_name="instagram_account_insights_get",
    tool_input={
        "ig_user_id": "<ig_user_id>",
        "metric": "<metric>",
    },
    connection_name="instagram",
    identifier="user_123",
)
```

`result.data` is the app's response as JSON, and `result.execution_id` (`executionId` in Node.js) is the ID of the call.

### `instagram_account_insights_get`

Get Account Insights · Read-only

Get account-level Instagram insights (impressions, reach, profile views, follower count) over a period or date range.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ig_user_id` (`string`, required): The Instagram professional account ID.
- `metric` (`string`, required): Comma-separated list of metric names to retrieve.
- `period` (`string`, optional): Aggregation period for the metrics.
- `since` (`integer`, optional): Start of the date range (Unix timestamp).
- `until` (`integer`, optional): End of the date range (Unix timestamp).

Example input: `{"ig_user_id":"<ig_user_id>","metric":"<metric>"}`

### `instagram_business_discovery_get`

Get Business Discovery · Read-only

Look up the public profile and recent media of any other Instagram professional (Business or Creator) account by username, without needing to connect that account.
Returns username, name, website, followers_count, media_count, biography, profile_picture_url, and recent media summaries for the target account.
Use this for competitor or influencer research. Use instagram_user_get_profile instead when looking up the connected account's own profile.
Requires the connected account's ig_user_id and the instagram_basic permission; the target account must itself be a public Business or Creator account.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ig_user_id` (`string`, required): The connected Instagram professional account's ID performing the lookup.
- `target_username` (`string`, required): The Instagram username of the other public Business or Creator account to look up (without the @ symbol).

Example input: `{"ig_user_id":"<ig_user_id>","target_username":"<target_username>"}`

### `instagram_comment_replies_list`

List Comment Replies · Read-only

List replies to a specific Instagram comment, cursor-paginated.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `comment_id` (`string`, required): The Instagram comment ID to list replies for.
- `after` (`string`, optional): Pagination cursor to fetch the next page of results.
- `fields` (`string`, optional): Comma-separated list of fields to return per reply.
- `limit` (`integer`, optional): Max number of replies to return per page.

Example input: `{"comment_id":"<comment_id>"}`

### `instagram_comments_list`

List Media Comments · Read-only

List top-level comments on an Instagram media object, cursor-paginated.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `media_id` (`string`, required): The Instagram media ID to list comments on.
- `after` (`string`, optional): Pagination cursor to fetch the next page of results.
- `fields` (`string`, optional): Comma-separated list of fields to return per comment.
- `limit` (`integer`, optional): Max number of comments to return per page.

Example input: `{"media_id":"<media_id>"}`

### `instagram_content_publishing_limit_get`

Get Content Publishing Limit · Read-only

Check how much of the Instagram account's daily content publishing quota has been used.
Returns the configured quota (config) and current usage count (quota_usage) — accounts can typically publish up to 25 posts within a rolling 24-hour window.
Use this before a bulk-publishing run to confirm quota is available, avoiding failed instagram_media_publish calls.
Requires the account's ig_user_id and the instagram_content_publish permission.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ig_user_id` (`string`, required): The Instagram professional account ID to check the publishing quota for.
- `fields` (`string`, optional): Comma-separated list of fields to return. Defaults to config and quota_usage. Default: `config,quota_usage`.

Example input: `{"ig_user_id":"<ig_user_id>"}`

### `instagram_conversation_messages_list`

List Conversation Messages · Read-only

List the messages within a single Instagram Direct conversation.
Returns the conversation id along with a messages array containing each message's id, created_time, from, to, and text.
Use this after instagram_conversations_list to read a specific thread's message history.
Requires the conversation_id from instagram_conversations_list and the instagram_manage_messages permission.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `conversation_id` (`string`, required): The ID of the conversation to fetch messages for, from instagram_conversations_list.
- `fields` (`string`, optional): Comma-separated list of fields to return, typically the nested messages field expansion. Default: `messages{id,created_time,from,to,message}`.

Example input: `{"conversation_id":"<conversation_id>"}`

### `instagram_conversations_list`

List Conversations · Read-only

List Instagram Direct conversations for a connected professional account.
Returns a paginated array of conversations with id, updated_time, and participants.
Use this to see who has messaged the account. Use instagram_conversation_messages_list to fetch the messages inside one conversation.
Requires the instagram_manage_messages permission.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ig_user_id` (`string`, required): The Instagram professional account ID whose Direct conversations should be listed.
- `fields` (`string`, optional): Comma-separated list of conversation fields to return per item. Default: `id,updated_time,participants`.
- `limit` (`integer`, optional): Maximum number of conversations to return in this page. Default: `25`.

Example input: `{"ig_user_id":"<ig_user_id>"}`

### `instagram_hashtag_recent_media_list`

List Hashtag Recent Media · Read-only

List the most recent public media posts tagged with a given Instagram hashtag.
Returns a paginated array of media objects with id, caption, media_type, media_url, permalink, and timestamp.
Use this to monitor fresh activity around a hashtag. Use instagram_hashtag_top_media_list for the hashtag's most popular posts instead.
Requires the hashtag_id from instagram_hashtag_search and the account's ig_user_id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `hashtag_id` (`string`, required): The ID of the hashtag to fetch recent media for, from instagram_hashtag_search.
- `ig_user_id` (`string`, required): The Instagram professional account ID performing the query.
- `fields` (`string`, optional): Comma-separated list of media fields to return per item. Default: `id,caption,media_type,media_url,permalink,timestamp`.

Example input: `{"hashtag_id":"<hashtag_id>","ig_user_id":"<ig_user_id>"}`

### `instagram_hashtag_search`

Search Hashtag · Read-only

Look up an Instagram hashtag by name to get its hashtag ID.
Returns the hashtag's id, which is required by instagram_hashtag_recent_media_list and instagram_hashtag_top_media_list.
Use this first when you only know the hashtag text (e.g. "travel") and need its ID for further hashtag queries.
Requires the account's ig_user_id (queries are scoped per-account) and the hashtag name without the leading # symbol.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `hashtag` (`string`, required): The hashtag name to search for, without the leading # symbol.
- `ig_user_id` (`string`, required): The Instagram professional account ID performing the search.

Example input: `{"hashtag":"<hashtag>","ig_user_id":"<ig_user_id>"}`

### `instagram_hashtag_top_media_list`

List Hashtag Top Media · Read-only

List the most popular public media posts tagged with a given Instagram hashtag.
Returns a paginated array of media objects with id, caption, media_type, media_url, permalink, and timestamp.
Use this for competitive or trend analysis of a hashtag's top-performing content. Use instagram_hashtag_recent_media_list for the newest posts instead.
Requires the hashtag_id from instagram_hashtag_search and the account's ig_user_id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `hashtag_id` (`string`, required): The ID of the hashtag to fetch top media for, from instagram_hashtag_search.
- `ig_user_id` (`string`, required): The Instagram professional account ID performing the query.
- `fields` (`string`, optional): Comma-separated list of media fields to return per item. Default: `id,caption,media_type,media_url,permalink,timestamp`.

Example input: `{"hashtag_id":"<hashtag_id>","ig_user_id":"<ig_user_id>"}`

### `instagram_media_children_list`

List Media Children · Read-only

List the child media items (photos/videos) inside an Instagram carousel album post.
Returns an array of child media objects with id, media_type, media_url, and permalink.
Use this to enumerate a carousel's individual items directly. instagram_media_get with fields=children{...} returns the same data inline if you're already fetching the parent post.
Requires the media_id of a CAROUSEL_ALBUM item, typically obtained from instagram_media_list.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `media_id` (`string`, required): The ID of the parent CAROUSEL_ALBUM media item whose children should be listed.
- `fields` (`string`, optional): Comma-separated list of fields to return per child media item. Default: `id,media_type,media_url,permalink,timestamp`.

Example input: `{"media_id":"<media_id>"}`

### `instagram_media_container_status_get`

Get Container Status · Read-only

Poll the processing status of a media container before publishing it — required for video/reels containers, which process asynchronously.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `container_id` (`string`, required): The media container ID to check.

Example input: `{"container_id":"<container_id>"}`

### `instagram_media_get`

Get Media · Read-only

Get details of a single Instagram media object (image, video, carousel, or reel) by ID.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `media_id` (`string`, required): The Instagram media ID.
- `fields` (`string`, optional): Comma-separated list of fields to return.

Example input: `{"media_id":"<media_id>"}`

### `instagram_media_insights_get`

Get Media Insights · Read-only

Get performance metrics for a single Instagram media object (engagement, impressions, reach, saved, likes, comments, shares, plays).

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `media_id` (`string`, required): The Instagram media ID to get insights for.
- `metric` (`string`, required): Comma-separated list of metric names to retrieve.

Example input: `{"media_id":"<media_id>","metric":"<metric>"}`

### `instagram_media_list`

List Media · Read-only

List media (posts, reels, stories) published on an Instagram account, cursor-paginated.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ig_user_id` (`string`, required): The Instagram professional account ID.
- `after` (`string`, optional): Pagination cursor to fetch the next page of results.
- `fields` (`string`, optional): Comma-separated list of fields to return per media item.
- `limit` (`integer`, optional): Max number of media items to return per page.

Example input: `{"ig_user_id":"<ig_user_id>"}`

### `instagram_mentions_list`

Get Mentioned Content · Read-only

Discover @mentions of this Instagram account in a specific comment or media caption, via Graph API field-expansion on the account node.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `fields` (`string`, required): Graph API field-expansion string naming the mentioned comment or media, and which sub-fields to return.
- `ig_user_id` (`string`, required): The Instagram professional account ID that was mentioned.

Example input: `{"fields":"<fields>","ig_user_id":"<ig_user_id>"}`

### `instagram_oembed_get`

Get oEmbed · Read-only

Get embeddable HTML and thumbnail info for any public Instagram post or reel URL.
Returns oEmbed fields such as html (the embed markup), author_name, thumbnail_url, width, and height.
Use this to embed an Instagram post/reel in a webpage or preview its thumbnail, without needing the account's own ig_user_id.
Works for any public post URL; the connected account's own access token is used to authorize the request.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `url` (`string`, required): The public URL of the Instagram post or reel to embed, e.g. https://www.instagram.com/p/Cabcdefghij/.
- `hidecaption` (`boolean`, optional): Whether to omit the post's caption from the returned embed HTML. Default: `false`.
- `maxwidth` (`integer`, optional): Maximum width in pixels for the returned embed HTML/thumbnail.
- `omitscript` (`boolean`, optional): Whether to omit the embed.js script tag from the returned HTML (set true if the page already loads it once). Default: `false`.

Example input: `{"url":"<url>"}`

### `instagram_recently_searched_hashtags_list`

List Recently Searched Hashtags · Read-only

List the hashtags this Instagram account has recently searched for via instagram_hashtag_search.
Returns each hashtag's id and name — the Hashtag Search API allows only 30 unique hashtags to be queried per rolling 7-day window per account.
Use this to check remaining hashtag-search quota before calling instagram_hashtag_search again with a new hashtag.
Requires the account's ig_user_id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ig_user_id` (`string`, required): The Instagram professional account ID to check recently searched hashtags for.
- `fields` (`string`, optional): Comma-separated list of fields to return per hashtag. Defaults to id and name. Default: `id,name`.

Example input: `{"ig_user_id":"<ig_user_id>"}`

### `instagram_stories_list`

List Stories · Read-only

List the currently active (not yet expired) stories posted by a connected Instagram professional account.
Returns an array of story media objects with id, media_type, media_url, permalink, and timestamp. Stories drop off this list 24 hours after posting.
Use this to review or archive active stories. Use instagram_media_list for the account's permanent feed posts instead.
Requires the account's ig_user_id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ig_user_id` (`string`, required): The Instagram professional account ID whose active stories should be listed.
- `fields` (`string`, optional): Comma-separated list of story fields to return per item. Default: `id,media_type,media_url,permalink,timestamp`.

Example input: `{"ig_user_id":"<ig_user_id>"}`

### `instagram_tagged_media_list`

List Tagged Media · Read-only

List media where the connected Instagram professional account has been photo-tagged by other accounts.
Returns a paginated array of media objects with id, caption, media_type, media_url, permalink, timestamp, and the tagging account's username.
Use this to monitor photo tags of the account. Use instagram_mentions_list instead to look up a specific @mention inside a known comment or caption by ID.
Requires the account's ig_user_id.

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ig_user_id` (`string`, required): The Instagram professional account ID whose tags should be listed.
- `fields` (`string`, optional): Comma-separated list of media fields to return per item. Default: `id,caption,media_type,media_url,permalink,timestamp,username`.
- `limit` (`integer`, optional): Maximum number of tagged media items to return in this page. Default: `25`.

Example input: `{"ig_user_id":"<ig_user_id>"}`

### `instagram_user_get_profile`

Get User Profile · Read-only

Get an Instagram Business/Creator account's profile info (username, bio, follower count, media count, etc.).

Read only: yes. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `ig_user_id` (`string`, required): The Instagram professional (Business/Creator) account ID.
- `fields` (`string`, optional): Comma-separated list of fields to return.

Example input: `{"ig_user_id":"<ig_user_id>"}`

### `instagram_comment_hide_update`

Hide/Unhide Comment · Write

Hide or unhide a comment on an Instagram media object without deleting it.

Read only: no. Destructive: no. Idempotent (safe to retry): yes.

Inputs:

- `comment_id` (`string`, required): The Instagram comment ID to hide or unhide.
- `hide` (`boolean`, required): Set true to hide the comment, false to unhide it.

Example input: `{"comment_id":"<comment_id>","hide":true}`

### `instagram_comment_private_reply_create`

Send Private Reply to Comment · Write

Send a private Instagram Direct message to the author of a public comment, without posting a visible public reply.
Returns the recipient id and the new message id.
Use this to move a public conversation to DMs (e.g. for order support or sensitive details). Use instagram_comment_reply_create instead for a visible public reply.
Requires the comment_id being replied to and the instagram_manage_messages permission; only available within a limited window after the comment was posted.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `comment_id` (`string`, required): The ID of the public comment to send a private reply to.
- `message` (`string`, required): Text content of the private message.

Example input: `{"comment_id":"<comment_id>","message":"<message>"}`

### `instagram_comment_reply_create`

Reply To Comment · Write

Reply to a comment on an Instagram media object.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `comment_id` (`string`, required): The Instagram comment ID to reply to.
- `message` (`string`, required): The reply text.

Example input: `{"comment_id":"<comment_id>","message":"<message>"}`

### `instagram_media_container_create`

Create Media Container · Write

Step 1 of the Instagram publish flow: create a media container (image, video, reel, or carousel item) from a source URL. Poll instagram_media_container_status_get before publishing, then call instagram_media_publish with the returned container id.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `ig_user_id` (`string`, required): The Instagram professional account ID to create the container under.
- `caption` (`string`, optional): Caption text for the post (ignored for carousel item containers — set it on the parent carousel container instead).
- `children` (`string`, optional): Comma-separated list of child container IDs (max 10) — only used when media_type is CAROUSEL.
- `image_url` (`string`, optional): Publicly accessible URL of the image to post. Required unless video_url is given.
- `is_carousel_item` (`boolean`, optional): Set true when this container is a child item of a carousel (do not publish it directly). Default: `false`.
- `media_type` (`string`, optional): Media type of the container: VIDEO, REELS, or CAROUSEL. Omit for a plain image post.
- `video_url` (`string`, optional): Publicly accessible URL of the video to post. Required unless image_url is given.

Example input: `{"ig_user_id":"<ig_user_id>"}`

### `instagram_media_publish`

Publish Media · Write

Step 2 of the Instagram publish flow: publish a previously created media container (from instagram_media_container_create) to the account's feed.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `creation_id` (`string`, required): The container ID returned from instagram_media_container_create.
- `ig_user_id` (`string`, required): The Instagram professional account ID publishing the container.

Example input: `{"creation_id":"<creation_id>","ig_user_id":"<ig_user_id>"}`

### `instagram_message_attachment_send`

Send Message Attachment · Write

Send an image, video, or audio attachment via Instagram Direct message from a connected professional account to a specific recipient.
Returns the recipient id and the new message id.
Use this instead of instagram_message_send when sharing media rather than plain text, within the standard 24-hour messaging window.
Requires the recipient's Instagram-scoped user ID (IGSID), a publicly accessible attachment URL, and the instagram_manage_messages permission.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `attachment_type` (`string`, required): The type of media being sent. One of: `image`, `video`, `audio`.
- `attachment_url` (`string`, required): Publicly accessible URL of the image, video, or audio file to send.
- `ig_user_id` (`string`, required): The Instagram professional account ID sending the attachment.
- `recipient_id` (`string`, required): The Instagram-scoped user ID (IGSID) of the message recipient, obtained from a prior conversation or message webhook.

Example input: `{"attachment_type":"image","attachment_url":"<attachment_url>","ig_user_id":"<ig_user_id>","recipient_id":"<recipient_id>"}`

### `instagram_message_send`

Send Message · Write

Send an Instagram Direct text message from a connected professional account to a specific recipient.
Returns the recipient id and the new message id.
Use this to reply within the standard 24-hour messaging window after a user has messaged the account. Use instagram_conversations_list and instagram_conversation_messages_list to find the recipient's scoped ID first.
Requires the recipient's Instagram-scoped user ID (IGSID) and the instagram_manage_messages permission.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `ig_user_id` (`string`, required): The Instagram professional account ID sending the message.
- `recipient_id` (`string`, required): The Instagram-scoped user ID (IGSID) of the message recipient, obtained from a prior conversation or message webhook.
- `text` (`string`, required): Text content of the message to send.

Example input: `{"ig_user_id":"<ig_user_id>","recipient_id":"<recipient_id>","text":"<text>"}`

### `instagram_sender_action_send`

Send Sender Action · Write

Send a typing indicator or mark-as-seen signal in an Instagram Direct conversation.
Returns a success confirmation; no message is created.
Use this to show the recipient a typing indicator (TYPING_ON/TYPING_OFF) or to mark their last message as seen (MARK_SEEN), around instagram_message_send or instagram_message_attachment_send calls.
Requires the recipient's Instagram-scoped user ID (IGSID) and the instagram_manage_messages permission.

Read only: no. Destructive: no. Idempotent (safe to retry): no.

Inputs:

- `ig_user_id` (`string`, required): The Instagram professional account ID sending the sender action.
- `recipient_id` (`string`, required): The Instagram-scoped user ID (IGSID) of the conversation participant.
- `sender_action` (`string`, required): The sender action to send. One of: `TYPING_ON`, `TYPING_OFF`, `MARK_SEEN`.

Example input: `{"ig_user_id":"<ig_user_id>","recipient_id":"<recipient_id>","sender_action":"TYPING_ON"}`

### `instagram_comment_delete`

Delete Comment · Destructive

Permanently delete a comment or reply on an Instagram media object.

Read only: no. Destructive: yes. Idempotent (safe to retry): yes.

Inputs:

- `comment_id` (`string`, required): The Instagram comment ID to delete.

Example input: `{"comment_id":"<comment_id>"}`

## Related

Other Marketing connectors ([all 59](/agentkit/connectors/?category=marketing)):

- [HubSpot](/agentkit/connectors/hubspot/): Scalekit connector, OAuth, 457 tools
- [Mailchimp](/agentkit/connectors/mailchimp/): Scalekit connector, OAuth, 73 tools
- [Twitter / X](/agentkit/connectors/twitteroauth/): Scalekit connector, OAuth, 92 tools


---

## More Scalekit documentation

| Resource | What it contains | When to use it |
|----------|-----------------|----------------|
| [/llms.txt](/llms.txt) | Structured index with routing hints per product area | Start here — find which documentation set covers your topic before loading full content |
| [/llms-full.txt](/llms-full.txt) | Complete documentation for all Scalekit products in one file | Use when you need exhaustive context across multiple products or when the topic spans several areas |
| [sitemap-0.xml](https://docs.scalekit.com/sitemap-0.xml) | Full URL list of every documentation page | Use to discover specific page URLs you can fetch for targeted, page-level answers |
