IDX compliance
When your site shows listings from other brokerages, the MLS attaches display rules. This page covers what those rules usually ask for, what the kit already does about them, and IdxAttribution, the component that puts the courtesy line and data timestamp on a listing page.
import { IdxAttribution } from '@sonordev/re-site-kit'What is IDX compliance?
IDX (Internet Data Exchange) is how a brokerage gets to show other brokerages' MLS listings on its own website. Each MLS writes its own display rules, and they vary, but most ask for the same few things wherever another broker's listing appears:
- Credit the listing brokerage (and often the listing agent): "Listing courtesy of Example Realty."
- Show how fresh the data is: when the listing information was last updated.
- Carry the MLS's disclaimer, in the MLS's own words.
- Show only the statuses the MLS allows. Sold data in particular is often restricted.
The kit gives you the pieces. It isn't legal advice, and it can't know your MLS's exact wording, so confirm the specific rules with each MLS you display.
What the kit already does
| Where | What you get |
|---|---|
| Listing pages | IdxAttribution shows the courtesy line and the "MLS data last updated" timestamp. ListingDetail also ends with "Listed by …" and a link to the original listing. |
| Search results and grids | ListingCard names the listing brokerage ("Courtesy of …") by default, and ListingGrid always does. See Cards and grids. |
| schema.org markup | ListingSchema names the listing office as the listing's provider. |
| AI assistants | The MCP tools return the listing brokerage with every listing, pass your disclaimers along, and tell the assistant to include both. Search is limited to active and pending listings unless you allow more. |
| Photos | Photos are hotlinked from the MLS's image host, never copied. |
| Agent contact details | The MCP tools never return the listing agent's email or phone. |
What you still add yourself: your MLS's disclaimer text on listing pages (most sites put it at the foot of every page that shows listings), and any logo or icon your MLS requires.
IdxAttribution
<IdxAttribution listing={listing} />Renders, for example:
Listing courtesy of Example Realty, Pat Agent
MLS data last updated Oct 3, 2026, 10:15 AM EDT| Prop | Type | Default | What it does |
|---|---|---|---|
listing | RealEstateListing | The listing. Required. | |
prefix | string | "Listing courtesy of" | The words before the brokerage and agent. |
showTimestamp | boolean | true | Show the "MLS data last updated" line. |
dataUpdatedAt | string | null | the listing's updated_at | The timestamp to show, when you have a better one (for example, your feed's last sync time). |
timeZone | string | "America/New_York" | The IANA time zone the timestamp is shown in, e.g. America/Chicago. |
className | string | Added next to re-idx-attribution. |
How it decides what to show:
- The courtesy line lists the listing office, then the listing agent, whichever the listing has, separated by a comma.
- The timestamp is formatted like "Oct 3, 2026, 10:15 AM EDT", in US Eastern time unless you pass
timeZone. A zone the server's runtime doesn't recognize falls back to US Eastern, and an invalid date is skipped. - When there's nothing to show, it renders nothing: no brokerage or agent, and either no valid timestamp or
showTimestamp={false}.
Keep it visible on every listing page, near the listing details. It's small by default (a smaller font and some transparency); restyle it with the re-idx-attribution, re-idx-attribution__courtesy and re-idx-attribution__updated classes, but don't hide it.
To match your MLS's wording, change the prefix:
<IdxAttribution listing={listing} prefix="Listing provided courtesy of" />To show the time where your office is, pass its zone:
<IdxAttribution listing={listing} timeZone="America/Denver" />Sold listings
Leave status out of searchListings and you get active listings. Showing sold listings is a choice you make on purpose, and only where your MLS allows sold data in IDX displays or the listings really are your brokerage's own. A copy of another brokerage's feed that was imported by hand doesn't count as your own, even if it's stored as a manual listing. The same rule applies to the statuses option of the MCP tools.