BPO Listings

The BPO (Broker Price Opinion) API provides the estimated value of a real estate property using the RESO Web API profile over OData.


Account Resources & Permissions

Retrieve account resources and permissions:

Get account resources

get

Retrieve resources and permissions for the account

Authorizations
Responses
200

Successful response

application/json
get
/v1/account/resources

MLS Profiles

Retrieve MLS profiles (logos, disclaimers, compliance elements):

Get MLS profiles

get

Retrieve profiles for active MLSes (including logos, disclaimers, and basic compliance elements).

Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Responses
200

Successful response

application/json
get
/v1/bpo/mls_profiles

API Resources

The base URL for all BPO API requests is:

Property Resource

Retrieve property listings with OData support:

Get property listings

get

Retrieve property listings with support for OData query options

Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Query parameters
$filterstringOptional

OData filter expression

Example: contains(PropertyType, 'Lease') or StandardStatus eq 'Active'
$selectstringOptional

Select specific fields

Example: ListingId,BedroomsTotal
$orderbystringOptional

Order results by specified fields (append 'desc' for descending order)

Example: ModificationTimestamp desc
$expandstringOptional

Expand related entities

Example: Media($select=MediaKey),OpenHouse($select=OpenHouseKey)
$topinteger · max: 25000Optional

Limit the number of results

Default: 10
$skipintegerOptional

Skip number of results

Default: 0
$ignorenullsbooleanOptional

Ignore null fields and omit them from the results

Default: falseExample: true
$applystringOptional

Allows groups and aggregates data by specified fields

Example: groupby((OriginatingSystemName,ListingId))
Responses
200

Successful response

application/json
get
/v1/bpo/data/Property

$filter fields

OriginatingSystemName, ModificationTimestamp, PhotosChangeTimestamp, StandardStatus, PropertyType, ListingId, ListOfficeMlsId, ListingKey, ListingContractDate, OnMarketTimestamp, OnMarketDate, ListPrice, OriginalListPrice, CloseDate, StatusChangeTimestamp, MlsStatus, City, PostalCode, PostalCodePlus4, StateOrProvince, StreetDirPrefix, StreetDirSuffix, StreetName, StreetNumber, StreetSuffix, UnitNumber, UnparsedAddress, CountyOrParish, ListAgentFullName, ListOfficeName, BathroomsTotalInteger, PropertySubType, BathroomsPartial, BathroomsFull, LotSizeArea, LotSizeSquareFeet, Latitude, Longitude, GarageYN, GarageSpaces, CarportYN, CarportSpaces, PoolPrivateYN, SeniorCommunityYN, AssociationYN, NewConstructionYN, BedroomsTotal, DaysOnMarket, YearBuiltEffective, YearBuilt, PhotosCount, LivingArea, RawLocation, RawAddressSearchText, Location

$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 timestamps

  • 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)

Geospatial Filtering:

Supported via geo.distance on RawLocation or Location. Only le comparison is accepted (distance in meters):

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.

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.

Syntax:

Example:

Agent and Office Search:

Search for properties by agent, co-agent, office, or co-office names using search.text on the following fields. This search encompasses both listing and buyer agents, as well as their respective co-agents and offices:

  • ListAgentSearchText - Listing agent names

  • BuyerAgentSearchText - Buyer agent names

  • ListOfficeSearchText - Listing office names

  • BuyerOfficeSearchText - Buyer office names

Syntax:

Example:

Sorting by Relevance:

To sort results by the best match, use:

Complete Example:


Media Resource

Retrieve media resources:

Get media resources

get

Retrieve media resources with support for OData query options

Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Query parameters
$filterstringOptional

OData filter expression

Example: Order eq 1
$selectstringOptional

Select specific fields

Example: MediaKey,Order
$orderbystringOptional

Order results by specified fields (append 'desc' for descending order)

Example: ModificationTimestamp desc
$topinteger · max: 25000Optional

Limit the number of results

Default: 10
$skipintegerOptional

Skip number of results

Default: 0
$ignorenullsbooleanOptional

Ignore null fields and omit them from the results

Default: falseExample: true
$applystringOptional

Allows groups and aggregates data by specified fields

Example: groupby((OriginatingSystemName,ListingId))
Responses
200

Successful response

application/json
get
/v1/bpo/data/Media

