docs / n8n-make
n8n and Make
Status: the workflow below ran in a real self-hosted n8n against the hosted service, including the stop when a render has no image yet. The Make settings are documented but have not been run in Make.
n8n: HTTP Request node
- Create a Header Auth credential: name
Authorization, valueBearer YOUR_API_KEY. - Add an HTTP Request node: POST, URL
https://postimager.com/v1/renders?wait=60, the credential above. - Body: JSON, built from your trigger’s fields (copy it from the editor’s API request tab).
- Header
Idempotency-Key: something unique per item, such as{{ $json.guid }}. - Use
{{ $json.output.download.url }}in the next node. Ifstatusis notcompletedthere is no link yet; stop, or read the render again.
New to this? Read how to generate images in n8n or the RSS to image walkthrough. Importable example (RSS item → article card), pointed at this service. Import it, choose your Header Auth credential on the HTTP node, and replace the sample trigger with your RSS Feed Trigger. It stops with an error if the render has no image yet, so a later step never posts an empty link.
{
"name": "PostImager example: RSS item to article card",
"nodes": [
{
"parameters": {},
"id": "8d3f0a1e-0001-4b6e-9a51-000000000001",
"name": "Manual trigger (replace with RSS Feed Trigger)",
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [
0,
0
]
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "a1",
"name": "guid",
"value": "https://example.com/blog/sourdough-36-hours",
"type": "string"
},
{
"id": "a2",
"name": "title",
"value": "Why our sourdough rests for 36 hours before it reaches your table",
"type": "string"
},
{
"id": "a3",
"name": "contentSnippet",
"value": "A slower bake, a better crust.",
"type": "string"
},
{
"id": "a4",
"name": "creator",
"value": "Asha Mehra",
"type": "string"
}
]
},
"options": {}
},
"id": "8d3f0a1e-0002-4b6e-9a51-000000000002",
"name": "Sample RSS item",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
220,
0
]
},
{
"parameters": {
"method": "POST",
"url": "https://postimager.com/v1/renders?wait=60",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Idempotency-Key",
"value": "={{ 'rss-' + $json.guid }}"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify({ template: 'article-card', size: 'link', format: 'png', variables: { site_name: 'Northfield Bakery Journal', category: 'Blog', headline: $json.title.slice(0, 120), subtitle: ($json.contentSnippet || '').slice(0, 200), author: ($json.creator || '').slice(0, 48) } }) }}",
"options": {}
},
"id": "8d3f0a1e-0003-4b6e-9a51-000000000003",
"name": "Render article card",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
440,
0
]
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "b1",
"name": "image_url",
"value": "={{ $json.output.download.url }}",
"type": "string"
},
{
"id": "b2",
"name": "render_status",
"value": "={{ $json.status }}",
"type": "string"
}
]
},
"options": {}
},
"id": "8d3f0a1e-0004-4b6e-9a51-000000000004",
"name": "Image URL for the next step",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
880,
-100
]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict"
},
"conditions": [
{
"id": "c1",
"leftValue": "={{ $json.status }}",
"rightValue": "completed",
"operator": {
"type": "string",
"operation": "equals"
}
}
],
"combinator": "and"
},
"options": {}
},
"id": "8d3f0a1e-0005-4b6e-9a51-000000000005",
"name": "Render finished?",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [
660,
0
]
},
{
"parameters": {
"errorMessage": "=PostImager render {{ $json.id }} is {{ $json.status }}, so there is no image yet. It may still finish: read it again with GET /v1/renders/{{ $json.id }}."
},
"id": "8d3f0a1e-0006-4b6e-9a51-000000000006",
"name": "Stop: no image yet",
"type": "n8n-nodes-base.stopAndError",
"typeVersion": 1,
"position": [
880,
100
]
}
],
"connections": {
"Manual trigger (replace with RSS Feed Trigger)": {
"main": [
[
{
"node": "Sample RSS item",
"type": "main",
"index": 0
}
]
]
},
"Sample RSS item": {
"main": [
[
{
"node": "Render article card",
"type": "main",
"index": 0
}
]
]
},
"Render article card": {
"main": [
[
{
"node": "Render finished?",
"type": "main",
"index": 0
}
]
]
},
"Render finished?": {
"main": [
[
{
"node": "Image URL for the next step",
"type": "main",
"index": 0
}
],
[
{
"node": "Stop: no image yet",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"pinData": {}
}Make: HTTP “Make a request”
- Method POST, URL
https://postimager.com/v1/renders?wait=60. - Headers:
Authorization: Bearer YOUR_API_KEYandIdempotency-Keymapped to a unique trigger field. - Body type Raw, content type JSON; map your fields into
variables. - Turn on Parse response; use
output.download.url. Ifstatusis stillqueued, add a Sleep and a GET on the render. - Set the module's timeout to at least 90 seconds, because a busy renderer can take about 30.
- Stop on
429 quota_exceededrather than retrying.