Social media posting from n8n
Post to X, LinkedIn, Instagram, TikTok and six more networks from n8n with the HTTP Request node: exact settings, pagination, idempotency and example workflows.
What you can automate
Publish every new RSS item to X and LinkedIn
- 1RSS Feed Trigger: new item
- 2HTTP Request: POST /v1/posts with the title and link
Schedule a Google Sheets row as a post
One row per post, with text, an image URL and a date column in ISO 8601.
- 1Google Sheets Trigger: row added
- 2HTTP Request: POST /v1/posts with scheduled_at from the row
- 3Google Sheets: write the post id back to the row
Post new Shopify products to Instagram
Instagram needs media: map the product image URL into
media.- 1Shopify Trigger: product created
- 2HTTP Request: POST /v1/posts with media [{ url, type: "image" }]
Alert Slack when a post fails
Poll
status=partially_publishedthe same way to catch posts that failed on some accounts.- 1Schedule Trigger: every 15 minutes
- 2HTTP Request: GET /v1/posts?status=failed
- 3Remove Duplicates: skip ids seen in earlier runs
- 4Slack: send each target’s error
Reply to comments with an AI step
Keep a person in the loop: replies are public.
- 1Schedule Trigger: hourly
- 2HTTP Request: GET /v1/posts/{id}/comments
- 3AI Agent: draft a reply
- 4Slack: approve, then HTTP Request: POST /v1/posts/{id}/comments
Set it up with the HTTP Request node
The HTTP Request node is a core node in every n8n edition. You can also paste a curl command from our docs with Import cURL. n8n’s docs for this step.
Create an API key
Start the trial, connect the accounts you want to post to, and create a key under API keys. It’s shown once. Store it in n8n’s credentials rather than typing it into every step.
Find your account ids
Add a HTTP Request node step and run it once. Copy the
idof each account fromdata; they stay the same even when an account is reconnected.List accounts: GET /v1/accounts Field Value Method GET URL https://api.postpeg.com/v1/accounts Authentication The same Header Auth credential Query Parameters platform = linkedin (optional) Publish or schedule a post
Add another HTTP Request node step. Add
"scheduled_at"(ISO 8601, e.g.2026-10-01T09:00:00Z) to schedule instead of publishing now, and"media": [{ "url": "https://…", "type": "image" }]for images or video; Instagram, TikTok, YouTube and Pinterest need media.Create a post: POST /v1/posts Field Value Method POST URL https://api.postpeg.com/v1/posts Authentication Generic Credential Type → Header Auth. Name: Authorization, Value: Bearer pp_live_your_key Send Headers On. Idempotency-Key = rss-{{ $json.guid || $json.link }} Send Body On. Body Content Type: JSON, Specify Body: Using JSON JSON The body below Body{ "account_ids": ["acc_mfz1x0k27d4q8vbn3c5s0a1p9e", "acc_mfz1y4r9h2c6t0wqk8e3m7ld5f"], "content": {{ JSON.stringify($json.title + " " + $json.link) }} }Check each account’s status
The response is the post, with one target per account. Publishing happens in the background within seconds;
GET /v1/posts/{id}later shows each targetpublishedwith itsurl, orfailedwith theerror.Response · 201 Created{ "id": "post_mfz2k3v8q1w5e9r4t7y0u2i6o3", "content": "Scheduled posts now retry on their own when a network has a bad minute. Changelog: https://example.com/changelog #buildinpublic", "media": [ { "url": "https://example.com/changelog.png", "type": "image" } ], "platform_options": {}, "status": "scheduled", "scheduled_at": "2026-10-01T09:00:00.000Z", "targets": [ { "account_id": "acc_mfz1x0k27d4q8vbn3c5s0a1p9e", "platform": "x", "status": "pending", "platform_post_id": null, "url": null, "error": null, "attempts": 0, "published_at": null }, { "account_id": "acc_mfz1y4r9h2c6t0wqk8e3m7ld5f", "platform": "linkedin", "status": "pending", "platform_post_id": null, "url": null, "error": null, "attempts": 0, "published_at": null }, { "account_id": "acc_mfz20b5n1s8f4j7xv2p9r6hu1c", "platform": "instagram", "status": "pending", "platform_post_id": null, "url": null, "error": null, "attempts": 0, "published_at": null } ], "created_at": "2026-09-24T14:02:11.418Z" }
The postpeg app for n8n
A native n8n app (n8n-nodes-postpeg) with actions for publishing, accounts, analytics and comments is built and waiting to be published. It isn’t installable yet. When it is, you’ll add it with: Settings → Community Nodes → Install → n8n-nodes-postpeg. The HTTP setup above keeps working either way.
Pagination, retries and idempotency
- Pagination. List endpoints return
{ data, next_cursor }. Under Options → Pagination choose “Update a Parameter in Each Request”: Type Query, Namecursor, Value{{ $response.body.next_cursor }}, and stop when{{ !$response.body.next_cursor }}is true. Set a page limit so a loop can’t run away. - Idempotency. Send an
Idempotency-Keyheader onPOST /v1/posts, comment replies and messages, built from something unique to the item (up to 255 characters). If n8n retries the step, the same key returns the original post with200instead of publishing twice. - Retries. postpeg retries a failed network in the background (up to 5 attempts), so don’t re-post from the workflow when a target is still
pending. Retry the request itself only on429,500or a timeout, with the same idempotency key. - Lists.
GET /v1/postsis newest first,limitup to 100, filterable bystatus(failed,partially_published,scheduled…).
Errors and rate limits
Errors are JSON with a stable code and a detail written for people: route on the code, show the detail. The ones a workflow meets most:
- 400 invalid_request
- The body, query or a platform rule is wrong. Read
issues: it lists every problem with its path. Fix the request; retrying it unchanged fails the same way. - 401 unauthorized
- The key is missing, malformed or revoked. Send
Authorization: Bearer pp_live_…with a key from the dashboard. - 402 subscription_required
- The trial or subscription has ended. Only
GET /v1/meand/v1/billingstill work: start a checkout to continue. - 429 rate_limited
- Too many requests, from your key or on the network’s side. Wait
retry_afterseconds (also in theRetry-Afterheader), then retry. - 502 upstream_error
- The network failed or refused the request;
detailcarries its reason. Retry later if it didn’t respond; fix the request if it refused.
Each key can make 120 requests a minute, and at most 30 of them can be writes (publishing, scheduling, replying, sending, cancelling). A burst past that gets 429 rate_limited with Retry-After: 60: wait, then retry with the same idempotency key. Details in Authentication → Rate limits and Errors.
Questions
- Is there a postpeg app for n8n?
- It’s built and waiting to be published, so it isn’t installable yet. Everything on this page uses n8n’s own HTTP step, which reaches every postpeg endpoint today with the same key, and keeps working after the app ships.
- Do I need a paid n8n plan?
- No. The HTTP Request node is in every edition of n8n, including the free self-hosted Community Edition. postpeg is billed separately, per connected account; publishing, analytics, comments and DMs are unlimited on every paid plan.
- Where do I get the account ids?
- Call
GET /v1/accountsonce (the second table on this page) and copy theidof each account you want to post to. They don’t change, even when an account is reconnected. - What if the workflow retries a step?
- Send an
Idempotency-Keyheader built from something unique to the item, like an RSS guid or a sheet row number. A repeat with the same key returns the original post with200and publishes nothing new. - How fast can a workflow call postpeg?
- 120 requests a minute per key, of which 30 can be writes such as publishing or replying. A loop that goes faster gets
429 rate_limitedwithRetry-After: 60; wait that long and retry. See Authentication → Rate limits. - Can I test without posting for real?
- Not yet:
pp_test_keys currently publish for real, like live keys. Test against an account you own, or schedule the post a day ahead and cancel it withDELETE /v1/posts/{id}.
Other integrations
Send your first post in a few minutes
The 7-day trial has every feature and 3 connected accounts, with no card. The quickstart takes you from a key to a published post.