ClawLink

How to connect Instagram to Grok Bot

Connect Instagram to Grok Bot with ClawLink: no Meta developer app, no App Review, and no Instagram password in the sandbox. 29 tools Grok Bot calls from chat.

Get started for free
Grok Bot
Grok Bot
ClawLink
ClawLink
Instagram
Instagram
InstagramOAUTH2MCP

Publish posts and manage media. Once connected, Grok Bot can read and act on Instagram from chat — pairing, token refresh, and tool wiring handled for you.

29 tools

Grok Bot runs on its own cloud computer, so most Instagram guides send you to register an OAuth app and paste keys into a sandbox that resets. ClawLink gives Grok Bot a more practical Instagram setup: it runs one CLI command, you approve once in the browser, and Grok Bot can call real Instagram actions from chat with no auth, token refresh, or tool wiring to build yourself.

Copy this prompt into Grok Bot. It runs the ClawLink CLI in its own terminal and pairs your account.

Prompt for Grok Bot
Set up ClawLink for me and tell me when it's ready.

1. Pair this machine. It prints an approval link, so show me the link and stop, don't wait:
npx -y @useclawlink/cli login

2. I'll approve it in my browser, then reply "approved".

3. When I say approved, connect the app:
npx -y @useclawlink/cli connect instagram

4. Then run `npx -y @useclawlink/cli whoami` and tell me whether ClawLink is ready.

Setup

It takes three steps to connect Grok Bot to Instagram.

  1. 1

    Pair from the terminal

    Ask Grok Bot to run the ClawLink CLI. It prints a link you approve once in your browser:

    npx -y @useclawlink/cli login
  2. 2

    Connect Instagram

    One-click OAuth in the dashboard.

  3. 3

    Use it from chat

    Ask Grok Bot: "What can you do with Instagram?"

Install by command

The prompt above does all of this. By hand, it is two commands Grok Bot runs in its own terminal, and one browser approval:

npx -y @useclawlink/cli login          # prints an approval link, approve it in your browser
npx -y @useclawlink/cli connect instagram

Pair once and it sticks: the key is written to ~/.clawlink/credentials.json inside Grok Bot's sandbox, so it survives between sessions. Prefer native tools over shell commands? Add https://claw-link.dev/api/mcp as a custom connector at grok.com/connectors and approve the ClawLink sign-in. Same account, no CLI.

Verify the connection by asking Grok Bot:

Make a square image for today's post, then publish it to Instagram with a short caption. If the upload fails because the file is not reachable, follow the curl instruction in the error to upload it yourself and retry, and remember Instagram needs both the container call and the publish call.

Using a different agent?

The CLI above is not specific to Grok Bot. Claude Code, Cursor, Codex, or any agent that can run a shell command pairs with the same ClawLink account the same way:

npx -y @useclawlink/cli login

login opens the same browser approval and stores a credential locally. Once Instagram is connected in the dashboard, that agent calls the same 29 Instagram tools over MCP. Full setup for MCP clients and shell agents: connect apps to any AI agent.

Instagram MCP for Grok Bot

Looking for a Instagram MCP server for Grok Bot? ClawLink connects Instagram to Grok Bot and exposes 29 Instagram tools your agent can call over MCP, with hosted auth and nothing to run or maintain yourself. Using a different agent? The OpenClaw Instagram integration and the Hermes Instagram integration connect the same ClawLink account the same way.

Grok Bot can drive Instagram two ways: let it log into your account in its cloud browser, or give it scoped API access. This page is the second one, so no Instagram password is typed into the sandbox and there is no Meta developer app to register.

What the Grok Bot Instagram integration can do

29 Instagram tools are ready for Grok Bot once the account is connected. The 27 below are the ones people reach for most; your agent can call all 29.

27 of 29 Instagram tools for Grok Bot

