Menu · CMA
CMA

Run a CMA

POSThttps://api.ruuster.com/v1/cma

A comparative market analysis for one home in a market your brokerage is on: subject profile, sold comps with dollar adjustments, active, pending and expired competition, market conditions, a value conclusion and a seller net sheet. Computed from MLS records; no AI text.

  • Authentication: x-api-key and x-email headers of an owner or admin
  • Rate limit: lookup call, 20 per minute per key, within the 120 per minute
  • Counts toward your brokerage's daily CMA allowance (200 by default)
View as Markdown

Runs a CMA and stores it; the response is the full analysis and Get a CMA returns it again for 90 days. The subject can be any home with an MLS record in one of your brokerage's MLSs, yours or not, or (in the US) a home that has never been listed, valued from its county public record. How the numbers are produced, and what they are not, is on CMAs.

In Claude (claude.ai and Claude desktop) and other assistants that show MCP Apps, the cma_create and cma_get tools' answers come with a visual CMA: the subject's photo gallery, the value conclusion, each sold comp with its photo and adjustments, the active, pending and expired competition with thumbnails, the market and the net sheet, under your logo and in your colors and fonts from the brand kit, with the credited agent's photo and contact details. Through MCP those answers also carry brand (the brand kit, for a seller-facing write-up or listing presentation), and the tools take includePhotos (0 to 8), which hands the assistant that many of the subject's photos to look at, for example to judge condition and updates before re-running with overrides. None of this is part of the HTTP API.

This is a lookup call (20 per minute) and counts toward your brokerage's daily CMA allowance (200 per day by default; meta.cmaQuota shows where you stand). One CMA runs at a time per brokerage. Typical response time is one to three seconds.

Body

JSON, Content-Type: application/json, at most 64 KB. Everything is optional except one way of naming the subject.

Name Type Required Description
subject.propertyId string one of four The listing's id, from any other call or event
subject.mlsRecordId string one of four An MLS number in one of your MLSs; add subject.mlsId when the number matches more than one
subject.address object one of four line1 (street number first), optional unit, city, state, postalCode. Matched against MLS records at that number and postal code; a US home with no MLS record is found in the county public records instead
subject.publicRecordId string one of four A recordId from Look up a public record: values a home from its county record (US only)
agent string no The agent the CMA is for: their agentId, email or landing-page slug (see List agents). Every listing link in the CMA opens under that agent's page, so whoever signs up from it is their lead. Default: your brokerage's default agent (where unassigned leads go); plain links when there is none
overrides object no Facts you know better than the MLS record: bedrooms, bathrooms, livingArea, lotSizeAcres, yearBuilt, garageSpaces, stories, pool, basement (none, unfinished, finished), view, condition (poor, fair, average, good, excellent), updates (any of roof, hvac, kitchen, bathrooms, flooring, windows), propertyType (house, townhouse, condo, other)
options.radiusMiles number no Search radius for comps, 0.25 to 3. Default 0.75. Widened automatically to 1 then 2 miles when too few sales are found
options.soldWithinMonths integer no 3 to 12. Default 6; widened to 12 when needed
options.sqftTolerance number no 0.1 to 0.3. Default 0.2 (comps within ±20% of the subject's living area)
options.maxComps integer no 3 to 8. Default 6
options.minComps integer no 1 to 6. Default 3; the search widens until this many distinct homes are found
options.includeActives boolean no Default true
options.includePendings boolean no Default true
options.includeExpired boolean no Default true
options.adjustmentRates object no Override any default rate from CMAs, for example { "poolPct": 0.04, "updatePct": { "kitchen": 0.05 } }
options.netSheet object no listPrice (default: the recommended list price), commissionPct (default 5), sellerClosingPct (default 1.5), mortgagePayoff (default 0), otherCosts (default 0)

Response

201 Created with:

Field Description
cmaId, createdAt, currency currency is CAD for Canadian provinces, else USD
agent The agent every listing url in the CMA credits: agentId, firstName, lastName, email, phone, photoUrl, landingPageUrl and source (request when you named them, default for your brokerage's default agent). null when you named no one and there is no default agent; the links are then plain /listings/ links
subject The property object plus photos, resolvedBy (propertyId, mlsRecordId or address), profile (beds, baths, living area, lot, year built, garage, stories, pool, basement, view, condition, updates, HOA, annual tax, assessed value, parcel number, last status and sale, and sources saying whether each fact came from the MLS record or your override) and publicRecord with publicRecordStatus: for US homes, when public records are enabled for the deployment, the county record (parcel number, beds, baths, living area, lot, year built, stories, garage, pool, basement, condition, tax (year, annual amount, assessed value), lastSale, occupancy owner or absentee, loans (the open loans only, leaving out any a recorded release or a later refinance closed: total original, estimatedBalance, first and second loan amount, rate, type, date, lender type) and avm (automated value with range and confidence)). No owner, borrower, buyer or seller names. publicRecordStatus is found, not_found, timeout, unavailable (records off) or unsupported (Canada)
search The MLS, property type, radius, months, size band actually used, what was widened, and how many listings were found
soldComps[] Each sale: property, distanceMiles, salePrice, concessions, netSalePrice, pricePerSqft, saleDate, originalListPrice, listPrice, listToSaleRatio, daysOnMarket, financing, facts, adjustments[] (factor, subject, comp, amount, basis), grossAdjustment, grossAdjustmentPct, netAdjustment, adjustedPrice, adjustedPricePerSqft, weight (its share of the value conclusion) and flags (high_gross_adjustment, older_sale, different_subtype, distance_expanded)
actives[], pendings[], expired[] Up to 10 each in the same area and size band: property, listPrice, originalListPrice, pricePerSqft, daysOnMarket, distanceMiles, and for expired, withdrawn and canceled listings offMarketDate and lastStatus
market Within radiusMiles (at least 1 mile), 12 months: months[] (closed, median price, median price per sq ft, median days on market, median list-to-sale), absorption (closed per month, actives now, months of inventory), trend (price per sq ft movement per month and rising, flat or declining), listToSaleRatio, medianPricePerSqft, season (this month's share of the area's closings over three years), rates (the current 30- and 15-year fixed national averages with their dates, daily from Optimal Blue OBMMI and weekly from the Freddie Mac survey, as on Mortgage rates; null when the rate source is unreachable)
valuation indicatedValue, range.low / high, adjustedPricePerSqft and valueBySqft (that rate × the subject's living area, a second indication), avm (the public-record automated value, range and confidence as a cross-check, never blended in; null without a record), recommendedListPrice, confidence (high, medium, low) with reasons[], and reconciliation[] (each comp's adjusted price and weight). null when no comparable sale was found
netSheet listPrice, commission, sellerClosingCosts, mortgagePayoff, mortgagePayoffSource (request, publicRecord when the estimated loan balance from the county record was used, or none), otherCosts, estimatedProceeds
supporting map (subject and comp coordinates with distances), photos (subject gallery and each comp's first photo), disclaimer

meta.cmaQuota has limit, used, remaining and resetsAt. Errors: 400 invalid_parameter (names the field), 400 invalid_mls_number, 400 mls_not_in_scope, 404 not_found (no MLS record for the subject in your MLSs), 429 daily_quota_exceeded, 429 rate_limited (another CMA for your brokerage is still running; retry after Retry-After).