{
  "name": "Save Rumble video transcripts to Google Sheets with FetchGoblin",
  "nodes": [
    {
      "id": "setup-note",
      "name": "Setup and limitations",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [-80, -340],
      "parameters": {
        "width": 1170,
        "height": 260,
        "content": "# Save Rumble transcripts to Google Sheets\n\n**For researchers and automation builders.** Supply one Rumble video URL and save available captions, their language, credit charge and retrieval date.\n\n1. Set `video_url`, `spreadsheet_id` and `sheet_name` in **Video and sheet settings**.\n2. Select an HTTP **Header Auth** credential in **Fetch Rumble transcript**: header name `x-api-key`, value your private FetchGoblin key.\n3. Connect Google Sheets and create these headers: `source_url`, `language`, `transcript`, `retrieved_at`, `credits_charged`, `request_id`.\n4. Run manually. Null/empty captions stop before Sheets. Text over 49,000 characters is truncated and visibly marked. Each rerun appends a row; no deduplication or schedule is included.\n\nCaption requests verified 2026-10-13. Returned live captions cost one credit; the tested no-caption URL cost zero. Trial: 50 credits after verification; prepaid top-ups from $5. n8n hosting has separate costs.\n\n[Full setup guide](https://fetchgoblin.com/guides/rumble-transcripts-google-sheets) · [API reference](https://fetchgoblin.com/docs/get-v1-rumble-video-transcript)",
        "color": 1
      }
    },
    {
      "id": "manual",
      "name": "Run manually",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [0, 80],
      "parameters": {}
    },
    {
      "id": "settings",
      "name": "Video and sheet settings",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [240, 80],
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "video-url",
              "name": "video_url",
              "type": "string",
              "value": "https://rumble.com/v79xhhm-discovery-why-glenn-wants-israel-to-sue-the-new-york-times.html"
            },
            {
              "id": "spreadsheet-id",
              "name": "spreadsheet_id",
              "type": "string",
              "value": "YOUR_SPREADSHEET_ID"
            },
            {
              "id": "sheet-name",
              "name": "sheet_name",
              "type": "string",
              "value": "Transcripts"
            }
          ]
        },
        "options": {}
      }
    },
    {
      "id": "transcript",
      "name": "Fetch Rumble transcript",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [480, 80],
      "parameters": {
        "method": "GET",
        "url": "https://fetchgoblin.com/api/data/v1/rumble/video/transcript",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "url",
              "value": "={{ $json.video_url }}"
            }
          ]
        },
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Accept",
              "value": "application/json"
            },
            {
              "name": "Idempotency-Key",
              "value": "={{ 'rumble-' + $execution.id + '-' + $itemIndex }}"
            }
          ]
        },
        "options": {
          "timeout": 60000
        }
      }
    },
    {
      "id": "format",
      "name": "Prepare caption row",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [720, 80],
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "const rows = [];\nfor (const [index, item] of $input.all().entries()) {\n  const data = item.json;\n  if (typeof data.transcript !== 'string' || !data.transcript.trim()) continue;\n  const transcript = data.transcript.length > 49000\n    ? data.transcript.slice(0, 49000) + '\\n[TRUNCATED: transcript exceeds the workflow cell limit]'\n    : data.transcript;\n  rows.push({\n    json: {\n      source_url: data.url || $('Video and sheet settings').first().json.video_url,\n      language: data.language || '',\n      transcript,\n      retrieved_at: new Date().toISOString(),\n      credits_charged: data.credits_charged ?? 0,\n      request_id: data.request_id || '',\n    },\n    pairedItem: { item: index },\n  });\n}\nreturn rows;"
      }
    },
    {
      "id": "sheet",
      "name": "Append transcript row",
      "type": "n8n-nodes-base.googleSheets",
      "typeVersion": 4.7,
      "position": [960, 80],
      "parameters": {
        "resource": "sheet",
        "operation": "append",
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Video and sheet settings').first().json.spreadsheet_id }}"
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "={{ $('Video and sheet settings').first().json.sheet_name }}"
        },
        "columns": {
          "mappingMode": "autoMapInputData",
          "value": {},
          "matchingColumns": [],
          "schema": []
        },
        "options": {
          "cellFormat": "RAW",
          "handlingExtraData": "ignoreIt",
          "useAppend": true
        }
      }
    },
    {
      "id": "credentials-note",
      "name": "Configure private credentials",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [220, 260],
      "parameters": {
        "width": 480,
        "height": 160,
        "color": 7,
        "content": "## Configure once\nKeep the FetchGoblin API key in an HTTP Header Auth credential, never in a node or shared JSON. Set the video URL and destination spreadsheet in the settings node. The sample URL is public test input; replace it with a video you are authorized to process."
      }
    },
    {
      "id": "results-note",
      "name": "Handle caption results",
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [720, 260],
      "parameters": {
        "width": 500,
        "height": 160,
        "color": 7,
        "content": "## Preserve useful rows\nNull or blank transcripts stop here. Long captions are capped at 49,000 characters and marked as truncated. Google Sheets uses RAW values, so caption text cannot become a spreadsheet formula. Repeated manual runs append rows; add deduplication if you need it."
      }
    }
  ],
  "connections": {
    "Run manually": {
      "main": [
        [
          {
            "node": "Video and sheet settings",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Video and sheet settings": {
      "main": [
        [
          {
            "node": "Fetch Rumble transcript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Rumble transcript": {
      "main": [
        [
          {
            "node": "Prepare caption row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare caption row": {
      "main": [
        [
          {
            "node": "Append transcript row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  },
  "active": false,
  "pinData": {},
  "tags": []
}
