AutomationFlowsGeneral › Post Images to Instagram & TikTok

Post Images to Instagram & TikTok

Original n8n title: Upload-post Images

upload-post images. Uses httpRequest, stickyNote, manualTrigger. Event-driven trigger; 10 nodes.

Event trigger★★★★☆ complexity10 nodesHTTP Request
General Trigger: Event Nodes: 10 Complexity: ★★★★☆ Added:

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 →

Download .json
{
  "id": "ra8MrqshnzXPy55O",
  "name": "upload-post images",
  "tags": [],
  "nodes": [
    {
      "id": "7d899b35-ae00-418a-b890-e318f6d61f7a",
      "name": "POST TO INSTAGRAM1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        820,
        -220
      ],
      "parameters": {
        "url": "https://api.upload-post.com/api/upload_photos",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "multipart-form-data",
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "title",
              "value": "title-ig"
            },
            {
              "name": "user",
              "value": "user_name"
            },
            {
              "name": "platform[]",
              "value": "instagram"
            },
            {
              "name": "photos[]",
              "parameterType": "formBinaryData",
              "inputDataFieldName": "=photo1"
            },
            {
              "name": "photos[]",
              "parameterType": "formBinaryData",
              "inputDataFieldName": "photo2"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Apikey api"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "025c1aa3-acf2-4211-93e1-9df2182bbf07",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -840,
        -360
      ],
      "parameters": {
        "color": 6,
        "width": 1880,
        "height": 660,
        "content": "# POST : to Instagram"
      },
      "typeVersion": 1
    },
    {
      "id": "7a98a200-3c96-45f8-a4d2-860c74d81c1f",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        220,
        -120
      ],
      "parameters": {},
      "typeVersion": 3
    },
    {
      "id": "d7bd532e-b07a-43f8-9ceb-c4dad685734d",
      "name": "Change name to photo1",
      "type": "n8n-nodes-base.code",
      "position": [
        -100,
        -220
      ],
      "parameters": {
        "jsCode": "return items.map((item, index) => {\n  // Grab the existing binary buffer under \"data\"\n  const buffer = item.binary.data;\n  // Build a new item with the renamed binary key\n  return {\n    json: item.json,\n    binary: {\n      // Rename to photo1, photo2, ...\n      [`photo${index + 1}`]: buffer\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "f5efe3ce-c8b9-445a-8667-fefc3dc36545",
      "name": "Change name to photo2",
      "type": "n8n-nodes-base.code",
      "position": [
        -100,
        -20
      ],
      "parameters": {
        "jsCode": "return items.map((item, index) => {\n  // Grab the existing binary buffer under \"data\"\n  const buffer = item.binary.data;\n  // Build a new item with the renamed binary key\n  return {\n    json: item.json,\n    binary: {\n      // Rename to photo1, photo2, ...\n      [`photo${index + 2}`]: buffer\n    }\n  };\n});\n"
      },
      "typeVersion": 2
    },
    {
      "id": "4901b1f3-12e7-4f7d-b87a-5582d2319237",
      "name": "Send as 1 merged file",
      "type": "n8n-nodes-base.code",
      "position": [
        520,
        -120
      ],
      "parameters": {
        "jsCode": "// Merge all incoming items (each with one binary photoX) into one item\nconst mergedItem = {\n  json: {},\n  binary: {}\n};\n\nfor (const item of items) {\n  // Copy every binary field from each item into mergedItem.binary\n  for (const [key, bin] of Object.entries(item.binary || {})) {\n    mergedItem.binary[key] = bin;\n  }\n}\n\n// Return a single-item array\nreturn [mergedItem];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "34a88bd7-6302-4f22-aec0-d4318beceffa",
      "name": "When clicking \u2018Test workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -760,
        -120
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "e710233a-e408-4718-9d1d-3a373fad33b8",
      "name": "POST TO TIKTOK",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        820,
        -20
      ],
      "parameters": {
        "url": "https://api.upload-post.com/api/upload_photos",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "multipart-form-data",
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "title",
              "value": "title-ig"
            },
            {
              "name": "user",
              "value": "user_name"
            },
            {
              "name": "platform[]",
              "value": "tiktok"
            },
            {
              "name": "photos[]",
              "parameterType": "formBinaryData",
              "inputDataFieldName": "=photo1"
            },
            {
              "name": "photos[]",
              "parameterType": "formBinaryData",
              "inputDataFieldName": "photo2"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Apikey api"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "000f92e8-64df-4ebd-a608-d5b0d2e1a5c4",
      "name": "Get Image 1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -420,
        -220
      ],
      "parameters": {
        "url": "https://upload.wikimedia.org/wikipedia/commons/7/70/Example.png",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "f15f5cd5-9ca5-4ab7-bc66-32f7a3ec1e0c",
      "name": "Get Image 2",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -420,
        -20
      ],
      "parameters": {
        "url": "https://upload.wikimedia.org/wikipedia/commons/7/70/Example.png",
        "options": {}
      },
      "typeVersion": 4.2
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "d79c90a0-bb65-45b1-9d1b-c6af98f8480b",
  "connections": {
    "Merge": {
      "main": [
        [
          {
            "node": "Send as 1 merged file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Image 1": {
      "main": [
        [
          {
            "node": "Change name to photo1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Image 2": {
      "main": [
        [
          {
            "node": "Change name to photo2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Change name to photo1": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Change name to photo2": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Send as 1 merged file": {
      "main": [
        [
          {
            "node": "POST TO INSTAGRAM1",
            "type": "main",
            "index": 0
          },
          {
            "node": "POST TO TIKTOK",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Test workflow\u2019": {
      "main": [
        [
          {
            "node": "Get Image 1",
            "type": "main",
            "index": 0
          },
          {
            "node": "Get Image 2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

How this works

This workflow streamlines sharing images across social platforms by uploading photos to Instagram and TikTok in one seamless process, saving creators and marketers hours of manual posting. It suits social media managers or content creators handling multiple accounts who want consistent, quick distribution without switching apps. The key step merges multiple images into a single file for efficient transmission, leveraging HTTP requests to interact directly with Instagram and TikTok APIs.

Use this workflow for event-driven image uploads triggered by new content arrivals, such as from a design tool or file watcher, ensuring timely posts. Avoid it for video content or platforms requiring complex authentication beyond basic HTTP; it's not ideal for bulk campaigns exceeding API limits. Common variations include adding a scheduling node for delayed posting or integrating with Google Drive to pull images automatically.

About this workflow

upload-post images. Uses httpRequest, stickyNote, manualTrigger. Event-driven trigger; 10 nodes.

Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →

More General workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

General

Create Animated Stories using GPT-4o-mini, Midjourney, Kling and Creatomate API. Uses httpRequest, stickyNote, manualTrigger. Event-driven trigger; 51 nodes.

HTTP Request
General

Generate Leads with Google Maps - AlexK1919. Uses manualTrigger, scheduleTrigger, executeWorkflowTrigger, stopAndError. Event-driven trigger; 42 nodes.

Execute Workflow Trigger, Stop And Error, HTTP Request +1
General

Limit Code. Uses microsoftOutlookTrigger, httpRequest, limit, noOp. Event-driven trigger; 41 nodes.

Microsoft Outlook Trigger, HTTP Request
General

AutoQoutesV2_template. Uses manualTrigger, httpRequest, stickyNote, googleSheets. Event-driven trigger; 28 nodes.

HTTP Request, Google Sheets, Google Drive +2
General

Turn YouTube Videos into Summaries, Transcripts, and Visual Insights. Uses manualTrigger, stickyNote, httpRequest. Event-driven trigger; 26 nodes.

HTTP Request