Skip to content
postpeg
HTTP today · app coming soon

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

    1. 1RSS Feed Trigger: new item
    2. 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.

    1. 1Google Sheets Trigger: row added
    2. 2HTTP Request: POST /v1/posts with scheduled_at from the row
    3. 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.

    1. 1Shopify Trigger: product created
    2. 2HTTP Request: POST /v1/posts with media [{ url, type: "image" }]
  • Alert Slack when a post fails

    Poll status=partially_published the same way to catch posts that failed on some accounts.

    1. 1Schedule Trigger: every 15 minutes
    2. 2HTTP Request: GET /v1/posts?status=failed
    3. 3Remove Duplicates: skip ids seen in earlier runs
    4. 4Slack: send each target’s error
  • Reply to comments with an AI step

    Keep a person in the loop: replies are public.

    1. 1Schedule Trigger: hourly
    2. 2HTTP Request: GET /v1/posts/{id}/comments
    3. 3AI Agent: draft a reply
    4. 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.

  1. 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.

  2. Find your account ids

    Add a HTTP Request node step and run it once. Copy the id of each account from data; they stay the same even when an account is reconnected.

    List accounts: GET /v1/accounts
    FieldValue
    MethodGET
    URLhttps://api.postpeg.com/v1/accounts
    AuthenticationThe same Header Auth credential
    Query Parametersplatform = linkedin (optional)
  3. 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
    FieldValue
    MethodPOST
    URLhttps://api.postpeg.com/v1/posts
    AuthenticationGeneric Credential Type → Header Auth. Name: Authorization, Value: Bearer pp_live_your_key
    Send HeadersOn. Idempotency-Key = rss-{{ $json.guid || $json.link }}
    Send BodyOn. Body Content Type: JSON, Specify Body: Using JSON
    JSONThe body below
    Body
    {
      "account_ids": ["acc_mfz1x0k27d4q8vbn3c5s0a1p9e", "acc_mfz1y4r9h2c6t0wqk8e3m7ld5f"],
      "content": {{ JSON.stringify($json.title + " " + $json.link) }}
    }
  4. 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 target published with its url, or failed with the error.

    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

Coming soon

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, Name cursor, 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-Key header on POST /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 with 200 instead 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 on 429, 500 or a timeout, with the same idempotency key.
  • Lists. GET /v1/posts is newest first, limit up to 100, filterable by status (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/me and /v1/billing still work: start a checkout to continue.
429 rate_limited
Too many requests, from your key or on the network’s side. Wait retry_after seconds (also in the Retry-After header), then retry.
502 upstream_error
The network failed or refused the request; detail carries 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/accounts once (the second table on this page) and copy the id of 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-Key header 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 with 200 and 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_limited with Retry-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 with DELETE /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.