# Get a CMA

Source: https://help.ruuster.com/api/cma-get

```http
GET https://api.ruuster.com/v1/cma/{cmaId}
```

Read a CMA your brokerage ran, for 90 days after it was created. The same object Run a CMA returned, with the market as it was that day.

- Authentication: `x-api-key` and `x-email` headers of an owner or admin
- Rate limit: 120 requests per minute per key

Returns a stored analysis exactly as [Run a CMA](https://help.ruuster.com/api/cma-create) produced it; nothing is recomputed, so the comps and market figures are as of the day it ran. CMAs are kept for 90 days. A `cmaId` from another brokerage, or an expired one, returns `404 not_found`. Reading a stored CMA doesn't count toward the daily CMA allowance.

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](https://help.ruuster.com/api/brand), 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.

## Path parameters

| Name | Type | Description |
|---|---|---|
| `cmaId` | string |  |

## Response

`data` is the CMA object described on [Run a CMA](https://help.ruuster.com/api/cma-create), with `cmaId` and `createdAt`. `meta.ms` is how long the original run took.

## Example request

cURL:

```bash
curl -s "https://api.ruuster.com/v1/cma/cma_7Kp2mWq9Xz4R" \
  -H "x-api-key: $RUUSTER_API_KEY" \
  -H "x-email: $RUUSTER_EMAIL"
```

Node.js:

```javascript
const res = await fetch("https://api.ruuster.com/v1/cma/cma_7Kp2mWq9Xz4R", {
  headers: {
    "x-api-key": process.env.RUUSTER_API_KEY,
    "x-email": process.env.RUUSTER_EMAIL,
  },
});
const body = await res.json();
if (!body.ok) throw new Error(`${body.error.code}: ${body.error.message} (${body.requestId})`);
console.log(body.data);
```

Python:

```python
import os
import requests

res = requests.get(
    "https://api.ruuster.com/v1/cma/cma_7Kp2mWq9Xz4R",
    headers={"x-api-key": os.environ["RUUSTER_API_KEY"], "x-email": os.environ["RUUSTER_EMAIL"]},
    timeout=30,
)
body = res.json()
if not body["ok"]:
    raise RuntimeError(f'{body["error"]["code"]}: {body["error"]["message"]} ({body.get("requestId")})')
print(body["data"])
```

## Example response

```json
{
  "ok": true,
  "data": {
    "cmaId": "cma_7Kp2mWq9Xz4R",
    "createdAt": "2026-10-13T15:04:11Z",
    "currency": "USD",
    "subject": { "propertyId": "5b7e2d94-1c63-4a8f-b5e0-9d3c7a2f1e86", "address": "4182 E Saguaro Bloom Dr", "city": "Tucson", "state": "AZ", "postalCode": "85718", "ownedByYou": true },
    "search": { "radiusMiles": 0.75, "soldWithinMonths": 6, "widened": [], "found": { "closed": 19, "actives": 6, "pendings": 3, "expired": 1 } },
    "soldComps": [ { "property": { "propertyId": "a03c8f61-7e2b-4d95-8a14-6f0b3e9c2d57" }, "salePrice": 515000, "adjustedPrice": 526007, "weight": 0.24 } ],
    "valuation": { "indicatedValue": 521400, "range": { "low": 509000, "high": 533000 }, "recommendedListPrice": 530000, "confidence": "high" },
    "netSheet": { "listPrice": 530000, "estimatedProceeds": 183550 }
  },
  "meta": { "brokerageId": "4f6c2a9e-8d31-4b57-9a0e-2c7d5e1b8f43", "ms": 1840 }
}
```
