Docs
MCP and API
Connect your AI assistant to Kobu, or call it from your own code, to schedule Instagram posts, build comment-to-DM automations and read reports. Both are part of the Pro and Agency plans and do the same things.
Connect an assistant (MCP)
The server address is https://usekobu.com/mcp. You sign in to Kobu and choose what the app can do; you never share your Instagram password.
- Claude: Settings, Connectors, Add custom connector, then paste the address.
- ChatGPT: Settings, Apps & Connectors, turn on Developer mode under Advanced, then create a connector with the address. It needs a paid ChatGPT plan.
- Claude Code: run
claude mcp add --transport http kobu https://usekobu.com/mcp, then type/mcpto sign in. - Codex: run
codex mcp add kobu --url https://usekobu.com/mcp, thencodex mcp login kobu. - Cursor: add this to
.cursor/mcp.jsonand sign in when asked.
{
"mcpServers": {
"kobu": { "url": "https://usekobu.com/mcp" }
}
}An app that can’t sign in can send an API key instead, as the header Authorization: Bearer kobu_sk_….
Then ask for what you want, like “Schedule my Reel for Friday 6pm and add a GUIDE comment automation for followers.” Good clients ask before acting, and Kobu keeps these limits:
- New automations start paused until you turn them on.
- Posts go live only at the time set, so you can still cancel them.
- Everything an app changes shows up in Activity with its name.
- You can disconnect an app at any time under MCP & API, and it stops right away.
A connected app can read what your login can, including emails and phone numbers people gave your automations, and that data goes to the app you chose. Connect only apps you trust. Text in contacts is written by strangers, so a good assistant treats it as data and not as instructions.
Use the API
Create a key in Kobu under MCP & API. It’s shown once and only a hash of it is stored. Choose Read only when your code doesn’t need to change anything. Send it with every request:
curl https://usekobu.com/api/v1/posts \
-H "Authorization: Bearer $KOBU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"kind": "image",
"media_url": "https://example.com/photo.jpg",
"caption": "New guide is out",
"scheduled_at": "2026-11-07T18:00:00-03:00"
}'Create an automation the same way. It starts paused:
curl https://usekobu.com/api/v1/automations \
-H "Authorization: Bearer $KOBU_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"keywords": ["GUIDE"],
"message": "Here it is! 🎁",
"link_url": "https://example.com/guide",
"button_label": "Get the guide",
"follow_gate": true
}'The full description of every field is at /api/v1/openapi.json (OpenAPI 3.1).
Which account
If your login has one Instagram account, you don’t need to say which. With several, add account with its id or @username, as a query parameter or in the JSON body. Requests by id, like GET /automations/42, find the account on their own.
Media
Instagram downloads the media itself, so media_url must be a public https link: a .jpg image, or an .mp4 or .mov video. To host a file with Kobu, send it to POST /api/v1/uploads with its Content-Type, up to 8 MB for images and 100 MB for videos, and use the url you get back.
Errors and limits
Errors come back as {"error":"what to fix"} with a status code: 400 for a request to fix, 401 for a missing or unknown key, 403 when the plan or the key doesn’t allow it, 404 when it isn’t found on this login, 409 for a conflict such as a post that can’t be canceled, and 429 above 120 requests a minute, with Retry-After. An account can have up to 100 posts waiting to go live, and Instagram allows 100 published posts per account in 24 hours.
Everything you can do
Each row is one MCP tool and one API route under https://usekobu.com/api/v1.
| MCP tool | API route | What it does |
|---|---|---|
| list_accounts | GET /accounts | Linked Instagram accounts and when each connection expires |
| get_usage | GET /usage | Your plan and this month’s usage |
| list_posts | GET /posts | Scheduled posts and their status |
| schedule_post | POST /posts | Schedule an image, Reel, Story or carousel |
| cancel_post | DELETE /posts/{id} | Cancel a post that hasn’t gone live |
| list_instagram_media | GET /media | Latest posts on Instagram, with ids for automations |
| list_automations | GET /automations | Automations, their triggers and results |
| get_automation | GET /automations/{id} | One automation with all its steps |
| draft_automation | POST /automations/draft | Turn a sentence into a draft with Kobu’s AI. Spends one AI draft |
| create_automation | POST /automations | Create an automation. It starts paused unless active is true |
| update_automation | PATCH /automations/{id} | Change fields, or turn it on and off with active |
| delete_automation | DELETE /automations/{id} | Delete an automation for good |
| get_report | GET /reports | Instagram, post and automation numbers for a period |
| list_contacts | GET /contacts | People who entered an automation, with tags and answers |
| update_contact | PATCH /contacts/{uid} | Add or remove a tag, or pause automations for one person |
Questions
Write to hello@usekobu.com.