Post 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
Ops or growth already live in n8n and you want scheduled or AI-assisted posts without a separate node per network.
Same setup the docs quickstart uses. Do this once:
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.sk_live_…). It shows once; treat it like a password.Configure once, then reuse on every run. Same request body as the docs, this is just how n8n sends it.
https://api.postlake.dev/v1/posts.Authorization = Bearer sk_live_…. Optionally add Idempotency-Key (e.g. from the trigger id).{ "text": "{{$json.message}}", "profile": "my-brand" }. Add platforms only if you want to filter networks on that profile.state or on each targets item. Partial success is a successful HTTP 200 with mixed target states.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 } }
]
}published: every target succeeded. partial: some published, some failed. failed: none published. processing: still going (async networks like TikTok).Idempotency-Key header on writes so a retry never double-posts.Same rules as the docs. Pick one addressing style:
"profile": "my-brand" posts to every account under that profile (the name on Channels)."platforms": ["bluesky", "linkedin"] narrows that set. It is a filter, not a selector: if you have two Pinterest boards, both match pinterest."accounts": ["acc_…"] for exact channels (copy an id on Channels, or GET /v1/social-accounts).profile? PostLake uses that profile. Multiple profiles and you omit it? You'll get an error that names them.See Publishing: where to post.
scheduledAt as UTC (trailing Z), or a naive local time plus timezone (IANA, e.g. Europe/London). Credits charge when it fires. Scheduling docs · scheduling guide.POST /v1/media, then pass the med_… id in media. Media docs.textOverrides (e.g. shorter text for X). Per-network options: platformOptions (Pinterest boardId, TikTok privacy, …). Live option lists: GET /v1/platforms/{platform}.POST /v1/posts/validate runs the same checks without publishing (free).state: "partial" is not "everything worked". Inspect targets before marking the workflow done.scheduledAt in the body as UTC (trailing Z) or a naive local time plus timezone.Prefer an assistant over n8n code? Point it at MCP (https://api.postlake.dev/mcp). Prefer the dashboard? Use Quickstart → No code.
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.
No. One HTTP call covers every connected account on the profile (optionally filtered with platforms).
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.
These guides stay short on purpose. Canonical behaviour lives here:
Also: Media · Errors · MCP · Analytics
All guides · Full docs · llms.txt · Markdown
Stuck? The docs are the source of truth, start at Publishing.
Open the dashboard →