{
  "version": "1.0.0",
  "exported_at": "2026-06-02T16:15:00.000Z",
  "project": {
    "name": "REMAX Details Scraper",
    "description": "Scrapes RE/MAX Paraguay property detail pages and exports the same detail fields shown in the Octoparse RE/MAX Details Scraper preview: title, secondary title, up to five property image URLs, price, listing ID, condition/features, description, phone, and email. Navigation uses a multi-URL detail-page loop with navigate.urls[] and loop-continue; replace the included sample RE/MAX property URLs with the property-detail URLs you want to process. Image extraction is restricted to the first valid property gallery/media container on each detail page, so it avoids RE/MAX UI icons and avoids pulling images from related/recommended listing galleries.",
    "color": "bg-[#4589ff]",
    "template_id": "ai-generated"
  },
  "blocks": [
    {
      "block_id": "set-window-size-1",
      "block_type": "process",
      "title": "Set Window Size",
      "description": "Set browser viewport size",
      "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.remax.com.py/es-py/propiedades/local-comercial/alquiler/luque/143068006-165",
          "https://www.remax.com.py/es-py/propiedades/duplex/venta/villa-elisa/143068006-168",
          "https://www.remax.com.py/es-py/propiedades/departamento/alquiler/luque/143025158-47",
          "https://www.remax.com.py/es-py/propiedades/departamento/venta/las-lomas-carmelitas/narciso-colman-esq-juan-max-boettner/143063080-195",
          "https://www.remax.com.py/es-py/propiedades/casa/venta/san-lorenzo/1313-andres-barbero-casi-21-de-setiembre-cordillera-andina-casi-ntra-sra-de-la-torre-ciud/143014133-148",
          "https://www.remax.com.py/es-py/propiedades/casa/venta/caacupe/luis-ramirez/143108012-5",
          "https://www.remax.com.py/es-py/propiedades/duplex/alquiler/nazareth/143097025-18",
          "https://www.remax.com.py/es-py/propiedades/casa/venta/itaugua/itaugua/143097041-17",
          "https://www.remax.com.py/es-py/propiedades/casa/venta/fernando-de-la-mora/143036034-153"
        ],
        "color": "bg-[#08bdba]"
      }
    },
    {
      "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": 30,
        "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": 3,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 1540,
      "position_y": 240,
      "config": {
        "selector": "body",
        "timeout": 30,
        "visible": true,
        "color": "bg-[#08bdba]"
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 1900,
      "position_y": 240,
      "config": {
        "rowSelector": "body",
        "fileName": "remax_detalles_scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "append",
        "color": "bg-[#42be65]",
        "columns": [
          {
            "name": "titulo",
            "selector": "(()=>{const pick=s=>document.querySelector(s)?.textContent?.trim()||''; return pick('h1')||pick('[data-testid*=\"title\" i]')||pick('.listing-title')||document.title.replace(/\\s+/g,' ').trim();})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "titulo_2",
            "selector": "(()=>{const candidates=[...document.querySelectorAll('h2,h3,[data-testid*=\"subtitle\" i],[data-testid*=\"address\" i],.listing-address,[data-testid=\"price-text\"]')].map(e=>e.textContent.trim()).filter(Boolean); return candidates[0]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "imagen_1",
            "selector": "(()=>{function imgs(){const bad=/blank\\.gif|logo|default_image_office|icon-|whatsapp|phone|svg|common\\/images|\\/images\\/common|seller|agent|office|marker|facebook|instagram|youtube|linkedin|twitter|iList|\\/A_/i; const good=/cdn\\.gryphtech\\.com\\/userimages|GTImageHandler|LargeWM|Large/i; const containers=[...document.querySelectorAll('[data-testid*=\"gallery\" i],.image-gallery,[data-testid*=\"media\" i]')]; for(const c of containers){const arr=[...c.querySelectorAll('img')].map(i=>i.currentSrc||i.src||i.getAttribute('data-src')||i.getAttribute('srcset')?.split(' ')[0]||'').filter(Boolean).map(src=>new URL(src,location.href).href).filter(src=>good.test(src)&&!bad.test(src)); const uniq=[...new Set(arr)]; if(uniq.length) return uniq;} return [];} return imgs()[0]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "imagen_2",
            "selector": "(()=>{function imgs(){const bad=/blank\\.gif|logo|default_image_office|icon-|whatsapp|phone|svg|common\\/images|\\/images\\/common|seller|agent|office|marker|facebook|instagram|youtube|linkedin|twitter|iList|\\/A_/i; const good=/cdn\\.gryphtech\\.com\\/userimages|GTImageHandler|LargeWM|Large/i; const containers=[...document.querySelectorAll('[data-testid*=\"gallery\" i],.image-gallery,[data-testid*=\"media\" i]')]; for(const c of containers){const arr=[...c.querySelectorAll('img')].map(i=>i.currentSrc||i.src||i.getAttribute('data-src')||i.getAttribute('srcset')?.split(' ')[0]||'').filter(Boolean).map(src=>new URL(src,location.href).href).filter(src=>good.test(src)&&!bad.test(src)); const uniq=[...new Set(arr)]; if(uniq.length) return uniq;} return [];} return imgs()[1]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "imagen_3",
            "selector": "(()=>{function imgs(){const bad=/blank\\.gif|logo|default_image_office|icon-|whatsapp|phone|svg|common\\/images|\\/images\\/common|seller|agent|office|marker|facebook|instagram|youtube|linkedin|twitter|iList|\\/A_/i; const good=/cdn\\.gryphtech\\.com\\/userimages|GTImageHandler|LargeWM|Large/i; const containers=[...document.querySelectorAll('[data-testid*=\"gallery\" i],.image-gallery,[data-testid*=\"media\" i]')]; for(const c of containers){const arr=[...c.querySelectorAll('img')].map(i=>i.currentSrc||i.src||i.getAttribute('data-src')||i.getAttribute('srcset')?.split(' ')[0]||'').filter(Boolean).map(src=>new URL(src,location.href).href).filter(src=>good.test(src)&&!bad.test(src)); const uniq=[...new Set(arr)]; if(uniq.length) return uniq;} return [];} return imgs()[2]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "imagen_4",
            "selector": "(()=>{function imgs(){const bad=/blank\\.gif|logo|default_image_office|icon-|whatsapp|phone|svg|common\\/images|\\/images\\/common|seller|agent|office|marker|facebook|instagram|youtube|linkedin|twitter|iList|\\/A_/i; const good=/cdn\\.gryphtech\\.com\\/userimages|GTImageHandler|LargeWM|Large/i; const containers=[...document.querySelectorAll('[data-testid*=\"gallery\" i],.image-gallery,[data-testid*=\"media\" i]')]; for(const c of containers){const arr=[...c.querySelectorAll('img')].map(i=>i.currentSrc||i.src||i.getAttribute('data-src')||i.getAttribute('srcset')?.split(' ')[0]||'').filter(Boolean).map(src=>new URL(src,location.href).href).filter(src=>good.test(src)&&!bad.test(src)); const uniq=[...new Set(arr)]; if(uniq.length) return uniq;} return [];} return imgs()[3]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "imagen_5",
            "selector": "(()=>{function imgs(){const bad=/blank\\.gif|logo|default_image_office|icon-|whatsapp|phone|svg|common\\/images|\\/images\\/common|seller|agent|office|marker|facebook|instagram|youtube|linkedin|twitter|iList|\\/A_/i; const good=/cdn\\.gryphtech\\.com\\/userimages|GTImageHandler|LargeWM|Large/i; const containers=[...document.querySelectorAll('[data-testid*=\"gallery\" i],.image-gallery,[data-testid*=\"media\" i]')]; for(const c of containers){const arr=[...c.querySelectorAll('img')].map(i=>i.currentSrc||i.src||i.getAttribute('data-src')||i.getAttribute('srcset')?.split(' ')[0]||'').filter(Boolean).map(src=>new URL(src,location.href).href).filter(src=>good.test(src)&&!bad.test(src)); const uniq=[...new Set(arr)]; if(uniq.length) return uniq;} return [];} return imgs()[4]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "precio",
            "selector": "(()=>{const body=document.body.innerText.replace(/\\s+/g,' '); const m=body.match(/[\\d.,]+\\s?(?:₲|Gs\\.?|USD|US\\$|\\$)(?:\\s?Mensual)?|(?:USD|US\\$|Gs\\.?|₲|\\$)\\s?[\\d.,]+(?:\\s?Mensual)?/i); if(m) return m[0].trim(); const el=document.querySelector('[data-testid=\"price-text\"],[data-testid*=\"price\" i],.listing-price,.price,[class*=\"price\" i]'); return el?.textContent?.replace(/\\s+/g,' ').trim()||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "id",
            "selector": "(()=>{const text=document.body.innerText; const m=text.match(/\\b\\d{9}-\\d+\\b/); if(m) return m[0]; const url=location.href.match(/\\/(\\d{9}-\\d+)(?:$|[/?#])/); return url?url[1]:'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "condicion",
            "selector": "(()=>{const keys=['Total Mts','Sup. Lote','Dormitorios','Baños','Ambientes','Area de Construcción','Área de Construcción','Sup. Vivienda','Mts²','m²']; const lines=document.body.innerText.split('\\n').map(s=>s.replace(/\\s+/g,' ').trim()).filter(Boolean); const out=[]; for(let i=0;i<lines.length;i++){if(keys.some(k=>lines[i].toLowerCase().includes(k.toLowerCase()))){let val=lines[i]; if(i+1<lines.length&&lines[i+1].length<80&&!keys.some(k=>lines[i+1].toLowerCase().includes(k.toLowerCase()))) val+=' '+lines[i+1]; out.push(val);}} return [...new Set(out)].slice(0,25).join(' | ');})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "descripcion",
            "selector": "(()=>{const selectors='[data-testid*=\"description\" i],.property-description,.listing-description,[class*=\"description\" i],article,main section,p'; const texts=[...document.querySelectorAll(selectors)].map(e=>e.textContent.replace(/\\s+/g,' ').trim()).filter(t=>t.length>120&&!/Comprar Alquiler Tipo de Propiedad/i.test(t)); texts.sort((a,b)=>b.length-a.length); return texts[0]||'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "celular",
            "selector": "(()=>{const tel=document.querySelector('a[href^=\"tel:\"]')?.getAttribute('href')?.replace(/^tel:/,'').trim(); if(tel) return tel; const text=document.body.innerText; const m=text.match(/\\+?595[\\s.-]?\\d{3}[\\s.-]?\\d{3}[\\s.-]?\\d{3}/); return m?m[0].trim():'';})()",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "correo",
            "selector": "(()=>{const mail=document.querySelector('a[href^=\"mailto:\"]')?.getAttribute('href')?.replace(/^mailto:/,'').split('?')[0].trim(); if(mail) return mail; const text=document.body.innerText; const m=text.match(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}/i); return m?m[0].trim():'';})()",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "loop-continue-1",
      "block_type": "process",
      "title": "Loop Continue",
      "description": "Continue multi-input loop",
      "position_x": 2260,
      "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": "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": 1400,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "sleep-1",
          "wait-for-element-1"
        ]
      }
    },
    {
      "id": "group-extract",
      "element_type": "group",
      "title": "Data Extraction",
      "color": "#42be65",
      "position_x": 1828,
      "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": 2188,
      "position_y": 136,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "loop-continue-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Scrapes RE/MAX Paraguay property detail pages and exports the same detail fields shown in the Octoparse RE/MAX Details Scraper preview: title, secondary title, up to five property image URLs, price, listing ID, condition/features, description, phone, and email. Navigation uses a multi-URL detail-page loop with navigate.urls[] and loop-continue; replace the included sample RE/MAX property URLs with the property-detail URLs you want to process. Image extraction is restricted to the first valid property gallery/media container on each detail page, so it avoids RE/MAX UI icons and avoids pulling images from related/recommended listing galleries.",
      "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 9 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-structured-export-1",
      "element_type": "note",
      "title": "Note: Structured Export",
      "content": "Structured export with JS columns (titulo, titulo_2, imagen_1, imagen_2, imagen_3). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 2100,
      "position_y": 220,
      "width": 340,
      "height": 129,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-1"
      }
    },
    {
      "id": "note-block-loop-continue-1",
      "element_type": "note",
      "title": "Note: Loop Continue",
      "content": "Loop Continue advances a multi-URL or multi-text loop. Place at the end of the loop body with a clear back-edge to the loop start.",
      "color": "#ee5396",
      "position_x": 2460,
      "position_y": 220,
      "width": 340,
      "height": 123,
      "z_index": 22,
      "data": {
        "block_id": "loop-continue-1"
      }
    }
  ]
}