n8n, Make, and Zapier for social media posting: a DIY guide to calling PostGate’s API
PostGate has no dedicated n8n node, Make app, or Zapier app — here's how to call its REST API from each platform's own HTTP/webhook module instead, with a real working request for every tool.
PostGate has no dedicated n8n node, Zapier app, or Make module — you call its plain REST API from each tool's generic HTTP module instead. All three end up sending the same request: a POST to /api/posts with an Authorization: Bearer header and a JSON body carrying post content, profile IDs, and optional media. Setup takes about ten minutes per tool.
Search for "PostGate n8n node," "PostGate Zapier app," or "PostGate Make module" and you won't find one — PostGate has no listing in any of the three marketplaces. That's not a gap in this post, it's a fact about the product, and it should be a fact about whatever integration you build too: nothing here should be read as "connect the PostGate app." What follows is honest, works today, and takes about ten minutes per tool — call PostGate's plain REST API from each platform's own generic HTTP or webhook module.
The three tools solve the same problem slightly differently — n8n's HTTP Request node, Make's HTTP module, and Zapier's Webhooks by Zapier action — but every one of them ends up sending the same thing: a POST to https://postgate.studio/api/posts, an Authorization: Bearer header carrying your PostGate API key, and a JSON body with a post, a list of profile IDs, and optional media. Get that request right once and the rest is wiring triggers to it. Still deciding which tool to use? See our n8n alternatives for social media automation comparison first.
PostGate handles OAuth, publishing and delivery evidence for every network through one API. Start free or read the docs.
What request does every tool end up sending?
Before touching any automation tool, it's worth having the raw request in front of you, because every configuration below is just this same call expressed through a different UI. Create an API key under Authentication, pick its smallest useful scope (publish is enough for posting), and keep it in the automation tool's own credential store — never pasted in plain text inside a shared workflow.
curl -X POST "https://postgate.studio/api/posts?profile_group_id=grp_acme123" \
-H "Authorization: Bearer $POSTGATE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: campaign-042-instagram" \
-d '{
"post": { "body": "New post from the automation." },
"profiles": ["pro_instagram123", "pro_linkedin456"],
"media": ["https://cdn.example.com/launch.jpg"]
}'n8n: the HTTP Request node
n8n has no PostGate-specific node, so the HTTP Request node is what you drag in after whatever trigger starts the workflow (a Schedule Trigger, an RSS Feed Trigger, a webhook from another app, and so on). Configure it like this:
- Method:
POST - URL:
https://postgate.studio/api/posts?profile_group_id=grp_acme123 - Authentication: Generic Credential Type → Header Auth. Create one credential named something like "PostGate API," with header name
Authorizationand valueBearer <your key>. This keeps the key out of the node's own JSON and out of any exported workflow file. - Send Headers: on, with a
Content-Type: application/jsonheader and anIdempotency-Keyheader built from an expression, so a workflow re-run from n8n's retry mechanism never posts the same item twice. - Send Body: on, Body Content Type set to JSON, with the request body written as an n8n expression that pulls fields from the node before it.
{
"post": { "body": "{{ $json.title }}\n\n{{ $json.url }}" },
"profiles": ["pro_instagram123", "pro_linkedin456"],
"media": {{ $json.imageUrl ? JSON.stringify([$json.imageUrl]) : "[]" }}
}Make: the HTTP module
Make's general-purpose HTTP app ships a Make a request module built for exactly this situation — calling an API that has no dedicated Make app. Add it after your trigger module and set:
- URL:
https://postgate.studio/api/posts - Method:
POST - Headers: add
Authorizationwith valueBearer <your key>, andIdempotency-Keymapped from the triggering item's own ID so a scenario re-run stays safe. - Query String: add
profile_group_id=grp_acme123as a query pair instead of hand-building the URL. - Body type:
JSON (application/json), then map each field from earlier modules into the request body.
Make sets the Content-Type header automatically once the body type is JSON, so you don't need to add it by hand.
{
"post": { "body": "{{1.title}}\n\n{{1.url}}" },
"profiles": ["pro_instagram123", "pro_linkedin456"],
"media": ["{{1.imageUrl}}"]
}Zapier: Webhooks by Zapier
Zapier's built-in Webhooks by Zapier app is the equivalent generic action — search for it when adding a step, choose POST. Because PostGate's body has nested objects (post.body) and an array field (profiles), use Custom Request rather than the default key-value Data fields — Custom Request lets you type the exact JSON body instead of having Zapier flatten it for you.
- URL:
https://postgate.studio/api/posts?profile_group_id=grp_acme123 - Payload Type:
json - Data: the raw JSON body, with fields from earlier steps inserted through Zapier's field picker.
- Headers:
Authorization: Bearer <your key>and anIdempotency-Keybuilt from the trigger event's own ID.
Store the API key in a Zapier Storage by Zapier action or, better, paste it directly into the Webhooks step's header field rather than a Formatter step — Zapier does not offer a reusable, hidden credential store for arbitrary webhook headers the way n8n and Make do, so treat every Zap that includes it as sensitive.
{
"post": { "body": "{{title}}\n\n{{link}}" },
"profiles": ["pro_instagram123", "pro_linkedin456"],
"media": ["{{image_url}}"]
}How do you make retries safe?
All three tools retry on their own: n8n can be set to retry a failed node, Make retries a scenario execution, and Zapier replays failed Zap runs. Every one of those retries re-sends the same HTTP request. Give each call a stable Idempotency-Key derived from something that doesn't change between attempts — a source record ID, an RSS item's GUID, a Shopify product ID — and PostGate returns the original result instead of publishing twice, for 72 hours.
Frequently asked questions
Is there a PostGate node for n8n?
No — PostGate has no listing in the n8n, Zapier, or Make marketplaces. In n8n, use the generic HTTP Request node after your trigger: method POST, the /api/posts URL with profile_group_id, authentication via Generic Credential Type with Header Auth (header name Authorization, value Bearer plus your key), and a JSON body built from n8n expressions.
Where should I store the PostGate API key in each automation tool?
In n8n, create a Header Auth credential so the key stays out of the node's JSON and any exported workflow file. In Make, put it in the HTTP module's Authorization header. Zapier does not offer a reusable, hidden credential store for arbitrary webhook headers, so paste it into the Webhooks step's header field and treat every Zap that includes it as sensitive. Always use the smallest useful scope — publish is enough for posting.
How do I stop automation retries from double-posting?
All three tools retry on their own — n8n can retry a failed node, Make retries a scenario execution, and Zapier replays failed Zap runs — and every retry re-sends the same HTTP request. Give each call a stable Idempotency-Key derived from something that does not change between attempts (a source record ID, an RSS item's GUID, a Shopify product ID); PostGate returns the original result instead of publishing twice, for 72 hours.
Why does Zapier need Custom Request instead of the normal Data fields?
Because PostGate's request body has nested objects (post.body) and an array field (profiles). Zapier's default key-value Data fields flatten the payload, which breaks that structure. Custom Request in Webhooks by Zapier lets you type the exact JSON body, with fields from earlier steps inserted through the field picker.
