This workflow follows the Editimage → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"nodes": [
{
"name": "On clicking 'execute'",
"type": "n8n-nodes-base.manualTrigger",
"position": [
260,
210
],
"parameters": {},
"typeVersion": 1
},
{
"name": "Fetch new followers",
"type": "n8n-nodes-base.httpRequest",
"position": [
460,
210
],
"parameters": {
"url": "https://api.twitter.com/2/users/{YOUR_USER_ID}/followers?user.fields=profile_image_url&max_results=3",
"options": {},
"authentication": "headerAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"name": "Item Lists",
"type": "n8n-nodes-base.itemLists",
"position": [
660,
210
],
"parameters": {
"options": {},
"fieldToSplitOut": "data"
},
"typeVersion": 1
},
{
"name": "Function",
"type": "n8n-nodes-base.function",
"position": [
1660,
210
],
"parameters": {
"functionCode": "const binary = {};\nfor (let i=0; i < items.length; i++) {\n binary[`data${i}`] = items[i].binary.avatar;\n}\n\nreturn [\n {\n json: {\n numIcons: items.length,\n },\n binary,\n }\n];\n"
},
"typeVersion": 1
},
{
"name": "Merge",
"type": "n8n-nodes-base.merge",
"position": [
1910,
110
],
"parameters": {
"mode": "mergeByIndex"
},
"typeVersion": 1
},
{
"name": "Fetching images",
"type": "n8n-nodes-base.httpRequest",
"position": [
860,
210
],
"parameters": {
"url": "={{$json[\"profile_image_url\"].replace('normal','400x400')}}",
"options": {},
"responseFormat": "file",
"dataPropertyName": "avatar"
},
"typeVersion": 1
},
{
"name": "Fetch bg",
"type": "n8n-nodes-base.httpRequest",
"position": [
1660,
-40
],
"parameters": {
"url": "{TEMPLATE_IMAGE_URL}",
"options": {},
"responseFormat": "file",
"dataPropertyName": "bg"
},
"typeVersion": 1
},
{
"name": "Resize",
"type": "n8n-nodes-base.editImage",
"position": [
1060,
210
],
"parameters": {
"width": 200,
"height": 200,
"options": {},
"operation": "resize",
"dataPropertyName": "avatar"
},
"typeVersion": 1
},
{
"name": "Crop",
"type": "n8n-nodes-base.editImage",
"position": [
1260,
210
],
"parameters": {
"options": {
"format": "png"
},
"operation": "multiStep",
"operations": {
"operations": [
{
"width": 200,
"height": 200,
"operation": "create",
"backgroundColor": "#000000ff"
},
{
"color": "#ffffff00",
"operation": "draw",
"primitive": "circle",
"endPositionX": 25,
"endPositionY": 50,
"startPositionX": 100,
"startPositionY": 100
},
{
"operator": "In",
"operation": "composite",
"dataPropertyNameComposite": "avatar"
}
]
},
"dataPropertyName": "avatar"
},
"typeVersion": 1
},
{
"name": "Edit Image",
"type": "n8n-nodes-base.editImage",
"position": [
2110,
110
],
"parameters": {
"options": {},
"operation": "multiStep",
"operations": {
"operations": [
{
"operation": "composite",
"positionX": 1000,
"positionY": 375,
"dataPropertyNameComposite": "data0"
},
{
"operation": "composite",
"positionX": 1100,
"positionY": 375,
"dataPropertyNameComposite": "data1"
},
{
"operation": "composite",
"positionX": 1200,
"positionY": 375,
"dataPropertyNameComposite": "data2"
}
]
},
"dataPropertyName": "bg"
},
"typeVersion": 1
},
{
"name": "Resize1",
"type": "n8n-nodes-base.editImage",
"position": [
1450,
210
],
"parameters": {
"width": 75,
"height": 75,
"options": {},
"operation": "resize",
"dataPropertyName": "avatar"
},
"typeVersion": 1
},
{
"name": "HTTP Request",
"type": "n8n-nodes-base.httpRequest",
"position": [
2310,
110
],
"parameters": {
"url": "https://api.twitter.com/1.1/account/update_profile_banner.json",
"options": {
"bodyContentType": "multipart-form-data"
},
"requestMethod": "POST",
"authentication": "oAuth1",
"jsonParameters": true,
"sendBinaryData": true,
"binaryPropertyName": "banner:bg"
},
"credentials": {
"oAuth1Api": {
"name": "<your credential>"
}
},
"typeVersion": 1
}
],
"connections": {
"Crop": {
"main": [
[
{
"node": "Resize1",
"type": "main",
"index": 0
}
]
]
},
"Merge": {
"main": [
[
{
"node": "Edit Image",
"type": "main",
"index": 0
}
]
]
},
"Resize": {
"main": [
[
{
"node": "Crop",
"type": "main",
"index": 0
}
]
]
},
"Resize1": {
"main": [
[
{
"node": "Function",
"type": "main",
"index": 0
}
]
]
},
"Fetch bg": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 0
}
]
]
},
"Function": {
"main": [
[
{
"node": "Merge",
"type": "main",
"index": 1
}
]
]
},
"Edit Image": {
"main": [
[
{
"node": "HTTP Request",
"type": "main",
"index": 0
}
]
]
},
"Item Lists": {
"main": [
[
{
"node": "Fetching images",
"type": "main",
"index": 0
}
]
]
},
"Fetching images": {
"main": [
[
{
"node": "Resize",
"type": "main",
"index": 0
}
]
]
},
"Fetch new followers": {
"main": [
[
{
"node": "Item Lists",
"type": "main",
"index": 0
}
]
]
},
"On clicking 'execute'": {
"main": [
[
{
"node": "Fetch new followers",
"type": "main",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
httpHeaderAuthoAuth1Api
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
This workflow empowers content creators and social media managers to effortlessly resize and enhance images for posts, ensuring they fit platform specifications without manual software hassle. It automates fetching follower data via HTTP requests, pulling in user images and background assets, then applies precise edits like resizing to maintain visual consistency. Ideal for those handling high-volume social updates, the key step involves the editImage node seamlessly transforming images based on predefined rules, saving hours of tedious adjustments.
Use this workflow when you need quick, repeatable image tweaks for event-driven tasks, such as preparing visuals after gaining new followers on platforms like Instagram. Avoid it for complex AI-driven edits or non-image assets, where specialised tools outperform basic resizing. Common variations include adding filters via additional editImage nodes or integrating with storage services like Google Drive for output handling.
About this workflow
Manual Editimage. Uses manualTrigger, httpRequest, itemLists, editImage. Event-driven trigger; 12 nodes.
Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Manual Editimage. Uses manualTrigger, httpRequest, itemLists, editImage. Event-driven trigger; 12 nodes.
Code Editimage. Uses manualTrigger, editImage, httpRequest, stickyNote. Event-driven trigger; 16 nodes.
Code Editimage. Uses manualTrigger, lmChatGoogleGemini, sort, stickyNote. Event-driven trigger; 20 nodes.
Code Editimage. Uses manualTrigger, lmChatGoogleGemini, sort, stickyNote. Event-driven trigger; 20 nodes.
Add text to an image downloaded from the internet. Uses manualTrigger, editImage, httpRequest. Event-driven trigger; 3 nodes.