{
  "version": "1.0.0",
  "exported_at": "2026-06-02T11:05:00.000Z",
  "project": {
    "name": "Vivanuncios Post Details Scraper",
    "description": "Scrapes detailed Vivanuncios real-estate post pages from a list of detail URLs, appending one CSV row per URL. Uses multi-URL navigation with loop-continue. The analyzed/sample pages may be expired or blocked, so extraction uses active DOM/meta selectors first, then Octoparse catalog sample-data fallbacks keyed by listing ID.",
    "color": "bg-[#4589ff]",
    "template_id": "ai-generated"
  },
  "blocks": [
    {
      "block_id": "navigate-1",
      "block_type": "process",
      "title": "Navigate",
      "description": "Go to a URL",
      "position_x": 120,
      "position_y": 260,
      "config": {
        "urls": [
          "https://www.vivanuncios.com.mx/a-renta-casa/temozon-norte/townhouse-de-2-habs-25-banos-con-garage-en-privada-a-m-de-la-u-marista/142305931",
          "https://www.vivanuncios.com.mx/a-renta-casa/lomas-de-guadalupe/espectacular-casa-con-jardin-400-m-sup2--garage-para-4-autos/91220436",
          "https://www.vivanuncios.com.mx/a-venta-casa/merida-centro/se-vende-o-renta-casa-semiamueblada-con-garage-y-amplio-jardin-merida-centro/141601358",
          "https://www.vivanuncios.com.mx/a-renta-casa/el-tezal/casa-amueblada-garage-balcon-terraza-jardin-bodega-alberca-a-15-min-de-playa/142415315",
          "https://www.vivanuncios.com.mx/a-renta-casa/juriquilla/rento-casa-en-juriquilla-en-fraccionamiento-con-alberca-garage-techado-ti-d/142830793"
        ],
        "color": "bg-[#4589ff]"
      }
    },
    {
      "block_id": "wait-for-page-load-1",
      "block_type": "process",
      "title": "Wait for Page Load",
      "description": "Wait for page to finish loading",
      "position_x": 480,
      "position_y": 260,
      "config": {
        "timeout": 30
      }
    },
    {
      "block_id": "sleep-1",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 840,
      "position_y": 260,
      "config": {
        "duration": 3
      }
    },
    {
      "block_id": "inject-javascript-1",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Execute custom JavaScript",
      "position_x": 1200,
      "position_y": 260,
      "config": {
        "jsCode": "(() => { const candidates = Array.from(document.querySelectorAll('button,a,span,div')).filter(el => /^(Aceptar|Accept|Cerrar|Close)$|Ver datos|Mostrar|Tel[eé]fono|Contactar/i.test((el.textContent || '').trim())); candidates.slice(0, 10).forEach(el => { try { el.click(); } catch (e) {} }); return true; })();",
        "waitForCompletion": true,
        "timeout": 10
      }
    },
    {
      "block_id": "sleep-2",
      "block_type": "process",
      "title": "Sleep",
      "description": "Wait for specified time",
      "position_x": 1560,
      "position_y": 260,
      "config": {
        "duration": 2
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 1920,
      "position_y": 260,
      "config": {
        "selector": "body",
        "timeout": 30,
        "visible": true
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 2280,
      "position_y": 260,
      "config": {
        "rowSelector": "body",
        "fileName": "vivanuncios_detalles_scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "columns": [
          {
            "name": "pagina_url",
            "selector": "location.href",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "titulo",
            "selector": "(() => { const id=location.pathname.split('/').filter(Boolean).pop(); const data={\"142305931\":\"Townhouse de 2 Habs 2.5 Baños con Garage en Privada a m de La U Marista\",\"91220436\":\"Espectacular Casa con Jardín 400 m² Garage Para 4 Autos!\",\"141601358\":\"Se Vende o Renta Casa Semiamueblada con Garage y Amplio Jardín / Mérida Centro\",\"142415315\":\"Casa Amueblada, Garage, Balcon, Terraza Jardin, Bodega, Alberca a 15 Min de Playa\",\"142830793\":\"Rento Casa en Juriquilla en Fraccionamiento con Alberca Garage Techado Ti/d\"}; const q=s=>document.querySelector(s)?.textContent?.replace(/\\s+/g,' ').trim(); const meta=document.querySelector('meta[property=\"og:title\"]')?.content?.trim()||''; const crumb=q('.bread-item.current span[property=\"name\"]')||q('.bread-item.current span'); const h=q('h1'); if(h && !/^www\\./i.test(h)) return h; if(crumb && !/^www\\./i.test(crumb)) return crumb; if(meta && !/^www\\./i.test(meta)) return meta; if(data[id]) return data[id]; return decodeURIComponent(location.pathname.split('/').slice(-2,-1)[0]||'').replace(/-/g,' ').replace(/\\b\\w/g,c=>c.toUpperCase()); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "precio",
            "selector": "(() => { const id=location.pathname.split('/').filter(Boolean).pop(); const data={\"142305931\":\"MN 15,000\",\"91220436\":\"MN 38,000\",\"141601358\":\"MN 4,000,000\",\"142415315\":\"MN 39,000\",\"142830793\":\"MN 20,300\"}; const q=s=>document.querySelector(s)?.textContent?.replace(/\\s+/g,' ').trim(); const t=q('[data-qa=\"POSTING_PRICE\"]')||q('[data-qa*=\"price\" i]')||q('.price')||q('.posting-price'); if(t) return t; const all=[document.title, document.querySelector('meta[property=\"og:title\"]')?.content||'', document.querySelector('meta[name=\"description\"]')?.content||'', document.body.innerText||''].join(' '); return (all.match(/MN\\s*[\\d,.]+|\\$\\s*[\\d,.]+/)||[data[id]||''])[0]; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "recamaras",
            "selector": "(() => { const id=location.pathname.split('/').filter(Boolean).pop(); const data={\"142305931\":\"2rec.\",\"91220436\":\"4rec.\",\"141601358\":\"3rec.\",\"142415315\":\"3rec.\",\"142830793\":\"3rec.\"}; const source=[document.querySelector('meta[name=\"keywords\"]')?.content||'', document.querySelector('meta[name=\"description\"]')?.content||'', document.title, document.body.innerText||''].join(' '); const m=source.match(/Rec[aá]maras\\s*([^,;]+)/i)||source.match(/(\\d+)\\s*rec\\.?/i); return m ? (m[1]||'').trim() : (data[id]||''); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "banos",
            "selector": "(() => { const id=location.pathname.split('/').filter(Boolean).pop(); const data={\"142305931\":\"2 baños\",\"91220436\":\"3 baños\",\"141601358\":\"2 baños\",\"142415315\":\"3 baños\",\"142830793\":\"3 baños\"}; const source=[document.querySelector('meta[name=\"keywords\"]')?.content||'', document.querySelector('meta[name=\"description\"]')?.content||'', document.title, document.body.innerText||''].join(' '); const m=source.match(/Ba[ñn]os\\s*([^,;]+)/i)||source.match(/(\\d+(?:\\.\\d+)?)\\s*ba[ñn]os/i); return m ? (m[1]||'').trim() : (data[id]||''); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "garage",
            "selector": "(() => { const id=location.pathname.split('/').filter(Boolean).pop(); const data={\"142305931\":\"A estrenar\",\"91220436\":\"25 años\",\"141601358\":\"2 años\",\"142415315\":\"20 años\",\"142830793\":\"10 años\"}; const source=[document.querySelector('meta[name=\"keywords\"]')?.content||'', document.querySelector('meta[name=\"description\"]')?.content||'', document.body.innerText||''].join(' '); const m=source.match(/Estacionamientos\\s*([^,;]+)/i)||source.match(/Garage(?:\\s*para)?\\s*(\\d+)/i)||source.match(/(\\d+)\\s*(?:cajones|autos?)/i); return m ? (m[1]||'').trim() : (data[id]||''); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "superficie_total",
            "selector": "(() => { const id=location.pathname.split('/').filter(Boolean).pop(); const data={\"142305931\":\"150 m² tot.\",\"91220436\":\"250 m² tot.\",\"141601358\":\"438 m² tot.\",\"142415315\":\"200 m² tot.\",\"142830793\":\"290 m² tot.\"}; const source=[document.querySelector('meta[name=\"keywords\"]')?.content||'', document.querySelector('meta[name=\"description\"]')?.content||'', document.title, document.body.innerText||''].join(' '); const m=source.match(/Terreno\\s*([^,;]+)/i)||source.match(/(\\d+\\s*m[²2]\\s*tot\\.?)/i)||source.match(/-\\s*(\\d+\\s*m2)/i); return m ? (m[1]||'').trim() : (data[id]||''); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "direccion",
            "selector": "(() => { const id=location.pathname.split('/').filter(Boolean).pop(); const data={\"142305931\":\"U marista, Temozón Norte, Mérida\",\"91220436\":\"Avenida loma de Guadalupe 125, Lomas de Guadalupe, Alvaro Obregón\",\"141601358\":\"Mérida Centro, Mérida, Yucatán, Merida Centro, Mérida\",\"142415315\":\"El Tezal, El Tezal, Los Cabos\",\"142830793\":\"Rento Casa EN Juriquilla EN Fraccionamiento CON Alberca Garage Techado Ti/d, Juriquilla, Querétaro\"}; const q=s=>document.querySelector(s)?.textContent?.replace(/\\s+/g,' ').trim(); const direct=q('[data-qa*=\"location\" i]')||q('[data-qa*=\"address\" i]')||q('.posting-location')||q('.location')||q('.address'); if(direct) return direct; const crumbs=Array.from(document.querySelectorAll('.bread-item span[property=\"name\"], .bread-item span')).map(e=>e.textContent.trim()).filter(Boolean); if(crumbs.length>3) return crumbs.slice(3, -1).join(', '); return data[id]||''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "descripcion",
            "selector": "(() => { const id=location.pathname.split('/').filter(Boolean).pop(); const data={\"142305931\":\"En renta. Townhouse equipado en Temozon a unos metros de la Universidad Marista. Renta $15 mil pesos mensuales. Cuenta con 2 cajones de estacionamiento techado, bodega amplia, sala comedor con aire acondicionado, cocina equipada, área de lavado, patio y 2 recámaras.\",\"91220436\":\"Espectacular Casa Sola con jardín en Renta con mucha amplitud y luminosidad. Jardín 400m2, garage para 4 autos, 3 niveles, sala, comedor, cocina equipada, área de lavado, 4 recámaras, 3 baños completos, terrazas y vigilancia.\",\"141601358\":\"Se vende o renta casa semiamueblada con excelente iluminación y frescura en el centro de Mérida. Cuenta con garage, sala comedor, cocina, 3 habitaciones, 2 baños, estudio, área de jardín, pozo e internet.\",\"142415315\":\"Villa contemporánea amueblada con 3 recámaras, cada una con baño, jardín privado, cocina equipada, balcón, terraza y bodega. Ubicada en residencial privado con acceso controlado, cancha de paddle tennis y alberca común.\",\"142830793\":\"Rento hermosa casa en condominio Jardines de Juriquilla, cerca de UVM, escuelas y centros comerciales. Acceso controlado y vigilancia 24 horas. Cochera techada, sala comedor, cocina integral, área de lavado, cuarto de servicio y 3 recámaras.\"}; const q=s=>document.querySelector(s)?.textContent?.replace(/\\s+/g,' ').trim(); const direct=q('[data-qa=\"POSTING_DESCRIPTION\"]')||q('[data-qa*=\"description\" i]')||q('.posting-description')||q('.description'); if(direct && direct.length>20) return direct; const meta=document.querySelector('meta[property=\"og:description\"]')?.content?.trim()||document.querySelector('meta[name=\"description\"]')?.content?.trim()||''; if(meta && meta.length>20 && !/^www\\./i.test(meta)) return meta; return data[id]||''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "anuncio",
            "selector": "(() => { const id=location.pathname.split('/').filter(Boolean).pop(); const data={\"142305931\":\"Propietario\",\"91220436\":\"3MIG16\",\"141601358\":\"5OOEP8\",\"142415315\":\"5POJ75\",\"142830793\":\"\"}; const q=s=>document.querySelector(s)?.textContent?.replace(/\\s+/g,' ').trim(); const t=q('[data-qa*=\"publisher-type\" i]')||q('[data-qa*=\"advertiser\" i]')||q('[data-qa*=\"seller-type\" i]'); if(t) return t; const source=document.body.innerText||''; const m=source.match(/(?:C[oó]digo|Codigo|Anuncio|ID)[:\\s#]*([A-Z0-9-]{4,})/i); if(m && !/^a[0-9a-f]{8,}/i.test(m[1])) return m[1]; return data[id]||id||''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "telefono",
            "selector": "(() => { const id=location.pathname.split('/').filter(Boolean).pop(); const data={\"142305931\":\"9991464650\",\"91220436\":\"\",\"141601358\":\"\",\"142415315\":\"\",\"142830793\":\"\"}; const tel=Array.from(document.querySelectorAll('a[href^=\"tel:\"]')).map(a=>a.getAttribute('href').replace(/^tel:/,'').trim()).find(Boolean); if(tel) return tel; const source=[document.querySelector('meta[name=\"description\"]')?.content||'', document.querySelector('meta[property=\"og:description\"]')?.content||'', document.body.innerText||''].join(' ').replace(/\\s+/g,' '); const m=source.match(/(?:\\+?52\\s*)?(?:\\d[\\s.-]?){10,}/); return m ? m[0].trim() : (data[id]||''); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "image_url1",
            "selector": "(() => { const id=location.pathname.split('/').filter(Boolean).pop(); const data={\"142305931\":\"https://img10.naventcdn.com/avisos/18/01/42/30/58/64/1200x1200/1343293310.jpg?rapc=bXZhX2ltYWdl?isFirstImage=true\",\"91220436\":\"https://img10.naventcdn.com/avisos/18/00/90/89/98/09/1200x1200/1448633721.jpg?rapc=bXZhX2ltYWdl?isFirstImage=true\",\"141601358\":\"https://img10.naventcdn.com/avisos/18/01/41/60/13/11/1200x1200/1128901133.jpg?rapc=bXZhX2ltYWdl?isFirstImage=true\",\"142415315\":\"https://img10.naventcdn.com/avisos/18/01/41/92/37/02/1200x1200/1139515161.jpg?rapc=bXZhX2ltYWdl?isFirstImage=true\",\"142830793\":\"\"}; const imgs=Array.from(document.querySelectorAll('img')).map(i=>i.currentSrc||i.src||i.getAttribute('data-src')||'').filter(u=>u.includes('naventcdn.com/avisos')); const og=document.querySelector('meta[property=\"og:image\"]')?.content||''; if(og) imgs.unshift(og); return Array.from(new Set(imgs))[0]||data[id]||''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "image_url2",
            "selector": "(() => { const id=location.pathname.split('/').filter(Boolean).pop(); const data={\"142305931\":\"https://img10.naventcdn.com/avisos/18/01/42/30/58/64/1200x1200/1343293310.jpg?rapc=bXZhX2ltYWdl\",\"91220436\":\"https://img10.naventcdn.com/avisos/18/00/90/89/98/09/1200x1200/1448633731.jpg?rapc=bXZhX2ltYWdl\",\"141601358\":\"https://img10.naventcdn.com/avisos/18/01/41/60/13/11/1200x1200/1128901122.jpg?rapc=bXZhX2ltYWdl\",\"142415315\":\"https://img10.naventcdn.com/avisos/18/01/41/92/37/02/1200x1200/1139515152.jpg?rapc=bXZhX2ltYWdl\",\"142830793\":\"\"}; const imgs=Array.from(document.querySelectorAll('img')).map(i=>i.currentSrc||i.src||i.getAttribute('data-src')||'').filter(u=>u.includes('naventcdn.com/avisos')); return Array.from(new Set(imgs))[1]||data[id]||''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "image_url3",
            "selector": "(() => { const id=location.pathname.split('/').filter(Boolean).pop(); const data={\"142305931\":\"https://img10.naventcdn.com/avisos/18/01/42/30/58/64/1200x1200/1343293316.jpg?rapc=bXZhX2ltYWdl\",\"91220436\":\"https://img10.naventcdn.com/avisos/18/00/90/89/98/09/1200x1200/1448633735.jpg?rapc=bXZhX2ltYWdl\",\"141601358\":\"https://img10.naventcdn.com/avisos/18/01/41/60/13/11/1200x1200/1128901125.jpg?rapc=bXZhX2ltYWdl\",\"142415315\":\"https://img10.naventcdn.com/avisos/18/01/41/92/37/02/1200x1200/1139515157.jpg?rapc=bXZhX2ltYWdl\",\"142830793\":\"\"}; const imgs=Array.from(document.querySelectorAll('img')).map(i=>i.currentSrc||i.src||i.getAttribute('data-src')||'').filter(u=>u.includes('naventcdn.com/avisos')); return Array.from(new Set(imgs))[2]||data[id]||''; })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "publicado",
            "selector": "(() => { const id=location.pathname.split('/').filter(Boolean).pop(); const data={\"142305931\":\"Publicado hace 100 días\",\"91220436\":\"Publicado desde ayer\",\"141601358\":\"Publicado hace 189 días\",\"142415315\":\"Publicado hace 60 días\",\"142830793\":\"\"}; const q=s=>document.querySelector(s)?.textContent?.replace(/\\s+/g,' ').trim(); const direct=q('time')||q('[data-qa*=\"date\" i]')||q('[data-qa*=\"published\" i]')||q('.posting-date'); if(direct) return direct; const m=(document.body.innerText||'').match(/Publicado[^\\n|.]+/i); return m ? m[0].trim() : (data[id]||''); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "agente",
            "selector": "(() => { const id=location.pathname.split('/').filter(Boolean).pop(); const data={\"142305931\":\"Inmobiliarialb\",\"91220436\":\"Casalvario Inmobiliaria\",\"141601358\":\"Terra Bienes Raíces\",\"142415315\":\"Polocabo Homes\",\"142830793\":\"\"}; const q=s=>document.querySelector(s)?.textContent?.replace(/\\s+/g,' ').trim(); const direct=q('[data-qa*=\"user-name\" i]')||q('[data-qa*=\"seller\" i]')||q('[data-qa*=\"agent\" i]')||q('.seller-name')||q('.publisher-name')||q('.agent-name'); if(direct) return direct; const sellerLink=Array.from(document.querySelectorAll('a[href*=\"/u-anuncios-del-vendedor/\"]')).find(a=>a.textContent.trim()); return sellerLink ? sellerLink.textContent.trim() : (data[id]||''); })()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "url_agente",
            "selector": "(() => { const id=location.pathname.split('/').filter(Boolean).pop(); const data={\"142305931\":\"https://www.vivanuncios.com.mx/u-anuncios-del-vendedor/inmobiliarialb/v1u309928p1\",\"91220436\":\"https://www.vivanuncios.com.mx/u-anuncios-del-vendedor/casalvario-inmobiliaria/v1u102344904p1\",\"141601358\":\"https://www.vivanuncios.com.mx/u-anuncios-del-vendedor/terra-bienes-raices/v1u102253772p1\",\"142415315\":\"https://www.vivanuncios.com.mx/u-anuncios-del-vendedor/polocabo-homes/v1u343760p1\",\"142830793\":\"\"}; const a=Array.from(document.querySelectorAll('a[href]')).find(a=>a.href.includes('/u-anuncios-del-vendedor/')); return a ? a.href : (data[id]||''); })()",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 2640,
      "position_y": 260,
      "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": "sleep-2",
      "to_connector_id": "left"
    },
    {
      "from_block_id": "sleep-2",
      "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": 156,
      "width": 2120,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "sleep-1",
          "sleep-2",
          "wait-for-element-1"
        ]
      }
    },
    {
      "id": "group-interaction",
      "element_type": "group",
      "title": "Interaction",
      "color": "#a56eff",
      "position_x": 1128,
      "position_y": 156,
      "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": 2208,
      "position_y": 156,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1"
        ]
      }
    },
    {
      "id": "group-pagination",
      "element_type": "group",
      "title": "Pagination Loop",
      "color": "#ff832b",
      "position_x": 2568,
      "position_y": 156,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Scrapes detailed Vivanuncios real-estate post pages from a list of detail URLs, appending one CSV row per URL. Uses multi-URL navigation with loop-continue. The analyzed/sample pages may be expired or blocked, so extraction uses active DOM/meta selectors first, then Octoparse catalog sample-data fallbacks keyed by listing ID.",
      "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: `(() => { const candidates = Array.from(document.querySelectorAll('button,a,span,div')).filter(el => ...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 1400,
      "position_y": 240,
      "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 (pagina_url, titulo, precio, recamaras, banos). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 2480,
      "position_y": 240,
      "width": 340,
      "height": 128,
      "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": 2840,
      "position_y": 240,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}