PostWire API reference

Publish one idea as a native post on each network, schedule it, and get told when it goes out. JSON over HTTPS at https://postwire.io. Every endpoint has a copyable example in curl, Node and Python.

View as MarkdownOpenAPIBase URL https://postwire.io

Quick start

  1. Get a key. Sign up at postwire.io and open API & MCP. Keys start with pw_live_. The Free plan includes the API.
  2. Connect a network. Telegram, Bluesky, Mastodon and Discord with POST /api/connect; TikTok, YouTube, Instagram, Facebook Pages and LinkedIn with OAuth (POST /api/oauth/{platform}/url). Or in the dashboard.
  3. Publish. One request, every network you name:
curl
curl -X POST "https://postwire.io/api/post" \
  -H "Authorization: Bearer $POSTWIRE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "platforms": [
    "bluesky",
    "telegram"
  ],
  "text": "Hello from the PostWire API"
}'
Node
const res = await fetch("https://postwire.io/api/post", {
  method: "POST",
  headers: { Authorization: `Bearer ${process.env.POSTWIRE_API_KEY}`, "Content-Type": "application/json" },
  body: JSON.stringify({
    "platforms": [
      "bluesky",
      "telegram"
    ],
    "text": "Hello from the PostWire API"
  }),
});
console.log(res.status, await res.json());
Python
import os, requests

r = requests.post(
    "https://postwire.io/api/post",
    headers={"Authorization": f"Bearer {os.environ['POSTWIRE_API_KEY']}"},
    json={
        "platforms": ["bluesky", "telegram"],
        "text": "Hello from the PostWire API",
    },
)
print(r.status_code, r.json())

Authentication

Send the key in Authorization: Bearer pw_live_… (or X-API-Key: pw_live_…). A missing or wrong key answers 401. Publishing needs a verified email and a full-access key, otherwise 403. If PostWire cannot check a key because of its own outage it answers 503 auth_unavailable, never 401: retry, do not throw the key away.

Keys can be created with an expiry and revoked at once: see Account, keys and billing. GET /api/platforms, GET /api/plans and GET /api/status need no key.

One result per network

Publishing answers 200 with posted (networks that went out) and results[], one entry per network, each with ok and, when it did not go out, error and a machine-readable code. One network failing never fails the request or the others. A request-level problem (bad JSON, nothing connected, a network connected in two brands without brand_id) answers 4xx before anything is sent.

A post counts once per network that published: one idea to three networks is three of the month's posts. Networks refused before sending (not connected, held by the plan, media missing) spend nothing.

Pages

PageWhat is in it
PublishPublish one post to one or many networks now, and check a post's status.
Schedule and queueQueue posts for a time or for the next free slot, edit and cancel them, and fill a week from one topic.
Bulk upload, recurring posts and RSSA month of posts from one CSV, checked row by row and scheduled whole or not at all; posts that repeat; RSS feeds that become posts.
AI writingWrite a native post per network from one idea, without publishing.
MediaUpload photos and videos up to 1 GB and get a URL to publish with.
Networks and connectionsList networks, connect accounts (yours or your clients'), check and move connections.
BrandsGroup each business's accounts and publish as that brand.
Analytics (What works)Your best posts against your own median, the patterns behind them, and drafts modelled on a winner.
Coach (results and next move)What happened to your posts this week, your goal and streak, the one next move, today's next best post and a first-line check.
Webhook endpointsRegister the URLs PostWire calls when a post publishes or fails.
Account, keys and billingSign up, read usage and limits, manage API keys and the plan.
TeamsInvite people by email with a role and, if you want, only some brands; switch between workspaces.
X (Twitter) creditsPost to X as a pay-per-use add-on of the paid plans: what each post uses, what is left, and top-ups.
Approvals, limits and activityMake posts wait for a person, give each API key and AI app its own limits, and see who did what.
Service statusThe data behind the public status page, without an API key.
Network optionsEvery option per network: TikTok privacy and labels, YouTube privacy and tags, Instagram and Facebook post types, LinkedIn first comment and documents, alt text.
Errors, limits and idempotencyError shape, result codes, request rate limits, network rate limits, retries without duplicates.
Webhooks guideEvents, signature verification in Node.js and Python, retries.
Schema changelogEvery change to the API schema, by date, generated from the spec's history.

Plans and limits

From GET /api/plans, the same table the billing code reads. A post counts once per network. Every paid plan can be billed monthly or yearly at 20% off (interval: "year" on POST /api/billing/checkout, ?interval=year on GET /api/billing/upgrade-link).

PlanPriceBilled yearlyPosts a monthPosts a dayBrandsAI drafts a dayAI drafts a month (about)Networks per postScheduled at a time
Free$0—202015~2023
Starter$9/month$86.40/year ($7.20/month)1,000200360~30allup to 1,000
Pro$29/month$278.40/year ($23.20/month)unlimited (fair use 10,000)50010300~60allup to 5,000
Agency$99/month$950.40/year ($79.20/month)unlimited (fair use 50,000)2,000501,500~150allup to 20,000
Scale$299/month$2870.40/year ($239.20/month)unlimited (fair use 150,000)7,5002005,000~330allup to 50,000

Every plan includes the REST API, the MCP server, webhooks and TikTok. See pricing.

Fair use: every limit

"Unlimited posts" on Pro, Agency and Scale has a published ceiling that no honest customer meets, and these are the only limits. They are per workspace, enforced on the server, and each one answers with its own code, the number and when it resets (see errors and limits). GET /api/usage and GET /api/me show today's posts and the month's media against them.

LimitFreeStarterProAgencyScale
Posts a month201,000unlimited, fair use 10,000unlimited, fair use 50,000unlimited, fair use 150,000
Posts a day (UTC)202005002,0007,500
Scheduled posts waiting (queued + held)501,0005,00020,00050,000
Largest file250 MB1 GB1 GB1 GB1 GB
AI drafts a day5603001,5005,000
AI drafts a month (about; extra in AI credit packs)~20~30~60~150~330
Media uploaded a month1 GB4 GB15 GB40 GB120 GB
Media sent to networks a month2 GB6 GB15 GB45 GB140 GB
Webhook endpoints25102550
API requests a minute, per key601203006001,200
Publishes at once2351020

A sudden spike — more posts in one hour than 10 times the workspace's usual hour, and never less than a quarter of its day — pauses publishing until the hour ends (throttled); scheduled posts keep their place. Media is kept 30 days. X posts use X credits on top of these.

Machine-readable

  • OpenAPI 3.0: /openapi.json.
  • Every page of this reference as Markdown: add .md (for example /docs/publishing.md), or use the Markdown link at the top of each page.
  • MCP server for Claude, ChatGPT and other agents: /mcp/. For AI crawlers: /llms.txt.