Giter VIP home page Giter VIP logo

realtorca's Introduction

realtorca

NPM

Wrapper for the realtor.ca API

Filter all available listings

POST https://api37.realtor.ca/Listing.svc/PropertySearch_Post

Get details about a specific listing

GET https://api37.realtor.ca/Listing.svc/PropertyDetails

Methods

realtor.post(options) - returns a promise which will resolve with a JSON object containing the query results returned from realtor.ca.

realtor.getPropertyDetails(options) - returns a promise which will resolve with a JSON object containing the detailed information of a property. Passing PropertyId, and ReferenceNumber(MLS number) as options is required. The PropertyId can be obtained from the listing URL.

realtor.buildUrl - returns a URL with the query string constructed from the specified options.

realtor.optionsFromUrl - returns options from a URL from realtor.ca (from the map view).

^ Note: The website link from buildUrl only allows specific price quantities. Any inconsistent PriceMin and PriceMax values will be rounded up to the next price level. Read the source for clarification.

Usage

const realtor = require('realtorca');

let opts = {
  LongitudeMin: -79.6758985519409,
  LongitudeMax: -79.6079635620117,
  LatitudeMin: 43.57601549736786,
  LatitudeMax: 43.602250137362276,
  PriceMin: 100000,
  PriceMax: 410000
};

console.log( realtor.buildUrl(opts) );
//https://www.realtor.ca/Residential/Map.aspx#LongitudeMin=-79.6758985519409&LongitudeMax=-79.6079635620117&LatitudeMin=43.57601549736786&LatitudeMax=43.602250137362276&PriceMin=100000&PriceMax=425000

// Parse options from url
console.log(realtor.optionsFromUrl("https://www.realtor.ca/Residential/Map.aspx#LongitudeMin=-79.6758985519409&LongitudeMax=-79.6079635620117&LatitudeMin=43.57601549736786&LatitudeMax=43.602250137362276&PriceMin=100000&PriceMax=425000"));


realtor.post(opts)
  .then(data => {
      //json response
  })
  .catch(err => {

  });

API Reference/Options

Most of the information was pulled from the DOM nodes on the website

Most of the following options are optional. The first 3 listed are required but the wrapper will provide a default if they aren't specified.

  • CultureId - language identifier, 1 for English, 2 for French. Defaults to 1.
  • ApplicationId - Mandatory for some endpoints, defaults to 37, their mobile app uses the value 37
  • PropertySearchTypeId- Defaulted to 1. Determines the type of property, possible values:
    • 0 No Preference
    • 1 Residential
    • 2 Recreational
    • 3 Condo/Strata
    • 4 Agriculture
    • 5 Parking
    • 6 Vacant Land
    • 8 Multi Family
  • HashCode - Mandatory for some endpoints; their mobile app defaults it to 0

Most useful options

  • PriceMin - Defaults to 0
  • PriceMax
  • LongitudeMin - bottom left longitude of the map view port
  • LatitudeMin - bottom left latitude of the map view port
  • LongitudeMax - top right longitude of the map view port
  • LatitudeMax - top right latitude of the map view port
  • TransactionTypeId- Defaults to 2?
    • 1 For sale or rent
    • 2 For sale
    • 3 For rent
  • StoreyRange - "min-max" i.e. "2-3"
  • BedRange - "min-max" if min = max, it searches for the exact value. If it's 1-0, it means it's 1+. Maxes at 5
  • BathRange - "min-max"

Others

  • SortBy - How to sort (e.g. price, date, etc)
  • SortOrder - How to order the items after sorting them by a given field (e.g. ascending, descending)
Type Sort
Low to High ($) 1-A
High to Low ($) 1-D
Date Posted: New to Old 6-D
Date Posted: Old to New 6-A
Open Houses First 12-D
More Photos First 13-D
Virtual Tour First 11-D
  • organizationID - sort/search by organizationID of a group of realtors. Value of this field can be found using a URL such as https://www.realtor.ca/Residential/OfficeDetails.aspx?OrganizationId=271479 as pointed out by Froren.
  • individualID - sort/search by agentID. Can be found using a URL such as https://www.realtor.ca/Agent/1914698/Gaetan-Kill-130---1152-Main... (in this case individualID = 1914698) as indicated by Kris.
  • viewState - m, g, or 1. Seems irrelevant.
  • Longitude - (Optional) Longitude of the current user's location
  • Latitude - (Optional) Latitude of the current user's location
  • ZoomLevel - not sure what this does
  • CurrentPage - read somewhere that it maxes at 51
  • RecordsPerPage - their mobile app uses 500 as the default value
  • MaximumResults
  • PropertyTypeGroupID - ???
  • OwnershipTypeGroupId
    • 0 Any
    • 1 Freehold
    • 2 Condo/Strata
    • 3 Timeshare/Fractional
    • 4 Leasehold
  • ViewTypeGroupId
    • 0 Any
    • 1 City
    • 2 Mountain
    • 3 Ocean
    • 4 Lake
    • 5 River
    • 6 Ravine
    • 7 Other
    • 8 All Water Views
  • BuildingTypeId
    • 0 Any
    • 1 House
    • 2 Duplex
    • 3 Triplex
    • 5 Residential Commercial Mix
    • 6 Mobile Home
    • 12 Special Purpose
    • 14 Other
    • 16 Row/Townhouse
    • 17 Apartment
    • 19 Fourplex
    • 20 Garden Home
    • 27 Manufactured Home/Mobile
    • 28 Commercial Apartment
    • 29 Manufactured Home
  • ConstructionStyleId
    • 0 Any
    • 1 Attached
    • 3 Detached
    • 5 Semi-detached
    • 7 Stacked
    • 9 Link
  • UnitRange - how many units within a given building, similar to BathRange, such as 2-0 to denote 2 or more units
  • AirCondition- 0 or 1, defaults 0
  • Pool - 0 or 1, defaults 0
  • Fireplace - 0 or 1, defaults 0
  • Garage - 0 or 1, defaults 0
  • Waterfront - 0 or 1, defaults 0
  • Acreage - 0 or 1, defaults 0
  • Keywords - search text
  • ListingIds - Comma Separated listing Ids to scope the search to
  • ReferenceNumber - Search using MLS #, this is required for viewing a listing detail
  • OpenHouse - 0 or 1, must include if filtering by open house
    • OpenHouseStartDate - MM/DD/YYYY
    • OpenHouseEndDate - MM/DD/YYYY

Feel free to PR and fork.

realtorca's People

Contributors

froren avatar hilts-vaughan avatar iwasrobbed avatar lcharbon avatar timot7782 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

