userId + phoneNumber. Existing contacts are updated with the most recent values, new ones are created. Rows missing phoneNumber or missing BOTH firstName AND companyName are silently skipped and counted. Phone numbers are normalized (strips (), -, spaces) so formatting variations don't create duplicates. Does NOT emit timeline activity — this is a silent sync.curl --location '/users/me/contacts/sync' \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"contacts": [
{
"firstName": "string",
"lastName": "string",
"phoneNumber": "string",
"email": "string",
"address": "string",
"notes": "string",
"companyName": "string",
"tags": [
"string"
],
"avatar": "string",
"isFavorite": true,
"source": "MOBILE",
"lifecycleStage": "lead",
"doNotCall": true,
"doNotSms": true
}
]
}'{
"success": true,
"message": "string"
}