The social publishing layer for AI agents and SaaS
One REST endpoint, or one MCP tool, publishes to the social accounts your users connect. Your users connect through a hosted link, each customer gets its own brand, and every key has limits and approval rules that an agent cannot switch off.
The Free plan includes the API and the MCP server. No card.
Networks today: TikTok, Instagram, YouTube, Facebook Pages, LinkedIn (personal profiles), Bluesky, Mastodon, Telegram, Discord, Slack and Nostr, plus full articles on WordPress, Dev.to and Hashnode. X is a pay-per-use add-on on paid plans. The live list, with what each network needs, is at GET /api/platforms.
What you build on
One call, many networks
POST /api/post publishes to every network you list, in parallel, with one result per network. Send per_platform to give each network its own text, title and media. POST /api/schedule, /api/bulk and /api/recurring queue posts for later.
Connect links for your users
POST /api/connect-link returns a hosted page, valid for 1 hour, where your user signs in to their own account. They need no PostWire login, and the connection is saved into the brand you name.
A brand per customer
POST /api/brands creates a separate brand for each customer, with its own connected accounts. Every publish call takes a brand_id, so one customer's post never reaches another customer's accounts.
Approvals and guardrails
A brand can hold posts for a person to approve, by source, network, link, price or word. Each API key or AI app gets a monthly cap, allowed networks and brands, and "always needs approval". An API key or AI connector can never approve a post.
Signed webhooks
post.published, post.failed, connection.reauth_required, approval.requested and approval.decided, signed with HMAC in the PostWire-Signature header. How to verify.
Your own developer apps are not needed
Your users connect to PostWire's approved apps: TikTok Direct Post audit approved 7 Jul 2026, Meta App Review (Instagram, Facebook Pages) approved 14 Jul 2026, Google's youtube.upload verification approved 1 Jul 2026.
A native post per network
POST /api/generate (MCP: generate_posts) writes a different post for each network from one prompt: a TikTok caption, a YouTube title and description, a LinkedIn post. You can edit the drafts before you publish them.
Safe retries
An identical post is refused for 2 minutes. With your own idempotency_key, the same key is refused for 24 hours, so a retried request never posts twice.
Quickstart with curl
Every route below is in the OpenAPI spec and the API reference. Keys start with pw_live_ and go in a Bearer header.
1 Create a brand for your customer
curl https://postwire.io/api/brands \
-H "Authorization: Bearer $POSTWIRE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Acme Bakery"}'
# → { "ok": true, "brand": { "id": "BRAND_ID", "name": "Acme Bakery" } }
At the plan's brand limit the answer is 400 brand_limit_reached, with an upgrade link.
2 Send your customer a connect link
curl https://postwire.io/api/connect-link \
-H "Authorization: Bearer $POSTWIRE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"brand_id": "BRAND_ID"}'
# → { "url": "https://postwire.io/connect/#…", "token": "…", "expires_in": 3600, "brand_id": "BRAND_ID" }
Without platform the page offers every network; add "platform": "tiktok" to offer only one. GET /api/connections shows what got connected.
3 Publish to that brand's accounts
curl https://postwire.io/api/post \
-H "Authorization: Bearer $POSTWIRE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"brand_id": "BRAND_ID",
"platforms": ["linkedin", "bluesky"],
"per_platform": {
"linkedin": { "text": "Fresh sourdough every morning from 7am. Here is how we bake it." },
"bluesky": { "text": "Sourdough out of the oven at 7am." }
},
"idempotency_key": "acme-2026-10-15-sourdough"
}'
The 200 answer has one result per network, with the post's link. A post held by an approval rule answers 202 with status: "pending_approval" and is not published until a person approves it.
4 Get told when it goes out
curl https://postwire.io/api/webhooks \
-H "Authorization: Bearer $POSTWIRE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/hooks/postwire",
"events": ["post.published", "post.failed", "connection.reauth_required"]}'
# → 201 { "webhook": { … }, "secret": "whsec_…" } (the secret is shown once)Or give your agent the MCP server
The hosted server at https://postwire.io/api/mcp has 21 tools and accepts an API key or an OAuth 2.1 sign-in. It is listed in Claude's connector directory.
# Claude Code, hosted server, OAuth sign-in
claude mcp add --transport http --scope user postwire https://postwire.io/api/mcp
# then inside Claude Code: /mcp → postwire → Authenticate
# Same server with an API key from the environment
claude mcp add --transport http --scope user postwire https://postwire.io/api/mcp \
--header 'Authorization: Bearer ${POSTWIRE_API_KEY}'
# Local over stdio
claude mcp add --env POSTWIRE_API_KEY=pw_live_your_key --transport stdio postwire \
-- npx -y postwire-mcp
The multi-tenant flow above maps to tools: create_brand, create_connect_link (with brand_id), generate_posts, post_to_social, schedule_post and get_post_status. Setup for Cursor, VS Code, Windsurf, Codex and other clients: MCP client guides.
Guardrails your agent cannot remove
- Per API key or AI app: a monthly post cap, the networks and brands it may use, and "always needs approval". These limits are set from a signed-in dashboard session only (
PUT /api/guardrails/{kind}/{id}), so a key cannot raise its own limits. - Per brand: hold posts for approval by source (API key, AI agent over MCP, n8n, Make or Zapier, dashboard), by network, or when a post has a link, a price or a listed word. The rules are plain server-side checks, not AI.
- Who approves: the account owner, from the dashboard or an emailed link, or a client approver through a signed, single-use link (Pro and above). Never an API key and never an AI connector.
- Activity log with CSV export on every plan. Details: approvals and guardrails.
Plans for builders
From GET /api/plans. A brand is one business with all its connected networks. Approvals and per-key guardrails are on every paid plan.
| Plan | Price a month | Brands | Posts a month | API requests a minute per key | Webhooks | White label |
|---|---|---|---|---|---|---|
| Free | $0 | 1 | 20, 2 networks per post | 60 | 2 | No |
| Pro | $29 | 10 | Unlimited, fair use 10,000 | 300 | 10 | Your name and logo |
| Agency | $99 | 50 | Unlimited, fair use 50,000 | 600 | 25 | Full: your mark only |
| Scale | $299 | 200 | Unlimited, fair use 150,000 | 1,200 | 50 | Full: your mark only |
Yearly billing is 20% off. White label covers the client portal and the connect and approval pages opened from a client link. Starter ($9, 3 brands) and every limit are on the pricing page.
What it costs by number of end users
Each end user has 5 networks and posts about 20 times a month on each. A PostWire brand, an Ayrshare profile and an Upload-Post profile each hold one end user with all their networks. Zernio charges per connected account, and bundle.social and Post for Me charge per post.
| Monthly price | 10 end users | 50 end users | 200 end users | Source, read 15 Oct 2026 |
|---|---|---|---|---|
| PostWire | $29 (Pro) | $99 (Agency) | $299 (Scale) | /api/plans |
| Ayrshare | $299 (Launch, 10 profiles) | $778.80 (Business + 20 × $8.99) | $1,577.30 (Business + 70 × $8.99 + 100 × $3.49) | ayrshare.com/pricing |
| Zernio | $168 (50 accounts) | $468 (250 accounts) | $1,218 (1,000 accounts) | zernio.com/pricing.md |
| Upload-Post | $50 (Professional, 25 profiles) | $147 (Advanced, 75 profiles) | $438 (Business, 225 profiles) | upload-post.com/llms-full.txt |
| bundle.social | $100 (Pro, 1,000 posts) | $100 (Pro, 5,000 posts) | $400 (Business, 20,000 posts) | bundle.social/pricing |
| Post for Me | $10 (1,000 posts) | Not published (over 1,000 posts) | On request (Enterprise) | postforme.dev/pricing |
Zernio: 2 accounts free, accounts 3 to 10 at $6, 11 to 100 at $3, 101 and up at $1. Ayrshare Business is $599 with 30 profiles. Monthly prices, before any yearly discount. The vendors support different networks and features, and their prices change: check each linked page before you decide. PostWire's Scale holds up to 200 brands today.
Questions
Do my users need a PostWire account?
No. The connect link opens a hosted page where they sign in to the social network itself. The account is saved into the brand you created for them, under your PostWire account.
Do I need my own TikTok, Meta or Google developer app?
No. Your users connect to PostWire's approved apps. On TikTok, posts can be public from the first call, and the account owner chooses who sees each post.
Can my agent publish without a person checking?
Only if you allow it. Turn on "always needs approval" for the agent's key, or an approval rule on the brand, and every post it sends waits for a person. The agent's key cannot approve and cannot change its own limits.
What happens when I reach a limit?
The API answers with a code and says what was held: 400 brand_limit_reached for brands, 403 key_monthly_cap_reached for a key's cap, 429 with Retry-After for the request rate. Errors are listed in the error reference.
Is there a page for agents to read?
Yes. This page is also served as Markdown at /developers.md, and the whole product is described in llms.txt.
Start with a free key
Create a key, make the four calls above against your own accounts, then move to Agency or Scale when you onboard customers.