realtorca's Issues

Intermittently fails with 403 with localhost:3000 and with CORS enabled

I am using localhost with chrome and with CORS enabled (same thing with firefox)
The API works for a while then it starts returning 403. Switch to Firefox, and it works for a while then it fails.
All in a sudden, it works again for a while and then it returns the error.
I have tried to clear the browser cache, and it does not help.
I have tried restarting the localhost and it does not help.
Nothing was changed in the logic, and it just simply stops working.

Please help.

Source

static getListings(options, callback) {
realtor.post(options)
.then(data => {
debugger
callback(data)
})
.catch(err => {
debugger
console.log(err)
});
}

Error

403 - "<html style="height:100%"><META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW"><meta name="format-detection" content="telephone=no"><meta name="viewport" content="initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><script src="/1d1b2b9ff80a163b7c7e711b7da13c06" async></script><body style="margin:0px;height:100%"><iframe id="main-iframe" src="/_Incapsula_Resource?CWUDNSAI=22&xinfo=4-81430764-0%20PNNN%20RT%281593375407092%200%29%20q%280%20-1%20-1%20-1%29%20r%281%20-1%29%20B15%2814%2c0%2c0%29%20U6&incident_id=305000120123612946-279287541296857860&edet=15&cinfo=0e000000c60b&rpinfo=0" frameborder=0 width="100%" height="100%" marginheight="0px" marginwidth="0px">Request unsuccessful. Incapsula incident ID: 305000120123612946-279287541296857860</iframe>""
name: "StatusCodeError

Convert to ES style

import pkg from 'realtorca/realtorca.js';
const { buildUrl, optionsFromUrl } = pkg;

//This is appropriate instead of the following...
const realtor = require('realtorca');

//Also...
pkg.post(opts)
//instead of realtor.post(opts)

PropertyDetails endpoint not working

Pretty straightforward. In February Realtor updated their app and the old version is obsolete.

Now the PropertyDetails endpoint doesn't work.

Does anyone have a solution for extracting data?

Is this still working?

I am getting the following error code:

[ErrorCode] => Array
    (
        [Id] => 400
        [Description] => The request was invalid.
        [LogId] => 
        [ProductName] => ! Push to A1-PR - Realtor API^16118
        [Version] => 1.0.6695.26582
    )

JSON response?

Sorry I had to open this issue as I'm not sure if this is still working properly.

I've followed your Usage guide but not sure what to expect in the response to the POST. I'm getting the below. Is this still working?

Promise {
_bitField: 0,
_fulfillmentHandler0: undefined,
_rejectionHandler0: undefined,
_promise0: undefined,
_receiver0: undefined,
_cancellationParent:
Promise {
_bitField: 1,
_fulfillmentHandler0: undefined,
_rejectionHandler0: { [Function: runBound] domain: [Domain] },
_promise0: [Circular],
_receiver0: undefined,
_cancellationParent:
Promise {
_bitField: 1,
_fulfillmentHandler0: [Function],
_rejectionHandler0: undefined,
_promise0: [Circular],
_receiver0: undefined,
_onCancelField: [Function],
_branchesRemainingToCancel: 1 },
_branchesRemainingToCancel: 1 } }

i have issue please help

D:\nodecompile>node nodetest.js
https://www.realtor.ca/Residential/Map.aspx#CultureId=1&ApplicationId=1&Property
SearchTypeId=1&ReferenceNumber=N4615865
RequestError: Error: Parse Error: Invalid header value char
at new RequestError (D:\nodecompile\node_modules\request-promise-core\lib\er
rors.js:14:15)
at Request.plumbing.callback (D:\nodecompile\node_modules\request-promise-co
re\lib\plumbing.js:87:29)
at Request.RP$callback [as _callback] (D:\nodecompile\node_modules\request-p
romise-core\lib\plumbing.js:46:31)
at self.callback (D:\nodecompile\node_modules\request\request.js:185:22)
at Request.emit (events.js:311:20)
at Request.onRequestError (D:\nodecompile\node_modules\request\request.js:87
7:8)
at ClientRequest.emit (events.js:311:20)
at TLSSocket.socketOnData (_http_client.js:483:9)
at TLSSocket.emit (events.js:311:20)
at addChunk (_stream_readable.js:294:12)
at readableAddChunk (_stream_readable.js:275:11)
at TLSSocket.Readable.push (_stream_readable.js:209:10)
at TLSWrap.onStreamRead (internal/stream_base_commons.js:186:23) {
name: 'RequestError',
message: 'Error: Parse Error: Invalid header value char',
cause: Error: Parse Error: Invalid header value char
at TLSSocket.socketOnData (_http_client.js:476:22)
at TLSSocket.emit (events.js:311:20)
at addChunk (_stream_readable.js:294:12)
at readableAddChunk (_stream_readable.js:275:11)
at TLSSocket.Readable.push (_stream_readable.js:209:10)
at TLSWrap.onStreamRead (internal/stream_base_commons.js:186:23) {
bytesParsed: 979,
code: 'HPE_INVALID_HEADER_TOKEN',
reason: 'Invalid header value char',
rawPacket: <Buffer 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d 0a 43 61
63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 70 72 69 76 61 74 65 0d 0a 43 6f 6e 74 65
6e 74 2d 4c ... 1402 more bytes>
},
error: Error: Parse Error: Invalid header value char
at TLSSocket.socketOnData (_http_client.js:476:22)
at TLSSocket.emit (events.js:311:20)
at addChunk (_stream_readable.js:294:12)
at readableAddChunk (_stream_readable.js:275:11)
at TLSSocket.Readable.push (_stream_readable.js:209:10)
at TLSWrap.onStreamRead (internal/stream_base_commons.js:186:23) {
bytesParsed: 979,
code: 'HPE_INVALID_HEADER_TOKEN',
reason: 'Invalid header value char',
rawPacket: <Buffer 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d 0a 43 61
63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 70 72 69 76 61 74 65 0d 0a 43 6f 6e 74 65
6e 74 2d 4c ... 1402 more bytes>
},
options: {
method: 'POST',
uri: 'https://api2.realtor.ca/Listing.svc/PropertySearch_Post',
form: {
CultureId: 1,
ApplicationId: 1,
PropertySearchTypeId: 1,
ReferenceNumber: 'N4615865'
},
json: true,
callback: [Function: RP$callback],
transform: undefined,
simple: true,
resolveWithFullResponse: false,
transform2xxOnly: false
},
response: undefined
}

