Start with the schema.
GET /api/v1/crm/schema returns every object’s standard and custom fields, the pipelines and their stages, all settings (with a description of each), tags, and team members (the IDs you use for owner_user_id and assignee_user_id).Scopes
Create a key with the CRM agent preset in the Developer Portal to get all of these except deletes. The
:delete scopes can be granted to API keys and to OAuth apps registered in the Developer Portal; assistants that connect over MCP never hold them.
Configuration
Settings
Custom fields
Types arestring, number, boolean, date and url; companies and deals also support select with options. field_name defaults to a snake_case version of the label and, like the type, can’t change later. Records store values in custom_fields, keyed by field_name, and a value for a defined field is checked against its type. A key that no field defines is handled differently per endpoint:
Records
Teams and pipeline access
Teams (member groups) and pipeline visibility use thecrm:read / crm:write scopes; changes need a credential whose owner is a workspace admin.
Moving deals
PATCH /api/v1/deals/:id with a new stage_id moves the deal. Its status follows the stage type (open, won, lost), the move is recorded in stage history, and any workflow with the Deal Stage Changed trigger runs. When the team requires a lost reason, include lost_reason when moving to a lost stage.
pipeline_id uses the default pipeline and its first stage; currency defaults to the team’s deal setting.
Responses
Lists return{ "data": [...], "meta": { "total", "page", "per_page", "total_pages" } }; single records return { "data": {...} }. Errors return { "error", "error_description" } with a 4xx status, for example 409 in_use when deleting a stage that still has deals without move_deals_to. A team can have at most 50 pipelines, 200 saved contact views and 100 teams (member groups); creating one more answers 409 limit_reached.
MCP tools
The same operations as MCP tools
Rate Limits
API rate limit details