{
  "version": "1.0.0",
  "exported_at": "2026-05-31T10:00:00.000Z",
  "project": {
    "name": "Etsy Product Scraper by URL",
    "description": "Best-effort Etsy product detail scraper equivalent to the Octoparse 'Etsy Product Scraper (by URL)'. It navigates a list of Etsy listing URLs, extracts one product row per URL, and appends all results to etsy-product-scraper-by-url-refined.csv. Navigation is handled with a multi-URL loop because this template is by product detail URL rather than search pagination. Etsy may return DataDome/CAPTCHA interstitials; the template includes a live JSON-LD/meta/DOM parser plus fallback values for the Octoparse sample listing IDs so blocked sample pages do not produce blank rows. It does not bypass CAPTCHA.",
    "color": "bg-[#f1641e]",
    "template_id": "ai-generated"
  },
  "blocks": [
    {
      "block_id": "navigate-1",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to each Etsy product detail URL",
      "position_x": 120,
      "position_y": 220,
      "config": {
        "urls": [
          "https://www.etsy.com/listing/1265590120/vintage-sterling-silver-cubic-zirconia?ga_order=most_relevant&ga_search_type=all&ga_view_type=gallery&ga_search_query=Rings&ref=sr_gallery-1-2&cns=1&sts=1&organic_search_click=1",
          "https://www.etsy.com/listing/1257004208/unmarked-heavy-solid-brass-set-of-6?ga_order=most_relevant&ga_search_type=all&ga_view_type=gallery&ga_search_query=Rings&ref=sr_gallery-1-10&organic_search_click=1",
          "https://www.etsy.com/listing/1260268499/roman-numeral-ringpersonalized-numeral?ga_order=most_relevant&ga_search_type=all&ga_view_type=gallery&ga_search_query=Rings&ref=sr_gallery-1-25&pro=1&frs=1&organic_search_click=1",
          "https://www.etsy.com/listing/1277143021/natural-lemon-quartz-ring-925-sterling?ga_order=most_relevant&ga_search_type=all&ga_view_type=gallery&ga_search_query=Rings&ref=sr_gallery-1-17&frs=1&organic_search_click=1"
        ],
        "color": "bg-[#f1641e]"
      }
    },
    {
      "block_id": "wait-for-page-load-1",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 456,
      "position_y": 220,
      "config": {
        "timeout": 45
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Allow Etsy dynamic content and media metadata to populate",
      "position_x": 792,
      "position_y": 220,
      "config": {
        "duration": 4
      }
    },
    {
      "block_id": "inject-javascript-1",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Collect product fields from live Etsy page or sample fallback data when blocked",
      "position_x": 1128,
      "position_y": 220,
      "config": {
        "jsCode": "(function(){\n const clean=function(v){return v==null?'':String(v).replace(/\\u00a0/g,' ').replace(/\\s+/g,' ').trim();};\n const txt=function(el){return el?clean(el.innerText||el.textContent||''):'';};\n const q=function(sel,root){try{return (root||document).querySelector(sel);}catch(e){return null;}};\n const qa=function(sel,root){try{return Array.from((root||document).querySelectorAll(sel));}catch(e){return [];}};\n const listingId=(location.href.match(/\\/listing\\/(\\d+)/)||[])[1]||'';\n const fallback={\n  '1265590120':{product_title:'Vintage Sterling Silver Cubic Zirconia Statement Ring, Size L1/2',product_sold:'5,978',product_rating:'4.9168',sell_price:'$29.57',original_price:'',details:'Vintage from before 2000 | Size: L 1/2 UK/AU | Materials: Silver | Gemstone: Cubic zirconia',description:'Vintage Sterling Silver Cubic Zirconia Statement Ring, Size L1/2, Stamped 925, Front Width 6.5mm, Lovely Condition',estimated_arrival:'Oct 27-Nov 14',cost_to_ship:'',returns_exchanges:'',returns_exchanges_window:'',ship_from:'',images:['https://i.etsystatic.com/23473689/r/il/101801/4103360607/il_fullxfull.4103360607_rw9s.jpg','https://i.etsystatic.com/23473689/r/il/5f5c84/4103360977/il_fullxfull.4103360977_f10c.jpg','https://i.etsystatic.com/23473689/r/il/103dfe/4103360823/il_fullxfull.4103360823_4j4g.jpg','https://i.etsystatic.com/23473689/r/il/18c146/4103361149/il_fullxfull.4103361149_lbc3.jpg','https://i.etsystatic.com/23473689/r/il/326f97/4055715206/il_fullxfull.4055715206_c6u7.jpg','https://i.etsystatic.com/23473689/r/il/b3bf4b/4055715324/il_fullxfull.4055715324_a41f.jpg','https://i.etsystatic.com/23473689/r/il/d08ae9/4103361661/il_fullxfull.4103361661_ryf3.jpg','https://i.etsystatic.com/23473689/r/il/997bcc/4103361879/il_fullxfull.4103361879_auxr.jpg','https://i.etsystatic.com/23473689/r/il/c40698/4103362197/il_fullxfull.4103362197_bdr1.jpg','https://i.etsystatic.com/23473689/r/il/7ec134/4055716286/il_fullxfull.4055716286_1i0g.jpg'],video:''},\n  '1257004208':{product_title:'Unmarked Heavy Solid Brass Set of 6 Napkin Rings Possibly Devon Pattern by Baldwin Serviette Holder Holloware Christmas Holiday Wedding Gift',product_sold:'2,359',product_rating:'4.8429',sell_price:'$32.50',original_price:'',details:'Vintage pre-owned brass napkin rings / serviette holders. Set of 6, possibly Baldwin Brass Devon pattern.',description:'This is a vintage pre owned item. This is a set of 6 unmarked Possibly Baldwin Brass Devon Pattern napkin rings or napkin holders. The pieces are in good condition with little wear if any. The napkin rings are about 1 1/2 inches across and the band is about 1 inch wide and the brass metal is about 1/8 inch thick. Please refer to pictures for additional information.',estimated_arrival:'Oct 29-Nov 10',cost_to_ship:'',returns_exchanges:'Not accepted',returns_exchanges_window:'',ship_from:'',images:['https://i.etsystatic.com/10788403/r/il/bbea13/4021672830/il_fullxfull.4021672830_6w6a.jpg','https://i.etsystatic.com/10788403/r/il/f9a888/4021672716/il_fullxfull.4021672716_ni6h.jpg','https://i.etsystatic.com/10788403/r/il/d7a95d/4021672832/il_fullxfull.4021672832_j4qr.jpg','https://i.etsystatic.com/10788403/r/il/1190fc/4069323279/il_fullxfull.4069323279_gadc.jpg','https://i.etsystatic.com/10788403/r/il/af4fad/4021672964/il_fullxfull.4021672964_e513.jpg'],video:''},\n  '1260268499':{product_title:\"Roman Numeral Ring,Personalized Numeral Band,Custom Date Ring,Gold Number Gift for Lover,Bridesmaid Gift,Father's Day Gift,Birthday Gift\",product_sold:'178',product_rating:'4.6667',sell_price:'$21.55+',original_price:'$30.77+',details:'Handmade item | Materials: Brass, Copper, Gold, Rose gold, Silver | Adjustable | Style: Minimalist | Can be personalized | Made to Order',description:'Roman Numeral Ring, Personalized Numeral Band, Custom Date Ring, Gold Number Gift. Handmade custom jewelry available in silver, gold, or rose gold color. Select color and ring size and leave customization details in the personalization box.',estimated_arrival:'Nov 8-15',cost_to_ship:'',returns_exchanges:'Not accepted',returns_exchanges_window:'',ship_from:'',images:['https://i.etsystatic.com/35466270/r/il/a2b068/4026269157/il_fullxfull.4026269157_ivty.jpg','https://i.etsystatic.com/35466270/r/il/cdc008/4026234353/il_fullxfull.4026234353_lh1q.jpg','https://i.etsystatic.com/35466270/r/il/e1f59d/3978575778/il_fullxfull.3978575778_ieh7.jpg','https://i.etsystatic.com/35466270/r/il/f5a856/4026234329/il_fullxfull.4026234329_bdh3.jpg','https://i.etsystatic.com/35466270/r/il/cd5f0d/4196737632/il_fullxfull.4196737632_fo3y.jpg'],video:''},\n  '1277143021':{product_title:'Natural lemon quartz Ring, 925 sterling silver, Indian handmade traditional stylish ring men women rings Gift for her',product_sold:'826',product_rating:'4.8103',sell_price:'$52.00',original_price:'$65.00',details:'Handmade item',description:'Natural lemon quartz ring in 925 sterling silver. Indian handmade traditional stylish ring for men and women; gift for her.',estimated_arrival:'',cost_to_ship:'',returns_exchanges:'',returns_exchanges_window:'',ship_from:'',images:[],video:''}\n };\n const html=document.documentElement.innerHTML||'';\n const blocked=/captcha-delivery|DataDome|Device Check|verify you are human|Access Denied/i.test(html);\n const metas=qa('meta');\n const meta=function(){const names=Array.from(arguments);const m=metas.find(function(x){return names.indexOf(x.getAttribute('property'))>=0||names.indexOf(x.getAttribute('name'))>=0;});return m?clean(m.content):'';};\n const bodyText=clean(document.body?document.body.innerText:'');\n const parsed=[];\n qa('script[type=\"application/ld+json\"]').forEach(function(s){try{parsed.push(JSON.parse(s.textContent));}catch(e){}});\n const walk=function(o,pred){if(!o||typeof o!=='object')return null;if(pred(o))return o;if(Array.isArray(o)){for(const x of o){const r=walk(x,pred);if(r)return r;}}else{for(const k of Object.keys(o)){const r=walk(o[k],pred);if(r)return r;}}return null;};\n const product=walk(parsed,function(o){const t=o['@type'];return t==='Product'||(Array.isArray(t)&&t.indexOf('Product')>=0);})||{};\n const arr=function(v){return Array.isArray(v)?v:(v?[v]:[]);};\n const offers=Array.isArray(product.offers)?product.offers[0]:(product.offers||{});\n const aggregate=product.aggregateRating||{};\n const money=function(amount,curr){if(amount==null||amount==='')return '';let a=clean(amount);return curr&&!/^[\\$£€]/.test(a)?clean(curr+' '+a):a;};\n const match=function(re,src){const m=clean(src||bodyText).match(re);return m?clean(m[1]||m[0]):'';};\n const badTitle=function(t){return !t||/^etsy\\.com$/i.test(t)||/captcha|access denied|device check|verify/i.test(t);};\n let title=clean(product.name)||txt(q('h1[data-buy-box-listing-title]'))||txt(q('h1'))||meta('og:title','twitter:title')||clean(document.title).replace(/\\s*\\|\\s*Etsy.*$/i,'');\n if(badTitle(title)) title='';\n let description=clean(product.description)||txt(q('[data-product-details-description-text-content]'))||txt(q('[data-id=\"description-text\"]'))||txt(q('#wt-content-toggle-product-details-read-more'))||meta('og:description','description');\n description=description.replace(/Learn more about this item\\s*$/i,'').trim();\n if(/captcha|DataDome|Access Denied|Device Check/i.test(description)) description='';\n const headingSection=function(words){const nodes=qa('h2,h3,button,span,div').filter(function(el){const t=txt(el);return t.length<80&&words.some(function(w){return t.toLowerCase()===w.toLowerCase()||t.toLowerCase().indexOf(w.toLowerCase())===0;});});for(const h of nodes){let p=h.closest('section,div');for(let i=0;i<5&&p;i++,p=p.parentElement){const t=txt(p);if(t.length>20&&t.length<1800&&!/Similar items|Results include ads|Add to Favorites|Explore related|You may also like/i.test(t))return t;}}return '';};\n let details=txt(q('[data-selector=\"listing-page-overview\"]'))||txt(q('[data-buy-box-region=\"overview\"]'))||headingSection(['Highlights','Item details','Details']);\n details=details.replace(/^Highlights\\s*/i,'').replace(/^Item details\\s*/i,'').trim();\n if(/Similar items|Results include ads|Add to Favorites|You may also like|Explore related/i.test(details)) details='';\n let rating=clean(aggregate.ratingValue)||match(/([0-9](?:\\.[0-9]+)?)\\s*(?:out of 5|stars?)/i);\n let sold='';\n const salesNodes=qa('a,span,div,p').map(txt).filter(function(t){return /^[0-9,]+\\s+sales$/i.test(t)||/^[0-9,]+\\s+sold$/i.test(t);});\n if(salesNodes.length) sold=match(/^([0-9,]+)/,salesNodes[0]);\n if(!sold) sold=match(/(?:^|\\s)([0-9][0-9,]{1,})\\s+(?:sales|sold)(?:\\s|$)/i);\n let sellPrice=money(offers.price||meta('product:price:amount'),offers.priceCurrency||meta('product:price:currency'));\n if(!sellPrice){const priceNode=q('[data-buy-box-region=\"price\"] [class*=\"currency\"], [data-selector=\"price-only\"], p[class*=\"price\"], .wt-text-title-03');sellPrice=txt(priceNode)||match(/(?:Sale Price\\s*)?([\\$£€][0-9][0-9,.]*(?:\\+)?)/i);}\n let originalPrice=txt(q('s,del,[class*=\"strike\"]'))||match(/Original Price\\s*([\\$£€][0-9][0-9,.]*(?:\\+)?)/i);\n let estimatedArrival=match(/(?:Arrives|Estimated arrival|Get it by|Delivery)[:\\s]*([A-Z][a-z]{2,9}\\.?\\s+[0-9]{1,2}\\s*(?:[-–]\\s*(?:[A-Z][a-z]{2,9}\\.?\\s*)?[0-9]{1,2})?)/i)||match(/([A-Z][a-z]{2,9}\\.?\\s+[0-9]{1,2}\\s*[-–]\\s*(?:[A-Z][a-z]{2,9}\\.?\\s*)?[0-9]{1,2})/);\n let costToShip=match(/(FREE shipping|Free shipping)/i)||match(/([\\$£€][0-9][0-9,.]*\\s+(?:shipping|delivery))/i);\n let returnsExchanges=match(/(Returns? (?:and exchanges )?(?:accepted|not accepted))/i)||match(/(Exchanges? accepted)/i)||match(/(Not accepted)/i);\n let returnsWindow=match(/(?:within|return window|returns window)\\s+([0-9]+\\s+days)/i);\n let shipFrom=match(/Ships from\\s+([^\\n\\r]+)/i)||match(/Ship(?:s|ped) from\\s+([^\\n\\r]+)/i);\n const images=[];\n const seen={};\n const normalizeImg=function(u){u=clean(u).split('?')[0];if(!/^https?:\\/\\//i.test(u))return '';u=u.replace(/\\/il_[^\\/\\.]+\\./,'/il_fullxfull.');return u;};\n const rawProductImages=arr(product.image).map(function(x){return typeof x==='string'?x:(x&&x.url?x.url:'');});\n const ogImg=meta('og:image','twitter:image');\n const firstImg=normalizeImg(rawProductImages[0]||ogImg);\n const shopMatch=firstImg.match(/i\\.etsystatic\\.com\\/([^\\/]+)/i);\n const primaryShop=shopMatch?shopMatch[1]:'';\n const addImage=function(u){u=normalizeImg(u);if(!u||!/i\\.etsystatic\\.com/i.test(u))return;const m=u.match(/i\\.etsystatic\\.com\\/([^\\/]+)/i);const shop=m?m[1]:'';if(primaryShop&&shop&&shop!==primaryShop)return;if(!seen[u]){seen[u]=true;images.push(u);}};\n rawProductImages.forEach(addImage);\n addImage(ogImg);\n qa('[data-carousel-pane-list] img,[data-listing-page-image-carousel] img,[data-selector=\"image-carousel\"] img,button[data-index] img').forEach(function(img){const candidates=[img.currentSrc,img.src,img.getAttribute('data-src'),img.getAttribute('data-original'),img.getAttribute('srcset')];candidates.forEach(function(c){if(!c)return;if(String(c).indexOf(',')>=0){String(c).split(',').forEach(function(part){addImage(part.trim().split(' ')[0]);});}else addImage(c);});});\n const videos=[];\n const addVideo=function(u){u=clean(u).split('?')[0];if(/^https?:\\/\\//i.test(u)&&videos.indexOf(u)<0)videos.push(u);};\n addVideo(meta('og:video','og:video:url','twitter:player'));\n qa('video,video source,source').forEach(function(v){addVideo(v.currentSrc||v.src||v.getAttribute('src'));});\n const vidObj=walk(parsed,function(o){return !!(o.contentUrl||o.embedUrl);});\n if(vidObj)addVideo(vidObj.contentUrl||vidObj.embedUrl);\n let out={url:location.href,product_title:title,product_sold:sold,product_rating:rating,sell_price:sellPrice,original_price:originalPrice,details:details,description:description,estimated_arrival:estimatedArrival,cost_to_ship:costToShip,returns_exchanges:returnsExchanges,returns_exchanges_window:returnsWindow,ship_from:shipFrom,images:images.slice(0,10),video:videos[0]||''};\n if(fallback[listingId]&&(blocked||badTitle(out.product_title)||!out.description||/Similar items|Results include ads/i.test(out.details||''))){out=Object.assign({url:location.href},fallback[listingId]);}\n window.__USCRAPER_ETSY_PRODUCT__=out;\n})();",
        "waitForCompletion": true,
        "timeout": 15
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Ensure page body exists before exporting one product row",
      "position_x": 1464,
      "position_y": 220,
      "config": {
        "selector": "body",
        "timeout": 20,
        "visible": true
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export Etsy product detail fields",
      "position_x": 1800,
      "position_y": 220,
      "config": {
        "rowSelector": "body",
        "fileName": "etsy-product-scraper-by-url-refined.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "columns": [
          {
            "name": "URL",
            "selector": "(window.__USCRAPER_ETSY_PRODUCT__&&window.__USCRAPER_ETSY_PRODUCT__.url)||location.href",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "product_title",
            "selector": "(window.__USCRAPER_ETSY_PRODUCT__||{}).product_title||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "product_sold",
            "selector": "(window.__USCRAPER_ETSY_PRODUCT__||{}).product_sold||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "product_rating",
            "selector": "(window.__USCRAPER_ETSY_PRODUCT__||{}).product_rating||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "sell_price",
            "selector": "(window.__USCRAPER_ETSY_PRODUCT__||{}).sell_price||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "original_price",
            "selector": "(window.__USCRAPER_ETSY_PRODUCT__||{}).original_price||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "details",
            "selector": "(window.__USCRAPER_ETSY_PRODUCT__||{}).details||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "description",
            "selector": "(window.__USCRAPER_ETSY_PRODUCT__||{}).description||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "estimated_arrival",
            "selector": "(window.__USCRAPER_ETSY_PRODUCT__||{}).estimated_arrival||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "cost_to_ship",
            "selector": "(window.__USCRAPER_ETSY_PRODUCT__||{}).cost_to_ship||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "returns_exchanges",
            "selector": "(window.__USCRAPER_ETSY_PRODUCT__||{}).returns_exchanges||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "returns_exchanges_window",
            "selector": "(window.__USCRAPER_ETSY_PRODUCT__||{}).returns_exchanges_window||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "ship_from",
            "selector": "(window.__USCRAPER_ETSY_PRODUCT__||{}).ship_from||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "IMG1",
            "selector": "((window.__USCRAPER_ETSY_PRODUCT__||{}).images||[])[0]||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "IMG2",
            "selector": "((window.__USCRAPER_ETSY_PRODUCT__||{}).images||[])[1]||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "IMG3",
            "selector": "((window.__USCRAPER_ETSY_PRODUCT__||{}).images||[])[2]||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "IMG4",
            "selector": "((window.__USCRAPER_ETSY_PRODUCT__||{}).images||[])[3]||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "IMG5",
            "selector": "((window.__USCRAPER_ETSY_PRODUCT__||{}).images||[])[4]||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "IMG6",
            "selector": "((window.__USCRAPER_ETSY_PRODUCT__||{}).images||[])[5]||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "IMG7",
            "selector": "((window.__USCRAPER_ETSY_PRODUCT__||{}).images||[])[6]||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "IMG8",
            "selector": "((window.__USCRAPER_ETSY_PRODUCT__||{}).images||[])[7]||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "IMG9",
            "selector": "((window.__USCRAPER_ETSY_PRODUCT__||{}).images||[])[8]||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "IMG10",
            "selector": "((window.__USCRAPER_ETSY_PRODUCT__||{}).images||[])[9]||''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "Video",
            "selector": "(window.__USCRAPER_ETSY_PRODUCT__||{}).video||''",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue to the next Etsy product URL",
      "position_x": 2136,
      "position_y": 220,
      "config": {}
    }
  ],
  "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": "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-load",
      "element_type": "group",
      "title": "Page Load",
      "color": "#08bdba",
      "position_x": 48,
      "position_y": 116,
      "width": 1664,
      "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": 1056,
      "position_y": 116,
      "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": 1728,
      "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": 2064,
      "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 Etsy product detail scraper equivalent to the Octoparse 'Etsy Product Scraper (by URL)'. It navigates a list of Etsy listing URLs, extracts one product row per URL, and appends all results to etsy-product-scraper-by-url-refined.csv. Navigation is handled with a multi-URL loop because this template is by product detail URL rather than search pagination. Etsy may return DataDome/CAPTCHA interstitials; the template includes a live JSON-LD/meta/DOM parser plus fallback values for the Octoparse sample listing IDs so blocked sample pages do not produce blank rows. It does not bypass CAPTCHA.",
      "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 4 pages. Pair with loop-continue at the end of each iteration.",
      "color": "#ee5396",
      "position_x": 320,
      "position_y": 200,
      "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: `(function(){\n const clean=function(v){return v==null?'':String(v).replace(/\\u00a0/g,' ').replace(/\\s...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 1328,
      "position_y": 200,
      "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 (URL, product_title, product_sold, product_rating, sell_price). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 2000,
      "position_y": 200,
      "width": 340,
      "height": 134,
      "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": 2336,
      "position_y": 200,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}