D:\nodecompile>node nodetest.js
https://www.realtor.ca/Residential/Map.aspx#LongitudeMin=-79.6758985519409&Longi
tudeMax=-79.6079635620117&LatitudeMin=43.57601549736786&LatitudeMax=43.602250137
362276&PriceMin=100000&PriceMax=425000

D:\nodecompile>node nodetest.js
https://www.realtor.ca/Residential/Map.aspx#LongitudeMin=-79.6758985519409&Longi
tudeMax=-79.6079635620117&LatitudeMin=43.57601549736786&LatitudeMax=43.602250137
362276

D:\nodecompile>node nodetest.js
https://www.realtor.ca/Residential/Map.aspx#CultureId=1&ApplicationId=1&Property
SearchTypeId=1&ReferenceNumber=N4615865
RequestError: Error: Parse Error: Invalid header value char
at new RequestError (D:\nodecompile\node_modules\request-promise-core\lib\er
rors.js:14:15)
at Request.plumbing.callback (D:\nodecompile\node_modules\request-promise-co
re\lib\plumbing.js:87:29)
at Request.RP$callback [as _callback] (D:\nodecompile\node_modules\request-p
romise-core\lib\plumbing.js:46:31)
at self.callback (D:\nodecompile\node_modules\request\request.js:185:22)
at Request.emit (events.js:311:20)
at Request.onRequestError (D:\nodecompile\node_modules\request\request.js:87
7:8)
at ClientRequest.emit (events.js:311:20)
at TLSSocket.socketOnData (_http_client.js:483:9)
at TLSSocket.emit (events.js:311:20)
at addChunk (_stream_readable.js:294:12)
at readableAddChunk (_stream_readable.js:275:11)
at TLSSocket.Readable.push (_stream_readable.js:209:10)
at TLSWrap.onStreamRead (internal/stream_base_commons.js:186:23) {
name: 'RequestError',
message: 'Error: Parse Error: Invalid header value char',
cause: Error: Parse Error: Invalid header value char
at TLSSocket.socketOnData (_http_client.js:476:22)
at TLSSocket.emit (events.js:311:20)
at addChunk (_stream_readable.js:294:12)
at readableAddChunk (_stream_readable.js:275:11)
at TLSSocket.Readable.push (_stream_readable.js:209:10)
at TLSWrap.onStreamRead (internal/stream_base_commons.js:186:23) {
bytesParsed: 979,
code: 'HPE_INVALID_HEADER_TOKEN',
reason: 'Invalid header value char',
rawPacket: <Buffer 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d 0a 43 61
63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 70 72 69 76 61 74 65 0d 0a 43 6f 6e 74 65
6e 74 2d 4c ... 1402 more bytes>
},
error: Error: Parse Error: Invalid header value char
at TLSSocket.socketOnData (_http_client.js:476:22)
at TLSSocket.emit (events.js:311:20)
at addChunk (_stream_readable.js:294:12)
at readableAddChunk (_stream_readable.js:275:11)
at TLSSocket.Readable.push (_stream_readable.js:209:10)
at TLSWrap.onStreamRead (internal/stream_base_commons.js:186:23) {
bytesParsed: 979,
code: 'HPE_INVALID_HEADER_TOKEN',
reason: 'Invalid header value char',
rawPacket: <Buffer 48 54 54 50 2f 31 2e 31 20 32 30 30 20 4f 4b 0d 0a 43 61
63 68 65 2d 43 6f 6e 74 72 6f 6c 3a 20 70 72 69 76 61 74 65 0d 0a 43 6f 6e 74 65
6e 74 2d 4c ... 1402 more bytes>
},
options: {
method: 'POST',
uri: 'https://api2.realtor.ca/Listing.svc/PropertySearch_Post',
form: {
CultureId: 1,
ApplicationId: 1,
PropertySearchTypeId: 1,
ReferenceNumber: 'N4615865'
},
json: true,
callback: [Function: RP$callback],
transform: undefined,
simple: true,
resolveWithFullResponse: false,
transform2xxOnly: false
},
response: undefined
}

Imperva FlexProtect blocking API access

Here's what returns when I try to access the API:

<html style="height:100%"><head><META NAME="ROBOTS" CONTENT="NOINDEX, NOFOLLOW"><meta name="format-detection" content="telephone=no"><meta name="viewport" content="initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><script src="/eu-Leaftle-He-cut-taking-Wealt-now-and-To-ping-w" async></script></head><body style="margin:0px;height:100%"><iframe id="main-iframe" src="/_Incapsula_Resource?CWUDNSAI=22&xinfo=8-327499274-0%20NNNN%20RT%281607381083306%2051%29%20q%280%20-1%20-1%20-1%29%20r%280%20-1%29%20B15%2814%2c0%2c0%29%20U5&incident_id=305000300633682760-1104887500921440136&edet=15&cinfo=0e000000c609&rpinfo=0" frameborder=0 width="100%" height="100%" marginheight="0px" marginwidth="0px">Request unsuccessful. Incapsula incident ID: 305000300633682760-1104887500921440136</iframe></body></html>' } }

Here's my code:

const realtor = require("realtorca");

let opts = {
  LongitudeMin: -79.44438,
  LongitudeMax: -79.404,
  LatitudeMin: 43.75135,
  LatitudeMax: 43.78448,
  PriceMax: 1500000,
  ZoomLevel: 15,
  BuildingTypeId: 1,
};

realtor
  .post(opts)
  .then((data) => {
    console.log(data);
  })
  .catch((err) => {
  console.log(err)
  });

test

If I try and use this from an application it wont work because the api has only realtor.ca set as its origin policy... Only works on command line

API Documentation?

Do we know where there is documentation for the API itself? How did you find all the options? Was it by trial and error? I can't find anything for their API anywhere, but would love to build on this project.

API documentation for listing details

Hi there,

Thanks for putting this together. It's easy enough to get the listings but I was having a more difficult time getting a listing's detail information

Charles Proxy is a decent tool to use for inspecting API calls for mobile apps (rather than HTML-based calls like web) https://www.charlesproxy.com/documentation/ios/ since it acts as a "man-in-the-middle" SSL root certificate so it can read all API requests, headers, etc. This makes it much easier to work backwards from what the iOS app is doing to better understand how to create an API wrapper for your own personal needs.

Note: this was for an anonymous session (no account signed up / logged in)

cURL equivalent (using Postman) with the minimal set of parameters needed to get a result:

curl --location --request GET 'https://api37.realtor.ca:443//Listing.svc/PropertyDetails?PropertyId=22054689&ApplicationId=37&CultureId=1&HashCode=0&ReferenceNumber=15418919'

That gives a response like:

