How to Auto-Post to Social Media with n8n (2026)
One HTTP Request node, a Bearer key and an Idempotency-Key header: an n8n workflow that schedules posts and never double-posts on retry.

Short answer: To auto-post to social media with n8n, add an HTTP Request node that sends POST https://status200uploads.com/api/v2/posts with an Authorization: Bearer header and a JSON body naming the profile, the network and the text. Add post.scheduledFor with a time zone to schedule it instead of posting right away, and an Idempotency-Key header built from the item and the network, so that n8n's retries never post twice (API docs). The REST API is on every plan, the Free plan included (pricing). Below is the full setup, a working body, and a starter workflow.
Key Takeaways
| Point | Details |
|---|---|
| Node to use | HTTP Request on n8n Cloud and self-hosted; the community node on self-hosted only, for now |
| One request, one network | platform is one of tiktok, instagram, facebook, youtube, x, linkedin, pinterest, threads, skool |
| Scheduling | scheduledFor with a time zone, more than 60 seconds ahead, up to 365 days ahead |
| No double posts | Idempotency-Key such as {{ $json.id }}-linkedin, never from $now or a random value |
| Spacing | One post per network every 20 seconds per account; scheduled posts don't wait |
| Plan | REST API on every plan, Free included; the MCP connector is on paid plans from Beginner |
What you need
- An n8n instance, on n8n Cloud or self-hosted.
- A Status 200 Uploads account with at least one network connected on the Connections page. Note the profile handle, for example
@myprofile(API docs). - An API key. Sign in, go to API Management, click Generate Key and copy it straight away, because it's shown only once (API docs).
Keep the key in an n8n credential or header, never in client-side code, public repositories or logs, as our docs warn (API docs).
Which n8n node should you use?
| Route | Where it works | When to pick it |
|---|---|---|
| HTTP Request node | n8n Cloud and self-hosted | The default; every request is plain JSON you can see |
Community node @status200uploads/n8n-nodes-status200uploads |
Self-hosted (Settings → Community Nodes → Install) | You want ready-made operations and an automatic Idempotency-Key |
n8n Cloud installs only community nodes that n8n has verified, and ours isn't verified yet. So on Cloud, use the HTTP Request node (API docs, n8n guide). The rest of this guide uses the HTTP Request node, because it works everywhere.
Step 1: Add the HTTP Request node
n8n's HTTP Request node calls any REST API. You can fill in its parameters by hand or import a curl command. Set:
- Method:
POST - URL:
https://status200uploads.com/api/v2/posts
Step 2: Set the headers
Turn on Send Headers and add three:
| Header | Value |
|---|---|
Authorization |
Bearer rl_your_key |
Content-Type |
application/json |
Idempotency-Key |
{{ $json.id }}-linkedin |
The Idempotency-Key is what makes the workflow safe. The same item always makes the same key, so a retry gets the first answer back instead of posting twice. Never build it from $now or a random value, because each retry would then be a new post. Never let it come out empty, either: an empty key is refused with 400 idempotency_key_invalid, and an item without an id would make the key -linkedin, shared by every such item. A key is remembered for 24 hours (API docs).
Step 3: Write the JSON body
Turn on Send Body, choose JSON, and use n8n expressions such as {{ $json.caption }} to pull values from earlier nodes. Here is a scheduled LinkedIn text post:
{
"post": {
"accountId": "@myprofile",
"platform": "linkedin",
"scheduledFor": "{{ $json.publishAt }}",
"content": {
"text": "{{ $json.caption }}"
}
}
}
What each field does, from the API reference:
accountIdis the profile as shown on your Connections page: its UUID,@handleor bare name. Capital letters don't matter.platformpicks one network per request. To post the same item to three networks, send three requests, one per network, each with its own key.scheduledForneeds a time zone, for example2026-10-20T09:00:00+02:00or2026-10-20T07:00:00Z. More than 60 seconds ahead, the post is scheduled and the answer is202with"code": "scheduled". A time in the past or within the next 60 seconds publishes at once. A time without a zone is refused withno_time_zone, and more than 365 days ahead withtoo_far_ahead. At most 500 posts can wait per account.content.textis the caption, title or post text. It's required when the post has no media.
Want to test without posting? Add "dryRun": true next to post. Every check a publish makes is run and nothing is sent (API docs).
Adding media
For images or video, put full public https:// addresses in content.mediaUrls, or import the file first and send its mediaID. For a scheduled post this matters: mediaUrls are fetched when the post goes out, not when you schedule it, and no copy is kept, so the file must still be at that address then. A file sent as mediaID is kept until the post goes out, however far ahead it is (API docs). Some networks need extra fields, for example pinterest.boardId for every Pin (see how to schedule Pinterest Pins).
Step 4: Retries and spacing
Two node settings make the workflow dependable.
Retry On Fail. In the node's Settings, turn on Retry On Fail and set Max Tries and Wait Between Tries. Our n8n guide uses Max Tries 5 and 5000 ms. With the Idempotency-Key header, that never posts twice a post whose answer was lost. Without the header, n8n must not retry a scheduled post, because it would be scheduled twice (API docs).
Batching. Requests are spaced per account: one post per platform every 20 seconds. A scheduled post takes no such wait. A request that comes sooner gets HTTP 429, with the seconds to wait in a Retry-After header and in the body as retry_after_seconds, for tools that read only the body, such as n8n (API docs). If you publish several items at once to the same network, open Add Option → Batching in the HTTP Request node, set Items per Batch to 1 and Batch Interval (ms) to at least 20000 (n8n docs).
Even when scheduling, don't stack posts on the same minute. Posts due together go out one after another with no gap, and a network can refuse posts that arrive that close together, so leave at least a minute between posts on one network (API docs).
A starter workflow: from a sheet to every network
- Schedule Trigger, for example once a day.
- Google Sheets → Get rows where
statusisready, each with anid,caption,publishAtand a list of networks. - Split Out (or a Code node) to turn each row into one item per network. Give each a unique
idand aplatformvalue. - HTTP Request as above, with
"platform": "{{ $json.platform }}"in the body and{{ $json.id }}-{{ $json.platform }}as the Idempotency-Key. - IF on the answer: on
202 scheduled, mark the rowscheduled. On a 4xx, write the error message back to the row so a person can fix it.
Because scheduled posts don't wait for the 20-second spacing, a whole week can go in on one run. Every answer that made a post carries status200.status_url, the address that reads it back with GET /api/v2/posts/{id}, so a later workflow can check what happened (API docs).
Where n8n Agents fit
n8n 2.40, released 21 September 2026, added Agents: you describe what an agent should do, give it a model and the tools and workflows it can use, and it works out the steps itself. An agent can use any workflow as a tool, including the posting workflow above (n8n changelog). Two points from n8n itself:
- Agents are in Preview. "They can make mistakes … Test before you publish, and require approval on tools that write to" your systems (n8n changelog).
- One turn with an agent counts as one execution. Calls to workflow tools and sub-agents don't count separately (n8n blog).
A sensible split: let the agent draft captions and pick times, mark the posting workflow as a tool that needs approval, and send dryRun: true first so you see every warning before anything goes live.
n8n, Zapier or MCP?
If you already live in Zapier, the same API works there; see Zapier social media posting that scales. If you'd rather ask an AI app to "post this", our hosted MCP server at https://mcp.status200uploads.com/mcp works with Claude, Cursor, Windsurf and other MCP apps, on paid plans from Beginner. On every plan, Free included, you can automate through the HTTPS API with n8n, Zapier or Make (integrations). n8n is the better fit for repeatable, scheduled pipelines; MCP is the better fit for one-off requests.
FAQ
Can n8n post to social media on n8n Cloud? Yes. Use the HTTP Request node. Our community node needs self-hosted n8n until n8n verifies it.
Why is my scheduled time refused?
It almost always has no time zone. Send ISO 8601 with an offset, like +02:00, or with Z.
How do I stop n8n from posting twice when it retries?
Send an Idempotency-Key built from the item id and the network, and keep the body the same on every try.
Can one request post to several networks?
No. platform takes one network per request, so split each item into one item per network.
Is the API on the Free plan? Yes. The REST API is on every plan, Free included, with 30 successful posts a month on Free. Failed posts don't count. The MCP connector needs a paid plan from Beginner ($9/month).
Try it
Generate a key, paste the body above into an HTTP Request node, add "dryRun": true, and run it once. When the check comes back clean, remove dryRun and schedule your first post. The Free plan has 1 profile and 30 posts a month, with no credit card required.
Sourced
- Status 200 Uploads API docs (n8n guide, posts, scheduling, idempotency, throttle, media, dry run): https://status200uploads.com/docs/api
- Status 200 Uploads pricing (Free plan, REST API, MCP from Beginner): https://status200uploads.com/pricing
- Status 200 Uploads integrations (MCP URL, n8n/Zapier/Make on every plan): https://status200uploads.com/integrations
- n8n docs, HTTP Request node: https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/
- n8n docs, HTTP Request common issues (Batching, Retry On Fail): https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/common-issues/
- n8n changelog (Agents, n8n 2.40, 21 Sep 2026; Preview status): https://docs.n8n.io/changelog
- n8n blog, "Introducing n8n Agents" (25 Sep 2026): https://blog.n8n.io/introducing-n8n-agents/