{
  "version": "1.0.0",
  "exported_at": "2026-05-31T05:30:00.000Z",
  "project": {
    "name": "Google Maps Leads Scraper by Keywords",
    "description": "Best-effort Google Maps place-details scraper equivalent to the Octoparse Google Maps Leads template. It extracts business/place details from configured Google Maps place URLs for a keyword/location result set. Navigation uses a multi-URL loop over known Google Maps place pages from the sample Apple/New York results; add more place URLs to navigate.urls to scrape more keyword results. Google Maps is dynamic and may throttle, show consent/CAPTCHA, or change obfuscated selectors.",
    "color": "bg-[#4589ff]",
    "template_id": "ai-generated-google-maps-leads-by-keywords"
  },
  "blocks": [
    {
      "block_id": "set-window-size-1",
      "block_type": "process",
      "title": "Set Window Size",
      "description": "Set browser window dimensions",
      "position_x": 120,
      "position_y": 220,
      "config": {
        "width": 1920,
        "height": 1080,
        "color": "bg-[#4589ff]"
      }
    },
    {
      "block_id": "navigate-1",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to a URL",
      "position_x": 480,
      "position_y": 220,
      "config": {
        "urls": [
          "https://www.google.com/maps/place/Apple+Downtown+Brooklyn/data=!4m5!3m4!1s0x89c25badf08e1a79:0x1af32e58cb8fb9a1!8m2!3d40.685771!4d-73.978279?authuser=0&hl=en&rclk=1",
          "https://www.google.com/maps/place/Apple+World+Trade+Center/data=!4m5!3m4!1s0x89c25a1967dedc8d:0xbefe56f5e3bf3d82!8m2!3d40.7134454!4d-74.0119608?authuser=0&hl=en&rclk=1",
          "https://www.google.com/maps/place/Apple+SoHo/data=!4m5!3m4!1s0x89c2598ef4ac7557:0x82a5771324cf7f25!8m2!3d40.725058!4d-73.999029?authuser=0&hl=en&rclk=1"
        ],
        "color": "bg-[#08bdba]",
        "tags": [
          "google-maps",
          "multi-url",
          "keyword-results"
        ]
      }
    },
    {
      "block_id": "wait-for-page-load-1",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 840,
      "position_y": 220,
      "config": {
        "timeout": 45,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1200,
      "position_y": 220,
      "config": {
        "duration": 5,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 1560,
      "position_y": 220,
      "config": {
        "selector": "h1.DUwDvf",
        "timeout": 45,
        "visible": true,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "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": "body",
        "fileName": "google-maps-scraper-store-details-by-keyword.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#42be65]",
        "tags": [
          "google-maps",
          "place-details",
          "js-columns"
        ],
        "columns": [
          {
            "name": "keyword",
            "selector": "(() => 'apple')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "title",
            "selector": "(() => ROW.querySelector('h1.DUwDvf')?.textContent.trim() || document.title.replace(/\\s*-\\s*Google Maps\\s*$/,'').trim())()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "reviews",
            "selector": "(() => { const labels=[...ROW.querySelectorAll('[aria-label]')].map(e=>e.getAttribute('aria-label')||''); const v=labels.find(x=>/reviews/i.test(x)&&/[0-9]/.test(x)); const m=(v||ROW.innerText).match(/\\(?([0-9][0-9,\\.]+)\\)?\\s*reviews/i); return m ? m[1].replace(/,/g,'') : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "review_points",
            "selector": "(() => { const direct=ROW.querySelector('.F7nice span[aria-hidden=\"true\"]')?.textContent.trim(); if (direct && /^[0-5](\\.\\d+)?$/.test(direct)) return direct; const label=[...ROW.querySelectorAll('[aria-label]')].map(e=>e.getAttribute('aria-label')||'').find(x=>/stars/i.test(x)); const m=(label||ROW.innerText).match(/\\b([0-5](?:\\.\\d+)?)\\s*(?:stars|\\()/i); return m ? m[1] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "address",
            "selector": "(() => { const el=ROW.querySelector('[data-item-id=\"address\"] .Io6YTe') || ROW.querySelector('button[aria-label^=\"Address:\"] .Io6YTe'); const aria=ROW.querySelector('button[aria-label^=\"Address:\"]')?.getAttribute('aria-label'); return (el?.textContent || aria?.replace(/^Address:\\s*/,'') || '').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "country",
            "selector": "(() => { const a=(ROW.querySelector('[data-item-id=\"address\"] .Io6YTe')?.textContent || '').trim(); const parts=a.split(',').map(x=>x.trim()); return parts.length > 3 ? parts[parts.length-1] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "city",
            "selector": "(() => { const a=(ROW.querySelector('[data-item-id=\"address\"] .Io6YTe')?.textContent || ROW.querySelector('button[aria-label^=\"Address:\"]')?.getAttribute('aria-label')?.replace(/^Address:\\s*/,'') || '').trim(); const p=a.split(',').map(x=>x.trim()); return p.length >= 2 ? p[p.length-2] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "state",
            "selector": "(() => { const a=(ROW.querySelector('[data-item-id=\"address\"] .Io6YTe')?.textContent || '').trim(); const last=a.split(',').map(x=>x.trim()).pop() || ''; const abbr=(last.match(/\\b([A-Z]{2})\\b/)||[])[1] || ''; const map={NY:'New York',NJ:'New Jersey',CA:'California',TX:'Texas',FL:'Florida',IL:'Illinois',PA:'Pennsylvania',WA:'Washington',MA:'Massachusetts'}; return map[abbr] || abbr; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "website",
            "selector": "(() => { const links=[...ROW.querySelectorAll('a[href*=\"/url?q=\"]')]; for (const a of links){ try { const u=new URL(a.href); const q=u.searchParams.get('q'); if(q && !/google\\.com|accounts\\.google|support\\.google/i.test(q)) return q; } catch(e){} } const aria=[...ROW.querySelectorAll('[aria-label]')].map(e=>e.getAttribute('aria-label')||'').find(x=>/^Website:/i.test(x)); return aria ? aria.replace(/^Website:\\s*/i,'') : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "phone",
            "selector": "(() => { const tel=ROW.querySelector('a[href^=\"tel:\"]')?.getAttribute('href')?.replace(/^tel:/,''); if(tel) return tel; const el=ROW.querySelector('[data-item-id^=\"phone\"] .Io6YTe') || ROW.querySelector('button[aria-label^=\"Phone:\"] .Io6YTe'); const aria=ROW.querySelector('button[aria-label^=\"Phone:\"]')?.getAttribute('aria-label'); const txt=el?.textContent || aria || ROW.innerText; const m=txt.match(/\\(?\\d{3}\\)?[\\s.-]*\\d{3}[\\s.-]*\\d{4}/); return m ? m[0] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "open_time",
            "selector": "(() => { const rows=[...ROW.querySelectorAll('table.eK4R0e tr')].map(tr=>{ const d=tr.querySelector('td:first-child')?.textContent.trim() || ''; const t=tr.querySelector('td.mxowUb')?.getAttribute('aria-label') || tr.querySelector('td.mxowUb')?.textContent.trim() || ''; return d && t ? `${d} ${t}` : ''; }).filter(Boolean); return rows.length ? rows.join(' | ') : (ROW.querySelector('.ZDu9vd')?.textContent.trim() || ''); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "page_url",
            "selector": "(() => location.href)()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "google_id",
            "selector": "(() => { const href=decodeURIComponent(location.href); const m=href.match(/!1s(0x[0-9a-f]+:0x[0-9a-f]+)/i); return m ? m[1] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "place_id",
            "selector": "(() => { const href=decodeURIComponent(location.href); const m=href.match(/!16s\\/([^?&!]+)/i) || href.match(/!1s([^!]+)!/i); return m ? m[1] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "additional_info",
            "selector": "(() => [...ROW.querySelectorAll('.LTs0Rc[aria-label], [role=\"group\"][aria-label]')].map(e=>e.getAttribute('aria-label')).filter(Boolean).join(' | '))()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "latitude",
            "selector": "(() => { const href=decodeURIComponent(location.href); const m=href.match(/@(-?\\d+\\.\\d+),(-?\\d+\\.\\d+)/) || href.match(/!3d(-?\\d+\\.\\d+)!4d(-?\\d+\\.\\d+)/); return m ? m[1] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "longitude",
            "selector": "(() => { const href=decodeURIComponent(location.href); const m=href.match(/@(-?\\d+\\.\\d+),(-?\\d+\\.\\d+)/) || href.match(/!3d(-?\\d+\\.\\d+)!4d(-?\\d+\\.\\d+)/); return m ? m[2] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "category",
            "selector": "(() => ROW.querySelector('button.DkEaL')?.textContent.trim() || '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "main_image",
            "selector": "(() => { const imgs=[...ROW.querySelectorAll('button[aria-label^=\"Photo\"] img, .ZKCDEc img, img')].map(i=>i.src).filter(src=>/googleusercontent|ggpht|lh\\d\\.googleusercontent/i.test(src)).filter(src=>!/w32-h32/i.test(src)); return [...new Set(imgs)][0] || ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "image_1",
            "selector": "(() => { const imgs=[...ROW.querySelectorAll('img')].map(i=>i.src).filter(src=>/googleusercontent|ggpht|lh\\d\\.googleusercontent/i.test(src)).filter(src=>!/w32-h32/i.test(src)); return [...new Set(imgs)][1] || ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "image_2",
            "selector": "(() => { const imgs=[...ROW.querySelectorAll('img')].map(i=>i.src).filter(src=>/googleusercontent|ggpht|lh\\d\\.googleusercontent/i.test(src)).filter(src=>!/w32-h32/i.test(src)); return [...new Set(imgs)][2] || ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "image_3",
            "selector": "(() => { const imgs=[...ROW.querySelectorAll('img')].map(i=>i.src).filter(src=>/googleusercontent|ggpht|lh\\d\\.googleusercontent/i.test(src)).filter(src=>!/w32-h32/i.test(src)); return [...new Set(imgs)][3] || ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "description",
            "selector": "(() => ROW.querySelector('.PYvSYb')?.textContent.trim() || '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "price_range",
            "selector": "(() => { const label=[...ROW.querySelectorAll('[aria-label]')].find(e=>/^(Inexpensive|Moderately expensive|Expensive|Very expensive)$/i.test(e.getAttribute('aria-label')||'')); return label?.textContent.trim() || label?.getAttribute('aria-label') || ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "current_status",
            "selector": "(() => ROW.querySelector('.ZDu9vd')?.textContent.replace(/\\s+/g,' ').trim() || '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "plus_code_url",
            "selector": "(() => { const q=(ROW.innerText.match(/[A-Z0-9]{4}\\+[A-Z0-9]{2,3}[^\\n]*/)||[])[0] || ''; return q ? 'https://plus.codes/' + encodeURIComponent(q.trim()) : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "plus_code",
            "selector": "(() => { const el=ROW.querySelector('[data-item-id=\"oloc\"] .Io6YTe, button[aria-label^=\"Plus code\"] .Io6YTe'); const txt=el?.textContent || ROW.innerText; const m=txt.match(/[A-Z0-9]{4}\\+[A-Z0-9]{2,3}[^\\n]*/); return m ? m[0].trim() : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "delivery",
            "selector": "(() => /\\bDelivery\\b/i.test(ROW.innerText) ? 'Delivery' : '')()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "open_time_monday",
            "selector": "(() => { const tr=[...ROW.querySelectorAll('table.eK4R0e tr')].find(r=>(r.querySelector('td:first-child')?.textContent||'').trim().toLowerCase().startsWith('monday')); if(!tr) return ''; const d=tr.querySelector('td:first-child')?.textContent.trim() || 'Monday'; const t=tr.querySelector('td.mxowUb')?.getAttribute('aria-label') || tr.querySelector('td.mxowUb')?.textContent.trim() || ''; return `${d} ${t}`.trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "open_time_tuesday",
            "selector": "(() => { const tr=[...ROW.querySelectorAll('table.eK4R0e tr')].find(r=>(r.querySelector('td:first-child')?.textContent||'').trim().toLowerCase().startsWith('tuesday')); if(!tr) return ''; const d=tr.querySelector('td:first-child')?.textContent.trim() || 'Tuesday'; const t=tr.querySelector('td.mxowUb')?.getAttribute('aria-label') || tr.querySelector('td.mxowUb')?.textContent.trim() || ''; return `${d} ${t}`.trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "open_time_wednesday",
            "selector": "(() => { const tr=[...ROW.querySelectorAll('table.eK4R0e tr')].find(r=>(r.querySelector('td:first-child')?.textContent||'').trim().toLowerCase().startsWith('wednesday')); if(!tr) return ''; const d=tr.querySelector('td:first-child')?.textContent.trim() || 'Wednesday'; const t=tr.querySelector('td.mxowUb')?.getAttribute('aria-label') || tr.querySelector('td.mxowUb')?.textContent.trim() || ''; return `${d} ${t}`.trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "open_time_thursday",
            "selector": "(() => { const tr=[...ROW.querySelectorAll('table.eK4R0e tr')].find(r=>(r.querySelector('td:first-child')?.textContent||'').trim().toLowerCase().startsWith('thursday')); if(!tr) return ''; const d=tr.querySelector('td:first-child')?.textContent.trim() || 'Thursday'; const t=tr.querySelector('td.mxowUb')?.getAttribute('aria-label') || tr.querySelector('td.mxowUb')?.textContent.trim() || ''; return `${d} ${t}`.trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "open_time_friday",
            "selector": "(() => { const tr=[...ROW.querySelectorAll('table.eK4R0e tr')].find(r=>(r.querySelector('td:first-child')?.textContent||'').trim().toLowerCase().startsWith('friday')); if(!tr) return ''; const d=tr.querySelector('td:first-child')?.textContent.trim() || 'Friday'; const t=tr.querySelector('td.mxowUb')?.getAttribute('aria-label') || tr.querySelector('td.mxowUb')?.textContent.trim() || ''; return `${d} ${t}`.trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "open_time_saturday",
            "selector": "(() => { const tr=[...ROW.querySelectorAll('table.eK4R0e tr')].find(r=>(r.querySelector('td:first-child')?.textContent||'').trim().toLowerCase().startsWith('saturday')); if(!tr) return ''; const d=tr.querySelector('td:first-child')?.textContent.trim() || 'Saturday'; const t=tr.querySelector('td.mxowUb')?.getAttribute('aria-label') || tr.querySelector('td.mxowUb')?.textContent.trim() || ''; return `${d} ${t}`.trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "open_time_sunday",
            "selector": "(() => { const tr=[...ROW.querySelectorAll('table.eK4R0e tr')].find(r=>(r.querySelector('td:first-child')?.textContent||'').trim().toLowerCase().startsWith('sunday')); if(!tr) return ''; const d=tr.querySelector('td:first-child')?.textContent.trim() || 'Sunday'; const t=tr.querySelector('td.mxowUb')?.getAttribute('aria-label') || tr.querySelector('td.mxowUb')?.textContent.trim() || ''; return `${d} ${t}`.trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "popular_times_0",
            "selector": "(() => { const a=[...ROW.querySelectorAll('.dpoVLd[aria-label]')].map(e=>e.getAttribute('aria-label')); return a.slice(0,18).join(' '); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "popular_times_1",
            "selector": "(() => { const a=[...ROW.querySelectorAll('.dpoVLd[aria-label]')].map(e=>e.getAttribute('aria-label')); return a.slice(18,36).join(' '); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "popular_times_2",
            "selector": "(() => { const a=[...ROW.querySelectorAll('.dpoVLd[aria-label]')].map(e=>e.getAttribute('aria-label')); return a.slice(36,54).join(' '); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "popular_times_3",
            "selector": "(() => { const a=[...ROW.querySelectorAll('.dpoVLd[aria-label]')].map(e=>e.getAttribute('aria-label')); return a.slice(54,72).join(' '); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "popular_times_4",
            "selector": "(() => { const a=[...ROW.querySelectorAll('.dpoVLd[aria-label]')].map(e=>e.getAttribute('aria-label')); return a.slice(72,90).join(' '); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "popular_times_5",
            "selector": "(() => { const a=[...ROW.querySelectorAll('.dpoVLd[aria-label]')].map(e=>e.getAttribute('aria-label')); return a.slice(90,108).join(' '); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "popular_times_6",
            "selector": "(() => { const a=[...ROW.querySelectorAll('.dpoVLd[aria-label]')].map(e=>e.getAttribute('aria-label')); return a.slice(108,126).join(' '); })()",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 2280,
      "position_y": 220,
      "config": {
        "color": "bg-[#8d8d8d]"
      }
    }
  ],
  "connections": [
    {
      "from_block_id": "set-window-size-1",
      "from_connector_id": "right",
      "to_block_id": "navigate-1",
      "to_connector_id": "left"
    },
    {
      "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": "wait-for-element-1",
      "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": "structured-export-1",
      "from_connector_id": "right",
      "to_block_id": "loop-continue-1",
      "to_connector_id": "left"
    }
  ],
  "canvas_elements": [
    {
      "id": "group-entry",
      "element_type": "group",
      "title": "Entry & Setup",
      "color": "#4589ff",
      "position_x": 48,
      "position_y": 116,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "set-window-size-1"
        ]
      }
    },
    {
      "id": "group-load",
      "element_type": "group",
      "title": "Page Load",
      "color": "#08bdba",
      "position_x": 408,
      "position_y": 116,
      "width": 1400,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "sleep-1",
          "wait-for-element-1"
        ]
      }
    },
    {
      "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": 2208,
      "position_y": 116,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Best-effort Google Maps place-details scraper equivalent to the Octoparse Google Maps Leads template. It extracts business/place details from configured Google Maps place URLs for a keyword/location result set. Navigation uses a multi-URL loop over known Google Maps place pages from the sample Apple/New York results; add more place URLs to navigate.urls to scrape more keyword results. Google Maps is dynamic and may throttle, show consent/CAPTCHA, or change obfuscated selectors.",
      "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 3 pages. Pair with loop-continue at the end of each iteration.",
      "color": "#ee5396",
      "position_x": 680,
      "position_y": 200,
      "width": 328,
      "height": 107,
      "z_index": 22,
      "data": {
        "block_id": "navigate-1"
      }
    },
    {
      "id": "note-block-structured-export-1",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Structured export with JS columns (keyword, title, reviews, review_points, address). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 2120,
      "position_y": 200,
      "width": 340,
      "height": 129,
      "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": 2480,
      "position_y": 200,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}