ToolWhat it does
Create carousel container instagram_create_carousel_containerCreate an Instagram carousel container
Get ig comment replies instagram_get_ig_comment_repliesList replies to an Instagram comment
Get ig media instagram_get_ig_mediaGet a specific Instagram media item
Get ig media children instagram_get_ig_media_childrenGet Instagram media children (carousel items)
Get ig media comments instagram_get_ig_media_commentsList comments on an Instagram media item
Get ig media insights instagram_get_ig_media_insightsGet insights for an Instagram media item
Get ig user content publishing limit instagram_get_ig_user_content_publishing_limitGet Instagram content publishing limit
Get ig user media instagram_get_ig_user_mediaList Instagram media items
Get ig user stories instagram_get_ig_user_storiesList Instagram user stories
Get ig user tags instagram_get_ig_user_tagsList Instagram user tags
Get user info instagram_get_user_infoGet Instagram user info
Get user insights instagram_get_user_insightsGet Instagram user insights
Post ig media comments instagram_post_ig_media_commentsPost a comment on an Instagram media item
Post ig user media instagram_post_ig_user_mediaCreate an Instagram media container
Post ig user media publish instagram_post_ig_user_media_publishPublish an Instagram media item
Get conversation instagram_get_conversationGet details about a specific Instagram DM conversation (participants, etc)
Get ig user live media instagram_get_ig_user_live_mediaGet live media objects during an active Instagram broadcast
Get messenger profile instagram_get_messenger_profileGet the messenger profile settings for an Instagram account
Get page conversations instagram_get_page_conversationsGet Instagram conversations for a Page connected to an Instagram Business account
List all conversations instagram_list_all_conversationsList all Instagram DM conversations for the authenticated user
List all messages instagram_list_all_messagesList all messages from a specific Instagram DM conversation
Mark seen instagram_mark_seenMark Instagram DM messages as read/seen for a specific user
Post ig comment replies instagram_post_ig_comment_repliesCreate a reply to an Instagram comment
Post ig user mentions instagram_post_ig_user_mentionsReply to a mention of your Instagram Business or Creator account
Send image instagram_send_imageSend an image via Instagram DM to a specific user
Send text message instagram_send_text_messageSend a text message to an Instagram user via DM in an existing conversation
Update messenger profile instagram_update_messenger_profileUpdate the messenger profile settings for an Instagram account

Try it: find the Instagram tool you need

Browse the 27 Instagram tools

Click any tool to see exactly what Grok Bot can do and copy a ready-to-use prompt.

Example prompts

Make a square image for today's post, then publish it to Instagram with a short caption. If the upload fails because the file is not reachable, follow the curl instruction in the error to upload it yourself and retry, and remember Instagram needs both the container call and the publish call.

Before you post anything to Instagram, run instagram_get_user_info to confirm which account I am connected as, and instagram_get_ig_user_content_publishing_limit to check I have not used up this window's allowance. Tell me both, then stop.

List my last 10 Instagram posts with their captions and engagement, using the real media ids from instagram_get_ig_user_media rather than guessing any. Summarise which two performed best and why.

Check the comments on my most recent Instagram post, draft a reply to each one that asks a question, and show me the drafts before sending anything.

How Instagram publishing actually behaves from Grok Bot

Four things that are properties of Meta's API rather than of ClawLink, and that account for most of what goes wrong on a connection that is otherwise healthy.

  • Publishing is two tools. instagram_post_ig_user_media creates the container, instagram_post_ig_user_media_publish posts it. Ask for both, or you get a container nobody sees.
  • Ids must be read, never guessed. instagram_get_user_info returns the account id and instagram_get_ig_user_media returns media ids. An invented id comes back as a permissions error, which sends people to fix scopes that were never the problem.
  • There is a publishing allowance per rolling window. instagram_get_ig_user_content_publishing_limit reports what is left, and a full window fails at the publish call rather than at the container call.
  • Files need bytes our server can reach. A path inside Grok Bot's sandbox is not one. Either pass a public URL that serves the raw file, or let Grok Bot upload it from its own shell using the curl command the failure returns.

The alternative to ClawLink is usually manual OAuth app setup plus your own token handling, permission troubleshooting, and tool plumbing for Grok Bot. That is fine if you want to build and maintain the integration yourself. Most teams just want Instagram working from chat.

ManualClawLink
Connection flowRegister a Instagram app, configure redirect URLs, manage consent details, and reconnect users when auth settings drift.Users connect Instagram through the hosted browser flow and ClawLink keeps the token lifecycle out of your app code.
Ongoing maintenanceYou own refresh logic, permission debugging, environment config, and every provider-specific edge case for Instagram.ClawLink handles the repetitive integration plumbing so your team can focus on the workflow instead of the infrastructure.
Agent usabilityYou still need to expose the right Instagram actions to the runtime in a format your agent can reliably use.29 tools for Instagram are already exposed through ClawLink, so the agent can read and act from chat immediately.

Composio also exposes Instagram to AI agents. It is developer infrastructure: Python and TypeScript SDKs, an MCP server, and a catalog past 1,000 apps, aimed at teams shipping agent products. ClawLink is built for Grok Bot users instead. You install the plugin once, connect Instagram in the browser, and the 29 tools above work from chat. There is no SDK, no config file, and no API key handling. Choosing between them? Read the full Composio alternatives comparison.

Troubleshooting

Grok Bot says it cannot add ClawLink as an MCP server

Grok Bot only attaches MCP servers that are reachable over the public internet, so a local stdio server is refused. You do not need one. Ask Grok Bot to run npx -y @useclawlink/cli login in its terminal instead. The CLI is a shell command, not an MCP server. If you would rather have native tools, add https://claw-link.dev/api/mcp as a custom connector at grok.com/connectors and approve the ClawLink sign-in.

