{
  "name": "Automate TikTok video transcription with RapidAPI and Google Sheets",
  "nodes": [
    {
      "id": "c0de0228-f79b-4b18-9e5d-ee6218259078",
      "name": "Google Sheets2",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -1380,
        40
      ]
    },
    {
      "id": "4b18deea-cfc2-4a8d-b2f3-8b31cac0d573",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -560,
        40
      ]
    },
    {
      "id": "baad7161-51f5-4f29-8af0-39244e10eb60",
      "name": "Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        580,
        -40
      ]
    },
    {
      "id": "ab5bcc9b-e2a0-4ec7-a4db-de512662549d",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -1100,
        40
      ]
    },
    {
      "id": "d5d6e8a4-a2da-4cd5-80fc-3cf7c294697d",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        900,
        140
      ]
    },
    {
      "id": "6bea9362-5502-4c3c-acac-3f1a16bb0c64",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        -820,
        60
      ]
    },
    {
      "id": "a9ca3926-efbd-42fa-9388-b24625690145",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "position": [
        -20,
        -40
      ]
    },
    {
      "id": "becf9d6b-26a1-4498-9683-18ad15bc82ea",
      "name": "If1",
      "type": "n8n-nodes-base.if",
      "position": [
        -260,
        40
      ]
    },
    {
      "id": "7c8d30f1-df83-4ee1-83ce-32f6d9b0a810",
      "name": "Google Sheets1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        300,
        140
      ]
    },
    {
      "id": "90a316f5-0f08-42f8-86a0-318bcc9814f9",
      "name": "When clicking ‘Execute workflow’",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1580,
        40
      ]
    },
    {
      "id": "5d36dbf3-ebd6-4cd8-913b-ee1308d6847b",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2500,
        -480
      ],
      "parameters": {
        "width": 780,
        "height": 980,
        "content": "# 📝 TikTok Transcript Extraction & Logging Workflow\n\nThis n8n workflow automatically fetches TikTok video transcripts via the RapidAPI TikTok Transcript Generator and updates a Google Sheet with clean"
      }
    },
    {
      "id": "708c75c1-2ed7-48eb-b606-d6ff3eca7e30",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1660,
        -320
      ],
      "parameters": {
        "width": null,
        "height": 580,
        "content": "### 1. When clicking ‘Execute workflow’  \n**Type:** Manual Trigger  \n**Purpose:**  \nManually triggers the workflow to start the process of reading TikTok URLs and generating transcripts.  \n**Use Case:"
      }
    },
    {
      "id": "b7c01b0d-726b-44e7-8099-93812eccce4b",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1400,
        -320
      ],
      "parameters": {
        "width": null,
        "height": 580,
        "content": "### 2. Google Sheets2  \n**Type:** Google Sheets (Read)  \n**Purpose:**  \nReads rows from the specified Google Sheet containing TikTok video URLs and existing transcript data.  \n**Use Case:**  \nFetch th"
      }
    },
    {
      "id": "2d5229aa-2c40-41f6-8556-77690c3ed956",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1140,
        -320
      ],
      "parameters": {
        "width": null,
        "height": 580,
        "content": "### 3. Loop Over Items  \n**Type:** Split In Batches  \n**Purpose:**  \nProcesses the fetched rows in smaller batches (default 10 items per batch) to avoid rate limits or overload.  \n**Use Case:**  \nCont"
      }
    },
    {
      "id": "89710512-98f5-4dc2-b8a5-234ae49d343f",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -880,
        -320
      ],
      "parameters": {
        "width": null,
        "height": 580,
        "content": "### 4. If  \n**Type:** Conditional Check (If)  \n**Purpose:**  \nFilters each row to process only those where the `Video Url` is not empty and `Transcript` is empty (i.e., videos needing transcription). "
      }
    },
    {
      "id": "7514d668-1b6d-4786-8e7f-f07fbfeac194",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -620,
        -320
      ],
      "parameters": {
        "width": null,
        "height": 580,
        "content": "### 5. HTTP Request  \n**Type:** HTTP Request  \n**Purpose:**  \nCalls the TikTok Transcript Generator API with the video URL to retrieve the transcript.  \n**Use Case:**  \nGet the subtitle/transcript dat"
      }
    },
    {
      "id": "2cfb2c0d-980c-4654-9486-45bc765372c6",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -360,
        -320
      ],
      "parameters": {
        "width": null,
        "height": 580,
        "content": "### 6. If  \n**Type:** Conditional Check (If)  \n**Purpose:**  \nChecks if the API response is valid and does not contain a 404 error.  \n**Use Case:**  \nHandle cases where transcripts are unavailable or "
      }
    },
    {
      "id": "167cf773-1543-4778-ba99-d4adc87f3ec3",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -100,
        -320
      ],
      "parameters": {
        "width": null,
        "height": 580,
        "content": "### 7. Code  \n**Type:** Code (JavaScript)  \n**Purpose:**  \nCleans the raw subtitles returned by the API by removing headers, timestamps, and empty lines for better readability.  \n**Use Case:**  \nPrepa"
      }
    },
    {
      "id": "ad776fb7-d066-4f10-917e-a1fbf476e961",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        200,
        -180
      ],
      "parameters": {
        "width": null,
        "height": 480,
        "content": "### 8. Google Sheets  \n**Type:** Google Sheets (Append or Update)  \n**Purpose:**  \nWrites the cleaned transcript, video URL, and generation date back into the Google Sheet, updating existing rows.  \n*"
      }
    },
    {
      "id": "45271bfa-118b-46c7-8e73-e077119ce31f",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        520,
        -380
      ],
      "parameters": {
        "width": null,
        "height": 580,
        "content": "### 9. Google Sheets1  \n**Type:** Google Sheets (Append or Update)  \n**Purpose:**  \nFor cases where the API returns an error (like 404), it updates the sheet with a \"No transcription available\" messag"
      }
    },
    {
      "id": "4bb59f93-a06c-4252-bec4-2809fa4d6067",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        840,
        -220
      ],
      "parameters": {
        "width": null,
        "height": 540,
        "content": "### 10. Wait  \n**Type:** Wait  \n**Purpose:**  \nPauses the workflow briefly between batches to prevent hitting API rate limits and ensure smooth execution.  \n**Use Case:**  \nThrottle the flow execution"
      }
    }
  ],
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If1": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Google Sheets1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code": {
      "main": [
        [
          {
            "node": "Google Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "If1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets1": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Sheets2": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking ‘Execute workflow’": {
      "main": [
        [
          {
            "node": "Google Sheets2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}