$filter fields

OriginatingSystemName, ModificationTimestamp, MediaKey, MediaStatus, Order, MediaCategory, ResourceName, ResourceRecordKey, ResourceRecordID


Member Resource

Retrieve member data:

Get member information

get

Retrieve member data with support for OData query options

Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Query parameters
$filterstringOptional

OData filter expression

Example: contains(OriginatingSystemName, 'sample')
$selectstringOptional

Select specific fields

Example: MemberMlsId
$orderbystringOptional

Order results by specified fields (append 'desc' for descending order)

Example: ModificationTimestamp desc
$topinteger · max: 25000Optional

Limit the number of results

Default: 10
$skipintegerOptional

Skip number of results

Default: 0
$ignorenullsbooleanOptional

Ignore null fields and omit them from the results

Default: falseExample: true
$applystringOptional

Allows groups and aggregates data by specified fields

Example: groupby((OriginatingSystemName,ListingId))
Responses
200

Successful response

application/json
get
/v1/bpo/data/Member

$filter fields

OriginatingSystemName, ModificationTimestamp, MemberMlsId


Office Resource

Retrieve office data:

Get office information

get

Retrieve office data with support for OData query options

Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Query parameters
$filterstringOptional

OData filter expression

Example: contains(OriginatingSystemName, 'sample')
$selectstringOptional

Select specific fields

Example: OfficeMlsId
$orderbystringOptional

Order results by specified fields (append 'desc' for descending order)

Example: ModificationTimestamp desc
$topinteger · max: 25000Optional

Limit the number of results

Default: 10
$skipintegerOptional

Skip number of results

Default: 0
$ignorenullsbooleanOptional

Ignore null fields and omit them from the results

Default: falseExample: true
$applystringOptional

Allows groups and aggregates data by specified fields

Example: groupby((OriginatingSystemName,ListingId))
Responses
200

Successful response

application/json
get
/v1/bpo/data/Office

$filter fields

OriginatingSystemName, ModificationTimestamp, OfficeMlsId


OpenHouse Resource

Retrieve open house info:

Get open house information

get

Retrieve open house data with support for OData query options

Authorizations
AuthorizationstringRequired
Bearer authentication header of the form Bearer <token>.
Query parameters
$filterstringOptional

OData filter expression

Example: contains(OriginatingSystemName, 'sample')
$selectstringOptional

Select specific fields

Example: OpenHouseKey
$orderbystringOptional

Order results by specified fields (append 'desc' for descending order)

Example: ModificationTimestamp desc
$topinteger · max: 25000Optional

Limit the number of results

Default: 10
$skipintegerOptional

Skip number of results

Default: 0
$ignorenullsbooleanOptional

Ignore null fields and omit them from the results

Default: falseExample: true
$applystringOptional

Allows groups and aggregates data by specified fields

Example: groupby((OriginatingSystemName,ListingId))
Responses
200

Successful response

application/json
get
/v1/bpo/data/OpenHouse

$filter fields

OriginatingSystemName, ModificationTimestamp, OpenHouseKey, ListingId, OpenHouseDate


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 results (default: 500, max: 5000)

  • $skip: Skip a number of results for pagination

Additionally, the Property resource supports:

  • $expand: Include related Media and OpenHouse data

Our API supports comprehensive OData filtering capabilities:

Comparison Operators

  • eq: Equal to

  • ne: Not equal to

  • gt: Greater than

  • ge: Greater than or equal to

  • lt: Less than

  • le: Less than or equal to

Logical Operators

  • and: Both conditions must be true

  • or: Either condition must be true

  • not: Negates the condition

String Functions

  • contains(field, 'value'): Checks if field contains the specified value

  • startswith(field, 'value'): Checks if field starts with the specified value

  • endswith(field, 'value'): Checks if field ends with the specified value

Example complex queries:

API Grouping Results

The OData API supports data aggregation using $apply=groupby(). Note that ALL grouping is case insensitive for string fields.

Syntax

Response Schema

The grouping response contains the following:

  • group

    • groupby: Field being grouped.

    • count: Total groups.

    • buckets: Array of group results.

      • key: Group value.

      • count: Items in the group.

      • group: Nested grouping (for multiple fields).


Example Response


Error Handling

All errors follow the standard OData format:

Last updated