{
  "version": "1.0.0",
  "exported_at": "2026-06-03T10:00:00.000Z",
  "project": {
    "name": "YouTube Channel Scraper Free",
    "description": "Scrapes public YouTube channel Videos pages such as https://www.youtube.com/@FoxNews/videos. Extracts channel name, subscriber count, handle, total video count, video titles, video URLs, thumbnail URLs, durations, view counts, and publish dates/ages. YouTube channel pages use infinite scroll; this template uses a bounded scroll-loading sequence before export to avoid infinite loops caused by persistent continuation elements. Before export it injects JavaScript to normalize metadata from YouTube video-card DOM, aria-labels, and ytInitialData/richGridMediaRenderer structures. Best-effort only: YouTube may show bot/CAPTCHA/login checks, listing pages often show relative publish dates, and very large channels may require duplicating scroll blocks to load deeper history.",
    "color": "bg-[#ff0000]",
    "template_id": "ai-generated"
  },
  "blocks": [
    {
      "block_id": "navigate-1",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to a URL",
      "position_x": 120,
      "position_y": 180,
      "config": {
        "url": "https://www.youtube.com/@FoxNews/videos",
        "color": "bg-[#ff0000]",
        "tags": [
          "youtube",
          "channel",
          "videos"
        ]
      }
    },
    {
      "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": 180,
      "config": {
        "timeout": 45
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 840,
      "position_y": 180,
      "config": {
        "selector": "ytd-rich-item-renderer, ytd-grid-video-renderer",
        "timeout": 60,
        "visible": true
      }
    },
    {
      "block_id": "scroll-1",
      "block_type": "process",
      "title": "Scroll",
      "description": "Scroll the page",
      "position_x": 1200,
      "position_y": 180,
      "config": {
        "direction": "down",
        "amount": 3000
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1560,
      "position_y": 180,
      "config": {
        "duration": 2
      }
    },
    {
      "block_id": "scroll-2",
      "block_type": "process",
      "title": "Scroll",
      "description": "Scroll the page",
      "position_x": 1920,
      "position_y": 180,
      "config": {
        "direction": "down",
        "amount": 3000
      }
    },
    {
      "block_id": "sleep-2",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 2280,
      "position_y": 180,
      "config": {
        "duration": 2
      }
    },
    {
      "block_id": "scroll-3",
      "block_type": "process",
      "title": "Scroll",
      "description": "Scroll the page",
      "position_x": 2640,
      "position_y": 180,
      "config": {
        "direction": "down",
        "amount": 3000
      }
    },
    {
      "block_id": "sleep-3",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 3000,
      "position_y": 460,
      "config": {
        "duration": 2
      }
    },
    {
      "block_id": "scroll-4",
      "block_type": "process",
      "title": "Scroll",
      "description": "Scroll the page",
      "position_x": 3336,
      "position_y": 420,
      "config": {
        "direction": "down",
        "amount": 3000
      }
    },
    {
      "block_id": "sleep-4",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 3672,
      "position_y": 420,
      "config": {
        "duration": 2
      }
    },
    {
      "block_id": "scroll-5",
      "block_type": "process",
      "title": "Scroll",
      "description": "Scroll the page",
      "position_x": 4008,
      "position_y": 420,
      "config": {
        "direction": "down",
        "amount": 3000
      }
    },
    {
      "block_id": "sleep-5",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 4344,
      "position_y": 420,
      "config": {
        "duration": 2
      }
    },
    {
      "block_id": "scroll-6",
      "block_type": "process",
      "title": "Scroll",
      "description": "Scroll the page",
      "position_x": 4680,
      "position_y": 420,
      "config": {
        "direction": "down",
        "amount": 3000
      }
    },
    {
      "block_id": "sleep-6",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 3000,
      "position_y": 700,
      "config": {
        "duration": 2
      }
    },
    {
      "block_id": "scroll-7",
      "block_type": "process",
      "title": "Scroll",
      "description": "Scroll the page",
      "position_x": 3336,
      "position_y": 660,
      "config": {
        "direction": "down",
        "amount": 3000
      }
    },
    {
      "block_id": "sleep-7",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 3672,
      "position_y": 660,
      "config": {
        "duration": 2
      }
    },
    {
      "block_id": "scroll-8",
      "block_type": "process",
      "title": "Scroll",
      "description": "Scroll the page",
      "position_x": 4008,
      "position_y": 660,
      "config": {
        "direction": "down",
        "amount": 3000
      }
    },
    {
      "block_id": "sleep-8",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 4344,
      "position_y": 660,
      "config": {
        "duration": 2
      }
    },
    {
      "block_id": "scroll-9",
      "block_type": "process",
      "title": "Scroll",
      "description": "Scroll the page",
      "position_x": 4680,
      "position_y": 660,
      "config": {
        "direction": "down",
        "amount": 3000
      }
    },
    {
      "block_id": "sleep-9",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 5016,
      "position_y": 660,
      "config": {
        "duration": 2
      }
    },
    {
      "block_id": "inject-javascript-1",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Run custom JavaScript on the page",
      "position_x": 5352,
      "position_y": 660,
      "config": {
        "jsCode": "(function(){function clean(s){return(s||'').toString().replace(/\\s+/g,' ').trim();}function text(x){if(!x)return '';if(typeof x==='string')return clean(x);if(typeof x.content==='string')return clean(x.content);if(typeof x.simpleText==='string')return clean(x.simpleText);if(x.runs)return clean(x.runs.map(function(r){return r.text||r.content||'';}).join(''));if(x.accessibility&&x.accessibility.accessibilityData&&x.accessibility.accessibilityData.label)return clean(x.accessibility.accessibilityData.label);if(x.accessibilityData&&x.accessibilityData.label)return clean(x.accessibilityData.label);return '';}function thumb(x){try{var a=(x&&x.thumbnails)||(x&&x.sources)||(x&&x.image&&x.image.sources)||[];return a.length?(a[a.length-1].url||''):'';}catch(e){return '';}}function durationFrom(s){s=clean(s);var c=s.match(/\\b\\d{1,2}:\\d{2}(?::\\d{2})?\\b/);if(c)return c[0];var p=s.match(/(?:(\\d+)\\s+hours?,?\\s*)?(?:(\\d+)\\s+minutes?,?\\s*)?(\\d+)\\s+seconds?/i);if(p){var h=parseInt(p[1]||'0',10),m=parseInt(p[2]||'0',10),sec=parseInt(p[3]||'0',10);return h>0?h+':'+String(m).padStart(2,'0')+':'+String(sec).padStart(2,'0'):m+':'+String(sec).padStart(2,'0');}return '';}function isDurationOnly(s){s=clean(s);return /^\\d{1,2}:\\d{2}(?::\\d{2})?$/.test(s)||/^(?:(\\d+)\\s+hours?,?\\s*)?(?:(\\d+)\\s+minutes?,?\\s*)?(\\d+)\\s+seconds?$/i.test(s);}function idFromHref(h){var m=(h||'').match(/[?&]v=([^&]+)/);return m?m[1]:'';}function titleFromLabel(label){label=clean(label);if(!label)return '';label=label.replace(/\\s+(?:(?:\\d+\\s+hours?,?\\s*)?(?:\\d+\\s+minutes?,?\\s*)?\\d+\\s+seconds?)\\s*$/i,'').trim();label=label.replace(/\\s+\\d{1,2}:\\d{2}(?::\\d{2})?\\s*$/,'').trim();var m=label.match(/^(.+?)\\s+by\\s+.+?\\s+(?:[\\d,.]+\\s*[KMB]?\\s+views?|No views)\\b/i);if(m)return clean(m[1]);m=label.match(/^(.+?)\\s+(?:[\\d,.]+\\s*[KMB]?\\s+views?|No views)\\b/i);if(m)return clean(m[1]);return isDurationOnly(label)?'':label;}var map={};function merge(id,obj){if(!id)return;map[id]=map[id]||{};Object.keys(obj||{}).forEach(function(k){if(obj[k]&&!map[id][k])map[id][k]=clean(obj[k]);});}function harvest(o){if(!o||typeof o!=='object')return;var id='';if(typeof o.videoId==='string')id=o.videoId;if(typeof o.contentId==='string'&&/^[A-Za-z0-9_-]{6,}$/.test(o.contentId))id=o.contentId;if(o.videoRenderer&&o.videoRenderer.videoId){var v=o.videoRenderer;merge(v.videoId,{title:text(v.title),duration:text(v.lengthText),views:text(v.viewCountText)||text(v.shortViewCountText),date:text(v.publishedTimeText),cover:thumb(v.thumbnail)});}if(o.gridVideoRenderer&&o.gridVideoRenderer.videoId){var g=o.gridVideoRenderer;merge(g.videoId,{title:text(g.title),duration:text(g.lengthText),views:text(g.viewCountText)||text(g.shortViewCountText),date:text(g.publishedTimeText),cover:thumb(g.thumbnail)});}if(o.richGridMediaRenderer&&o.richGridMediaRenderer.videoId){var r=o.richGridMediaRenderer;merge(r.videoId,{title:text(r.title),duration:text(r.lengthText),views:text(r.viewCountText)||text(r.shortViewCountText),date:text(r.publishedTimeText),cover:thumb(r.thumbnail)});}if(id){var blob='';try{blob=JSON.stringify(o).slice(0,25000);}catch(e){}var views=(blob.match(/\"(?:simpleText|content|text)\":\"([^\"]*(?:views?|No views)[^\"]*)\"/i)||[])[1]||'';var date=(blob.match(/\"(?:simpleText|content|text)\":\"([^\"]*(?:ago|Premiered|Streamed|\\d{4})[^\"]*)\"/i)||[])[1]||'';var dur=durationFrom(blob);merge(id,{title:text(o.title)||text(o.headline),duration:text(o.lengthText)||dur,views:text(o.viewCountText)||text(o.shortViewCountText)||views,date:text(o.publishedTimeText)||date,cover:thumb(o.thumbnail)||thumb(o.image)});}for(var k in o){try{harvest(o[k]);}catch(e){}}}try{harvest(window.ytInitialData);harvest(window.ytInitialPlayerResponse);}catch(e){}try{Array.from(document.scripts).forEach(function(sc){var m=(sc.textContent||'').match(/ytInitialData\\s*=\\s*(\\{.+?\\});/);if(m){try{harvest(JSON.parse(m[1]));}catch(e){}}});}catch(e){}Array.from(document.querySelectorAll('ytd-rich-item-renderer, ytd-grid-video-renderer')).forEach(function(row){var a=row.querySelector('a#video-title-link, a#video-title, h3 a[href*=\"/watch\"], a[href*=\"/watch\"][aria-label], a[href*=\"/watch\"]');var href=a?(a.href||a.getAttribute('href')||''):'';var id=idFromHref(href);var data=map[id]||{};var labels=Array.from(row.querySelectorAll('[aria-label]')).map(function(e){return e.getAttribute('aria-label')||'';}).filter(Boolean);var bestLabel=labels.find(function(l){return /views?|No views|ago|Premiered|Streamed/i.test(l)&&!isDurationOnly(l);})||labels.find(function(l){return !isDurationOnly(l);})||'';var visible=clean(row.innerText||'');var all=clean(labels.join(' ')+' '+visible);var titleEl=row.querySelector('a#video-title-link[title], a#video-title[title], h3 a[title], a#video-title-link, a#video-title, h3 a[href*=\"/watch\"]');var domTitle=clean(titleEl&&(titleEl.getAttribute('title')||titleEl.textContent));if(isDurationOnly(domTitle))domTitle='';var title=data.title||domTitle||titleFromLabel(bestLabel)||titleFromLabel(all);var spans=Array.from(row.querySelectorAll('#metadata-line span, ytd-video-meta-block span, .yt-content-metadata-view-model-wiz__metadata-text, .ytContentMetadataViewModelMetadataText, span')).map(function(s){return clean(s.textContent);}).filter(Boolean);var v1=spans.find(function(t){return /views?|No views/i.test(t);})||'';var d1=spans.find(function(t){return /ago|Premiered|Streamed|scheduled|\\d{4}/i.test(t)&&!/views?/i.test(t);})||'';var v2=(all.match(/([\\d,.]+\\s*[KMB]?\\s+views?|No views)/i)||[])[1]||'';var d2=(all.match(/((?:Streamed|Premiered)?\\s*\\d+\\s+(?:seconds?|minutes?|hours?|days?|weeks?|months?|years?)\\s+ago|\\d{4}[/-]\\d{1,2}[/-]\\d{1,2}|[A-Z][a-z]{2}\\s+\\d{1,2},\\s+\\d{4})/i)||[])[1]||'';var overlay=row.querySelector('ytd-thumbnail-overlay-time-status-renderer, .badge-shape-wiz__text, [class*=\"badge-shape\"]');var dur=durationFrom(clean(overlay&&overlay.textContent)||data.duration||all);var img=row.querySelector('ytd-thumbnail img, img');var cover=(img&&(img.currentSrc||img.src||img.getAttribute('data-thumb')))||data.cover||'';if((!cover||cover.indexOf('data:')===0)&&id)cover='https://i.ytimg.com/vi/'+id+'/hqdefault.jpg';row.setAttribute('data-us-title',title||'');row.setAttribute('data-us-duration',dur||'');row.setAttribute('data-us-view-count',v1||data.views||v2||'');row.setAttribute('data-us-date',d1||data.date||d2||'');row.setAttribute('data-us-cover-url',cover||'');});})();",
        "waitForCompletion": true,
        "timeout": 20
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 5688,
      "position_y": 660,
      "config": {
        "rowSelector": "ytd-rich-item-renderer, ytd-grid-video-renderer",
        "fileName": "youtube-channel-scraper-free.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "create",
        "columns": [
          {
            "name": "channel_name",
            "selector": "(() => { const meta = document.querySelector('meta[property=\"og:title\"], meta[name=\"title\"]'); const h = document.querySelector('yt-page-header-renderer h1, ytd-c4-tabbed-header-renderer #channel-title, ytd-channel-name #text, #channel-name #text, h1'); let value = (meta && meta.content) || (h && h.textContent) || ''; return value.replace(/\\s*-\\s*YouTube\\s*$/i, '').trim(); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "subscriber_count",
            "selector": "(() => { const header = document.querySelector('yt-page-header-renderer, ytd-c4-tabbed-header-renderer, #page-header') || document; const direct = document.querySelector('#subscriber-count'); const text = ((direct && direct.textContent) || header.innerText || '').replace(/\\s+/g, ' '); const match = text.match(/[\\d.,]+\\s*[KMB]?\\s+subscribers/i); return match ? match[0].trim() : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "channel_handle",
            "selector": "(() => { const header = document.querySelector('yt-page-header-renderer, ytd-c4-tabbed-header-renderer, #page-header') || document; const text = (header.innerText || '').replace(/\\s+/g, ' '); const match = text.match(/@[A-Za-z0-9._-]+/); return match ? match[0] : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "video_count",
            "selector": "(() => { const header = document.querySelector('yt-page-header-renderer, ytd-c4-tabbed-header-renderer, #page-header') || document; const direct = document.querySelector('#videos-count'); const text = ((direct && direct.textContent) || header.innerText || '').replace(/\\s+/g, ' '); const match = text.match(/[\\d.,]+\\s*[KMB]?\\s+videos/i); return match ? match[0].trim() : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "channel_url",
            "selector": "(() => { const canonical = document.querySelector('link[rel=\"canonical\"]'); return (canonical && canonical.href) || location.href.replace(/\\/videos.*$/i, ''); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "title",
            "selector": "ROW.getAttribute('data-us-title') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "video_url",
            "selector": "(() => { const a = ROW.querySelector('a#video-title-link, a#video-title, h3 a[href*=\"/watch\"], a[href*=\"/watch\"]'); const href = a ? (a.href || a.getAttribute('href') || '') : ''; return href ? new URL(href, location.origin).href : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "cover_url",
            "selector": "(() => { const normalized = ROW.getAttribute('data-us-cover-url') || ''; if (normalized) return normalized; const a = ROW.querySelector('a#video-title-link, a#video-title, h3 a[href*=\"/watch\"], a[href*=\"/watch\"]'); const href = a ? (a.href || a.getAttribute('href') || '') : ''; const m = href.match(/[?&]v=([^&]+)/); return m ? ('https://i.ytimg.com/vi/' + m[1] + '/hqdefault.jpg') : ''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "duration",
            "selector": "ROW.getAttribute('data-us-duration') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "view_count",
            "selector": "ROW.getAttribute('data-us-view-count') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "date",
            "selector": "ROW.getAttribute('data-us-date') || ''",
            "attribute": "text",
            "isJs": 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": "scroll-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "scroll-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": "scroll-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "scroll-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": "scroll-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "scroll-3",
      "from_connector_id": "right",
      "to_block_id": "sleep-3",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-3",
      "from_connector_id": "right",
      "to_block_id": "scroll-4",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "scroll-4",
      "from_connector_id": "right",
      "to_block_id": "sleep-4",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-4",
      "from_connector_id": "right",
      "to_block_id": "scroll-5",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "scroll-5",
      "from_connector_id": "right",
      "to_block_id": "sleep-5",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-5",
      "from_connector_id": "right",
      "to_block_id": "scroll-6",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "scroll-6",
      "from_connector_id": "right",
      "to_block_id": "sleep-6",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-6",
      "from_connector_id": "right",
      "to_block_id": "scroll-7",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "scroll-7",
      "from_connector_id": "right",
      "to_block_id": "sleep-7",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-7",
      "from_connector_id": "right",
      "to_block_id": "scroll-8",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "scroll-8",
      "from_connector_id": "right",
      "to_block_id": "sleep-8",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-8",
      "from_connector_id": "right",
      "to_block_id": "scroll-9",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "scroll-9",
      "from_connector_id": "right",
      "to_block_id": "sleep-9",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-9",
      "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": "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": 76,
      "width": 5216,
      "height": 816,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "wait-for-element-1",
          "sleep-1",
          "sleep-2",
          "sleep-3",
          "sleep-4",
          "sleep-5",
          "sleep-6",
          "sleep-7",
          "sleep-8",
          "sleep-9"
        ]
      }
    },
    {
      "id": "group-interaction",
      "element_type": "group",
      "title": "Interaction",
      "color": "#a56eff",
      "position_x": 1128,
      "position_y": 76,
      "width": 4472,
      "height": 776,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "scroll-1",
          "scroll-2",
          "scroll-3",
          "scroll-4",
          "scroll-5",
          "scroll-6",
          "scroll-7",
          "scroll-8",
          "scroll-9",
          "inject-javascript-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 5616,
      "position_y": 556,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Scrapes public YouTube channel Videos pages such as https://www.youtube.com/@FoxNews/videos. Extracts channel name, subscriber count, handle, total video count, video titles, video URLs, thumbnail URLs, durations, view counts, and publish dates/ages. YouTube channel pages use infinite scroll; this template uses a bounded scroll-loading sequence before export to avoid infinite loops caused by persistent continuation elements. Before export it injects JavaScript to normalize metadata from YouTube video-card DOM, aria-labels, and ytInitialData/richGridMediaRenderer structures. Best-effort only: YouTube may show bot/CAPTCHA/login checks, listing pages often show relative publish dates, and very large channels may require duplicating scroll blocks to load deeper history.",
      "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: `(function(){function clean(s){return(s||'').toString().replace(/\\s+/g,' ').trim();}function text(x){...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 5552,
      "position_y": 640,
      "width": 340,
      "height": 140,
      "z_index": 22,
      "data": {
        "block_id": "inject-javascript-1"
      }
    },
    {
      "id": "note-block-structured-export-1",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Structured export with JS columns (channel_name, subscriber_count, channel_handle, video_count, channel_url). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 5888,
      "position_y": 640,
      "width": 340,
      "height": 138,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-1"
      }
    }
  ]
}