Contacts
9 endpoints in this family.
List contacts
GET/api/v1/contacts
Returns the people this workspace has talked to, searchable by name, phone number or email. Custom attributes come back alongside, so you can map them into your own records.
Query parameters
qstringSearch by name, phone number or email.
limitintegerHow many to return.
cursorstringOpaque cursor from the previous page.
Response
A page of contacts, and the attribute definitions that describe their custom fields.
data.itemsContact[]The contacts.
data.attributesContactAttribute[]The custom field definitions.
data.nextCursorstringPass it as
cursorfor the next page;nullat the end.data.totalintegerHow many match, on the first page only;
nullafter.
curl https://coplace.io/api/v1/contacts \ -H "Authorization: Bearer $COPLACE_KEY"{ "data": { "items": [ {} ], "attributes": [ {} ], "nextCursor": "…", "total": 0 }}Create a contact
POST/api/v1/contacts
Key role agent or above
Creates someone before they have written. A contact needs at least one identity — a phone number or an email address — otherwise nothing can ever reach them.
If that identity is already known, the existing contact is returned rather than duplicated.
Body
fullNamestringTheir name, as you want it displayed.
phonestringPhone number in E.164 form.
emailstringEmail address.
attributesobjectYour custom fields, by key. See
GET /contacts/attributes.
Response
The contact.
data.contactContactdata.attributesContactAttribute[]The custom field definitions.
Refusals
- 422
no_identityNeither a phone number nor an email address was given.
curl -X POST https://coplace.io/api/v1/contacts \ -H "Authorization: Bearer $COPLACE_KEY" \ -H "Content-Type: application/json" \ -d '{ "phone": "+33612345678" }'{ "data": { "contact": { "id": "…", "displayName": "…", "locale": "…", "phone": "…", "email": "…", "externalId": "…", "tags": [], "attributes": {}, "optInAt": "…", "optOutAt": "…", "blocked": true, "conversationCount": 0, "lastMessageAt": "…", "createdAt": "…", "updatedAt": "…" }, "attributes": [ {} ] }}Get one contact
GET/api/v1/contacts/{id}
Returns the contact with all their identities and custom attributes.
Path parameters
idstringThe contact id.
Response
The contact, and the attribute definitions describing their custom fields.
data.contactContactdata.attributesContactAttribute[]The custom field definitions.
curl https://coplace.io/api/v1/contacts/<id> \ -H "Authorization: Bearer $COPLACE_KEY"{ "data": { "contact": { "id": "…", "displayName": "…", "locale": "…", "phone": "…", "email": "…", "externalId": "…", "tags": [], "attributes": {}, "optInAt": "…", "optOutAt": "…", "blocked": true, "conversationCount": 0, "lastMessageAt": "…", "createdAt": "…", "updatedAt": "…" }, "attributes": [ {} ] }}Update a contact
PATCH/api/v1/contacts/{id}
Key role agent or above
Changes the name or the custom attributes. Fields you leave out keep their value.
Identities — phone numbers and email addresses — are not edited here: they are established by real conversations, and rewriting them would silently merge two people.
Path parameters
idstringThe contact id.
Body
fullNamestringTheir name.
attributesobjectCustom fields to set, by key.
Response
The contact, updated.
data.contactContactdata.attributesContactAttribute[]The custom field definitions.
curl -X PATCH https://coplace.io/api/v1/contacts/<id> \ -H "Authorization: Bearer $COPLACE_KEY" \ -H "Content-Type: application/json" \ -d '{ "fullName": "…", "attributes": {} }'{ "data": { "contact": { "id": "…", "displayName": "…", "locale": "…", "phone": "…", "email": "…", "externalId": "…", "tags": [], "attributes": {}, "optInAt": "…", "optOutAt": "…", "blocked": true, "conversationCount": 0, "lastMessageAt": "…", "createdAt": "…", "updatedAt": "…" }, "attributes": [ {} ] }}List notes on a contact
GET/api/v1/contacts/{id}/notes
Free-text notes your team or your software wrote about this person, newest first. Notes are never shown to the contact and never read by the collaborator.
Path parameters
idstringThe contact id.
Response
The notes, newest first.
data.itemsContactNote[]Up to 200 notes, newest first.
curl https://coplace.io/api/v1/contacts/<id>/notes \ -H "Authorization: Bearer $COPLACE_KEY"{ "data": { "items": [ {} ] }}Add a note to a contact
POST/api/v1/contacts/{id}/notes
Key role agent or above
Writes a free-text note about this person — what your CRM knows, a call summary, a warning for the team. It is signed with your key's label. The contact never sees it.
Path parameters
idstringThe contact id.
Body
bodystringrequiredThe note, 1 to 5000 characters.
Response
The note.
data.idstringThe note id.
data.bodystringThe note.
data.authorstringThe person's name or the key's label;
nullwhen the author no longer exists.data.authorKindstringWho wrote it.
userapi_keydata.createdAtstringISO 8601.
curl -X POST https://coplace.io/api/v1/contacts/<id>/notes \ -H "Authorization: Bearer $COPLACE_KEY" \ -H "Content-Type: application/json" \ -d '{ "body": "…" }'{ "data": { "id": "…", "body": "…", "author": "…", "authorKind": "user", "createdAt": "…" }}Delete a note
DEL/api/v1/contacts/{id}/notes/{noteId}
Key role agent or above
Deletes a note. Only its author — the same key, or the same person — or an admin key can.
Path parameters
idstringThe contact id.
noteIdstringThe note id.
Response
Confirmation that it is gone.
data.deletedbooleanAlways
true.
curl -X DELETE https://coplace.io/api/v1/contacts/<id>/notes/<noteId> \ -H "Authorization: Bearer $COPLACE_KEY"{ "data": { "deleted": true }}List the custom contact fields
GET/api/v1/contacts/attributes
Returns the fields this account defined on its contacts: their key, label and type. Read this before writing attributes on a contact — an unknown key is refused.
These belong to the account, so every workspace of the same client shares them.
Response
The attribute definitions.
data.itemsContactAttribute[]The definitions.
curl https://coplace.io/api/v1/contacts/attributes \ -H "Authorization: Bearer $COPLACE_KEY"{ "data": { "items": [ {} ] }}Erase a person, for good
DEL/api/v1/privacy/contacts/{id}
Key role admin or above
Irreversible. Deletes the contact, their identities, their messages and their conversations. Meant for a right-to-erasure request.
What is kept is what carries no personal data: counters, and the record that an erasure happened. The call returns a report of what was removed.
Path parameters
idstringThe contact id.
Response
A report: what was erased, and how much of it.
data.erasedbooleanAlways
true.data.removedobjectCounts removed:
identities,conversations,messages.data.emptiedobjectCounts kept for deduplication but emptied of their content.
curl -X DELETE https://coplace.io/api/v1/privacy/contacts/<id> \ -H "Authorization: Bearer $COPLACE_KEY"{ "data": { "erased": true, "removed": {}, "emptied": {} }}