Connection succeeds but no tools appear

Reconnect Instagram from the dashboard, then start a fresh chat if the runtime still has the old tool catalog loaded.

"Tool schema not loaded yet" error when calling Instagram tools

Instagram tool schemas load on demand the first time a tool runs and are cached after that, so this error usually clears on its own: wait a few seconds and retry the same request. If every Instagram call keeps failing with it in a fresh chat, reconnect from the dashboard, and contact support if it still persists — that pattern points to a configuration problem on our side, not something you can fix by reconnecting again.

Instagram returns 403 or "permission denied" on one action while others work

Two usual causes. The connected account may not have access to the specific workspace, inbox, store, or project in the request — check that first. If access looks right, the agent may have sent a placeholder value (like "YOUR_ID" or an example id from documentation) instead of a real one: ask it to run a list or search tool first, then retry the action with a real id from those results. Most failures at this stage are one of these two, not ClawLink bugs.

Instagram publishing fails with "File bytes are missing for image_file. No attached bytes and s3key='/home/box/sand-data/agents/.../attachments/....png' is not a public URL the server can fetch"

This is the most common file failure we see across every client, and on Grok Bot it usually fixes itself. Instagram publishing needs the actual bytes, and a path inside Grok Bot's cloud computer, which looks like /home/box/sand-data/agents/<id>/attachments/<hash>.png, is not something our server can open. What makes Grok Bot different from most agents here is that it has a shell. The failed call hands back a single-use curl command in its hint, and Grok Bot can run it without being asked: it uploads the bytes to https://claw-link.dev/api/files/ingest, takes the file object from the JSON response, and calls the tool again with the s3key unchanged. Measured on a real run, 2026-08-30: the upload failed at 17:13:03 and the retry succeeded at 17:13:17, fourteen seconds later, with no human involved. So if you saw this error scroll past and then the post appeared anyway, that is what happened. Two things stop the loop. The upload link is single-use and expires in 15 minutes, so an agent that pauses and retries much later needs a fresh one, which means running the failing tool again. And if Grok Bot reports the error and stops instead of retrying, tell it to follow the curl instruction in the hint. A public HTTPS URL that serves the raw bytes works too and skips the upload entirely.

Instagram returns "(#10) Application does not have permission for this action", or "Object with ID '...' does not exist, cannot be loaded due to missing permissions, or does not support this operation"

Almost every guide for this error tells you to add instagram_basic and instagram_content_publish and check your app's permission tier. That advice is for people running their own Meta app, and it is the wrong diagnosis on a hosted connection. Two things actually cause it here. The first is a partial approval: Meta's consent screen lets you decline individual permissions, so a connection can read your profile while every publish attempt fails. Reconnect from the dashboard and accept the whole set. The second, and the more common one with an agent, is an invented id. Grok Bot that has not listed anything yet will guess an ig-user-id or a media id, and the guess is structurally valid enough to reach Meta, which answers with a permissions error rather than a not-found. That is why it reads as a scope problem when it is a bad argument. Have Grok Bot run instagram_get_user_info for the real account id, then instagram_get_ig_user_media for real media ids, and retry with those.

Instagram fails with "Fetching the media URL for video_file returned HTTP 403" or "returned an HTML page, not raw file bytes"

The URL reached our server but did not hand back a file. A 403 usually means the link is signed, private, or blocks server-side fetches, which is common with a share link that works in your own logged-in browser. An HTML page means the link points at a viewer or landing page rather than the file, which is what a normal Dropbox or Drive share URL is. Google Drive and Dropbox share links are resolved automatically, so paste those unchanged. For anything else, use a direct link that serves the raw bytes, such as an S3, R2, or CDN URL. If you cannot produce one, skip the URL route: have Grok Bot upload the file from its own shell with the curl command in the failure hint above.

Instagram returns "The user is not an Instagram Business", or media calls come back empty on a working connection

The account is a personal one. Meta's Instagram Graph API only serves Professional accounts, so the OAuth connection completes, Grok Bot reports success, and then every media call returns nothing. Switch to a Business or Creator account in the Instagram app under Settings, then Account type and tools, and link it to a Facebook Page if you plan to publish. Reconnect from the dashboard afterwards so the grant picks up the new account type. Worth separating from advice you will find elsewhere: the steps about creating a Meta app, requesting permissions, or submitting for App Review do not apply to this connection, but the Professional-account and linked-Page requirements do, because those are properties of your account rather than of the app.

Grok Bot says it posted to Instagram but nothing appears, or a media container is created and never published