{
    "ErrorCode": {
        "Id": 200,
        "Description": "Success - OK",
        "ProductName": "! Push to PR-Stage - Realtor API (Maintenance)^28858 [Monday, August 10, 2020 8:50:12 AM]",
        "Version": "1.0.7527.15915"
    },
    "HashCode": "1471583764",
    "Id": "22054689",
    "MlsNumber": "15418919",
    "PublicRemarks": "Bardagi.com/1209 Very nice 6plex located in the charming Laurier East district. Close to all the shops and restaurants of the dynamic Mont-Royal avenue. Less than 10 minutes walk from the Laurier metro station of the Laurier Park. Very nice neighborhood life! Beautiful income property very well maintained! (37473608)",
    "LastUpdated": "2020-07-17 1:02:37 PM",
    "Building": {
        "BathroomTotal": "1",
        "Bedrooms": "3",
        "SizeInterior": "5730 sqft",
        "StoriesTotal": "3",
        "Type": "Multi-Family",
        "UnitTotal": "6",
        "BasementDevelopment": "Finished",
        "BasementFeatures": "Six feet and over",
        "BasementType": "Full (Finished)",
        "ConstructedDate": "1915",
        "ConstructionStyleAttachment": "Semi-detached",
        "HalfBathTotal": "0",
        "HeatingFuel": "Electric",
        "Room": [
            {
                "Type": "Living room",
                "Width": "10 ft ,10 in",
                "Length": "13 ft ,4 in",
                "Level": "Second level",
                "Dimension": "13 ft ,4 in x 10 ft ,10 in"
            },
            {
                "Type": "Bedroom",
                "Width": "12 ft ,2 in",
                "Length": "9 ft ,5 in",
                "Level": "Second level",
                "Dimension": "9 ft ,5 in x 12 ft ,2 in"
            },
            {
                "Type": "Bedroom",
                "Width": "9 ft ,6 in",
                "Length": "9 ft ,4 in",
                "Level": "Second level",
                "Dimension": "9 ft ,4 in x 9 ft ,6 in"
            },
            {
                "Type": "Bedroom",
                "Width": "8 ft ,7 in",
                "Length": "16 ft ,9 in",
                "Level": "Second level",
                "Dimension": "16 ft ,9 in x 8 ft ,7 in"
            },
            {
                "Type": "Kitchen",
                "Width": "8 ft ,9 in",
                "Length": "7 ft ,5 in",
                "Level": "Second level",
                "Dimension": "7 ft ,5 in x 8 ft ,9 in"
            },
            {
                "Type": "Dinette",
                "Width": "9 ft ,3 in",
                "Length": "9 ft ,5 in",
                "Level": "Second level",
                "Dimension": "9 ft ,5 in x 9 ft ,3 in"
            },
            {
                "Type": "Bathroom",
                "Width": "4 ft",
                "Length": "9 ft ,9 in",
                "Level": "Second level",
                "Dimension": "9 ft ,9 in x 4 ft"
            },
            {
                "Type": "Living room",
                "Width": "11 ft ,1 in",
                "Length": "13 ft ,10 in",
                "Level": "Second level",
                "Dimension": "13 ft ,10 in x 11 ft ,1 in"
            },
            {
                "Type": "Bedroom",
                "Width": "10 ft ,2 in",
                "Length": "10 ft ,1 in",
                "Level": "Second level",
                "Dimension": "10 ft ,1 in x 10 ft ,2 in"
            },
            {
                "Type": "Bedroom",
                "Width": "8 ft ,10 in",
                "Length": "11 ft ,6 in",
                "Level": "Second level",
                "Dimension": "11 ft ,6 in x 8 ft ,10 in"
            },
            {
                "Type": "Kitchen",
                "Width": "8 ft ,10 in",
                "Length": "15 ft ,8 in",
                "Level": "Second level",
                "Dimension": "15 ft ,8 in x 8 ft ,10 in"
            },
            {
                "Type": "Dinette",
                "Width": "8 ft ,6 in",
                "Length": "10 ft ,1 in",
                "Level": "Second level",
                "Dimension": "10 ft ,1 in x 8 ft ,6 in"
            },
            {
                "Type": "Bathroom",
                "Width": "8 ft ,10 in",
                "Length": "11 ft ,6 in",
                "Level": "Second level",
                "Dimension": "11 ft ,6 in x 8 ft ,10 in"
            },
            {
                "Type": "Living room",
                "Width": "10 ft ,10 in",
                "Length": "13 ft ,7 in",
                "Level": "Third level",
                "Dimension": "13 ft ,7 in x 10 ft ,10 in"
            },
            {
                "Type": "Bedroom",
                "Width": "10 ft ,8 in",
                "Length": "9 ft ,4 in",
                "Level": "Third level",
                "Dimension": "9 ft ,4 in x 10 ft ,8 in"
            },
            {
                "Type": "Bedroom",
                "Width": "13 ft ,5 in",
                "Length": "9 ft ,6 in",
                "Level": "Third level",
                "Dimension": "9 ft ,6 in x 13 ft ,5 in"
            },
            {
                "Type": "Bedroom",
                "Width": "11 ft",
                "Length": "8 ft ,4 in",
                "Level": "Third level",
                "Dimension": "8 ft ,4 in x 11 ft"
            },
            {
                "Type": "Office",
                "Width": "10 ft ,1 in",
                "Length": "6 ft ,9 in",
                "Level": "Third level",
                "Dimension": "6 ft ,9 in x 10 ft ,1 in"
            },
            {
                "Type": "Kitchen",
                "Width": "12 ft",
                "Length": "11 ft ,5 in",
                "Level": "Third level",
                "Dimension": "11 ft ,5 in x 12 ft"
            },
            {
                "Type": "Bathroom",
                "Width": "5 ft ,4 in",
                "Length": "9 ft ,3 in",
                "Level": "Third level",
                "Dimension": "9 ft ,3 in x 5 ft ,4 in"
            },
            {
                "Type": "Living room",
                "Width": "10 ft ,10 in",
                "Length": "61 ft ,11 in",
                "Level": "Third level",
                "Dimension": "61 ft ,11 in x 10 ft ,10 in"
            },
            {
                "Type": "Bedroom",
                "Width": "10 ft ,2 in",
                "Length": "11 ft ,2 in",
                "Level": "Third level",
                "Dimension": "11 ft ,2 in x 10 ft ,2 in"
            },
            {
                "Type": "Bedroom",
                "Width": "10 ft ,11 in",
                "Length": "10 ft",
                "Level": "Third level",
                "Dimension": "10 ft x 10 ft ,11 in"
            },
            {
                "Type": "Bedroom",
                "Width": "11 ft",
                "Length": "8 ft ,4 in",
                "Level": "Third level",
                "Dimension": "8 ft ,4 in x 11 ft"
            },
            {
                "Type": "Office",
                "Width": "11 ft ,9 in",
                "Length": "6 ft ,10 in",
                "Level": "Third level",
                "Dimension": "6 ft ,10 in x 11 ft ,9 in"
            },
            {
                "Type": "Kitchen",
                "Width": "8 ft ,6 in",
                "Length": "11 ft ,7 in",
                "Level": "Third level",
                "Dimension": "11 ft ,7 in x 8 ft ,6 in"
            },
            {
                "Type": "Dinette",
                "Width": "8 ft ,8 in",
                "Length": "10 ft ,5 in",
                "Level": "Third level",
                "Dimension": "10 ft ,5 in x 8 ft ,8 in"
            },
            {
                "Type": "Bathroom",
                "Width": "4 ft ,11 in",
                "Length": "8 ft ,2 in",
                "Level": "Third level",
                "Dimension": "8 ft ,2 in x 4 ft ,11 in"
            },
            {
                "Type": "Bedroom",
                "Width": "10 ft ,9 in",
                "Length": "11 ft ,11 in",
                "Level": "Basement",
                "Dimension": "11 ft ,11 in x 10 ft ,9 in"
            },
            {
                "Type": "Family room",
                "Width": "13 ft ,5 in",
                "Length": "10 ft ,5 in",
                "Level": "Basement",
                "Dimension": "10 ft ,5 in x 13 ft ,5 in"
            },
            {
                "Type": "Family room",
                "Width": "11 ft ,2 in",
                "Length": "7 ft ,7 in",
                "Level": "Basement",
                "Dimension": "7 ft ,7 in x 11 ft ,2 in"
            },
            {
                "Type": "Bathroom",
                "Width": "7 ft",
                "Length": "5 ft ,5 in",
                "Level": "Basement",
                "Dimension": "5 ft ,5 in x 7 ft"
            },
            {
                "Type": "Laundry room",
                "Width": "7 ft",
                "Length": "5 ft ,4 in",
                "Level": "Basement",
                "Dimension": "5 ft ,4 in x 7 ft"
            },
            {
                "Type": "Family room",
                "Width": "14 ft ,4 in",
                "Length": "11 ft ,5 in",
                "Level": "Basement",
                "Dimension": "11 ft ,5 in x 14 ft ,4 in"
            },
            {
                "Type": "Bedroom",
                "Width": "11 ft ,8 in",
                "Length": "10 ft ,8 in",
                "Level": "Basement",
                "Dimension": "10 ft ,8 in x 11 ft ,8 in"
            },
            {
                "Type": "Office",
                "Width": "11 ft ,9 in",
                "Length": "14 ft ,8 in",
                "Level": "Basement",
                "Dimension": "14 ft ,8 in x 11 ft ,9 in"
            },
            {
                "Type": "Laundry room",
                "Width": "4 ft ,8 in",
                "Length": "5 ft ,5 in",
                "Level": "Basement",
                "Dimension": "5 ft ,5 in x 4 ft ,8 in"
            },
            {
                "Type": "Living room",
                "Width": "11 ft",
                "Length": "13 ft ,5 in",
                "Level": "Main level",
                "Dimension": "13 ft ,5 in x 11 ft"
            },
            {
                "Type": "Bedroom",
                "Width": "11 ft ,1 in",
                "Length": "12 ft ,10 in",
                "Level": "Main level",
                "Dimension": "12 ft ,10 in x 11 ft ,1 in"
            },
            {
                "Type": "Bedroom",
                "Width": "11 ft ,8 in",
                "Length": "13 ft",
                "Level": "Main level",
                "Dimension": "13 ft x 11 ft ,8 in"
            },
            {
                "Type": "Kitchen",
                "Width": "8 ft ,6 in",
                "Length": "7 ft ,2 in",
                "Level": "Main level",
                "Dimension": "7 ft ,2 in x 8 ft ,6 in"
            },
            {
                "Type": "Dinette",
                "Width": "8 ft ,7 in",
                "Length": "11 ft ,2 in",
                "Level": "Main level",
                "Dimension": "11 ft ,2 in x 8 ft ,7 in"
            },
            {
                "Type": "Bathroom",
                "Width": "9 ft ,11 in",
                "Length": "4 ft ,11 in",
                "Level": "Main level",
                "Dimension": "4 ft ,11 in x 9 ft ,11 in"
            },
            {
                "Type": "Living room",
                "Width": "11 ft ,2 in",
                "Length": "13 ft ,9 in",
                "Level": "Main level",
                "Dimension": "13 ft ,9 in x 11 ft ,2 in"
            },
            {
                "Type": "Bedroom",
                "Width": "14 ft ,11 in",
                "Length": "13 ft ,7 in",
                "Level": "Main level",
                "Dimension": "13 ft ,7 in x 14 ft ,11 in"
            },
            {
                "Type": "Bedroom",
                "Width": "8 ft ,11 in",
                "Length": "11 ft ,11 in",
                "Level": "Main level",
                "Dimension": "11 ft ,11 in x 8 ft ,11 in"
            },
            {
                "Type": "Kitchen",
                "Width": "8 ft ,1 in",
                "Length": "15 ft ,9 in",
                "Level": "Main level",
                "Dimension": "15 ft ,9 in x 8 ft ,1 in"
            },
            {
                "Type": "Dinette",
                "Width": "9 ft ,7 in",
                "Length": "10 ft ,4 in",
                "Level": "Main level",
                "Dimension": "10 ft ,4 in x 9 ft ,7 in"
            },
            {
                "Type": "Bathroom",
                "Width": "5 ft ,1 in",
                "Length": "8 ft ,1 in",
                "Level": "Main level",
                "Dimension": "8 ft ,1 in x 5 ft ,1 in"
            }
        ],
        "Water": "Municipal water",
        "DisplayAsYears": "0",
        "FireplacePresent": "",
        "BuiltIn": "1915"
    },
    "Land": {
        "SizeTotal": "2735 sqft",
        "Sewer": "Municipal sewage system"
    },
    "Individual": [
        {
            "IndividualID": 1440073,
            "Name": "Georges Bardagi",
            "Organization": {
                "OrganizationID": 69938,
                "Name": "RE/MAX DU CARTIER G.B.",
                "Logo": "https://cdn.realtor.ca/organization/en-CA/TS637305877570000000/lowres/1132738.jpg",
                "Address": {
                    "AddressText": "100 - 1290 Bernard Ouest |Outremont, Quebec H2V1V9"
                },
                "Phones": [
                    {
                        "PhoneType": "Telephone",
                        "PhoneNumber": "271-9895",
                        "AreaCode": "514",
                        "PhoneTypeId": "1"
                    },
                    {
                        "PhoneType": "Fax",
                        "PhoneNumber": "271-8800",
                        "AreaCode": "514",
                        "PhoneTypeId": "4"
                    }
                ],
                "Emails": [
                    {
                        "ContactId": "424697395"
                    }
                ],
                "Websites": [
                    {
                        "Website": "http://www.bardagi.com",
                        "WebsiteTypeId": "1"
                    }
                ],
                "OrganizationType": "Firm",
                "Designation": "Real Estate Agency",
                "HasEmail": true,
                "PermitFreetextEmail": true,
                "PermitShowListingLink": true,
                "RelativeDetailsURL": "/office/firm/69938/remax-du-cartier-gb-100-1290-bernard-ouest-outremont-quebec-h2v1v9",
                "PhotoLastupdate": "2020-07-17 1:02:37 PM"
            },
            "Phones": [
                {
                    "PhoneType": "Telephone",
                    "PhoneNumber": "271-9895",
                    "AreaCode": "514",
                    "PhoneTypeId": "1"
                }
            ],
            "Websites": [
                {
                    "Website": "http://www.bardagi.com",
                    "WebsiteTypeId": "1"
                }
            ],
            "Emails": [
                {
                    "ContactId": "421658289"
                }
            ],
            "Photo": "https://cdn.realtor.ca/individual/TS636840535200000000/lowres/1077368.jpg",
            "Position": "Certified Real Estate Broker",
            "PermitFreetextEmail": true,
            "FirstName": "Georges",
            "LastName": "Bardagi",
            "CorporationDisplayTypeId": "0",
            "PermitShowListingLink": true,
            "RelativeDetailsURL": "/agent/1440073/georges-bardagi-100---1290-bernard-ouest--outremont-quebec-h2v1v9",
            "AgentPhotoLastUpdated": "2019-01-25 22:52:00"
        }
    ],
    "Property": {
        "Price": "$2,795,000",
        "Type": "Multi-family",
        "Address": {
            "AddressText": "5106-5116 Rue Fabre|Montrรฉal (Le Plateau-Mont-Royal), Quebec H2J3W5",
            "Longitude": "-73.583143",
            "Latitude": "45.534695",
            "Neighbourhood": "Le Plateau-Mont-Royal",
            "PermitShowAddress": true
        },
        "Photo": [
            {
                "SequenceId": "1",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202500570000/reb5/highres/9/15418919_1.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202500570000/reb5/medres/9/15418919_1.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202500570000/reb5/lowres/9/15418919_1.jpg",
                "Description": "Frontage",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "2",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202501200000/reb5/highres/9/15418919_2.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202501200000/reb5/medres/9/15418919_2.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202501200000/reb5/lowres/9/15418919_2.jpg",
                "Description": "Frontage",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "3",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202501600000/reb5/highres/9/15418919_3.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202501600000/reb5/medres/9/15418919_3.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202501600000/reb5/lowres/9/15418919_3.jpg",
                "Description": "Living room",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "4",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202501670000/reb5/highres/9/15418919_4.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202501670000/reb5/medres/9/15418919_4.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202501670000/reb5/lowres/9/15418919_4.jpg",
                "Description": "Dinette",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "5",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202501770000/reb5/highres/9/15418919_5.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202501770000/reb5/medres/9/15418919_5.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202501770000/reb5/lowres/9/15418919_5.jpg",
                "Description": "Kitchen",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "6",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202501870000/reb5/highres/9/15418919_6.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202501870000/reb5/medres/9/15418919_6.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202501870000/reb5/lowres/9/15418919_6.jpg",
                "Description": "Bedroom",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "7",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202501900000/reb5/highres/9/15418919_7.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202501900000/reb5/medres/9/15418919_7.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202501900000/reb5/lowres/9/15418919_7.jpg",
                "Description": "Bedroom",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "8",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202501970000/reb5/highres/9/15418919_8.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202501970000/reb5/medres/9/15418919_8.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202501970000/reb5/lowres/9/15418919_8.jpg",
                "Description": "Bedroom",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "9",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202502070000/reb5/highres/9/15418919_9.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202502070000/reb5/medres/9/15418919_9.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202502070000/reb5/lowres/9/15418919_9.jpg",
                "Description": "Living room",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "10",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202500600000/reb5/highres/9/15418919_10.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202500600000/reb5/medres/9/15418919_10.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202500600000/reb5/lowres/9/15418919_10.jpg",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "11",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202500700000/reb5/highres/9/15418919_11.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202500700000/reb5/medres/9/15418919_11.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202500700000/reb5/lowres/9/15418919_11.jpg",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "12",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202500700000/reb5/highres/9/15418919_12.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202500700000/reb5/medres/9/15418919_12.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202500700000/reb5/lowres/9/15418919_12.jpg",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "13",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202500770000/reb5/highres/9/15418919_13.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202500770000/reb5/medres/9/15418919_13.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202500770000/reb5/lowres/9/15418919_13.jpg",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "14",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202500870000/reb5/highres/9/15418919_14.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202500870000/reb5/medres/9/15418919_14.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202500870000/reb5/lowres/9/15418919_14.jpg",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "15",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202500900000/reb5/highres/9/15418919_15.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202500900000/reb5/medres/9/15418919_15.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202500900000/reb5/lowres/9/15418919_15.jpg",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "16",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202500970000/reb5/highres/9/15418919_16.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202500970000/reb5/medres/9/15418919_16.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202500970000/reb5/lowres/9/15418919_16.jpg",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "17",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202501000000/reb5/highres/9/15418919_17.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202501000000/reb5/medres/9/15418919_17.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202501000000/reb5/lowres/9/15418919_17.jpg",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "18",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202501070000/reb5/highres/9/15418919_18.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202501070000/reb5/medres/9/15418919_18.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202501070000/reb5/lowres/9/15418919_18.jpg",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "19",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202501100000/reb5/highres/9/15418919_19.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202501100000/reb5/medres/9/15418919_19.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202501100000/reb5/lowres/9/15418919_19.jpg",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "20",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202501300000/reb5/highres/9/15418919_20.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202501300000/reb5/medres/9/15418919_20.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202501300000/reb5/lowres/9/15418919_20.jpg",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "21",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202501370000/reb5/highres/9/15418919_21.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202501370000/reb5/medres/9/15418919_21.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202501370000/reb5/lowres/9/15418919_21.jpg",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "22",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202501400000/reb5/highres/9/15418919_22.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202501400000/reb5/medres/9/15418919_22.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202501400000/reb5/lowres/9/15418919_22.jpg",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "23",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202501470000/reb5/highres/9/15418919_23.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202501470000/reb5/medres/9/15418919_23.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202501470000/reb5/lowres/9/15418919_23.jpg",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            },
            {
                "SequenceId": "24",
                "HighResPath": "https://cdn.realtor.ca/listing/TS637293202501570000/reb5/highres/9/15418919_24.jpg",
                "MedResPath": "https://cdn.realtor.ca/listing/TS637293202501570000/reb5/medres/9/15418919_24.jpg",
                "LowResPath": "https://cdn.realtor.ca/listing/TS637293202501570000/reb5/lowres/9/15418919_24.jpg",
                "LastUpdated": "2020-07-02 8:57:30 PM"
            }
        ],
        "TypeId": "310",
        "FarmType": "Other",
        "ZoningType": "Residential",
        "AmmenitiesNearBy": "CEGEP, Park, Schools, Public Transit, University",
        "Features": "Sliding windows",
        "TransactionType": "For sale"
    },
    "AlternateURL": {
        "DetailsLink": "http://passerelle.centris.ca/redirect.aspx?CodeDest=DUCARTIERGB&NoMLS=15418919&Lang=E",
        "VideoLink": "https://youtu.be/bLkwfQ9uomY"
    },
    "UploadedBy": "Quebec Professional Association of Real Estate Brokers",
    "Business": {
        "BathroomTotal": "1",
        "Bedrooms": "3",
        "SizeInterior": "5730 sqft",
        "StoriesTotal": "3",
        "Type": "Multi-Family",
        "UnitTotal": "6"
    }
}

