Visual Workflow

    JSON Code

    {
      "id": "PnbrcV8S3ZTpI9Lm",
      "meta": {
        "instanceId": "9fb634bb746cbe3fe9f7fa86fdd635510d2f0c24c4ba919fbba1ca6aec3c4e57",
        "templateCredsSetupCompleted": true
      },
      "name": "LinkedIn Job Scraper",
      "tags": [],
      "nodes": [
        {
          "id": "5cba6501-e8d7-4bf8-92f0-c92ffc16283b",
          "name": "Edit Fields",
          "type": "n8n-nodes-base.set",
          "position": [
            432,
            -80
          ],
          "parameters": {
            "options": {},
            "assignments": {
              "assignments": [
                {
                  "id": "19fe284a-3f61-4f07-9e85-bd1b0d74c17e",
                  "name": "BRIGHT_DATA_TOKEN",
                  "type": "string",
                  "value": "512e326da4ce13cd3dba56c7eac79f765490b483bdaed39183c54edfec54a591"
                },
                {
                  "id": "1ec8fcc8-51b1-4542-a39c-f1341d3165c7",
                  "name": "ABOUT_ME",
                  "type": "string",
                  "value": "I am a software developer with exp of 5 years in pharma and retail tech industry"
                },
                {
                  "id": "df199bdc-e748-4db0-8f41-f064651a5be8",
                  "name": "MY_SKILL",
                  "type": "string",
                  "value": "Node.js, JavaScript, TypeScript, React.js, Next.js, Express.js, Flask, AWS (EC2, S3, RDS), MongoDB, SQL, REST APIs, Tailwind, Sequelize, Mongoose, Linux."
                },
                {
                  "id": "dab60cfc-74c4-474f-a852-2509c7692320",
                  "name": "JOB_INPUT",
                  "type": "array",
                  "value": "=[\n  {\n    \"location\": \"New York\",\n    \"keyword\": \"NodeJs Developer\",\n    \"country\": \"US\",\n    \"time_range\": \"Past month\",\n    \"job_type\": \"Full-time\",\n    \"experience_level\": \"Associate\",\n    \"remote\": \"Hybrid\",\n    \"company\": \"\",\n    \"location_radius\": \"\"\n  },\n  {\n    \"location\": \"New York\",\n    \"keyword\": \"ReactJs Developer\",\n    \"country\": \"US\",\n    \"time_range\": \"Past 24 hours\",\n    \"job_type\": \"Full-time\",\n    \"experience_level\": \"Associate\",\n    \"remote\": \"Hybrid\",\n    \"company\": \"\",\n    \"location_radius\": \"\"\n  }\n]"
                }
              ]
            }
          },
          "typeVersion": 3.4
        },
        {
          "id": "6dd06e4a-d20b-4881-a1e1-b0fff7444231",
          "name": "HTTP Request- Post API call to Bright Data",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            624,
            -80
          ],
          "parameters": {
            "url": "https://api.brightdata.com/datasets/v3/trigger",
            "method": "POST",
            "options": {},
            "sendBody": true,
            "sendQuery": true,
            "authentication": "genericCredentialType",
            "bodyParameters": {
              "parameters": [
                {
                  "name": "input",
                  "value": "={{ $json.JOB_INPUT }}"
                }
              ]
            },
            "genericAuthType": "httpBearerAuth",
            "queryParameters": {
              "parameters": [
                {
                  "name": "dataset_id",
                  "value": "gd_lpfll7v5hcqtkxl6l"
                },
                {
                  "name": "notify",
                  "value": "=true"
                },
                {
                  "name": "include_errors",
                  "value": "true"
                },
                {
                  "name": "type",
                  "value": "discover_new"
                },
                {
                  "name": "discover_by",
                  "value": "keyword"
                }
              ]
            }
          },
          "credentials": {
            "httpBearerAuth": {
              "id": "f9slfKGysKyjvKOM",
              "name": "Brightdata Bearer Token"
            }
          },
          "retryOnFail": true,
          "typeVersion": 4.2,
          "waitBetweenTries": 5000
        },
        {
          "id": "fa80d748-592b-403f-8fde-240885c423ee",
          "name": "Snapshot Progress",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            1072,
            -160
          ],
          "parameters": {
            "url": "=https://api.brightdata.com/datasets/v3/progress/{{ $('HTTP Request- Post API call to Bright Data').item.json.snapshot_id }}",
            "options": {},
            "authentication": "genericCredentialType",
            "genericAuthType": "httpBearerAuth"
          },
          "credentials": {
            "httpBearerAuth": {
              "id": "f9slfKGysKyjvKOM",
              "name": "Brightdata Bearer Token"
            }
          },
          "typeVersion": 4.2
        },
        {
          "id": "f84adc99-8764-4cc2-80dd-64a9e0572479",
          "name": "Wait - Polling Bright Data",
          "type": "n8n-nodes-base.wait",
          "position": [
            848,
            -80
          ],
          "webhookId": "8005a2b3-2195-479e-badb-d90e4240e699",
          "parameters": {
            "unit": "minutes",
            "amount": 2
          },
          "executeOnce": false,
          "typeVersion": 1.1
        },
        {
          "id": "23455a65-eb54-4750-95cf-253309a3d024",
          "name": "If - Checking status of Snapshot - if data is ready or not",
          "type": "n8n-nodes-base.if",
          "position": [
            1296,
            -80
          ],
          "parameters": {
            "options": {},
            "conditions": {
              "options": {
                "version": 2,
                "leftValue": "",
                "caseSensitive": true,
                "typeValidation": "strict"
              },
              "combinator": "and",
              "conditions": [
                {
                  "id": "7932282b-71bb-4bbb-ab73-4978e554de7e",
                  "operator": {
                    "name": "filter.operator.equals",
                    "type": "string",
                    "operation": "equals"
                  },
                  "leftValue": "={{ $json.status }}",
                  "rightValue": "running"
                }
              ]
            }
          },
          "typeVersion": 2.2
        },
        {
          "id": "447f083c-c5e8-4818-9ba8-01631b156777",
          "name": "HTTP Request - Getting data from Bright Data",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            1584,
            -32
          ],
          "parameters": {
            "url": "=https://api.brightdata.com/datasets/v3/snapshot/{{ $('Snapshot Progress').item.json.snapshot_id }}",
            "options": {},
            "sendQuery": true,
            "authentication": "genericCredentialType",
            "genericAuthType": "httpBearerAuth",
            "queryParameters": {
              "parameters": [
                {
                  "name": "format",
                  "value": "json"
                }
              ]
            }
          },
          "credentials": {
            "httpBearerAuth": {
              "id": "f9slfKGysKyjvKOM",
              "name": "Brightdata Bearer Token"
            }
          },
          "typeVersion": 4.2
        },
        {
          "id": "d313e3d4-98db-4c55-ae91-106d7a7412e3",
          "name": "OpenRouter Chat Model",
          "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
          "position": [
            448,
            544
          ],
          "parameters": {
            "options": {}
          },
          "credentials": {
            "openRouterApi": {
              "id": "6z6zYFNsqyqFRUEB",
              "name": "OpenRouter account"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "1f77b72e-41cc-40a3-b534-116777772830",
          "name": "AI Screening",
          "type": "@n8n/n8n-nodes-langchain.agent",
          "position": [
            448,
            304
          ],
          "parameters": {
            "text": "=You are a career assistant. \nABOUT ME: {{ $('Edit Fields').item.json.ABOUT_ME }}\nMY SKILLS: {{ $('Edit Fields').item.json.MY_SKILL }}\n\nAnalyze this job posting and respond strictly in JSON format as follows:\n\n{\n  \"job_title\": \"Title of the job\",\n  \"match\": \"Yes or No\",\n  \"reason\": \"A short explanation why this job is a strong match for my profile\",\n  \"url\": \"Link to the job posting\",\n  \"job_location\": \"City, State/Region, Country\",\n  \"job_seniority_level\": \"Internship, Entry, Mid, Senior, etc.\",\n  \"job_function\": \"Primary function of the job\",\n  \"job_employment_type\": \"Full-time, Part-time, Contract, etc.\",\n  \"company_url\": \"Company's website or LinkedIn page\",\n  \"job_posted_time\": \"How long ago the job was posted\",\n  \"job_num_applicants\": \"Number of applicants if available\"\n}\n\nHere is the job posting text to analyze:\n{{ $json.result.data_str }}\n",
            "options": {
              "systemMessage": "=System Prompt (Formatted for Use):\n\nYou are a career assistant helping users evaluate job postings against their profile. The user will provide:\n\nTheir About Me description.\n\nTheir Skills list.\n\nA job posting text.\n\nYour task is to analyze the job posting and respond strictly in JSON array format with the following structure:\n  {\n    \"job_title\": \"Title of the job\",\n    \"match\": \"Yes or No\",\n    \"reason\": \"A short explanation why this job is a strong match for me\",\n    \"url\": \"Link to the job posting\",\n    \"job_location\": \"City, State/Region, Country\",\n    \"job_seniority_level\": \"Internship, Entry, Mid, Senior, etc.\",\n    \"job_function\": \"Primary function of the job\",\n    \"job_employment_type\": \"Full-time, Part-time, Contract, etc.\",\n    \"company_url\": \"Company's website or LinkedIn page\",\n    \"job_posted_time\": \"How long ago the job was posted\",\n    \"job_num_applicants\": \"Number of applicants if available\"\n}\nInstructions for completion:\n\nRead the user's About Me and Skills carefully.\n\nCompare them to the job posting text.\n\nDetermine if the user is a strong match for the role.\n\nFill in all JSON fields with accurate or best-estimate information.\n\nRespond only in valid JSON array format, no extra text or explanations.\n\nIf any information is not available in the posting, use \"Not specified\"."
            },
            "promptType": "define"
          },
          "typeVersion": 2
        },
        {
          "id": "f2420f7c-9b8d-4f68-be41-25a6facc764a",
          "name": "OpenRouter Chat Model1",
          "type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
          "position": [
            1232,
            544
          ],
          "parameters": {
            "options": {}
          },
          "credentials": {
            "openRouterApi": {
              "id": "6z6zYFNsqyqFRUEB",
              "name": "OpenRouter account"
            }
          },
          "typeVersion": 1
        },
        {
          "id": "e8cd2762-623b-4190-9643-0d807f950197",
          "name": "AI Compose Email Body",
          "type": "@n8n/n8n-nodes-langchain.agent",
          "position": [
            1232,
            304
          ],
          "parameters": {
            "text": "=Job Listings:\n{{ $json.data }}",
            "options": {
              "systemMessage": "=You are an assistant that summarizes LinkedIn job search data from JSON input. \n\nYour responsibilities:\n1. Accept JSON data containing any number of job postings. Each posting may have keys like: job_title, reason, url, job_location, job_seniority_level, job_posted_time, job_num_applicants, match, job_function, job_employment_type, company_url, or others.\n2. Dynamically handle any keys: include them in the summary table if present, skip them if missing.\n3. Present a **clean, professional HTML summary** of new jobs.\n4. Include at least these details if available: Job Title (bold), Location, Seniority Level, Posted Time, Number of Applicants, Match Status, Employment Type, Company URL (clickable).\n5. Calculate \"days since posted\" from `job_posted_time` if possible, and highlight matches if `match` is \"Yes\".\n6. Structure HTML with a table for easy reading, with headers and alternating row colors.\n7. Include a total count of jobs and today's date at the top.\n8. Only return **direct HTML**, no extra text or explanations.\n9. Ensure the HTML works for any number of jobs and variable JSON keys.\n\nExample HTML structure:\n<div>\n  <h2>LinkedIn Job Search Daily Summary</h2>\n  <p>Total New Jobs: X</p>\n  <p>Start From: TODAY'S DATE</p>\n  <table>\n    <thead>...</thead>\n    <tbody>\n      <tr>...</tr>\n    </tbody>\n  </table>\n</div>\n\nToday is {{ $now.format('cccc') }} the {{ $now.format('yyyy-MM-dd HH:mm') }}."
            },
            "promptType": "define"
          },
          "typeVersion": 2
        },
        {
          "id": "7953c534-af08-4f22-a4c0-67ea520bb392",
          "name": "Trigger Daily",
          "type": "n8n-nodes-base.scheduleTrigger",
          "position": [
            256,
            -80
          ],
          "parameters": {
            "rule": {
              "interval": [
                {
                  "triggerAtHour": 7
                }
              ]
            }
          },
          "typeVersion": 1.2
        },
        {
          "id": "593df734-2fb8-4908-a721-4d44e118f12d",
          "name": "Filter Matching Jobs",
          "type": "n8n-nodes-base.code",
          "position": [
            768,
            304
          ],
          "parameters": {
            "jsCode": "function tryParseJSON(x) {\n  if (typeof x !== 'string') return null;\n  try {\n    return JSON.parse(x);\n  } catch {\n    return null;\n  }\n}\n\n// Flatten all parsed jobs into one array\nconst allJobs = items\n  .map(item => tryParseJSON(item.json.output)) // parse the string in output\n  .filter(Boolean) // remove nulls\n  .flat(); // flatten arrays\n\n// Filter for match = 'yes' (case-insensitive) and take first 10\nconst matchedJobs = allJobs\n  .filter(job => job)\n  .slice(0, 10);\n\n// Return in n8n format\nconst result_data = matchedJobs.map(job => ({ json: job }));\nreturn result_data"
          },
          "typeVersion": 2
        },
        {
          "id": "098b6bf9-ecff-4632-a186-04f09a69e54a",
          "name": "Cleaning Up",
          "type": "n8n-nodes-base.code",
          "position": [
            256,
            304
          ],
          "parameters": {
            "jsCode": "// Helper function to strip HTML tags\nfunction stripHtml(html) {\n  return html\n    .replace(/<[^>]+>/g, '') // remove all HTML tags\n    .replace(/&nbsp;/g, ' ') // decode HTML entities\n    .replace(/&[a-z]+;/g, '') // remove other HTML entities\n    .replace(/\\s+/g, ' ') // normalize whitespace\n    .trim()\n}\n\nconst items = $('HTTP Request - Getting data from Bright Data').all()\n\nreturn items.map((item) => {\n  const data = item.json\n\n  // Flatten base_salary\n  if (data.base_salary) {\n    data.salary_min = data.base_salary.min_amount || ''\n    data.salary_max = data.base_salary.max_amount || ''\n    data.salary_currency = data.base_salary.currency || ''\n    data.salary_period = data.base_salary.payment_period || ''\n    data?.base_salary && delete data.base_salary\n  }\n\n  const result_data = {\n    job_title: data.job_title || '',\n    url: data.url || '',\n    job_location: data.job_location || '',\n    job_seniority_level: data.job_seniority_level || '',\n    job_function: data.job_function || '',\n    job_employment_type: data.job_employment_type || '',\n    company_url: data.company_url || '',\n    job_posted_time: data.job_posted_time || '',\n    job_num_applicants: data.job_num_applicants || '',\n    salary_min: data.salary_min || '',\n    salary_max: data.salary_max || '',\n    salary_currency: data.salary_currency || '',\n    salary_period: data.salary_period || '',\n    job_description_plain: data.job_description_formatted\n      ? stripHtml(data.job_description_formatted)\n      : '',\n  }\n  const result_data_str = JSON.stringify(result_data)\n  return {\n    json: {\n      result: {\n        data_str: result_data_str,\n        data: result_data,\n      },\n    },\n  }\n})\n"
          },
          "typeVersion": 2
        },
        {
          "id": "fd35bf62-a4df-446c-9180-083f3eebc7a3",
          "name": "Send Mail",
          "type": "n8n-nodes-base.httpRequest",
          "position": [
            1552,
            304
          ],
          "parameters": {
            "url": "https://api.resend.com/emails",
            "method": "POST",
            "options": {},
            "sendBody": true,
            "authentication": "genericCredentialType",
            "bodyParameters": {
              "parameters": [
                {
                  "name": "from",
                  "value": "=Jobs Daily <onboarding@resend.dev>"
                },
                {
                  "name": "to",
                  "value": "=your@email.com"
                },
                {
                  "name": "subject",
                  "value": "=LinkedIn Jobs Daily | {{ new Date().toLocaleDateString() }}"
                },
                {
                  "name": "html",
                  "value": "={{ $json.output }}"
                }
              ]
            },
            "genericAuthType": "httpBearerAuth"
          },
          "credentials": {
            "httpBearerAuth": {
              "id": "9yxG8hHGCrFmQQ1K",
              "name": "Resend Bearer Token"
            }
          },
          "typeVersion": 4.2
        },
        {
          "id": "236ba680-99ff-47fb-a417-2a72600ff22c",
          "name": "Set Listings as String",
          "type": "n8n-nodes-base.code",
          "position": [
            1024,
            304
          ],
          "parameters": {
            "jsCode": "\nreturn {\n  json:{\n    data: JSON.stringify(items)\n  }\n}"
          },
          "typeVersion": 2
        },
        {
          "id": "5e130dd1-3652-4c06-9972-05e79d7226d9",
          "name": "Append row in sheet",
          "type": "n8n-nodes-base.googleSheets",
          "position": [
            1024,
            496
          ],
          "parameters": {
            "columns": {
              "value": {},
              "schema": [
                {
                  "id": "job_title",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "job_title",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "reason",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "reason",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "url",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "url",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "job_location",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "job_location",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "job_seniority_level",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "job_seniority_level",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "job_posted_time",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "job_posted_time",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "job_num_applicants",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "job_num_applicants",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "match",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "match",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "job_function",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "job_function",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "job_employment_type",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "job_employment_type",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "company_url",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "company_url",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                },
                {
                  "id": "listings",
                  "type": "string",
                  "display": true,
                  "required": false,
                  "displayName": "listings",
                  "defaultMatch": false,
                  "canBeUsedToMatch": true
                }
              ],
              "mappingMode": "autoMapInputData",
              "matchingColumns": [],
              "attemptToConvertTypes": false,
              "convertFieldsToString": false
            },
            "options": {},
            "operation": "append",
            "sheetName": {
              "__rl": true,
              "mode": "list",
              "value": "gid=0",
              "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1awPFjM8r-fimvwiYznWLMF1KxRx2MRDrqs-fYWnaOs4/edit#gid=0",
              "cachedResultName": "Auto Jobs"
            },
            "documentId": {
              "__rl": true,
              "mode": "list",
              "value": "1awPFjM8r-fimvwiYznWLMF1KxRx2MRDrqs-fYWnaOs4",
              "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1awPFjM8r-fimvwiYznWLMF1KxRx2MRDrqs-fYWnaOs4/edit?usp=drivesdk",
              "cachedResultName": "TEST | n8n | Linkedin Jobs"
            }
          },
          "credentials": {
            "googleSheetsOAuth2Api": {
              "id": "TB2tCNqF1GBm2ag8",
              "name": "Google Sheets account"
            }
          },
          "typeVersion": 4.7
        },
        {
          "id": "ed2792bc-7255-42a7-a5b2-85c04089f5f8",
          "name": "Sticky Note",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            208,
            -208
          ],
          "parameters": {
            "color": 5,
            "width": 1520,
            "height": 352,
            "content": "##  Part 1: Job Data Collection"
          },
          "typeVersion": 1
        },
        {
          "id": "59982874-0dd0-470e-b661-401c634e31e9",
          "name": "Sticky Note1",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            208,
            176
          ],
          "parameters": {
            "color": 5,
            "width": 720,
            "height": 560,
            "content": "## Part 2: AI Screening & Filtering\n"
          },
          "typeVersion": 1
        },
        {
          "id": "085f7438-09b2-470f-9bea-2f7a085158e1",
          "name": "Sticky Note2",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            960,
            176
          ],
          "parameters": {
            "color": 5,
            "width": 768,
            "height": 560,
            "content": "## Part 3: Delivery & Notification"
          },
          "typeVersion": 1
        },
        {
          "id": "464db3be-890b-4220-950a-1f7909a822c0",
          "name": "Sticky Note12",
          "type": "n8n-nodes-base.stickyNote",
          "position": [
            -352,
            -208
          ],
          "parameters": {
            "width": 528,
            "height": 1040,
            "content": "# 🛠️ Setup Guide  \n\n**Author: [Sohail Jafri](https://link.thesohailjafri.me/web_ai) | [Youtube](https://link.thesohailjafri.me/yt_ai) | [Instagram](https://link.thesohailjafri.me/ig_ai) | [Join Skool](https://link.thesohailjafri.me/join-skool)**\n\nFollow the steps below to get your LinkedIn Job Scraper running:\n\n### ✅ Step 1: Copy the Google Sheet template  \nMake a copy of the sheet and connect it to the **[Append row in sheet](https://docs.google.com/spreadsheets/d/1awPFjM8r-fimvwiYznWLMF1KxRx2MRDrqs-fYWnaOs4/copy)** node.  \nTemplate: \n\n### ✅ Step 2: Add [Bright Data](https://brightdata.com/) credentials  \nAdd your Bright Data Bearer token to the Bright Data HTTP Request nodes.  \n\n### ✅ Step 3: Connect your AI models  \nAdd your OpenRouter (or preferred LLM) API key to both LM nodes used for screening and email composition.  \n- [OpenRouter](https://openrouter.ai/)\n- [OpenAI](https://platform.openai.com/)\n\n### ✅ Step 4: Add [Resend](https://resend.com/) API key  \nConfigure the Resend bearer token in the **Send Mail** node to enable daily emails.  \n\n\n### ✅ Step 5: Populate Edit Fields  \nFill these values in the **Edit Fields** node:  \n- **ABOUT_ME** — short resume summary  \n- **MY_SKILL** — comma-separated skill list  \n- **JOB_INPUT** — array of search queries (location, keyword, time_range, job_type, experience_level, remote)\n\n### ✅ Step 6: Test the flow  \nRun the workflow manually with a small JOB_INPUT to confirm end-to-end success.\n\n### 💡 Quick config tips\n- **Poll interval** = 2 minutes (adjust in **Wait - Polling Bright Data** if needed).  \n- Ensure the Google Sheet columns match the node schema.  \n- Verify the email **to** address in **Send Mail** before enabling production.\n\n### ✅ Final step: Enable workflow  \nSwitch the workflow to active after confirming credentials and a successful test run.\n"
          },
          "typeVersion": 1
        }
      ],
      "active": false,
      "pinData": {},
      "settings": {
        "executionOrder": "v1"
      },
      "versionId": "908ca50e-d29d-4fc8-8824-93bf18b85fb2",
      "connections": {
        "Cleaning Up": {
          "main": [
            [
              {
                "node": "AI Screening",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Edit Fields": {
          "main": [
            [
              {
                "node": "HTTP Request- Post API call to Bright Data",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "AI Screening": {
          "main": [
            [
              {
                "node": "Filter Matching Jobs",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Trigger Daily": {
          "main": [
            [
              {
                "node": "Edit Fields",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Snapshot Progress": {
          "main": [
            [
              {
                "node": "If - Checking status of Snapshot - if data is ready or not",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Filter Matching Jobs": {
          "main": [
            [
              {
                "node": "Set Listings as String",
                "type": "main",
                "index": 0
              },
              {
                "node": "Append row in sheet",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "AI Compose Email Body": {
          "main": [
            [
              {
                "node": "Send Mail",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "OpenRouter Chat Model": {
          "ai_languageModel": [
            [
              {
                "node": "AI Screening",
                "type": "ai_languageModel",
                "index": 0
              }
            ]
          ]
        },
        "OpenRouter Chat Model1": {
          "ai_languageModel": [
            [
              {
                "node": "AI Compose Email Body",
                "type": "ai_languageModel",
                "index": 0
              }
            ]
          ]
        },
        "Set Listings as String": {
          "main": [
            [
              {
                "node": "AI Compose Email Body",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "Wait - Polling Bright Data": {
          "main": [
            [
              {
                "node": "Snapshot Progress",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "HTTP Request- Post API call to Bright Data": {
          "main": [
            [
              {
                "node": "Wait - Polling Bright Data",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "HTTP Request - Getting data from Bright Data": {
          "main": [
            [
              {
                "node": "Cleaning Up",
                "type": "main",
                "index": 0
              }
            ]
          ]
        },
        "If - Checking status of Snapshot - if data is ready or not": {
          "main": [
            [
              {
                "node": "Wait - Polling Bright Data",
                "type": "main",
                "index": 0
              }
            ],
            [
              {
                "node": "HTTP Request - Getting data from Bright Data",
                "type": "main",
                "index": 0
              }
            ]
          ]
        }
      }
    }