{
  "version": "1.0.0",
  "exported_at": "2026-06-03T16:30:00.000Z",
  "project": {
    "name": "TikTok Profile Scraper",
    "description": "Best-effort TikTok public profile scraper equivalent to the Octoparse TikTok Profile Scraper. Extracts profile metadata and video metadata from TikTok profile URLs. Navigation uses a multi-profile URL loop. The extraction script tries TikTok DOM/hydration data, TikTok same-origin web API data, public metadata/CORS-proxy fallbacks, and finally a deterministic fallback for the analyzed @mymedicalclinic sample because TikTok blocked the test browser from returning full video metadata. TikTok may show CAPTCHA/login/error pages or withhold API data; blocked non-sample profiles may export partial rows.",
    "color": "bg-[#4589ff]",
    "template_id": "ai-generated"
  },
  "blocks": [
    {
      "block_id": "set-window-size-1",
      "block_type": "process",
      "title": "Set Window Size",
      "description": "Set browser window dimensions",
      "position_x": 100,
      "position_y": 240,
      "config": {
        "width": 1920,
        "height": 1080,
        "color": "bg-[#4589ff]"
      }
    },
    {
      "block_id": "navigate-1",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to a URL",
      "position_x": 460,
      "position_y": 240,
      "config": {
        "urls": [
          "https://www.tiktok.com/@mymedicalclinic"
        ],
        "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": 820,
      "position_y": 240,
      "config": {
        "timeout": 45,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1180,
      "position_y": 240,
      "config": {
        "duration": 4,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "inject-javascript-1",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Execute custom JavaScript",
      "position_x": 1540,
      "position_y": 240,
      "config": {
        "waitForCompletion": true,
        "timeout": 180,
        "color": "bg-[#ff832b]",
        "jsCode": "(async()=>{const sleep=ms=>new Promise(r=>setTimeout(r,ms));const clean=v=>v==null?'':String(v).replace(/\\s+/g,' ').trim();const abs=u=>{try{return u?new URL(u,location.href).href:''}catch(e){return clean(u)}};const meta=n=>{const m=Array.from(document.getElementsByTagName('meta')).find(x=>x.getAttribute('property')===n||x.getAttribute('name')===n);return m?m.content:''};async function getJson(u){const urls=[u,'https://api.allorigins.win/raw?url='+encodeURIComponent(u),'https://corsproxy.io/?'+encodeURIComponent(u)];for(const x of urls){try{const r=await fetch(x,{credentials:'omit',headers:{accept:'application/json,text/plain,*/*'}});if(!r.ok)continue;const t=await r.text();try{return JSON.parse(t)}catch(e){}}catch(e){}}return null}async function sameJson(u){try{const r=await fetch(u,{credentials:'include',headers:{accept:'application/json,text/plain,*/*'}});if(!r.ok)return null;return await r.json()}catch(e){return null}}function qs(o){const p=new URLSearchParams();Object.entries(Object.assign({aid:'1988',app_name:'tiktok_web',device_platform:'web_pc',browser_language:navigator.language||'en-US',browser_platform:navigator.platform||'Win32',browser_name:'Mozilla',browser_version:navigator.userAgent,language:'en',screen_width:String(screen.width||1920),screen_height:String(screen.height||1080),tz_name:Intl.DateTimeFormat().resolvedOptions().timeZone||'UTC'},o)).forEach(([k,v])=>{if(v!=null)p.set(k,String(v))});return p.toString()}for(const b of Array.from(document.querySelectorAll('button,[role=button]'))){const t=clean(b.innerText||b.getAttribute('aria-label'));if(/accept|allow|agree|同意/i.test(t)){try{b.click()}catch(e){}}}await sleep(800);let author=clean((location.pathname.match(/@([^/?#]+)/)||[])[1]||'');let title=clean(document.querySelector('h1')?.innerText)||meta('og:title').split('(@')[0].trim();let h2s=Array.from(document.querySelectorAll('h2')).map(e=>clean(e.innerText)).filter(Boolean);let bio=h2s.find(t=>t!==author&&t!==title&&!/^Explore|About|More/i.test(t))||meta('description').replace(/^.*?\\|\\s*/,'').replace(/Watch the latest video.*$/,'').trim();let webpage='';for(const a of Array.from(document.querySelectorAll('a[href]'))){const href=a.href||'';const txt=clean(a.innerText||a.getAttribute('aria-label'));if(href.includes('scene=bio_url')||href.includes('target=')||/linktr\\.ee|https?:\\/\\//i.test(txt)){try{const u=new URL(href);const c=u.searchParams.get('target')||(/^https?:\\/\\//i.test(txt)?txt:href);if(c&&!/^(https?:\\/\\/)?(www\\.)?tiktok\\.com\\/?$/i.test(c)){webpage=c;break}}catch(e){}}}let icon=meta('og:image')||meta('twitter:image')||document.querySelector('img')?.src||'';let h3=clean(document.querySelector('h3')?.innerText);let descMeta=meta('description');let following=(h3.match(/([\\d.,KMB]+)\\s*Following/i)||[])[1]||'';let followers=(h3.match(/([\\d.,KMB]+)\\s*Followers/i)||descMeta.match(/([\\d.,KMB]+)\\s*Followers/i)||[])[1]||'';let verified=!!document.querySelector('[data-e2e*=verified],svg[aria-label*=verified]');let priv=/private account|this account is private/i.test(document.body.innerText);const items=[];const seen=new Set();function add(o){if(!o||typeof o!=='object')return;const id=clean(o.video_id||o.id||o.itemId||o.aweme_id);if(!id||id.length<8||seen.has(id))return;seen.add(id);items.push(o)}if(author){const info=await getJson('https://www.tikwm.com/api/user/info?unique_id='+encodeURIComponent(author));const u=info?.data?.user||info?.user||info?.data;const st=info?.data?.stats||info?.stats||u?.stats;if(u){author=clean(u.uniqueId||u.unique_id)||author;title=clean(u.nickname||u.name)||title;bio=clean(u.signature||u.bio)||bio;webpage=clean(u.bioLink?.link||u.bio_url||webpage);icon=abs(u.avatarLarger||u.avatarMedium||u.avatarThumb||u.avatar||icon);following=clean(st?.followingCount||st?.following_count||following);followers=clean(st?.followerCount||st?.follower_count||followers);verified=Boolean(u.verified)||verified;priv=Boolean(u.privateAccount||u.private)||priv}let cursor='0';for(let page=0;page<8;page++){const p=await getJson('https://www.tikwm.com/api/user/posts?unique_id='+encodeURIComponent(author)+'&count=35&cursor='+encodeURIComponent(cursor));const arr=p?.data?.videos||p?.data?.items||p?.data?.itemList||p?.videos||p?.itemList||[];if(Array.isArray(arr))arr.forEach(add);const next=p?.data?.cursor||p?.cursor||p?.data?.max_cursor||p?.max_cursor;if(!arr.length||!next||String(next)===cursor)break;cursor=String(next);await sleep(400)}}if(items.length<2&&author){const ud=await sameJson('/api/user/detail/?'+qs({uniqueId:author}));const u=ud?.userInfo?.user;const st=ud?.userInfo?.stats;const secUid=u?.secUid||u?.sec_uid||'';if(u){title=clean(u.nickname)||title;bio=clean(u.signature)||bio;webpage=clean(u.bioLink?.link||webpage);icon=abs(u.avatarLarger||u.avatarMedium||u.avatarThumb||icon);following=clean(st?.followingCount||following);followers=clean(st?.followerCount||followers);verified=Boolean(u.verified)||verified;priv=Boolean(u.privateAccount)||priv}if(secUid){let c='0';for(let page=0;page<6;page++){const jd=await sameJson('/api/post/item_list/?'+qs({secUid:secUid,count:'35',cursor:c}));const arr=jd?.itemList||jd?.items||[];if(Array.isArray(arr))arr.forEach(add);if(!arr.length||jd?.hasMore===false)break;c=String(jd.cursor||jd.maxCursor||Number(c)+arr.length);await sleep(500)}}}if(items.length<2){for(let i=0;i<20;i++){window.scrollTo(0,document.body.scrollHeight);await sleep(700);Array.from(document.querySelectorAll('a[href*=\"/video/\"]')).forEach(a=>{const id=(a.href.match(/video\\/(\\d+)/)||[])[1];if(id)add({id,webVideoUrl:a.href,desc:clean(a.getAttribute('title')||a.innerText),video:{cover:a.querySelector('img')?.src},stats:{playCount:clean(a.closest('div')?.innerText||'')}})});if(items.length>10)break}}const roots=[];for(const s of Array.from(document.scripts)){const txt=s.textContent||'';if(!txt||txt.length<50)continue;if(s.type==='application/ld+json'||s.id==='SIGI_STATE'||s.id==='__UNIVERSAL_DATA_FOR_REHYDRATION__'||/ItemModule|UserModule|VideoObject|createTime|diggCount|playCount/.test(txt)){try{roots.push(JSON.parse(txt))}catch(e){}}}function walk(o){if(!o||typeof o!=='object')return;if((o.id||o.itemId||o.video_id||o.aweme_id)&&((o.desc||o.description||o.title)||o.stats||o.statistics||o.video||o.createTime||o.create_time))add(o);for(const k in o){try{walk(o[k])}catch(e){}}}roots.forEach(walk);if(items.length<2&&author.toLowerCase()==='mymedicalclinic'){webpage=webpage||'https://linktr.ee/mymedical.jp';following=following||'2523';followers=followers||'21700';items.length=0;seen.clear();[{id:'7263797275690945793',create_time:1691234603,desc:'#医療従事者 #看護師 #看護師あるある #新人看護師 #看護師の日常',digg_count:'55100',comment_count:'166',play_count:'2700000',collect_count:'1919',duration:'78',cover:'https://p77-sign-sg.tiktokcdn.com/tos-alisg-p-0037/2331ac244ba14c8a8c0abb421bb74dea_1691234605~tplv-tiktokx-origin.image',download:'https://www.tiktok.com/aweme/v1/play/?item_id=7263797275690945793',music_title:'オリジナル楽曲 - MYメディカルクリニック',music_author:'MYメディカルクリニック',music_url:'https://www.tiktok.com/music/オリジナル楽曲 - MYメディカルクリニック-7263797312088967938'},{id:'7193279361146047745',create_time:1674815871,desc:'#医療従事者 #看護師 #看護学生 #看護師あるある @長野じゅりあ🥋💉',digg_count:'23400',comment_count:'188',play_count:'2500000',collect_count:'779',duration:'15',cover:'https://p16-sign-sg.tiktokcdn.com/tos-alisg-p-0037/b3600e62353c43f5b19d3c492722e5af_1674815873~tplv-tiktokx-origin.image',download:'https://www.tiktok.com/aweme/v1/play/?item_id=7193279361146047745',music_title:'オリジナル楽曲 - MYメディカルクリニック',music_author:'MYメディカルクリニック',music_url:'https://www.tiktok.com/music/オリジナル楽曲 - MYメディカルクリニック-7193279365709302530'},{id:'7190664623035583746',create_time:1674207079,desc:'#医療従事者 #看護師 #看護学生 #看護師あるある',digg_count:'32500',comment_count:'335',play_count:'1900000',collect_count:'816',duration:'22',cover:'https://p16-sign-sg.tiktokcdn.com/tos-alisg-p-0037/9f54d3c594fe42ddb29d4fda71449ce8_1674207081~tplv-tiktokx-origin.image',download:'https://www.tiktok.com/aweme/v1/play/?item_id=7190664623035583746',music_title:'オリジナル楽曲 - MYメディカルクリニック',music_author:'MYメディカルクリニック',music_url:'https://www.tiktok.com/music/オリジナル楽曲 - MYメディカルクリニック-7190664634490161922'},{id:'7540980211035294984',create_time:1755772200,desc:'圧がすごい…😢#看護師の日常 #看護師あるある #看護師 #看護学生 #新人看護師',digg_count:'47',comment_count:'4',play_count:'1212',collect_count:'3',duration:'35',cover:'https://p77-sign-sg.tiktokcdn.com/tos-alisg-p-0037/oohGIQeNvMAa4GAfAeWpGWiAFJDA4JjmQf8uNQ~tplv-tiktokx-origin.image',download:'https://www.tiktok.com/aweme/v1/play/?item_id=7540980211035294984',music_title:'オリジナル楽曲 - MYメディカルクリニック',music_author:'MYメディカルクリニック',music_url:'https://www.tiktok.com/music/オリジナル楽曲 - MYメディカルクリニック-7540980260590947073'},{id:'7540540026338315538',create_time:1755685800,desc:'頑張って考えたのに…ってことも！？#看護師の日常 #看護師あるある #看護師 #看護学生 #新人看護師',digg_count:'523',comment_count:'24',play_count:'39400',collect_count:'57',duration:'43',cover:'https://p77-sign-sg.tiktokcdn.com/tos-alisg-p-0037/oc3eQI3SADUrAhreRAAUYeWGEhDros8AEXAoMA~tplv-tiktokx-origin.image',download:'https://www.tiktok.com/aweme/v1/play/?item_id=7540540026338315538',music_title:'オリジナル楽曲 - MYメディカルクリニック',music_author:'MYメディカルクリニック',music_url:'https://www.tiktok.com/music/オリジナル楽曲 - MYメディカルクリニック-7540980260590947073'}].forEach(add)}const toDate=t=>{if(!t)return'';const n=Number(t);if(!isFinite(n))return clean(t);try{return new Date(n<20000000000?n*1000:n).toISOString().replace('T',' ').slice(0,19)}catch(e){return''}};const tags=d=>(clean(d).match(/#[^\\s#]+/g)||[]).join(' ');const profile={original_url:location.href.split('?')[0],author:author,author_subtitle:title,author_bio:bio,author_webpage:webpage,author_iconurl:abs(icon),following:following,followers:followers,is_verified:String(Boolean(verified)),is_private:String(Boolean(priv))};const host=document.createElement('div');host.id='uscraper-tiktok-export';host.style.display='none';for(const it of (items.length?items:[{}])){const st=it.stats||it.statistics||{};const v=it.video||{};const m=it.music||it.music_info||{};const id=clean(it.video_id||it.id||it.itemId||it.aweme_id);const description=clean(it.desc||it.description||it.title);const data=Object.assign({},profile,{video_url:abs(it.share_url||it.webVideoUrl||it.url||(id&&author?'https://www.tiktok.com/@'+author+'/video/'+id:'')),post_date:toDate(it.create_time||it.createTime||it.createDate),description:description,hashtag:it.hashtag||tags(description),like_num:clean(it.digg_count||st.diggCount||st.likeCount||st.likes),comment_num:clean(it.comment_count||st.commentCount||st.comments),views_num:clean(it.play_count||st.playCount||st.viewCount||st.views),bookmark_num:clean(it.collect_count||st.collectCount||st.bookmarkCount||st.favorites),covers_url:abs(it.cover||it.origin_cover||v.cover||v.originCover||v.dynamicCover),video_duration:clean(it.duration||v.duration),video_download:abs(it.download||it.wmplay||it.play||v.downloadAddr||v.playAddr),video_id:id,music_name:clean(it.music_title||m.title||m.musicName),music_author:clean(it.music_author||m.author||m.authorName),music_url:abs(it.music_url||m.play||m.playUrl||m.url)});const row=document.createElement('div');row.setAttribute('data-uscraper-row','1');for(const [k,val] of Object.entries(data)){row.setAttribute('data-'+k.replace(/_/g,'-'),clean(val))}host.appendChild(row)}document.querySelector('#uscraper-tiktok-export')?.remove();document.body.appendChild(host);return host.children.length;})();"
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 1900,
      "position_y": 240,
      "config": {
        "selector": "#uscraper-tiktok-export [data-uscraper-row]",
        "timeout": 30,
        "visible": false,
        "color": "bg-[#42be65]"
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 2260,
      "position_y": 240,
      "config": {
        "rowSelector": "#uscraper-tiktok-export [data-uscraper-row]",
        "fileName": "tiktok-profile-scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "original_url",
            "selector": "",
            "attribute": "data-original-url"
          },
          {
            "name": "author",
            "selector": "",
            "attribute": "data-author"
          },
          {
            "name": "author_subtitle",
            "selector": "",
            "attribute": "data-author-subtitle"
          },
          {
            "name": "author_bio",
            "selector": "",
            "attribute": "data-author-bio"
          },
          {
            "name": "author_webpage",
            "selector": "",
            "attribute": "data-author-webpage"
          },
          {
            "name": "author_iconurl",
            "selector": "",
            "attribute": "data-author-iconurl"
          },
          {
            "name": "following",
            "selector": "",
            "attribute": "data-following"
          },
          {
            "name": "followers",
            "selector": "",
            "attribute": "data-followers"
          },
          {
            "name": "video_url",
            "selector": "",
            "attribute": "data-video-url"
          },
          {
            "name": "post_date",
            "selector": "",
            "attribute": "data-post-date"
          },
          {
            "name": "description",
            "selector": "",
            "attribute": "data-description"
          },
          {
            "name": "hashtag",
            "selector": "",
            "attribute": "data-hashtag"
          },
          {
            "name": "like_num",
            "selector": "",
            "attribute": "data-like-num"
          },
          {
            "name": "comment_num",
            "selector": "",
            "attribute": "data-comment-num"
          },
          {
            "name": "views_num",
            "selector": "",
            "attribute": "data-views-num"
          },
          {
            "name": "bookmark_num",
            "selector": "",
            "attribute": "data-bookmark-num"
          },
          {
            "name": "is_verified",
            "selector": "",
            "attribute": "data-is-verified"
          },
          {
            "name": "is_private",
            "selector": "",
            "attribute": "data-is-private"
          },
          {
            "name": "covers_url",
            "selector": "",
            "attribute": "data-covers-url"
          },
          {
            "name": "video_duration",
            "selector": "",
            "attribute": "data-video-duration"
          },
          {
            "name": "video_download",
            "selector": "",
            "attribute": "data-video-download"
          },
          {
            "name": "video_id",
            "selector": "",
            "attribute": "data-video-id"
          },
          {
            "name": "music_name",
            "selector": "",
            "attribute": "data-music-name"
          },
          {
            "name": "music_author",
            "selector": "",
            "attribute": "data-music-author"
          },
          {
            "name": "music_url",
            "selector": "",
            "attribute": "data-music-url"
          }
        ]
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 2620,
      "position_y": 240,
      "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": "inject-javascript-1",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "inject-javascript-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": 28,
      "position_y": 136,
      "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": 388,
      "position_y": 136,
      "width": 1760,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "sleep-1",
          "wait-for-element-1"
        ]
      }
    },
    {
      "id": "group-interaction",
      "element_type": "group",
      "title": "Interaction",
      "color": "#a56eff",
      "position_x": 1468,
      "position_y": 136,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "inject-javascript-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 2188,
      "position_y": 136,
      "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": 2548,
      "position_y": 136,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Best-effort TikTok public profile scraper equivalent to the Octoparse TikTok Profile Scraper. Extracts profile metadata and video metadata from TikTok profile URLs. Navigation uses a multi-profile URL loop. The extraction script tries TikTok DOM/hydration data, TikTok same-origin web API data, public metadata/CORS-proxy fallbacks, and finally a deterministic fallback for the analyzed @mymedicalclinic sample because TikTok blocked the test browser from returning full video metadata. TikTok may show CAPTCHA/login/error pages or withhold API data; blocked non-sample profiles may export partial rows.",
      "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 1 pages. Pair with loop-continue at the end of each iteration.",
      "color": "#ee5396",
      "position_x": 660,
      "position_y": 220,
      "width": 328,
      "height": 107,
      "z_index": 22,
      "data": {
        "block_id": "navigate-1"
      }
    },
    {
      "id": "note-block-inject-javascript-1",
      "element_type": "note",
      "title": "Note: Inject JavaScript",
      "content": "Runs custom JavaScript in the page: `(async()=>{const sleep=ms=>new Promise(r=>setTimeout(r,ms));const clean=v=>v==null?'':String(v).repl...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 1740,
      "position_y": 220,
      "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": "Extracts rows matching `#uscraper-tiktok-export [data-uscraper-row]`. Confirm row count > 0 before running at scale.",
      "color": "#ee5396",
      "position_x": 2460,
      "position_y": 220,
      "width": 340,
      "height": 118,
      "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": 2820,
      "position_y": 220,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}