Ship from your code. Same flow, programmatic.

Every dashboard action is a REST endpoint. Publishing, scheduling, accounts, analytics, webhooks. A first-party TypeScript SDK. An MCP server for Claude Desktop, Cursor, and ChatGPT. Scoped API keys per workspace so nothing leaks.

Clean REST API with predictable resources
TypeScript SDK on npm, plus a standalone MIT PHP library
MCP server for Claude, Cursor, ChatGPT (14 tools)
Scoped API keys per workspace, scoped per action
What the API actually looks like

Three lines of code. Three platforms scheduled.

Real shape of a publish call: pick a workspace, pass a caption and platforms, get back a post id and per-platform delivery status. Same call from TypeScript, PHP, or curl.

POST/v1/posts
TypeScript
PHP
curl
import { FoPost } from '@owlstackapp/sdk';

const client = new FoPost({ apiKey: process.env.OWLSTACK_API_KEY });

const accounts = await client.accounts.list({ workspaceId });

const post = await client.posts.create({
  workspaceId,
  status:     'scheduled',
  scheduleAt: '2026-09-01T09:00:00Z',
  content:    [{ text: 'Stop launching on Tuesday.', position: 0 }],
  accounts:   accounts.map((a) => ({ id: a.id })),
});
Response200 OK · 142ms
Post idpst_01H7K3MRGB8YZ4QVW
Deliveries (3)
Xscheduled · Mon 9:00am UTC
LinkedInscheduled · Mon 9:00am UTC
Blueskyscheduled · Mon 9:00am UTC
First-party TypeScript SDK, maintained by us
Per-key scopes: posts, accounts, analytics
Webhook callbacks for every event
The cost of gluing 30 platform APIs yourself

You wrote the Twitter integration. Then LinkedIn changed everything.

You shipped Twitter publishing in a weekend. Then LinkedIn took three days, the OAuth flow took a week, Instagram has the worst API in the world, and you have not even started TikTok.

Every platform breaks differently on the same day. Bluesky's rate limit changes. Threads adds a media-type restriction. Hashnode switches GraphQL versions. Your integration is on fire and you are shipping product.

You hand-rolled OAuth for 5 platforms. You store refresh tokens in your DB. Now you are responsible for token refresh, encrypted storage, and SOC 2-style key handling. Not the business you wanted to be in.

Is this for you?

Is the API for you?

For you if

  • You're building a product that needs to publish to social on behalf of your users
  • You run a content-ops pipeline that fires from CI, a CRM, or your own backend
  • You want to wire FoPost into Claude Desktop, Cursor, or ChatGPT via MCP and let the agent publish for you
  • You're an agency tool builder who wants to expose social publishing to your own clients without managing 30 platform integrations

Not for you if

  • You only post by hand from the dashboard. The API is overkill, the composer is the right surface.
  • You need full white-label API hosting (your-brand.api.com). Talk to us about an enterprise arrangement.
What's inside

One API. 29 platforms. We own the breakage.

You write to one schema. We fan it out to 29 platforms, refresh the tokens, handle the rate limits, deliver the post, and surface the errors. You ship the feature.

Clean, predictable REST

Predictable resources (posts, accounts, workspaces, deliveries, webhooks). One consistent request and response shape across every endpoint, versioned under /v1.

TypeScript SDK, plus a standalone PHP library

TypeScript (npm install @owlstackapp/sdk) wraps this REST API. PHP (composer require owlstack/owlstack-core, MIT-licensed) is standalone: it publishes direct to 11 platforms with your own credentials, no FoPost account.

MCP server for AI assistants

npx -y @owlstackapp/mcp connects your FoPost workspace to Claude Desktop, Cursor, ChatGPT, and any MCP-compatible agent. 14 tools available: publish, schedule, analytics, account management. Auth via API key.

Scoped keys per workspace

Per-workspace keys with action scopes: posts, accounts, workspaces, labels, publish, deliveries, webhooks, analytics, automations. JWT for UI, API keys for code. No agency-wide super-key.

Outgoing webhooks for every event

Subscribe to publish.success, publish.failed, account.disconnected, account.reconnected, automation.triggered, and more. Every payload is signed so you can verify it came from us, and failed deliveries retry with exponential backoff.

Rate limits sized for real work

The limit sits well above what a publishing integration needs on every plan, and Business gets a higher ceiling for teams automating at agency volume. Go over it and you get a clean 429 with a Retry-After to back off on, not a silent drop or a suspended key.

