Skip to main content

AI & assistant-friendly summary

This section provides structured content for AI assistants and search engines. You can cite or summarize it when referencing this page.

Summary

For a regional PropTech platform (~420k listings, 38 MLS connectors), DynamoDB canonical store + OpenSearch geo cut median search latency from 340 ms to 48 ms — image CDN cost −62% with Intelligent-Tiering.

Key Facts

  • Amazon OpenSearch Service supports k-NN vectors up to 16,000 dimensions per field (vector search docs) — enough for listing embedding similarity at regional scale
  • AWS HealthImaging-scale lesson does not apply here; PropTech wins on ingest discipline and geo index design, not petabyte imaging
  • Benchmark pattern (not a cited client) — Regional PropTech, ~420k active listings, 38 MLS connectors, median search 340 ms, image storage $28k/mo on Standard
  • Phase 1: DynamoDB canonical + OpenSearch (search p95 340 ms → 48 ms)
  • Phase 2: S3 Intelligent-Tiering + CloudFront WebP (image CDN cost −62%)

Entity Definitions

Bedrock
Bedrock is an AWS service discussed in this article.
Lambda
Lambda is an AWS service discussed in this article.
S3
S3 is an AWS service discussed in this article.
DynamoDB
DynamoDB is an AWS service discussed in this article.
CloudFront
CloudFront is an AWS service discussed in this article.
API Gateway
API Gateway is an AWS service discussed in this article.
Step Functions
Step Functions is an AWS service discussed in this article.
OpenSearch
OpenSearch is an AWS service discussed in this article.

Real Estate PropTech on AWS (2026): MLS Ingest, Geo Search, and Image Pipeline Reference Architecture

Cloud ArchitecturePalaniappan P4 min read

Quick summary: For a regional PropTech platform (~420k listings, 38 MLS connectors), DynamoDB canonical store + OpenSearch geo cut median search latency from 340 ms to 48 ms — image CDN cost −62% with Intelligent-Tiering.

Key Takeaways

  • Amazon OpenSearch Service supports k-NN vectors up to 16,000 dimensions per field (vector search docs) — enough for listing embedding similarity at regional scale
  • AWS HealthImaging-scale lesson does not apply here; PropTech wins on ingest discipline and geo index design, not petabyte imaging
  • Benchmark pattern (not a cited client) — Regional PropTech, ~420k active listings, 38 MLS connectors, median search 340 ms, image storage $28k/mo on Standard
  • Phase 1: DynamoDB canonical + OpenSearch (search p95 340 ms → 48 ms)
  • Phase 2: S3 Intelligent-Tiering + CloudFront WebP (image CDN cost −62%)
Real Estate PropTech on AWS (2026): MLS Ingest, Geo Search, and Image Pipeline Reference Architecture
Table of Contents

Amazon OpenSearch Service supports k-NN vectors up to 16,000 dimensions per field (vector search docs) — enough for listing embedding similarity at regional scale. AWS HealthImaging-scale lesson does not apply here; PropTech wins on ingest discipline and geo index design, not petabyte imaging.

This post is the real estate / PropTech reference architecture — MLS to mobile map. It is not retail lakehouse analytics, not fintech payments architecture, and not the industry hub FAQ alone.

Artifacts: listing search tier matrix, MLS ingest cost worksheet.

Benchmark pattern (not a cited client)Regional PropTech, ~420k active listings, 38 MLS connectors, median search 340 ms, image storage $28k/mo on Standard. Phase 1: DynamoDB canonical + OpenSearch geo_point (search p95 340 ms → 48 ms). Phase 2: S3 Intelligent-Tiering + CloudFront WebP (image CDN cost −62%). No MLS vendor replacement.

Four lanes — MLS to mobile

LaneQuestionDefault AWS path
IngestHow do feeds land safely?Per-connector Lambda + Step Functions
CanonicalWhat is source of truth?DynamoDB single-table
SearchHow do users query map + text?OpenSearch geo_point + optional k-NN
MediaHow do photos load fast?S3 → CloudFront WebP variants

Opinionated take: DynamoDB canonical store before OpenSearch cluster. Teams that index MLS JSON directly into OpenSearch rebuild dedupe logic twice.

