{
  "id": "VwU1zMhcgzgPS9ak",
  "meta": {
    "instanceId": "660cf2c29eb19fa42319afac3bd2a4a74c6354b7c006403f6cba388968b63f5d",
    "templateCredsSetupCompleted": true
  },
  "name": "List Builder",
  "tags": [
    {
      "id": "a8B9vqj0vNLXcKVQ",
      "name": "template",
      "createdAt": "2025-04-04T15:38:37.785Z",
      "updatedAt": "2025-04-04T15:38:37.785Z"
    }
  ],
  "nodes": [
    {
      "id": "1a6aa574-467d-40b0-a9a5-a5537bede3de",
      "name": "When clicking ‘Test workflow’",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        0,
        0
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "62db9366-7e6f-4346-9de8-9fa730d059ed",
      "name": "Format results",
      "type": "n8n-nodes-base.code",
      "position": [
        660,
        0
      ],
      "parameters": {
        "jsCode": "// Get first input item\nconst input = $input.first().json.data.modelResponse\n// Parse list of links\nconst listOfLinks = JSON.parse(input).results\n// Format node's output\nconst output = listOfLinks.map((item) => ({\n  json: { url: item.url }\n}))\n\nreturn output;"
      },
      "typeVersion": 2
    },
    {
      "id": "fa960de3-8dd6-40a3-aa59-634ad250f5d1",
      "name": "Get urls",
      "type": "n8n-nodes-base.airtop",
      "position": [
        440,
        0
      ],
      "parameters": {
        "url": "=https://www.google.com/search?q={{ encodeURI($json.who+' on ' + $json.where) }}",
        "prompt": "=Those are search results, return up to 10 non-sponsored results that lead to a web page with a list of {{$json.who}} on {{$json.where}}. For each return the title and URL.",
        "resource": "extraction",
        "operation": "query",
        "sessionMode": "new",
        "additionalFields": {
          "outputSchema": "{  \"type\": \"object\",  \"properties\": {    \"results\": {      \"type\": \"array\",      \"items\": {        \"type\": \"object\",        \"properties\": {          \"title\": {            \"type\": \"string\",            \"description\": \"The title of the search result.\"          },          \"url\": {            \"type\": \"string\",            \"description\": \"The URL of the webpage.\"          }        },        \"required\": [          \"title\",          \"url\"        ],        \"additionalProperties\": false      },      \"description\": \"A list of up to 10 non-sponsored search results.\"    }  },  \"required\": [    \"results\"  ],  \"additionalProperties\": false,  \"$schema\": \"http://json-schema.org/draft-07/schema#\"}"
        }
      },
      "credentials": {
        "airtopApi": {
          "id": "byhouJF8RLH5DkmY",
          "name": "Airtop"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d75dbdce-7a7e-4a30-81b0-6e8fa5221f55",
      "name": "Get people",
      "type": "n8n-nodes-base.airtop",
      "position": [
        880,
        0
      ],
      "parameters": {
        "url": "={{ $json.url }}",
        "prompt": "=This is a list of {{ $('Parameters').item.json.who }} on {{ $('Parameters').item.json.where }}.\nExtract up to 20 items. For each person extract: \n- name \n- handle or ID \n- URL",
        "resource": "extraction",
        "operation": "query",
        "sessionMode": "new",
        "additionalFields": {
          "outputSchema": "{\n  \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n  \"type\": \"object\",\n  \"properties\": {\n    \"items\": {\n      \"type\": \"array\",\n      \"items\": {\n        \"type\": \"object\",\n        \"properties\": {\n          \"name\": {\n            \"type\": \"string\",\n            \"description\": \"The name of the item.\"\n          },\n          \"identifier\": {\n            \"type\": \"string\",\n            \"description\": \"The unique identifier or handle for the item.\"\n          },\n          \"url\": {\n            \"type\": \"string\",\n            \"description\": \"The URL to access the item or its related resource.\"\n          }\n        },\n        \"required\": [\n          \"name\",\n          \"identifier\",\n          \"url\"\n        ],\n        \"additionalProperties\": false\n      }\n    }\n  },\n  \"required\": [\n    \"items\"\n  ],\n  \"additionalProperties\": false\n}"
        }
      },
      "credentials": {
        "airtopApi": {
          "id": "byhouJF8RLH5DkmY",
          "name": "Airtop"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "285ce6af-bda8-4025-872e-f5f8c4a56b3c",
      "name": "Dedupe results",
      "type": "n8n-nodes-base.code",
      "position": [
        1100,
        0
      ],
      "parameters": {
        "jsCode": "const allResults = []\n\nfor (const inputItem of $input.all()) {\n  // Parse input to JSON\n  const input = inputItem.json.data.modelResponse\n  const results = JSON.parse(input).items\n  // clean results\n  const cleanedResults = results\n    .filter((res) => res.name) // only those with name\n    .map((res) => ({\n      ...res,\n      url: res.url.split('?')[0] // clean url\n    }))\n  // add results to list\n  allResults.push(...cleanedResults)\n}\n\n// Dedupe urls\nconst uniqueList = allResults.filter((item, index, self) =>\n  index === self.findIndex((t) => (t.url === item.url))\n);\n\nreturn uniqueList.map((item) => ({\n  json: {...item}\n}));"
      },
      "typeVersion": 2
    },
    {
      "id": "fdc86d5c-4df3-48b9-9cf6-a5ddc3b45c90",
      "name": "Add to spreadsheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1320,
        0
      ],
      "parameters": {
        "columns": {
          "value": {
            "URL": "={{ $json.url }}",
            "Name": "={{ $json.name }}",
            "Who?": "={{ $('Parameters').first().json.who }}",
            "Where?": "={{ $('Parameters').first().json.where }}",
            "Added on": "={{ $now }}",
            "ID or Handle": "={{ $json.identifier }}"
          },
          "schema": [
            {
              "id": "Who?",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Who?",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Where?",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Where?",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "ID or Handle",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "ID or Handle",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "URL",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Added on",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Added on",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/150eh4t5GyEBN_TcO5TDeNWpE2GzHR4hQWoNRbUpw7A0/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "150eh4t5GyEBN_TcO5TDeNWpE2GzHR4hQWoNRbUpw7A0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/150eh4t5GyEBN_TcO5TDeNWpE2GzHR4hQWoNRbUpw7A0/edit?usp=drivesdk",
          "cachedResultName": "List Builder"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "CwpCAR1HwgHZpRtJ",
          "name": "Google Drive"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "44c54497-741c-4c48-b4f9-0c5c836d10ad",
      "name": "Parameters",
      "type": "n8n-nodes-base.set",
      "position": [
        220,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "bc2d3cb9-b7d0-4c3f-b392-53262d60441e",
              "name": "who",
              "type": "string",
              "value": "Top \"Build in Public\" influencers"
            },
            {
              "id": "b2cfa361-c80a-4945-bc0e-23eac5edebd6",
              "name": "where",
              "type": "string",
              "value": "X"
            }
          ]
        }
      },
      "typeVersion": 3.4
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "a2572aec-54cb-4bbb-b503-09d1d0beb64f",
  "connections": {
    "Get urls": {
      "main": [
        [
          {
            "node": "Format results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get people": {
      "main": [
        [
          {
            "node": "Dedupe results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parameters": {
      "main": [
        [
          {
            "node": "Get urls",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Dedupe results": {
      "main": [
        [
          {
            "node": "Add to spreadsheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format results": {
      "main": [
        [
          {
            "node": "Get people",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking ‘Test workflow’": {
      "main": [
        [
          {
            "node": "Parameters",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}