{
  "name": "YouTube channel to transcript corpus (apihq skeleton)",
  "nodes": [
    {
      "parameters": {},
      "id": "trigger",
      "name": "Run workflow",
      "type": "n8n-nodes-base.manualTrigger",
      "typeVersion": 1,
      "position": [
        200,
        300
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.apify.com/v2/acts/apihq~youtube-channel-scraper/run-sync-get-dataset-items",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_APIFY_TOKEN"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "{\n  \"channelUrls\": [\n    \"@mkbhd\"\n  ],\n  \"maxResults\": 50\n}",
        "options": {}
      },
      "id": "list-channel-videos",
      "name": "List channel videos",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        430,
        300
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "conditions": [
            {
              "id": "success-check",
              "leftValue": "={{ $json.success }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "split-channel-rows",
      "name": "Split channel rows",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        650,
        300
      ]
    },
    {
      "parameters": {
        "mode": "runOnceForAllItems",
        "jsCode": "// The transcript actor takes up to 50 IDs per run, so batch them.\n// Dedupe first so no video is transcribed (and billed) twice.\nconst ids = [...new Set($input.all().map((i) => i.json.video_id).filter(Boolean))];\nconst batches = [];\nfor (let i = 0; i < ids.length; i += 50) {\n  batches.push({ json: { videoIds: ids.slice(i, i + 50) } });\n}\nreturn batches;"
      },
      "id": "collect-video-ids",
      "name": "Collect video IDs",
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        880,
        200
      ]
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.apify.com/v2/acts/apihq~youtube-transcript-scraper/run-sync-get-dataset-items",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Authorization",
              "value": "Bearer YOUR_APIFY_TOKEN"
            },
            {
              "name": "Content-Type",
              "value": "application/json"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={{ JSON.stringify({ videoIds: $json.videoIds, metadata: true }) }}",
        "options": {}
      },
      "id": "get-transcripts",
      "name": "Get transcripts",
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1110,
        200
      ]
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "loose"
          },
          "conditions": [
            {
              "id": "success-check-2",
              "leftValue": "={{ $json.success }}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "id": "split-transcript-rows",
      "name": "Split transcript rows",
      "type": "n8n-nodes-base.if",
      "typeVersion": 2,
      "position": [
        1340,
        200
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a0",
              "name": "video_id",
              "value": "={{ $json.video_id }}",
              "type": "string"
            },
            {
              "id": "a1",
              "name": "title",
              "value": "={{ $json.metadata?.title }}",
              "type": "string"
            },
            {
              "id": "a2",
              "name": "text",
              "value": "={{ $json.transcript.map(s => s.text).join(' ') }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "transcript-text",
      "name": "Transcript text",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1570,
        100
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a0",
              "name": "video_id",
              "value": "={{ $json.video_id }}",
              "type": "string"
            },
            {
              "id": "a1",
              "name": "code",
              "value": "={{ $json.code }}",
              "type": "string"
            },
            {
              "id": "a2",
              "name": "request_id",
              "value": "={{ $json.request_id }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "transcript-failure-row",
      "name": "Transcript failure row",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1570,
        300
      ]
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "a0",
              "name": "channel_url",
              "value": "={{ $json.channel_url }}",
              "type": "string"
            },
            {
              "id": "a1",
              "name": "code",
              "value": "={{ $json.code }}",
              "type": "string"
            },
            {
              "id": "a2",
              "name": "request_id",
              "value": "={{ $json.request_id }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "id": "channel-failure-row",
      "name": "Channel failure row",
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        880,
        420
      ]
    }
  ],
  "connections": {
    "Run workflow": {
      "main": [
        [
          {
            "node": "List channel videos",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "List channel videos": {
      "main": [
        [
          {
            "node": "Split channel rows",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split channel rows": {
      "main": [
        [
          {
            "node": "Collect video IDs",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Channel failure row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Collect video IDs": {
      "main": [
        [
          {
            "node": "Get transcripts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get transcripts": {
      "main": [
        [
          {
            "node": "Split transcript rows",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split transcript rows": {
      "main": [
        [
          {
            "node": "Transcript text",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Transcript failure row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1"
  }
}