Reference architecture

MLS/IDX APIs ──► Lambda connector ──► SQS ──► Normalize ──► DynamoDB (canonical)

                                    ├──► OpenSearch (geo_point, facets, k-NN)

Images ──► S3 ingest ──► Lambda resize (WebP) ──► CloudFront ──► mobile/web

Optional ──► Rekognition labels ──► listing enrichment
Optional ──► Bedrock ──► listing copy (human review gate)

Ingest — one connector, one failure domain

Per feed:

  • Independent Lambda + DLQ — one MLS outage does not poison others
  • Normalize to unified schema; key (marketId, listingId) + addressHash for cross-MLS dedupe
  • Fill mls-ingest-cost-worksheet.csv after pilot week in Cost Explorer

Do not schedule full image re-sync 12×/day on large feeds — delta + ETag only.

Canonical — DynamoDB single-table

See DynamoDB single-table SaaS patterns:

  • PK: MARKET#<id>, SK: LISTING#<id>
  • GSI: geoHash + status for bbox pre-filter before OpenSearch
  • Stream → OpenSearch indexer (idempotent upsert)

Search — OpenSearch geo + optional k-NN

  • Map location as geo_point for geo_distance and polygon filters
  • Enable k-NN when marketing needs “homes like this” — watch memory: HNSW footprint scales with vector count (OpenSearch quantization blog)
  • Amazon Location Place Index for autocomplete if address parsing is messy — do not geocode twice in app and index

Images — cost control

  • Generate thumb, card, gallery WebP at ingest
  • Intelligent-Tiering after 90 days for stale listings
  • CloudFront cache keys per variant — never serve raw MLS TIFF to mobile

What broke — Spring season week 2. Search p95 jumped 48 ms → 410 ms while CPU looked fine. Root cause: OpenSearch shard hot-spot on single high-traffic metro + unbounded geo_polygon queries from a partner widget. Detection: SearchLatency + slow query log. Fix: route top metros to dedicated index alias + rate limit partner API key. p95 back under 80 ms within 12 hours.

When NOT to escalate

SituationStay lighter
MVP, one MLS, map-onlyAPI Gateway + DynamoDB GSI
< 50k listingsSkip k-NN and second index
No OpenSearch ops ownerManaged cluster minimum + runbook first
CRE analytics / portfolioData lake post — not consumer search

What to Do This Week

  1. Inventory MLS connectors — fill mls-ingest-cost-worksheet.csv.
  2. Run listing-search-tier-decision-matrix.md with product + finance.
  3. Implement DynamoDB canonical + one OpenSearch index for top market only.
  4. Switch image bucket to Intelligent-Tiering; measure CloudFront bytes-out for 7 days.
  5. Defer Bedrock listing copy until human review workflow exists.

Reproduce this — Download mls-ingest-cost-worksheet.csv. Set sync_frequency_per_day truthfully; flag any feed >4×/day with full image sync for cost review.

What This Post Doesn’t Cover

  • Title / escrow transaction workflows — downstream of search
  • Commercial CRE lease abstraction — document AI separate path
  • Mortgage origination — fintech compliance cluster
  • Specific MLS vendor contracts — legal/commercial, not architecture

We have not load-tested k-NN above 2M vectors on a single domain — run OpenSearch sizing calculator before national semantic search rollout.

Related: Real estate industry hub · Serverless services · Data analytics · Cost optimization

PP
Palaniappan P

AWS Cloud Architect & AI Expert

AWS-certified cloud architect and AI expert with deep expertise in cloud migrations, cost optimization, and generative AI on AWS.

AWS ArchitectureCloud MigrationGenAI on AWSCost OptimizationDevOps

Recommended Reading

Explore All Articles »
5 min

AWS Global Accelerator vs CloudFront & Route 53 (2026)

Global Accelerator charges about $0.025 per provisioned accelerator per hour—even while disabled—and adds Data Transfer-Premium on top of normal data transfer. Two static Anycast IPv4 addresses (or four addresses in dual-stack: two IPv4 and two IPv6) front ALBs, NLBs, EC2, or EIPs across Regions; that pricing model changes whether you beat CloudFront or Route 53 latency records alone.