How it works

Generate. Install. Publish.

01

Generate an API key

In the workspace you want to publish from, create an API key with the scopes you need (posts and accounts is enough to start). Copy it once. Treat it like a secret.

02

Install the SDK

npm install @owlstackapp/sdk. Or skip the SDK and hit the REST endpoints directly. Or skip both and use the MCP server from Claude.

03

Make the call

Three lines: import, instantiate, create. The publish call returns a post id and per-platform delivery status. The post lands in your dashboard's queue, ships at the scheduled time.

04

Subscribe to webhooks (optional)

Add a webhook URL in workspace settings. Subscribe to publish.success and publish.failed. Your endpoint gets a signed POST when each delivery lands or fails. Now your system stays in sync.

vs the alternatives

Why this beats hand-rolling 30 platform integrations.

Three ways developers approach multi-platform publishing today. Only one of them is a real API with SDKs, an MCP server, and someone else owning the breakage.

DIY: 30 platform APIs yourself

What technical founders attempt

  • OAuth flow per platform. Token storage. Token refresh. Encrypted secret handling.
  • Different rate limit, different error shape, different media constraints per platform.
  • When LinkedIn changes its API, you change your code. Same for Bluesky, Threads, Hashnode.
  • You stop adding platforms after Twitter and LinkedIn. The other 29 stay on the wishlist.

Buffer or Hootsuite API

What incumbents ship

  • Public API exists but feels like an afterthought. SDKs are community-maintained, sometimes.
  • No MCP server. Hooking it into Claude or Cursor is a custom integration.
  • Per-seat pricing makes the API a cost center for agencies.
FoPost

FoPost API + SDKs + MCP

What you actually want

  • One REST schema covers 29 platforms, and the browser extension covers Substack, which has no write API.
  • TypeScript SDK maintained by us, plus an MIT PHP library.
  • MCP server ships today: npx -y @owlstackapp/mcp into Claude Desktop, Cursor, ChatGPT.
  • Per-workspace scoped keys, signed webhooks, retries built in. We own the breakage.

Publishes to all major networks

Frequently asked questions

Is the API available on every plan?

It is included on Pro and Business with full read and write. On Starter you add it for $5/mo, which still puts a real REST API in reach for $24 a month total. The endpoints, scopes, and SDKs are identical on all three. The one difference is the request ceiling, which is highest on Business.

Where is the API reference?

fopost.com/docs/api has the full reference with code samples in TypeScript, PHP, and curl for every endpoint.

Are the SDKs paid?

No. TypeScript (@owlstackapp/sdk) is free on npm and talks to this API, so you need API access on your plan to use it against your account. The PHP library (composer require owlstack/owlstack-core, MIT-licensed) is free and standalone: it publishes direct to 11 platforms using your own credentials and needs no FoPost account at all. It also powers our Laravel package and WordPress plugin.

What about MCP for Claude, Cursor, and ChatGPT?

Ships today as @owlstackapp/mcp on npm. npx -y @owlstackapp/mcp gets you a stdio MCP server, point it at any MCP-compatible client (Claude Desktop, Cursor, ChatGPT desktop, Goose, Continue), auth with OWLSTACK_API_KEY, you get 14 tools: publish, schedule, list posts, get analytics, manage accounts, and more.

How do API key scopes work?

Each key is bound to one workspace, with a list of action scopes you pick at creation: posts, workspaces, accounts, labels, publish, deliveries, webhooks, analytics, automations. A key without the "accounts" scope cannot list or modify accounts even if the user authorized those actions. Scopes are checked server-side on every call.

What rate limits should I plan for?

Normal publishing traffic will not come near the limit on any plan. The ceiling depends on the plan behind your key, and Business runs on the highest one, because that is the tier that automates hardest against the API. Handle a 429 the way you would with any API: every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset, a 429 adds Retry-After, so back off and retry and you will not have to think about it again. We do not publish the exact threshold, because it is a moving abuse control rather than a promise.

Do you sign webhook payloads?

Yes. Every webhook POST carries a signature header derived from the body and your webhook secret, so you can verify the payload came from us before trusting it. The docs cover how to check it. Failed deliveries retry several times with exponential backoff before we give up.

Ready to try rest api & sdks?

7-day free trial. 30 platforms. Unlimited posts on every plan.