{
  "version": "1.0.0",
  "exported_at": "2026-05-31T00:00:00.000Z",
  "project": {
    "name": "ðŸ LinkedIn Job Scraper No Login Required",
    "description": "Best-effort LinkedIn public job scraper equivalent to the Octoparse LinkedIn Job Scraper. Uses LinkedIn's public guest jobs HTML endpoint with predictable start offsets to collect public job cards without login, appending each available batch to linkedin-job-search-scraper-by-url.csv. The workflow stops cleanly if LinkedIn returns an authwall or an empty batch. Extracts public listing fields: title, company, company URL, job URL, location, posting date, listing benefits/badges, logo, job ID, and best-effort Octoparse-compatible columns. Full descriptions, application counts, salaries, poster data, and some job metadata may be blank because LinkedIn often hides them from public listing-card HTML or requires detail/API/login access.",
    "color": "bg-[#0a66c2]",
    "template_id": "ai-generated-linkedin-jobs-public-guest-api"
  },
  "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.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=0",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=25",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=50",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=75",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=100",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=125",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=150",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=175",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=200",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=225",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=250",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=275",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=300",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=325",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=350",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=375",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=400",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=425",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=450",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=475",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=500",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=525",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=550",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=575",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=600",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=625",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=650",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=675",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=700",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=725",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=750",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=775",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=800",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=825",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=850",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=875",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=900",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=925",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=950",
          "https://www.linkedin.com/jobs-guest/jobs/api/seeMoreJobPostings/search?keywords=Senior%20Digital%20Designer&location=United%20States&start=975"
        ],
        "color": "bg-[#4589ff]"
      }
    },
    {
      "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": 30,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 792,
      "position_y": 220,
      "config": {
        "duration": 1,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "element-exists-1",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 1128,
      "position_y": 220,
      "config": {
        "selector": ".job-search-card",
        "color": "bg-[#ff832b]"
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 1464,
      "position_y": 520,
      "config": {
        "rowSelector": ".job-search-card",
        "fileName": "linkedin-job-search-scraper-by-url.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "applications_count",
            "selector": "(() => { const txt = ROW.innerText || ''; const m = txt.match(/(\\d+[+,]?\\d*\\+?)\\s+applicants?/i); return m ? m[0] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "apply_type",
            "selector": "(() => /easy apply/i.test(ROW.innerText || '') ? 'EASY_APPLY' : '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "apply_url",
            "selector": "(() => ROW.querySelector('a.base-card__full-link')?.href || ROW.querySelector('a[href*=\"/jobs/view/\"]')?.href || '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "benefits",
            "selector": "(() => ROW.querySelector('.job-posting-benefits__text')?.innerText.trim() || '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "company_id",
            "selector": "(() => { const href = ROW.querySelector('.base-search-card__subtitle a, a.hidden-nested-link')?.href || ''; try { const parts = new URL(href).pathname.split('/').filter(Boolean); return parts[1] || parts[0] || ''; } catch(e) { return ''; } })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "company_name",
            "selector": "(() => ROW.querySelector('.base-search-card__subtitle a, .base-search-card__subtitle, a.hidden-nested-link')?.innerText.trim() || '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "company_url",
            "selector": "(() => ROW.querySelector('.base-search-card__subtitle a, a.hidden-nested-link')?.href || '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "company_logo_url",
            "selector": "(() => ROW.querySelector('img.artdeco-entity-image, img')?.src || '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "contract_type",
            "selector": "(() => '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "description",
            "selector": "(() => '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "description_html",
            "selector": "(() => '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "experience_level",
            "selector": "(() => '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "id",
            "selector": "(() => { const urn = ROW.getAttribute('data-entity-urn') || ''; const m = urn.match(/jobPosting:(\\d+)/); if (m) return m[1]; const href = ROW.querySelector('a.base-card__full-link, a[href*=\"/jobs/view/\"]')?.href || ''; const m2 = href.match(/-(\\d+)(?:\\?|$)/); return m2 ? m2[1] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "job_url",
            "selector": "(() => ROW.querySelector('a.base-card__full-link')?.href || ROW.querySelector('a[href*=\"/jobs/view/\"]')?.href || '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "location",
            "selector": "(() => ROW.querySelector('.job-search-card__location')?.innerText.trim() || '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "poster_full_name",
            "selector": "(() => '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "poster_profile_url",
            "selector": "(() => '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "published_at",
            "selector": "(() => ROW.querySelector('time')?.getAttribute('datetime') || '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "published_relative",
            "selector": "(() => ROW.querySelector('time')?.innerText.trim() || '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "salary",
            "selector": "(() => { const txt = ROW.innerText || ''; const m = txt.match(/\\$[\\d,.]+\\s*(?:-|–|to)?\\s*\\$?[\\d,.]*\\s*(?:an hour|a year|\\/yr|\\/hr|per year|per hour)?/i); return m ? m[0] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "sector",
            "selector": "(() => '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "title",
            "selector": "(() => ROW.querySelector('.base-search-card__title')?.innerText.trim() || ROW.querySelector('h3')?.innerText.trim() || ROW.querySelector('a.base-card__full-link span.sr-only')?.innerText.trim() || '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "work_type",
            "selector": "(() => '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "search_keywords",
            "selector": "(() => { try { return new URL(location.href).searchParams.get('keywords') || ''; } catch(e) { return ''; } })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "search_location",
            "selector": "(() => { try { return new URL(location.href).searchParams.get('location') || ''; } catch(e) { return ''; } })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "batch_start",
            "selector": "(() => { try { return new URL(location.href).searchParams.get('start') || ''; } catch(e) { return ''; } })()",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 1800,
      "position_y": 520,
      "config": {
        "color": "bg-[#8d8d8d]"
      }
    },
    {
      "block_id": "end-1",
      "block_type": "output",
      "title": "End",
      "description": "Terminate execution flow",
      "position_x": 1128,
      "position_y": 520,
      "config": {
        "color": "bg-[#8d8d8d]"
      }
    }
  ],
  "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": "sleep-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-1",
      "from_connector_id": "right",
      "to_block_id": "element-exists-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "true",
      "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"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "false",
      "to_block_id": "end-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": 992,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "sleep-1"
        ]
      }
    },
    {
      "id": "group-pagination",
      "element_type": "group",
      "title": "Pagination Loop",
      "color": "#ff832b",
      "position_x": 1056,
      "position_y": 116,
      "width": 992,
      "height": 596,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "element-exists-1",
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 1392,
      "position_y": 416,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1"
        ]
      }
    },
    {
      "id": "group-control",
      "element_type": "group",
      "title": "Control Flow",
      "color": "#8d8d8d",
      "position_x": 1056,
      "position_y": 416,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "end-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Best-effort LinkedIn public job scraper equivalent to the Octoparse LinkedIn Job Scraper. Uses LinkedIn's public guest jobs HTML endpoint with predictable start offsets to collect public job cards without login, appending each available batch to linkedin-job-search-scraper-by-url.csv. The workflow stops cleanly if LinkedIn returns an authwall or an empty batch. Extracts public listing fields: title, company, company URL, job URL, location, posting date, listing benefits/badges, logo, job ID, and best-effort Octoparse-compatible columns. Full descriptions, application counts, salaries, poster data, and some job metadata may be blank because LinkedIn often hides them from public listing-card HTML or requires detail/API/login access.",
      "color": "#f1c21b",
      "position_x": 80,
      "position_y": 20,
      "width": 480,
      "height": 160,
      "z_index": 22,
      "data": {}
    },
    {
      "id": "note-block-navigate-1",
      "element_type": "note",
      "title": "Note: Navigate",
      "content": "Multi-URL loop over 40 pages. Pair with loop-continue at the end of each iteration.",
      "color": "#ee5396",
      "position_x": 320,
      "position_y": 200,
      "width": 332,
      "height": 107,
      "z_index": 22,
      "data": {
        "block_id": "navigate-1"
      }
    },
    {
      "id": "note-block-element-exists-1",
      "element_type": "note",
      "title": "Note: Element Exists",
      "content": "Condition block: checks `.job-search-card`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 1328,
      "position_y": 200,
      "width": 340,
      "height": 135,
      "z_index": 22,
      "data": {
        "block_id": "element-exists-1"
      }
    },
    {
      "id": "note-block-structured-export-1",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Structured export with JS columns (applications_count, apply_type, apply_url, benefits, company_id). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 1664,
      "position_y": 500,
      "width": 340,
      "height": 135,
      "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": 2000,
      "position_y": 500,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}