CRM v2: people and companies for agents and integrations
Status: on by default. Per-org switches (an org override turns any off; its routes then answer 404 and its tools are not registered):
| Switch | Gives |
|---|---|
crm.api.enabled | API keys and MCP may reach the crm family at all (sessions do not need it) |
crm.v2.records | records, flags, tags, notes, search, external keys, upsert, batch upsert; 10 record tools |
crm.v2.lifecycles | lifecycles, applicability rules, transitions, history, overdue (stage SLA); 7 tools |
crm.v2.relationships | relationship types, relationships, neighbors, paths; 11 tools |
crm.v2.webhooks | the ten crm.* webhook events; 1 read-only tool |
A runner key can never name crm. Export, import, segment materialize, mailer sync, erase and registering a webhook
receiver stay session only.
The rules that matter
- Every write is retry-safe:
Idempotency-Keyheader (or bodyclientRequestId); same key + same body replays (Idempotent-Replayed: true), same key + different body is 422idempotency_key_reused. - Use your own ids:
PUT /v1/orgs/{orgId}/crm/external/{kind}/{externalKey}creates or updates THE record holding that key. 409 crm_duplicate_recordnames the existing record indetails.existing: update it or ask; never guess.- Flags and tags you send are set exactly;
POST .../flagsadds or removes. - Changed-since sync:
GET .../crm/records?kind=person&updatedSince=...&includeArchived=true, keepnextCursor. - Batch:
POST .../crm/records:batchUpsert(up to 100, per-item results).
Reference
- API reference: tag
crmin/v1/openapi.json. - MCP tools: the
crm_*record, lifecycle, relationship and webhook tools, see the MCP tool reference. - Agent skill: CRM skill.
- Runbook and design: CRM design, "CRM events" in webhooks, switch rows in feature switches.