Contacts & CRM
Contacts
Contacts are the account's phonebook: the names shown on inbound calls, the entries behind click-to-call, SMS recipients and the source for CRM matching. A contact has up to five phone numbers, an optional email and address, and belongs to any number of groups and organizations. It is either shared with the whole account or private to the user who owns it.
Contacts have two endpoint families: /v3/contacts…, which the NUACOM portal uses throughout and which you should prefer, and the older /v2/contacts…, which has the same request and response shape but a narrower perPage choice and is not used by any NUACOM client.
Workflow (what the portal does)
- List and search:
GET /v3/contactswithpage,perPage(1–500),sort(-idby default in the portal;first_name,last_name,email,organizationare also allowed), andfilter[...]:search(name, number, email or organization),visibility(all,public,private),group[],organization[], plus exact or~-prefixed partial matches on individual fields. Unknown filters and sorts answer400. - Create:
POST /v3/contactswithfirst_nameorlast_name,phones[](international format, at most five) oremail, optionaladdress_1…address_4,post_code,country(ISO 3166-1 alpha-2),comments,birthdate,groups[],organizations[]andprivate. Pick group and organization ids fromGET /v3/contacts/groupsandGET /v3/contacts/organizations. - Read and edit:
GET /v3/contacts/{contactId}, thenPUT /v3/contacts/{contactId}with the complete contact: the update replaces every phone and address field with what you send. - Group and organization membership:
PUT /v3/contacts/{contactId}/groupsreplaces a contact's groups;POST /v3/groups/contacts/bulkadds many contacts to many groups;POST /v3/contacts/organizations/bulkandDELETE /v3/contacts/organizations/bulkdo the same for organizations. - Visibility:
POST /v3/contacts/bulk/visibilitywithcontacts[]andvisibleshares a contact (true) or makes it private to you (false). - Delete:
DELETE /v3/contacts/{contactId}for one contact,DELETE /v3/contactswithcontacts[]for many. Deletes are soft:filter[trashed]=withoronlyshows deleted contacts. - Bulk import:
POST /v3/contacts/importwith a CSV, XLS or XLSX file and the 0-based column indexes (first_name_index,last_name_index,phone_indexes[],email_index, …), optionalgroup_ids[]andprivate_user_id. Up to 100 rows are processed in the request; larger files answerisAsync: truewith animportIdto poll atGET /v3/contacts/import/status/{importId}(pending,processing,completed,failed, withprogress). - Export:
GET /v3/contacts/exportaccepts the list'sfilterandsort, builds the CSV in the background and emails it to the requesting user (204).
Related: GET /v3/contacts/activity returns a contact's recent calls and SMS; GET /v2/phonebook/name-by-number resolves a number to a shared contact's name (cached for 24 hours); the inbound call log carries the contact id and name of each call.
Roles and access
- Every endpoint above is open to any authenticated user of the account. Handing one user's private contacts to another before that user is deleted is done in the portal when the user is removed.
- Private contacts of other users are hidden from the list, the export and
show(which answers404). An API key sees the contacts its creator sees.
Pitfalls
- Phone numbers are stored as digits with the country code and no
+(353861234567), and are returned that way inphones[].phone_number. Send them in international format (+353861234567or00353…) when creating or updating; a national number such as0861234567fails validation. The importer is more lenient and reads numbers in the user's country. - There is no duplicate detection: creating or importing the same person twice gives two contacts.
PUTis a full replacement. Omittingemail,commentsor the address clears them; omittingprivatemakes the contact shared.perPagediffers:/v3/contactsaccepts 1–500,/v2/contactsonly15,50,100or-1("all", capped at 1000 rows,422above that).- Names imported from files are HTML-encoded (
O'Brien); decode them client-side. - A row is imported only if it has a name and at least one valid number; email-only rows are skipped, unlike manual creation.
POST /v3/contacts/importskips the header row,POST /v2/phonebook/importdoes not. - The export CSV holds only the first mobile and the first landline of each contact.