Last updated: August 19, 2026
You create an MLS website by lining up three things: a WordPress install, a listing feed your brokerage is approved to receive over the RESO Web API, and a plugin that turns that feed into property records. On this site the plugin is MLS Import, and it checks the feed hourly, updating price, status, photos and text on anything that changed. The listings live in your own database on your own domain, each one a real WordPress page with its own URL, feeding search and filter pages you control. Here’s the part that surprises most first-time builders: none of this starts in WordPress. It starts with an application to your MLS, filed by a participating broker, and the feed gets issued in that broker’s name. Until the approval lands, the technical work has nothing to connect to. So get the paperwork moving first, then build.
The Build Checklist, on One Page
Nine steps, in the order they have to happen. Steps one and two are paperwork, and they gate everything below them.
| Step | What done looks like | |
|---|---|---|
| 1 | MLS approval | A participating broker has filed the MLS and IDX application, and the board has acted on it. NAR gives the MLS five business days to act on the request. The approval is issued in the broker’s name, not the agent’s. |
| 2 | Feed credentials | The board or its gateway has issued the RESO Web API credentials, and the licensee holds them. Nothing technical can start before this. |
| 3 | WordPress | A WordPress install on hosting sized for the listing and image volume you expect, not for a brochure site. |
| 4 | Plugin | The import plugin installed, credentials entered, and the connection test passing before a single listing is imported. |
| 5 | Mapping | MLS fields matched to the fields your theme uses, then a small test import checked for prices, photos and status. |
| 6 | Search templates | Search form, filters and results pages built from your theme, with result pages that have their own URLs. |
| 7 | Sync | A real server cron running the update on a schedule. NAR, ARMLS and Stellar MLS all set a 12 hour refresh floor for IDX displays; an hourly cycle sits well inside it. |
| 8 | Compliance | Attribution, permitted statuses, sold data and any registration rule matched to your board’s written rules. Compensation may be published for your own brokerage’s listings on your own IDX site, but not on a shared multi broker platform. |
| 9 | Launch QA | A listing page opened on a phone, a filtered search URL shared and reopened, a test enquiry submitted and received, and a listing with no coordinates confirmed still visible in list results. |
Key Takeaways
- A participating broker applies for MLS and IDX access, not the individual agent, and NAR gives the MLS five business days to act on the request.
- MLS data reaches WordPress over the RESO Web API, an OAuth2-secured OData feed standardized by Data Dictionary 2.0, which RESO dates to October 23, 2023.
- NAR, ARMLS and Stellar MLS all set the same 12-hour refresh floor for IDX displays; MLS Import runs its update cycle hourly, well inside that floor.
- A broker may publish compensation for their own brokerage’s listings on their own IDX site (NAR Settlement FAQ Q53), but not on a shared multi-broker platform (Q54).
What an MLS-powered site actually does once it is live
Strip away the design talk and an MLS website is a database of property posts that keeps itself current. Every imported listing is a real WordPress post: your permalink, your domain, your templates. No iframe, no vendor subdomain sitting between you and your own content.
The values arrive with RESO Data Dictionary names attached, so a listing carries StandardStatus, PropertyType, PropertySubType and ListPrice whether the feed came out of Phoenix or Orlando. That is what makes filters behave the same way from one board to the next. RESO publishes the query patterns the API uses: its own examples ask for records where PropertyType equals Residential and the bedroom count sits inside a range. Your visitor-facing search does that same job against the imported posts.
The upkeep is not yours. When a price drops or a listing goes pending, the next sync pass writes the change into the post. Nobody re-publishes anything by hand.
What you need before any of this works
Assume you have nothing yet. Here is the checklist, in the order it bites.
A participating broker. NAR’s participation policy is specific: participants must be REALTORS who are “a principal, partner, corporate officer, or branch office manager acting on behalf of a principal,” holding a current, valid real estate broker’s license. If you are an agent, the application goes through your broker.
The feed, issued to the brokerage. RESO Web API access is granted to a real estate business, not to a plugin or an MLS website. Whatever software you point at it, you are using your broker’s credential.
WordPress and the plugin. MLS Import is our own plugin, and it is the tool this walkthrough connects, so take that as the disclosure. It works with any WordPress theme, and our page on requirements before you buy covers the server side.
One limit to plan around early: one MLS connection per site or plugin setup. Two different MLS feeds means two separate WordPress installs.
Hosting sized for the job. Property search leans on postmeta, and every meta condition you filter on adds another JOIN. Imports need a real system cron: WordPress’s own Plugin Handbook says WP-Cron fires only when a page loads, which is not a schedule.
How do you connect an MLS feed to a WordPress site, step by step?
Eight steps, in this order. The first two happen outside WordPress, and jumping ahead to the fun part is how builds stall.
- Get MLS approval. Your broker applies to the MLS for feed access.
- Collect the credentials. Endpoint, client ID, client secret.
- Connect the plugin. Authenticate WordPress against the feed.
- Map the fields. Match feed fields to your property records.
- Run a test import. Pull one small filtered slice first.
- Schedule the sync. Set the update cycle and let it run.
- Build the search pages. Filter on the standardized fields.
- Check compliance. Refresh cadence, attribution, removals.
Step 1: Get MLS approval
Assume nothing exists yet, because this step runs before any WordPress work. The application goes to your MLS, filed by a participating broker. NAR’s IDX policy puts a clock on the MLS: requests for IDX feeds “must be acted on by the MLS within five (5) business days from receipt,” unless it needs to review your qualification or how the data will be used, in which case it issues an estimated approval date instead. That is a ceiling on the MLS’s response time, not a promise you will be pulling data by Friday.
Step 2: Collect the credentials
Approval came through, and your brokerage now holds an authorization to a feed. What arrives is an endpoint, a client ID and a client secret. The RESO Web API uses the OAuth2 client credentials flow: your client posts those values to the authorization server with the grant type set to client_credentials, gets back a time-limited Bearer token, and sends it on every request afterwards. NorthstarMLS documents that exchange publicly in its RESO Web API documentation, including the part first-timers miss: the token expires, and something has to fetch a new one.
Step 3: Connect the plugin
You have the endpoint, client ID and client secret in hand. In MLS Import you select your MLS, paste the credentials, and the plugin authenticates against the RESO Web API feed.
One structural decision is baked in: you are importing listings into your own database as real posts, not embedding a hosted IDX widget that renders someone else’s page inside yours. Templates, search and SEO all follow from that. For the mechanics underneath, we go deeper on MLS and IDX integration in WordPress.
Step 4: Map the fields
Once the plugin is authenticating and pulling field data, the RESO Data Dictionary standardizes names and values, so StandardStatus is limited to a defined set (Active, Pending, Closed, Withdrawn and the rest) that, as Constellation Data Labs puts it, means the same thing in every RESO-certified system. But MLSs keep their own local MlsStatus values alongside it. “RESO certified” means the surprises are bounded, not gone. Ask which tier your MLS holds: RESO’s certification page separates Certified Current, Passed Current and Certified Legacy. Map the attribution fields here too: CRMLS Rule 19.2 separates the Listing Broker who entered the listing from the Advertising Broker displaying it.
Step 5: Run a test import
With fields mapped, do not pull the whole board first. Scope it: request only records where StandardStatus equals Active, add a top parameter to cap how many come back, and look hard at what lands. The checks are dull and they matter: are prices in the price field, do photos resolve, did the status values map as expected. Fix the mapping now, not after a full run.
Step 6: Schedule the sync
The test import proved your mapping. Now set the cadence. NAR’s IDX policy, ARMLS Rule 23.2.5 and Stellar MLS Article 19.11 land on the same floor: refresh downloads and IDX displays at least once every 12 hours.
That is the minimum you are permitted, not a number to advertise. MLS Import runs hourly synchronization by default, so price, status, description and photo changes land within the hour and the floor stops being something you think about.
Step 7: Build the search pages
With listings importing on a schedule, your MLS site needs a way in. Because listings are ordinary WordPress posts carrying standardized fields, search and filter pages get built like any archive: status, price band, property type, bedrooms, location. Map pins work when the feed carries latitude and longitude, and the maps are OpenStreetMap. Build the two or three pages your agents will actually link to before you build twenty that nobody visits.
Step 8: Check compliance
Listings are live and publicly searchable now, so MLS display rules apply to you, not a vendor. Three checks, in launch week: confirm the refresh cycle is genuinely running, confirm every listing shows its listing broker attribution in the required size and color, and confirm that listings pulled from the MLS disappear from your MLS website instead of lingering as orphan pages. The numbers behind those checks are in the next section.
Where the listings render: a real estate theme or Standalone
People shop for an MLS WordPress theme as though the theme is what pulls the data. It isn’t. MLS Import runs in Standalone mode with any WordPress theme, building the property templates and search itself. You do not have to buy a real estate theme to build an MLS website with WordPress.
What a real estate theme buys you is depth, not permission. WP Residence is one of four themes with deeper integration, and its Theme Options screen turns the single property page into a settings choice: the screenshot below shows seven ready-made layouts, plus a hero media header control for what sits at the top.
The same themes ship page builder widgets. In Elementor you drop a properties list widget onto a page, set the top bar filters, and the grid renders your MLS website’s listings with the theme’s styling already applied.
📌 Pro Tip: decide this before the first import, not after. Changing themes once listings are live means re-checking every property template and every search page you built on top of them.
What the finished MLS website gives a visitor
Someone lands on the homepage and gets a search bar, not a redirect to a portal. Category, location, bedrooms: the choices they make run against the standardized fields your feed delivered, and the results are the listings your broker is licensed to show, rendered by your theme, on your domain.
Every property has its own page and its own URL. An agent can text that link, Google can index it, and you can point a neighborhood post at it. A hosted widget page cannot do any of the three, which is the reason to create a real estate website with MLS listings imported rather than embedded.
Sold listings can stay on your MLS website where your MLS’s display rules allow it, which gives a market report page something real to work with. What a visitor never sees is the private side of the feed: fields you flag as private stay off the front end entirely.
What it costs
Two line items, and they are not the same one.
MLS Import is $49 a month, or $504 a year on the annual term, after a 30-day free trial. One plan. There is no Pro tier, no brokerage tier and no separate charge for a historical backfill, because none of those products exist.
MLS access is the other line, and we cannot quote it for you: data and IDX fees are set by your local MLS or board and they vary by market. Ask your MLS for its current fee schedule in the same email as the IDX application, and you will have both numbers in front of you before you commit to an MLS website build.
Display rules you have to honor
Publishing a feed makes you subject to your MLS’s display rules, which are written down. Three bite first.
- Refresh frequency. NAR’s IDX policy requires participants to refresh downloads and the displays fed by them “not less frequently than every 12 hours.” ARMLS Rule 23.2.5 says the same in its own words (armls.com/docs/armls-rules-regulations.pdf.pdf), as does Stellar MLS Article 19.11.
- Attribution formatting. Under CRMLS Rule 19.2.5, attribution font must be no smaller and no lighter in color than the property description, and it has to clearly label the Listing Broker, Listing Office or Listing Agent. “Courtesy of” is named as unacceptable (kb.crmls.org/knowledgebase/idx-and-listing-credit-faqs/).
- Compensation. NAR’s settlement FAQs permit a broker to augment their feed with offers of compensation for listings of their own brokerage (Q53), and prohibit using MLS data to build a platform of compensation offers from multiple brokers (Q54).
Rule numbers differ by board, so read your own MLS’s display section before launch, not after a compliance email.
Frequently Asked Questions
Who can apply for MLS access for a website?
The participating broker applies, not the individual agent. NAR limits participation to REALTORS who are a principal, partner, corporate officer, or branch office manager acting on behalf of a principal, with a valid broker’s license. MLS Import connects your MLS website to that access.
How long does MLS approval take?
NAR’s IDX policy gives the MLS five business days to act on a feed request. That is a ceiling on the MLS’s response, not a promise you are feed-ready that week. File the application before you install MLS Import.
How often do MLS listings need to refresh on a website?
At least once every 12 hours. NAR’s IDX policy, ARMLS Rule 23.2.5 and Stellar MLS Article 19.11 each set that floor for IDX displays. MLS Import checks the feed hourly, so changes land well inside the requirement.
Can compensation information appear on an IDX website?
Yes, narrowly. NAR Settlement FAQ Q53 lets a broker publish offers of compensation for listings of their own brokerage on their own IDX or VOW site. Q54 bars a multi-broker compensation platform built from MLS data. MLS Import imports what your feed provides; display follows your MLS’s rules.
What is the RESO Web API?
It is the standardized way an MLS hands listing data to outside software: an OData interface over HTTPS, secured with OAuth2, with field names set by the RESO Data Dictionary. Version 2.0 is current for certification, and WAV Group’s Victor Lund reported that every MLS had to certify against it by April 2025. MLS Import connects to that feed.
How much does MLS access cost?
That depends on your MLS or board, which sets its own data and IDX fees, so there is no single national figure. The software side is fixed: MLS Import is $49 a month or $504 a year, after a 30-day free trial.
Get started today: email your MLS and ask for two things, the IDX application and the current fee schedule. Everything else waits on that one email. Leave a comment if this page missed something and we will fix it.



