Cross-post via API

Post to every network
in one call.

Cross-posting usually means nine APIs. PostLake takes one request, fans out to the accounts you address, and returns one Post with a targets array. Platforms is a filter on that set, not a magic "create these networks" list.

Get started free →

Free tier. No card · one API for every network · full MCP access

In shortAddress a profile (every connected account) or filter with platforms[]. One POST; read targets[] for per-network status. Partial success is normal.

When this guide is for you

The job is true cross-posting, launches, announcements, agent outputs, and you refuse nine publish paths.

Before you start

Same setup the docs quickstart uses. Do this once:

  1. Sign up at app.postlake.dev and verify your email (unlocks free credits).
  2. On Channels, create a profile (e.g. my-brand) and connect at least one account. Bluesky is the fastest first channel: no app review. Instagram/TikTok/Facebook need each platform's review before API posting.
  3. Account menu → API Keys → create a key (sk_live_…). It shows once; treat it like a password.

One request. Every connected account

Same as the docs quickstart: name the profile (or omit it if you only have one). That posts to every account under it. Use platforms only to narrow:

curl -X POST https://api.postlake.dev/v1/posts \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: launch-day-001" \
  -d '{
    "text": "We just shipped something 🚀",
    "profile": "my-brand"
  }'

# Optional: only some networks on that profile
# "platforms": ["bluesky", "linkedin", "threads"]

Make it work

Tool-specific glue on top of the shared setup above:

  1. Connect every account you want under one profile on Channels (Bluesky first to verify the path).
  2. POST /v1/posts with text + profile. Omit platforms for all accounts on the profile.
  3. Read targets[]: one entry per account, each with state and url or error.
  4. Treat partial as expected when one network rejects, others still publish; failed targets are free.
  5. Need one board/page among duplicates? Use accounts: ["acc_…"] instead of platforms (filter hits all matches).

Read the response (don't skip this)

You get one Post with an overall state and a targets[] array. One entry per account. Always check each target; partial success is normal.

{
  "id": "post_a1b2c3",
  "state": "partial",
  "targets": [
    { "platform": "bluesky",  "state": "published", "url": "https://bsky.app/…" },
    { "platform": "linkedin", "state": "failed",
      "error": { "type": "invalid_request", "message": "…", "retryable": false } }
  ]
}

Where the post goes

Same rules as the docs. Pick one addressing style:

See Publishing: where to post.

Do more (same API)

Pitfalls specific to this path

Prefer an assistant over Post everywhere at once code? Point it at MCP (https://api.postlake.dev/mcp). Prefer the dashboard? Use Quickstart → No code.

Common questions

How do I post to all social media at once?

POST /v1/posts with your API key and a profile name. PostLake publishes to every account under that profile and returns targets[] with each status and URL. See docs → Publishing.

What happens if one network fails?

The others still publish. Overall state becomes partial; only the failed target shows an error. You're only charged for targets that publish.

Can I change the content per network?

Yes, textOverrides for captions, platformOptions for network-specific fields (e.g. Pinterest boardId), in the same request.

How much does cross-posting cost?

Credits per successful target (X costs more because X charges us). Failed targets are free. Free tier includes monthly credits; X/TikTok need purchased credits on free.

Go deeper in the docs

These guides stay short on purpose. Canonical behaviour lives here:

Also: Media · Errors · MCP · Analytics

Related guides

All guides · Full docs · llms.txt · Markdown

Stuck? The docs are the source of truth, start at Publishing.

Open the dashboard →