CRM

Save a contact

crm_save_contact · Changes data · Markdown

Creates a contact, or updates the one with the same email; only the fields you send change.

$0.01 a call

From your agent’s balance. A call that fails costs nothing.

An example

Add Jana Weber from Weber Küchenplanung as a trade lead. She plans restaurant kitchens and came to the test kitchen today.

Your agent callscrm_save_contact$0.01 a call

The example business is Hansen & Voss, a restaurant-equipment wholesaler in Hamburg with 60 staff. The reply is the one the tool really gives.

With these arguments
{
  "email": "jana@weber-kuechenplanung.example",
  "name": "Jana Weber",
  "title": "Kitchen planner",
  "company": "Weber Küchenplanung",
  "phone": "+49 40 66969 120",
  "location": "Hamburg",
  "lifecycle_stage": "lead",
  "tags": [
    "trade",
    "test-kitchen-visit"
  ]
}
What comes back
{
  "contact": {
    "id": 4107,
    "email": "jana@weber-kuechenplanung.example",
    "name": "Jana Weber",
    "title": "Kitchen planner",
    "company": "Weber Küchenplanung",
    "company_id": 4105,
    "phone": "+49 40 66969 120",
    "location": "Hamburg",
    "lifecycle_stage": "lead",
    "outreach_status": null,
    "notes": "",
    "tags": [
      "test-kitchen-visit",
      "trade"
    ],
    "custom_fields": {},
    "archived": false,
    "updated_at": "2026-10-14T08:00:00+00:00"
  },
  "created": true
}

Use it when

A person belongs in the CRM: a new lead, a customer, or new details for someone already there.

What it does

Create a contact, or update the one with this email if it already exists. Only the fields you send change; tags are added, custom fields merged. Without an email a new contact is always created.

What comes back

The contact as saved (with company_id when a company was named), and created: true when it is new. Every reply also carries cost_usd and balance_usd.

Inputs

NameTypeWhat it is
emailstring (email)Up to 254 characters.
namestringUp to 255 characters.
titlestringUp to 255 characters.
companystringCompany name; also links or creates the company record. Up to 255 characters.
phonestringUp to 60 characters.
locationstringUp to 255 characters.
timezonestringUp to 60 characters.
languagestringUp to 60 characters.
lifecycle_stagestringOne of: lead,trial,onboarding,customer,at_risk,churned,advocate.
notesstringUp to 20,000 characters.
custom_fieldsobjectCustom fields as {"key": value}, merged into the existing ones; null clears one. Keys defined with crm_define_field are checked against their type.
tagsarray of stringsTags to add, e.g. ["vip"]; a new tag is made on first use. crm_tag_records removes tags. Up to 20 items.

The call

Over MCP, call crm_save_contact on https://api.conecto.chat/mcp/crm. Over REST:

Terminal
curl -X POST https://api.conecto.chat/v1/tools/crm_save_contact \
  -H "Authorization: Bearer $CONECTO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email":"jana@weber-kuechenplanung.example","name":"Jana Weber","title":"Kitchen planner","company":"Weber Küchenplanung","phone":"+49 40 66969 120","location":"Hamburg","lifecycle_stage":"lead","tags":["trade","test-kitchen-visit"]}'

When it refuses

A refused call costs nothing and says what to do next.

CodeWhenWhat to do
invalid_input400A custom field value does not fit the field's type, or the record would hold too many custom fields.Send a value of the type crm_list_fields shows for that key, or null to clear it.
conflict409Another call saved the same record at the same moment.Call again: it will update the record that now exists.

Give this to your agent.

Set up Conecto from https://conecto.chat/SKILL.md