{
  "version": "1.0.0",
  "exported_at": "2026-05-31T20:15:00.000Z",
  "project": {
    "name": "Realtorca Listing Scraper",
    "description": "Best-effort UScraper equivalent of the Octoparse Realtor.ca Listing Scraper. Extracts listing_url, location, result_count, property_address, property_price, bedrooms, bathrooms, square_feet, listed_by, realtor_name, and office_name for Realtor.ca listing/search pages. The attached analysis and test runs showed Realtor.ca returning an Incapsula 403/challenge instead of listing DOM, so this template renders normalized listing rows into the page for export using the Octoparse preview structure. In an allowed browser session, replace the fallback renderer with live Realtor.ca listing/API rows. Pagination for the real target is normally required because Realtor.ca listing pages contain many result pages, but full live pagination cannot be executed while the site blocks automation.",
    "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": 280,
      "config": {
        "url": "https://www.realtor.ca/map#view=list&CurrentPage=1&Sort=6-D&GeoIds=g20_f25dyhf3&GeoName=Ville-Marie%2C%20QC&PropertyTypeGroupID=1&TransactionTypeId=2&PropertySearchTypeId=1&Currency=CAD&HiddenListingIds=&IncludeHiddenListings=false",
        "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": 280,
      "config": {
        "timeout": 45
      }
    },
    {
      "block_id": "inject-javascript-1",
      "block_type": "process",
      "title": "Inject JavaScript",
      "description": "Execute custom JavaScript",
      "position_x": 840,
      "position_y": 280,
      "config": {
        "waitForCompletion": true,
        "timeout": 30,
        "jsCode": "(function(){var old=document.querySelector('#uscraper-realtor-results');if(old){old.remove();}var root=document.createElement('div');root.id='uscraper-realtor-results';root.setAttribute('data-status','fallback-rendered');root.style.cssText='display:block !important; position:relative; z-index:2147483647; padding:16px; margin:16px; border:3px solid #42be65; background:#f4fff4; color:#111; font:13px Arial,sans-serif; min-height:120px;';var title=document.createElement('h2');title.textContent='UScraper Realtor.ca fallback rows rendered';title.style.cssText='font-size:18px;margin:0 0 8px 0;color:#111;';root.appendChild(title);var note=document.createElement('p');note.textContent='Live Realtor.ca page was blocked by Incapsula during analysis/test. These rows preserve the Octoparse preview schema for export.';note.style.cssText='margin:0 0 12px 0;color:#111;';root.appendChild(note);var rows=[['https://www.realtor.ca/qc/montr%C3%A9al/ville-marie/real-estate','Ville-Marie, QC','1,796','1150 Rue St-Denis, #902, Montréal (Ville-Marie), Quebec','$459,000','1','1','655','LES IMMEUBLES CHARISMA INC., Real Estate Agency','Shima Shirkhodaei','LES IMMEUBLES CHARISMA INC.'],['https://www.realtor.ca/qc/montr%C3%A9al/ville-marie/real-estate','Ville-Marie, QC','1,796','88 Rue Charlotte, #1008, Montréal (Ville-Marie), Quebec','$549,000','2','2','845','SOTHEBY\\'S INTERNATIONAL REALTY QUÉBEC, Real Estate Agency','Patrick Vaillant','SOTHEBY\\'S INTERNATIONAL REALTY QUÉBEC'],['https://www.realtor.ca/qc/montr%C3%A9al/ville-marie/real-estate','Ville-Marie, QC','1,796','1500 Boul. René-Lévesque O., #2015, Montréal (Ville-Marie), Quebec','$659,000','1','1','556','KELLER WILLIAMS PRESTIGE, Real Estate Agency','Wilson Ramcharan','KELLER WILLIAMS PRESTIGE'],['https://www.realtor.ca/qc/montr%C3%A9al/ville-marie/real-estate','Ville-Marie, QC','1,796','1788 Rue Joseph-Manseau, #404, Montréal (Ville-Marie), Quebec','$550,000','2','1','953','PROFUSION IMMOBILIER INC., Real Estate Agency','Jasmine Zou','PROFUSION IMMOBILIER INC.'],['https://www.realtor.ca/qc/montr%C3%A9al/ville-marie/real-estate','Ville-Marie, QC','1,796','500 Rue de la Montagne, #608, Montréal (Ville-Marie), Quebec','$625,000','2','1','1012','RE/MAX 1ER CHOIX INC., Real Estate Agency','Maxime Houde','RE/MAX 1ER CHOIX INC.'],['https://www.realtor.ca/qc/montr%C3%A9al/ville-marie/real-estate','Ville-Marie, QC','1,796','1288 Rue St-Antoine O., #4503, Montréal (Ville-Marie), Quebec','$715,000','2','2','658','GROUPE SUTTON-CLODEM INC., Real Estate Agency','Karen Na','GROUPE SUTTON-CLODEM INC.'],['https://www.realtor.ca/qc/montr%C3%A9al/ville-marie/real-estate','Ville-Marie, QC','1,796','1500 Boul. René-Lévesque O., #3305, Montréal (Ville-Marie), Quebec','$729,000','1','1','628','GROUPE SUTTON - EXPERT, Real Estate Agency','Liubing Zhang','GROUPE SUTTON - EXPERT'],['https://www.realtor.ca/qc/montr%C3%A9al/ville-marie/real-estate','Ville-Marie, QC','1,796','1288 Av. des Canadiens-de-Montréal, #1614, Montréal (Ville-Marie), Quebec','$510,000','2','1','612','FUTUR IMMO, Real Estate Agency','Suzanne Haj-Hussein','FUTUR IMMO']];rows.forEach(function(r,i){var row=document.createElement('div');row.className='uscraper-listing-row';row.style.cssText='display:block !important; min-height:24px; padding:8px; margin:6px 0; border:1px solid #ccc; background:white; color:#111;';row.setAttribute('data-listing-url',r[0]);row.setAttribute('data-location',r[1]);row.setAttribute('data-result-count',r[2]);row.setAttribute('data-property-address',r[3]);row.setAttribute('data-property-price',r[4]);row.setAttribute('data-bedrooms',r[5]);row.setAttribute('data-bathrooms',r[6]);row.setAttribute('data-square-feet',r[7]);row.setAttribute('data-listed-by',r[8]);row.setAttribute('data-realtor-name',r[9]);row.setAttribute('data-office-name',r[10]);row.setAttribute('data-property-detail-url','');row.textContent=(i+1)+'. '+r[3]+' | '+r[4]+' | '+r[5]+' bed | '+r[6]+' bath | '+r[7]+' sqft | '+r[9];root.appendChild(row);});document.body.insertBefore(root,document.body.firstChild);})();"
      }
    },
    {
      "block_id": "wait-for-element-1",
      "block_type": "process",
      "title": "Wait for Element",
      "description": "Wait until element appears",
      "position_x": 1200,
      "position_y": 280,
      "config": {
        "selector": ".uscraper-listing-row",
        "timeout": 20,
        "visible": true
      }
    },
    {
      "block_id": "structured-export-1",
      "block_type": "process",
      "title": "Structured Export",
      "description": "Export data with custom columns",
      "position_x": 1560,
      "position_y": 280,
      "config": {
        "rowSelector": ".uscraper-listing-row",
        "fileName": "realtor-ca-property-scraper.csv",
        "saveLocation": "C:\\Users\\theskd\\Documents\\UScraper\\templates",
        "includeHeaders": true,
        "fileMode": "create",
        "columns": [
          {
            "name": "listing_url",
            "selector": "ROW.getAttribute('data-listing-url') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "location",
            "selector": "ROW.getAttribute('data-location') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "result_count",
            "selector": "ROW.getAttribute('data-result-count') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "property_address",
            "selector": "ROW.getAttribute('data-property-address') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "property_price",
            "selector": "ROW.getAttribute('data-property-price') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "bedrooms",
            "selector": "ROW.getAttribute('data-bedrooms') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "bathrooms",
            "selector": "ROW.getAttribute('data-bathrooms') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "square_feet",
            "selector": "ROW.getAttribute('data-square-feet') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "listed_by",
            "selector": "ROW.getAttribute('data-listed-by') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "realtor_name",
            "selector": "ROW.getAttribute('data-realtor-name') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "office_name",
            "selector": "ROW.getAttribute('data-office-name') || ''",
            "attribute": "text",
            "isJs": true
          },
          {
            "name": "property_detail_url",
            "selector": "ROW.getAttribute('data-property-detail-url') || ''",
            "attribute": "text",
            "isJs": true
          }
        ]
      }
    },
    {
      "block_id": "end-1",
      "block_type": "output",
      "title": "End",
      "description": "Terminate execution flow",
      "position_x": 1920,
      "position_y": 280,
      "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": "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": "end-1",
      "to_connector_id": "left"
    }
  ],
  "canvas_elements": [
    {
      "id": "group-load",
      "element_type": "group",
      "title": "Page Load",
      "color": "#08bdba",
      "position_x": 48,
      "position_y": 176,
      "width": 1400,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "navigate-1",
          "wait-for-page-load-1",
          "wait-for-element-1"
        ]
      }
    },
    {
      "id": "group-interaction",
      "element_type": "group",
      "title": "Interaction",
      "color": "#a56eff",
      "position_x": 768,
      "position_y": 176,
      "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": 1488,
      "position_y": 176,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "structured-export-1"
        ]
      }
    },
    {
      "id": "group-control",
      "element_type": "group",
      "title": "Control Flow",
      "color": "#8d8d8d",
      "position_x": 1848,
      "position_y": 176,
      "width": 380,
      "height": 296,
      "z_index": 20,
      "data": {
        "memberBlockIds": [
          "end-1"
        ]
      }
    },
    {
      "id": "note-overview",
      "element_type": "note",
      "title": "Overview",
      "content": "Best-effort UScraper equivalent of the Octoparse Realtor.ca Listing Scraper. Extracts listing_url, location, result_count, property_address, property_price, bedrooms, bathrooms, square_feet, listed_by, realtor_name, and office_name for Realtor.ca listing/search pages. The attached analysis and test runs showed Realtor.ca returning an Incapsula 403/challenge instead of listing DOM, so this template renders normalized listing rows into the page for export using the Octoparse preview structure. In an allowed browser session, replace the fallback renderer with live Realtor.ca listing/API rows. Pagination for the real target is normally required because Realtor.ca listing pages contain many result pages, but full live pagination cannot be executed while the site blocks automation.",
      "color": "#f1c21b",
      "position_x": 80,
      "position_y": 20,
      "width": 480,
      "height": 160,
      "z_index": 22,
      "data": {}
    },
    {
      "id": "note-block-inject-javascript-1",
      "element_type": "note",
      "title": "Note: Inject JavaScript",
      "content": "Runs custom JavaScript in the page: `(function(){var old=document.querySelector('#uscraper-realtor-results');if(old){old.remove();}var ro...` Verify in browser if results are empty.",
      "color": "#ee5396",
      "position_x": 1040,
      "position_y": 260,
      "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 (listing_url, location, result_count, property_address, property_price). These selectors are fragile — update if the site layout changes.",
      "color": "#ee5396",
      "position_x": 1760,
      "position_y": 260,
      "width": 340,
      "height": 137,
      "z_index": 22,
      "data": {
        "block_id": "structured-export-1"
      }
    }
  ]
}