Post with n8n

Post to social media
with n8n.

n8n talks to PostLake with the built-in HTTP Request node. Same body as the docs curl. No community node to maintain when a platform API changes.

Get started free →

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

In shortOne HTTP Request node → POST /v1/posts. Any trigger becomes a multi-network publish; branch on targets[] in the response.

When this guide is for you

Ops or growth already live in n8n and you want scheduled or AI-assisted posts without a separate node per network.

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.

Step by step in n8n

Configure once, then reuse on every run. Same request body as the docs, this is just how n8n sends it.

  1. Add an HTTP Request node: method POST, URL https://api.postlake.dev/v1/posts.
  2. Authentication → header Authorization = Bearer sk_live_…. Optionally add Idempotency-Key (e.g. from the trigger id).
  3. Body → JSON: { "text": "{{$json.message}}", "profile": "my-brand" }. Add platforms only if you want to filter networks on that profile.
  4. After the node. Use an IF/Switch on state or on each targets item. Partial success is a successful HTTP 200 with mixed target states.
  5. Wire any trigger (Schedule, Webhook, RSS, AI). Map text from earlier nodes into the body.

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 n8n code? Point it at MCP (https://api.postlake.dev/mcp). Prefer the dashboard? Use Quickstart → No code.

Common questions

How do I post to social media from n8n?

HTTP Request node: POST https://api.postlake.dev/v1/posts with Authorization: Bearer and JSON { text, profile }. PostLake fans out to connected accounts. No per-network community node.

Do I need a special n8n node per network?

No. One HTTP call covers every connected account on the profile (optionally filtered with platforms).

Can I schedule posts from n8n?

Yes, add scheduledAt (UTC, or a naive local time plus timezone) in the JSON body, or fire the workflow with n8n's Schedule trigger for "run now" posts. Credits charge when PostLake publishes.

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 →