name and phoneNumber are required — both return a 400 if empty. phoneNumber is normalized to a consistent format server-side (the curl example below sends "966501234567" and gets back "+966501234567").name, marks it isAnonymous = false, and applies the other fields from this request. It does not create a duplicate or return a 409 Conflict — a second POST with the same phone number silently becomes an update.curl --location 'https://api.voxa.sa/v1/contacts' \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data-raw '{
"name": "Ahmed Al-Otaibi",
"phoneNumber": "966501234567",
"email": "ahmed@example.com",
"company": "Acme Co",
"customFields": {
"source": "landing-page"
}
}'{
"id": {
"workspaceId": "d307b8...............",
"name": "Ahmed Noshy",
"phoneNumber": "+966501234567",
"contactType": 1,
"email": "Noshy@Hatif.io",
"company": "Hatif",
"position": null,
"customFields": {
"source": "landing-page"
},
"notes": [],
"customProperties": [],
"lastModificationTime": "2026-06-19T13:55:18.2983548+00:00",
"lastModifierId": null,
"creationTime": "2026-06-09T08:05:17.467676",
"creatorId": null,
"id": "3a21bd..............."
}
}