{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "1dc70980-1f3d-4352-8f39-9465eb0357ff",
      "name": "On form submission",
      "type": "n8n-nodes-base.formTrigger",
      "position": [
        -80,
        0
      ],
      "parameters": {
        "options": {},
        "formTitle": "YouTube Video giveaway ",
        "formFields": {
          "values": [
            {
              "fieldLabel": "url",
              "requiredField": true
            }
          ]
        },
        "formDescription": "YouTube Video giveaway "
      },
      "typeVersion": 2.2
    },
    {
      "id": "bc236f4c-6d15-447b-94a8-d1d435455e20",
      "name": "Fetch YouTube Comments",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        176,
        0
      ],
      "parameters": {
        "url": "https://youtube-comments-scraper.p.rapidapi.com/comment.php",
        "method": "POST",
        "options": {
          "response": {
            "response": {
              "fullResponse": true
            }
          }
        },
        "sendBody": true,
        "contentType": "multipart-form-data",
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "url",
              "value": "={{ $json.url }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "x-rapidapi-host",
              "value": "youtube-comments-scraper.p.rapidapi.com"
            },
            {
              "name": "x-rapidapi-key",
              "value": "your key"
            }
          ]
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "155352c4-d1d6-49c3-a86f-a65176acba98",
      "name": "Check API Response Status",
      "type": "n8n-nodes-base.if",
      "position": [
        448,
        0
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "38976149-dd8b-452f-a2d1-cd4c88dfa791",
              "operator": {
                "type": "number",
                "operation": "equals"
              },
              "leftValue": "={{ $json.statusCode }}",
              "rightValue": "=200"
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.2
    },
    {
      "id": "eefb9182-3705-4c12-9e58-7ae37a3e5c88",
      "name": "Select Random Commenter",
      "type": "n8n-nodes-base.code",
      "position": [
        720,
        0
      ],
      "parameters": {
        "jsCode": "// Extract the array of comment items from the API response\nconst comments = $input.first().json.body.items || [];\n\n// Extract authorDisplayName safely\nconst authors = comments\n  .map(item => {\n    // Check if snippet and topLevelComment exist before accessing authorDisplayName\n    if (item.snippet && item.snippet.topLevelComment && item.snippet.topLevelComment.snippet) {\n      return item.snippet.topLevelComment.snippet.authorDisplayName;\n    }\n    return null; // or undefined\n  })\n  .filter(name => !!name); // filter out null/undefined\n\nif (authors.length === 0) {\n  // No authors found, return empty or null\n  return [{ json: { randomAuthorDisplayName: null } }];\n}\n\n// Randomly select one authorDisplayName\nconst randomIndex = Math.floor(Math.random() * authors.length);\nconst randomAuthor = authors[randomIndex];\n\n// Return as output\nreturn [{ json: { randomAuthorDisplayName: randomAuthor } }];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "ac6097b0-8fd5-41d3-8733-e6d61217b822",
      "name": "Notify: Invalid API Response",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        704,
        320
      ],
      "parameters": {
        "html": "Hello,\n\nThe attempt to fetch comments from the provided YouTube URL did not succeed.  \nPlease verify the URL and try again.\n\nIf the problem persists, please check the API key or contact support.\n\nBest regards,  \nYouTube Giveaway Bot\n",
        "options": {},
        "subject": "YouTube Comments Scraper: API Request Failed",
        "toEmail": "user@example.com",
        "fromEmail": "user@example.com"
      },
      "credentials": {
        "smtp": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "b28e03d1-0103-4453-97bf-cdb69ecb3c49",
      "name": "Notify Winner Email",
      "type": "n8n-nodes-base.emailSend",
      "position": [
        1312,
        -64
      ],
      "parameters": {
        "html": "=Hello ,\n\nThe YouTube giveaway has concluded, and the winner has been selected!\n\nWinner: {{$json.randomAuthorDisplayName}}\n\nThe winner's details have been logged in the spreadsheet for your records.\n\nBest regards,  \nYour Giveaway Automation Bot\n",
        "options": {},
        "subject": "=Congratulations! {{$json.randomAuthorDisplayName}} is the Winner of the Giveaway!",
        "toEmail": "=owner@gmail.com",
        "fromEmail": "user@example.com"
      },
      "credentials": {
        "smtp": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "00ed6cc0-8f7f-44e9-bf69-cb7512c49163",
      "name": "Log Winner to Google Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1008,
        -48
      ],
      "parameters": {
        "columns": {
          "value": {
            "Url": "={{ $('On form submission').item.json.url }}",
            "Date": "={{ $('On form submission').item.json.submittedAt }}",
            "Winner": "={{ $json.randomAuthorDisplayName }}"
          },
          "schema": [
            {
              "id": "Date",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Date",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Url",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Winner",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Winner",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "url",
          "value": ""
        },
        "authentication": "serviceAccount"
      },
      "credentials": {
        "googleApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "7345d6e6-dde3-4880-85a5-e34780ad9335",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        128,
        -112
      ],
      "parameters": {
        "height": 256,
        "content": "Sends a POST request to RapidAPI to scrape YouTube comments from the given URL.\nIncludes API key and necessary headers for authentication."
      },
      "typeVersion": 1
    },
    {
      "id": "9f072800-bbac-412f-99a1-28a552ce9558",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -128,
        -112
      ],
      "parameters": {
        "height": 256,
        "content": "Triggers the workflow when a form with a YouTube URL is submitted.\nCaptures the URL input for further processing."
      },
      "typeVersion": 1
    },
    {
      "id": "26e755bc-4755-4dc7-a7d0-4f2f3cfbf0ca",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        384,
        -112
      ],
      "parameters": {
        "height": 256,
        "content": "Checks if the API response status code equals 200 (success).\nRoutes workflow based on success or failure of the API call."
      },
      "typeVersion": 1
    },
    {
      "id": "449460b5-3b24-42a0-957f-2a47363889bc",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        640,
        -112
      ],
      "parameters": {
        "height": 256,
        "content": "Extracts author names from the fetched comments.\nRandomly selects one commenter as the giveaway winner."
      },
      "typeVersion": 1
    },
    {
      "id": "023052db-e197-48ff-9567-62d2565cbf2e",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        672,
        192
      ],
      "parameters": {
        "height": 288,
        "content": "Sends an email notification if the API call fails or returns an invalid response.\nAlerts the admin to verify URL or API credentials."
      },
      "typeVersion": 1
    },
    {
      "id": "f814c860-8649-4f9b-bcb7-8f9a7a83d697",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        944,
        -176
      ],
      "parameters": {
        "height": 288,
        "content": "Appends the winner\u2019s name, URL, and submission date to a Google Sheet.\nUses service account authentication for Google Sheets access."
      },
      "typeVersion": 1
    },
    {
      "id": "e4feec40-ba6b-4c15-b2a2-5525f4424dfd",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1264,
        -192
      ],
      "parameters": {
        "height": 272,
        "content": "Sends a congratulatory email announcing the giveaway winner.\nIncludes the winner\u2019s name and relevant giveaway details."
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "On form submission": {
      "main": [
        [
          {
            "node": "Fetch YouTube Comments",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch YouTube Comments": {
      "main": [
        [
          {
            "node": "Check API Response Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Select Random Commenter": {
      "main": [
        [
          {
            "node": "Log Winner to Google Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check API Response Status": {
      "main": [
        [
          {
            "node": "Select Random Commenter",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify: Invalid API Response",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log Winner to Google Sheet": {
      "main": [
        [
          {
            "node": "Notify Winner Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}