Embed a property search map on any website with HTML custom elements. No framework required.
<link rel="stylesheet" href="https://unpkg.com/@rechat/sdk/dist/rechat.min.css"><script src="https://unpkg.com/@rechat/sdk/dist/rechat.min.js"></script> Copy
<link rel="stylesheet" href="https://unpkg.com/@rechat/sdk/dist/rechat.min.css"><script src="https://unpkg.com/@rechat/sdk/dist/rechat.min.js"></script>
<rechat-root brand_id="YOUR_BRAND_ID"> <rechat-listings map_api_key="YOUR_GOOGLE_MAPS_KEY" map_default_center="32.7767, -96.797" filter_listing_statuses="Active" > <rechat-map-filter></rechat-map-filter> <div style="display:flex; height:100vh"> <div style="flex:1"><rechat-map></rechat-map></div> <div style="flex:1; overflow:auto"> <rechat-listings-count></rechat-listings-count> <rechat-map-listings-grid></rechat-map-listings-grid> <rechat-listings-pagination></rechat-listings-pagination> </div> </div> </rechat-listings></rechat-root> Copy
<rechat-root brand_id="YOUR_BRAND_ID"> <rechat-listings map_api_key="YOUR_GOOGLE_MAPS_KEY" map_default_center="32.7767, -96.797" filter_listing_statuses="Active" > <rechat-map-filter></rechat-map-filter> <div style="display:flex; height:100vh"> <div style="flex:1"><rechat-map></rechat-map></div> <div style="flex:1; overflow:auto"> <rechat-listings-count></rechat-listings-count> <rechat-map-listings-grid></rechat-map-listings-grid> <rechat-listings-pagination></rechat-listings-pagination> </div> </div> </rechat-listings></rechat-root>
View Examples
<rechat-root> — outermost wrapper. Handles auth and brand config. One per page.
<rechat-root>
<rechat-listings> — listing context. Owns filter state and API calls. All listing components must be inside it.
<rechat-listings>
<rechat-map>
<rechat-map-filter>
<rechat-map-listings-grid>
<rechat-listings-list>
<rechat-listing-card>
<rechat-listings-sort>
<rechat-listings-count>
<rechat-listings-pagination>
<rechat-property-search-form>
Use these instead of <rechat-map-filter> for custom layouts:
<rechat-filter-search> <rechat-filter-property-type> <rechat-filter-price> <rechat-filter-beds> <rechat-filter-baths> <rechat-filter-advanced> <rechat-filter-reset> <rechat-filter-loading>
<rechat-filter-search>
<rechat-filter-property-type>
<rechat-filter-price>
<rechat-filter-beds>
<rechat-filter-baths>
<rechat-filter-advanced>
<rechat-filter-reset>
<rechat-filter-loading>
All attributes are HTML strings. Numbers as "10", booleans as "true"/"false", lists as "Active,Sold".
"10"
"true"
"false"
"Active,Sold"
brand_id
authorization
api_url
"https://api.rechat.com"
map_api_key
map_default_center
"lat, lng"
map_zoom
map_id
filter_listing_statuses
"Active"
Active
Sold
Leased
Pending
filter_property_types
filter_property_subtypes
filter_architectural_styles
filter_sort_by
"-price"
-
filter_address
""
filter_search_limit
filter_suggestions_limit
"5"
filter_minimum_price
filter_maximum_price
filter_minimum_bedrooms
filter_maximum_bedrooms
filter_minimum_bathrooms
filter_baths
filter_minimum_parking_spaces
filter_minimum_square_feet
filter_maximum_square_feet
filter_minimum_lot_square_feet
filter_maximum_lot_square_feet
filter_minimum_year_built
filter_maximum_year_built
filter_minimum_sold_date
filter_pool
filter_open_houses
filter_office_exclusives
filter_agents
filter_list_offices
filter_brand_id
Set to "true" to hide the control. The filter value still applies via attributes.
disable_filter_price disable_filter_address disable_filter_beds disable_filter_baths disable_filter_property_types disable_filter_advanced disable_filter_loading_indicator
disable_filter_price
disable_filter_address
disable_filter_beds
disable_filter_baths
disable_filter_property_types
disable_filter_advanced
disable_filter_loading_indicator
listing_hyperlink_href
{id}
listing_hyperlink_target
"_blank"
filter_pagination_limit
"20"
filter_pagination_offset
"0"
Custom events dispatched on window. Access data via event.detail.
window
event.detail
rechat-listings:fetched
IListing[]
rechat-listing-filters:change
rechat-listing-card:click
{ listing: IListing }
rechat-listings-pagination:change
{ page: number }
rechat-error
{ source: string, error: string }
window.addEventListener('rechat-listings:fetched', (e) => { console.log(`${e.detail.length} listings loaded`)})window.addEventListener('rechat-listing-card:click', (e) => { window.location.href = `/properties/${e.detail.listing.id}`})window.addEventListener('rechat-error', (e) => { console.error(`[${e.detail.source}]:`, e.detail.error)}) Copy
window.addEventListener('rechat-listings:fetched', (e) => { console.log(`${e.detail.length} listings loaded`)})window.addEventListener('rechat-listing-card:click', (e) => { window.location.href = `/properties/${e.detail.listing.id}`})window.addEventListener('rechat-error', (e) => { console.error(`[${e.detail.source}]:`, e.detail.error)})
Override variables on :root or on the rechat-root element.
:root
rechat-root
:root { --rechat-theme-secondary-9: #e63946; --rechat-theme-text-font-family: "Georgia";} Copy
:root { --rechat-theme-secondary-9: #e63946; --rechat-theme-text-font-family: "Georgia";}
--rechat-theme-secondary-9
#0b73da
--rechat-theme-secondary-10
#0065cb
--rechat-theme-secondary-11
#0671d8
--rechat-theme-secondary-12
#0c3361
--rechat-theme-status-active
#32B86D
--rechat-theme-status-pending
#FFB74D
--rechat-theme-status-sold
#F44336
--rechat-theme-status-leased
#64B5F6
--rechat-theme-status-other
#949598
--rechat-theme-pin-color
#e3001b
--rechat-theme-text-font-family
"Lato"
--rechat-theme-text-primary
var(--rechat-theme-gray-12)
--rechat-theme-text-secondary
var(--rechat-theme-gray-a10)
--rechat-theme-text-error
#ff0033
--rechat-theme-scaling
1
--rechat-theme-radius-factor
0
--rechat-theme-background-color
white
--rechat-theme-skeleton-base-color
#ebebeb
--rechat-theme-skeleton-highlight-color
#f5f5f5
--rechat-theme-skeleton-animation-duration
1.5s
--rechat-theme-listing-card-box-shadow
0px 4px 4px var(--rechat-theme-accent-a3)
--rechat-theme-listing-card-highlighted-box-shadow
0px 2px 4px var(--rechat-theme-accent-a8)
Web Components — Quick Start
Embed a property search map on any website with HTML custom elements. No framework required.
Loading the SDK
Minimal Example
View Examples
Structure
<rechat-root>— outermost wrapper. Handles auth and brand config. One per page.<rechat-listings>— listing context. Owns filter state and API calls. All listing components must be inside it.Available Components
<rechat-root><rechat-listings><rechat-map><rechat-map-filter><rechat-map-listings-grid><rechat-listings-list><rechat-listing-card><rechat-listings-sort><rechat-listings-count><rechat-listings-pagination><rechat-property-search-form>Individual Filter Components
Use these instead of
<rechat-map-filter>for custom layouts:<rechat-filter-search><rechat-filter-property-type><rechat-filter-price><rechat-filter-beds><rechat-filter-baths><rechat-filter-advanced><rechat-filter-reset><rechat-filter-loading>Attributes
All attributes are HTML strings. Numbers as
"10", booleans as"true"/"false", lists as"Active,Sold".<rechat-root>brand_idauthorizationapi_url"https://api.rechat.com"<rechat-listings>— Mapmap_api_keymap_default_center"lat, lng"initial centermap_zoom"10"map_id<rechat-listings>— Filtersfilter_listing_statuses"Active"Active,Sold,Leased,Pending, etc.filter_property_typesfilter_property_subtypesfilter_architectural_stylesfilter_sort_by"-price"-prefix = descendingfilter_address""filter_search_limitfilter_suggestions_limit"5"filter_minimum_pricefilter_maximum_pricefilter_minimum_bedroomsfilter_maximum_bedroomsfilter_minimum_bathroomsfilter_bathsfilter_minimum_parking_spacesfilter_minimum_square_feetfilter_maximum_square_feetfilter_minimum_lot_square_feetfilter_maximum_lot_square_feetfilter_minimum_year_builtfilter_maximum_year_builtfilter_minimum_sold_datefilter_pool"true"= pool onlyfilter_open_houses"false""true"= open house onlyfilter_office_exclusives"false""true"= office exclusive onlyfilter_agentsfilter_list_officesfilter_brand_id<rechat-listings>— Disable FiltersSet to
"true"to hide the control. The filter value still applies via attributes.disable_filter_pricedisable_filter_addressdisable_filter_bedsdisable_filter_bathsdisable_filter_property_typesdisable_filter_advanceddisable_filter_loading_indicator<rechat-listings>— Links & Paginationlisting_hyperlink_href{id}placeholderlisting_hyperlink_target"_blank")filter_pagination_limit"20"filter_pagination_offset"0"DOM Events
Custom events dispatched on
window. Access data viaevent.detail.rechat-listings:fetchedIListing[]rechat-listing-filters:changerechat-listing-card:click{ listing: IListing }rechat-listings-pagination:change{ page: number }rechat-error{ source: string, error: string }Examples
Theming — CSS Variables
Override variables on
:rootor on therechat-rootelement.Brand Color
--rechat-theme-secondary-9#0b73da--rechat-theme-secondary-10#0065cb--rechat-theme-secondary-11#0671d8--rechat-theme-secondary-12#0c3361Status Colors
--rechat-theme-status-active#32B86D--rechat-theme-status-pending#FFB74D--rechat-theme-status-sold#F44336--rechat-theme-status-leased#64B5F6--rechat-theme-status-other#949598Map
--rechat-theme-pin-color#e3001bTypography
--rechat-theme-text-font-family"Lato"--rechat-theme-text-primaryvar(--rechat-theme-gray-12)--rechat-theme-text-secondaryvar(--rechat-theme-gray-a10)--rechat-theme-text-error#ff0033Layout
--rechat-theme-scaling1--rechat-theme-radius-factor10= sharp)--rechat-theme-background-colorwhiteSkeleton Loading
--rechat-theme-skeleton-base-color#ebebeb--rechat-theme-skeleton-highlight-color#f5f5f5--rechat-theme-skeleton-animation-duration1.5sListing Card
--rechat-theme-listing-card-box-shadow0px 4px 4px var(--rechat-theme-accent-a3)--rechat-theme-listing-card-highlighted-box-shadow0px 2px 4px var(--rechat-theme-accent-a8)