Post to social from your own code, or from your agent.
Cadenus holds the connections to Instagram, Facebook, TikTok, LinkedIn, YouTube and X. You get three ways to use them: an MCP server your agent can call, a small skill for agents in a terminal, and four plain HTTP calls for everything else.
Endpoints at a glance
- Base URL
- https://app.cadenus.io/api
- MCP server
- https://app.cadenus.io/api/mcp
29 tools - Auth
- OAuth 2.1 one click,
or Bearer cdn_… - Scopes
- read · write
- Rate limit
- 120 MCP calls / minute
- Upload ceiling
- 300 MB per file
Connect your agent.
Pick the client you actually use. Publishing needs the full MCP server and write access. The ChatGPT apps connection does not include publishing tools.
Add the server, then approve access in the browser. No token to copy.
Settings, then Connectors, then Add custom connector. Paste the URL and sign in.
Settings, Connectors, Create. Use the apps mount: it hides the four tools that publish, because ChatGPT reviews connectors that post on your behalf.
CodexAdd it to ~/.codex/config.toml with a token from Settings.
OpenClawOpenClaw has your files and a shell, so give it the skill, not a connector. It reads the skill file and runs the script.
Anything that can send an HTTP request. Four calls, described below.
/api/mcp is the full server, 29 tools, for Claude, Cursor, Codex and your own client. /api/mcp-apps is the same server with publish_post, schedule_post, reschedule_post and cancel_post removed, for the ChatGPT app directory. Both take the same credentials.Do you need an API key?
Not if your client speaks OAuth. Claude and ChatGPT register themselves and send you to a consent screen. If your client does not, or you are writing a script, make a token by hand.
One-click OAuth
Standard OAuth 2.1 with dynamic client registration and PKCE. Your client finds everything it needs in two documents. In most tools you only paste the MCP URL.
A token issued this way is a normal Cadenus token. It shows up in Settings under the tool's name. Delete it there and the tool is disconnected at once.
A token you make yourself
Settings, then API & MCP, then New token. The full value is shown once and never again, because we only keep its hash.
29 tools. Most of them read.
A read token can call everything marked read. Anything marked write needs a write token, and says so when it is refused.
Publishing and media
11 tools| Tool | What it does | Scope |
|---|---|---|
| list_channels | The connected accounts a post can go to, and what each one accepts, including that platform's caption limit. | read |
| create_media_upload | Reserve a signed address so the agent can upload a file straight from its own disk, past the API. | write |
| confirm_media_upload | Make an uploaded file usable. Checks it is what it claims to be and rewrites video Instagram would refuse. | write |
| import_media_from_url | Pull a file from a link into the workspace instead of uploading it. | write |
| publish_post | Create and schedule in one call, on accounts whose brand does not require client approval. | write |
| schedule_post | Schedule an approved draft on its proposed channels. | write |
| reschedule_post | Move a scheduled post to another time, on every channel it was queued for. | write |
| cancel_post | Cancel a scheduled post before it goes out. | write |
| get_post_result | What actually happened, per channel, with the link to the live post. | read |
| list_media | Files already in the workspace, newest first, with the reference to pass as media. | read |
| get_connect_link | A link the person opens to connect a social account, when there are none yet. | read |
Drafts, approvals and the calendar
10 tools| Tool | What it does | Scope |
|---|---|---|
| create_draft | Create a post as a draft. Nothing publishes until it is scheduled. | write |
| update_draft_caption | Replace a draft's caption. | write |
| submit_draft_for_review | Send a draft to the client's approval portal. | write |
| approve_draft | Approve internally, without client review. | write |
| list_pending_approvals | Posts waiting on someone, with client and thumbnail. | read |
| list_posts | Drafts and posts with status, type and proposed date. | read |
| get_post_details | One post in full: caption, first comment, channels, date. | read |
| get_content_calendar | What is planned for the next N days. | read |
| get_workspace_info | The workspace, the person behind the token, the token's scope, and every connected account. | read |
| list_clients | Clients with retainer and production health signals. | read |
Production and research
8 tools| Tool | What it does | Scope |
|---|---|---|
| list_production_items | Video items with stage, deadline and priority. | read |
| list_stalled_items | Items stuck in a stage for at least N days. | read |
| promote_idea_to_production | Turn a saved idea into a production item, carrying its script. | write |
| list_content_ideas | Ideas saved from the Radar research feed. | read |
| list_outlier_videos | Videos from the watchlist that beat their channel's median by a wide margin. | read |
| find_creator | Find the accounts matching a person or brand name. | read |
| get_creator_top_videos | A creator's top videos, ranked against their own median. | read |
| get_financial_summary | Income, expense and margin over a period, against the one before it. | read |
Four calls from a file on disk to a published post.
The file does not travel through the API. We hand out a signed address, your code uploads to it, and we check the file before anything is queued. No base64, no request-size wall.
Reserve an address
Tell Cadenus the file name, type and size. You get back a signed upload address, valid for one hour.
Upload the bytes yourself
A plain PUT to the address, with the same content type you reserved.
Confirm it
This is where a phone's HEVC becomes H.264. Instagram accepts HEVC and then fails it in processing hours later, so we rewrite it here. The converted copy gets a new name, and you get that name back.
Publish or schedule
One call, with the channels, the media reference and the time. Leave out the time and it goes on the next pass.
get_post_result. Publishing is queued, not instant. The publisher sends each channel when it is due, and the live link exists only after the network accepts it. A post that failed on one channel and went out on another says exactly that, per channel.What will be refused, and when.
Everything here is checked on our side before a post is queued. A mistake comes back in seconds, not as a platform error hours later.
Captions
| Platform | Characters | Hashtags |
|---|---|---|
| 2,200 | 30 | |
| TikTok | 2,200 | no limit |
| 3,000 | no limit | |
| YouTube | 5,000 | no limit |
| X | 280 | no limit |
| 63,206 | no limit |
Only rules the network itself enforces are here. LinkedIn's five hashtags is advice. Refusing a post over advice would invent a failure that would not have happened.
Files
| Accepted | mp4 · mov · jpg · png · webp |
| Maximum size | 300 MB |
| Signed address valid | 1 hour |
| Converted for you | HEVC to H.264 |
| Stored | EU object storage |
Rate limits
| MCP calls | 120 / minute per token |
| Upload reservations | 60 / hour per person, 200 / day per workspace |
| Publishes | 120 / hour per person |
Naming channels
Anywhere channels are accepted, you can write them the way a person would. A bare platform name only works when it is unambiguous. When it is not, the error names the candidates instead of guessing.
What comes back when something is wrong.
Errors are written to be passed on. If your agent repeats ours to the person, the sentence tells them what to do.
| Status | error | What it means |
|---|---|---|
| 401 | invalid_token | Missing, wrong or revoked token. The response also carries a WWW-Authenticate header pointing at the OAuth metadata. That is how Claude and ChatGPT offer to reconnect. |
| 402 | billing_required | The subscription is not active. The agent is told to open Cadenus and settle it. |
| 403 | plan_upgrade_required | This plan does not include the agent connection. |
| 403 | read-only token | A write tool was called with a read token. |
| 403 | approval required | The brand behind that channel requires client approval. The message names the draft flow to use instead. |
| 429 | rate_limited | Too many calls. Retry-After says how long to wait. |
The rules an agent cannot talk its way around.
They live in the workspace, next to the people who set them. They apply the same to a browser, a Notion row or an agent.
It will not see past its own workspace
A token is bound to one workspace and carries its creator's role. Rows are isolated in the database itself, not only in the code that queries them.
It will not post the same thing twice
Send the same post again by mistake and you get the first one back, with its original id. Retrying is safe.
It will not publish around an approval
If the brand requires client approval, publish_post refuses and names the draft flow. The agent can create and submit a draft. The client approves in their portal, as always.
It will not survive a revoke
Delete the token and every call stops at once, OAuth ones included. What the agent scheduled stays in the calendar under the token's name, so you can cancel or move it.
Questions we get asked.
Does Cadenus have an MCP server?
It does, at https://app.cadenus.io/api/mcp, with 29 tools over streamable HTTP. It works with Claude, Claude Code, ChatGPT, Cursor, Codex and any other MCP client.
Do I need an API key to use it?
Only if your client cannot do OAuth. Claude and ChatGPT register themselves and send you to a consent screen, where you pick read or write. Everyone else uses a bearer token from Settings.
How does an agent upload a video?
In three steps: reserve an address, PUT the bytes to it, confirm. The file never travels inside a tool argument or a JSON body. So there is no base64, and the ceiling is 300 MB.
Which platforms can it publish to?
Instagram, Facebook, TikTok, LinkedIn and YouTube, plus X as a per-account add-on because X charges for its API. Photos, carousels and video, as posts or reels.
Is there a REST API as well as MCP?
Yes, for the things a tool call cannot carry: reserving an upload, confirming it, and publishing in one call. Four endpoints under /api/agent, same token, same limits.
What are the rate limits?
120 MCP calls a minute per token. 60 upload reservations an hour per person, with 200 a day per workspace. 120 publishes an hour per person. A 429 tells you how long to wait.
Which plan includes this?
Connect, at €19 a month, is the smallest one that does: eight channels, the MCP server, the skill and the API. It is also on Starter, Agency and Scale.
Where does my data live?
In the EU. Media sits in EU object storage, and video is removed once it has been published. Each workspace's rows are isolated at the database level.
The whole thing on one screen.
The same values as on the pricing page, in llms.txt and in the MCP server's own description.
- product
- Cadenus, social media publishing for teams, agencies and AI agents
- agent_door
- MCP server (29 tools), shell skill for local agents, REST endpoints under /api/agent
- mcp_url
- https://app.cadenus.io/api/mcp
- auth
- OAuth 2.1 one click in Claude and ChatGPT, or Bearer token cdn_…; scopes read and write
- works_with
- Claude Code, Codex, OpenClaw, Claude, ChatGPT, Cursor, any MCP client, any HTTP client
- platforms
- Instagram, Facebook, TikTok, LinkedIn, YouTube; X per connected account
- media
- mp4, mov, jpg, png, webp; direct upload up to 300 MB; HEVC converted to H.264 automatically
- caption_limits
- Instagram 2,200 and 30 hashtags · TikTok 2,200 · LinkedIn 3,000 · YouTube 5,000 · X 280 · enforced server-side
- price
- Connect plan €19 per month, 8 channels, 5 GB, 7-day free trial; Starter from €39 adds client approvals and portals
- hosting
- EU, media stored in EU object storage
- docs
- cadenus.io/developers/ · cadenus.io/llms.txt
- updated
- 2026-09-07
Paste the URL into your agent.
See your channels in a minute.
€19 a month on Connect. 7 days free, card required.