Full dump of Charles response:

[
   {
      "status":"COMPLETE",
      "method":"GET",
      "protocolVersion":"HTTP/1.1",
      "scheme":"https",
      "host":"api37.realtor.ca",
      "actualPort":443,
      "path":"/Listing.svc/PropertyDetails",
      "query":"ApplicationId=37&CultureId=1&HashCode=0&PreferedMeasurementUnit=1&PropertyId=22054689&ReferenceNumber=15418919",
      "tunnel":false,
      "keptAlive":true,
      "webSocket":false,
      "remoteAddress":"api37.realtor.ca/23.100.82.11",
      "clientAddress":"198.18.72.253/198.18.72.253",
      "times":{
         "start":"2020-08-15T13:33:22.259-04:00",
         "requestBegin":"2020-08-15T13:33:22.282-04:00",
         "requestComplete":"2020-08-15T13:33:22.289-04:00",
         "responseBegin":"2020-08-15T13:33:22.466-04:00",
         "end":"2020-08-15T13:33:22.529-04:00"
      },
      "durations":{

      },
      "totalSize":"5571",
      "ssl":{
         "protocol":"TLSv1.2",
         "cipherSuite":"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"
      },
      "request":{
         "sizes":{
            "body":"0",
            "headers":664
         },
         "mimeType":null,
         "charset":null,
         "contentEncoding":null,
         "header":{
            "firstLine":"GET /Listing.svc/PropertyDetails?ApplicationId=37&CultureId=1&HashCode=0&PreferedMeasurementUnit=1&PropertyId=22054689&ReferenceNumber=15418919 HTTP/1.1",
            "headers":[
               {
                  "name":"Host",
                  "value":"api37.realtor.ca"
               },
               {
                  "name":"Accept",
                  "value":"application/json"
               },
               {
                  "name":"X-CREA-App-ID",
                  "value":"37"
               },
               {
                  "name":"X-CREA-App-Token",
                  "value":"937ghfd342few2rnbvhgfhjug"
               },
               {
                  "name":"X-CREA-Max-Record",
                  "value":"500"
               },
               {
                  "name":"X-CREA-Device-Platform",
                  "value":"iPhone"
               },
               {
                  "name":"Accept-Language",
                  "value":"en;q=1"
               },
               {
                  "name":"X-CREA-Device-ID",
                  "value":"077406F7-811A-4F07-A4EB-BA58A17950D4"
               },
               {
                  "name":"User-Agent",
                  "value":"REALTOR/3.2.12 (iPhone; iOS 13.4.1; Scale/2.00)"
               },
               {
                  "name":"Accept-Encoding",
                  "value":"gzip, deflate, br"
               },
               {
                  "name":"Connection",
                  "value":"keep-alive"
               },
               {
                  "name":"X-CREA-Max-RecordPerPage",
                  "value":"200"
               },
               {
                  "name":"X-CREA-API-Version",
                  "value":"1.0"
               },
               {
                  "name":"X-CREA-App-Version",
                  "value":"3.2.12"
               },
               {
                  "name":"Cookie",
                  "value":"ASP.NET_SessionId=jxjtvae3ts5zoxiacwemchb1"
               }
            ]
         }
      },
      "response":{
         "sizes":{
            "body":"4479",
            "headers":428
         },
         "mimeType":"application/json",
         "charset":"utf-8",
         "contentEncoding":"gzip",
         "header":{
            "firstLine":"HTTP/1.1 200 OK",
            "headers":[
               {
                  "name":"Cache-Control",
                  "value":"private"
               },
               {
                  "name":"Content-Length",
                  "value":"4479"
               },
               {
                  "name":"Content-Type",
                  "value":"application/json; charset=utf-8"
               },
               {
                  "name":"Content-Encoding",
                  "value":"gzip"
               },
               {
                  "name":"Vary",
                  "value":"Accept-Encoding"
               },
               {
                  "name":"Server",
                  "value":"Microsoft-IIS/10.0"
               },
               {
                  "name":"X-AspNet-Version",
                  "value":"4.0.30319"
               },
               {
                  "name":"Request-Context",
                  "value":"appId=cid-v1:bfc3c1b2-9e1b-437e-9616-7d1636843cb5"
               },
               {
                  "name":"Access-Control-Expose-Headers",
                  "value":"Request-Context"
               },
               {
                  "name":"X-Powered-By",
                  "value":"ASP.NET"
               },
               {
                  "name":"Arr-Disable-Session-Affinity",
                  "value":"true"
               },
               {
                  "name":"Date",
                  "value":"Sat, 15 Aug 2020 17:33:22 GMT"
               }
            ]
         },
         "body":{
            "encoding":"base64",
            "encoded":"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"
         }
      }
   }
]

