Contacts
Update contact
Modify an existing contact’s identity details, phone number, tags, or custom metadata
PUT
/
api
/
v1
/
contacts
/
{contact_id}
curl -X PUT "https://api.sayvy.ai/api/v1/contacts/7b8f9e2a-4c1d-48ef-9123-bcde456789ab" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "Jane Miller",
"phone_number": "+14155550199",
"tags": ["vip", "churn_risk"],
"notes": "Requested follow-up call after tariff update",
"custom_fields": {
"company": "Acme Corp",
"deal_size": 35000
}
}'
import requests
url = "https://api.sayvy.ai/api/v1/contacts/7b8f9e2a-4c1d-48ef-9123-bcde456789ab"
payload = {
"name": "Jane Miller",
"phone_number": "+14155550199",
"tags": ["vip", "churn_risk"],
"notes": "Requested follow-up call after tariff update",
"custom_fields": {
"company": "Acme Corp",
"deal_size": 35000
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://api.sayvy.ai/api/v1/contacts/7b8f9e2a-4c1d-48ef-9123-bcde456789ab", {
method: "PUT",
headers: {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
},
body: JSON.stringify({
name: "Jane Miller",
phone_number: "+14155550199",
tags: ["vip", "churn_risk"],
notes: "Requested follow-up call after tariff update",
custom_fields: {
company: "Acme Corp",
deal_size: 35000
}
})
});
const data = await response.json();
console.log(data);
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String jsonPayload = """
{
"name": "Jane Miller",
"phone_number": "+14155550199",
"tags": ["vip", "churn_risk"]
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sayvy.ai/api/v1/contacts/7b8f9e2a-4c1d-48ef-9123-bcde456789ab"))
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.PUT(HttpRequest.BodyPublishers.ofString(jsonPayload))
.build();
HttpResponse<String> response =
HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
{
"id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"organization_id": "00000000-0000-0000-0000-000000000001",
"phone_number": "+14155550199",
"name": "Jane Miller",
"tags": [
"vip",
"churn_risk"
],
"notes": "Requested follow-up call after tariff update",
"custom_fields": {
"company": "Acme Corp",
"deal_size": 35000
},
"lifecycle_stage": "qualified",
"lead_score": 85,
"owner_id": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d",
"ai_handling": true,
"last_activity_at": "2026-10-07T14:30:00Z",
"source": "manual",
"created_at": "2026-10-07T11:00:00Z",
"updated_at": "2026-10-07T15:10:00Z"
}
{
"detail": "Contact not found"
}
{
"detail": "Unauthorized"
}
Perform a standard full update on an existing contact record. Modify personal identification fields, assign or replace segmentation tags, update customer notes, and edit custom key-value metadata.
To partially update CRM lifecycle stages, lead scores, assigned owners, or AI handling delegation, use the dedicated Partially update contact CRM (
PATCH) endpoint instead.Authentication
This endpoint requires Bearer token authentication.Authorization: Bearer <token>
| Header | Type | Required | Description | Format |
|---|---|---|---|---|
Authorization | string | Yes | Scoped organization API key or Bearer JWT token | Bearer <token> |
Input parameters
string
required
Unique UUID identifier of the contact to update. Example:
7b8f9e2a-4c1d-48ef-9123-bcde456789ab.string
required
Bearer token for authentication. Format:
Bearer <token>.string
Updated full name of the contact.
string
Updated destination telephone number.
string[]
Updated array of segmentation tags (e.g.
["vip", "churn_risk"]).string
Updated internal notes.
object
Updated custom metadata attributes dictionary.
Response Fields
Returns the updated ContactResponse object:string
Contact UUID.
string
Organization UUID.
string
Updated telephone number.
string
Updated full name.
string[]
Updated segmentation tags.
string
Updated internal notes.
object
Updated metadata object.
string
Current CRM lifecycle stage (
new, engaged, qualified, customer, lost).integer
Numerical lead score (0–100).
string
Assigned team member UUID or
null.boolean
AI interaction flag (
true or false).string
Last activity timestamp.
string
Origin channel attribution.
string
Creation timestamp.
string
Modification timestamp.
curl -X PUT "https://api.sayvy.ai/api/v1/contacts/7b8f9e2a-4c1d-48ef-9123-bcde456789ab" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "Jane Miller",
"phone_number": "+14155550199",
"tags": ["vip", "churn_risk"],
"notes": "Requested follow-up call after tariff update",
"custom_fields": {
"company": "Acme Corp",
"deal_size": 35000
}
}'
import requests
url = "https://api.sayvy.ai/api/v1/contacts/7b8f9e2a-4c1d-48ef-9123-bcde456789ab"
payload = {
"name": "Jane Miller",
"phone_number": "+14155550199",
"tags": ["vip", "churn_risk"],
"notes": "Requested follow-up call after tariff update",
"custom_fields": {
"company": "Acme Corp",
"deal_size": 35000
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://api.sayvy.ai/api/v1/contacts/7b8f9e2a-4c1d-48ef-9123-bcde456789ab", {
method: "PUT",
headers: {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
},
body: JSON.stringify({
name: "Jane Miller",
phone_number: "+14155550199",
tags: ["vip", "churn_risk"],
notes: "Requested follow-up call after tariff update",
custom_fields: {
company: "Acme Corp",
deal_size: 35000
}
})
});
const data = await response.json();
console.log(data);
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String jsonPayload = """
{
"name": "Jane Miller",
"phone_number": "+14155550199",
"tags": ["vip", "churn_risk"]
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sayvy.ai/api/v1/contacts/7b8f9e2a-4c1d-48ef-9123-bcde456789ab"))
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.PUT(HttpRequest.BodyPublishers.ofString(jsonPayload))
.build();
HttpResponse<String> response =
HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
{
"id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"organization_id": "00000000-0000-0000-0000-000000000001",
"phone_number": "+14155550199",
"name": "Jane Miller",
"tags": [
"vip",
"churn_risk"
],
"notes": "Requested follow-up call after tariff update",
"custom_fields": {
"company": "Acme Corp",
"deal_size": 35000
},
"lifecycle_stage": "qualified",
"lead_score": 85,
"owner_id": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d",
"ai_handling": true,
"last_activity_at": "2026-10-07T14:30:00Z",
"source": "manual",
"created_at": "2026-10-07T11:00:00Z",
"updated_at": "2026-10-07T15:10:00Z"
}
{
"detail": "Contact not found"
}
{
"detail": "Unauthorized"
}
‹ PreviousNext ›
Partially update contact CRM
PATCH /api/v1/contacts/{contact_id}
Was this page helpful?
⌘I
curl -X PUT "https://api.sayvy.ai/api/v1/contacts/7b8f9e2a-4c1d-48ef-9123-bcde456789ab" \
-H "Authorization: Bearer <token>" \
-H "Content-Type: application/json" \
-d '{
"name": "Jane Miller",
"phone_number": "+14155550199",
"tags": ["vip", "churn_risk"],
"notes": "Requested follow-up call after tariff update",
"custom_fields": {
"company": "Acme Corp",
"deal_size": 35000
}
}'
import requests
url = "https://api.sayvy.ai/api/v1/contacts/7b8f9e2a-4c1d-48ef-9123-bcde456789ab"
payload = {
"name": "Jane Miller",
"phone_number": "+14155550199",
"tags": ["vip", "churn_risk"],
"notes": "Requested follow-up call after tariff update",
"custom_fields": {
"company": "Acme Corp",
"deal_size": 35000
}
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.status_code)
print(response.json())
const response = await fetch("https://api.sayvy.ai/api/v1/contacts/7b8f9e2a-4c1d-48ef-9123-bcde456789ab", {
method: "PUT",
headers: {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
},
body: JSON.stringify({
name: "Jane Miller",
phone_number: "+14155550199",
tags: ["vip", "churn_risk"],
notes: "Requested follow-up call after tariff update",
custom_fields: {
company: "Acme Corp",
deal_size: 35000
}
})
});
const data = await response.json();
console.log(data);
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
String jsonPayload = """
{
"name": "Jane Miller",
"phone_number": "+14155550199",
"tags": ["vip", "churn_risk"]
}
""";
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.sayvy.ai/api/v1/contacts/7b8f9e2a-4c1d-48ef-9123-bcde456789ab"))
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.PUT(HttpRequest.BodyPublishers.ofString(jsonPayload))
.build();
HttpResponse<String> response =
HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
{
"id": "7b8f9e2a-4c1d-48ef-9123-bcde456789ab",
"organization_id": "00000000-0000-0000-0000-000000000001",
"phone_number": "+14155550199",
"name": "Jane Miller",
"tags": [
"vip",
"churn_risk"
],
"notes": "Requested follow-up call after tariff update",
"custom_fields": {
"company": "Acme Corp",
"deal_size": 35000
},
"lifecycle_stage": "qualified",
"lead_score": 85,
"owner_id": "a1b2c3d4-e5f6-4a5b-8c9d-0e1f2a3b4c5d",
"ai_handling": true,
"last_activity_at": "2026-10-07T14:30:00Z",
"source": "manual",
"created_at": "2026-10-07T11:00:00Z",
"updated_at": "2026-10-07T15:10:00Z"
}
{
"detail": "Contact not found"
}
{
"detail": "Unauthorized"
}
