# Get a CRM change

Source: https://help.ruuster.com/api/crm-change-get

```http
GET https://api.ruuster.com/v1/crm/changes/{changeId}
```

One change made to your CRM through Ruuster, in full: the request, every person with the values before and after (as the CRM confirmed them) and whether they were done, skipped or failed and why, and the history of every call against the change.

- Authentication: `x-api-key` and `x-email` headers of an owner or admin
- Rate limit: 120 requests per minute per key
- Rows count against the daily lead-row quota (50,000 by default)

The complete record of one change from [Preview a change to your CRM](https://help.ruuster.com/api/crm-change-preview): what was asked, what each person looked like before, what they look like after (for people changed, the values your CRM answered with), and the history (previewed, any refused confirmation and why, each applied batch, completed or cancelled), with who did each step. No CRM key is needed.

## Path parameters

| Name | Type | Description |
|---|---|---|
| `changeId` | string | The change, `crmchg_…`, from Preview a change to your CRM |

## Query parameters

| Name | Type | Default | Description |
|---|---|---|---|
| `items` | `0` \| `1` | `1` | `0` leaves out the people and returns the change and its history only |

## Response

| Field | Description |
|---|---|
| `change` | As on [List CRM changes](https://help.ruuster.com/api/crm-changes-list) |
| `people[]` | `personId`, `name`, `leadId` (the Ruuster lead with this CRM id, if any), `status` (`pending`, `done`, `skipped`, `failed`, `cancelled`), `reason`, `before`, `after`, `result` (the id of a note or task the CRM created), `appliedAt` |
| `history[]` | `at`, `kind` (`previewed`, `apply_refused`, `applied_batch`, `completed`, `cancelled`), `by`, `client`, `detail` |

## Example request

cURL:

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

Node.js:

```javascript
const res = await fetch("https://api.ruuster.com/v1/crm/changes/crmchg_7Qm2VbX9kLp4RtYz", {
  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/crm/changes/crmchg_7Qm2VbX9kLp4RtYz",
    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": {
    "change": {
      "changeId": "crmchg_7Qm2VbX9kLp4RtYz", "status": "completed", "action": "add_tags",
      "summary": "Add the tag \"xyz\" to 2 people in Follow Up Boss.",
      "request": "Tag my leads who viewed homes in the last 7 days but haven't been called with xyz",
      "params": { "tags": ["xyz"] }, "source": null, "undoOf": null, "vendor": "fub",
      "crmAccount": "examplerealty", "crmUser": "alex@examplerealty.com",
      "requestedBy": { "email": "alex@examplerealty.com", "role": "owner", "client": "mcp" },
      "counts": { "requested": 2, "willChange": 2, "skipped": 0, "done": 2, "failed": 0 },
      "warnings": [], "createdAt": "2026-10-22T19:00:00.000Z", "expiresAt": "2026-10-22T19:15:00.000Z",
      "confirmedAt": "2026-10-22T19:00:41.000Z", "completedAt": "2026-10-22T19:00:43.000Z", "cancelledAt": null, "lastError": null
    },
    "people": [
      { "personId": "48213", "name": "Sam Lee", "leadId": "user:c0ff3e21-8a4b-4c7d-9e15-2b6f8d3a1c04", "status": "done", "reason": null,
        "before": { "tags": ["buyer"] },
        "after": { "tags": ["buyer", "xyz"], "added": ["xyz"], "confirmed": { "id": "48213", "name": "Sam Lee", "stage": "Nurture", "tags": ["buyer", "xyz"], "assignedUserId": null, "assignedTo": null } },
        "result": null, "appliedAt": "2026-10-22T19:00:42.000Z" }
    ],
    "history": [
      { "at": "2026-10-22T19:00:00.000Z", "kind": "previewed", "by": "alex@examplerealty.com", "client": "mcp", "detail": { "requested": 2, "willChange": 2, "skipped": 0, "crmCalls": 3 } },
      { "at": "2026-10-22T19:00:43.000Z", "kind": "applied_batch", "by": "alex@examplerealty.com", "client": "mcp", "detail": { "done": 2, "failed": 0, "remaining": 0, "crmWrites": 2, "crmReads": 2, "stoppedBy": null } },
      { "at": "2026-10-22T19:00:43.000Z", "kind": "completed", "by": "alex@examplerealty.com", "client": "mcp", "detail": { "done": 2, "failed": 0, "skipped": 0 } }
    ]
  },
  "meta": { "brokerageId": "41c73a1a-1dde-42e9-a9c9-0da74502b50e" }
}
```