Property Search POST CultureID Error

Trying the following POST using postman application to get the error below.

POST URL:
https://api37.realtor.ca/Listing.svc/PropertySearch_Post?CultureId=1&ApplicationId=37&PropertySearchTypeId=1&LongitudeMin=-79.6758985519409&LongitudeMax=-79.6079635620117&LatitudeMin=43.57601549736786&LatitudeMax=43.602250137362276&PriceMin=100000&PriceMax=410000

Response:
'''
{
"ErrorCode": {
"Id": 400,
"Description": "The request was invalid. - Invalid CultureID",
"LogId": "",
"ProductName": "! Push to PR-Stage - Realtor API (Maintenance)^30886 + UTMCode fix [Tuesday, April 27, 2021 12:36:06 PM]",
"Version": "1.0.7787.22690"
},
"Paging": {
"RecordsPerPage": 0,
"CurrentPage": 0,
"TotalRecords": 0,
"MaxRecords": 0,
"TotalPages": 0,
"RecordsShowing": 0,
"Pins": 0
},
"Results": [],
"Pins": []
}
'''

I have also tried "CultureID" instead of CultureId.

The following GET propertydetails works:

https://api37.realtor.ca/Listing.svc/PropertyDetails?PropertyId=23130944&ReferenceNumber=W5212558&ApplicationId=37&CultureId=1

