API Version 1.18.0
Introduction
Welcome to the AnyProp RESO Listings API documentation. Our API provides access to real estate listing data following the Real Estate Standards Organization (RESO) Web API standards. We utilize OData (Open Data Protocol) to offer a flexible and powerful querying capability for our data resources.
Authentication
All API calls (except the token endpoint) require a Bearer token in the Authorization header:
Authorization: Bearer your_access_tokenGetting an Access Token
Get authentication token
https://api.anyprop.com/v1/tokenObtain an access token using your credentials
usernamestringrequiredYour API username
passwordstring · passwordrequiredYour API password
200Successful authenticationapplication/json
access_tokenstringoptionalexpires_inintegeroptionalExample: 2592000
typestringoptionalExample: Bearer
400Invalid requestapplication/json
errorobjectoptionalShow properties
codestringoptionalmessagestringoptionalfetch("https://api.anyprop.com/v1/token", {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
body: new URLSearchParams({
username: "Your API username",
password: "Your API password"
})
})
.then(res => res.json())
.then(console.log);
curl -X POST \
https://api.anyprop.com/v1/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "username=Your API username&password=Your API password"import requests
response = requests.post(
"https://api.anyprop.com/v1/token",
headers={"Content-Type": "application/x-www-form-urlencoded"},
data={"username": "Your API username", "password": "Your API password"}
)
print(response.json())POST /v1/token HTTP/1.1
Host: api.anyprop.com
Content-Type: application/x-www-form-urlencoded
username=Your%20API%20username&password=Your%20API%20passwordResponse example
{
"access_token": "text",
"expires_in": 2592000,
"type": "Bearer"
}{
"error": {
"code": "text",
"message": "text"
}
}Account Resources, Settings, and Permission
You can view account settings and permissions on the account/resources endpoint.
Get account resources
https://api.anyprop.com/v1/account/resourcesRetrieve resources and permissions for the account
AuthorizationstringrequiredBearer authentication header of the form Bearer <token>.
200Successful responseapplication/json
resourcesobjectoptionalShow properties
listingsstring[]optionalShow item properties
401Unauthorizedapplication/json
errorobjectoptionalShow properties
codestringoptionalmessagestringoptionalGET /v1/account/resources HTTP/1.1
Host: api.anyprop.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl --request GET \
--url 'https://api.anyprop.com/v1/account/resources' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Accept: */*'fetch("https://api.anyprop.com/v1/account/resources", {
"method": "GET",
"headers": {
"Authorization": "Bearer YOUR_SECRET_TOKEN",
"Accept": "*/*"
}
})
.then(response => response.json())
.then(console.log);import requests
response = requests.get(
"https://api.anyprop.com/v1/account/resources",
headers={
"Authorization": "Bearer YOUR_SECRET_TOKEN",
"Accept": "*/*"
}
)
print(response.json())Response example
{
"resources": {
"listings": [
{
"originating_system_name": "agsmls",
"originating_system_full_name": "aspen glenwood mls"
},
{
"originating_system_name": "chsmls",
"originating_system_full_name": "CHS Regional MLS"
},
{
"originating_system_name": "mlsl",
"originating_system_full_name": "mlslistings"
},
{
"originating_system_name": "sdmls",
"originating_system_full_name": "san diego mls"
},
{
"originating_system_name": "summit",
"originating_system_full_name": "altitude realtors"
},
{
"originating_system_name": "theclaw",
"originating_system_full_name": "claw mls"
},
{
"originating_system_name": "vbor",
"originating_system_full_name": "vail board of realtors"
}
]
}
}{
"error": {
"code": "text",
"message": "text"
}
}MLS Profiles
You can get mls profiles (including logos, disclaimers, and basic compliance elements).
Get MLS profiles
https://api.anyprop.com/v1/listings/mls_profilesRetrieve profiles for active MLSes (including logos, disclaimers, and basic compliance elements).
AuthorizationstringrequiredBearer authentication header of the form Bearer <token>.
200Successful responseapplication/json
profilesobjectoptionalMLS profiles with logos, disclaimers, and compliance elements
Show properties
Additional properties allowed
401Unauthorizedapplication/json
errorobjectoptionalShow properties
codestringoptionalmessagestringoptionalGET /v1/listings/mls_profiles HTTP/1.1
Host: api.anyprop.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl --request GET \
--url 'https://api.anyprop.com/v1/listings/mls_profiles' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Accept: */*'fetch("https://api.anyprop.com/v1/listings/mls_profiles", {
"method": "GET",
"headers": {
"Authorization": "Bearer YOUR_SECRET_TOKEN",
"Accept": "*/*"
}
})
.then(response => response.json())
.then(console.log);import requests
response = requests.get(
"https://api.anyprop.com/v1/listings/mls_profiles",
headers={
"Authorization": "Bearer YOUR_SECRET_TOKEN",
"Accept": "*/*"
}
)
print(response.json())Response example
{
"profiles": {
"agsmls": {
"originating_system_name": "agsmls",
"originating_system_full_name": "aspen glenwood mls",
"disclaimer": "Copyright {{current_year}} Aspen Glenwood MLS. Information is provided exclusively for consumers' personal, non-commercial use and may not be used for any purpose other than to identify prospective properties consumers may be interested in purchasing. This information is deemed reliable but is not guaranteed accurate by the MLS.",
"mls_logo": "https://photos.anpcdn.com/assets/listings/mls-logo/agsmls-logo.png",
"current_year": "2025",
"required_update_frequency": "12 hours",
"required_update_frequency_hours": "12"
},
"chsmls": {
"originating_system_name": "chsmls",
"originating_system_full_name": "CHS Regional MLS",
"disclaimer": "Copyright {{current_year}} CHS Regional MLS. Information is provided exclusively for consumers' personal, non-commercial use and may not be used for any purpose other than to identify prospective properties consumers may be interested in purchasing. This information is deemed reliable but is not guaranteed accurate by the MLS.",
"mls_logo": "https://photos.anpcdn.com/assets/listings/mls-logo/chsmls-logo.png",
"current_year": "2025",
"required_update_frequency": "24 hours",
"required_update_frequency_hours": "24"
}
}
}{
"error": {
"code": "text",
"message": "text"
}
}API Resources
The base URL for all listings API requests is:
https://api.anyprop.com/v1/listings/dataProperty Resource
Get property listings
https://api.anyprop.com/v1/listings/data/PropertyRetrieve property listings with support for OData query options
AuthorizationstringrequiredBearer authentication header of the form Bearer <token>.
$filterstringoptionalOData filter expression
Example: contains(PropertyType, 'Lease') or StandardStatus eq 'Active'
$selectstringoptionalSelect specific fields
Example: ListingId,BedroomsTotal
$orderbystringoptionalOrder results by specified fields (append 'desc' for descending order)
Example: ModificationTimestamp desc
$expandstringoptionalExpand related entities. Property supports Media, OpenHouse, PropertyChange, PreferredMedia, PropertyRooms, and PropertyUnitTypes.
Example: Media($select=MediaKey),PropertyRooms,PropertyUnitTypes
$topintegeroptionalLimit returned listing records. Default: 10; maximum: 50,000. Set $top=0 to return only aggregation results without records or a next-page link.
Default: 10
Minimum: 0
Maximum: 50000
$skipintegeroptionalSkip number of results
Default: 0
$ignorenullsbooleanoptionalIgnore null fields and omit them from the results
Example: true
Default: false
$applystringoptionalGroup matching records or calculate one aggregate metric. Supports groupby((Field1,Field2)), aggregate(Field with Function), and groupby((Field1,Field2),aggregate(Field with Function)). Numeric fields support average (or avg), min, max, median, p10, p25, p50, p75, p90, p95; date fields support min/max and return Unix milliseconds. Median and percentiles are approximate. Fields must be published and permitted for the account. Result names are generated as function_Field; aliases, multiple metrics, sum, and countdistinct are not supported. Maximum three distinct grouping fields and 500 characters. Bucket limits per grouping level: 65,000 for one field, 254 for two, 40 for three. Use $filter to restrict matching records and $top=0 for aggregation-only results. Subsequent @odata.nextLink pages do not repeat aggregations. See the API Grouping Results reference for response examples and limits.
Example: groupby((OriginatingSystemName,ListingId))
Maximum length: 500
200Successful responseapplication/json
valueobject[]optionalShow item properties
Additional properties allowed
@odata.countintegeroptionalNumber of results in current response
Example: 2
@odata.totalCountintegeroptionalNumber of matching records; may be estimated for large result sets.
Example: 125847
@odata.nextLinkstringoptionalURL for next page of results
Example: https://api.anyprop.com/v1/listings/data/Property/skiptoken/demo_skip_token_12345
aggregateobjectoptionalPresent for a standalone aggregate expression. Calculated across matching records, independently of the number of listing records returned.
Show properties
Additional properties allowed
groupobjectoptionalPresent for a groupby expression. Metric results, if requested, appear inside the innermost buckets.
Show properties
groupbystringrequiredField grouped at this level.
Example: City
countintegerrequiredNumber of returned buckets at this level, not total matching records.
Example: 1
bucketsobject[]requiredShow item properties
keystring | number | booleanrequiredGroup value. String keys are normalized to lowercase.
Show properties
Option 1
Option 2
Option 3
countintegerrequiredMatching records in this bucket, including records missing the metric field.
Example: 3
metricsobjectoptionalMetric results for this bucket; present in the innermost buckets when an aggregate metric was requested.
Show properties
Additional properties allowed
groupobjectoptionalNested results for the next grouping field.
Show properties
Recursive object
400Bad requestapplication/json
errorobjectoptionalShow properties
codestringoptionalmessagestringoptional401Unauthorizedapplication/json
errorobjectoptionalShow properties
codestringoptionalmessagestringoptionalGET /v1/listings/data/Property HTTP/1.1
Host: api.anyprop.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl --request GET \
--url 'https://api.anyprop.com/v1/listings/data/Property' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Accept: */*'fetch("https://api.anyprop.com/v1/listings/data/Property", {
"method": "GET",
"headers": {
"Authorization": "Bearer YOUR_SECRET_TOKEN",
"Accept": "*/*"
}
})
.then(response => response.json())
.then(console.log);import requests
response = requests.get(
"https://api.anyprop.com/v1/listings/data/Property",
headers={
"Authorization": "Bearer YOUR_SECRET_TOKEN",
"Accept": "*/*"
}
)
print(response.json())Response example
{
"value": [
{
"@odata.id": "Property('demo_prop001')",
"AboveGradeFinishedArea": 1850,
"AboveGradeFinishedAreaSource": "Appraiser",
"AboveGradeFinishedAreaUnits": "Square Feet",
"AboveGradeUnfinishedArea": 200,
"AboveGradeUnfinishedAreaSource": "Appraiser",
"AboveGradeUnfinishedAreaUnits": "Square Feet",
"AccessCode": "1234#",
"AccessibilityFeatures": [
"Wheelchair Accessible",
"Grab Bars"
],
"ActivationDate": "2024-03-15",
"AdditionalParcelsDescription": "Adjacent vacant lot included",
"AdditionalParcelsYN": true,
"AnchorsCoTenants": "Starbucks, CVS Pharmacy",
"Appliances": [
"Dishwasher",
"Disposal",
"Electric Range",
"Microwave",
"Refrigerator",
"Washer",
"Dryer"
],
"ArchitecturalStyle": [
"Contemporary",
"Modern"
],
"AssociationAmenities": [
"Pool",
"Fitness Center",
"Tennis Court"
],
"AssociationFee": 250,
"AssociationFee2": 75,
"AssociationFee2Frequency": "Monthly",
"AssociationFeeFrequency": "Monthly",
"AssociationFeeIncludes": [
"Water",
"Sewer",
"Trash",
"Landscaping"
],
"AssociationName": "Sunset Ridge HOA",
"AssociationName2": "Master Community Association",
"AssociationPhone": "555-123-4567",
"AssociationPhone2": "555-765-4321",
"AssociationYN": true,
"AttachedGarageYN": true,
"AttributionContact": "John Smith, Demo Realty",
"AvailabilityDate": "2024-04-01",
"BackOnMarketDate": "2024-03-20",
"Basement": [
"Full",
"Finished"
],
"BasementYN": true,
"BathroomsFull": 3,
"BathroomsHalf": 1,
"BathroomsOneQuarter": 0,
"BathroomsPartial": 0,
"BathroomsThreeQuarter": 0,
"BathroomsTotalInteger": 4,
"BedroomsPossible": 5,
"BedroomsTotal": 4,
"BelowGradeFinishedArea": 800,
"BelowGradeFinishedAreaSource": "Appraiser",
"BelowGradeFinishedAreaUnits": "Square Feet",
"BelowGradeUnfinishedArea": 300,
"BelowGradeUnfinishedAreaSource": "Appraiser",
"BelowGradeUnfinishedAreaUnits": "Square Feet",
"BodyType": [
"Detached"
],
"BuilderModel": "Heritage Series",
"BuilderName": "Premier Homes",
"BuildingAreaSource": "Appraiser",
"BuildingAreaTotal": 2850,
"BuildingAreaUnits": "Square Feet",
"BuildingFeatures": [
"Energy Efficient",
"Smart Home"
],
"BuildingName": "Sunset Ridge Manor",
"BusinessName": "Corner Market & Deli",
"BusinessType": [
"Retail",
"Food Service"
],
"CableTvExpense": 120,
"CapRate": 7.5,
"CarportSpaces": 0,
"CarportYN": false,
"CarrierRoute": "C032",
"City": "Springfield",
"CityRegion": "Metro West",
"CloseDate": "2024-02-28",
"ClosePrice": 485000,
"CommonInterest": "Shared driveway maintenance",
"CommonWalls": [
"Left",
"Right"
],
"CommunityFeatures": [
"Playground",
"Walking Trails",
"Community Center"
],
"ConstructionMaterials": [
"Brick",
"Vinyl Siding",
"Stone"
],
"ContractStatusChangeDate": "2024-03-15",
"Cooling": [
"Central Air",
"Heat Pump"
],
"CoolingYN": true,
"CopyrightNotice": "© 2024 Demo MLS. All rights reserved.",
"Country": "US",
"CountryRegion": "North America",
"CountyOrParish": "Madison County",
"CoveredSpaces": 2,
"CrossStreet": "Oak Street and Maple Avenue",
"CumulativeDaysOnMarket": 45,
"CurrentUse": [
"Single Family Residence"
],
"DaysOnMarket": 18,
"DirectionFaces": "South",
"Directions": "From Main St, turn left on Oak St, house is third on the right",
"Disclosures": [
"Lead Paint",
"Flood Zone"
],
"DocumentsCount": 15,
"DoorFeatures": [
"Security System",
"Smart Lock"
],
"Electric": [
"220V Service",
"Circuit Breakers"
],
"ElectricExpense": 180,
"ElectricOnPropertyYN": true,
"ElementarySchool": "Lincoln Elementary",
"ElementarySchoolDistrict": "Springfield School District",
"Elevation": 850,
"ElevationUnits": "Feet",
"EntryLevel": "Main",
"EntryLocation": "Front",
"Exclusions": "All window treatments and fixtures in master bedroom",
"ExteriorFeatures": [
"Deck",
"Patio",
"Landscaped",
"Sprinkler System"
],
"Fencing": [
"Privacy",
"Chain Link"
],
"FireplaceFeatures": [
"Gas",
"Wood Burning"
],
"FireplacesTotal": 2,
"FireplaceYN": true,
"Flooring": [
"Hardwood",
"Tile",
"Carpet"
],
"FoundationDetails": [
"Concrete Slab",
"Crawl Space"
],
"FrontageLength": 120,
"FrontageType": [
"Street"
],
"FuelExpense": 95,
"Furnished": "Unfurnished",
"GarageSpaces": 2,
"GarageYN": true,
"GreenBuildingVerificationType": [
"ENERGY STAR"
],
"GreenEnergyEfficient": [
"High Performance Windows",
"Insulation"
],
"GreenVerificationYN": true,
"GrossIncome": 84000,
"Heating": [
"Forced Air",
"Natural Gas"
],
"HeatingYN": true,
"HighSchool": "Springfield High School",
"HighSchoolDistrict": "Springfield School District",
"HomeWarrantyYN": true,
"HorseAmenities": [
"Barn",
"Pasture"
],
"HorseYN": false,
"Inclusions": "All appliances, window treatments, and light fixtures",
"InsuranceExpense": 1200,
"InteriorFeatures": [
"Vaulted Ceilings",
"Walk-in Closets",
"Hardwood Floors",
"Island Kitchen",
"Master Suite",
"Great Room"
],
"InternetAddressDisplayYN": true,
"InternetAutomatedValuationDisplayYN": true,
"InternetConsumerCommentYN": true,
"InternetEntireListingDisplayYN": true,
"IrrigationSource": [
"Well",
"City Water"
],
"IrrigationWaterRightsYN": false,
"LandLeaseAmount": 0,
"LandLeaseYN": false,
"Latitude": 39.7817,
"LaundryFeatures": [
"Upper Level",
"Washer/Dryer Hookup"
],
"LeaseAmount": 2800,
"LeaseAmountFrequency": "Monthly",
"LeaseTerm": "12 Months",
"Levels": [
"Two"
],
"ListAgent": "sample_agent_001",
"ListAgentAOR": "Demo Board of Realtors",
"ListAgentDirectPhone": "555-987-6543",
"ListAgentEmail": "[email protected]",
"ListAgentFirstName": "Jane",
"ListAgentFullName": "Jane Smith",
"ListAgentKey": "demo_agent_jane001",
"ListAgentLastName": "Smith",
"ListAgentMlsId": "AG123456",
"ListAgentMobilePhone": "555-444-3333",
"ListAgentNationalAssociationId": "AG123456",
"ListAgentPreferredPhone": "555-987-6543",
"ListAgentStateLicense": "RE987654321",
"ListAOR": "Demo Board of Realtors",
"ListingAgreement": "Exclusive Right to Sell",
"ListingContractDate": "2024-03-01",
"ListingId": "DEMO001",
"ListingKey": "demo_prop001",
"ListingTerms": [
"Cash",
"Conventional",
"FHA",
"VA"
],
"ListOffice": "sample_office_001",
"ListOfficeAOR": "Demo Board of Realtors",
"ListOfficeEmail": "[email protected]",
"ListOfficeFax": "555-123-4568",
"ListOfficeKey": "demo_office_001",
"ListOfficeMlsId": "OF567890",
"ListOfficeName": "Demo Realty Group",
"ListOfficeNationalAssociationId": "OF567890",
"ListOfficePhone": "555-123-4567",
"ListPrice": 495000,
"LivingArea": 2850,
"LivingAreaSource": "Appraiser",
"LivingAreaUnits": "Square Feet",
"LockBoxType": [
"Electronic"
],
"Longitude": -89.6501,
"LotFeatures": [
"Corner Lot",
"Mature Trees",
"Level"
],
"LotSizeAcres": 0.28,
"LotSizeArea": 12197,
"LotSizeDimensions": "95 x 128",
"LotSizeSquareFeet": 12197,
"LotSizeUnits": "Square Feet",
"MaintenanceExpense": 450,
"MajorChangeType": "Price Change",
"MLSAreaMajor": "West Springfield",
"MLSAreaMinor": "Sunset Ridge",
"MlsStatus": "Active",
"ModificationTimestamp": "2024-03-15T14:30:00.000000Z",
"NetOperatingIncome": 72000,
"NewConstructionYN": false,
"NumberOfUnitsTotal": 1,
"OccupantName": "Smith Family",
"OccupantType": "Owner",
"OnMarketDate": "2024-03-15",
"OnMarketTimestamp": "2024-03-15T08:00:00.000000Z",
"OpenParkingSpaces": 4,
"OpenParkingYN": true,
"OriginalEntryTimestamp": "2024-03-01T10:00:00.000000Z",
"OriginalListPrice": 510000,
"OriginatingSystemKey": "demo_system",
"OriginatingSystemName": "Demo MLS System",
"OwnerName": "Johnson Trust",
"OwnerPays": [
"HOA Dues",
"Property Tax"
],
"ParcelNumber": "123-45-678-900",
"ParkingFeatures": [
"Attached Garage",
"Driveway"
],
"ParkingTotal": 6,
"PatioAndPorchFeatures": [
"Covered Patio",
"Deck"
],
"PetsAllowed": [
"Cats OK",
"Dogs OK",
"Size Limit"
],
"PhotosCount": 28,
"PoolFeatures": [
"In Ground",
"Heated"
],
"PoolPrivateYN": true,
"Possession": [
"At Closing"
],
"PossibleUse": [
"Single Family"
],
"PostalCode": "12345",
"PostalCodePlus4": "6789",
"PriceChangeTimestamp": "2024-03-10T16:45:00.000000Z",
"PrivateRemarks": "Seller motivated. Property shows well. Easy to show.",
"PropertyCondition": [
"Excellent"
],
"PropertySubType": "Single Family Residence",
"PropertyType": "Residential",
"PublicRemarks": "Stunning 4-bedroom, 4-bathroom home in desirable Sunset Ridge neighborhood. This beautiful two-story home features an open floor plan, gourmet kitchen with island, hardwood floors throughout main level, and a spacious master suite. The finished basement provides additional living space perfect for entertainment. Outside, enjoy the private backyard with in-ground pool and covered patio. Located in award-winning school district with easy access to shopping and dining.",
"RentIncludes": [
"Water",
"Sewer"
],
"RoadSurfaceType": [
"Asphalt"
],
"Roof": [
"Composition Shingles"
],
"RoomsTotal": 12,
"SecurityFeatures": [
"Security System",
"Motion Sensors"
],
"SeniorCommunityYN": false,
"Sewer": [
"Public Sewer"
],
"StandardStatus": "Active",
"StateOrProvince": "IL",
"StatusChangeTimestamp": "2024-03-15T08:00:00.000000Z",
"Stories": 2,
"StoriesTotal": 2,
"StreetAdditionalInfo": "Corner of Oak and Maple",
"StreetDirPrefix": "N",
"StreetName": "OAK",
"StreetNumber": "1234",
"StreetNumberNumeric": 1234,
"StreetSuffix": "STREET",
"StructureType": [
"Stick Built"
],
"SubdivisionName": "SUNSET RIDGE ESTATES",
"TaxAnnualAmount": 8500,
"TaxAssessedValue": 420000,
"TaxYear": 2023,
"TenantPays": [
"Electric",
"Gas",
"Cable"
],
"UnparsedAddress": "1234 N OAK STREET",
"Utilities": [
"Electricity Connected",
"Gas Connected",
"Water Connected",
"Sewer Connected"
],
"View": [
"City",
"Mountains"
],
"ViewYN": true,
"WaterfrontFeatures": [
"Lake"
],
"WaterfrontYN": false,
"WaterSource": [
"Public"
],
"WindowFeatures": [
"Double Pane",
"Screens"
],
"YearBuilt": 1998,
"YearBuiltSource": "Public Records",
"Zoning": "R-1",
"ZoningDescription": "Single Family Residential"
},
{
"@odata.id": "Property('demo_prop002')",
"AboveGradeFinishedArea": 1200,
"AboveGradeFinishedAreaSource": "Builder",
"AboveGradeFinishedAreaUnits": "Square Feet",
"AboveGradeUnfinishedArea": 0,
"AccessCode": "9876*",
"AccessibilityFeatures": [],
"ActivationDate": "2024-03-20",
"AdditionalParcelsYN": false,
"Appliances": [
"Range",
"Refrigerator",
"Dishwasher",
"Microwave"
],
"ArchitecturalStyle": [
"Ranch"
],
"AssociationAmenities": [],
"AssociationFee": 0,
"AssociationYN": false,
"AttachedGarageYN": false,
"AvailabilityDate": "2024-04-15",
"Basement": [],
"BasementYN": false,
"BathroomsFull": 2,
"BathroomsHalf": 0,
"BathroomsOneQuarter": 0,
"BathroomsPartial": 0,
"BathroomsThreeQuarter": 0,
"BathroomsTotalInteger": 2,
"BedroomsPossible": 3,
"BedroomsTotal": 3,
"BelowGradeFinishedArea": 0,
"BelowGradeUnfinishedArea": 0,
"BodyType": [
"Detached"
],
"BuilderModel": "Classic Ranch",
"BuilderName": "Heritage Builders",
"BuildingAreaSource": "Builder",
"BuildingAreaTotal": 1200,
"BuildingAreaUnits": "Square Feet",
"BuildingFeatures": [
"Traditional"
],
"CableTvExpense": 85,
"CarportSpaces": 1,
"CarportYN": true,
"CarrierRoute": "C045",
"City": "Riverside",
"ClosePrice": 285000,
"CommonWalls": [],
"CommunityFeatures": [
"Park"
],
"ConstructionMaterials": [
"Vinyl Siding",
"Asphalt Shingles"
],
"ContractStatusChangeDate": "2024-03-20",
"Cooling": [
"Window Units"
],
"CoolingYN": true,
"CopyrightNotice": "© 2024 Demo MLS. All rights reserved.",
"Country": "US",
"CountyOrParish": "River County",
"CoveredSpaces": 1,
"CrossStreet": "Pine Street and River Road",
"CumulativeDaysOnMarket": 12,
"CurrentUse": [
"Single Family Residence"
],
"DaysOnMarket": 5,
"DirectionFaces": "East",
"Directions": "From Highway 67, turn right on River Road, left on Pine Street",
"DocumentsCount": 8,
"Electric": [
"200 Amp Service"
],
"ElectricExpense": 125,
"ElectricOnPropertyYN": true,
"ElementarySchool": "Riverside Elementary",
"ElementarySchoolDistrict": "Riverside School District",
"Elevation": 650,
"ElevationUnits": "Feet",
"EntryLevel": "Main",
"EntryLocation": "Front",
"Exclusions": "Outdoor storage shed",
"ExteriorFeatures": [
"Fenced Yard"
],
"Fencing": [
"Chain Link"
],
"FireplacesTotal": 0,
"FireplaceYN": false,
"Flooring": [
"Carpet",
"Vinyl"
],
"FoundationDetails": [
"Concrete Slab"
],
"FrontageLength": 75,
"FrontageType": [
"Street"
],
"FuelExpense": 0,
"Furnished": "Unfurnished",
"GarageSpaces": 0,
"GarageYN": false,
"GreenVerificationYN": false,
"Heating": [
"Electric Baseboard"
],
"HeatingYN": true,
"HighSchool": "Riverside High School",
"HighSchoolDistrict": "Riverside School District",
"HomeWarrantyYN": false,
"HorseYN": false,
"Inclusions": "All appliances and window coverings",
"InsuranceExpense": 800,
"InteriorFeatures": [
"Open Floor Plan",
"Large Windows"
],
"InternetAddressDisplayYN": true,
"InternetAutomatedValuationDisplayYN": true,
"InternetConsumerCommentYN": true,
"InternetEntireListingDisplayYN": true,
"IrrigationWaterRightsYN": false,
"LandLeaseYN": false,
"Latitude": 41.2524,
"LaundryFeatures": [
"Main Level"
],
"LeaseAmount": 1450,
"LeaseAmountFrequency": "Monthly",
"LeaseTerm": "12 Months",
"Levels": [
"One"
],
"ListAgent": "sample_agent_002",
"ListAgentAOR": "River County Board of Realtors",
"ListAgentDirectPhone": "555-246-8101",
"ListAgentEmail": "[email protected]",
"ListAgentFirstName": "Mike",
"ListAgentFullName": "Mike Johnson",
"ListAgentKey": "demo_agent_mike002",
"ListAgentLastName": "Johnson",
"ListAgentMlsId": "AG789012",
"ListAgentMobilePhone": "555-777-8888",
"ListAgentNationalAssociationId": "AG789012",
"ListAgentPreferredPhone": "555-246-8101",
"ListAgentStateLicense": "RE456789012",
"ListAOR": "River County Board of Realtors",
"ListingContractDate": "2024-03-18",
"ListingId": "DEMO002",
"ListingKey": "demo_prop002",
"ListingTerms": [
"Cash",
"Conventional"
],
"ListOffice": "sample_office_002",
"ListOfficeAOR": "River County Board of Realtors",
"ListOfficeEmail": "[email protected]",
"ListOfficeFax": "555-246-8102",
"ListOfficeKey": "demo_office_002",
"ListOfficeMlsId": "OF123456",
"ListOfficeName": "Riverside Realty",
"ListOfficeNationalAssociationId": "OF123456",
"ListOfficePhone": "555-246-8100",
"ListPrice": 289000,
"LivingArea": 1200,
"LivingAreaSource": "Builder",
"LivingAreaUnits": "Square Feet",
"LockBoxType": [
"Combination"
],
"Longitude": -87.6298,
"LotFeatures": [
"Level",
"Rectangular"
],
"LotSizeAcres": 0.18,
"LotSizeArea": 7840,
"LotSizeDimensions": "80 x 98",
"LotSizeSquareFeet": 7840,
"LotSizeUnits": "Square Feet",
"MaintenanceExpense": 200,
"MLSAreaMajor": "East Riverside",
"MlsStatus": "Active",
"ModificationTimestamp": "2024-03-20T11:15:00.000000Z",
"NewConstructionYN": false,
"NumberOfUnitsTotal": 1,
"OccupantType": "Vacant",
"OnMarketDate": "2024-03-20",
"OnMarketTimestamp": "2024-03-20T09:00:00.000000Z",
"OpenParkingSpaces": 2,
"OpenParkingYN": true,
"OriginalEntryTimestamp": "2024-03-18T14:30:00.000000Z",
"OriginalListPrice": 289000,
"OriginatingSystemKey": "demo_system",
"OriginatingSystemName": "Demo MLS System",
"OwnerPays": [
"Property Tax"
],
"ParcelNumber": "456-78-901-234",
"ParkingFeatures": [
"Carport",
"Driveway"
],
"ParkingTotal": 3,
"PetsAllowed": [
"No Pets"
],
"PhotosCount": 15,
"PoolPrivateYN": false,
"Possession": [
"At Closing"
],
"PossibleUse": [
"Single Family"
],
"PostalCode": "54321",
"PostalCodePlus4": "0987",
"PrivateRemarks": "Priced to sell. Good starter home or investment property.",
"PropertyCondition": [
"Good"
],
"PropertySubType": "Single Family Residence",
"PropertyType": "Residential",
"PublicRemarks": "Charming 3-bedroom, 2-bathroom ranch home in quiet Riverside neighborhood. This well-maintained home features an open floor plan, updated kitchen with all appliances included, and a large fenced backyard perfect for pets or entertaining. Convenient location near schools, shopping, and public transportation. Move-in ready!",
"RentIncludes": [],
"RoadSurfaceType": [
"Asphalt"
],
"Roof": [
"Asphalt Shingles"
],
"RoomsTotal": 7,
"SeniorCommunityYN": false,
"Sewer": [
"Public Sewer"
],
"StandardStatus": "Active",
"StateOrProvince": "IL",
"StatusChangeTimestamp": "2024-03-20T09:00:00.000000Z",
"Stories": 1,
"StoriesTotal": 1,
"StreetName": "PINE",
"StreetNumber": "567",
"StreetNumberNumeric": 567,
"StreetSuffix": "STREET",
"StructureType": [
"Stick Built"
],
"SubdivisionName": "RIVERSIDE HEIGHTS",
"TaxAnnualAmount": 4200,
"TaxAssessedValue": 235000,
"TaxYear": 2023,
"TenantPays": [
"Electric",
"Gas"
],
"UnparsedAddress": "567 PINE STREET",
"Utilities": [
"Electricity Connected",
"Water Connected",
"Sewer Connected"
],
"ViewYN": false,
"WaterfrontYN": false,
"WaterSource": [
"Public"
],
"WindowFeatures": [
"Screens"
],
"YearBuilt": 1985,
"YearBuiltSource": "Public Records",
"Zoning": "R-2",
"ZoningDescription": "Single Family Residential"
}
],
"@odata.count": 2,
"@odata.totalCount": 125847,
"@odata.nextLink": "https://api.anyprop.com/v1/listings/data/Property/skiptoken/demo_skip_token_12345"
}{
"error": {
"code": "text",
"message": "text"
}
}{
"error": {
"code": "text",
"message": "text"
}
}Available $filter fields
AssociationYN, BathroomsFull, BathroomsHalf, BathroomsPartial, BathroomsTotalInteger, BedroomsTotal, BuyerAgentEmail, BuyerAgentFullName, BuyerAgentSearchText, BuyerOfficeName, BuyerOfficeSearchText, CarportSpaces, CarportYN, City, CloseDate, CoBuyerAgentEmail, CoBuyerAgentFullName, CoBuyerOfficeName, CoListAgentEmail, CoListAgentFullName, CoListAgentMlsId, CoListOfficeMlsId, CoListOfficeName, CountyOrParish, DaysOnMarket, GarageSpaces, GarageYN, KeywordSearchText, Latitude, Levels, ListAgentEmail, ListAgentFullName, ListAgentMlsId, ListAgentSearchText, ListingContractDate, ListingId, ListingKey, ListOfficeMlsId, ListOfficeName, ListOfficeSearchText, ListPrice, LivingArea, Location, Longitude, LotSizeArea, LotSizeSquareFeet, MlsStatus, ModificationTimestamp, NewConstructionYN, OnMarketDate, OnMarketTimestamp, OriginalEntryTimestamp, OriginalListPrice, OriginatingSystemName, PhotosChangeTimestamp, PhotosCount, PoolPrivateYN, PostalCode, PostalCodePlus4, PropertySubType, PropertyType, RawAddressSearchText, RawLocation, SeniorCommunityYN, SpecialListingConditions, StandardStatus, StateOrProvince, StatusChangeTimestamp, Stories, StoriesTotal, StreetDirPrefix, StreetDirSuffix, StreetName, StreetNumber, StreetSuffix, UnitNumber, UnparsedAddress, WaterfrontYN, YearBuilt, YearBuiltEffective, anyprop_ActiveOpenHouseCount, anyprop_Address, anyprop_AddressAlias, anyprop_BuyerAgentEmail, anyprop_BuyerAgentPhone, anyprop_CreatedTimestamp, anyprop_DaysOnMarketReferenceTimestamp, anyprop_Latitude, anyprop_ListAgentEmail, anyprop_ListAgentPhone, anyprop_Longitude, anyprop_OpenHouseCount, anyprop_OriginalEntryTimestamp, anyprop_UnitNumber, anyprop_UpdatedTimestamp, anyprop_WaterViewYN
$expand options
Media- Property media (join from the Media resource)OpenHouse- Property open houses (join from the OpenHouse resource)PropertyChange- (Non-RESO) Historical change tracking for property fields with old/new values and modification timestampsPropertyRooms- Property room details (join from the PropertyRooms resource)PropertyUnitTypes- Property unit type details (join from the PropertyUnitTypes resource)PreferredMedia- (Non-RESO) Optimized expand that returns the first 2 photos by media order, with priority given to the preferred photo (much faster than expanding Media)
Additional Filtering Options
Geospatial Filtering
Supported via geo.distance on RawLocation or Location. Only le comparison is accepted (distance in meters):
$filter=geo.distance(RawLocation, geography'POINT(-82.98163737 35.11490043)') le 1000Polygon filtering is supported via geo.intersects on RawLocation or Location:
$filter=geo.intersects(RawLocation, geography'POLYGON((-80.30 25.70, -80.13 25.70, -80.13 25.85, -80.30 25.85, -80.30 25.70))')Text Search
The API supports fuzzy text matching using the search.text function. This feature allows you to search for properties using partial or incomplete text across multiple fields.
Syntax:
$filter=search.text(field, 'search terms', min_matches)Parameters:
field- The search field to query (e.g.,RawAddressSearchText,KeywordSearchText)- search terms - The text to search for (as a string)
min_matches(optional) - Required number of matching terms. For example,2means at least 2 of the tokenized search terms must match. To require all terms to match, use a large number like1000(values exceeding the token count are automatically capped).
Default behavior when min_matches is omitted:
RawAddressSearchText: Matches if at least 40% of terms match- All other fields: Strict matching (all terms must match)
Address Search
Search for properties using partial or incomplete addresses with the RawAddressSearchText field.
Note: This performs fuzzy text matching only; it is not a geocoding service.
Example:
# Search for addresses containing "100 Gold" (defaults to 40% match)
$filter=search.text(RawAddressSearchText,'100 Gold')
# Search for properties on Main Street (require all terms)
$filter=search.text(RawAddressSearchText,'Main Street',1000)Agent and Office Search
Search for properties by agent, co-agent, office, or co-office names using search.text on the following fields:
ListAgentSearchText- Listing agent namesBuyerAgentSearchText- Buyer agent namesListOfficeSearchText- Listing office namesBuyerOfficeSearchText- Buyer office names
Example:
# Search for properties with listing agent "John Smith" (strict match)
$filter=search.text(ListAgentSearchText,'John Smith')
# Search for properties with buyer agent "Jane Doe"
$filter=search.text(BuyerAgentSearchText,'Jane Doe')
# Search for properties with listing office "Acme Realty"
$filter=search.text(ListOfficeSearchText,'Acme Realty')Keyword Search
Search across listing remarks and descriptions using the KeywordSearchText field.
Fields included in search: ListingId, Appliances, ArchitecturalStyle, Heating, Cooling, InteriorFeatures, ParkingFeatures, PropertySubType, WaterfrontFeatures, View, PublicRemarks
Example:
# Search for properties mentioning "pool" and "renovated" (strict match)
$filter=search.text(KeywordSearchText,'pool renovated')
# Search for properties with at least one of these terms
$filter=search.text(KeywordSearchText,'waterfront dock boat',1)Sorting by Relevance
To sort results by the best match (using BM25), use:
$orderby=relevance descComplete Example:
# Search for "100 Gold" and sort by best match
$filter=search.text(RawAddressSearchText,'100 Gold')&$orderby=relevance descInternal Non-RESO Fields
Useful fields derived internally that extend beyond the RESO standard. Field availability depends on source data and account permissions. See the available $filter fields above for filter support.
Geocoded Address
anyprop_Address- Normalized internal address (geocoded). Useful for identifying properties across listings.anyprop_AddressAlias- Slug derived fromanyprop_Address. Useful for identifying properties across listings.anyprop_City- City from the geocoded addressanyprop_HouseNumber- House number from the geocoded addressanyprop_RawAddress- Raw full address built from MLS address fields, the unparsed address, and any other available informationanyprop_State- State from the geocoded addressanyprop_StreetAddress- Street address (house number + street name) from the geocoded addressanyprop_StreetName- Street name from the geocoded addressanyprop_UnitNumber(String) - Normalized unit identifier associated with the effective internal address, based on the MLS unit and address normalization rules. May differ from the original UnitNumber.anyprop_ZipCode- Zip code from the geocoded address
Geolocation
anyprop_AddressFoundYN- Whether the address was successfully geocodedanyprop_ExactGeocodeYN- Whether the geocode is an exact match (address accuracy greater than or equal to line interpolation)anyprop_Latitude(Number) - Effective latitude in decimal degrees. Uses a valid MLS Latitude/Longitude pair first, then geocoded coordinates; null when no valid pair is available.anyprop_Longitude(Number) - Effective longitude in decimal degrees, selected together with anyprop_Latitude using the same MLS-first, geocoding-fallback rules.
Open Houses
anyprop_ActiveOpenHouseCount(Integer) - Number of non-deleted open houses with Active status and a start time at or after the time the summary was calculated. This is a stored summary, not a live clock-based count.anyprop_OpenHouseCount(Integer) - Number of associated open-house records that are not marked deleted, including past or inactive events.
Property Features
anyprop_WaterViewYN(Boolean) - Water-view indicator normalized from source MLS fields or view descriptions. A water view does not necessarily mean waterfront. Availability depends on the source; missing data does not mean false.
Timestamps
anyprop_CreatedTimestamp(Date/time) - When the listing record was created in the platform, expressed as an ISO 8601 timestamp. This is not the MLS listing date or OriginalEntryTimestamp.anyprop_DaysOnMarketReferenceTimestamp- Derived date used to calculate DaysOnMarket. The DaysOnMarket value is computed as:Current Time - anyprop_DaysOnMarketReferenceTimestamp. Available as a $filter field. Example:2026-02-17T22:15:04.300000Zanyprop_OriginalEntryTimestamp- Derived OriginalEntryTimestamp based on internal data. Example:2025-08-19T16:19:13.000000Z
Financial
anyprop_AssociationFeeTotalMonthly- Derived monthly association fee total. Example:250
Agent & Contact Search
anyprop_BuyerAgentEmail- Searches both buyer agent and co-buyer agent email addresses. Use standard comparison operators (eq,contains, etc.) — not a text search field.anyprop_BuyerAgentPhone- Searches both buyer agents (main + co) across all phone number fields:BuyerAgentDirectPhone,BuyerAgentHomePhone,BuyerAgentMobilePhone,BuyerAgentOfficePhone,BuyerAgentPreferredPhone,BuyerAgentTollFreePhone,CoBuyerAgentDirectPhone,CoBuyerAgentHomePhone,CoBuyerAgentMobilePhone,CoBuyerAgentOfficePhone,CoBuyerAgentPreferredPhone,CoBuyerAgentTollFreePhoneanyprop_ListAgentEmail- Searches both list agent and co-list agent email addresses. Use standard comparison operators (eq,contains, etc.) — not a text search field.anyprop_ListAgentPhone- Searches both list agents (main + co) across all phone number fields:ListAgentDirectPhone,ListAgentHomePhone,ListAgentMobilePhone,ListAgentOfficePhone,ListAgentPreferredPhone,ListAgentTollFreePhone,CoListAgentDirectPhone,CoListAgentHomePhone,CoListAgentMobilePhone,CoListAgentOfficePhone,CoListAgentPreferredPhone,CoListAgentTollFreePhone
Note: Phone number fields can be queried in either the raw form from the MLS or a "normalized" form (all numeric).
Filter examples
$filter=anyprop_ActiveOpenHouseCount gt 0
$filter=WaterfrontYN eq true or anyprop_WaterViewYN eq true
$filter=anyprop_CreatedTimestamp ge 2026-09-01T00:00:00Z
$filter=ListAgentMlsId eq '12345' and OriginatingSystemName eq 'your_mls'Media Resource
Get media resources
https://api.anyprop.com/v1/listings/data/MediaRetrieve media resources with support for OData query options
AuthorizationstringrequiredBearer authentication header of the form Bearer <token>.
$filterstringoptionalOData filter expression
Example: Order eq 1
$selectstringoptionalSelect specific fields
Example: MediaKey,Order
$orderbystringoptionalOrder results by specified fields (append 'desc' for descending order)
Example: ModificationTimestamp desc
$topintegeroptionalLimit returned listing records. Default: 10; maximum: 50,000. Set $top=0 to return only aggregation results without records or a next-page link.
Default: 10
Minimum: 0
Maximum: 50000
$skipintegeroptionalSkip number of results
Default: 0
$ignorenullsbooleanoptionalIgnore null fields and omit them from the results
Example: true
Default: false
$applystringoptionalGroup matching records or calculate one aggregate metric. Supports groupby((Field1,Field2)), aggregate(Field with Function), and groupby((Field1,Field2),aggregate(Field with Function)). Numeric fields support average (or avg), min, max, median, p10, p25, p50, p75, p90, p95; date fields support min/max and return Unix milliseconds. Median and percentiles are approximate. Fields must be published and permitted for the account. Result names are generated as function_Field; aliases, multiple metrics, sum, and countdistinct are not supported. Maximum three distinct grouping fields and 500 characters. Bucket limits per grouping level: 65,000 for one field, 254 for two, 40 for three. Use $filter to restrict matching records and $top=0 for aggregation-only results. Subsequent @odata.nextLink pages do not repeat aggregations. See the API Grouping Results reference for response examples and limits.
Example: groupby((OriginatingSystemName,ListingId))
Maximum length: 500
200Successful responseapplication/json
valueobject[]optionalShow item properties
Additional properties allowed
@odata.countintegeroptionalNumber of results in current response
Example: 2
@odata.totalCountintegeroptionalNumber of matching records; may be estimated for large result sets.
Example: 1847
@odata.nextLinkstringoptionalURL for next page of results
Example: https://api.anyprop.com/v1/listings/data/Media/skiptoken/demo_media_skip_456
aggregateobjectoptionalPresent for a standalone aggregate expression. Calculated across matching records, independently of the number of listing records returned.
Show properties
Additional properties allowed
groupobjectoptionalPresent for a groupby expression. Metric results, if requested, appear inside the innermost buckets.
Show properties
groupbystringrequiredField grouped at this level.
Example: City
countintegerrequiredNumber of returned buckets at this level, not total matching records.
Example: 1
bucketsobject[]requiredShow item properties
keystring | number | booleanrequiredGroup value. String keys are normalized to lowercase.
Show properties
Option 1
Option 2
Option 3
countintegerrequiredMatching records in this bucket, including records missing the metric field.
Example: 3
metricsobjectoptionalMetric results for this bucket; present in the innermost buckets when an aggregate metric was requested.
Show properties
Additional properties allowed
groupobjectoptionalNested results for the next grouping field.
Show properties
Recursive object
400Bad requestapplication/json
errorobjectoptionalShow properties
codestringoptionalmessagestringoptional401Unauthorizedapplication/json
errorobjectoptionalShow properties
codestringoptionalmessagestringoptionalGET /v1/listings/data/Media HTTP/1.1
Host: api.anyprop.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl --request GET \
--url 'https://api.anyprop.com/v1/listings/data/Media' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Accept: */*'fetch("https://api.anyprop.com/v1/listings/data/Media", {
"method": "GET",
"headers": {
"Authorization": "Bearer YOUR_SECRET_TOKEN",
"Accept": "*/*"
}
})
.then(response => response.json())
.then(console.log);import requests
response = requests.get(
"https://api.anyprop.com/v1/listings/data/Media",
headers={
"Authorization": "Bearer YOUR_SECRET_TOKEN",
"Accept": "*/*"
}
)
print(response.json())Response example
{
"value": [
{
"@odata.id": "Media('demo_media001')",
"ChangedByMember": "demo_agent_jane001",
"ChangedByMemberID": "AG123456",
"ChangedByMemberKey": "demo_agent_jane001",
"ClassName": "Photo",
"ImageHeight": 768,
"ImageOf": "Exterior Front",
"ImageSizeDescription": "High Resolution",
"ImageWidth": 1024,
"LongDescription": "Beautiful exterior front view showing landscaping and architectural details",
"MediaAlteration": "Color Enhanced",
"MediaCategory": "Photo",
"MediaHTML": "<img src='https://photos.demo.com/prop001/exterior-front.jpg' alt='Exterior Front View' />",
"MediaKey": "demo_media001",
"MediaModificationTimestamp": "2024-03-15T10:30:00.000000Z",
"MediaObjectID": "IMG_001_EXT_FRONT",
"MediaStatus": "Active",
"MediaType": "JPEG",
"MediaURL": "https://photos.demo.com/prop001/exterior-front.jpg",
"ModificationTimestamp": "2024-03-15T10:30:00.000000Z",
"Order": 1,
"OriginatingSystem": "Demo Photo System",
"OriginatingSystemID": "DPS001",
"OriginatingSystemMediaKey": "ext_front_001",
"OriginatingSystemName": "demo_photo_system",
"OriginatingSystemResourceRecordID": "DEMO001",
"OriginatingSystemResourceRecordKey": "demo_prop001",
"OriginatingSystemResourceRecordSystemID": "DPS_PROP_001",
"Permission": "Public",
"PreferredPhotoYN": true,
"ResourceName": "Property",
"ResourceRecordID": "DEMO001",
"ResourceRecordKey": "demo_prop001",
"ShortDescription": "Exterior Front",
"SourceSystem": "Demo MLS System",
"SourceSystemID": "DMS001",
"SourceSystemMediaKey": "media_001_front",
"SourceSystemName": "demo_mls_system",
"SourceSystemResourceRecordID": "DEMO001",
"SourceSystemResourceRecordKey": "demo_prop001",
"SourceSystemResourceRecordSystemID": "DMS_PROP_001"
},
{
"@odata.id": "Media('demo_media002')",
"ChangedByMember": "demo_agent_jane001",
"ChangedByMemberID": "AG123456",
"ChangedByMemberKey": "demo_agent_jane001",
"ClassName": "Photo",
"ImageHeight": 768,
"ImageOf": "Kitchen",
"ImageSizeDescription": "High Resolution",
"ImageWidth": 1024,
"LongDescription": "Gourmet kitchen with granite countertops, stainless steel appliances, and island seating",
"MediaAlteration": "Brightness Adjusted",
"MediaCategory": "Photo",
"MediaHTML": "<img src='https://photos.demo.com/prop001/kitchen.jpg' alt='Kitchen View' />",
"MediaKey": "demo_media002",
"MediaModificationTimestamp": "2024-03-15T10:45:00.000000Z",
"MediaObjectID": "IMG_002_KITCHEN",
"MediaStatus": "Active",
"MediaType": "JPEG",
"MediaURL": "https://photos.demo.com/prop001/kitchen.jpg",
"ModificationTimestamp": "2024-03-15T10:45:00.000000Z",
"Order": 3,
"OriginatingSystem": "Demo Photo System",
"OriginatingSystemID": "DPS002",
"OriginatingSystemMediaKey": "kitchen_001",
"OriginatingSystemName": "demo_photo_system",
"OriginatingSystemResourceRecordID": "DEMO001",
"OriginatingSystemResourceRecordKey": "demo_prop001",
"OriginatingSystemResourceRecordSystemID": "DPS_PROP_001",
"Permission": "Public",
"PreferredPhotoYN": false,
"ResourceName": "Property",
"ResourceRecordID": "DEMO001",
"ResourceRecordKey": "demo_prop001",
"ShortDescription": "Kitchen",
"SourceSystem": "Demo MLS System",
"SourceSystemID": "DMS002",
"SourceSystemMediaKey": "media_002_kitchen",
"SourceSystemName": "demo_mls_system",
"SourceSystemResourceRecordID": "DEMO001",
"SourceSystemResourceRecordKey": "demo_prop001",
"SourceSystemResourceRecordSystemID": "DMS_PROP_001"
}
],
"@odata.count": 2,
"@odata.totalCount": 1847,
"@odata.nextLink": "https://api.anyprop.com/v1/listings/data/Media/skiptoken/demo_media_skip_456"
}{
"error": {
"code": "text",
"message": "text"
}
}{
"error": {
"code": "text",
"message": "text"
}
}Available $filter fields
MediaCategory, MediaKey, MediaStatus, ModificationTimestamp, Order, OriginatingSystemName, ResourceName, ResourceRecordID, ResourceRecordKey
Member Resource
Get member info
https://api.anyprop.com/v1/listings/data/MemberRetrieve member data with support for OData query options
AuthorizationstringrequiredBearer authentication header of the form Bearer <token>.
$filterstringoptionalOData filter expression
Example: contains(OriginatingSystemName, 'sample')
$selectstringoptionalSelect specific fields
Example: MemberMlsId
$orderbystringoptionalOrder results by specified fields (append 'desc' for descending order)
Example: ModificationTimestamp desc
$topintegeroptionalLimit returned listing records. Default: 10; maximum: 50,000. Set $top=0 to return only aggregation results without records or a next-page link.
Default: 10
Minimum: 0
Maximum: 50000
$skipintegeroptionalSkip number of results
Default: 0
$ignorenullsbooleanoptionalIgnore null fields and omit them from the results
Example: true
Default: false
$applystringoptionalGroup matching records or calculate one aggregate metric. Supports groupby((Field1,Field2)), aggregate(Field with Function), and groupby((Field1,Field2),aggregate(Field with Function)). Numeric fields support average (or avg), min, max, median, p10, p25, p50, p75, p90, p95; date fields support min/max and return Unix milliseconds. Median and percentiles are approximate. Fields must be published and permitted for the account. Result names are generated as function_Field; aliases, multiple metrics, sum, and countdistinct are not supported. Maximum three distinct grouping fields and 500 characters. Bucket limits per grouping level: 65,000 for one field, 254 for two, 40 for three. Use $filter to restrict matching records and $top=0 for aggregation-only results. Subsequent @odata.nextLink pages do not repeat aggregations. See the API Grouping Results reference for response examples and limits.
Example: groupby((OriginatingSystemName,ListingId))
Maximum length: 500
200Successful responseapplication/json
valueobject[]optionalShow item properties
Additional properties allowed
@odata.countintegeroptionalNumber of results in current response
Example: 2
@odata.totalCountintegeroptionalNumber of matching records; may be estimated for large result sets.
Example: 3456
@odata.nextLinkstringoptionalURL for next page of results
Example: https://api.anyprop.com/v1/listings/data/Member/skiptoken/demo_member_skip_789
aggregateobjectoptionalPresent for a standalone aggregate expression. Calculated across matching records, independently of the number of listing records returned.
Show properties
Additional properties allowed
groupobjectoptionalPresent for a groupby expression. Metric results, if requested, appear inside the innermost buckets.
Show properties
groupbystringrequiredField grouped at this level.
Example: City
countintegerrequiredNumber of returned buckets at this level, not total matching records.
Example: 1
bucketsobject[]requiredShow item properties
keystring | number | booleanrequiredGroup value. String keys are normalized to lowercase.
Show properties
Option 1
Option 2
Option 3
countintegerrequiredMatching records in this bucket, including records missing the metric field.
Example: 3
metricsobjectoptionalMetric results for this bucket; present in the innermost buckets when an aggregate metric was requested.
Show properties
Additional properties allowed
groupobjectoptionalNested results for the next grouping field.
Show properties
Recursive object
400Bad requestapplication/json
errorobjectoptionalShow properties
codestringoptionalmessagestringoptional401Unauthorizedapplication/json
errorobjectoptionalShow properties
codestringoptionalmessagestringoptionalGET /v1/listings/data/Member HTTP/1.1
Host: api.anyprop.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl --request GET \
--url 'https://api.anyprop.com/v1/listings/data/Member' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Accept: */*'fetch("https://api.anyprop.com/v1/listings/data/Member", {
"method": "GET",
"headers": {
"Authorization": "Bearer YOUR_SECRET_TOKEN",
"Accept": "*/*"
}
})
.then(response => response.json())
.then(console.log);import requests
response = requests.get(
"https://api.anyprop.com/v1/listings/data/Member",
headers={
"Authorization": "Bearer YOUR_SECRET_TOKEN",
"Accept": "*/*"
}
)
print(response.json())Response example
{
"value": [
{
"@odata.id": "Member('demo_member001')",
"HistoryTransactional": "Historical",
"JobTitle": "Senior Real Estate Agent",
"LastLoginTimestamp": "2024-03-14T16:30:00.000000Z",
"Media": "demo_member_photo001",
"MemberAddress1": "123 Main Street",
"MemberAddress2": "Suite 200",
"MemberAlternateId": "ALT001",
"MemberAOR": "Demo Board of Realtors",
"MemberAORkey": "demo_board_001",
"MemberAORMlsId": "DBR001",
"MemberAssociationComments": "Active member since 2018, serves on technology committee",
"MemberBillingPreference": "Monthly",
"MemberBio": "Jane Smith is a dedicated real estate professional with over 8 years of experience helping families find their perfect home in the Springfield area.",
"MemberCarrierRoute": "C032",
"MemberCity": "Springfield",
"MemberCommitteeCount": 2,
"MemberCountry": "US",
"MemberCountyOrParish": "Madison County",
"MemberDesignation": "ABR, GRI, SRES",
"MemberDirectPhone": "555-987-6543",
"MemberEmail": "[email protected]",
"MemberFax": "555-987-6544",
"MemberFirstName": "Jane",
"MemberFullName": "Jane Marie Smith",
"MemberHomePhone": "555-555-1234",
"MemberIsAssistantTo": null,
"MemberKey": "demo_member001",
"MemberLanguages": "English, Spanish",
"MemberLastName": "Smith",
"MemberLoginId": "jsmith001",
"MemberMailOptOutYN": false,
"MemberMiddleName": "Marie",
"MemberMlsAccessYN": true,
"MemberMlsId": "AG123456",
"MemberMlsSecurityClass": "Standard",
"MemberMobilePhone": "555-444-3333",
"MemberNamePrefix": "Ms.",
"MemberNameSuffix": null,
"MemberNationalAssociationEntryDate": "2018-06-15",
"MemberNationalAssociationId": "NAR987654",
"MemberNickname": "Jane",
"MemberOfficePhone": "555-123-4567",
"MemberOfficePhoneExt": "201",
"MemberOtherPhone": "555-777-8888",
"MemberOtherPhoneType": "Assistant",
"MemberPager": null,
"MemberPassword": null,
"MemberPasswordModificationTimestamp": null,
"MemberPhoto": "https://photos.demo.com/members/jane_smith.jpg",
"MemberPhotoModificationTimestamp": "2024-01-15T10:00:00.000000Z",
"MemberPostalCode": "12345",
"MemberPostalCodePlus4": "6789",
"MemberPreferredPhone": "555-987-6543",
"MemberPreferredPhoneExt": null,
"MemberPublicAddress": "123 Main Street, Springfield, IL 12345",
"MemberSocialMediaYN": true,
"MemberSpecialties": "Luxury Homes, First-Time Buyers, Relocation",
"MemberStartDate": "2016-03-01",
"MemberStateOrProvince": "IL",
"MemberStateLicense": "RE987654321",
"MemberStateLicenseState": "IL",
"MemberStatus": "Active",
"MemberTollFreePhone": null,
"MemberType": "Agent",
"MemberURL": "https://www.demorealty.com/jane-smith",
"MemberVoiceMail": "555-987-6545",
"MemberVoiceMailExt": null,
"ModificationTimestamp": "2024-03-14T16:30:00.000000Z",
"Office": "demo_office_001",
"OfficeKey": "demo_office_001",
"OfficeMlsId": "OF567890",
"OriginatingSystemID": "DMS_MEM_001",
"OriginatingSystemKey": "demo_system",
"OriginatingSystemMemberKey": "member_jane_001",
"OriginatingSystemName": "Demo MLS System",
"PrimaryAor": "Demo Board of Realtors",
"PrimaryAorMlsId": "DBR001",
"SocialMediaType": "Facebook, LinkedIn, Instagram",
"SourceSystemID": "SRC_001",
"SourceSystemKey": "source_system_demo",
"SourceSystemMemberKey": "src_jane_001",
"SourceSystemName": "Demo Source System",
"Subscriptions": "MLS Access, Mobile App, Market Reports"
},
{
"@odata.id": "Member('demo_member002')",
"HistoryTransactional": "Current",
"JobTitle": "Real Estate Broker",
"LastLoginTimestamp": "2024-03-15T08:45:00.000000Z",
"Media": "demo_member_photo002",
"MemberAddress1": "456 Oak Avenue",
"MemberAddress2": null,
"MemberAlternateId": "ALT002",
"MemberAOR": "River County Board of Realtors",
"MemberAORkey": "river_board_001",
"MemberAORMlsId": "RBR001",
"MemberAssociationComments": "Board member since 2015, former president",
"MemberBillingPreference": "Quarterly",
"MemberBio": "Mike Johnson is a licensed broker with 12 years of experience specializing in residential and commercial properties in the River County area.",
"MemberCarrierRoute": "C045",
"MemberCity": "Riverside",
"MemberCommitteeCount": 4,
"MemberCountry": "US",
"MemberCountyOrParish": "River County",
"MemberDesignation": "CRS, CCIM, SIOR",
"MemberDirectPhone": "555-246-8101",
"MemberEmail": "[email protected]",
"MemberFax": "555-246-8102",
"MemberFirstName": "Mike",
"MemberFullName": "Michael David Johnson",
"MemberHomePhone": "555-333-2222",
"MemberIsAssistantTo": null,
"MemberKey": "demo_member002",
"MemberLanguages": "English",
"MemberLastName": "Johnson",
"MemberLoginId": "mjohnson002",
"MemberMailOptOutYN": false,
"MemberMiddleName": "David",
"MemberMlsAccessYN": true,
"MemberMlsId": "AG789012",
"MemberMlsSecurityClass": "Administrator",
"MemberMobilePhone": "555-777-8888",
"MemberNamePrefix": "Mr.",
"MemberNameSuffix": null,
"MemberNationalAssociationEntryDate": "2012-04-10",
"MemberNationalAssociationId": "NAR123456",
"MemberNickname": "Mike",
"MemberOfficePhone": "555-246-8100",
"MemberOfficePhoneExt": "100",
"MemberOtherPhone": null,
"MemberOtherPhoneType": null,
"MemberPager": null,
"MemberPassword": null,
"MemberPasswordModificationTimestamp": null,
"MemberPhoto": "https://photos.demo.com/members/mike_johnson.jpg",
"MemberPhotoModificationTimestamp": "2024-02-20T14:30:00.000000Z",
"MemberPostalCode": "54321",
"MemberPostalCodePlus4": "0987",
"MemberPreferredPhone": "555-246-8101",
"MemberPreferredPhoneExt": null,
"MemberPublicAddress": "456 Oak Avenue, Riverside, IL 54321",
"MemberSocialMediaYN": true,
"MemberSpecialties": "Commercial Real Estate, Investment Properties, New Construction",
"MemberStartDate": "2012-01-15",
"MemberStateOrProvince": "IL",
"MemberStateLicense": "BR456789012",
"MemberStateLicenseState": "IL",
"MemberStatus": "Active",
"MemberTollFreePhone": "800-555-MIKE",
"MemberType": "Broker",
"MemberURL": "https://www.riverside.com/mike-johnson",
"MemberVoiceMail": "555-246-8103",
"MemberVoiceMailExt": null,
"ModificationTimestamp": "2024-03-15T08:45:00.000000Z",
"Office": "demo_office_002",
"OfficeKey": "demo_office_002",
"OfficeMlsId": "OF123456",
"OriginatingSystemID": "DMS_MEM_002",
"OriginatingSystemKey": "demo_system",
"OriginatingSystemMemberKey": "member_mike_002",
"OriginatingSystemName": "Demo MLS System",
"PrimaryAor": "River County Board of Realtors",
"PrimaryAorMlsId": "RBR001",
"SocialMediaType": "LinkedIn, Twitter",
"SourceSystemID": "SRC_002",
"SourceSystemKey": "source_system_demo",
"SourceSystemMemberKey": "src_mike_002",
"SourceSystemName": "Demo Source System",
"Subscriptions": "Full MLS Access, Analytics Package, Lead Management"
}
],
"@odata.count": 2,
"@odata.totalCount": 3456,
"@odata.nextLink": "https://api.anyprop.com/v1/listings/data/Member/skiptoken/demo_member_skip_789"
}{
"error": {
"code": "text",
"message": "text"
}
}{
"error": {
"code": "text",
"message": "text"
}
}Available $filter fields
MemberEmail, MemberFullName, MemberMlsId, MemberStateLicense, MemberStateOrProvince, MemberStatus, ModificationTimestamp, OfficeKey, OfficeMlsId, OfficeName, OriginatingSystemName, anyprop_MemberPhone
Internal Non-RESO Fields
anyprop_MemberPhone- Searches across all member phone number fields:MemberDirectPhone,MemberHomePhone,MemberMobilePhone,MemberOfficePhone,MemberPreferredPhone,MemberTollFreePhone
Note: Phone number fields can be queried in either the raw form from the MLS or a "normalized" form (all numeric).
Office Resource
Get office info
https://api.anyprop.com/v1/listings/data/OfficeRetrieve office data with support for OData query options
AuthorizationstringrequiredBearer authentication header of the form Bearer <token>.
$filterstringoptionalOData filter expression
Example: contains(OriginatingSystemName, 'sample')
$selectstringoptionalSelect specific fields
Example: OfficeMlsId
$orderbystringoptionalOrder results by specified fields (append 'desc' for descending order)
Example: ModificationTimestamp desc
$topintegeroptionalLimit returned listing records. Default: 10; maximum: 50,000. Set $top=0 to return only aggregation results without records or a next-page link.
Default: 10
Minimum: 0
Maximum: 50000
$skipintegeroptionalSkip number of results
Default: 0
$ignorenullsbooleanoptionalIgnore null fields and omit them from the results
Example: true
Default: false
$applystringoptionalGroup matching records or calculate one aggregate metric. Supports groupby((Field1,Field2)), aggregate(Field with Function), and groupby((Field1,Field2),aggregate(Field with Function)). Numeric fields support average (or avg), min, max, median, p10, p25, p50, p75, p90, p95; date fields support min/max and return Unix milliseconds. Median and percentiles are approximate. Fields must be published and permitted for the account. Result names are generated as function_Field; aliases, multiple metrics, sum, and countdistinct are not supported. Maximum three distinct grouping fields and 500 characters. Bucket limits per grouping level: 65,000 for one field, 254 for two, 40 for three. Use $filter to restrict matching records and $top=0 for aggregation-only results. Subsequent @odata.nextLink pages do not repeat aggregations. See the API Grouping Results reference for response examples and limits.
Example: groupby((OriginatingSystemName,ListingId))
Maximum length: 500
200Successful responseapplication/json
valueobject[]optionalShow item properties
Additional properties allowed
@odata.countintegeroptionalNumber of results in current response
Example: 2
@odata.totalCountintegeroptionalNumber of matching records; may be estimated for large result sets.
Example: 892
@odata.nextLinkstringoptionalURL for next page of results
Example: https://api.anyprop.com/v1/listings/data/Office/skiptoken/demo_office_skip_321
aggregateobjectoptionalPresent for a standalone aggregate expression. Calculated across matching records, independently of the number of listing records returned.
Show properties
Additional properties allowed
groupobjectoptionalPresent for a groupby expression. Metric results, if requested, appear inside the innermost buckets.
Show properties
groupbystringrequiredField grouped at this level.
Example: City
countintegerrequiredNumber of returned buckets at this level, not total matching records.
Example: 1
bucketsobject[]requiredShow item properties
keystring | number | booleanrequiredGroup value. String keys are normalized to lowercase.
Show properties
Option 1
Option 2
Option 3
countintegerrequiredMatching records in this bucket, including records missing the metric field.
Example: 3
metricsobjectoptionalMetric results for this bucket; present in the innermost buckets when an aggregate metric was requested.
Show properties
Additional properties allowed
groupobjectoptionalNested results for the next grouping field.
Show properties
Recursive object
400Bad requestapplication/json
errorobjectoptionalShow properties
codestringoptionalmessagestringoptional401Unauthorizedapplication/json
errorobjectoptionalShow properties
codestringoptionalmessagestringoptionalGET /v1/listings/data/Office HTTP/1.1
Host: api.anyprop.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl --request GET \
--url 'https://api.anyprop.com/v1/listings/data/Office' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Accept: */*'fetch("https://api.anyprop.com/v1/listings/data/Office", {
"method": "GET",
"headers": {
"Authorization": "Bearer YOUR_SECRET_TOKEN",
"Accept": "*/*"
}
})
.then(response => response.json())
.then(console.log);import requests
response = requests.get(
"https://api.anyprop.com/v1/listings/data/Office",
headers={
"Authorization": "Bearer YOUR_SECRET_TOKEN",
"Accept": "*/*"
}
)
print(response.json())Response example
{
"value": [
{
"@odata.id": "Office('demo_office001')",
"BillingOfficeKey": "demo_billing_001",
"FranchiseAffiliation": "Century 21",
"FranchiseNationalAssociationID": "C21NAT001",
"HistoryTransactional": "Current",
"IDXOfficeParticipationYN": true,
"MainOffice": "demo_main_office_001",
"MainOfficeKey": "demo_main_office_001",
"MainOfficeMlsId": "MAIN001",
"Media": "demo_office_photo001",
"ModificationTimestamp": "2024-03-15T09:00:00.000000Z",
"NumberOfBranches": 3,
"NumberOfNonMemberSalespersons": 2,
"OfficeAddress1": "123 Main Street",
"OfficeAddress2": "Suite 200",
"OfficeAlternateId": "ALT_OFF_001",
"OfficeAOR": "Demo Board of Realtors",
"OfficeAORkey": "demo_board_001",
"OfficeAORMlsId": "DBR001",
"OfficeAssociationComments": "Charter member since 1995, active in community outreach",
"OfficeBio": "Demo Realty Group has been serving the Springfield community for over 25 years, providing exceptional real estate services with a commitment to integrity and client satisfaction.",
"OfficeBranchType": "Main Office",
"OfficeBroker": "demo_broker_001",
"OfficeBrokerKey": "demo_broker_001",
"OfficeBrokerMlsId": "BR001",
"OfficeBrokerNationalAssociationID": "NAR_BR001",
"OfficeCity": "Springfield",
"OfficeCorporateLicense": "CORP123456789",
"OfficeCountry": "US",
"OfficeCountyOrParish": "Madison County",
"OfficeEmail": "[email protected]",
"OfficeFax": "555-123-4568",
"OfficeKey": "demo_office_001",
"OfficeMailAddress1": "PO Box 12345",
"OfficeMailAddress2": null,
"OfficeMailCareOf": null,
"OfficeMailCity": "Springfield",
"OfficeMailCountry": "US",
"OfficeMailCountyOrParish": "Madison County",
"OfficeMailPostalCode": "12346",
"OfficeMailPostalCodePlus4": "0001",
"OfficeMailStateOrProvince": "IL",
"OfficeManager": "demo_manager_001",
"OfficeManagerKey": "demo_manager_001",
"OfficeManagerMlsId": "MGR001",
"OfficeMlsId": "OF567890",
"OfficeName": "Demo Realty Group",
"OfficeNationalAssociationId": "NAR_OF567890",
"OfficePhone": "555-123-4567",
"OfficePhoneExt": null,
"OfficePostalCode": "12345",
"OfficePostalCodePlus4": "6789",
"OfficeStateOrProvince": "IL",
"OfficeStatus": "Active",
"OfficeType": "Real Estate",
"OfficeURL": "https://www.demorealty.com",
"OriginalEntryTimestamp": "2024-01-01T08:00:00.000000Z",
"OriginatingSystemID": "DOS_001",
"OriginatingSystemKey": "demo_office_system",
"OriginatingSystemName": "Demo Office System",
"OriginatingSystemOfficeID": "DOS_OFF_001",
"OriginatingSystemOfficeKey": "orig_off_001",
"SocialMediaType": "Facebook, LinkedIn, Instagram",
"SourceSystemID": "SS_OFF_001",
"SourceSystemKey": "source_office_system",
"SourceSystemName": "Demo Source System",
"SourceSystemOfficeID": "SS_OFFICE_001",
"SourceSystemOfficeKey": "src_off_001"
},
{
"@odata.id": "Office('demo_office002')",
"BillingOfficeKey": "demo_billing_002",
"FranchiseAffiliation": "Independent",
"FranchiseNationalAssociationID": null,
"HistoryTransactional": "Current",
"IDXOfficeParticipationYN": true,
"MainOffice": "demo_office_002",
"MainOfficeKey": "demo_office_002",
"MainOfficeMlsId": "OF123456",
"Media": "demo_office_photo002",
"ModificationTimestamp": "2024-03-20T11:30:00.000000Z",
"NumberOfBranches": 1,
"NumberOfNonMemberSalespersons": 0,
"OfficeAddress1": "456 Oak Avenue",
"OfficeAddress2": null,
"OfficeAlternateId": "ALT_OFF_002",
"OfficeAOR": "River County Board of Realtors",
"OfficeAORkey": "river_board_001",
"OfficeAORMlsId": "RBR001",
"OfficeAssociationComments": "Member since 2010, specializes in residential properties",
"OfficeBio": "Riverside Realty is a boutique real estate firm focusing on personalized service and local market expertise in the River County area.",
"OfficeBranchType": "Main Office",
"OfficeBroker": "demo_broker_002",
"OfficeBrokerKey": "demo_broker_002",
"OfficeBrokerMlsId": "BR002",
"OfficeBrokerNationalAssociationID": "NAR_BR002",
"OfficeCity": "Riverside",
"OfficeCorporateLicense": "CORP987654321",
"OfficeCountry": "US",
"OfficeCountyOrParish": "River County",
"OfficeEmail": "[email protected]",
"OfficeFax": "555-246-8102",
"OfficeKey": "demo_office_002",
"OfficeMailAddress1": "456 Oak Avenue",
"OfficeMailAddress2": null,
"OfficeMailCareOf": null,
"OfficeMailCity": "Riverside",
"OfficeMailCountry": "US",
"OfficeMailCountyOrParish": "River County",
"OfficeMailPostalCode": "54321",
"OfficeMailPostalCodePlus4": "0987",
"OfficeMailStateOrProvince": "IL",
"OfficeManager": "demo_manager_002",
"OfficeManagerKey": "demo_manager_002",
"OfficeManagerMlsId": "MGR002",
"OfficeMlsId": "OF123456",
"OfficeName": "Riverside Realty",
"OfficeNationalAssociationId": "NAR_OF123456",
"OfficePhone": "555-246-8100",
"OfficePhoneExt": null,
"OfficePostalCode": "54321",
"OfficePostalCodePlus4": "0987",
"OfficeStateOrProvince": "IL",
"OfficeStatus": "Active",
"OfficeType": "Real Estate",
"OfficeURL": "https://www.riversiderealty.com",
"OriginalEntryTimestamp": "2024-02-15T10:00:00.000000Z",
"OriginatingSystemID": "DOS_002",
"OriginatingSystemKey": "demo_office_system",
"OriginatingSystemName": "Demo Office System",
"OriginatingSystemOfficeID": "DOS_OFF_002",
"OriginatingSystemOfficeKey": "orig_off_002",
"SocialMediaType": "LinkedIn, Google Business",
"SourceSystemID": "SS_OFF_002",
"SourceSystemKey": "source_office_system",
"SourceSystemName": "Demo Source System",
"SourceSystemOfficeID": "SS_OFFICE_002",
"SourceSystemOfficeKey": "src_off_002"
}
],
"@odata.count": 2,
"@odata.totalCount": 892,
"@odata.nextLink": "https://api.anyprop.com/v1/listings/data/Office/skiptoken/demo_office_skip_321"
}{
"error": {
"code": "text",
"message": "text"
}
}{
"error": {
"code": "text",
"message": "text"
}
}Available $filter fields
ModificationTimestamp, OfficeEmail, OfficeMlsId, OfficeName, OfficePhone, OfficeStateOrProvince, OfficeStatus, OriginatingSystemName
OpenHouse Resource
Get open house info
https://api.anyprop.com/v1/listings/data/OpenHouseRetrieve open house data with support for OData query options
AuthorizationstringrequiredBearer authentication header of the form Bearer <token>.
$filterstringoptionalOData filter expression
Example: contains(OriginatingSystemName, 'sample')
$selectstringoptionalSelect specific fields
Example: OfficeMlsId
$orderbystringoptionalOrder results by specified fields (append 'desc' for descending order)
Example: ModificationTimestamp desc
$topintegeroptionalLimit returned listing records. Default: 10; maximum: 50,000. Set $top=0 to return only aggregation results without records or a next-page link.
Default: 10
Minimum: 0
Maximum: 50000
$skipintegeroptionalSkip number of results
Default: 0
$ignorenullsbooleanoptionalIgnore null fields and omit them from the results
Example: true
Default: false
$applystringoptionalGroup matching records or calculate one aggregate metric. Supports groupby((Field1,Field2)), aggregate(Field with Function), and groupby((Field1,Field2),aggregate(Field with Function)). Numeric fields support average (or avg), min, max, median, p10, p25, p50, p75, p90, p95; date fields support min/max and return Unix milliseconds. Median and percentiles are approximate. Fields must be published and permitted for the account. Result names are generated as function_Field; aliases, multiple metrics, sum, and countdistinct are not supported. Maximum three distinct grouping fields and 500 characters. Bucket limits per grouping level: 65,000 for one field, 254 for two, 40 for three. Use $filter to restrict matching records and $top=0 for aggregation-only results. Subsequent @odata.nextLink pages do not repeat aggregations. See the API Grouping Results reference for response examples and limits.
Example: groupby((OriginatingSystemName,ListingId))
Maximum length: 500
200Successful responseapplication/json
valueobject[]optionalShow item properties
Additional properties allowed
@odata.countintegeroptionalNumber of results in current response
Example: 2
@odata.totalCountintegeroptionalNumber of matching records; may be estimated for large result sets.
Example: 247
@odata.nextLinkstringoptionalURL for next page of results
Example: https://api.anyprop.com/v1/listings/data/OpenHouse/skiptoken/demo_openhouse_skip_654
aggregateobjectoptionalPresent for a standalone aggregate expression. Calculated across matching records, independently of the number of listing records returned.
Show properties
Additional properties allowed
groupobjectoptionalPresent for a groupby expression. Metric results, if requested, appear inside the innermost buckets.
Show properties
groupbystringrequiredField grouped at this level.
Example: City
countintegerrequiredNumber of returned buckets at this level, not total matching records.
Example: 1
bucketsobject[]requiredShow item properties
keystring | number | booleanrequiredGroup value. String keys are normalized to lowercase.
Show properties
Option 1
Option 2
Option 3
countintegerrequiredMatching records in this bucket, including records missing the metric field.
Example: 3
metricsobjectoptionalMetric results for this bucket; present in the innermost buckets when an aggregate metric was requested.
Show properties
Additional properties allowed
groupobjectoptionalNested results for the next grouping field.
Show properties
Recursive object
400Bad requestapplication/json
errorobjectoptionalShow properties
codestringoptionalmessagestringoptional401Unauthorizedapplication/json
errorobjectoptionalShow properties
codestringoptionalmessagestringoptionalGET /v1/listings/data/OpenHouse HTTP/1.1
Host: api.anyprop.com
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*curl --request GET \
--url 'https://api.anyprop.com/v1/listings/data/OpenHouse' \
--header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
--header 'Accept: */*'fetch("https://api.anyprop.com/v1/listings/data/OpenHouse", {
"method": "GET",
"headers": {
"Authorization": "Bearer YOUR_SECRET_TOKEN",
"Accept": "*/*"
}
})
.then(response => response.json())
.then(console.log);import requests
response = requests.get(
"https://api.anyprop.com/v1/listings/data/OpenHouse",
headers={
"Authorization": "Bearer YOUR_SECRET_TOKEN",
"Accept": "*/*"
}
)
print(response.json())Response example
{
"value": [
{
"@odata.id": "OpenHouse('demo_openhouse001')",
"AppointmentRequiredYN": false,
"HistoryTransactional": "Current",
"Listing": "demo_prop001",
"ListingId": "DEMO001",
"ListingKey": "demo_prop001",
"LivestreamOpenHouseURL": "https://livestream.demo.com/openhouse001",
"Media": "demo_openhouse_media001",
"ModificationTimestamp": "2024-03-15T14:00:00.000000Z",
"OpenHouseAttendedBy": "Jane Smith",
"OpenHouseDate": "2024-03-23",
"OpenHouseEndTime": "2024-03-23T16:00:00.000000Z",
"OpenHouseId": "OH001",
"OpenHouseKey": "demo_openhouse001",
"OpenHouseRemarks": "Beautiful home in desirable neighborhood. Refreshments will be provided. Parking available on street and in driveway.",
"OpenHouseStartTime": "2024-03-23T14:00:00.000000Z",
"OpenHouseStatus": "Confirmed",
"OpenHouseType": "Public",
"OriginalEntryTimestamp": "2024-03-15T10:30:00.000000Z",
"OriginatingSystem": "Demo Open House System",
"OriginatingSystemID": "DOHS001",
"OriginatingSystemKey": "demo_openhouse_system",
"OriginatingSystemName": "demo_openhouse_system",
"Refreshments": "Coffee, water, cookies",
"ShowingAgent": "demo_agent_jane001",
"ShowingAgentFirstName": "Jane",
"ShowingAgentKey": "demo_agent_jane001",
"ShowingAgentLastName": "Smith",
"ShowingAgentMlsID": "AG123456",
"SocialMedia": "Facebook Event Created",
"SourceSystem": "Demo MLS System",
"SourceSystemID": "DMS_OH_001",
"SourceSystemKey": "demo_mls_system",
"SourceSystemName": "demo_mls_system"
},
{
"@odata.id": "OpenHouse('demo_openhouse002')",
"AppointmentRequiredYN": true,
"HistoryTransactional": "Current",
"Listing": "demo_prop002",
"ListingId": "DEMO002",
"ListingKey": "demo_prop002",
"LivestreamOpenHouseURL": null,
"Media": "demo_openhouse_media002",
"ModificationTimestamp": "2024-03-20T16:30:00.000000Z",
"OpenHouseAttendedBy": "Mike Johnson",
"OpenHouseDate": "2024-03-24",
"OpenHouseEndTime": "2024-03-24T15:30:00.000000Z",
"OpenHouseId": "OH002",
"OpenHouseKey": "demo_openhouse002",
"OpenHouseRemarks": "Charming ranch home perfect for first-time buyers. Please call ahead to schedule viewing time. Small groups preferred.",
"OpenHouseStartTime": "2024-03-24T13:00:00.000000Z",
"OpenHouseStatus": "Confirmed",
"OpenHouseType": "Private",
"OriginalEntryTimestamp": "2024-03-20T12:00:00.000000Z",
"OriginatingSystem": "Demo Open House System",
"OriginatingSystemID": "DOHS002",
"OriginatingSystemKey": "demo_openhouse_system",
"OriginatingSystemName": "demo_openhouse_system",
"Refreshments": "Light refreshments available",
"ShowingAgent": "demo_agent_mike002",
"ShowingAgentFirstName": "Mike",
"ShowingAgentKey": "demo_agent_mike002",
"ShowingAgentLastName": "Johnson",
"ShowingAgentMlsID": "AG789012",
"SocialMedia": "LinkedIn Post Shared",
"SourceSystem": "Demo MLS System",
"SourceSystemID": "DMS_OH_002",
"SourceSystemKey": "demo_mls_system",
"SourceSystemName": "demo_mls_system"
}
],
"@odata.count": 2,
"@odata.totalCount": 247,
"@odata.nextLink": "https://api.anyprop.com/v1/listings/data/OpenHouse/skiptoken/demo_openhouse_skip_654"
}{
"error": {
"code": "text",
"message": "text"
}
}{
"error": {
"code": "text",
"message": "text"
}
}Available $filter fields
ListingId, ModificationTimestamp, OpenHouseDate, OpenHouseKey, OriginatingSystemName
Query Parameters
OData Query Support
All resources support the following OData query parameters:
$filter: Filter results using OData filter expressions$select: Select specific fields to return$top: Limit the number of listing records (default: 10, max: 50,000). Use0for aggregation-only requests.$skip: Skip a number of results for pagination$apply: Group matching records and calculate supported aggregate metrics
Additionally, the Property resource supports:
$expand: Include related Media, OpenHouse, PropertyChange, PreferredMedia, PropertyRooms, and PropertyUnitTypes data
Our API supports comprehensive OData filtering capabilities:
Comparison Operators
eq: Equal tone: Not equal togt: Greater thange: Greater than or equal tolt: Less thanle: Less than or equal to
Logical Operators
and: Both conditions must be trueor: Either condition must be truenot: Negates the condition
String Functions
contains(field, 'value'): Checks if field contains the specified valuestartswith(field, 'value'): Checks if field starts with the specified valueendswith(field, 'value'): Checks if field ends with the specified value
Example complex queries:
# Multiple conditions
$filter=PropertyType eq 'Residential' and StandardStatus eq 'Active'
# String function with logical operator
$filter=startswith(OfficeMlsId, 'P') or contains(OfficeName, 'Real')
# Date comparison
$filter=ModificationTimestamp gt '2023-01-01T00:00:00Z'API Grouping Results
Use $apply to group matching records and calculate aggregate metrics. String grouping is case insensitive.
Syntax
$apply=groupby((field1,field2,...))Response Schema
The grouping response contains the following:
- group
- groupby: Field being grouped.
- count: Number of returned groups.
- buckets: Array of group results.
- key: Group value.
- count: Items in the group.
- group: Nested grouping (for multiple fields).
Example Response
{
"group": {
"groupby": "OriginatingSystemName",
"count": 18,
"buckets": [
{
"key": "global mls",
"count": 89656,
"group": {
"groupby": "StateOrProvince",
"count": 17,
"buckets": [
{
"key": "fl",
"count": 87267
},
{
"key": "",
"count": 2307
}
]
}
}
]
}
}Aggregate Functions
Use $apply to calculate a metric across matching records, either for the whole result set or within each group. These are the aggregation expressions supported by this API; the response format described below is an API extension to OData.
| Function | Field type | Result |
|---|---|---|
average, avg |
Numeric | Arithmetic mean. avg uses the same result name as average. |
min |
Numeric or date/time | Lowest value. |
max |
Numeric or date/time | Highest value. |
median |
Numeric | Approximate 50th percentile. |
p10, p25, p50, p75, p90, p95 |
Numeric | Approximate value at the specified percentile. |
The field must be published for the resource and permitted for your account. Numeric fields support all functions listed above. Date/time fields support only min and max; their aggregate values are returned as Unix timestamps in milliseconds, rather than ISO 8601 strings. Text, Boolean, and other non-numeric field types cannot be used with these metric functions, although supported fields can still be used for grouping.
Median and percentile results are estimates and can include fractional values even when the original values are whole numbers. Records missing the metric field do not contribute to its calculation; a bucket's count reports matching records in the bucket, including records without a value for the metric field.
Standalone Aggregation
Calculate a metric across the matching records:
$filter=StandardStatus eq 'Active' and PropertyType eq 'Residential'
$apply=aggregate(ListPrice with average)
$top=0The query parameters above belong to the same request. $filter restricts both the listing results and the aggregation. $top=0 returns the aggregation without listing records or a next-page link; a positive $top can return listings and an aggregation together.
Illustrative response:
{
"value": [],
"aggregate": {
"average_ListPrice": 500000
},
"@odata.totalCount": 3,
"@odata.count": 0
}Standalone results appear in the top-level aggregate object. Each result name combines the function and field, such as average_ListPrice, min_ListPrice, or p90_ListPrice. @odata.count counts returned listing records, so it is zero with $top=0. @odata.totalCount reports the number of matching records and may be estimated for large result sets.
Grouped Aggregation
Calculate a metric within each group:
$filter=StandardStatus eq 'Active' and PropertyType eq 'Residential'
$apply=groupby((City),aggregate(ListPrice with median))
$top=0Illustrative response:
{
"value": [],
"group": {
"groupby": "City",
"count": 1,
"buckets": [
{
"key": "miami",
"count": 3,
"metrics": {
"median_ListPrice": 500000
}
}
]
},
"@odata.totalCount": 3,
"@odata.count": 0
}Each bucket contains its group value in key, its matching-record count in count, and calculated values in metrics. group.count is the number of returned buckets, not the number of matching records. String grouping is case insensitive, and returned string keys are normalized to lowercase.
Multiple grouping fields create nested group objects. The metric appears in the innermost buckets, where the full combination of grouping fields is known:
$apply=groupby((City,PropertyType),aggregate(ListPrice with average))Limits and Errors
- One aggregate metric is supported per request. Send separate requests to calculate multiple metrics.
- Result names are generated automatically.
asaliases are not supported. - The supported metric functions are those listed above;
sum,countdistinct, and explicit$countaggregate expressions are not supported. Grouping includes bucket counts automatically. $applyaccepts at most 500 characters and up to three distinct grouping fields.- Bucket limits at each grouping level are 65,000 for one grouping field, 254 for two fields, and 40 for three fields. A capped response may omit groups;
group.countcounts only returned buckets. @odata.nextLinkpages listing records, not aggregation buckets. Aggregations are calculated on the initial request and are not repeated on subsequent listing pages.
Unknown fields, fields outside your account permissions, incompatible field types, and unsupported aggregation syntax return HTTP 400 with an apply_error. For example, aggregate(City with average) returns:
{
"error": {
"code": "apply_error",
"message": "Aggregate field must be numeric for average: City"
}
}Error Handling
All errors follow the standard OData format:
{
"error": {
"code": "error_code",
"message": "Human readable error message"
}
}