# 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.

```tsx
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](https://sonor.dev/re-site-kit/cards#brokerage-credit).                                                                |
| schema.org markup        | `ListingSchema` names the listing office as the listing's `provider`.                                                                                                                                                                              |
| AI assistants            | The [MCP tools](https://sonor.dev/re-site-kit/mcp) 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

```tsx
<IdxAttribution listing={listing} />
```

Renders, for example:

```text
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:

```tsx
<IdxAttribution listing={listing} prefix="Listing provided courtesy of" />
```

To show the time where your office is, pass its zone:

```tsx
<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](https://sonor.dev/re-site-kit/mcp#options).