Instagram publishing is two calls, not one. instagram_post_ig_user_media creates a container holding the image or video and the caption; instagram_post_ig_user_media_publish is what actually posts it. An agent that runs the first and stops has done half the job, and the post exists only as an unpublished container. Ask for the publish step explicitly. If the publish call itself fails, check the allowance with instagram_get_ig_user_content_publishing_limit, because a full window fails at exactly this step. Video adds a wrinkle: Meta processes it asynchronously, so a container can exist and not be ready to publish for a short period, and an agent that publishes immediately will see it fail.

Instagram returns "Error validating access token: You cannot access the app till you log in to www.instagram.com and follow the instructions given"

This is an Instagram checkpoint on the account, not an expired ClawLink connection. Meta has flagged something and is holding the account until a human clears it. Open instagram.com in a normal browser, sign in, and complete whatever it asks. Reconnecting in ClawLink before you do that will not help, because the block is on the account rather than on the grant. Once the checkpoint is cleared the existing connection resumes working.

OAuth finished in the browser but the account is still missing

Try reconnecting Instagram and complete the consent flow in the same browser session. Partial OAuth approvals or switching accounts mid-flow can leave the connection incomplete.

FAQ

Is there a Grok Bot Instagram integration?

Yes. ClawLink is the fastest way to connect Grok Bot to Instagram: link your Instagram account once in the browser and Grok Bot can call the Instagram API through 29 ready-made tools — no custom code or token handling.

How do I connect Instagram to Grok Bot with ClawLink?

Ask Grok Bot to run npx -y @useclawlink/cli login in its terminal and approve the link it prints, then npx -y @useclawlink/cli connect instagram to authorize Instagram. Grok Bot calls the tools from the next message, and the pairing persists in its sandbox, so this is a one-time step: no config files or API keys to manage.

How long does it take to connect Instagram to Grok Bot?

About two minutes. Sign in, click Connect next to Instagram in the dashboard, authenticate, and Grok Bot can use it from the next chat message.

Why use ClawLink instead of wiring Instagram up myself?

The alternative to ClawLink is usually manual OAuth app setup plus your own token handling, permission troubleshooting, and tool plumbing for Grok Bot. That is fine if you want to build and maintain the integration yourself. Most teams just want Instagram working from chat.

Should I just let Grok Bot log into Instagram in its browser instead?

You can, and Grok Bot is capable of it, but understand what you are choosing. Browser login means your Instagram password and your 2FA prompt go through the agent's cloud session, the access is as broad as your own account, and there is nothing to revoke afterwards except changing your password. It also breaks whenever Instagram shows a checkpoint. A ClawLink connection is scoped API access instead: you approve it on Meta's own consent screen, Grok Bot never sees a password, and you can disconnect it from the dashboard. The browser route is genuinely better for the things the API does not expose, such as reading your own feed or interacting with Stories, so it is a reasonable fallback for those. For posting, comments, insights, and messaging, the API path is the one to use.

Do I need a Meta developer app or App Review to post to Instagram from Grok Bot?

No. Doing this yourself means registering a Meta developer app, adding the Instagram Graph API, requesting instagram_basic and instagram_content_publish, and submitting for App Review before anyone other than you can use it. ClawLink connects through Meta's consent screen using an app that has already been through that process, so you sign in, approve, and the tools work. What you do still need is an Instagram Professional account, Business or Creator, linked to a Facebook Page if you intend to publish. That requirement belongs to your account rather than to the app, so no hosted provider can remove it.

Can Grok Bot post a photo or video that it generated itself?

Yes, and Grok Bot handles the hard part on its own. A file it just created lives inside its own cloud computer, which our server cannot read, so the first publish attempt fails with a missing-bytes error. Grok Bot then runs the single-use curl upload the error hands back and retries. On a measured run this took fourteen seconds start to finish and needed no input, which is why the usual experience is that it simply works. This is the one place where running in a sandbox with a terminal is an advantage: agents that can only read files from a fixed media folder have no way to recover from the same error. If you would rather avoid the round trip, put the file somewhere that serves the raw bytes over HTTPS and pass that URL instead.

Does the Instagram connection survive Grok Bot restarting?

Yes. Two separate things persist. The ClawLink pairing is stored in the sandbox at ~/.clawlink/credentials.json, so Grok Bot stays signed in to ClawLink between sessions. The Instagram grant itself lives on our side against your ClawLink account, not in the sandbox at all, so it is unaffected by anything that happens to the machine. If the sandbox is ever rebuilt from scratch you would re-run the login command; you would not reconnect Instagram.

Grok Bot says it cannot add ClawLink as an MCP server

Grok Bot only attaches MCP servers that are reachable over the public internet, so a local stdio server is refused. You do not need one. Ask Grok Bot to run npx -y @useclawlink/cli login in its terminal instead. The CLI is a shell command, not an MCP server. If you would rather have native tools, add https://claw-link.dev/api/mcp as a custom connector at grok.com/connectors and approve the ClawLink sign-in.