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.
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.
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, …)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/…" }
]
}# 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.
| Platform | Text | Media | Text limit | Status |
|---|---|---|---|---|
| Bluesky | ✅ | Image ×4 · Video | 300 | Live |
| Threads | ✅ | Image carousel · Video | 500 | Live |
| X / Twitter | ✅ | Image ×4 · Video | 280 | Rolling out |
| ✅ | Image · Video | 3,000 | Rolling out | |
| ✅ | Image multi · Video | — | Rolling out | |
| caption | Image · Video (Reels) | 2,200 | Rolling out | |
| TikTok | caption | Video | 2,200 | Rolling out |
| YouTube | title + desc | Video | 5,000 | Rolling out |
| caption | Image · Video | 500 | Rolling 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."-
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).
-
Paste the PostLake MCP URL
https://api.postlake.dev/mcp -
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.
Claude
Add it in Claude Desktop's connector settings, or one command in Claude Code:
claude mcp add postlake https://api.postlake.dev/mcpChatGPT
In ChatGPT (Developer mode / custom GPT actions), add a new MCP connector pointing at:
https://api.postlake.dev/mcpCursor
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.
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
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.
curl https://api.postlake.dev/v1/me \
-H "Authorization: Bearer sk_live_YOUR_KEY"- 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.
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.