{
  "version": "1.0.0",
  "exported_at": "2026-06-03T02:30:00.000Z",
  "project": {
    "name": "CHINTAI Real Estate Listing Scraper",
    "description": "Scrapes CHINTAI rental listing/search result pages and exports the same fields shown in the Octoparse preview: property type, property name, detail URL, address, transport, floor plan, area, rent, management fee, summary, deposit, key money, building age, floors, structure, and update date. The sample catalog detail URLs are currently expired/404, so this template starts from an active CHINTAI shop listing URL discovered from those expired pages; replace the Navigate URL with any filtered CHINTAI search/list URL as needed. For each listing page, the template fetches each active CHINTAI detail page and parses labeled detail fields, then follows the next result-page URL until no next page remains. If CHINTAI presents a CAPTCHA, pause and solve it manually in the browser.",
    "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://www.chintai.net/shop/000000466/list/?prefKey=hiroshima&mode=1",
        "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": 480,
      "position_y": 220,
      "config": {
        "timeout": 30
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 840,
      "position_y": 220,
      "config": {
        "selector": "a[href*=\"/detail/bk-\"]",
        "timeout": 30,
        "visible": true
      }
    },
    {
      "block_id": "inject-javascript-1",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Execute custom JavaScript",
      "position_x": 1200,
      "position_y": 220,
      "config": {
        "jsCode": "return (async () => {\n  const old = document.getElementById('uscraper-chintai-rows');\n  if (old) old.remove();\n  const container = document.createElement('div');\n  container.id = 'uscraper-chintai-rows';\n  container.style.display = 'none';\n  document.body.appendChild(container);\n\n  const clean = (s) => (s || '').replace(/\\u00a0/g, ' ').replace(/\\s+/g, ' ').trim();\n  const rawClean = (s) => (s || '').replace(/\\u00a0/g, ' ').trim();\n  const abs = (href) => { try { return new URL(href || '', location.href).href; } catch (_) { return href || ''; } };\n  const text = (el) => clean(el ? el.textContent : '');\n  const bodyText = (doc) => clean(doc && doc.body ? doc.body.innerText : '');\n\n  const valueForLabelElement = (labelEl) => {\n    if (!labelEl) return '';\n    const tag = (labelEl.tagName || '').toLowerCase();\n    if (tag === 'th' || tag === 'dt') {\n      let sib = labelEl.nextElementSibling;\n      while (sib && !['td', 'dd'].includes((sib.tagName || '').toLowerCase())) sib = sib.nextElementSibling;\n      if (sib) return rawClean(sib.innerText || sib.textContent || '');\n    }\n    const parent = labelEl.closest('tr, dl, li, div, p') || labelEl.parentElement;\n    if (!parent) return '';\n    const valueEl = parent.querySelector('td, dd, .data, .value, .cont, .body, .txt');\n    if (valueEl && valueEl !== labelEl) return rawClean(valueEl.innerText || valueEl.textContent || '');\n    const label = rawClean(labelEl.innerText || labelEl.textContent || '');\n    return rawClean((parent.innerText || parent.textContent || '').replace(label, '').replace(/^[：:\\s]+/, ''));\n  };\n\n  const byLabel = (scope, labels) => {\n    if (!scope) return '';\n    const labelEls = Array.from(scope.querySelectorAll('th, dt, .label, .ttl, .title, .head, .name'));\n    for (const el of labelEls) {\n      const label = text(el);\n      if (labels.some((l) => label.includes(l))) {\n        const v = clean(valueForLabelElement(el));\n        if (v && !labels.includes(v)) return v;\n      }\n    }\n    const lines = (scope.innerText || scope.textContent || '').split(/\\n+/).map(clean).filter(Boolean);\n    for (let i = 0; i < lines.length; i++) {\n      for (const label of labels) {\n        if (lines[i] === label || lines[i].startsWith(label + '：') || lines[i].startsWith(label + ':')) {\n          const inline = clean(lines[i].replace(label, '').replace(/^[：:\\s]+/, ''));\n          if (inline) return inline;\n          if (lines[i + 1]) return lines[i + 1];\n        }\n      }\n    }\n    return '';\n  };\n\n  const bySelector = (scope, selectors) => {\n    for (const sel of selectors) {\n      const el = scope && scope.querySelector(sel);\n      const v = text(el);\n      if (v) return v;\n    }\n    return '';\n  };\n\n  const splitPair = (v) => clean(v).split(/\\s*[\\/／]\\s*|\\s{2,}|\\n+/).map(clean).filter(Boolean);\n  const firstPair = (v) => splitPair(v)[0] || '';\n  const secondPair = (v) => splitPair(v)[1] || '';\n  const regexOne = (s, re) => { const m = clean(s).match(re); return m ? clean(m[1] || m[0]) : ''; };\n\n  const fallbackForUrl = new Map();\n  Array.from(document.querySelectorAll('a[href*=\"/detail/bk-\"]')).forEach((a) => {\n    const url = abs(a.getAttribute('href'));\n    if (!url || fallbackForUrl.has(url)) return;\n    const row = a.closest('tr') || a.closest('section.mod_propertyBlock, .mod_propertyBlock, li, .propertyBlock') || a.parentElement;\n    const scopeText = clean(row ? row.innerText : '');\n    fallbackForUrl.set(url, {\n      detail_url: url,\n      property_name: clean((a.getAttribute('title') || a.textContent || '').replace(/詳細を見る|物件詳細|詳細/g, '')),\n      area: regexOne(scopeText, /(\\d+(?:\\.\\d+)?\\s*m²)/),\n      rent: regexOne(scopeText, /(\\d+(?:\\.\\d+)?\\s*万円)/),\n      floor_plan: regexOne(scopeText, /(\\d+[LDKSＲR]+(?:\\+S)?)/i)\n    });\n  });\n\n  const parseDetail = (html, url, fallback) => {\n    const doc = new DOMParser().parseFromString(html, 'text/html');\n    const root = doc.body || doc;\n    const allText = bodyText(doc);\n    const expired = allText.includes('該当する物件情報の掲載は、終了しました');\n\n    const h1s = Array.from(doc.querySelectorAll('h1')).map(text).filter((v) => v && !v.includes('賃貸・部屋探し情報') && !v.includes('掲載は、終了しました'));\n    let propertyName = bySelector(doc, ['.propertyName', '.bukkenName', '.pbName h1', '.pbName h2', '.detailTitle h1', '#contents h1', 'main h1']) || h1s[0] || '';\n    propertyName = clean(propertyName.replace(/CHINTAI|賃貸|詳細|空室情報|お気に入り|問い合わせ|お問合せ/g, ''));\n    if (!propertyName || propertyName.length > 140) propertyName = fallback.property_name || '';\n\n    const rentCombined = byLabel(root, ['家賃/管理費', '賃料/管理費', '賃料/共益費', '家賃／管理費', '賃料／管理費']);\n    const depositCombined = byLabel(root, ['敷金/礼金', '保証金/礼金', '敷金／礼金', '保証金／礼金']);\n    const planAreaCombined = byLabel(root, ['間取り/専有面積', '間取り/面積', '間取り／専有面積', '間取り／面積']);\n\n    let rent = byLabel(root, ['家賃', '賃料']);\n    if (!rent || rent.includes('/')) rent = firstPair(rentCombined || rent) || regexOne(allText, /(\\d+(?:\\.\\d+)?\\s*万円)/) || fallback.rent || '';\n\n    let managementFee = byLabel(root, ['管理費', '共益費', '管理費等']);\n    if (!managementFee || managementFee === rent || managementFee.includes('/')) managementFee = secondPair(rentCombined || managementFee) || regexOne(allText, /(?:管理費|共益費|管理費等)\\s*[:：]?\\s*([0-9,]+円|--)/) || '';\n\n    let floorPlan = byLabel(root, ['間取り']);\n    if (!floorPlan || floorPlan.includes('/')) floorPlan = firstPair(planAreaCombined || floorPlan) || regexOne(allText, /(\\d+[LDKSＲR]+(?:\\+S)?)/i) || fallback.floor_plan || '';\n\n    let area = byLabel(root, ['専有面積', '面積']);\n    if (!area || area.includes('/')) area = secondPair(planAreaCombined || area) || regexOne(allText, /(\\d+(?:\\.\\d+)?\\s*m²)/) || fallback.area || '';\n\n    let deposit = byLabel(root, ['敷金', '保証金']);\n    if (!deposit || deposit.includes('/')) deposit = firstPair(depositCombined || deposit) || '';\n    let keyMoney = byLabel(root, ['礼金']);\n    if (!keyMoney || keyMoney === deposit || keyMoney.includes('/')) keyMoney = secondPair(depositCombined || keyMoney) || '';\n\n    const type = byLabel(root, ['種別', '物件種別']) || regexOne(allText, /(新築|賃貸マンション|賃貸アパート|賃貸一戸建て|マンション|アパート|貸家|テラスハウス)/) || '';\n    const address = byLabel(root, ['住所', '所在地', '所在地住所']);\n    const transport = byLabel(root, ['交通', 'アクセス', '最寄駅', '沿線']);\n    const builtYear = byLabel(root, ['築年', '築年月', '築年数']) || regexOne(allText, /(\\d{4}年\\d{1,2}月（築\\d+年）|\\d{4}年\\d{1,2}月|築\\d+年|新築)/);\n    const floors = byLabel(root, ['階建', '階数']) || regexOne(allText, /(\\d+階建)/);\n    const structure = byLabel(root, ['構造']) || regexOne(allText, /(鉄筋コンクリート造|鉄骨鉄筋コンクリート造|鉄骨造|軽量鉄骨造|木造|RC造|SRC造|ALC造)/);\n    const updatedDate = byLabel(root, ['情報更新日', '更新日']) || regexOne(allText, /(\\d{4}\\/\\d{1,2}\\/\\d{1,2})/);\n    const summary = clean((byLabel(root, ['概要文', '概要', 'PRコメント', 'コメント', 'おすすめポイント', '備考']) || bySelector(root, ['.leadBox p', '.catch', '.comment', '.description', '.summary', '.pr', '.appeal']) || '').replace(/^オススメポイント\\s*/, ''));\n\n    return {\n      type: expired ? (type || '') : type,\n      property_name: propertyName,\n      detail_url: url,\n      address,\n      transport,\n      floor_plan: floorPlan,\n      area,\n      rent,\n      management_fee: managementFee,\n      summary,\n      deposit,\n      key_money: keyMoney,\n      built_year: builtYear,\n      floors,\n      structure,\n      updated_date: updatedDate\n    };\n  };\n\n  const addRow = (data) => {\n    const out = document.createElement('div');\n    out.className = 'uscraper-row';\n    for (const [k, v] of Object.entries(data)) out.setAttribute('data-' + k.replace(/_/g, '-'), clean(v));\n    container.appendChild(out);\n  };\n\n  const urls = Array.from(fallbackForUrl.keys());\n  let index = 0;\n  const workers = Array.from({ length: Math.min(5, Math.max(1, urls.length)) }, async () => {\n    while (index < urls.length) {\n      const url = urls[index++];\n      const fallback = fallbackForUrl.get(url) || { detail_url: url };\n      try {\n        const res = await fetch(url, { credentials: 'include' });\n        const html = await res.text();\n        addRow(parseDetail(html, url, fallback));\n      } catch (e) {\n        addRow({\n          type: '',\n          property_name: fallback.property_name || '',\n          detail_url: url,\n          address: '',\n          transport: '',\n          floor_plan: fallback.floor_plan || '',\n          area: fallback.area || '',\n          rent: fallback.rent || '',\n          management_fee: '',\n          summary: '',\n          deposit: '',\n          key_money: '',\n          built_year: '',\n          floors: '',\n          structure: '',\n          updated_date: ''\n        });\n      }\n    }\n  });\n  await Promise.all(workers);\n  return container.children.length;\n})();",
        "waitForCompletion": true,
        "timeout": 180
      }
    },
    {
      "block_id": "wait-for-element-2",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 1560,
      "position_y": 220,
      "config": {
        "selector": "#uscraper-chintai-rows .uscraper-row",
        "timeout": 60,
        "visible": false
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 1920,
      "position_y": 220,
      "config": {
        "rowSelector": "#uscraper-chintai-rows .uscraper-row",
        "fileName": "1753.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "columns": [
          {
            "name": "type",
            "selector": "",
            "attribute": "data-type"
          },
          {
            "name": "property_name",
            "selector": "",
            "attribute": "data-property-name"
          },
          {
            "name": "detail_url",
            "selector": "",
            "attribute": "data-detail-url"
          },
          {
            "name": "address",
            "selector": "",
            "attribute": "data-address"
          },
          {
            "name": "transport",
            "selector": "",
            "attribute": "data-transport"
          },
          {
            "name": "floor_plan",
            "selector": "",
            "attribute": "data-floor-plan"
          },
          {
            "name": "area",
            "selector": "",
            "attribute": "data-area"
          },
          {
            "name": "rent",
            "selector": "",
            "attribute": "data-rent"
          },
          {
            "name": "management_fee",
            "selector": "",
            "attribute": "data-management-fee"
          },
          {
            "name": "summary",
            "selector": "",
            "attribute": "data-summary"
          },
          {
            "name": "deposit",
            "selector": "",
            "attribute": "data-deposit"
          },
          {
            "name": "key_money",
            "selector": "",
            "attribute": "data-key-money"
          },
          {
            "name": "built_year",
            "selector": "",
            "attribute": "data-built-year"
          },
          {
            "name": "floors",
            "selector": "",
            "attribute": "data-floors"
          },
          {
            "name": "structure",
            "selector": "",
            "attribute": "data-structure"
          },
          {
            "name": "updated_date",
            "selector": "",
            "attribute": "data-updated-date"
          }
        ]
      }
    },
    {
      "block_id": "inject-javascript-2",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Execute custom JavaScript",
      "position_x": 2280,
      "position_y": 220,
      "config": {
        "jsCode": "(() => {\n  let marker = document.getElementById('uscraper-next-url');\n  if (!marker) {\n    marker = document.createElement('div');\n    marker.id = 'uscraper-next-url';\n    marker.style.display = 'none';\n    document.body.appendChild(marker);\n  }\n  const abs = (href) => { try { return new URL(href || '', location.href).href; } catch (_) { return ''; } };\n  const currentPage = (() => {\n    const m = location.pathname.match(/\\/page(\\d+)\\//);\n    return m ? parseInt(m[1], 10) : 1;\n  })();\n  const nextPage = currentPage + 1;\n  const anchors = Array.from(document.querySelectorAll('a[href]'));\n  let next = anchors.find((a) => {\n    const href = a.getAttribute('href') || '';\n    return new RegExp('/list/page' + nextPage + '/').test(href) && !/disabled|off|current/.test(a.className || '') && !(a.closest('.disabled,.off,.current'));\n  });\n  if (!next) {\n    next = anchors.find((a) => {\n      const t = (a.textContent || '').replace(/\\s+/g, '');\n      const href = a.getAttribute('href') || '';\n      return (t === '次' || t === '次へ' || t.includes('次へ') || a.rel === 'next') && href && !/disabled|off|current/.test(a.className || '') && !(a.closest('.disabled,.off,.current'));\n    });\n  }\n  const url = next ? abs(next.getAttribute('href')) : '';\n  marker.setAttribute('data-url', url);\n  marker.textContent = url;\n  return url;\n})();",
        "waitForCompletion": true,
        "timeout": 10
      }
    },
    {
      "block_id": "element-exists-1",
      "block_type": "process",
      "title": "Element Exists",
      "description": "Check if element exists",
      "position_x": 2640,
      "position_y": 220,
      "config": {
        "selector": "#uscraper-next-url:not([data-url=\"\"])"
      }
    },
    {
      "block_id": "end-1",
      "block_type": "output",
      "title": "End",
      "description": "Terminate execution flow",
      "position_x": 2640,
      "position_y": 560,
      "config": {}
    },
    {
      "block_id": "inject-javascript-3",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Execute custom JavaScript",
      "position_x": 3000,
      "position_y": 560,
      "config": {
        "jsCode": "(() => {\n  const marker = document.getElementById('uscraper-next-url');\n  const url = marker ? marker.getAttribute('data-url') : '';\n  if (url) window.location.href = url;\n  return url || '';\n})();",
        "waitForCompletion": false,
        "timeout": 3
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 3360,
      "position_y": 560,
      "config": {
        "duration": 3
      }
    },
    {
      "block_id": "wait-for-page-load-2",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 3720,
      "position_y": 560,
      "config": {
        "timeout": 30
      }
    },
    {
      "block_id": "wait-for-element-3",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 4080,
      "position_y": 560,
      "config": {
        "selector": "a[href*=\"/detail/bk-\"]",
        "timeout": 30,
        "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": "wait-for-element-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-element-1",
      "from_connector_id": "right",
      "to_block_id": "inject-javascript-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "inject-javascript-1",
      "from_connector_id": "right",
      "to_block_id": "wait-for-element-2",
      "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": "inject-javascript-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "inject-javascript-2",
      "from_connector_id": "right",
      "to_block_id": "element-exists-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "false",
      "to_block_id": "end-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "element-exists-1",
      "from_connector_id": "true",
      "to_block_id": "inject-javascript-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "inject-javascript-3",
      "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-page-load-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "wait-for-page-load-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": "inject-javascript-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": 4280,
      "height": 636,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "wait-for-element-1",
          "wait-for-element-2",
          "sleep-1",
          "wait-for-page-load-2",
          "wait-for-element-3"
        ]
      }
    },
    {
      "id": "group-interaction",
      "element_type": "group",
      "title": "Interaction",
      "color": "#a56eff",
      "position_x": 1128,
      "position_y": 116,
      "width": 2120,
      "height": 636,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "inject-javascript-1",
          "inject-javascript-2",
          "inject-javascript-3"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 1848,
      "position_y": 116,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1"
        ]
      }
    },
    {
      "id": "group-pagination",
      "element_type": "group",
      "title": "Pagination Loop",
      "color": "#ff832b",
      "position_x": 2568,
      "position_y": 116,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "element-exists-1"
        ]
      }
    },
    {
      "id": "group-control",
      "element_type": "group",
      "title": "Control Flow",
      "color": "#8d8d8d",
      "position_x": 2568,
      "position_y": 456,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "end-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Scrapes CHINTAI rental listing/search result pages and exports the same fields shown in the Octoparse preview: property type, property name, detail URL, address, transport, floor plan, area, rent, management fee, summary, deposit, key money, building age, floors, structure, and update date. The sample catalog detail URLs are currently expired/404, so this template starts from an active CHINTAI shop listing URL discovered from those expired pages; replace the Navigate URL with any filtered CHINTAI search/list URL as needed. For each listing page, the template fetches each active CHINTAI detail page and parses labeled detail fields, then follows the next result-page URL until no next page remains. If CHINTAI presents a CAPTCHA, pause and solve it manually in the browser.",
      "color": "#f1c21b",
      "position_x": 80,
      "position_y": 20,
      "width": 480,
      "height": 160,
      "z_index": 22,
      "data": {}
    },
    {
      "id": "note-block-inject-javascript-1",
      "element_type": "note",
      "title": "Note: Inject JavaScript",
      "content": "Runs custom JavaScript in the page: `return (async () => {\n  const old = document.getElementById('uscraper-chintai-rows');\n  if (old) old...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 1400,
      "position_y": 200,
      "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: `(() => {\n  let marker = document.getElementById('uscraper-next-url');\n  if (!marker) {\n    marker = ...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 2480,
      "position_y": 200,
      "width": 340,
      "height": 140,
      "z_index": 22,
      "data": {
        "block_id": "inject-javascript-2"
      }
    },
    {
      "id": "note-block-element-exists-1",
      "element_type": "note",
      "title": "Note: Element Exists",
      "content": "Condition block: checks `#uscraper-next-url:not([data-url=\"\"])`. True / False branches control which path runs next. Keep enough space between branches so both connector lines are visible.",
      "color": "#ee5396",
      "position_x": 2840,
      "position_y": 200,
      "width": 340,
      "height": 142,
      "z_index": 22,
      "data": {
        "block_id": "element-exists-1"
      }
    },
    {
      "id": "note-block-inject-javascript-3",
      "element_type": "note",
      "title": "Note: Inject JavaScript",
      "content": "Runs custom JavaScript in the page: `(() => {\n  const marker = document.getElementById('uscraper-next-url');\n  const url = marker ? marke...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 3200,
      "position_y": 540,
      "width": 340,
      "height": 140,
      "z_index": 22,
      "data": {
        "block_id": "inject-javascript-3"
      }
    }
  ]
}