Everything you can do with PostWire

One idea, published natively to nine networks — from the dashboard, from an MCP client, from n8n, Make or Zapier, or from your own code. This page is the whole surface in one place.

The base URL, and the one that does not exist

Everything lives under https://postwire.io/api/…. There is no version prefix: /api/v1/me is not a thing, and calling it answers with a 404 that points you at the right path. Authenticate with your key on every request:

curl https://postwire.io/api/me \
  -H "Authorization: Bearer pw_live_…"

Your key is in the dashboard. Keys are per account and carry a scope; a full-scope key can publish.

The endpoints

EndpointWhat it does
GET /api/mePlan, posts used this month, brands, connected networks.
GET /api/brandsYour brands and which networks each one has connected.
POST /api/generateWrites a native draft per network. Returns drafts; publishes nothing.
POST /api/postPublishes. One result per network.
POST /api/scheduleQueues for later. Rules are checked now, not at send time.
GET /api/scheduleWhat is queued.
GET /api/platformsEvery network and its limits.

Full request and response schemas are in the OpenAPI spec.

Write once, publish everywhere

The two calls that do the real work. Chain them and the drafts go out as written:

curl -X POST https://postwire.io/api/generate \
  -H "Authorization: Bearer pw_live_…" -H "Content-Type: application/json" \
  -d '{"prompt":"We shipped dark mode","platforms":["linkedin","bluesky","mastodon"]}'
# -> { "drafts": { "linkedin": {"text":"…"}, "bluesky": {"text":"…"}, … } }

curl -X POST https://postwire.io/api/post \
  -H "Authorization: Bearer pw_live_…" -H "Content-Type: application/json" \
  -d '{"platforms":["linkedin","bluesky","mastodon"],"per_platform":{…the drafts…}}'

Or skip the writer and send your own text with "text". Anything longer than a network allows is trimmed to fit that network rather than rejected.

Reading the answer

Publishing returns posted — how many networks actually went out — and one entry per network in results. One network failing never fails the others.

{
  "posted": 2,
  "results": [
    {"ok": true,  "platform": "mastodon", "url": "https://…"},
    {"ok": false, "platform": "tiktok", "code": "media_required",
     "error": "tiktok needs a video…"}
  ]
}
codeWhat to do
not_connectedThat network is not linked yet. Connect it in the dashboard.
media_requiredThat network refuses text-only posts. Send video_url or photo_url.
too_longOnly when you supplied that network's text yourself — your own words are never trimmed.
empty_textNothing to publish: no text and no media.

Which networks need media

This is the rule people hit first, so it is worth knowing before you build:

NetworkNeeds
TikTok, YouTubeA video. Text-only is rejected by the network itself.
InstagramAn image or a video.
LinkedIn, X, Facebook, Reddit, Bluesky, Mastodon, Telegram, DiscordText alone is fine; media optional.

Pass media as video_url or photo_url — two separate fields, so nothing has to guess from a file extension. Both take a direct link.

From an MCP client

Claude, Cursor and anything else that speaks MCP can drive PostWire directly. Point it at the hosted server with your key — setup per client is on the MCP page. After that you just ask: "post this to Mastodon and Discord", and the tool handles the rest.

From n8n, Make or Zapier

There is a community node for n8n (n8n-nodes-postwire), and apps for Make and Zapier. All three expose the same four actions: write and publish, publish, schedule, and look up the account. The account lookup earns its place as a guard at the top of a flow — it returns how many posts you have left before a loop spends them.

How the allowance is counted

A post is counted per network. One idea sent to three accounts spends three of your monthly posts, not one.
PlanPosts / monthBrandsAI drafts / day
Free30115
Starter300360
Pro2,00010300
Agency15,000501,500

A brand groups one business's accounts — its TikTok, its Instagram, its LinkedIn. A solo operator with six networks uses one brand; an agency's clients are separate brands, each with their own logins. Pass brand_id once you have more than one.

Scheduling

POST /api/schedule takes a run_at in the future and checks everything immediately — the network being connected, the media being present. A post that would have failed tomorrow morning fails now, while you are still looking at it.