{
  "version": "1.0.0",
  "exported_at": "2026-05-31T13:05:00.000Z",
  "project": {
    "name": "JP Indeed Job Listing Scraper by keywords",
    "description": "Scrapes Indeed Japan keyword search results for the sample query webデザイナー in 東京都. Extracts keyword, job title, detail URL, company, location, salary, employment type, posted date, company rating, source page URL, current time, and job snippet. Pagination is handled with a click-next condition loop and structured export appends rows across pages. Indeed may show Cloudflare / Additional Verification Required; if detected, this template waits to allow an existing browser session or manual verification to clear, refreshes, then attempts extraction. If verification remains, scraping may still fail or return no rows.",
    "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": {
        "url": "https://jp.indeed.com/jobs?q=web%E3%83%87%E3%82%B6%E3%82%A4%E3%83%8A%E3%83%BC&l=%E6%9D%B1%E4%BA%AC%E9%83%BD&from=searchOnSerp",
        "color": "bg-[#4589ff]",
        "tags": [
          "indeed",
          "jobs",
          "japan",
          "keyword-search"
        ]
      }
    },
    {
      "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": "text-contains-1",
      "block_type": "process",
      "title": "Text Contains",
      "description": "Check if page contains text",
      "position_x": 792,
      "position_y": 220,
      "config": {
        "text": "Additional Verification Required",
        "selector": "body",
        "timeout": 3,
        "caseSensitive": false
      }
    },
    {
      "block_id": "sleep-verify-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1128,
      "position_y": 520,
      "config": {
        "duration": 60
      }
    },
    {
      "block_id": "refresh-1",
      "block_type": "process",
      "title": "Refresh",
      "description": "Reload current page",
      "position_x": 1464,
      "position_y": 520,
      "config": {}
    },
    {
      "block_id": "wait-for-page-load-verify-1",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 1800,
      "position_y": 520,
      "config": {
        "timeout": 45
      }
    },
    {
      "block_id": "element-exists-1",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 792,
      "position_y": 520,
      "config": {
        "selector": "#onetrust-accept-btn-handler, button[aria-label*='Accept'], button[id*='accept'], button[class*='accept']"
      }
    },
    {
      "block_id": "click-1",
      "block_type": "process",
      "title": "Click",
      "description": "Click on element",
      "position_x": 1296,
      "position_y": 800,
      "config": {
        "selector": "#onetrust-accept-btn-handler, button[aria-label*='Accept'], button[id*='accept'], button[class*='accept']",
        "timeout": 5
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1632,
      "position_y": 800,
      "config": {
        "duration": 1
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 1968,
      "position_y": 800,
      "config": {
        "selector": "div.job_seen_beacon, [data-testid='job-card'], li[data-occludable-job-id]",
        "timeout": 60,
        "visible": true
      }
    },
    {
      "block_id": "wait-for-element-2",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 2304,
      "position_y": 800,
      "config": {
        "selector": "div.job_seen_beacon, [data-testid='job-card'], li[data-occludable-job-id]",
        "timeout": 60,
        "visible": true
      }
    },
    {
      "block_id": "wait-for-element-verify-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 2136,
      "position_y": 520,
      "config": {
        "selector": "div.job_seen_beacon, [data-testid='job-card'], li[data-occludable-job-id]",
        "timeout": 120,
        "visible": true
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 2472,
      "position_y": 520,
      "config": {
        "rowSelector": "div.job_seen_beacon, [data-testid='job-card'], li[data-occludable-job-id]",
        "fileName": "indeed-job-listing-scraper-jp-by-keywords.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "columns": [
          {
            "name": "keyword",
            "selector": "'webデザイナー'",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "job_title",
            "selector": "const el = ROW.querySelector('h2.jobTitle a span[title], h2.jobTitle span[title], a[data-jk] span[title], [data-testid=\"job-title\"], h2 a span, h2'); el ? (el.getAttribute('title') || el.textContent || '').trim() : '';",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "job_detail_url",
            "selector": "const a = ROW.querySelector('h2.jobTitle a[href], a[data-jk][href], a[href*=\"/viewjob\"], a[href*=\"jk=\"]'); a ? new URL(a.getAttribute('href'), location.origin).href : '';",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "company_name",
            "selector": "[data-testid='company-name'], .companyName, span.companyName",
            "attribute": "text"
          },
          {
            "name": "location",
            "selector": "[data-testid='text-location'], .companyLocation, div.companyLocation",
            "attribute": "text"
          },
          {
            "name": "salary",
            "selector": "const txt = ROW.innerText || ''; const lines = txt.split('\\n').map(s => s.trim()).filter(Boolean); const salary = lines.find(s => /円|万円|時給|月給|年収|日給/.test(s)); salary || '';",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "employment_type",
            "selector": "const txt = ROW.innerText || ''; const types = ['正社員','契約社員','派遣社員','アルバイト','パート','業務委託','新卒','インターン','請負']; const found = types.find(t => txt.includes(t)); found || '';",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "posted_date",
            "selector": "const txt = ROW.innerText || ''; const lines = txt.split('\\n').map(s => s.trim()).filter(Boolean); const date = lines.find(s => /日前|時間前|分前|今日|昨日|掲載/.test(s)); date || '';",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "company_review_rating",
            "selector": "[data-testid='holistic-rating'], .ratingNumber, .ratingsDisplay, span[aria-label*='rating'], span[aria-label*='レビュー']",
            "attribute": "text"
          },
          {
            "name": "job_snippet",
            "selector": "[data-testid='job-snippet'], .job-snippet",
            "attribute": "text"
          },
          {
            "name": "page_url",
            "selector": "window.location.href",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "current_time",
            "selector": "new Date().toLocaleString('ja-JP')",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "element-exists-2",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 2808,
      "position_y": 520,
      "config": {
        "selector": "a[data-testid='pagination-page-next']:not([aria-disabled='true']), a[aria-label*='Next']:not([aria-disabled='true']), a[aria-label*='次']:not([aria-disabled='true'])"
      }
    },
    {
      "block_id": "end-2",
      "block_type": "output",
      "title": "End",
      "description": "Terminate execution flow",
      "position_x": 2808,
      "position_y": 520,
      "config": {}
    },
    {
      "block_id": "click-2",
      "block_type": "process",
      "title": "Click",
      "description": "Click on element",
      "position_x": 3144,
      "position_y": 520,
      "config": {
        "selector": "a[data-testid='pagination-page-next']:not([aria-disabled='true']), a[aria-label*='Next']:not([aria-disabled='true']), a[aria-label*='次']:not([aria-disabled='true'])",
        "timeout": 15
      }
    },
    {
      "block_id": "wait-for-page-load-2",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 3480,
      "position_y": 520,
      "config": {
        "timeout": 45
      }
    },
    {
      "block_id": "sleep-2",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 3816,
      "position_y": 520,
      "config": {
        "duration": 2
      }
    },
    {
      "block_id": "wait-for-element-3",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 4152,
      "position_y": 758,
      "config": {
        "selector": "div.job_seen_beacon, [data-testid='job-card'], li[data-occludable-job-id]",
        "timeout": 60,
        "visible": true
      }
    }
  ],
  "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": "text-contains-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-1",
      "from_connector_id": "true",
      "to_block_id": "sleep-verify-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-verify-1",
      "from_connector_id": "right",
      "to_block_id": "refresh-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "refresh-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-page-load-verify-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-page-load-verify-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-element-verify-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-verify-1",
      "from_connector_id": "right",
      "to_block_id": "structured-export-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "text-contains-1",
      "from_connector_id": "false",
      "to_block_id": "element-exists-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "true",
      "to_block_id": "click-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "click-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": "wait-for-element-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "false",
      "to_block_id": "wait-for-element-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-1",
      "from_connector_id": "right",
      "to_block_id": "structured-export-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-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": "element-exists-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-2",
      "from_connector_id": "false",
      "to_block_id": "end-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-2",
      "from_connector_id": "true",
      "to_block_id": "click-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "click-2",
      "from_connector_id": "right",
      "to_block_id": "wait-for-page-load-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-page-load-2",
      "from_connector_id": "right",
      "to_block_id": "sleep-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-2",
      "from_connector_id": "right",
      "to_block_id": "wait-for-element-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-3",
      "from_connector_id": "right",
      "to_block_id": "structured-export-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": 4352,
      "height": 876,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "refresh-1",
          "sleep-1",
          "wait-for-element-1",
          "wait-for-element-2",
          "wait-for-page-load-2",
          "sleep-2",
          "wait-for-element-3"
        ]
      }
    },
    {
      "id": "group-pagination",
      "element_type": "group",
      "title": "Pagination Loop",
      "color": "#ff832b",
      "position_x": 720,
      "position_y": 116,
      "width": 2672,
      "height": 876,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "text-contains-1",
          "element-exists-1",
          "click-1",
          "element-exists-2",
          "click-2"
        ]
      }
    },
    {
      "id": "group-other",
      "element_type": "group",
      "title": "Workflow",
      "color": "#525252",
      "position_x": 1056,
      "position_y": 416,
      "width": 1328,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "sleep-verify-1",
          "wait-for-page-load-verify-1",
          "wait-for-element-verify-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 2400,
      "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": 2736,
      "position_y": 416,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "end-2"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Scrapes Indeed Japan keyword search results for the sample query webデザイナー in 東京都. Extracts keyword, job title, detail URL, company, location, salary, employment type, posted date, company rating, source page URL, current time, and job snippet. Pagination is handled with a click-next condition loop and structured export appends rows across pages. Indeed may show Cloudflare / Additional Verification Required; if detected, this template waits to allow an existing browser session or manual verification to clear, refreshes, then attempts extraction. If verification remains, scraping may still fail or return no rows.",
      "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": 992,
      "position_y": 200,
      "width": 340,
      "height": 131,
      "z_index": 22,
      "data": {
        "block_id": "text-contains-1"
      }
    },
    {
      "id": "note-block-element-exists-1",
      "element_type": "note",
      "title": "Note: Element Exists",
      "content": "Condition block: checks `#onetrust-accept-btn-handler, button[aria-label*='Accept'], button[id*='accept'], button[class*='accept']`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 992,
      "position_y": 500,
      "width": 340,
      "height": 165,
      "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 (keyword, job_title, job_detail_url, salary, employment_type). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 2672,
      "position_y": 500,
      "width": 340,
      "height": 133,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-1"
      }
    },
    {
      "id": "note-block-element-exists-2",
      "element_type": "note",
      "title": "Note: Element Exists",
      "content": "Condition block: checks `a[data-testid='pagination-page-next']:not([aria-disabled='true']), a[aria-label*='Next']:not([aria-disabled='true']), a[`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 3008,
      "position_y": 500,
      "width": 340,
      "height": 170,
      "z_index": 22,
      "data": {
        "block_id": "element-exists-2"
      }
    },
    {
      "id": "note-block-click-2",
      "element_type": "note",
      "title": "Note: Click",
      "content": "Pagination click — add waits after this block; the page reloads asynchronously.",
      "color": "#ee5396",
      "position_x": 3344,
      "position_y": 500,
      "width": 316,
      "height": 106,
      "z_index": 22,
      "data": {
        "block_id": "click-2"
      }
    }
  ]
}