AutomationFlowsWeb Scraping › Manual Video Posting to Blotato Workflow

Manual Video Posting to Blotato Workflow

Original n8n title: Wf3 - Post Video Manual (enhanced)

WF3 - Post Video Manual (Enhanced). Uses httpRequest. Webhook trigger; 14 nodes.

Webhook trigger★★★★☆ complexity14 nodesHTTP Request
Web Scraping Trigger: Webhook Nodes: 14 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
{
  "name": "WF3 - Post Video Manual (Enhanced)",
  "nodes": [
    {
      "parameters": {
        "httpMethod": "POST",
        "path": "post-video",
        "responseMode": "responseNode",
        "options": {}
      },
      "id": "webhook-trigger",
      "name": "Webhook Trigger",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 2,
      "position": [
        0,
        0
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "id-1",
              "name": "supabaseUrl",
              "value": "={{$env.SUPABASE_URL}}",
              "type": "string"
            },
            {
              "id": "id-2",
              "name": "supabaseServiceKey",
              "value": "={{$env.SUPABASE_SERVICE_ROLE_KEY}}",
              "type": "string"
            },
            {
              "id": "id-3",
              "name": "blotatoApiKey",
              "value": "={{$env.BLOTATO_API_KEY}}",
              "type": "string"
            },
            {
              "id": "id-4",
              "name": "scriptId",
              "value": "={{ $json.body.script_id }}",
              "type": "string"
            },
            {
              "id": "id-5",
              "name": "requestedByUserId",
              "value": "={{ $json.body.requested_by_user_id }}",
              "type": "string"
            },
            {
              "id": "id-6",
              "name": "platforms",
              "value": "={{ $json.body.platforms || ['tiktok', 'instagram', 'youtube'] }}",
              "type": "object"
            }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      },
      "id": "workflow-config",
      "name": "Workflow Configuration",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        220,
        0
      ]
    },
    {
      "parameters": {
        "url": "={{ $json.supabaseUrl }}/rest/v1/scripts?id=eq.{{ $json.scriptId }}&select=*",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "apikey",
              "value": "={{ $json.supabaseServiceKey }}"
            },
            {
              "name": "Authorization",
              "value": "=Bearer {{ $json.supabaseServiceKey }}"
            }
          ]
        },
        "options": {}
      },
      "id": "fetch-script",
      "name": "Fetch Script Data",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        440,
        0
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict"
          },
          "conditions": [
            {
              "id": "condition-1",
              "leftValue": "={{ $json[0].status }}",
              "rightValue": "Video Ready (Preview)",
              "operator": {
                "type": "string",
                "operation": "equals"
              }
            },
            {
              "id": "condition-2",
              "leftValue": "={{ $json[0].processed }}",
              "rightValue": false,
              "operator": {
                "type": "boolean",
                "operation": "equals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "if-valid-status",
      "name": "IF Valid Status",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        660,
        0
      ]
    },
    {
      "parameters": {
        "url": "={{ $('Fetch Script Data').first().json[0].video_url }}",
        "options": {
          "response": {
            "response": {
              "responseFormat": "file",
              "outputPropertyName": "video"
            }
          }
        }
      },
      "id": "download-video",
      "name": "Download Video Binary",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        880,
        -100
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "id-script",
              "name": "scriptData",
              "value": "={{ $('Fetch Script Data').first().json[0] }}",
              "type": "object"
            },
            {
              "id": "id-platforms",
              "name": "targetPlatforms",
              "value": "={{ $('Workflow Configuration').first().json.platforms }}",
              "type": "object"
            }
          ]
        },
        "includeOtherFields": true,
        "options": {}
      },
      "id": "prepare-posting",
      "name": "Prepare Posting Data",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1100,
        -100
      ]
    },
    {
      "parameters": {
        "jsCode": "// Get script data and platforms\nconst scriptData = $('Prepare Posting Data').first().json.scriptData;\nconst platforms = $('Prepare Posting Data').first().json.targetPlatforms;\nconst platformCaptions = scriptData.platform_captions || {};\nconst defaultCaption = scriptData.caption + ' ' + (scriptData.hashtags || []).map(h => '#' + h).join(' ');\n\n// Create items for each platform\nconst items = platforms.map(platform => ({\n  json: {\n    platform: platform,\n    caption: platformCaptions[platform] || defaultCaption,\n    scriptId: scriptData.id\n  }\n}));\n\nreturn items;"
      },
      "id": "split-platforms",
      "name": "Split by Platform",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1320,
        -100
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.blotato.com/v1/posts",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('Workflow Configuration').first().json.blotatoApiKey }}"
            }
          ]
        },
        "sendBody": true,
        "contentType": "multipart-form-data",
        "bodyParameters": {
          "parameters": [
            {
              "parameterType": "formBinaryData",
              "name": "video",
              "inputDataFieldName": "={{ $('Download Video Binary').first().binary.video }}"
            },
            {
              "name": "caption",
              "value": "={{ $json.caption }}"
            },
            {
              "name": "platform",
              "value": "={{ $json.platform }}"
            }
          ]
        },
        "options": {}
      },
      "id": "post-to-blotato",
      "name": "Post to Blotato",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        1540,
        -100
      ]
    },
    {
      "parameters": {
        "jsCode": "// Aggregate all posting results\nconst results = $input.all();\nconst postIds = {};\nconst platforms = [];\nlet allSucceeded = true;\n\nresults.forEach(item => {\n  const platform = item.json.platform || 'unknown';\n  platforms.push(platform);\n  if (item.json.post_id) {\n    postIds[platform] = item.json.post_id;\n  } else {\n    allSucceeded = false;\n  }\n});\n\nreturn [{\n  json: {\n    postIds,\n    platforms,\n    allSucceeded,\n    resultCount: results.length\n  }\n}];"
      },
      "id": "aggregate-results",
      "name": "Aggregate Results",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1760,
        -100
      ]
    },
    {
      "parameters": {
        "method": "PATCH",
        "url": "={{ $('Workflow Configuration').first().json.supabaseUrl }}/rest/v1/scripts?id=eq.{{ $('Workflow Configuration').first().json.scriptId }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "apikey",
              "value": "={{ $('Workflow Configuration').first().json.supabaseServiceKey }}"
            },
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('Workflow Configuration').first().json.supabaseServiceKey }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            },
            {
              "name": "Prefer",
              "value": "return=representation"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"status\": \"Posted\",\n  \"processed\": true,\n  \"posted_at\": \"{{ $now.toISO() }}\",\n  \"platforms\": {{ JSON.stringify($json.platforms) }},\n  \"post_ids\": {{ JSON.stringify($json.postIds) }}\n}",
        "options": {}
      },
      "id": "update-supabase-success",
      "name": "Update Supabase Success",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        1980,
        -100
      ]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ { success: true, script_id: $('Workflow Configuration').first().json.scriptId, status: 'Posted', platforms: $('Aggregate Results').first().json.platforms, post_ids: $('Aggregate Results').first().json.postIds } }}",
        "options": {}
      },
      "id": "respond-success",
      "name": "Respond Success",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        2200,
        -100
      ]
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ { success: false, script_id: $('Workflow Configuration').first().json.scriptId, error: 'Invalid status or already processed. Status must be \"Video Ready (Preview)\" and processed must be false.' } }}",
        "options": {
          "responseCode": 400
        }
      },
      "id": "respond-invalid-status",
      "name": "Respond Invalid Status",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        880,
        100
      ]
    },
    {
      "parameters": {
        "method": "PATCH",
        "url": "={{ $('Workflow Configuration').first().json.supabaseUrl }}/rest/v1/scripts?id=eq.{{ $('Workflow Configuration').first().json.scriptId }}",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "apikey",
              "value": "={{ $('Workflow Configuration').first().json.supabaseServiceKey }}"
            },
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('Workflow Configuration').first().json.supabaseServiceKey }}"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"status\": \"Failed\",\n  \"error_message\": \"Posting failed: {{ $json.error || 'Unknown error' }}\"\n}",
        "options": {}
      },
      "id": "update-supabase-failed",
      "name": "Update Supabase Failed",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        1760,
        100
      ],
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "respondWith": "json",
        "responseBody": "={{ { success: false, script_id: $('Workflow Configuration').first().json.scriptId, error: 'Posting failed' } }}",
        "options": {
          "responseCode": 500
        }
      },
      "id": "respond-failed",
      "name": "Respond Failed",
      "type": "n8n-nodes-base.respondToWebhook",
      "typeVersion": 1.1,
      "position": [
        1980,
        100
      ]
    }
  ],
  "connections": {
    "Webhook Trigger": {
      "main": [
        [
          {
            "node": "Workflow Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Workflow Configuration": {
      "main": [
        [
          {
            "node": "Fetch Script Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Script Data": {
      "main": [
        [
          {
            "node": "IF Valid Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "IF Valid Status": {
      "main": [
        [
          {
            "node": "Download Video Binary",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Respond Invalid Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download Video Binary": {
      "main": [
        [
          {
            "node": "Prepare Posting Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare Posting Data": {
      "main": [
        [
          {
            "node": "Split by Platform",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split by Platform": {
      "main": [
        [
          {
            "node": "Post to Blotato",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Post to Blotato": {
      "main": [
        [
          {
            "node": "Aggregate Results",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Update Supabase Failed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Aggregate Results": {
      "main": [
        [
          {
            "node": "Update Supabase Success",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Supabase Success": {
      "main": [
        [
          {
            "node": "Respond Success",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Supabase Failed": {
      "main": [
        [
          {
            "node": "Respond Failed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "wf3-v2-enhanced",
  "id": "wf3_post_video_manual",
  "tags": [
    "viral-video-app",
    "video-posting",
    "multi-platform"
  ]
}
Pro

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

About this workflow

WF3 - Post Video Manual (Enhanced). Uses httpRequest. Webhook trigger; 14 nodes.

Source: https://github.com/awjames6875/ai-clone-viral-video-app/blob/9b7fedf22e605bfd02596be383f493bd019fb5d7/n8n/wf3_post_video_manual.json — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

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

Web Scraping

This n8n template provides enterprise-level version control for your workflows using GitHub integration. Stop losing hours to broken workflows and manual exports – get proper commit history, visual di

n8n, Execute Workflow Trigger, HTTP Request +1
Web Scraping

This flow creates dummy files for every item added in your *Arrs (Radarr/Sonarr) with the tag .

HTTP Request, Ssh
Web Scraping

This workflow acts as a central API gateway for all technical indicator agents in the Binance Spot Market Quant AI system. It listens for incoming webhook requests and dynamically routes them to the c

HTTP Request
Web Scraping

Sign PDF documents with legally-compliant digital signatures using X.509 certificates. Supports multiple PAdES signature levels (B, T, LT, LTA) with optional visible stamps.

Execute Command, HTTP Request, Read Write File +1
Web Scraping

📡 This workflow serves as the central Alpha Vantage API fetcher for Tesla trading indicators, delivering cleaned 20-point JSON outputs for three timeframes: , , and . It is required by the following a

HTTP Request