{
  "id": "job-search-workflow",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Job-Search",
  "tags": [],
  "nodes": [
    {
      "id": "sticky-main-overview",
      "name": "Main Overview",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1360,
        -592
      ],
      "parameters": {
        "color": 6,
        "width": 683,
        "height": 1102,
        "content": "\n\n\n\n## HOW IT WORKS\nThis workflow automates the job search process by cross-referencing a candidate's resume with live job listings from the JSearch API (RapidAPI). It extracts the candidate's current role using Gemini, searches for similar roles, filters for new postings, and then uses Gemini to perform a detailed evaluation of each job's relevance. Matching jobs are automatically added to a Notion database.\n\n## HOW TO SET UP\n1. **Notion**: Connect your Notion account and select your Job Database. Ensure the database has the required properties \n     - Job ID\n     - Job Title\n     - Company\n     - Description\n     - Employment Type\n         - N/A\n         - Full-Time\n         - Part-Time\n     - Is Remote\n         - Yes\n         - No\n         - Hybrid\n     - Language\n     - Job Location\n     - Salary\n     - Joining Timeline\n     - Relevance Score\n     - Skill Match\n     - Summary\n     - Status\n         - Not Applied\n         - Applied\n     - URL\n     - Apply Options\n     - Posted On\n2. **RapidAPI**: Provide your RapidAPI key for the [JSearch API](https://rapidapi.com/letscrape-6zs-6zs-default/api/jsearch).\n3. **Google Gemini**: Supply your Google Gemini API credentials.\n4. **Local File**: Ensure the resume file path is correctly set in the 'Read Candidate Resume' node.\n\n## CUSTOMIZATION\n1. Modify the job search query in the 'Search for Jobs via RapidAPI' node.\n2. Adjust the relevance score threshold in the 'Evaluate Job Relevance' prompt if needed.\n3. Change the date filter range in 'Filter Recent Job Postings'."
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-section-1",
      "name": "Prerequisites & Resume",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -464,
        -512
      ],
      "parameters": {
        "color": 0,
        "width": 786,
        "height": 515,
        "content": "### 1. NOTION SETUP\nFetch the Notion Database and get all the existing Jobs from the database."
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-section-2",
      "name": "Job Discovery",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        432,
        -512
      ],
      "parameters": {
        "color": 0,
        "width": 1000,
        "height": 510,
        "content": "### 2. RESUME ANALYSIS\nAnalyse the Resume and Extract the relevant details for Job Search"
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-section-3",
      "name": "AI Evaluation & Storage",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2640,
        -512
      ],
      "parameters": {
        "color": 0,
        "width": 1471,
        "height": 733,
        "content": "### 3. EVALUATION & STORAGE\nFor each unique job, use AI to match against the resume and save the formatted result to Notion."
      },
      "typeVersion": 1
    },
    {
      "id": "62ff1cd1-08d9-490a-92cc-71bdfbd0f80f",
      "name": "Start Job Trigger",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1040,
        -816
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "c337df28-cd6e-4411-ad84-12b33356c957",
      "name": "Read Candidate Resume",
      "type": "n8n-nodes-base.readWriteFile",
      "position": [
        608,
        -384
      ],
      "parameters": {
        "options": {},
        "fileSelector": "/home/node/.n8n-files/User-Resume.pdf"
      },
      "typeVersion": 1.1
    },
    {
      "id": "7208b89a-301d-4bac-b73c-9a6e9f02977b",
      "name": "Extract Text from PDF",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        880,
        -384
      ],
      "parameters": {
        "options": {},
        "operation": "pdf"
      },
      "typeVersion": 1.1
    },
    {
      "id": "6176186e-ba18-4a2c-b679-995c457b0383",
      "name": "Search for Jobs via RapidAPI",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1680,
        -384
      ],
      "parameters": {
        "url": "https://jsearch.p.rapidapi.com/search",
        "options": {},
        "sendBody": true,
        "sendQuery": true,
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {}
          ]
        },
        "queryParameters": {
          "parameters": [
            {
              "name": "query",
              "value": "Machine Learning Engineer Germany"
            },
            {
              "name": "page",
              "value": "1"
            },
            {
              "name": "num_pages",
              "value": "10"
            },
            {
              "name": "country",
              "value": "de"
            },
            {
              "name": "date_posted",
              "value": "week"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "x-rapidapi-host",
              "value": "jsearch.p.rapidapi.com"
            },
            {
              "name": "x-rapidapi-key",
              "value": "REPLACE_WITH_YOUR_RAPIDAPI_KEY"
            }
          ]
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "7251f606-f074-4abb-8eb7-72cb748fcb1f",
      "name": "Parse Search Results",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        2208,
        -384
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "data"
      },
      "typeVersion": 1
    },
    {
      "id": "edb3facd-3438-48e9-a864-f7e682e3f021",
      "name": "Process Each Job Listing",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        2784,
        -416
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "7adb4ff6-245e-4a3a-a0a8-4e9e246aa48a",
      "name": "Evaluate Job Relevance",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        3152,
        -160
      ],
      "parameters": {
        "text": "=You are an expert technical recruiter. Compare the candidate's Resume with the Job Description provided below.\n\nCandidate Resume:\n{{ $('Extract Text from PDF').item.json.text }}\n\nJob Title: \n{{ $json.job_title }}\n\nJob Description:\n{{ $json.job_description }}\n\nTask:\nCalculate the following and output your answer in STRICT JSON format. ALso make sure all information is presented in English even if the original is in a different language:\n\nJob Id: {{ $json.job_id }}\n\nJob Title: {{ $json.job_title }}\n\nCompany: {{ $json.employer_name }}\n\nURL: {{ $json.job_apply_link }}\n\nApply Options: {{ $json.apply_options }}\n\nEmployment Type: {{ $json.job_employment_type }}\n\nJob Description: Create an outlook of the Job Description\n\nIs Remote: Check the possibility of the remote work. If not available, mark it as N/A \n\nLocation: Check all possible locations where this job is applicable. If not available, Mark it as N/A\n\nSalary: If available, mention it here either a direct value or as a range. If not, mark it as N/A\n\nRelevance Score: (1-100) based on seniority and industry match. 0 if Job Description is missing\n\nSkill Match Score: (1-100) based on specific tools mentioned in both. 0 if Job Description is missing or no skills match\n\nJoining Timeline: Check how urgent the joing for this position it like Immediate, as soon as possible, Jan 2026 and so on. If not available, mark it as N/A\n\nPosted On: {{ $json.job_posted_at_datetime_utc }}\n\nApply Options: Create a list of all apply options\n\nSummary: A 1-sentence explanation of why you gave this score.\" No Summary if Job Description is missing\n\nLanguage: Check the main language requirement with fluency level: Like German B1 or Englis. If not available mark as N/A\n\nStatus: Not Applied\n",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-3.1-flash-lite-preview",
          "cachedResultName": "models/gemini-3.1-flash-lite-preview"
        },
        "options": {},
        "resource": "document"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "de46bbd5-1477-4e5f-890f-8686ba24e162",
      "name": "Rate Limit API Requests",
      "type": "n8n-nodes-base.wait",
      "position": [
        2784,
        -160
      ],
      "parameters": {
        "amount": 15
      },
      "typeVersion": 1.1
    },
    {
      "id": "0e19495d-95f8-41e3-bd6c-35752031eb7c",
      "name": "Add Record to Notion Database",
      "type": "n8n-nodes-base.notion",
      "position": [
        3872,
        -160
      ],
      "parameters": {
        "title": "={{ $json[\"Job ID\"] }}",
        "simple": false,
        "options": {},
        "resource": "databasePage",
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "REPLACE_WITH_YOUR_NOTION_DATABASE_ID",
          "cachedResultName": "Job Database"
        },
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "Job Title|select",
              "selectValue": "={{ $json[\"Job Title\"] }}"
            },
            {
              "key": "Company|select",
              "selectValue": "={{ $json.Company }}"
            },
            {
              "key": "URL|url",
              "urlValue": "={{ $json.URL }}"
            },
            {
              "key": "Employment Type|select",
              "selectValue": "={{ $json[\"Employment Type\"] }}"
            },
            {
              "key": "Apply Options|multi_select",
              "multiSelectValue": "={{ $json['Apply Options'] }}"
            },
            {
              "key": "Is Remote|select",
              "selectValue": "={{ $json[\"Is Remote\"] }}"
            },
            {
              "key": "Job Location|rich_text",
              "textContent": "={{ $json.Location }}"
            },
            {
              "key": "Salary|rich_text",
              "textContent": "={{ $json.Salary }}"
            },
            {
              "key": "Relevance Score|number",
              "numberValue": "={{ $json[\"Relevance Score\"] }}"
            },
            {
              "key": "Skill Match|number",
              "numberValue": "={{ $json[\"Skill Match Score\"] }}"
            },
            {
              "key": "Joining Timeline|rich_text",
              "textContent": "={{ $json[\"Joining Timeline\"] }}"
            },
            {
              "key": "Summary|rich_text",
              "textContent": "={{ $json.Summary }}"
            },
            {
              "key": "Status|select",
              "selectValue": "={{ $json.Status }}"
            },
            {
              "key": "Description|rich_text",
              "textContent": "={{ $json['Job Description'] }}"
            },
            {
              "key": "Language|multi_select",
              "multiSelectValue": "={{ $json.Language }}"
            },
            {
              "key": "Posted On|date",
              "date": "={{ $json[\"Posted On\"] }}"
            }
          ]
        }
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "ae86fa9b-9ed6-460e-bc27-d12cbfdd03b8",
      "name": "Format Data for Notion",
      "type": "n8n-nodes-base.code",
      "position": [
        3504,
        -160
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// Logic unchanged but ready for generic input"
      },
      "typeVersion": 2
    },
    {
      "id": "e3bcb3c5-816d-41ad-bb53-2d07e13ddbe1",
      "name": "Extract Current Job Title",
      "type": "@n8n/n8n-nodes-langchain.googleGemini",
      "position": [
        1152,
        -384
      ],
      "parameters": {
        "text": "=Analyse the resume text: {{ $json.text }}.\n\nIdentify the user's current job title.\nOutput ONLY a single search string.",
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "models/gemini-3.1-flash-lite-preview",
          "cachedResultName": "models/gemini-3.1-flash-lite-preview"
        },
        "options": {},
        "resource": "document"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "c6bcb7ed-3755-4fea-9fd5-5f54cc722905",
      "name": "Fetch Notion Database Info",
      "type": "n8n-nodes-base.notion",
      "position": [
        -288,
        -384
      ],
      "parameters": {
        "resource": "database",
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "REPLACE_WITH_YOUR_NOTION_DATABASE_ID"
        }
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "2507281b-9e0b-4c3c-bc28-e51d91fe2769",
      "name": "Retrieve Existing Job Listings",
      "type": "n8n-nodes-base.notion",
      "position": [
        32,
        -384
      ],
      "parameters": {
        "options": {},
        "resource": "databasePage",
        "operation": "getAll",
        "returnAll": true,
        "databaseId": {
          "__rl": true,
          "mode": "list",
          "value": "REPLACE_WITH_YOUR_NOTION_DATABASE_ID",
          "cachedResultUrl": "https://www.notion.so/32ad581afa248025931ef0d11d4bdea8",
          "cachedResultName": "Job Database"
        }
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "fea7f85d-a43f-49fa-9e72-105f6e245eb5",
      "name": "Exclude Duplicate Applications",
      "type": "n8n-nodes-base.filter",
      "position": [
        3136,
        -400
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "9a89ee99-d29f-476e-90ff-598010930388",
              "operator": {
                "type": "string",
                "operation": "notContains"
              },
              "leftValue": "={{ $('Retrieve Existing Job Listings').item.json.property_job_id }}",
              "rightValue": "={{ $json.job_id }}"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "d670d5d9-9e44-400d-ae66-843650fb43bc",
      "name": "Filter Recent Job Postings",
      "type": "n8n-nodes-base.filter",
      "position": [
        1984,
        -384
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "e8007d62-8e64-4893-8654-0ddb33f7f414",
              "operator": {
                "type": "dateTime",
                "operation": "after"
              },
              "leftValue": "={{ $json.data[1].job_posted_at_datetime_utc }}",
              "rightValue": "={{ $now.minus({ days: 14 }).toISO() }}"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "sticky-setup-notion-db1-1777907876820662",
      "name": "Setup Notion DB1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -384,
        -416
      ],
      "parameters": {
        "color": "#C96464",
        "width": 280,
        "height": 360,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nUpdate your Notion Credentials and Database ID:\n1. Open this node.\n2. Select your Notion Credential.\n3. Enter your Database ID."
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-setup-resume-path-1777907876820105",
      "name": "Setup Resume Path",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        528,
        -400
      ],
      "parameters": {
        "color": "#C96464",
        "width": 256,
        "height": 344,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nUpdate the path for the Resume:\n1. Open this node.\n2. Update the path under File(s) Selector."
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-setup-google-ai-1-1777907876820658",
      "name": "Setup Google AI 1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3056,
        -192
      ],
      "parameters": {
        "color": "#C96464",
        "width": 288,
        "height": 376,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nUpdate your Google Credentials:\n1. In Google AI Studio, create your API Key.\n2. Open this node and update your Credentials."
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-setup-rapidapi-177790787682029",
      "name": "Setup RapidAPI",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1616,
        -400
      ],
      "parameters": {
        "color": "#C96464",
        "height": 344,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nUpdate your RapidAPI Key:\n1. Open this node.\n2. Update the Header parameter x-rapidapi-key."
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-setup-google-ai-2-1777907876820784",
      "name": "Setup Google AI 2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1072,
        -400
      ],
      "parameters": {
        "color": "#C96464",
        "width": 256,
        "height": 344,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nUpdate your Google Credentials:\n1. In Google AI Studio, create your API Key.\n2. Open this node and update your Credentials."
      },
      "typeVersion": 1
    },
    {
      "id": "sticky-setup-notion-db2-177790787682070",
      "name": "Setup Notion DB2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -64,
        -416
      ],
      "parameters": {
        "color": "#C96464",
        "width": 280,
        "height": 360,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nUpdate your Notion Credentials and Database ID:\n1. Open this node.\n2. Select your Notion Credential.\n3. Enter your Database ID."
      },
      "typeVersion": 1
    },
    {
      "id": "766fe1e2-22c9-405b-8c6a-2fa4880cfaa4",
      "name": "Job Discovery1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1536,
        -512
      ],
      "parameters": {
        "color": 0,
        "width": 856,
        "height": 510,
        "content": "### 3. DISCOVERY\nUsing the JSearch API, collect the relevant and latest Job Postings"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "shared": [
    {
      "role": "workflow:owner",
      "project": {
        "id": "gWkPS3Yo6L03U87I",
        "icon": null,
        "name": "Navneet Singh Arora <navneetsingh790@gmail.com>",
        "type": "personal",
        "createdAt": "2026-04-10T15:01:49.389Z",
        "creatorId": "fd932e6f-0271-41b5-9363-6f2454ac13dc",
        "updatedAt": "2026-04-10T15:07:46.566Z",
        "description": null
      },
      "createdAt": "2026-04-10T15:14:30.931Z",
      "projectId": "gWkPS3Yo6L03U87I",
      "updatedAt": "2026-04-10T15:14:30.931Z",
      "workflowId": "job-search-workflow"
    }
  ],
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "createdAt": "2026-04-10T15:14:30.931Z",
  "updatedAt": "2026-05-04T15:53:17.741Z",
  "versionId": "9d170b4f-1844-41a3-9e25-5d2126e71dcc",
  "isArchived": false,
  "staticData": null,
  "connections": {
    "Start Job Trigger": {
      "main": [
        [
          {
            "node": "Fetch Notion Database Info",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Search Results": {
      "main": [
        [
          {
            "node": "Process Each Job Listing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Text from PDF": {
      "main": [
        [
          {
            "node": "Extract Current Job Title",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read Candidate Resume": {
      "main": [
        [
          {
            "node": "Extract Text from PDF",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Evaluate Job Relevance": {
      "main": [
        [
          {
            "node": "Format Data for Notion",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Format Data for Notion": {
      "main": [
        [
          {
            "node": "Add Record to Notion Database",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Rate Limit API Requests": {
      "main": [
        [
          {
            "node": "Evaluate Job Relevance",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Each Job Listing": {
      "main": [
        [],
        [
          {
            "node": "Exclude Duplicate Applications",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Current Job Title": {
      "main": [
        [
          {
            "node": "Search for Jobs via RapidAPI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Notion Database Info": {
      "main": [
        [
          {
            "node": "Retrieve Existing Job Listings",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Recent Job Postings": {
      "main": [
        [
          {
            "node": "Parse Search Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search for Jobs via RapidAPI": {
      "main": [
        [
          {
            "node": "Filter Recent Job Postings",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add Record to Notion Database": {
      "main": [
        [
          {
            "node": "Process Each Job Listing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Exclude Duplicate Applications": {
      "main": [
        [
          {
            "node": "Rate Limit API Requests",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Retrieve Existing Job Listings": {
      "main": [
        [
          {
            "node": "Read Candidate Resume",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "description": "Automated job search and AI-powered relevance evaluation workflow with Notion integration.",
  "triggerCount": 0,
  "versionCounter": 162,
  "activeVersionId": null,
  "versionMetadata": {
    "name": null,
    "description": null
  }
}