Case study

IDX by Ulric: a licensed platform

A licensed listing feed, kept faithful and kept legal, and the screen that shows whether it is. RESO Web API in, a searchable catalogue and 69 crawlable hub pages out, with the rules enforced in code rather than remembered.

ClientRose Real Estate
Year2026
ScopeIDX integration · Compliance engineering · Programmatic SEO · Product
Livelaurenroserealty.com ↗
IDX by Ulric: a licensed platform
76,524listings kept in sync: for sale, pending and closed
69crawlable hub pages in the sitemap
Reviewedby RMLS before go-live

A brokerage site can show every home for sale in its territory, not just its own listings. That permission is called IDX, and it arrives with a rulebook: what may be stored, what must be shown, how often it has to refresh, whose name goes on which card, and what happens on the day the agreement ends. Get it wrong and the feed is switched off.

So the interesting part of this build was never the listings. It was writing the rulebook down as code.

One path from the feed to a row

The reader speaks RESO Web API: a bearer token, OData paging, 250 rows to a page. Every record goes through a single mapping function that carries an allow list and a deny list drawn line by line from the board's own field document. A field that may not be stored is refused at the door, and the sync aborts if one ever appears in a payload that did not have it yesterday. A full pass finishes in 60 pages. Covers are stored at sync; the rest of a listing's photographs arrive the first time somebody opens it, because storing every photograph of every listing is tens of gigabytes nobody looks at.

The rules, numbered, next to the code

Compliance lives in a register beside the module: each obligation numbered, cited to the rule that creates it, and pointed at the function that satisfies it. The brokerage badge above the fold. The required statements on every page carrying listing data. Withheld addresses absent from the page, the map and the stored payload alike. A seller's opt-out switching a feature off for that listing, where a blank counts as a no rather than a yes. The monthly report filed in the first week of the month. The end of the agreement handled too: rows, files, derivatives and the cursor purged on request, with a receipt of the counts.

Pages, not a search box

A search box with a query string after it is not a page a search engine can rank. Every city, ZIP and price ceiling in the territory becomes a page of its own, alongside open houses, new this week, and recently closed: 69 crawlable URLs in the sitemap, each returning a 404 rather than a thin page when its cut is empty. The search itself never dead-ends. When a filter combination returns nothing, the page names the filter responsible and counts what relaxing each one would return.

The assistant, deliberately limited

Visitors ask for things in words, so the site parses the words into a search. That is the whole job. Listing rows are rendered by the application and never sent to a model, and never added to a retrieval index, because the agreement does not permit it. The limit is the feature: the convenience arrives without the feed leaving the licensed host.

What it looks like running

The catalogue carries 22,397 homes for sale, 5,810 pending and 48,317 recently closed, each figure counted off the rows the sync last wrote rather than typed into a template. Based on information from the RMLS for the period September 25, 2015 through August 28, 2026.

The hub pages are the part worth clicking. Each one writes its own copy from the rows it holds: how many homes, the middle asking price, which bedroom count is most common. That is why they are pages rather than a search box with a query string, and it is why they can rank at all. See it running.

Built to the RMLS Rules and Regulations, and reviewed by RMLS before go-live. It now runs as Wren, the studio's third product line.

The catalogue: 22,397 for sale, 5,810 pending, 48,317 recently sold, each count live off the feed
The catalogue: 22,397 for sale, 5,810 pending, 48,317 recently sold, each count live off the feed
A hub page writes its own copy from the rows it holds: the count, the middle asking price, the most common bedroom count, and the period notice the rules require
A hub page writes its own copy from the rows it holds: the count, the middle asking price, the most common bedroom count, and the period notice the rules require
Recently closed, on the same facets and the same notices as everything else
Recently closed, on the same facets and the same notices as everything else

← All work