CRMLS MLS Data Hub

California Regional Multiple Listing Service — the largest MLS in the US (110,000+ members). This hub is the canonical reference for CRMLS RESO Web API access, OData query patterns, listing replication, and agent/office directory lookups. Read before writing any listing-search, comp analysis, or CRMLS-sourced deal ingestion code. Data access requires active MLS-board membership (brokerage-licensed); credentials are Henry’s personal MLS login, not stored in 1Password — see credential note below.

Quick reference

FieldValue
VendorCalifornia Regional MLS (CRMLS)
URLhttps://app.crmls.org / https://replication.crmls.org
KB docAPI
Auth methodOAuth 2.0 Bearer Token (client credentials)
Auth serverhttps://auth.crmls.org/oauth/token
Auth credentialPersonal Henry MLS credentials — NOT in 1Password (see note below)
Cred-proxy portn/a — cred-proxy-eligible: NO (see note)
Webhook portn/a (polling-based replication only)
Webhook handlern/a
Webhook dedup tablen/a
Tunnel pathn/a
Outbound API basehttps://replication.crmls.org/reso/odata/ (alt: https://api.crmls.org/reso/odata/)
API standardRESO Web API 2.0 / OData v4
Rate limitsMember: 2 req/s, 500 req/hr; Data Recipient: 10 req/s, 5,000 req/hr; IDX: 50 req/s, 20k/hr
Rate-limit action429 → exp backoff (3 retries), Discord ops alert
Max page size200 records per request ($top=200)
Token TTL1 hour; refresh 5 min before expiry
Cost~300–600/yr
Backup/recoveryMLS-owned SaaS; sync locally via ModificationTimestamp incremental pull
Discord alert channelops
Drift cadenceon-API-change; no automated webhook drift check
Data licensebrokerage — requires active MLS-board membership
Statusproduction

⚠️ Credential note: cred-proxy-eligible: NO

CRMLS credentials are Henry’s personal MLS-board login (client_id + client_secret issued through the CRMLS Member Portal or Data Co-op). They are tied to Henry’s brokerage membership and MLS license — they cannot be rotated or shared as a service account. For this reason:

  • These credentials are NOT stored in 1Password vault Aurora (unlike all other platform creds)
  • The cred-proxy pattern (op://Aurora/<platform>/<field>) does not apply
  • Keep credentials strictly in ~/.openclaw/master.env (chmod 600) or read from a local secrets file; never commit to repo or share across agents
  • Cross-link: 1password documents the standard cred-proxy pattern for all other platforms — CRMLS is the documented exception

Components

  • workspace/knowledge-base/crmls/API.md — Full RESO Web API reference, OData query patterns, field dictionary (verified 2026-03-04)
  • https://replication.crmls.org/reso/odata/ — Primary API base (replication endpoint)
  • https://auth.crmls.org/oauth/token — OAuth token endpoint (1-hour TTL, client_credentials grant)
  • https://go.crmls.org — Members-only portal (API credential management)
  • https://www.reso.org/reso-web-api/ — RESO standard reference

How it’s used

  • Deal sourcing: Search active SFR listings below market price in target zip codes (Inland Empire, SoCal); flag to deal-ingestion for HubSpot pipeline creation
  • Comp analysis: Pull closed comps within 180 days, same zip, ±15% sqft, same bed count — used for ARV estimation and deal scoring
  • New listing monitor: Poll ModificationTimestamp gt {last_sync} every 24h to detect new listings in target cities before they go off-market
  • Agent directory: GET /reso/odata/Member — look up listing agent MLS ID and contact info for outreach coordination
  • Failure mode: 401 = token expired (auto-refresh); 403 = field not permitted (remove PrivateRemarks for non-member access); 429 = rate limit (back off + alert)
  • Success criteria: Deal sourced from CRMLS → HubSpot acq deal created via hubspot-deal-ingest within 15 min of detection

Key OData query patterns

GET /reso/odata/Property?$filter=StandardStatus eq 'Active' and ListPrice le 600000 and BedroomsTotal ge 3&$top=200&$select=ListingKey,ListPrice,City,DaysOnMarket,ModificationTimestamp

Incremental sync (replication)

GET /reso/odata/Property?$filter=ModificationTimestamp gt '2026-05-02T00:00:00Z'&$top=200&$orderby=ModificationTimestamp asc

Sold comps

GET /reso/odata/Property?$filter=StandardStatus eq 'Closed' and CloseDate gt '2025-11-01' and PostalCode eq '92501' and BedroomsTotal eq 3&$top=20&$orderby=CloseDate desc

Photos (expand)

GET /reso/odata/Property?$filter=ListingId eq 'OC24123456'&$expand=Media($orderby=Order asc)

Standard status values

StatusDescription
ActiveOn market
ActiveUnderContractUnder contract, still showing
PendingUnder contract, no more offers
ClosedSold — use for comps
Withdrawn / Expired / CancelledOff-market
DeleteRemove from local DB

Agents that touch this

  • _summary — acquisition deal sourcing from CRMLS listings
  • _summary — deal analysis and comp evaluation requests

Skills that invoke this

Plans that govern this

Feedback rules

KB / source docs

  • API — RESO Web API reference, OData examples, field dictionary, rate limits (verified 2026-03-04)

System maps


This hub is the anchor of the real estate data platform cluster. All members feed deal/lead data into hubspot as the downstream CRM.

PlatformHubRole
CRMLS (this hub)crmlsMLS active + sold listings (Southern CA)
PropStreampropstreamFlipper lead lists, cold blast
OpenToCloseopentocloseTC transaction management
HubSpothubspotCRM — downstream of all three
InvestorLiftinvestorliftWholesale marketplace
Buyer blast processbuyer-blastBlast deals from all sources to buyers

Open issues / TODOs

  • No automated CRMLS → HubSpot sync script exists yet; manual deal creation only as of 2026-05-03
  • PrivateRemarks and agent contact fields require member-level credentials — verify Henry’s board membership status before enabling
  • OData pagination not yet tested at scale — add $count=true on first page and log total before full sync
  • Token refresh not wrapped in any shared utility — 1password cred-proxy pattern cannot apply here (personal cred)

Recent activity

  • 2026-05-03: hub created (W2-S9); sourced from knowledge-base/crmls/API.md (verified 2026-03-04)