All custom-element attributes are HTML strings. Numbers as "10", booleans as "true" / "false", lists as "Active,Sold" or a JSON array literal.
Every filter value (and every per-sub-filter disable flag) lives on <rechat-listings> under its filter_* / disable_filter_* name. <rechat-map-filter> and the individual <rechat-filter-*> tags only carry their local UI flag (disabled).
<rechat-root>
The outermost wrapper. One per page. Handles brand context and theme activation.
Attribute
Default
Description
brand_id
-
Rechat brand identifier
authorization
-
Auth token for authenticated requests
api_url
"https://api.rechat.com"
API base URL override
data-theme
"rechat"
Name of the CSS theme block to activate ("rechat" or "compact" ship by default; custom themes are authored as [data-theme="..."] CSS blocks). See Theming.md.
<rechat-listings>
The listing context wrapper. Owns filter / map / listing state. Required around any of the listing components. Every filter value the SDK supports is set here.
Core
Attribute
Default
Description
listings
-
JSON string of pre-hydrated IListing[] for SSR-style hydration
disabled
"false"
Suspend all listing fetches
filter_brand_id
-
Brand to scope listings to
filter_search_limit
-
Maximum total listings the search may return
Boundaries
Attribute
Default
Description
filter_boundary_ids
-
Comma-separated boundary UUIDs to seed selected places. Loaded on mount regardless of which filter UI tags are rendered.
filter_address, filter_boundary_state, filter_boundary_country, filter_suggestions_limit no longer belong on <rechat-listings> — they only take effect when a search UI is mounted. Set them on <rechat-map-filter> or <rechat-filter-search> instead. They still work on the parent for now but emit a deprecation warning and will be removed in a future release.
Comma-separated MLS names. Brokerage-side scope: always sent on every API call when set, even when other filters are absent or the map/filter UI is hidden.
filter_minimum_sold_date
-
Earliest sold date (Unix epoch seconds)
Numeric ranges
Attribute
Default
Description
filter_minimum_price
-
Minimum price
filter_maximum_price
-
Maximum price
filter_minimum_bedrooms
-
Minimum bedrooms
filter_maximum_bedrooms
-
Maximum bedrooms
filter_minimum_bathrooms
-
Minimum bathrooms
filter_baths
-
Exact bath count
filter_minimum_parking_spaces
-
Minimum parking spaces
filter_minimum_square_feet
-
Minimum square feet
filter_maximum_square_feet
-
Maximum square feet
filter_minimum_lot_square_feet
-
Minimum lot square feet
filter_maximum_lot_square_feet
-
Maximum lot square feet
filter_minimum_year_built
-
Minimum year built
filter_maximum_year_built
-
Maximum year built
Booleans
Attribute
Default
Description
filter_pool
-
"true" = require a pool
filter_open_houses
-
"true" = require open house. Omit or "false" = no filter applied.
filter_office_exclusives
-
"true" = office-exclusive only. Omit or "false" = no filter applied.
Disable sub-filters (deprecated)
Deprecated. These flags continue to work but emit a one-time console.warn per attribute. They will be removed in a future release. Move each one to the matching individual <rechat-filter-*> tag's disabled attribute.
Attribute
Hides
Move to
disable_filter_address
Address search box
disabled on <rechat-filter-search>
disable_filter_price
Price control
disabled on <rechat-filter-price>
disable_filter_beds
Beds control
disabled on <rechat-filter-beds>
disable_filter_baths
Baths control
disabled on <rechat-filter-baths>
disable_filter_property_types
Property types control
disabled on <rechat-filter-property-type>
disable_filter_advanced
Advanced filters control
disabled on <rechat-filter-advanced>
disable_filter_loading_indicator
Loading indicator
disabled on <rechat-filter-loading>
<rechat-map>
The MapLibre + OpenFreeMap map.
Attribute
Default
Description
preset
"liberty"
Built-in style preset: liberty, bright, positron, dark
style_url
-
Full URL to any MapLibre-compatible style JSON (wins over preset)
zoom
"10"
Initial zoom level
default_center
-
"lat, lng" initial map center (does not affect the search filter - only the camera)
<rechat-map-filter>
The all-in-one filter bar. Most filter values live on the parent <rechat-listings>; the four search-related attrs live here because they only take effect when a search UI is mounted.
Attribute
Default
Description
address
-
Initial free-text address query
boundary_state
-
Restrict autocomplete suggestions to a state (e.g. "TX")
boundary_country
-
Restrict autocomplete suggestions to a country (e.g. "US")
suggestions_limit
"5"
Max autocomplete suggestions
Sub-filter visibility is controlled via the disable_filter_* flags on <rechat-listings> (deprecated) or by composing individual <rechat-filter-*> tags with disabled="true".
Individual filter tags
Use these when composing filters one-by-one instead of <rechat-map-filter>. Each carries only its local UI flag, except <rechat-filter-search>, which also accepts the four search-config attrs.
disabled="true" hides the control without removing it from the DOM; the underlying filter state (seeded by <rechat-listings>) still applies.
<rechat-listings-sort>
Attribute
Default
Description
value
"-price"
Sort order. - prefix = descending.
The sort order applies to every API call regardless of whether this tag is rendered. To set the default without showing the dropdown, set filter_sort_by on <rechat-listings> instead.
<rechat-listings-pagination>
Attribute
Default
Description
limit
"20"
Listings per page
offset
"0"
Initial offset
Pagination affects the API request whether or not this tag is rendered. To configure page size/offset without showing the navigator, set filter_pagination_limit / filter_pagination_offset on <rechat-listings>.
<rechat-listing-card>
Attribute
Default
Description
id
-
Fetch a single listing by id
listing
-
JSON string of a pre-hydrated listing
skeleton
"false"
Force the loading-skeleton state
compact
"false"
Use the compact layout
hyperlink_href
-
URL template with {id} placeholder for the whole card
hyperlink_target
-
Link target (e.g. "_blank")
<rechat-map-listings-grid> and <rechat-listings-list> render cards internally with no slot to set the hyperlink. Configure card-level link behaviour at the parent via listing_hyperlink_href / listing_hyperlink_target on <rechat-listings>.
DOM Events
Custom events dispatched on window. Access data via event.detail.
Event
Detail
When
rechat-listings:fetched
IListing[]
Listings loaded/reloaded from API
rechat-listing-filters:change
Filter state object
Any filter or map position changes
rechat-listing-card:click
{ listing: IListing }
Listing card clicked — fires for cards inside the grid/list and for listings picked from the address-search autocomplete's "Listings" section
window.addEventListener('rechat-listing-card:click', (e) => { // Fires for listing-grid clicks AND for picks from the address-search // autocomplete's "Listings" section. window.location.href = `/properties/${e.detail.listing.id}` })
The SDK exposes its visual surface as CSS custom properties. You can
restyle individual values in place, or activate a complete named theme
via the data-theme HTML attribute. Either approach is pure CSS -
nothing to register from JavaScript.
Web Components - Quick Start
Embed a property search map on any website with HTML custom elements. No framework required.
Loading the SDK
Minimal Example
Open the Widget Builder
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 custom-element attributes are HTML strings. Numbers as
"10", booleans as"true"/"false", lists as"Active,Sold"or a JSON array literal.Every filter value (and every per-sub-filter disable flag) lives on
<rechat-listings>under itsfilter_*/disable_filter_*name.<rechat-map-filter>and the individual<rechat-filter-*>tags only carry their local UI flag (disabled).<rechat-root>The outermost wrapper. One per page. Handles brand context and theme activation.
brand_idauthorizationapi_url"https://api.rechat.com"data-theme"rechat""rechat"or"compact"ship by default; custom themes are authored as[data-theme="..."]CSS blocks). SeeTheming.md.<rechat-listings>The listing context wrapper. Owns filter / map / listing state. Required around any of the listing components. Every filter value the SDK supports is set here.
Core
listingsIListing[]for SSR-style hydrationdisabled"false"filter_brand_idfilter_search_limitBoundaries
filter_boundary_idsClassification
filter_listing_statuses"Active"Active,Sold,Pending,Leased, …)filter_property_typesfilter_property_subtypesfilter_architectural_stylesfilter_list_agentsfilter_list_officesfilter_agentsfilter_mlsesfilter_minimum_sold_dateNumeric ranges
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_builtBooleans
filter_pool"true"= require a poolfilter_open_houses"true"= require open house. Omit or"false"= no filter applied.filter_office_exclusives"true"= office-exclusive only. Omit or"false"= no filter applied.Disable sub-filters (deprecated)
disable_filter_addressdisabledon<rechat-filter-search>disable_filter_pricedisabledon<rechat-filter-price>disable_filter_bedsdisabledon<rechat-filter-beds>disable_filter_bathsdisabledon<rechat-filter-baths>disable_filter_property_typesdisabledon<rechat-filter-property-type>disable_filter_advanceddisabledon<rechat-filter-advanced>disable_filter_loading_indicatordisabledon<rechat-filter-loading><rechat-map>The MapLibre + OpenFreeMap map.
preset"liberty"liberty,bright,positron,darkstyle_urlpreset)zoom"10"default_center"lat, lng"initial map center (does not affect the search filter - only the camera)<rechat-map-filter>The all-in-one filter bar. Most filter values live on the parent
<rechat-listings>; the four search-related attrs live here because they only take effect when a search UI is mounted.addressboundary_state"TX")boundary_country"US")suggestions_limit"5"Sub-filter visibility is controlled via the
disable_filter_*flags on<rechat-listings>(deprecated) or by composing individual<rechat-filter-*>tags withdisabled="true".Individual filter tags
Use these when composing filters one-by-one instead of
<rechat-map-filter>. Each carries only its local UI flag, except<rechat-filter-search>, which also accepts the four search-config attrs.<rechat-filter-search>disabled,address,boundary_state,boundary_country,suggestions_limit<rechat-filter-property-type>disabled<rechat-filter-price>disabled<rechat-filter-beds>disabled<rechat-filter-baths>disabled<rechat-filter-advanced>disabled<rechat-filter-reset><rechat-filter-loading>disableddisabled="true"hides the control without removing it from the DOM; the underlying filter state (seeded by<rechat-listings>) still applies.<rechat-listings-sort>value"-price"-prefix = descending.<rechat-listings-pagination>limit"20"offset"0"<rechat-listing-card>idlistingskeleton"false"compact"false"hyperlink_href{id}placeholder for the whole cardhyperlink_target"_blank")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
The SDK exposes its visual surface as CSS custom properties. You can restyle individual values in place, or activate a complete named theme via the
data-themeHTML attribute. Either approach is pure CSS - nothing to register from JavaScript.Named themes via
data-themeThe SDK ships two themes:
rechat:root.compact0.8), sharper corners, tighter spacing.Activate one by setting
data-themeon<rechat-root>(or any ancestor such as<body>- CSS custom properties inherit through Shadow DOM):Authoring your own theme
A brokerage adds a custom theme by writing one CSS block on their site - no SDK build step:
Only the variables you redeclare differ from the
rechatdefaults; every other token inherits.Overriding individual variables
To tweak a few values without declaring a named theme, set them on
:root(or any ancestor of<rechat-root>):The reference tables below list every variable, its default, and what it controls.
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#008b46--rechat-theme-status-pending#e78700--rechat-theme-status-sold#e33104--rechat-theme-status-leased#64B5F6--rechat-theme-status-other#8e8e8eMap
--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)