{ "name": "n8n-jobcheck", "nodes": [ { "parameters": { "operation": "download", "fileId": { "__rl": true, "value": "https://drive.google.com/file/d/1UOve7eNkWQ2yd-80Ig3Bw_vWEiOwqfkf/view", "mode": "url" }, "options": {} }, "type": "n8n-nodes-base.googleDrive", "typeVersion": 3, "position": [ -432, 624 ], "id": "8d580f6f-db7e-4341-b15b-a18b0f0ff360", "name": "Download file", "credentials": { "googleDriveOAuth2Api": { "id": "sV1Ka583I2wqYFAP", "name": "Google Drive account" } } }, { "parameters": { "operation": "pdf", "options": {} }, "type": "n8n-nodes-base.extractFromFile", "typeVersion": 1, "position": [ -224, 624 ], "id": "b628b4e1-deab-442e-b66d-49c80e4285c8", "name": "Extract from File" }, { "parameters": { "jsCode": "let url = \"https://www.linkedin.com/jobs/search/?f_TPR=r86400\"\n\nconst keyword = $input.first().json.Keyword\nconst location = $input.first().json.Location\nconst experienceLevel = $input.first().json['Experience Level']\nconst remote = $input.first().json.Remote\nconst easyApply = $input.first().json['Easy Apply']\n\nif (keyword != \"\") {\n url += `&keywords=${keyword}`;\n}\n\nif (location != \"\") {\n url += `&location=${location}`;\n}\n\nif (experienceLevel !== \"\") {\n // Transform experience levels to LinkedIn codes\n // Internship -> 1, Entry level -> 2, Associate -> 3\n // Mid-Senior level -> 4, Director -> 5, Executive -> 6\n const transformedExperiences = experienceLevel\n .split(\",\")\n .map((exp) => {\n switch (exp.trim()) {\n case \"Internship\": return \"3\";\n case \"Entry level\": return \"1\";\n case \"New Grad\": return \"2\";\n default: return \"\";\n }\n })\n .filter(Boolean);\n url += `&f_E=${transformedExperiences.join(\",\")}`;\n}\n\nif (remote.length != \"\") {\n // Transform remote options to LinkedIn codes\n // On-Site -> 1, Remote -> 2, Hybrid -> 3\n const transformedRemote = remote\n .split(\",\")\n .map((e) => {\n switch (e.trim()) {\n case \"Remote\": return \"2\";\n case \"Hybrid\": return \"3\";\n case \"On-Site\": return \"1\";\n default: return \"\";\n }\n })\n .filter(Boolean);\n url += `&f_WT=${transformedRemote.join(\",\")}`;\n}\n\nif (easyApply != \"\") {\n url += \"&f_EA=true\";\n}\n\nreturn {url}\n" }, "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [ 192, 624 ], "id": "79b33399-599e-4cd7-a6db-f8614179d6f5", "name": "LinkedIn Search URL" }, { "parameters": { "url": "={{ $json.url }}", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ 400, 624 ], "id": "94755724-90fb-4d40-96f9-d26ee4c13ced", "name": "Fetch jobs from LinkedIn" }, { "parameters": { "operation": "extractHtmlContent", "extractionValues": { "values": [ { "key": "jobs", "cssSelector": "ul.jobs-search__results-list li div a[class*=\"base-card\"]", "returnValue": "attribute", "attribute": "href", "returnArray": true } ] }, "options": {} }, "type": "n8n-nodes-base.html", "typeVersion": 1.2, "position": [ 608, 624 ], "id": "59b760fc-f952-4d2d-9845-c818f9370cd8", "name": "HTML" }, { "parameters": { "fieldToSplitOut": "jobs", "options": {} }, "type": "n8n-nodes-base.splitOut", "typeVersion": 1, "position": [ 816, 624 ], "id": "c6ed8649-8490-43af-a796-98b2a5433de1", "name": "Split Out" }, { "parameters": { "options": {} }, "type": "n8n-nodes-base.splitInBatches", "typeVersion": 3, "position": [ 928, 1440 ], "id": "e564d074-31c0-48bc-bc22-f97daecc32d0", "name": "Loop Over Items" }, { "parameters": { "amount": 2 }, "type": "n8n-nodes-base.wait", "typeVersion": 1.1, "position": [ -672, 832 ], "id": "874332e4-4912-436b-816c-61c93e00f0c9", "name": "Wait", "webhookId": "12409f66-fbe7-48bd-b9d7-68449f197264" }, { "parameters": { "url": "={{ $json.jobs }}", "options": {} }, "type": "n8n-nodes-base.httpRequest", "typeVersion": 4.2, "position": [ -464, 832 ], "id": "5f5dc9fa-e96e-4e14-a06d-faa3b9ff0040", "name": "HTTP Request" }, { "parameters": { "operation": "extractHtmlContent", "extractionValues": { "values": [ { "key": "Title", "cssSelector": "div h1" }, { "key": "Company", "cssSelector": "div span a" }, { "key": "Location", "cssSelector": "div span[class*='topcard__flavor topcard__flavor--bullet']" }, { "key": "Description", "cssSelector": "div.description__text.description__text--rich" }, { "key": "Job ID", "cssSelector": "a[data-item-type='semaphore']", "returnValue": "attribute", "attribute": "data-semaphore-content-urn" } ] }, "options": {} }, "type": "n8n-nodes-base.html", "typeVersion": 1.2, "position": [ -256, 832 ], "id": "0aacee39-db24-449c-8319-edc27126ee2d", "name": "HTML1" }, { "parameters": { "assignments": { "assignments": [ { "id": "240418dc-3349-48d5-ba59-3aa590d71950", "name": "Description", "value": "={{ $json.Description.replaceAll(/\\s+/g, \" \")}}", "type": "string" }, { "id": "7b24938f-8b47-488d-9f65-54d036dcffd5", "name": "Job ID", "value": "={{ $json['Job ID'].split(\":\").last() }}", "type": "string" }, { "id": "d6addada-9e01-464f-a768-c19f6224c491", "name": "Apply Link", "value": "={{ \"https://www.linkedin.com/jobs/view/\"+ $json['Job ID'].split(\":\").last() }}", "type": "string" }, { "id": "21c89d3a-c8b6-44eb-9719-9ae5716a7c76", "name": "Title", "value": "={{ $json.Title }}", "type": "string" }, { "id": "da713845-9a81-486e-bff2-1613105e424d", "name": "Company", "value": "={{ $json.Company }}", "type": "string" }, { "id": "1a9a31dd-8d51-4f35-b6b6-ca8a348de5d7", "name": "Location", "value": "={{ $json.Location }}", "type": "string" }, { "id": "499d8595-1f04-424d-81e3-35fe0236fe5f", "name": "url", "value": "={{ $('LinkedIn Search URL').first().json.url }}", "type": "string" } ] }, "options": {} }, "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [ -48, 832 ], "id": "a2629064-fbe6-4ad0-bf2f-9b55724cb5a8", "name": "Edit Fields" }, { "parameters": { "promptType": "define", "text": "=You are a precise job-matching assistant.\n\nReturn ONE JSON object wrapped in ```json fences, followed by the line END_OF_JSON.\nNo extra prose. No Markdown inside the JSON. No comments.\n\nINPUTS\njob_description: {{ $('Edit Fields').first().json.Description }}\nmy_resume: {{ $('Extract from File').first().json.text }}\n\n\nTASKS\n1) Parse job_description → job_analysis with keys:\n title (string), company (string), must_have_skills (string[]), nice_to_have_skills (string[]),\n responsibilities (string[]), years_of_experience (string), education_certifications (string),\n location_constraints (string), domain_industry_focus (string), tech_stack (string[]), measurable_kpis (string[])\n\n2) Parse my_resume → resume_analysis:\n core_skills (string[]),\n tools_tech { programming_languages[], frontend_technologies[], backend_technologies[], databases_devops[] },\n years_of_experience_key_areas (object of short strings),\n accomplishments_with_metrics (string[]),\n education_certs (string[]), domains (string[]), roles_titles (string[]),\n leadership_collaboration (string[]), location_work_auth (string)\n\n3) Scoring (integer 0–100):\n - Skills/Tools overlap: 40\n - Relevant experience & seniority: 25\n - Responsibilities alignment: 15\n - Education/Certs fit: 10\n - Domain/industry fit: 5\n - Logistics (location/work auth/availability): 5\n Allow partial credit; deduct up to 10 via red_flags. Clamp to [0,100], integer.\n\n4) Explain the score:\n For each bucket, provide 1–3 concise evidence bullets. Cite \"JD\" or \"Resume\" and include short quoted fragments (escape quotes).\n\n5) Gaps & Suggestions:\n List missing/weak requirements with 1–2 concrete upskilling steps per gap.\n\n6) Cover letter:\n 150–220 words (2–4 short paragraphs), tailored to the role/company.\n Concrete impacts; no greeting/signature. JSON-safe: escape all \" as \\\", use \\n for newlines.\n\nSTRICT CONTENT RULES (to prevent invalid JSON)\n- Do NOT paste raw paragraphs, markdown (**bold**, lists), headings, or multi-line blocks into any array fields.\n- Every array element must be a short phrase (≤ 140 characters), single line, no line breaks, no asterisks, no bullets.\n- If a JD section is long, summarize into short phrases before placing into arrays.\n- Do NOT include unrelated job text inside arrays or objects. Keep each value semantically atomic.\n- Never invent company/title; use \"\" if unknown.\n- No trailing commas anywhere.\n\nSTRICT OUTPUT RULES\n- Output exactly the following schema (keys and types). No extra keys.\n\nSCHEMA\n```json\n{\n \"job_analysis\": {\n \"title\": \"\",\n \"company\": \"\",\n \"must_have_skills\": [],\n \"nice_to_have_skills\": [],\n \"responsibilities\": [],\n \"years_of_experience\": \"\",\n \"education_certifications\": \"\",\n \"location_constraints\": \"\",\n \"domain_industry_focus\": \"\",\n \"tech_stack\": [],\n \"measurable_kpis\": []\n },\n \"resume_analysis\": {\n \"core_skills\": [],\n \"tools_tech\": {\n \"programming_languages\": [],\n \"frontend_technologies\": [],\n \"backend_technologies\": [],\n \"databases_devops\": []\n },\n \"years_of_experience_key_areas\": {},\n \"accomplishments_with_metrics\": [],\n \"education_certs\": [],\n \"domains\": [],\n \"roles_titles\": [],\n \"leadership_collaboration\": [],\n \"location_work_auth\": \"\"\n },\n \"match_score\": 0,\n \"score_explanation\": [\n { \"category\": \"Skills/Tools overlap (40 points)\", \"score\": 0, \"evidence\": [] },\n { \"category\": \"Relevant experience depth & seniority (25 points)\", \"score\": 0, \"evidence\": [] },\n { \"category\": \"Responsibilities alignment (15 points)\", \"score\": 0, \"evidence\": [] },\n { \"category\": \"Education/Certs fit (10 points)\", \"score\": 0, \"evidence\": [] },\n { \"category\": \"Domain/industry fit (5 points)\", \"score\": 0, \"evidence\": [] },\n { \"category\": \"Logistics (location, work auth, availability) (5 points)\", \"score\": 0, \"evidence\": [] }\n ],\n \"red_flags\": [],\n \"gaps_and_suggestions\": [\n { \"gap\": \"\", \"suggestion\": \"\" }\n ],\n \"cover_letter\": \"\"\n}\n", "options": {} }, "type": "@n8n/n8n-nodes-langchain.agent", "typeVersion": 2.2, "position": [ -608, 1088 ], "id": "550a7962-82f2-49cd-985f-111712d56ee7", "name": "AI Agent" }, { "parameters": { "options": {} }, "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini", "typeVersion": 1, "position": [ -608, 1264 ], "id": "d5f6e295-b564-44c4-afe5-6f7e4ef5acfa", "name": "Google Gemini Chat Model", "credentials": { "googlePalmApi": { "id": "tMEqhBXsNeq7PjGN", "name": "Google Gemini(PaLM) Api account 2" } } }, { "parameters": { "mode": "raw", "jsonOutput": "={{ (() => {\n // 0) Read model output from AI Agent node\n const raw = String(($('AI Agent').item.json.output ?? ''));\n\n // 1) Strip code fences\n let s = raw\n .replace(/`{2,3}(?:json)?\\s*/gi, '')\n .replace(/\\s*`{3}\\s*$/gi, '');\n\n // 1b) Normalize curly quotes (Gemini sometimes emits them)\n s = s.replace(/[\\u201C\\u201D]/g, '\"').replace(/\\u2019/g, \"'\");\n\n // 2) Cut at END_OF_JSON if present\n const endIdx = s.indexOf('END_OF_JSON');\n if (endIdx !== -1) s = s.slice(0, endIdx);\n\n // 3) Extract first complete { ... } by brace counting\n const start = s.indexOf('{');\n if (start < 0) return {};\n let depth = 0, inStr = false, esc = false, end = -1;\n for (let i = start; i < s.length; i++) {\n const ch = s[i];\n if (inStr) {\n if (esc) { esc = false; }\n else if (ch === '\\\\') { esc = true; }\n else if (ch === '\"') { inStr = false; }\n } else {\n if (ch === '\"') inStr = true;\n else if (ch === '{') depth++;\n else if (ch === '}') { depth--; if (depth === 0) { end = i + 1; break; } }\n }\n }\n if (end < 0) return {};\n\n const cleaned = s.slice(start, end).trim();\n\n try {\n return JSON.parse(cleaned); // JSON mode expects an OBJECT\n } catch (e) {\n // As a last resort, return an empty object to keep the run alive\n return {};\n }\n})() }}\n", "options": {} }, "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [ -208, 1280 ], "id": "56387853-6b1b-41a3-ad23-a58bb666d7bc", "name": "Edit Fields1" }, { "parameters": { "promptType": "define", "text": "Give me a point wise output of what I can change and improve on my resume to do the same.\n\n\n* `job_description`: {{ $json.Description }}\n* `my_resume`: {{ $('Extract from File').item.json.text }}\n\n\njust give me points, nothing else, no fluff, the points should be super crisp and not verbose\n", "options": {} }, "type": "@n8n/n8n-nodes-langchain.agent", "typeVersion": 2.2, "position": [ 96, 1280 ], "id": "d7c3746b-e5c6-47b4-8233-1cf11e146d6a", "name": "AI Agent1" }, { "parameters": { "options": {} }, "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini", "typeVersion": 1, "position": [ 96, 1440 ], "id": "9bf012aa-5841-43cf-b553-f20cc5d018bb", "name": "Google Gemini Chat Model1", "credentials": { "googlePalmApi": { "id": "1dajL74vnyIjedLq", "name": "Google Gemini(PaLM) Api account" } } }, { "parameters": { "operation": "appendOrUpdate", "documentId": { "__rl": true, "value": "https://docs.google.com/spreadsheets/d/1LPkyHDw3pgmo7csvt8MBZU35F8PtrDWLmnvso6023HA/edit?usp=sharing", "mode": "url" }, "sheetName": { "__rl": true, "value": 1516914304, "mode": "list", "cachedResultName": "Result", "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1LPkyHDw3pgmo7csvt8MBZU35F8PtrDWLmnvso6023HA/edit#gid=1516914304" }, "columns": { "mappingMode": "defineBelow", "value": { "Title": "={{ $('Edit Fields1').item.json.job_analysis.title }}", "Company ": "={{ $('Edit Fields').item.json.Company }}", "Cover Letter": "={{ $('Edit Fields1').item.json.cover_letter }}", "output": "=", "Improvements": "", "Gaps And Suggestions": "={{ $('Edit Fields1').item.json.gaps_and_suggestions }}", "Score": "={{ $('Edit Fields1').item.json.score_explanation }}", "Locaton": "={{ $('Edit Fields').item.json.Location }}", "Link": "={{ $('Edit Fields').item.json['Apply Link'] }}", "Skills": "={{ $('Edit Fields1').item.json.job_analysis.must_have_skills }}" }, "matchingColumns": [ "Title" ], "schema": [ { "id": "Title", "displayName": "Title", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true, "removed": false }, { "id": "Company ", "displayName": "Company ", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true }, { "id": "Locaton", "displayName": "Locaton", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true }, { "id": "Link", "displayName": "Link", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true, "removed": false }, { "id": "Score", "displayName": "Score", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true }, { "id": "Cover Letter", "displayName": "Cover Letter", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true }, { "id": "Skills", "displayName": "Skills", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true }, { "id": "Improvements", "displayName": "Improvements", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true }, { "id": "Gaps And Suggestions", "displayName": "Gaps And Suggestions", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true, "removed": false }, { "id": "output", "displayName": "output", "required": false, "defaultMatch": false, "display": true, "type": "string", "canBeUsedToMatch": true } ], "attemptToConvertTypes": false, "convertFieldsToString": false }, "options": {} }, "type": "n8n-nodes-base.googleSheets", "typeVersion": 4.7, "position": [ 432, 1280 ], "id": "42554111-7542-4934-a477-93ec22fe2b5d", "name": "Append or update row in sheet1", "credentials": { "googleSheetsOAuth2Api": { "id": "zPmcMprcaFAMSeOe", "name": "Google Sheets account 2" } } }, { "parameters": { "sendTo": "blueeeeee04@gmail.com", "subject": "Job search results", "emailType": "text", "message": "Hey, your job search results with resume changes are ready in your sheet for today", "options": {} }, "type": "n8n-nodes-base.gmail", "typeVersion": 2.1, "position": [ 1344, 1424 ], "id": "4c37a6c2-d653-4c1c-8218-664adcd78170", "name": "Send a message", "webhookId": "f0d6158b-a72b-4e84-8f3e-0e8ecfaeda72", "credentials": { "gmailOAuth2": { "id": "4nokkpZKqOtXXGNr", "name": "Gmail account" } } }, { "parameters": { "rule": { "interval": [ { "field": "minutes", "minutesInterval": 2 } ] } }, "type": "n8n-nodes-base.scheduleTrigger", "typeVersion": 1.2, "position": [ -688, 624 ], "id": "890d5f11-4c67-4ed3-8469-6e6fa9dab403", "name": "Schedule Trigger" }, { "parameters": { "documentId": { "__rl": true, "value": "1LPkyHDw3pgmo7csvt8MBZU35F8PtrDWLmnvso6023HA", "mode": "id" }, "sheetName": { "__rl": true, "value": "Filter", "mode": "name" }, "options": {} }, "type": "n8n-nodes-base.googleSheets", "typeVersion": 4.7, "position": [ -16, 624 ], "id": "d24a30d8-33c0-4bce-8b25-87935cdef79d", "name": "Get row(s) in sheet", "credentials": { "googleSheetsOAuth2Api": { "id": "3t4NnRoHUaDBjUx3", "name": "Google Sheets account" } } }, { "parameters": { "assignments": { "assignments": [ { "id": "c2c04fd3-94bf-4113-935c-5ea795277c79", "name": "", "value": "", "type": "string" } ] }, "options": {} }, "type": "n8n-nodes-base.set", "typeVersion": 3.4, "position": [ 864, 944 ], "id": "2dadaab6-67c4-4ca5-bc27-154a8feed218", "name": "Edit Fields2" } ], "pinData": {}, "connections": { "Download file": { "main": [ [ { "node": "Extract from File", "type": "main", "index": 0 } ] ] }, "Extract from File": { "main": [ [ { "node": "Get row(s) in sheet", "type": "main", "index": 0 } ] ] }, "LinkedIn Search URL": { "main": [ [ { "node": "Fetch jobs from LinkedIn", "type": "main", "index": 0 } ] ] }, "Fetch jobs from LinkedIn": { "main": [ [ { "node": "HTML", "type": "main", "index": 0 } ] ] }, "HTML": { "main": [ [ { "node": "Split Out", "type": "main", "index": 0 } ] ] }, "Split Out": { "main": [ [ { "node": "Loop Over Items", "type": "main", "index": 0 } ] ] }, "Loop Over Items": { "main": [ [], [ { "node": "Wait", "type": "main", "index": 0 } ] ] }, "Wait": { "main": [ [ { "node": "HTTP Request", "type": "main", "index": 0 } ] ] }, "HTTP Request": { "main": [ [ { "node": "HTML1", "type": "main", "index": 0 } ] ] }, "HTML1": { "main": [ [ { "node": "Edit Fields", "type": "main", "index": 0 } ] ] }, "Edit Fields": { "main": [ [ { "node": "AI Agent", "type": "main", "index": 0 } ] ] }, "Google Gemini Chat Model": { "ai_languageModel": [ [ { "node": "AI Agent", "type": "ai_languageModel", "index": 0 } ] ] }, "AI Agent": { "main": [ [ { "node": "Edit Fields1", "type": "main", "index": 0 } ] ] }, "Edit Fields1": { "main": [ [ { "node": "AI Agent1", "type": "main", "index": 0 } ] ] }, "Google Gemini Chat Model1": { "ai_languageModel": [ [ { "node": "AI Agent1", "type": "ai_languageModel", "index": 0 } ] ] }, "AI Agent1": { "main": [ [ { "node": "Append or update row in sheet1", "type": "main", "index": 0 } ] ] }, "Append or update row in sheet1": { "main": [ [ { "node": "Loop Over Items", "type": "main", "index": 0 } ] ] }, "Schedule Trigger": { "main": [ [ { "node": "Download file", "type": "main", "index": 0 } ] ] }, "Get row(s) in sheet": { "main": [ [ { "node": "LinkedIn Search URL", "type": "main", "index": 0 } ] ] } }, "active": false, "settings": { "executionOrder": "v1", "callerPolicy": "workflowsFromSameOwner", "availableInMCP": false }, "versionId": "41f33cbf-3169-4831-8f54-46f2a48ba8ee", "meta": { "templateCredsSetupCompleted": true, "instanceId": "894fa226ec1a1b1b612fbf290e82ec532174a914550806a5bfa76028573ba128" }, "id": "nX3GGVNscPyF2fqA", "tags": [] }