# The social publishing layer for AI agents and SaaS

> One REST API and MCP server that publishes to TikTok, Instagram, YouTube, LinkedIn and more for your users: connect links, brands, approvals, webhooks. Free key.

Source: https://postwire.io/developers/ · Markdown for agents; the HTML page has the same content.

For developers

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.

[Create a free API key](https://postwire.io/dashboard.html?from=developers#api) [See Agency and Scale](https://postwire.io/pricing/#plan-tiers)

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`](https://postwire.io/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](https://postwire.io/docs/webhooks/).

### 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](https://postwire.io/openapi.json) and the [API reference](https://postwire.io/docs/). 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](https://postwire.io/mcp/clients/).

## 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](https://postwire.io/docs/approvals/).

## Plans for builders

From [`GET /api/plans`](https://postwire.io/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](https://postwire.io/pricing/).

## 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](https://postwire.io/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](https://www.ayrshare.com/pricing/) |
| Zernio | $168 (50 accounts) | $468 (250 accounts) | $1,218 (1,000 accounts) | [zernio.com/pricing.md](https://zernio.com/pricing.md) |
| Upload-Post | $50 (Professional, 25 profiles) | $147 (Advanced, 75 profiles) | $438 (Business, 225 profiles) | [upload-post.com/llms-full.txt](https://www.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](https://bundle.social/pricing) |
| Post for Me | $10 (1,000 posts) | Not published (over 1,000 posts) | On request (Enterprise) | [postforme.dev/pricing](https://www.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](https://postwire.io/docs/errors/).

**Is there a page for agents to read?**

Yes. This page is also served as Markdown at [/developers.md](https://postwire.io/developers.md), and the whole product is described in [llms.txt](https://postwire.io/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.

[Create a free API key](https://postwire.io/dashboard.html?from=developers#api) [See Agency and Scale](https://postwire.io/pricing/#plan-tiers) [Read the API docs](https://postwire.io/docs/)