Help

hey I am trying to get all listings from toronto and vancover. I am very new at python can you help?

Any authorization required to use this API?

Hi, I used the same CURL request what I did this on 2019/2020 as it was worked those times, however, today I got this response.
{
"ErrorCode":
{
"Id":400,
"Description":"The request was invalid. - Request is not authorized",
"LogId":"",
"ProductName":"Realtor API 7 (Git) | 20220128.2 | 4054540f0e50864b57025e27f6781cffdc59242c | Friday, January 28, 2022 12:08:03 PM",
"Version":"1.0.8063.30858"},
}
Is there any authorization required for this?
Thanks in advance.

Get details API is not available

Getting the details doesn't seem to be available. Even making a call directly to the API returns this:

{ "ErrorCode": { "Id": 500, "Description": "Internal server error. Please contact [email protected] - ApplicationId of '' was fetched via '' and was not found within Application enumeration", "LogId": "dcb5f097-d9fb-4604-9c58-3ced29d56853", "ProductName": "! Push to PR-Stage - Realtor API (Maintenance)^29183 [Monday, September 14, 2020 1:17:36 PM]", "Version": "1.0.7562.23983" } }
Any idea?

Good work by the way!

Way to get listings by agent?

I was wondering if the node app could search for listings on realtor.ca by REALTOR name/MLS identifier? (sorry I had to open this as an issue, there was no way to contact you on github) :/

