For developers

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

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.

PlanPrice a monthBrandsPosts a monthAPI requests a minute per keyWebhooksWhite label
Free$0120, 2 networks per post602No
Pro$2910Unlimited, fair use 10,00030010Your name and logo
Agency$9950Unlimited, fair use 50,00060025Full: your mark only
Scale$299200Unlimited, fair use 150,0001,20050Full: 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 price10 end users50 end users200 end usersSource, 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.