{
  "id": "potYDGdhPXDUMhZj",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Indeed Job Matching to Telegram with BrowserAct, Gemini & Telegram",
  "tags": [],
  "nodes": [
    {
      "id": "7ef43820-825a-4e94-a9f2-483376e79768",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1376,
        96
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "26c1fd7c-423c-4b36-984b-f4603ea4f1b9",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueRegularOutput",
      "position": [
        -1152,
        96
      ],
      "parameters": {
        "url": "https://api.browseract.com/v2/workflow/run-task",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "workflow_id",
              "value": "52804638608646754"
            }
          ]
        },
        "genericAuthType": "httpBearerAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 4.2,
      "alwaysOutputData": true
    },
    {
      "id": "3d4b822a-435b-4894-8b39-ca10e4d0140d",
      "name": "HTTP Request1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -672,
        80
      ],
      "parameters": {
        "url": "https://api.browseract.com/v2/workflow/get-task",
        "options": {},
        "sendQuery": true,
        "authentication": "genericCredentialType",
        "genericAuthType": "httpBearerAuth",
        "queryParameters": {
          "parameters": [
            {
              "name": "=task_id",
              "value": "={{ $json.id }}"
            }
          ]
        }
      },
      "credentials": {
        "httpBearerAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "5550b6de-13b4-4cde-841f-b346cde3f8fe",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        -416,
        352
      ],
      "parameters": {
        "unit": "minutes",
        "amount": 2
      },
      "typeVersion": 1.1
    },
    {
      "id": "70406173-a3d9-4db7-a370-c9bb997800c1",
      "name": "Wait1",
      "type": "n8n-nodes-base.wait",
      "position": [
        -960,
        352
      ],
      "parameters": {
        "unit": "minutes",
        "amount": 1
      },
      "typeVersion": 1.1
    },
    {
      "id": "295fedba-bc49-451a-8b9c-b0dda75e5b51",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        -960,
        96
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "d48ae258-78a0-4b26-923d-2643b6b774c6",
              "operator": {
                "type": "object",
                "operation": "notExists",
                "singleValue": true
              },
              "leftValue": "={{ $json.error }}",
              "rightValue": ""
            },
            {
              "id": "3967a169-8432-45bd-8f89-08795fd12679",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json.id }}",
              "rightValue": "null"
            }
          ]
        }
      },
      "retryOnFail": false,
      "typeVersion": 2.2
    },
    {
      "id": "da4a5db4-a2f2-40e7-ae6a-3f46e820fbf3",
      "name": "If1",
      "type": "n8n-nodes-base.if",
      "position": [
        -400,
        80
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "0347a2a2-eb32-414d-9494-4e648078cf40",
              "operator": {
                "type": "object",
                "operation": "notExists",
                "singleValue": true
              },
              "leftValue": "={{ $json.error }}",
              "rightValue": ""
            },
            {
              "id": "99f31959-6f27-40dd-97c3-6ff611da1e0b",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "finished"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "8fc50c6f-8501-49ce-b697-04fa9210ef2a",
      "name": "Send a text message",
      "type": "n8n-nodes-base.telegram",
      "position": [
        32,
        432
      ],
      "parameters": {
        "text": "=Title: {{ $json.text.Title }}\nSummary :{{ $json.text.Summary }}\nNeeds: {{ $json.text.Needs }}\nEducarion: {{ $json.text.Education }}\n{{ $json.text.Link }}",
        "chatId": "@Test",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "7fa00942-1d87-44a9-8618-b0d7a4546bb2",
      "name": "Code in JavaScript",
      "type": "n8n-nodes-base.code",
      "position": [
        -144,
        432
      ],
      "parameters": {
        "jsCode": "// Get the original list from the 'Request' key in the incoming data.\nconst originalList =$input.first().json.output.Request ;\n\n// Create a new array to store the formatted output.\nconst outputItems = [];\n\n// Loop through each item in the original list.\nfor (const item of originalList) {\n  // For each item, create a new object in the desired format.\n  outputItems.push({\n    json: {\n      \"text\": item\n    }\n  });\n}\n\n// Return the new list of formatted objects.\nreturn outputItems;"
      },
      "typeVersion": 2
    },
    {
      "id": "5f67b9c3-845f-451b-a314-3ecfbe06d4ef",
      "name": "AI Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -144,
        64
      ],
      "parameters": {
        "text": "=hello this is my resume \n\n\"\nAge: 30\nExperience: 15 years in programming\nSenior Software Engineer\nEducation: Bachlore in Front-end and Back-end Software engineering \nGender: male\nabilities :Product development, innovation in Human Risk Management.\nSeeking a programming job in financial advising can work remot.\n\"\n\nfrom the  {{ $json.output.string }} add all the job offers which matches my resume to output the output structure is List of texts that looks like this\n\nformat_final_json_response = {\n  \"Request\": [\n    {\n      \"Title\": \"Title\",\n      \"Summary\": \"About\",\n      \"Needs\": \"Needs\",\n      \"Education\": \"degree\",\n      \"Link\": \"Link\"\n    }\n  ]\n}\n\nRemove duplicated offers (if company name and job title is same)\n\n\nfollow the Output exacly and also if no job is avalble add this sned this to output\n\n{\n  \"Request\": [\n    {\n      \"Title\": \"No job Found\",\n      \"Summary\": \"No luck today\",\n      \"Needs\": \"No luck today\",\n      \"Education\": \"No luck today\",\n      \"Link\": \"im so sry to say that no job is aviable for you\"\n    }\n  ]\n}",
        "options": {},
        "promptType": "define",
        "needsFallback": true,
        "hasOutputParser": true
      },
      "typeVersion": 2.2,
      "alwaysOutputData": false
    },
    {
      "id": "4aa9cc49-cc7b-46b0-aa75-04c21be931ac",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        144,
        288
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"Request\": [\n    {\n      \"Title\": \"Title\",\n      \"Summary\": \"About\",\n      \"Needs\": \"Needs\",\n      \"Education\": \"degree\",\n      \"Link\": \"Link\"\n    }\n  ]\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "7996bea7-6736-4a77-8fb8-a4f7fdfa9618",
      "name": "Sticky Note-Intro",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2000,
        -112
      ],
      "parameters": {
        "width": 592,
        "height": 424,
        "content": "## Try It Out!\n### This n8n template helps you stay on top of the job market by matching scraped job offers with your resume using an AI Agent.\n\n### How it works\n* The workflow is triggered manually You Can make it Automatic too.\n* An **HTTP Request** node starts a web scraping task with the **BrowserAct** API to collect job offers.\n* A series of **If** and **Wait** nodes monitor the scraping job until it's finished.\n* An **AI Agent** node, powered by **Google Gemini**, processes the job listings and filters them to find matches for your resume. It's configured to output the results in a specific format.\n* A **Code** node then transforms the AI's output into a clean format.\n* Finally, the filtered job offers are sent directly to you via **Telegram**.\n\n### Requirements\n* **BrowserAct** API account for web scraping\n* **Gemini** account for the AI Agent\n* **BrowserAct** **\u201cJob Market Intelligence\u201d** Template\n* **Telegram** credentials for sending messages\n\n### Need Help?\nJoin the [Discord](https://discord.com/invite/UpnCKd7GaU) or Visit Our [Blog](https://www.browseract.com/blog)!\n"
      },
      "typeVersion": 1
    },
    {
      "id": "647dc8d1-a1f3-436c-bf7e-8d516d183f61",
      "name": "Sticky Note-Wait",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -736,
        -112
      ],
      "parameters": {
        "color": 5,
        "width": 496,
        "height": 180,
        "content": "## 2. Wait for Scraping to Finish\n\nThese nodes check the status of the scraping task. The `If` node determines if the task is complete. If it's still running, the `Wait` node pauses the workflow for a set period before retrying to check the status."
      },
      "typeVersion": 1
    },
    {
      "id": "42f4cafd-5070-4793-bca9-7e4590a88dd2",
      "name": "Sticky Note-AI",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -208,
        -112
      ],
      "parameters": {
        "color": 4,
        "width": 512,
        "content": "## 3. Use an AI Agent to Find Matching Jobs\n\nThis node uses an AI Agent to find the best job offers for you. It takes the scraped data and your resume, then processes them to find matching jobs. It's configured with a **Structured Output Parser** to ensure the results are always in the correct format.\n\n### Don't forget to Connect your Gemini and Change your resume. "
      },
      "typeVersion": 1
    },
    {
      "id": "6c541147-4d4c-464c-87c5-b55e1333ce06",
      "name": "Sticky Note-Notifications",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -208,
        576
      ],
      "parameters": {
        "color": 3,
        "width": 512,
        "height": 164,
        "content": "## 4. Send Notifications\n\nThe scraped data is sometimes hard to read. A **Code** node is used here to transform the AI's output into a more readable format. The **Telegram** node then sends the final, filtered job offers directly to you.\n\n### Don't forget to Connect your Telegram and add your Channel ID. "
      },
      "typeVersion": 1
    },
    {
      "id": "f4331db0-9b93-416f-9137-0672798a4cc0",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1248,
        80
      ],
      "parameters": {
        "color": 5,
        "width": 480,
        "height": 480,
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "7eca99df-860c-409f-bdfb-50150543e302",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -736,
        80
      ],
      "parameters": {
        "color": 5,
        "width": 496,
        "height": 480,
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "0edbea28-d451-4a41-8adb-4fd2ea485749",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -208,
        64
      ],
      "parameters": {
        "color": 4,
        "width": 512,
        "height": 336,
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "b257da41-e8ba-44a0-9aed-bd7479f7019e",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -208,
        416
      ],
      "parameters": {
        "color": 3,
        "width": 512,
        "height": 144,
        "content": ""
      },
      "typeVersion": 1
    },
    {
      "id": "57e7a01d-500e-4a54-a32a-88dfdceafb80",
      "name": "Sticky Note-How to Use",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2000,
        320
      ],
      "parameters": {
        "width": 592,
        "height": 216,
        "content": "## How to use\n\n1.  **Set up Credentials:** Add your credentials for **BrowserAct**, **Google Gemini**, and **Telegram** to the workflow. They will be used by the relevant nodes.\n2.  **Set up BrowserAct:** In your **BrowserAct** account, Use **Job Market Intelligence** Template and setup your own template.\n3.  **Add WorkFlow ID:** change the **workflow_id** value inside the **Run WorkFlow** node.\n4.  **Activate Workflow:** To enable the automated schedule, simply activate the workflow. You can also manually trigger it by clicking the 'Execute Workflow' button to test it."
      },
      "typeVersion": 1
    },
    {
      "id": "d2e3a14c-401d-4abd-98c7-7eb4213c277e",
      "name": "Sticky Note-How to Use1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2000,
        544
      ],
      "parameters": {
        "width": 592,
        "height": 104,
        "content": "## Need Help ?\n*  [How to Find Your BrowseAct API Key & Workflow ID](https://www.youtube.com/watch?v=pDjoZWEsZlE)\n* [How to Connect n8n to Browseract](https://www.youtube.com/watch?v=RoYMdJaRdcQ)\n* [How to Use & Customize BrowserAct Templates](https://www.youtube.com/watch?v=CPZHFUASncY)\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "adf794f6-842f-43d0-bc6f-fcaada21bd28",
      "name": "Sticky Note-How to Use2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1952,
        -384
      ],
      "parameters": {
        "color": 7,
        "width": 2208,
        "height": 112,
        "content": "\n### ******** \n##   Create BrowserAct Workflow -> Add BrowserAct Token to \"Run Node\" -> Change BrowserAct workflow_id in \"Run Node\" -> Connect Gemini & Change you **resume** inside the prompt in \"Agent Node\" \n##  -> Config Telegram Token & Channel ID in \"Send Node\""
      },
      "typeVersion": 1
    },
    {
      "id": "8b7e2e56-cad5-47a2-9723-e4395e733332",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1104,
        -208
      ],
      "parameters": {
        "color": 5,
        "width": 182,
        "height": 80,
        "content": "## \n# Run Node"
      },
      "typeVersion": 1
    },
    {
      "id": "ea4b3404-9c9e-4823-be35-272afd16c061",
      "name": "Sticky Note-Scraping",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1248,
        -112
      ],
      "parameters": {
        "color": 5,
        "width": 480,
        "height": 180,
        "content": "## 1. Trigger the Job Scraper\n\nThis workflow uses an HTTP Request to start a job scraping task via the BrowserAct API. This allows you to collect up-to-date job market data.\n\n### Don't forget to add your BrowserAct Workflow ID. "
      },
      "typeVersion": 1
    },
    {
      "id": "1a24b054-be51-4a4d-9739-19d1f63acdc2",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -592,
        -208
      ],
      "parameters": {
        "color": 5,
        "width": 182,
        "height": 80,
        "content": "## \n# Get Node"
      },
      "typeVersion": 1
    },
    {
      "id": "537e59bb-3129-4bf6-9eaa-67d0ba38d118",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -64,
        -208
      ],
      "parameters": {
        "color": 4,
        "width": 230,
        "height": 80,
        "content": "## \n# Agent Node"
      },
      "typeVersion": 1
    },
    {
      "id": "b83141c8-1966-4bd0-aa14-871f44a9e42d",
      "name": "Gemini Backup",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        -16,
        288
      ],
      "parameters": {
        "options": {},
        "modelName": "models/gemini-2.0-flash"
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "da5033b2-0eca-4411-8b79-01742fff27e0",
      "name": "Gemini",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        -144,
        288
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "39563737-09ba-44bf-9ca5-1f072d96daf1",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        752
      ],
      "parameters": {
        "color": 3,
        "width": 214,
        "height": 80,
        "content": "## \n# Send Node"
      },
      "typeVersion": 1
    },
    {
      "id": "0bc096fe-fa91-4326-873c-d594cbe63b2e",
      "name": "Sticky Note-How to Use3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2000,
        656
      ],
      "parameters": {
        "width": 592,
        "height": 80,
        "content": "## Watch Workflow Guidance and Showcase\n* #### [Never Manually Search for a Job Again (AI Automation Tutorial)](https://youtu.be/mRJw8Jyrizg)"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "b4d6b1aa-9052-4a52-8b0b-2d868cf88a37",
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "HTTP Request1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If1": {
      "main": [
        [
          {
            "node": "AI Agent",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "HTTP Request1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait1": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gemini": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent": {
      "main": [
        [
          {
            "node": "Code in JavaScript",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gemini Backup": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent",
            "type": "ai_languageModel",
            "index": 1
          }
        ]
      ]
    },
    "HTTP Request1": {
      "main": [
        [
          {
            "node": "If1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code in JavaScript": {
      "main": [
        [
          {
            "node": "Send a text message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "HTTP Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}