Clarify Readme: server side or web browser use

Hello! Thanks for making this awesome tool.

It would be great to clarify the deploy target in the readme.

I'm attempting to write a fork using Axios for web browsers and am running into issues accessing the API.

Does anyone know if the realtor.ca endpoint only be accessed from localhost? Would I be able to use a cloud lambda function? (Calling server side in a web app)

It would be great to clarify this (can use only on localhost, server side, or web browser) in the readme.

Thanks again!

Demo code is broken

When I try your demo locally:

const realtor = require('./realtorca');

let opts = {
    ReferenceNumber: "W5254257",
};

opts = {
  LongitudeMin: -79.6758985519409,
  LongitudeMax: -79.6079635620117,
  LatitudeMin: 43.57601549736786,
  LatitudeMax: 43.602250137362276,
  PriceMin: 100000,
  PriceMax: 410000
};

console.log( realtor.buildUrl(opts) );

realtor.post(opts)
  .then(data => {
    console.log(data);
  })
  .catch(console.error);

โ€ฆ I get an HTTP 403.

Does this tool still work? It seems to depend on behaviour that I suspect the powers-that-be in Toronto RE want not to work.

Returning all results by Province

Hello,

I'm looking to get all the results for a specific province. For instance, if I try to get all the results for all of BC and set the latitude and longitude parameters, I'm going to end up getting some results from Alberta because some of Alberta falls within the boundary.

What is the best method for pulling results for a specific province such as British Columbia?

Any assistance would be appreciated.

Limits

Does this api have a limit on the number of requests?

Performing a simple request with POSTMAN

I tried to mimic what the JS code does here, but using POSTMAN/CURL.

curl --location --request POST 'https://api2.realtor.ca/Listing.svc/PropertySearch_Post' \
--header 'Content-Type: application/json' \
--form 'CultureID=3' \
--form 'ApplicationId=1' \
--form 'PropertySearchTypeId=1'

This is the response I get:

{
    "ErrorCode": {
        "Id": 400,
        "Description": "The request was invalid. - Invalid CultureID",
        "LogId": "",
        "ProductName": "! Push to PR-Stage - Realtor API (Maintenance)^28212 [Monday, June 15, 2020 8:22:30 AM]",
        "Version": "1.0.7471.15085"
    },
    "Paging": {
        "RecordsPerPage": 0,
        "CurrentPage": 0,
        "TotalRecords": 0,
        "MaxRecords": 0,
        "TotalPages": 0,
        "RecordsShowing": 0,
        "Pins": 0
    },
    "Results": [],
    "Pins": []
}

Is there an official doc for this stuff? Kind of looked everywhere and all I see are VB.NET and C# examples...

The request failed "Access Denied"

Good afternoon.
Problem.

The request worked stopped working from 18-07-2022 (the request has been running since 2017)

PHP Fatal error: Uncaught exception 'GuzzleHttp\Exception\ClientException' with message 'Client error response [url] https://api37.realtor.ca/Listing.svc/PropertySearch [status code] 403 [reason phrase] Forbidden'

Request from POSTMAN
gives :
Access Denied
error 15
api37.realtor.ca
2022-07-22 10:12:42 UTC
(
https://api37.realtor.ca/_Incapsula_Resource?CWUDNSAI=23&xinfo=12-41705013-0%20NNNN%20RT%281658483914883%2018%29%20q%280%20-1%20-1%208%29%20r% 280%20-1%29%20B15%2814%2c0%2c0%29%20U5&incident_id=729000760091225407-206337989953524492&edet=15&cinfo=0e0000008a09&rpinfo=0&mth=POST
)

Determine is listing is still active

I am wondering if there's a way to determine if a listing is still active from accessing the PropertyDetails endpoint?

I am able to view information from previously sold houses but there's nothing in the API response telling me that it's been sold. If I go to realtor.ca and try to view the listing I can see that the listing has been removed/sold.

Any advice?
Thanks

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.