API Reference

One API for 9 platforms.

Publish, schedule, and benchmark social posts across X, LinkedIn, Instagram, TikTok and more — through a single integration with one normalised response shape. Connect an AI agent in a click, or call the REST API yourself.

Base URL
https://api.postlake.dev
Version
v1.0.0
Auth
Bearer <api_key>

Getting started

There are two ways to use PostLake: connect an AI agent (no code), or call the REST API directly. For the API, create a key from your dashboard and send it as a Bearer token. All requests and responses use JSON unless noted otherwise.

# Validate your API key
curl https://api.postlake.dev/v1/me \
  -H "Authorization: Bearer YOUR_API_KEY"

Create your first post

One call publishes to every account you choose and returns one normalised response — so you (or an agent) never branch per platform. Here's the whole flow.

1. See your connected accounts
curl https://api.postlake.dev/v1/social-accounts \
  -H "Authorization: Bearer YOUR_API_KEY"
# → each has an id like "acc_…" and its platform (bluesky, threads, …)
2. Post — to one account or many at once
curl -X POST https://api.postlake.dev/v1/posts \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "Hello from PostLake 👋",
    "accounts": ["acc_123", "acc_456"]
  }'

The response is the same shape for every platform — one post id, and a target per account telling you exactly what happened and where:

# 200 OK
{
  "id": "post_a1b2c3",
  "state": "published",
  "targets": [
    { "platform": "bluesky", "state": "published", "url": "https://bsky.app/…" },
    { "platform": "threads", "state": "published", "url": "https://threads.net/…" }
  ]
}
3. Add an image — upload it, then attach the id
# upload returns { "id": "med_…" }
curl -X POST https://api.postlake.dev/v1/media \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: image/jpeg" \
  --data-binary @photo.jpg

# then reference it in the post (Bluesky up to 4 images, Threads carousels too)
curl -X POST https://api.postlake.dev/v1/posts \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "text": "With a picture this time",
    "media": ["med_abc"],
    "accounts": ["acc_123"]
  }'

Schedule instead of posting now: add "scheduledAt": "2026-08-01T09:00:00Z". Credits: each post costs 1 credit per platform; X costs 5 (55 with a link). You're only charged for posts that actually go out. See pricing →

What each platform supports

The call is identical everywhere, but each network has its own rules. Here's exactly what's supported today, so you (or an agent) know what to expect before posting.

PlatformTextMediaText limitStatus
BlueskyImage ×4 · Video300Live
ThreadsImage carousel · Video500Live
X / TwitterImage ×4 · Video280Rolling out
LinkedInImage · Video3,000Rolling out
FacebookImage multi · VideoRolling out
InstagramcaptionImage · Video (Reels)2,200Rolling out
TikTokcaptionVideo2,200Rolling out
YouTubetitle + descVideo5,000Rolling out
PinterestcaptionImage · Video500Rolling out

Post over a platform's text limit and that target fails with a clear message (the others still go out) — you're never charged for a post that didn't publish. "Rolling out" platforms move to "Live" as each completes its platform review.

Two ways to use it

PostLake is one service you can reach in two ways. Pick whichever fits — they share the same accounts, the same 9 platforms, and the same normalised responses.

Call the API yourself

You're a developer (or using a tool like Zapier or Make). You create an API key and call our REST API from your own code to publish, schedule, and read analytics. Jump to API keys →

Connect an AI agent

You want an AI assistant — Claude, ChatGPT, or any agent — to run your socials by conversation. No code: connect it once, then just ask it to post. Jump to connecting an agent →

Connect an AI agent

PostLake runs a hosted MCP server — the open standard that lets AI agents use external tools. Connect your agent once and it can post, schedule, and pull analytics across all 9 platforms on your behalf, just by you asking in plain language.

For example, once Claude is connected you can say:

"Post this photo to Instagram and LinkedIn, schedule a follow-up
for Friday at 9am, and tell me which of last week's posts did best."
Connect in three steps
  1. Open your agent's connector settings

    In Claude: Settings → Connectors → Add custom connector. ChatGPT, Cursor, and others have an equivalent "add MCP server" option (snippets below).

  2. Paste the PostLake MCP URL

    https://api.postlake.dev/mcp
  3. Approve on the PostLake screen

    You'll be sent to a PostLake Authorize screen. Sign in (if you aren't already) and click Approve. That's it — no API key to copy. The agent now appears under Connected Apps in your dashboard.

Per-agent setup

Claude

Add it in Claude Desktop's connector settings, or one command in Claude Code:

claude mcp add postlake https://api.postlake.dev/mcp

ChatGPT

In ChatGPT (Developer mode / custom GPT actions), add a new MCP connector pointing at:

https://api.postlake.dev/mcp

Cursor

Add PostLake to ~/.cursor/mcp.json:

{
  "mcpServers": {
    "postlake": { "url": "https://api.postlake.dev/mcp" }
  }
}

Gemini CLI & GitHub Copilot

Register PostLake as an MCP server (Gemini: gemini mcp add; VS Code Copilot: Agent mode → MCP servers → Add) with the same URL above.

What the agent can do

Once connected, the agent has 18 tools. In practice that means it can:

  • Publish & schedule — post now or for later, edit or cancel scheduled posts
  • Manage channels — list connected accounts, connect new ones, organise profiles
  • Read analytics — per-post and cross-platform performance to decide what's next
  • Stay safe — every action runs on your account, with idempotent retries
Managing & revoking access

Every agent you authorize is listed under Connected Apps in your dashboard. Click Revoke next to any one to cut off its access immediately — it would need to re-authorize to return. Approving an agent never exposes your API keys.

API keys & auth

Every direct API request authenticates with a secret key in the Authorization header. Keys look like sk_live_… and carry full access to your account, so treat them like a password.

Authenticate a request
curl https://api.postlake.dev/v1/me \
  -H "Authorization: Bearer sk_live_YOUR_KEY"
Creating & revoking keys
  • Create, name, and revoke keys on the API Keys page in your dashboard. Name them per app or environment (e.g. “CI server”, “Zapier”) so you can revoke one without affecting the rest.
  • A key's secret is shown once, at creation. We only ever store a hash — we can't show it again, so save it somewhere safe.
  • If a key leaks, revoke it from the dashboard; it stops working immediately.
A note on key names

PostLake keys are secret server-side keys (prefix sk_live_). There is no separate “publishable” key — every endpoint is server-to-server, so never embed a key in a browser, mobile app, or public repo.

Loading API reference...