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
| Field | Value |
|---|---|
| Vendor | California Regional MLS (CRMLS) |
| URL | https://app.crmls.org / https://replication.crmls.org |
| KB doc | API |
| Auth method | OAuth 2.0 Bearer Token (client credentials) |
| Auth server | https://auth.crmls.org/oauth/token |
| Auth credential | Personal Henry MLS credentials — NOT in 1Password (see note below) |
| Cred-proxy port | n/a — cred-proxy-eligible: NO (see note) |
| Webhook port | n/a (polling-based replication only) |
| Webhook handler | n/a |
| Webhook dedup table | n/a |
| Tunnel path | n/a |
| Outbound API base | https://replication.crmls.org/reso/odata/ (alt: https://api.crmls.org/reso/odata/) |
| API standard | RESO Web API 2.0 / OData v4 |
| Rate limits | Member: 2 req/s, 500 req/hr; Data Recipient: 10 req/s, 5,000 req/hr; IDX: 50 req/s, 20k/hr |
| Rate-limit action | 429 → exp backoff (3 retries), Discord ops alert |
| Max page size | 200 records per request ($top=200) |
| Token TTL | 1 hour; refresh 5 min before expiry |
| Cost | ~300–600/yr |
| Backup/recovery | MLS-owned SaaS; sync locally via ModificationTimestamp incremental pull |
| Discord alert channel | ops |
| Drift cadence | on-API-change; no automated webhook drift check |
| Data license | brokerage — requires active MLS-board membership |
| Status | production |
⚠️ 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
Active listings search
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
| Status | Description |
|---|---|
Active | On market |
ActiveUnderContract | Under contract, still showing |
Pending | Under contract, no more offers |
Closed | Sold — use for comps |
Withdrawn / Expired / Cancelled | Off-market |
Delete | Remove from local DB |
Cross-links
Agents that touch this
- _summary — acquisition deal sourcing from CRMLS listings
- _summary — deal analysis and comp evaluation requests
Skills that invoke this
- hubspot-deal-ingest — converts CRMLS listing data to HubSpot acq deal
- acquisitions-outreach — sends Stage 1 outreach to listing agents sourced from CRMLS
- il-marketplace-pull — parallel IL-sourced deals (compare with CRMLS pipeline)
Plans that govern this
- openclaw-self-improvement-layer-2026-05-03 — OSIL B13: IL AI replication track may absorb CRMLS comp analysis
- openclaw-fragmentation-fix-2026-05-01 — G-NO-PLAINTEXT-CREDS applies to CRMLS personal creds
Feedback rules
- feedback_no_plaintext_creds — CRMLS creds in master.env only; never in tracked file
- feedback_no_assumptions — verify field names against KB API.md before writing queries
- feedback_live_over_memory — re-read CRMLS KB before writing new query code; don’t rely on training data
- feedback_source_master_env_before_checking — check master.env for CRMLS_CLIENT_ID / CRMLS_CLIENT_SECRET before asking Henry
KB / source docs
- API — RESO Web API reference, OData examples, field dictionary, rate limits (verified 2026-03-04)
System maps
- request-lifecycle — where CRMLS listing ingest fits in the deal pipeline
- agents-tier-structure — Acq agent tier ownership
Related: Real estate data platform cluster
This hub is the anchor of the real estate data platform cluster. All members feed deal/lead data into hubspot as the downstream CRM.
| Platform | Hub | Role |
|---|---|---|
| CRMLS (this hub) | crmls | MLS active + sold listings (Southern CA) |
| PropStream | propstream | Flipper lead lists, cold blast |
| OpenToClose | opentoclose | TC transaction management |
| HubSpot | hubspot | CRM — downstream of all three |
| InvestorLift | investorlift | Wholesale marketplace |
| Buyer blast process | buyer-blast | Blast 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
PrivateRemarksand agent contact fields require member-level credentials — verify Henry’s board membership status before enabling- OData pagination not yet tested at scale — add
$count=trueon 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)