Description
AeroIDX turns your real estate (IDX) listings into real WordPress pages that load fast and are built to rank. Every property gets a clean, readable URL, and its SEO markup is written on the server, so search engines can crawl and index a listing as soon as it goes up.
Most IDX widgets draw their listings with JavaScript in the browser, which leaves the page’s HTML nearly empty for search engines. AeroIDX does the opposite. It writes the title, meta description, Open Graph and Twitter Card tags, the canonical link, and the structured data straight into the server response.
Key features
- Clean listing URLs. Every property is served at
/details/{address-slug}/{listing-id}. - Server-side SEO tags. The
<title>, meta description, Open Graph, and Twitter Card tags render on the server for every listing. - Schema.org structured data. Each listing outputs
RealEstateListingJSON-LD, so it can qualify for rich results in Google. - Works with your SEO plugin. When Yoast SEO or Rank Math is active, AeroIDX hands them the listing data. With no SEO plugin, it outputs the tags itself.
- XML sitemap. A dedicated sitemap lists every property so search engines can find them all.
- Canonical URLs and legacy redirects. Old
/details?id=...links 301-redirect to the canonical URL, so you keep the SEO equity. - Classic and block themes. Works with both classic themes and block (FSE) themes.
- Clean handling of removed listings. A delisted property returns a proper HTTP 410 (Gone) page instead of a broken link.
- Market pages. Give a saved market its own WordPress page and write your own content around its listings, or drop a market into an existing page with a shortcode.
Admin-screen icons are from the Lucide icon set, licensed under ISC (GPL-compatible).
External Services
AeroIDX is the WordPress front end for the AeroIDX platform and requires an active AeroIDX account and API key to function. Sign up at https://aeroidx.com/plans.
The plugin communicates with the AeroIDX service (default https://app.aeroidx.com, configurable) in the following ways:
- Listing pages (server-side): when a listing page is requested, WordPress calls the AeroIDX API to fetch that listing’s data. Only the requested listing identifier is sent.
- XML sitemap (server-side, background): a scheduled WP-Cron job periodically fetches the full listings index from the AeroIDX API to (re)generate the sitemap.
- API key validation & account info (server-side): when you save your API key or open the AeroIDX admin screens, the plugin calls the API to validate the key and read your plan.
- Page / site sync (server-side): creating an IDX page or connecting your site sends your site’s home URL to AeroIDX so it can configure deep links back to your site.
- Widget library (server-side): the Widgets screen lists the widgets saved on your AeroIDX account, and its duplicate and delete actions ask the API to duplicate or delete the widget you picked. Only that widget’s identifier is sent, and only you, as a signed-in administrator, can trigger it.
- Markets list (server-side): the Markets screen lists the markets saved on your AeroIDX account so you can create a page for one, and a page that shows a market asks the API for that market’s name. Only your own account’s markets are returned.
- Widget script (browser-side): the interactive listing widget loads its script (default https://app.aeroidx.com/components.js) from the AeroIDX asset host and requests listing data from the AeroIDX API.
- Widget builder (admin browser): when you build or edit a widget from the plugin’s Widgets screen, the plugin mints a single-use sign-on token server-side and opens the AeroIDX builder in a new browser tab on the AeroIDX host, where you configure and save the widget. Only you, as a signed-in administrator, trigger this, and it sends no data about your site’s visitors.
Every server-side request includes your site URL (via WordPress’ home_url()) in the HTTP User-Agent header so AeroIDX can associate the request with your account. These server-side requests send only the requested listing identifier (or the listings index for the sitemap), never your visitors’ personal data.
The browser-side widget is different: like any embedded third-party script (for example an embedded map or video), it loads directly from the AeroIDX asset host, so when it loads a visitor’s browser exposes its IP address and User-Agent to AeroIDX. If you display the widget, disclose this in your own site’s privacy policy as you would for any third-party embed.
By using this plugin you agree to the AeroIDX Terms of Service and Privacy Policy:
- Terms of Service: https://app.aeroidx.com/legal/agreements
- Privacy Policy: https://app.aeroidx.com/legal/privacy
Privacy Policy
AeroIDX does not collect or store any personal data about your site’s visitors on your WordPress site, and it sets no cookies.
Server-side requests this plugin makes to the AeroIDX service (https://app.aeroidx.com by default) carry only your site URL (in the User-Agent header) and the identifier of the listing being rendered, never visitor data.
If you display the AeroIDX widget, its script is loaded in the visitor’s browser directly from the AeroIDX asset host. As with any embedded third-party script (such as an embedded map or video), the visitor’s browser thereby exposes its IP address and User-Agent to AeroIDX when the widget loads. This happens only on pages where you place the widget. If you use the widget, you should disclose this in your own site’s privacy policy.
Data handling by the AeroIDX service is governed by the AeroIDX Privacy Policy: https://app.aeroidx.com/legal/privacy
Bundled Assets
The admin screens use the Poppins typeface, which ships inside the plugin and is served from your own site. No font is ever requested from an external host, so no visitor or administrator IP is exposed to a font CDN.
- Poppins — Copyright 2014-2019 Indian Type Foundry. Licensed under the SIL Open Font License 1.1, a GPL-compatible licence. Full text:
assets/fonts/Poppins-OFL.txt. Source: https://github.com/itfoundry/Poppins
Screenshots









Blocks
This plugin provides 1 block.
- AeroIDX Page Renders an AeroIDX IDX page screen (Search, Sign In, My Account, etc.)
Installation
- Upload the plugin folder to
/wp-content/plugins/, or install the plugin ZIP via Plugins Add New Upload Plugin. - Activate the plugin through the Plugins screen in WordPress.
- Make sure pretty permalinks are enabled (Settings Permalinks, any option other than “Plain”). AeroIDX needs them to serve clean listing URLs.
- Open the AeroIDX menu in the WordPress admin sidebar.
- Enter the API Key from your AeroIDX account and save.
Your listings will then be available at /details/{address-slug}/{listing-id}.
FAQ
-
Do I need an AeroIDX account?
-
Yes. AeroIDX is the WordPress front end for the AeroIDX platform. You need an active account and an API key. Get one at https://app.aeroidx.com/api-keys.
-
Does it work with Yoast SEO or Rank Math?
-
Yes. AeroIDX detects Yoast SEO and Rank Math and feeds them the listing data so they generate the meta tags. If no SEO plugin is active, AeroIDX outputs the SEO tags itself.
-
Do I have to use pretty permalinks?
-
Yes. AeroIDX serves listings at clean URLs, which requires the WordPress permalink setting to be anything other than “Plain”.
-
Does it work with block (FSE) themes?
-
Yes. AeroIDX supports both classic themes and block themes. The listing widget is injected into the theme’s content area in either case.
-
Where do listing pages appear?
-
Every listing is rendered at
/details/{address-slug}/{listing-id}on your site. AeroIDX also generates an XML sitemap so search engines can find them all. -
What happens to a listing that is sold or removed?
-
AeroIDX returns a proper HTTP 410 (Gone) page for delisted properties, so you don’t accumulate broken links or soft 404s.
-
Listing pages feel slower than the rest of my site. What can I do?
-
A listing page is built from live IDX data, so the very first time anyone opens a particular property the plugin has to ask the AeroIDX API for it. That one lookup is the slow part. Everything after it is served from cache — for a week, and refreshed in the background so visitors never wait on it again.
Two things make that first visit rare:
- Turn on sitemap-based preloading in your caching plugin. AeroIDX publishes an XML sitemap of your listings at
/aeroidx-sitemap-index.xml. WP Rocket (“Preload” > “Activate sitemap-based cache preloading”), LiteSpeed Cache (its crawler) and most host-level page caches can walk it and request each page ahead of your visitors. That warms the page cache and the plugin’s own cache in one pass, and it costs you nothing but a checkbox. - Use a persistent object cache (Redis or Memcached) if your host offers one. Without it WordPress keeps cached listings in the database, which works but is slower to read.
If a listing page is ever slow anyway, it still renders: the property widget loads in the browser exactly as it would with the embed snippet, so nobody sees a broken page while the data is on its way.
- Turn on sitemap-based preloading in your caching plugin. AeroIDX publishes an XML sitemap of your listings at
-
How do I style listing pages to match my theme?
-
AeroIDX listing pages aren’t editable in the WordPress editor. They’re rendered on demand from your IDX data. To style them, use the scoped CSS hooks the plugin exposes from your theme custom CSS, a page builder custom CSS field (Bricks, Elementor, etc.), or a child theme stylesheet. Your rules only affect AeroIDX pages:
body.aeroidx-page: body class on every page AeroIDX creates for you — Search, Sign In, My Account, Featured, Roster, the /aeroidx shell, and each market page. On the built-in listing and agent pages it comes from the classic templates, so block themes render those two without it.#aeroidx-listing-detail,.aeroidx-listing-detail: main wrapper of the listing detail page. Classic themes only.#aeroidx-agent-detail,.aeroidx-agent-detail: main wrapper of the agent listings page. Classic themes only..aeroidx-widget-mount: direct parent of every AeroIDX widget, on every surface the plugin renders..aeroidx-listing-gone,.aeroidx-agent-gone,.aeroidx-page-gone,.aeroidx-listing-error: the “no longer available” and error states.
The same documentation lives inside the plugin under AeroIDX > Designs in the WordPress admin, where each selector has a copy button and the list adapts to whether your theme is a block theme.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“AeroIDX – Real Estate IDX Search, MLS Listings & Lead Capture” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “AeroIDX – Real Estate IDX Search, MLS Listings & Lead Capture” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
0.11.0
- Fixed: a link from an AeroIDX widget took two redirects to reach its page where one would do. WordPress was adding a trailing slash of its own first, and only then did the plugin send the visitor on to the real address. The plugin now goes first, so those links arrive in one redirect. Market links and roster links were taking the extra step on every site, because the page they start from is one AeroIDX creates for you. Property and agent links took it wherever your site has a page of its own at that address, which is what the AeroIDX setup asks you to create.
- Changed: a property or agent page no longer asks your database for posts it does not use. Both are built by AeroIDX rather than stored in WordPress, but WordPress was still searching your content on every view and discarding the answer. You will notice this in proportion to how much content your site has.
- Fixed: a listing page downloaded its first two photos twice. Once for the copy search engines read, and again for the gallery your visitor actually sees, because the two asked for the same photo at slightly different addresses. That is about 800 KB a page view, fetched while the page was still loading and never shown to anyone. Both now ask for the same photo, so the second one comes straight from the browser’s cache.
- Fixed: a market pointing at something that is not a page, an uploaded image for example, sent your visitors to that file. Clicking the market card ended on the image itself. A market now resolves only to a real page, and when it has none the link falls back to your AeroIDX page, which is what already happened for a market whose page had been deleted.
- Fixed: an agent page told search engines it lived at an address that does not answer. Its canonical link, its Open Graph URL and its structured data all left off the trailing slash your site asks for, so all three pointed at an address WordPress answers with a redirect back to the page itself. They now follow your site’s own setting, as listing pages have since 0.9.0. Reaching an agent page from your roster cost a second redirect for the same reason, and no longer does.
0.10.0
- New: your sitemap now lists every active listing on your MLS, not only the ones you added or featured. It is what the larger IDX platforms publish. Your own listings are still in it, and each address appears once.
- New: while AeroIDX is still gathering a large MLS for the first time, it can answer with only part of your listings. Your existing sitemap is kept when that happens, rather than rebuilt from the partial answer and left missing most of its addresses.
- Note: your sitemap is rebuilt once shortly after this update. Until it finishes, the sitemap address answers as unavailable rather than serving an out-of-date file.
0.9.0
- Fixed: vacant land was published to search engines as a residence, and carried a floor area, a bathroom count and a year built along with it. Land is now described as a place, with its lot size, its property type and its subdivision stated outright.
- Fixed: a listing page served no heading, no property description and no photo in its HTML, so a search engine that does not run JavaScript saw an almost empty page. All three are now written into the server response, underneath the widget and out of sight for a visitor.
- Fixed: the structured data put the listing’s marketing headline where the street address belongs, and left out the city, the state and the country. Those fields now come from the address itself, and the street is left out when the feed has none.
- Fixed: every canonical URL, Open Graph URL and sitemap entry pointed at an address that redirected, because five places built the listing URL their own way. They now share one builder that follows your site’s own trailing-slash setting.
- Fixed: a shortcode written into a listing’s remarks by the feed was executed on your site. The description AeroIDX renders is now handed over after WordPress has finished looking for shortcodes.
- Fixed: where a feed sent a listing’s remarks with line breaks, words on either side of the break were fused together, in the page description and in the structured data alike.
- Fixed: a listing page carried two top-level headings. The one AeroIDX adds for search engines no longer competes with your theme’s.
0.8.1
- Fixed: if you saved your API Key while AeroIDX was down, the screen then told you the plugin had not checked the key yet. It had checked it, seconds earlier, and the check had failed. It now says AeroIDX did not answer, and that your key is probably fine.
- Fixed: the Widgets and Markets screens blamed your API Key for anything that went wrong. If the account’s subscription has lapsed they now say so and leave the key alone. If AeroIDX did not answer, they say that instead.
0.8.0
- Fixed: if your agency had applied one of its themes to some of your pages, the Designs screen showed no design selected at all. A design and an agency theme are two layers rather than two choices. The theme covers only the pages it carries a design for, and your own design still drives the rest. Both are shown now, each marked on the pages it actually runs.
- New: the Designs screen lists the themes your agency has published. The ones your agency applied to your site are shown greyed out and name the pages they took over, because those are your agency’s to change rather than yours.
- Fixed: change your design in AeroIDX and the Designs screen went on showing the old one for a few minutes. It re-reads when you open it now.
- Fixed: renaming a page whose design your agency manages said “Settings saved” when AeroIDX had refused the change, so the old address went on being served and nothing said so. The screen now says the change was refused, and says it differently from a connection problem, because a refusal will not go through on a retry.
- Fixed: an account whose subscription had lapsed was told its API Key had been rejected: on the Settings screen, in the setup wizard, and on the plugin’s home screen. Replacing a working key does not restore a subscription. All three now say the subscription is inactive and leave the key where it is.
- Fixed: the home screen said the account was connected whether or not it was.
0.7.0
- New: choose the design your IDX pages use, without leaving WordPress. Classic, Premium and Prestige each show what they look like, the one you are using is marked, and applying another changes your listing, agent and market pages straight away. Any theme your agency has published appears here too.
- New: a question in the FAQ about why a listing page can feel slower than the rest of your site, and the two things that fix it: pointing your caching plugin’s sitemap preloader at the AeroIDX sitemap, and using a persistent object cache if your host offers one.
- Changed: the Appearance screen is called Designs. The CSS selectors it used to be are still on it, folded under the design picker, because most people come to this screen to pick a look rather than to write CSS.
- Changed: property, agent and market pages open faster, and stay fast. The details that fill a page’s title, description and search-engine tags used to be looked up again every few hours, and somebody was always the one waiting for it. They are now kept for a week and refreshed in the background, so a page is slow to open once and never again.
- Changed: when AeroIDX is slow to answer while a page is being built, the plugin waits two seconds instead of five and renders the page anyway. The property, agent or market widget still loads in the browser, so a slow moment upstream costs a couple of seconds rather than a blank screen.
- Fixed: if AeroIDX could not be reached, every visitor paid the full wait, and paid it again on the next page load, for as long as the outage lasted. A failed lookup is now remembered for a minute, so an upstream problem costs one wait a minute instead of one wait per visitor. Saving your API Key clears it at once, so a key you have just fixed is never held back.
- Fixed: a listing that has left the market was served as though nothing had happened. It now answers 410 Gone and shows the “no longer available” page, so search engines drop the address instead of crawling it again. Neither had ever worked, because of how the plugin asked WordPress for the listing id.
0.6.0
- New: saving your API Key now checks it with AeroIDX before storing it. A key with a character missing is refused instead of quietly saved, and the working key you already had stays in place.
- New: the Settings screen says whether AeroIDX is answering, which plan the account is on, and when it last checked.
- New: the Appearance screen adapts to your theme. It lists the selectors that exist on the theme you are actually running, and each one has a copy button.
- New: a “where do I find my key” link on the screens that ask for one, pointing at the page in AeroIDX that issues it.
- New: when another page already sits at the address an IDX page wants, AeroIDX asks what should happen instead of deciding on its own. Use the page that is already there, or put the IDX page at an address of its own.
- New: AeroIDX recognises the pages it set up earlier, even after you rename or move one. It offers to pick that page back up rather than build a second copy of it.
- New: market pages ask the same questions, and every market on the Markets screen shows whether its page already exists, with a button to connect it.
- Changed: changing your API Key now clears the data cached from the previous account. Switching accounts used to leave the old one’s markets and widgets on screen for up to an hour.
- Changed: the setup wizard now uses the same buttons, fields and wording as the rest of the plugin’s screens.
- Changed: the AeroIDX screens use the full width of the page, and the page settings sit in two columns instead of one narrow one.
- Changed: when AeroIDX uses a page you already have, it adds the IDX content below what is on that page. Nothing is removed, and you can rearrange it in the editor.
- Changed: the setup wizard asks the same questions as the Pages screen. Creating every page at once no longer reconnects a page without telling you.
- Fixed: creating an IDX page when another page already sat at its address published a duplicate at /search-2, /featured-2 and so on. AeroIDX stops and asks instead.
- Fixed: AeroIDX did not recognise the pages it had created itself, so deleting an IDX page and setting it up again produced another duplicate every time.
- Fixed: widgets added with the
[aeroidx_widget]shortcode had no element to style, although the plugin’s own documentation said they did. Every AeroIDX widget now sits inside.aeroidx-widget-mount. - Fixed: an API Key that had stopped working removed Team-only pages and lowered the counts on the Home screen without saying why. The plugin now tells you the key was rejected.
- Fixed: the setup wizard said your key had failed when AeroIDX simply could not be reached, sending people to replace a key that was fine.
- Fixed: the admin could take around twenty seconds to load while an API Key was not working.
- Fixed: a copy button that failed to reach your clipboard gave no sign of it, so you could paste something else without noticing.
- Fixed: the styling documentation described where selectors apply. Two of the four descriptions were wrong.
0.5.0
- New: a Markets screen in wp-admin. Give any market on your AeroIDX account its own WordPress page, then edit that page like any other: write about the area, add your own photos, and the market’s listings sit inside it.
- New: an
[aeroidx_market id="..."]shortcode, for dropping a single market into a page you already have. - New: the plugin now creates a page called AeroIDX on your site. Links to a market from your AeroIDX dashboard need it, and until now you had to create that page yourself. If you already made one, the plugin uses it and leaves your content alone.
- Fixed: links to a market from your AeroIDX dashboard, from an alert, or from a Market Areas widget led nowhere on a WordPress site. They now open the right page.
- Fixed: some text on the AeroIDX admin screens was too light to read comfortably, including search box placeholders and the current page number in a list.
- Fixed: buttons on the AeroIDX admin screens kept a blue outline after being clicked, as though they were still selected.
- Fixed: the dropdowns on the AeroIDX admin screens were missing their arrow, so they looked like text fields.
0.4.1
- Fixed: a widget pasted straight into a page, rather than added with the AeroIDX shortcode or block, only worked if the AeroIDX script was also in your site header. Widgets now work on their own, wherever you put them.
- Fixed: listing and search screens pushed the rest of the page down as they finished loading. Space is now held for them from the start, so nothing moves.
- Changed: if you added the AeroIDX script to your site header, you can remove it. The plugin loads what your widgets need by itself, and keeping both no longer loads it twice.
- Performance: that code now starts loading at the top of the page instead of the bottom, so widgets appear sooner.
0.4.0
- New: a Widgets screen in wp-admin. Pick a widget type, build it in the full AeroIDX builder (it opens in a new tab), and get a shortcode ready to paste on any page.
- New: a widget library to manage what you’ve built. Edit, duplicate, or delete a widget, and copy its shortcode with one click.
- New: testimonials widget, a carousel of client testimonials.
0.3.0
- Fixed: creating an IDX page before saving your API Key published a page that visitors saw empty. The plugin now asks for the key first, on every route that could get there.
- New: deleting an IDX page asks you to confirm first. The page goes to the Trash, but AeroIDX stops treating it as that IDX page, and the confirmation says so.
- Design: the admin screens were rebuilt to match AeroIDX, with the same layout and refreshed colour, type and spacing.
- Privacy: the admin now uses a typeface that ships inside the plugin instead of loading one from an outside service, so no administrator IP reaches a font host.
- Maintenance: filtering the widget list with no matches now offers a way back to the full list.
0.2.3
- Fixed: on sites running Yoast SEO or Rank Math, the sitemap index answered with a “page not found” error. Those plugins claim every URL that ends in -sitemap.xml, so the index moved to /aeroidx-sitemap-index.xml. The old address still works wherever it worked before.
- Fixed: robots.txt no longer points search engines at the sitemap until it actually holds listings.
0.2.2
- Clearer, more benefit-focused plugin description and readme copy for real estate agents. No functional changes.
0.2.1
- Internationalization: the text domain now matches the plugin slug, so translations load correctly.
- Performance: sitemap data is no longer autoloaded on every page request.
- Security: hardened URL escaping in Open Graph and Twitter Card meta tags.
- Maintenance: clearer plugin description and installation instructions.
0.2.0
- New: SEO-friendly agent pages at /agent/{name}/{id}: clean URLs with canonical, Open Graph, Twitter Cards, and Person schema.
- New: configurable agent URL base, with 301 redirects from previously used bases so old links keep working.
- New: agent pages integrate with Yoast SEO and Rank Math, feeding agent data through their tags so output stays single-source (no duplicate meta).
- Improved: agent pages now reach full SEO parity with listing detail pages.
0.1.0
- Initial release.
