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 |
save-search |
"true" |
Set to "false" to turn off the Save search flow (the button, its sign-in and save dialogs, and Log out) on portal sites. See Sign-in & Saved Searches. |
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. |
<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.
| Attribute | Default | Description |
|---|---|---|
listings |
- | JSON string of pre-hydrated IListing[] for SSR-style hydration |
disabled |
"false" |
Suspend all listing fetches. When the widget contains a <rechat-property-search-form> and listing_hyperlink_href is set, fetching is suspended automatically (the form hands the search to another page, so nothing on this one needs listings); set disabled="false" to keep loading. |
disclaimer |
"auto" |
How the MLS-required legal copy for the listings on screen is shown. auto shows it as full text when the widget contains a filter component (<rechat-map-filter> or any <rechat-filter-*> tag) and hides it for a listings-only widget. full renders the text inline, modal renders an "MLS Disclaimer" text link that opens the text in a modal, off hides it everywhere, the details modal included. An explicit value always overrides the automatic choice. See <rechat-listings-disclaimer>. |
filter_brand_ids |
- | Comma-separated brand UUIDs, sent as a brands array. A listing matches when it belongs to any one of them. |
filter_brand_id |
- | Single brand to scope listings to. Superseded by filter_brand_ids; still supported, and behaves exactly like a one-entry filter_brand_ids. |
filter_search_limit |
- | Maximum total listings the search may return |
| 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_limitno 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.
| Attribute | Default | Description |
|---|---|---|
filter_listing_statuses |
the Active group | Comma-separated statuses (Active, Sold, Pending, Leased, …). Omitting it selects Active, Coming Soon, Incoming, the three statuses the More filters Active switch controls. Switching every status off brings Active back, so a search always has a status; set the attribute to "" to allow none. The More filters badge counts the statuses as one change, however many switches were flipped. |
filter_property_types |
all | Comma-separated property types |
filter_keywords |
- | Free-text description match, sent as content. Same field as the Keywords input at the bottom of More filters. |
disable_filter_keywords |
"false" |
Hide the Keywords input. This is the supported way to switch the field off. |
filter_property_subtypes |
- | Comma-separated subtypes |
filter_architectural_styles |
- | Comma-separated styles |
filter_list_agents |
- | Comma-separated agent MUIs (listing-side only) |
filter_list_offices |
- | Comma-separated office IDs |
filter_agents |
- | Comma-separated agent MUIs (any role) |
filter_mlses |
- | 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) |
| 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 |
| 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. |
Deprecated. These flags continue to work but emit a one-time
console.warnper attribute. They will be removed in a future release. Move each one to the matching individual<rechat-filter-*>tag'sdisabledattribute.
| 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".
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.
| Tag | Attributes |
|---|---|
<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> |
disabled |
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_byon<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_offseton<rechat-listings>.
In a layout without a visible
<rechat-map>the SDK places its own<rechat-listings-disclaimer>element right after this tag. The two are independent: hiding or restyling the pagination does not move or hide the disclaimers. See<rechat-listings-disclaimer>.
<rechat-listings-disclaimer>Optional. The MLS-required legal copy is shown automatically, so most embeds never need this tag. What renders is one block per distinct MLS disclaimer among the listings on screen. Records that differ only by id, such as SEF and SEF_OLD, collapse into one block. Each block is the MLS template with the variables mlsName, currentYear and lastUpdated filled in, where lastUpdated is the current time rounded down to the previous 15 minutes.
Whether the copy shows depends on the disclaimer attribute of <rechat-listings>. With the default auto, a search widget (one with a filter bar or any <rechat-filter-*> tag) shows the full text and a listings-only widget shows nothing. Set disclaimer="full" or disclaimer="modal" to show it regardless, or disclaimer="off" to hide it regardless.
Where it appears by default:
| Layout | Position |
|---|---|
Map and list (<rechat-map> present and visible) |
At the end of the scrolling results, after the last card |
| List only (no map, or the map hidden with CSS) | In its own <rechat-listings-disclaimer data-rechat-auto> element, which the SDK places right after <rechat-listings-pagination>, or right after the results when there is no pagination, on its own row of the shell |
| Details modal | A footer with the disclaimer, the availability notice and the MLS copyright line |
The element and the pagination are independent. Hiding, restyling or removing the pagination does not move or hide the disclaimers, and paging never duplicates them.
To choose the position yourself, place <rechat-listings-disclaimer></rechat-listings-disclaimer> anywhere inside <rechat-listings>. The SDK then adds no element of its own and the automatic positions stay empty, so the copy renders exactly once. The disclaimer attribute applies to a manually placed element as well, so a listings-only embed still needs disclaimer="full" or disclaimer="modal" for it to show.
The text is 10px by default. Override it with --rechat-mls-disclaimer-font-size on <rechat-root> or any ancestor.
<rechat-listing-card>Every card size shows the listing provider (MLS) source at the right of the price: the MLS logo when the feed ships one (mls_info.logo), otherwise a database glyph followed by the MLS display name. The map popup card shows it too, with a smaller logo. For a pin on the current page the popup renders the compact listing already in the store, mls_info included, with no extra request. Only a pin outside the page is fetched by id.
| 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 vialisting_hyperlink_href/listing_hyperlink_targeton<rechat-listings>.
<rechat-agents>Agent roster context, placed directly inside <rechat-root>. See Agents.
| Attribute | Default | Description |
|---|---|---|
q |
- | Initial roster filter (name, email, or MLS id) |
limit |
"20" |
Agents per page |
agents |
- | JSON string of pre-hydrated agents |
<rechat-agents-search> takes placeholder (default "Search agents…").
<rechat-agents-count>, <rechat-agents-grid> and <rechat-agents-pagination> take
no attributes.
<rechat-agent>| Attribute | Default | Description |
|---|---|---|
id |
- | Roster member user id (required) |
<rechat-testimonials>Self-contained testimonials list, placed directly inside <rechat-root>. See
Testimonials.
| Attribute | Default | Description |
|---|---|---|
limit |
"20" |
Testimonials fetched per page. Values below 1 or non-numeric fall back to the default |
load_more |
"true" |
Set "false" to hide the "Load more" button and show the first page only |
empty |
"show" |
With no testimonials to list: "show" renders the built-in empty message, "hide" removes the element from the page. A <template rechat-state="empty"> child overrides both. See Testimonials → Empty state |
empty_message |
"No testimonials yet" |
Text of the built-in empty message |