{
  "version": "1.0.0",
  "exported_at": "2026-06-03T12:45:00.000Z",
  "project": {
    "name": "ðŸ Indeed Job Scraper by URL",
    "description": "Best-effort Indeed job-detail scraper equivalent to the Octoparse 'Indeed Job Scraper (by URL)'. It processes every URL in navigate.urls[] using a multi-URL loop and appends one row per input URL to indeed_job_scraper_by_url.csv. Accessible Indeed job pages are parsed from JobPosting JSON-LD and known Indeed DOM selectors. If Indeed shows Cloudflare/login verification, the template exports a diagnostic row for that URL instead of mislabeling the verification page as a job. A verified/persistent browser profile may be required for full job details.",
    "color": "bg-[#4589ff]",
    "template_id": "ai-generated"
  },
  "blocks": [
    {
      "block_id": "navigate-1",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to a URL",
      "position_x": 120,
      "position_y": 220,
      "config": {
        "urls": [
          "https://www.indeed.com/viewjob?jk=282cd08f13ff1c00",
          "https://www.indeed.com/viewjob?jk=4e2952b99b909b71"
        ],
        "color": "bg-[#4589ff]",
        "tags": [
          "indeed",
          "job-url-loop"
        ]
      }
    },
    {
      "block_id": "wait-for-page-load-1",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 456,
      "position_y": 220,
      "config": {
        "timeout": 45
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 792,
      "position_y": 220,
      "config": {
        "selector": "body",
        "timeout": 30,
        "visible": true
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1128,
      "position_y": 220,
      "config": {
        "duration": 3
      }
    },
    {
      "block_id": "text-contains-1",
      "block_type": "process",
      "title": "Text Contains",
      "description": "Check if page contains text",
      "position_x": 1464,
      "position_y": 220,
      "config": {
        "text": "Additional Verification Required",
        "selector": "body",
        "caseSensitive": false
      }
    },
    {
      "block_id": "inject-javascript-1",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Execute custom JavaScript",
      "position_x": 1464,
      "position_y": 520,
      "config": {
        "jsCode": "(function(){function clean(v){return (v==null?'':String(v)).replace(/\\s+/g,' ').trim();}function text(s){var e=document.querySelector(s);return clean(e&&(e.innerText||e.textContent));}function attr(s,a){var e=document.querySelector(s);return e?e.getAttribute(a)||'':'';}function abs(u){try{return u?new URL(u,location.href).href:'';}catch(e){return u||'';}}function jsonLdJob(){var scripts=[].slice.call(document.querySelectorAll('script[type=\"application/ld+json\"]'));for(var i=0;i<scripts.length;i++){try{var data=JSON.parse(scripts[i].textContent);var arr=Array.isArray(data)?data:[data];for(var j=0;j<arr.length;j++){var items=arr[j]['@graph']||[arr[j]];for(var k=0;k<items.length;k++){var t=items[k]['@type'];if(t==='JobPosting'||(Array.isArray(t)&&t.indexOf('JobPosting')>=0)){return items[k];}}}}catch(e){}}return {};}function htmlToText(h){var d=document.createElement('div');d.innerHTML=h||'';return clean(d.innerText||d.textContent);}function getInputUrl(){try{var u=new URL(location.href);return u.searchParams.get('continue')||location.href;}catch(e){return location.href;}}function getJobId(u){try{var x=new URL(u);return x.searchParams.get('jk')||'';}catch(e){var m=String(u).match(/[?&]jk=([^&]+)/);return m?m[1]:'';}}function getLocation(jp){var l=jp.jobLocation;if(Array.isArray(l)){l=l[0];}var a=l&&l.address;if(typeof a==='string'){return clean(a);}if(a){return clean([a.streetAddress,a.addressLocality,a.addressRegion,a.postalCode,a.addressCountry].filter(Boolean).join(', '));}return text('[data-testid=\"job-location\"], #jobLocationText, .jobsearch-JobInfoHeader-subtitle');}function getSalary(jp){var b=jp.baseSalary;if(b){var v=b.value||b;if(typeof v==='object'){var min=v.minValue||'';var max=v.maxValue||'';var val=v.value||'';var unit=v.unitText||b.unitText||'';return clean((val||(min&&max?min+' - '+max:min||max))+(unit?' '+unit:''));}}return text('#salaryInfoAndJobType, [data-testid=\"jobsearch-JobInfoHeader-salary\"], .jobsearch-JobMetadataHeader-item');}function getJobType(jp){var e=jp.employmentType;if(Array.isArray(e)){return clean(e.join(', '));}if(e){return clean(e);}var b=document.body?document.body.innerText:'';var types=['Full-time','Part-time','Contract','Temporary','Internship','Permanent','Remote'];return types.filter(function(t){return b.indexOf(t)>=0;}).join(', ');}function firstApplyLink(){var links=[].slice.call(document.querySelectorAll('a[href]'));for(var i=0;i<links.length;i++){var h=links[i].href||'';if(h.indexOf('/m/vaclk')>=0||h.indexOf('/apply')>=0||h.indexOf('indeedapply')>=0||h.indexOf('/rc/clk')>=0){return h;}}return '';}var jp=jsonLdJob();var inputUrl=getInputUrl();var jobId=getJobId(inputUrl);var org=jp.hiringOrganization||{};var bodyText=document.body?document.body.innerText:'';var ratingMatch=bodyText.match(/([0-5][.][0-9])\\s*(out of 5 stars|stars)?/i);var reviewsMatch=bodyText.match(/([0-9,]+) reviews/i);var companyName=org.name||text('[data-testid=\"inlineHeader-companyName\"], [data-company-name], .jobsearch-InlineCompanyRating, .jobsearch-CompanyInfoContainer a');var companyUrl=abs(org.sameAs||org.url||attr('a[href*=\"/cmp/\"]','href'));var description=jp.description?htmlToText(jp.description):text('#jobDescriptionText, [data-testid=\"jobDescriptionText\"], .jobsearch-jobDescriptionText');var expired=/expired|no longer accepting applications|not accepting applications/i.test(bodyText);var title=clean(jp.title||text('h1[data-testid=\"jobsearch-JobInfoHeader-title\"], h1.jobsearch-JobInfoHeader-title'));window.__USCRAPER_INDEED_JOB={Site:'https://www.indeed.com/',Search_Term:'',Search_Location:'',URL_Input:inputUrl,Total_Result:'',Job_Title:title,Job_ID:jobId,Job_URL:jobId?('https://www.indeed.com/viewjob?jk='+jobId):inputUrl,Job_Type:getJobType(jp),Salary:getSalary(jp),Location:getLocation(jp),Full_Description:description,Company_Name:clean(companyName),Company_URL:companyUrl,Company_Rating:ratingMatch?ratingMatch[1]:'',Company_Review_Count:reviewsMatch?reviewsMatch[1]:'',Posted_Date:clean(jp.datePosted||''),isExpired:expired?'True':'False',Valid_Through:clean(jp.validThrough||''),Apply_Link:firstApplyLink()};})();",
        "waitForCompletion": true,
        "timeout": 15
      }
    },
    {
      "block_id": "inject-javascript-2",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Execute custom JavaScript",
      "position_x": 1800,
      "position_y": 520,
      "config": {
        "jsCode": "(function(){function getInputUrl(){try{var u=new URL(location.href);return u.searchParams.get('continue')||location.href;}catch(e){return location.href;}}function getJobId(u){try{var x=new URL(u);return x.searchParams.get('jk')||'';}catch(e){var m=String(u).match(/[?&]jk=([^&]+)/);return m?m[1]:'';}}var inputUrl=getInputUrl();var jobId=getJobId(inputUrl);window.__USCRAPER_INDEED_JOB={Site:'https://www.indeed.com/',Search_Term:'',Search_Location:'',URL_Input:inputUrl,Total_Result:'',Job_Title:'',Job_ID:jobId,Job_URL:jobId?('https://www.indeed.com/viewjob?jk='+jobId):inputUrl,Job_Type:'',Salary:'',Location:'',Full_Description:'BLOCKED_BY_INDEED_VERIFICATION: Additional Verification Required / Cloudflare or login challenge was shown. Use a verified browser profile or resolve the challenge, then rerun.',Company_Name:'',Company_URL:'',Company_Rating:'',Company_Review_Count:'',Posted_Date:'',isExpired:'',Valid_Through:'',Apply_Link:''};})();",
        "waitForCompletion": true,
        "timeout": 10
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 2136,
      "position_y": 520,
      "config": {
        "rowSelector": "body",
        "fileName": "indeed_job_scraper_by_url.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "columns": [
          {
            "name": "Site",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Site'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Search_Term",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Search_Term'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Search_Location",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Search_Location'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "URL_Input",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['URL_Input'] || location.href",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Total_Result",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Total_Result'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Job_Title",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Job_Title'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Job_ID",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Job_ID'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Job_URL",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Job_URL'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Job_Type",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Job_Type'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Salary",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Salary'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Location",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Location'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Full_Description",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Full_Description'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Company_Name",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Company_Name'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Company_URL",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Company_URL'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Company_Rating",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Company_Rating'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Company_Review_Count",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Company_Review_Count'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Posted_Date",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Posted_Date'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "isExpired",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['isExpired'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Valid_Through",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Valid_Through'] || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Apply_Link",
            "selector": "window.__USCRAPER_INDEED_JOB && window.__USCRAPER_INDEED_JOB['Apply_Link'] || ''",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 2472,
      "position_y": 520,
      "config": {}
    }
  ],
  "connections": [
    {
      "from_block_id": "navigate-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-page-load-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-page-load-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-element-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-1",
      "from_connector_id": "right",
      "to_block_id": "sleep-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-1",
      "from_connector_id": "right",
      "to_block_id": "text-contains-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-1",
      "from_connector_id": "false",
      "to_block_id": "inject-javascript-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-1",
      "from_connector_id": "true",
      "to_block_id": "inject-javascript-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "inject-javascript-1",
      "from_connector_id": "right",
      "to_block_id": "structured-export-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "inject-javascript-2",
      "from_connector_id": "right",
      "to_block_id": "structured-export-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "structured-export-1",
      "from_connector_id": "right",
      "to_block_id": "loop-continue-1",
      "to_connector_id": "left"
    }
  ],
  "canvas_elements": [
    {
      "id": "group-load",
      "element_type": "group",
      "title": "Page Load",
      "color": "#08bdba",
      "position_x": 48,
      "position_y": 116,
      "width": 1328,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "wait-for-element-1",
          "sleep-1"
        ]
      }
    },
    {
      "id": "group-pagination",
      "element_type": "group",
      "title": "Pagination Loop",
      "color": "#ff832b",
      "position_x": 1392,
      "position_y": 116,
      "width": 1328,
      "height": 596,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "text-contains-1",
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "group-interaction",
      "element_type": "group",
      "title": "Interaction",
      "color": "#a56eff",
      "position_x": 1392,
      "position_y": 416,
      "width": 656,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "inject-javascript-1",
          "inject-javascript-2"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 2064,
      "position_y": 416,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Best-effort Indeed job-detail scraper equivalent to the Octoparse 'Indeed Job Scraper (by URL)'. It processes every URL in navigate.urls[] using a multi-URL loop and appends one row per input URL to indeed_job_scraper_by_url.csv. Accessible Indeed job pages are parsed from JobPosting JSON-LD and known Indeed DOM selectors. If Indeed shows Cloudflare/login verification, the template exports a diagnostic row for that URL instead of mislabeling the verification page as a job. A verified/persistent browser profile may be required for full job details.",
      "color": "#f1c21b",
      "position_x": 80,
      "position_y": 20,
      "width": 480,
      "height": 160,
      "z_index": 22,
      "data": {}
    },
    {
      "id": "note-block-text-contains-1",
      "element_type": "note",
      "title": "Note: Text Contains",
      "content": "Condition block: checks `body`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 1664,
      "position_y": 200,
      "width": 340,
      "height": 131,
      "z_index": 22,
      "data": {
        "block_id": "text-contains-1"
      }
    },
    {
      "id": "note-block-inject-javascript-1",
      "element_type": "note",
      "title": "Note: Inject JavaScript",
      "content": "Runs custom JavaScript in the page: `(function(){function clean(v){return (v==null?'':String(v)).replace(/\\s+/g,' ').trim();}function tex...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 1664,
      "position_y": 500,
      "width": 340,
      "height": 140,
      "z_index": 22,
      "data": {
        "block_id": "inject-javascript-1"
      }
    },
    {
      "id": "note-block-inject-javascript-2",
      "element_type": "note",
      "title": "Note: Inject JavaScript",
      "content": "Runs custom JavaScript in the page: `(function(){function getInputUrl(){try{var u=new URL(location.href);return u.searchParams.get('conti...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 2000,
      "position_y": 500,
      "width": 340,
      "height": 140,
      "z_index": 22,
      "data": {
        "block_id": "inject-javascript-2"
      }
    },
    {
      "id": "note-block-structured-export-1",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Structured export with JS columns (Site, Search_Term, Search_Location, URL_Input, Total_Result). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 2336,
      "position_y": 500,
      "width": 340,
      "height": 133,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-1"
      }
    },
    {
      "id": "note-block-loop-continue-1",
      "element_type": "note",
      "title": "Note: Loop Continue",
      "content": "Loop Continue advances a multi-URL or multi-text loop. Place at the end of the loop body with a clear back-edge to the loop start.",
      "color": "#ee5396",
      "position_x": 2672,
      "position_y": 500,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}