Skip to content

Instantly share code, notes, and snippets.

@piyush-eon
Last active July 8, 2026 21:38
Show Gist options
  • Select an option

  • Save piyush-eon/a8185be263a51ab2b59cd6e903547b11 to your computer and use it in GitHub Desktop.

Select an option

Save piyush-eon/a8185be263a51ab2b59cd6e903547b11 to your computer and use it in GitHub Desktop.
LinkedIn Job Search Bot: Match Resume with AI + Linkedin + Cover Letter & Telegram
{
"name": "LinkedIn Job Search: Auto-Match Resume with AI + Cover Letter & Telegram Alerts",
"nodes": [
{
"parameters": {
"fieldToSplitOut": "links",
"options": {}
},
"id": "bd8ca013-eefb-439e-b15b-48b5502ffa91",
"name": "Split Out",
"type": "n8n-nodes-base.splitOut",
"position": [
1872,
464
],
"typeVersion": 1
},
{
"parameters": {
"options": {}
},
"id": "22a12a7d-2ef7-47d2-8a01-50d1b24b3dc8",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
2048,
960
],
"typeVersion": 3
},
{
"parameters": {
"amount": 8
},
"id": "4f32bc04-34d5-48d3-b87b-eb6f9e5d655b",
"name": "Wait",
"type": "n8n-nodes-base.wait",
"position": [
432,
544
],
"webhookId": "c9cb4878-ae4d-4b8e-bd37-5395011f7761",
"typeVersion": 1.1
},
{
"parameters": {
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "loose"
},
"combinator": "and",
"conditions": [
{
"id": "1499f1ac-a7ae-4983-85c7-aa7b8445b2e2",
"operator": {
"type": "number",
"operation": "gte"
},
"leftValue": "={{ $json.score }}",
"rightValue": 50
}
]
},
"looseTypeValidation": true,
"options": {}
},
"id": "19bf5463-06a1-4d69-99b3-11d4e0b2c7b1",
"name": "Score Filter",
"type": "n8n-nodes-base.if",
"position": [
1424,
720
],
"typeVersion": 2.2
},
{
"parameters": {
"promptType": "define",
"text": "=You are an assistant that helps match candidates to job opportunities. Your task is to review my resume, then analyze both the resume and job description to calculate a job matching score. Additionally, create a cover letter based on my resume and the job description. The cover letter should contain at least 2 paragraphs and should exclude the name, address, and signature sections from the beginning and end.\nWhen using special characters like quotation marks (\"), ensure they are properly escaped with a backslash. The output must be formatted as valid JSON that can be parsed without errors.\n\nfor example your response should be like: {\"score\": 80, \"coverLetter\": \"sample cover letter\" }\n\njob_description: {{ $json.description }}\nmy_resume: {{ $('Extract from File').item.json.text }}",
"options": {}
},
"id": "dbe8693f-b1bb-4a90-81f8-74e547da6345",
"name": "AI Agent",
"type": "@n8n/n8n-nodes-langchain.agent",
"position": [
544,
800
],
"typeVersion": 2
},
{
"parameters": {
"operation": "pdf",
"options": {}
},
"id": "7facf548-a5ae-40f6-9733-30b7dd18f5c6",
"name": "Extract from File",
"type": "n8n-nodes-base.extractFromFile",
"position": [
880,
352
],
"typeVersion": 1
},
{
"parameters": {
"operation": "download",
"fileId": {
"__rl": true,
"value": "https://drive.google.com/file/d/idm/view?usp=sharing",
"mode": "url"
},
"options": {}
},
"id": "9ab899ad-6f37-446c-99bb-f7c92aae39e7",
"name": "Download file",
"type": "n8n-nodes-base.googleDrive",
"position": [
640,
352
],
"typeVersion": 3,
"credentials": {
"googleDriveOAuth2Api": {
"id": "fHtHixh4uhVJXW9P",
"name": "Google Drive account"
}
}
},
{
"parameters": {
"operation": "appendOrUpdate",
"documentId": {
"__rl": true,
"value": "1NIXFepATluy9oAG382CwGPEVzVQMU2TZuRW57E4blpM",
"mode": "list",
"cachedResultName": "Job Search",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/id/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": "gid=0",
"mode": "list",
"cachedResultName": "Result",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/id/edit#gid=0"
},
"columns": {
"mappingMode": "defineBelow",
"value": {
"Title": "={{ $('Modify Job Attributes').item.json.title }}",
"link": "={{ $('Modify Job Attributes').item.json.applyLink }}",
"Company": "={{ $('Modify Job Attributes').item.json.company }}",
"Location": "={{ $('Modify Job Attributes').item.json.location }}",
"description": "={{ $('Modify Job Attributes').item.json.description }}",
"score": "={{ $json.score }}",
"Cover Letter": "={{ $json.coverLetter }}"
},
"matchingColumns": [
"link"
],
"schema": [
{
"id": "Title",
"displayName": "Title",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Company",
"displayName": "Company",
"required": false,
"defaultMatch": false,
"display": true,
"type": "string",
"canBeUsedToMatch": true
},
{
"id": "Location",
"displayName": "Location",
"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": "description",
"displayName": "description",
"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
}
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {}
},
"id": "26acf7d7-717b-4993-a35f-b8f47bacb932",
"name": "Append or update row in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1152,
800
],
"typeVersion": 4.6,
"credentials": {
"googleSheetsOAuth2Api": {
"id": "lsYLUvp0pyKWjYDG",
"name": "Google Sheets account"
}
}
},
{
"parameters": {
"chatId": "",
"text": "=Title: {{ $('Modify Job Attributes').item.json.title }}\nCompany: {{ $('Modify Job Attributes').item.json.company }}\nLocation: {{ $('Modify Job Attributes').item.json.location }}\nJob Score: {{ $json.score }}\nApply: {{ $('Modify Job Attributes').item.json.applyLink }}\nCopy Cover Letter from here - https://docs.google.com/spreadsheets/d/1NIXFepATluy9oAG382CwGPEVzVQMU2TZuRW57E4blpM/edit?gid=0#gid=0",
"additionalFields": {
"appendAttribution": false
}
},
"id": "85b27871-88f5-4cc5-8884-a9fd8714bb16",
"name": "Send a text message",
"type": "n8n-nodes-base.telegram",
"position": [
1680,
592
],
"webhookId": "17b9ebe8-c8d4-4bd9-ad20-45842ddc2c00",
"typeVersion": 1.2,
"credentials": {
"telegramApi": {
"id": "l10Icfr2AAUb07ES",
"name": "Telegram account"
}
}
},
{
"parameters": {
"documentId": {
"__rl": true,
"value": "1NIXFepATluy9oAG382CwGPEVzVQMU2TZuRW57E4blpM",
"mode": "list",
"cachedResultName": "Job Search",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/id/edit?usp=drivesdk"
},
"sheetName": {
"__rl": true,
"value": 1038962310,
"mode": "list",
"cachedResultName": "Filter",
"cachedResultUrl": "https://docs.google.com/spreadsheets/d/id/edit#gid=1038962310"
},
"options": {}
},
"id": "04ae55dc-2c78-4bef-b76b-a6abe0d2b287",
"name": "Get row(s) in sheet",
"type": "n8n-nodes-base.googleSheets",
"position": [
1104,
352
],
"typeVersion": 4.6,
"credentials": {
"googleSheetsOAuth2Api": {
"id": "lsYLUvp0pyKWjYDG",
"name": "Google Sheets account"
}
}
},
{
"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 jobType = $input.first().json['Job Type']\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 // we have experienceLevel as a string with values like \"Internship, Entry level\"\n // we transform it to \"1,2,3\" where:\n // Internship -> 1\n // Entry level -> 2\n // Associate -> 3\n // Mid-Senior level -> 4\n // Director -> 5\n // Executive -> 6\n const transformedExperiences = experienceLevel\n .split(\",\")\n .map((exp) => {\n switch (exp.trim()) {\n case \"Internship\":\n return \"1\";\n case \"Entry level\":\n return \"2\";\n case \"Associate\":\n return \"3\";\n case \"Mid-Senior level\":\n return \"4\";\n case \"Director\":\n return \"5\";\n case \"Executive\":\n return \"6\";\n default:\n return \"\";\n }\n })\n .filter(Boolean); // filter out any empty strings\n url += `&f_E=${transformedExperiences.join(\",\")}`;\n}\n\nif (remote.length != \"\") {\n // we have location as a string with values like \"Remote, Hybrid\"\n // we transform it to \"2,3,1\" where:\n // On-Site -> 1\n // Remote -> 2\n // Hybrid -> 3\n const transformedRemote = remote\n .split(\",\")\n .map((e) => {\n switch (e.trim()) {\n case \"Remote\":\n return \"2\";\n case \"Hybrid\":\n return \"3\";\n case \"On-Site\":\n return \"1\";\n default:\n return \"\";\n }\n })\n .filter(Boolean); // filter out any empty strings\n url += `&f_WT=${transformedRemote.join(\",\")}`;\n}\n\nif (jobType != \"\") {\n // we have jobType as a string with values like \"Full-time, Part-time\"\n // we transform it to \"F,P\" where:\n // Full-time -> F\n // Part-time -> P\n // Contract -> C\n // Temporary -> T\n // Other -> O\n // Internship -> I\n const transformedJobType = jobType.split(\",\").map((type) => type.trim().charAt(0).toUpperCase());\n url += `&f_JT=${transformedJobType.join(\",\")}`;\n}\n\nif (easyApply != \"\") {\n url += \"&f_EA=true\";\n}\n\nreturn {url}"
},
"id": "8e9679f9-f523-4ae5-933a-50f4e085f9d1",
"name": "Create search URL",
"type": "n8n-nodes-base.code",
"position": [
1296,
352
],
"typeVersion": 2
},
{
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 17
}
]
}
},
"id": "a1261369-4939-44a5-908f-1f79cf05d275",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
432,
352
],
"notesInFlow": false,
"typeVersion": 1.2
},
{
"parameters": {
"url": "={{ $json.url }}",
"options": {}
},
"id": "13197864-2918-4e55-8991-8861ad723455",
"name": "Fetch Jobs from Linkedin",
"type": "n8n-nodes-base.httpRequest",
"position": [
1504,
352
],
"typeVersion": 4.2
},
{
"parameters": {
"url": "={{ $json.links }}",
"options": {}
},
"id": "df5815da-e55c-494e-919c-07b93ec4b9fa",
"name": "Fetch Job Page",
"type": "n8n-nodes-base.httpRequest",
"position": [
624,
544
],
"executeOnce": false,
"retryOnFail": true,
"typeVersion": 4.2,
"waitBetweenTries": 5000,
"onError": "continueRegularOutput"
},
{
"parameters": {
"mode": "raw",
"jsonOutput": "={{ $json.output.replaceAll(/```(?:json)?/g, \"\") }}\n",
"includeOtherFields": true,
"options": {}
},
"id": "9838b440-d3ad-4665-b47b-d04e4d2cb928",
"name": "Parse AI Output",
"type": "n8n-nodes-base.set",
"position": [
912,
800
],
"typeVersion": 3.4
},
{
"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": "jobid",
"cssSelector": "a[data-item-type='semaphore']",
"returnValue": "attribute",
"attribute": "data-semaphore-content-urn"
}
]
},
"options": {}
},
"id": "a4d125b1-8d0c-4927-9470-33ab24b6706b",
"name": "Parse Job Attributes",
"type": "n8n-nodes-base.html",
"position": [
832,
544
],
"typeVersion": 1.2
},
{
"parameters": {
"assignments": {
"assignments": [
{
"id": "784ead57-9d83-4e08-b83c-23fa165bf045",
"name": "description",
"type": "string",
"value": "={{ $json.description.replaceAll(/\\s+/g, \" \") }}"
},
{
"id": "fd3c9d2c-5ff9-46a7-b70a-f990fbc7da9d",
"name": "jobid",
"type": "string",
"value": "={{ $json.jobid.split(\":\").last() }}"
},
{
"id": "27a20cd2-ab0d-42b7-9cee-ea64e0e26ea3",
"name": "applyLink",
"type": "string",
"value": "={{ \"https://www.linkedin.com/jobs/view/\"+ $json.jobid.split(\":\").last() }} "
}
]
},
"includeOtherFields": true,
"options": {}
},
"id": "ba71d7c3-a89a-447d-aba6-7a0fdfda19dc",
"name": "Modify Job Attributes",
"type": "n8n-nodes-base.set",
"position": [
1056,
544
],
"typeVersion": 3.4
},
{
"parameters": {
"operation": "extractHtmlContent",
"extractionValues": {
"values": [
{
"key": "links",
"cssSelector": "ul.jobs-search__results-list li div a[class*=\"base-card\"]",
"returnValue": "attribute",
"attribute": "href",
"returnArray": true
}
]
},
"options": {}
},
"id": "af4831f6-f9fa-4d68-aee1-d0ba38d8a46c",
"name": "Extract Job Links",
"type": "n8n-nodes-base.html",
"position": [
1696,
352
],
"typeVersion": 1.2
},
{
"parameters": {
"options": {}
},
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"typeVersion": 1,
"position": [
544,
992
],
"id": "67b632b9-a3dc-484d-80ee-8c39d2fb7dad",
"name": "Google Gemini Chat Model",
"credentials": {
"googlePalmApi": {
"id": "x9KxMiXwHhnmPlWr",
"name": "Google Gemini(PaLM) Api account 2"
}
}
}
],
"pinData": {},
"connections": {
"Wait": {
"main": [
[
{
"node": "Fetch Job Page",
"type": "main",
"index": 0
}
]
]
},
"AI Agent": {
"main": [
[
{
"node": "Parse AI Output",
"type": "main",
"index": 0
}
]
]
},
"Split Out": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Score Filter": {
"main": [
[
{
"node": "Send a text message",
"type": "main",
"index": 0
}
],
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Download file": {
"main": [
[
{
"node": "Extract from File",
"type": "main",
"index": 0
}
]
]
},
"Fetch Job Page": {
"main": [
[
{
"node": "Parse Job Attributes",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "Wait",
"type": "main",
"index": 0
}
]
]
},
"Parse AI Output": {
"main": [
[
{
"node": "Append or update row in sheet",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Download file",
"type": "main",
"index": 0
}
]
]
},
"Create search URL": {
"main": [
[
{
"node": "Fetch Jobs from Linkedin",
"type": "main",
"index": 0
}
]
]
},
"Extract Job Links": {
"main": [
[
{
"node": "Split Out",
"type": "main",
"index": 0
}
]
]
},
"Extract from File": {
"main": [
[
{
"node": "Get row(s) in sheet",
"type": "main",
"index": 0
}
]
]
},
"Get row(s) in sheet": {
"main": [
[
{
"node": "Create search URL",
"type": "main",
"index": 0
}
]
]
},
"Send a text message": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Parse Job Attributes": {
"main": [
[
{
"node": "Modify Job Attributes",
"type": "main",
"index": 0
}
]
]
},
"Modify Job Attributes": {
"main": [
[
{
"node": "AI Agent",
"type": "main",
"index": 0
}
]
]
},
"Fetch Jobs from Linkedin": {
"main": [
[
{
"node": "Extract Job Links",
"type": "main",
"index": 0
}
]
]
},
"Append or update row in sheet": {
"main": [
[
{
"node": "Score Filter",
"type": "main",
"index": 0
}
]
]
},
"Google Gemini Chat Model": {
"ai_languageModel": [
[
{
"node": "AI Agent",
"type": "ai_languageModel",
"index": 0
}
]
]
}
},
"active": false,
"settings": {},
"versionId": "d9293405-2022-4e6f-947b-39a1d4a394f1",
"meta": {
"templateId": "6239",
"templateCredsSetupCompleted": true,
"instanceId": "4bfa82ea3bc2ad7921262becc7c6a7c71bbde1b9208620b36002dcfaa5e53ff4"
},
"id": "vK2bIUnLejOuNwk0",
"tags": []
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment