Posteora has one room and three doors. The REST API at /api/v1, the webhooks that report what happened, and the MCP server at /mcp that your assistant talks to all end in the same functions: the same validators, the same plan limits, the same X allowance and the same receipts. A post that would be refused in the Studio is refused on every door with the same code. So the choice is not about what you can do. It is about who writes the text, who says yes, and what the trigger is.
Facts below are from the code and the API reference as of 2026-10-19.
Door one: the REST API, from n8n, Zapier, Make or a script
Plain HTTP with your account API key as a Bearer token. Twelve endpoints:
| Endpoint | Does |
|---|---|
GET /api/v1/accounts |
Connected networks with token health (needs_reconnect) |
GET /api/v1/limits |
Your plan limits, the rate limit and the X allowance meter |
POST /api/v1/media |
Upload a file (multipart or raw) or fetch a public {"url"} |
POST /api/v1/posts |
Publish now, queue with scheduled_for, or save with draft: true |
GET /api/v1/posts |
The queue: pending and drafts by default |
GET /api/v1/posts/{id} |
One post with its per-network rows and URLs |
DELETE /api/v1/posts/{id} |
Cancel a queued post or delete a draft |
GET /api/v1/activity |
Sent and failed records, newest first |
GET /api/v1/webhooks |
Your endpoints, with their secrets |
POST /api/v1/webhooks |
Register one (three at most) |
DELETE /api/v1/webhooks/{id} |
Remove one |
POST /api/v1/webhooks/{id}/test |
Send a webhook.test event now |
Scheduling is one request: POST /api/v1/posts with text, targets and scheduled_for in ISO 8601 with an offset. Publishing now is the same request without scheduled_for and with an Idempotency-Key header, required so a retried request cannot post twice. A key accepts 120 requests a minute and answers 429 above that; a plan limit answers 422 with horizon, queue_cap, daily_cap, monthly_cap or duplicate.
n8n. The API docs describe a community node package, n8n-nodes-posteora, with a Posteora node (Create Post, Schedule Post, Upload Media, List Accounts, Get Post Status) and a Trigger node that registers the webhook and checks the signature. It is not yet published in the n8n community nodes directory, so do not go looking for it there today. The HTTP Request node does the same job: POST to the posts URL, Header Auth with Authorization: Bearer <key>, the JSON body, and {{ $execution.id }} as the Idempotency-Key when publishing now.
Zapier. Same story: a Posteora app with a New Post Sent trigger and Create Post and Schedule Post actions is written, and it is not yet listed in the Zapier directory. Until it is, Webhooks by Zapier with a Custom Request action sends the post and a Catch Hook receives the outcome.
Make uses the HTTP module and a Custom Webhook module, with nothing to install.
When it fits. The text already exists somewhere else and an event should send it: a CMS marks an article published, a build goes green, a row lands in a sheet, a form is submitted. Nobody needs to approve the wording at the moment of sending, because it was approved when it was written. The exact requests, with curl, are in the webhooks and API post.
Door two: webhooks
Webhooks do not send posts. They tell you what happened to posts sent through any door, which is why they belong in this comparison: a flow that posts without them is a flow that never learns about the LinkedIn connection that expired on Tuesday.
Register up to three HTTPS endpoints, each with its own secret, and pick events or take them all:
| Event | When |
|---|---|
post.scheduled |
A post entered the queue |
post.sent |
One network published it; one event per network |
post.failed |
One network refused it, or the send-time check did (daily cap, missing TikTok choices) |
post.cancelled |
A queued post was cancelled |
account.needs_reconnect |
The daily token check found a connection the network no longer accepts |
affiliate.earned |
A customer you referred paid an invoice |
webhook.test |
The test button, or the test endpoint above |
Each delivery is a POST with X-Posteora-Event, X-Posteora-Delivery (a unique id for dropping duplicates) and X-Posteora-Signature (t=<unix time>,v1=<hex>, the HMAC-SHA256 of "<t>.<raw body>" with the secret). Answer any 2xx within 5 seconds; otherwise 4 attempts in all, waiting 30 seconds, then 120, then 600. Events go out within about a minute of happening, after the sends of that tick are settled.
When it fits. Always, as the second half of door one or door three: an n8n Webhook node or a Zapier Catch Hook that forwards a post.failed to your inbox, marks the CMS row as published with the live URL from post.sent, or emails you the Connections link on account.needs_reconnect. If you cannot receive HTTPS calls, GET /api/v1/activity is the polling source for the same rows.
Door three: MCP, from your assistant
https://posteora.com/mcp is an MCP server with 16 tools. Claude, ChatGPT and Claude Code connect to it; for Claude Code it is one command, claude mcp add --transport http posteora https://posteora.com/mcp, then /mcp, Authenticate, Allow, which is an OAuth sign-in rather than a pasted key. The server hands the assistant its instructions on connect: accounts.list first, post.preview before every post.publish or post.schedule, read the receipt to the user and wait for the yes.
Scheduling here is a sentence: "schedule this for Tuesday 9am on X and Bluesky". The assistant calls post.preview, shows you the receipt (what the post draws on, characters against each network's limit, the X allowance after it) and, after your yes, post.schedule with scheduled_for in your offset. The schedule receipt names the time as you gave it and the Studio calendar where the post now sits. voice.write (1 AI credit) drafts the text in your trained voice when you have a topic and not a post; media.upload takes an image straight from disk; post.queue, post.update and post.cancel manage what is queued; post.status and analytics.get read back.
When it fits. The text is not written yet, or it is sitting in the conversation: the shipping note in a Claude Code session, the summary your assistant just produced. A person is there to read the receipt and say yes, and that yes is worth having because the post goes out under your name. It is also the door for an agent runtime that speaks MCP with nobody at the keyboard; that post covers what to do when nobody is reading the receipt.
Side by side
| REST API | Webhooks | MCP | |
|---|---|---|---|
| Trigger | An event in your flow or script | An outcome in Posteora | A sentence to your assistant |
| Who writes the text | Your flow, upstream | Nobody; it reports | You, or voice.write |
| Approval | When the flow was built | None needed | The receipt, then your yes |
| Auth | API key as Bearer | A secret per endpoint, HMAC | OAuth sign-in, or the API key |
| Double-send guard | Idempotency-Key header on publish |
X-Posteora-Delivery id |
idempotency_key on post.publish |
| Outcome | results in the response, then webhooks |
The event itself | The publish receipt, then post.status |
| Ready-made pieces | n8n node and Zapier app written, not yet in their directories | n8n Webhook node, Zapier Catch Hook, Make Custom Webhook | Claude, ChatGPT, Claude Code |
What is the same on every door
Because every door calls the same functions, these do not change with your choice:
- Schedule 14 days ahead on Free and 90 on Pro, with 10 and 300 posts queued at a time.
- Free: 10 posts a month, counted once per network, 1 a day per network, no links on X. Pro: unlimited posts, fair use, with daily caps per network (X 5, LinkedIn 3, TikTok 3, YouTube 3, Bluesky 10, Mastodon 10, Pinterest 10).
- Two X posts a day when scheduling; a third on the same local day is refused, with a reply under your own post exempt.
- The same text to the same network within 48 hours is refused.
- Every X send draws on the monthly X allowance, shown as posts: Pro includes about 20 posts with links or 260 plain posts. Queued X posts reserve their share.
- Images up to 5 MB, video up to 100 MB, within the plan's storage.
- Receipts in the same words, queued, published, failed, one sentence per network, with a failure never folded into a success.
Choosing
- Posting is a step in a pipeline that already has the text: the REST API, with webhooks to close the loop.
- Posting starts with "say something about this" and a person who wants to see it first: MCP.
- Both, often. The release note goes out from the deploy script; the commentary about it goes out from Claude Code the same afternoon. The queue, the caps and the allowance are shared, so the two cannot step on each other without a receipt saying so.
If self-hosting a flow-based tool is what brought you here, the Postiz post is the comparison. All three doors are on the free plan, with 10 posts a month and no card; Pro is $19 a month, or $15 a month billed annually, and the pricing page has the table.