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.