Contacts
Contacts are the people you chat with in the Team Inbox (on WhatsApp and the other channels), whether or not they are clients.
- Create or update:
POST /v1/contactscreates a contact, or updates the contact with the same phone number on the same channel in that location (createdsays which).channeliswhatsapp(default) orsms; an SMS contact needs the location's SMS provider in two-way mode. - Partial updates:
PUTchanges only the fields you send. - Tags can start automations.
- Assign chat hands the conversation to a team member and marks it open.
The {id} in a path is the record id returned by the API (for example 5tw9zcQkbu), not the client number shown in the app.
api.whautomate.comSearch contacts
/v1/contactsLists contacts, newest first.
x-api-keystringrequiredlimitintegertagsstringlocationIdstringpageintegerchannelstringwhatsapp or sms.searchTextstringidstringnamestringrequiredphoneNumberstringrequiredchannelstringlocationobjectrequiredstageobjectnotesobjectcustomFieldsobjecttagsstring[]createdbooleanlastActivitystringcreatedAtstringupdatedAtstringcurl -X GET "https://api.whautomate.com/v1/contacts?locationId=Le6dWjQF9K&channel=whatsapp&limit=2" \
-H "x-api-key: YOUR_API_KEY"
[
{
"id": "v2yXLlZMP2",
"name": "Olivia Tan",
"channel": "whatsapp",
"phoneNumber": "6593104000",
"lastActivity": "2026-10-29T11:40:25.007Z",
"stage": "Lead",
"tags": [
"booking"
],
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"createdAt": "2026-10-29T11:43:44.431Z",
"updatedAt": "2026-10-29T12:01:33.495Z"
},
{
"id": "sGvPiEd3QY",
"name": "Ethan Ng",
"channel": "whatsapp",
"phoneNumber": "6593104977",
"lastActivity": "2026-10-29T11:29:25.183Z",
"stage": "Customer",
"tags": [
"booking"
],
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"createdAt": "2026-10-29T11:43:25.044Z",
"updatedAt": "2026-10-29T11:43:28.413Z"
}
]
Get a contact
/v1/contacts/{contactId}Gets one contact by id.
x-api-keystringrequiredcontactIdstringrequiredidstringnamestringrequiredphoneNumberstringrequiredchannelstringlocationobjectrequiredstageobjectnotesobjectcustomFieldsobjecttagsstring[]createdbooleanlastActivitystringcreatedAtstringupdatedAtstringcurl -X GET "https://api.whautomate.com/v1/contacts/NSasDKs69e" \
-H "x-api-key: YOUR_API_KEY"
{
"id": "NSasDKs69e",
"name": "Arjun Menon",
"channel": "whatsapp",
"phoneNumber": "6598812046",
"lastActivity": "2026-10-29T12:40:11.019Z",
"notes": "Asked about corporate packages.",
"tags": [
"Price enquiry"
],
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"createdAt": "2026-10-29T12:40:11.026Z",
"updatedAt": "2026-10-29T12:40:11.026Z"
}
Create or update a contact
/v1/contactsCreates a contact, or updates (partial) the contact with the same phone on the same channel in that location; created says which. channel whatsapp (default) or sms (SMS inbox contact, needs the location's SMS provider active in two-way mode, else 400).
x-api-keystringrequiredidstringnamestringrequiredphoneNumberstringrequiredchannelstringlocationobjectrequiredstageobjectnotesobjectcustomFieldsobjecttagsobjectcreatedbooleanidstringnamestringrequiredphoneNumberstringrequiredchannelstringlocationobjectrequiredstageobjectnotesobjectcustomFieldsobjecttagsstring[]createdbooleanlastActivitystringcreatedAtstringupdatedAtstringcurl -X POST "https://api.whautomate.com/v1/contacts" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Arjun Menon",
"phoneNumber": "6598812046",
"location": {
"id": "Le6dWjQF9K"
},
"tags": [
"Price enquiry"
],
"notes": "Asked about corporate packages."
}'
{
"id": "NSasDKs69e",
"name": "Arjun Menon",
"channel": "whatsapp",
"phoneNumber": "6598812046",
"lastActivity": "2026-10-29T12:40:11.019Z",
"notes": "Asked about corporate packages.",
"tags": [
"Price enquiry"
],
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"createdAt": "2026-10-29T12:40:11.026Z",
"updatedAt": "2026-10-29T12:40:11.026Z",
"created": true
}
Update a contact
/v1/contacts/{contactId}Updates a contact. Only the fields you send change. The phone number of a WhatsApp or SMS contact cannot change (it identifies the chat).
x-api-keystringrequiredcontactIdstringrequiredidstringnamestringphoneNumberstringchannelstringlocationobjectstageobjectnotesobjectcustomFieldsobjecttagsobjectcreatedbooleanidstringnamestringrequiredphoneNumberstringrequiredchannelstringlocationobjectrequiredstageobjectnotesobjectcustomFieldsobjecttagsstring[]createdbooleanlastActivitystringcreatedAtstringupdatedAtstringcurl -X PUT "https://api.whautomate.com/v1/contacts/NSasDKs69e" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"stage": "Lead",
"notes": "Asked about corporate packages for 20 staff."
}'
{
"id": "NSasDKs69e",
"name": "Arjun Menon",
"channel": "whatsapp",
"phoneNumber": "6598812046",
"lastActivity": "2026-10-29T12:40:11.019Z",
"notes": "Asked about corporate packages for 20 staff.",
"stage": "Lead",
"tags": [
"Price enquiry"
],
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"createdAt": "2026-10-29T12:40:11.026Z",
"updatedAt": "2026-10-29T12:40:11.321Z"
}
Delete a contact
/v1/contacts/{contactId}Deletes a contact.
x-api-keystringrequiredcontactIdstringrequiredsuccessbooleancurl -X DELETE "https://api.whautomate.com/v1/contacts/NSasDKs69e" \
-H "x-api-key: YOUR_API_KEY"
{
"success": true
}
Add tags to a contact
/v1/contacts/{contactId}/tags/addAdds tags to a contact. Unknown tags are created. Adding a tag can start automations.
x-api-keystringrequiredtagsstring[]requiredidstringtagsstring[]curl -X POST "https://api.whautomate.com/v1/contacts/NSasDKs69e/tags/add" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tags": [
"Corporate",
"Hot lead"
]
}'
{
"id": "NSasDKs69e",
"tags": [
"Price enquiry",
"Corporate"
]
}
Remove tags from a contact
/v1/contacts/{contactId}/tags/removeRemoves tags from a contact.
x-api-keystringrequiredtagsstring[]requiredidstringtagsstring[]curl -X POST "https://api.whautomate.com/v1/contacts/NSasDKs69e/tags/remove" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"tags": [
"Price enquiry"
]
}'
{
"id": "NSasDKs69e",
"tags": [
"Corporate",
"Hot lead"
]
}
Assign a contact's chat
/v1/contacts/{contactId}/assign-chatAssigns a contact's conversation to a team member and marks it as open, for example after a lead is qualified in your own system. Get the staffId from Staffs.
x-api-keystringrequiredcontactIdstringrequiredstaffIdstringrequiredidstringsuccessbooleancurl -X POST "https://api.whautomate.com/v1/contacts/NSasDKs69e/assign-chat" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"staffId": "XCRbjjnGrB"
}'
{
"id": "NSasDKs69e",
"success": true
}
Bulk
Bulk endpoints take up to 100 items and run each one through the single endpoint (same checks and plan limits). They answer 200 with a result per item, so check failed. Bulk calls run no automations; webhooks still fire.
Create or update contacts in bulk
/v1/contacts/bulkCreates contacts, or updates the contact with the same phone on the same channel (channel whatsapp, the default, or sms, as POST /v1/contacts) in that location (partial; each result data has created true or false). Up to 100 items, run one by one through the single route (same validation and plan limits, per item deactivated location check). Bulk runs no automations; webhooks still fire.
x-api-keystringrequireditemsobject[]requiredUp to 100 contact create bodies, the same as POST /v1/contacts
succeededintegerfailedintegerresultsobject[]curl -X POST "https://api.whautomate.com/v1/contacts/bulk" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"name": "Mei Chen",
"phoneNumber": "6591835507",
"location": {
"id": "Le6dWjQF9K"
},
"tags": [
"Instagram ad"
]
},
{
"name": "Farid Hassan",
"location": {
"id": "Le6dWjQF9K"
}
}
]
}'
{
"succeeded": 1,
"failed": 1,
"results": [
{
"index": 0,
"ok": true,
"status": 200,
"data": {
"id": "ABo2fvzCBz",
"name": "Mei Chen",
"channel": "whatsapp",
"phoneNumber": "6591835507",
"lastActivity": "2026-10-29T12:40:11.782Z",
"tags": [
"Instagram ad"
],
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"createdAt": "2026-10-29T12:40:11.786Z",
"updatedAt": "2026-10-29T12:40:11.786Z",
"created": true
}
},
{
"index": 1,
"ok": false,
"status": 400,
"error": "Invalid parameters"
}
]
}
Update contacts in bulk
/v1/contacts/bulk/updateUpdates contacts partially (as PUT /v1/contacts/{contactId}); every item needs id. Up to 100 items, run one by one through the single route (same validation and plan limits, per item deactivated location check). Bulk runs no automations; webhooks still fire.
x-api-keystringrequireditemsobject[]requiredUp to 100 update bodies, the same as PUT /v1/contacts/{contactId}, each with the record id
succeededintegerfailedintegerresultsobject[]curl -X POST "https://api.whautomate.com/v1/contacts/bulk/update" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"id": "ABo2fvzCBz",
"stage": "Lead"
},
{
"id": "doesNotExist1",
"notes": "Call back on Monday"
}
]
}'
{
"succeeded": 1,
"failed": 1,
"results": [
{
"index": 0,
"ok": true,
"status": 200,
"data": {
"id": "ABo2fvzCBz",
"name": "Mei Chen",
"channel": "whatsapp",
"phoneNumber": "6591835507",
"lastActivity": "2026-10-29T12:40:11.782Z",
"stage": "Lead",
"tags": [
"Instagram ad"
],
"location": {
"id": "Le6dWjQF9K",
"title": "Serene Wellness Studio"
},
"createdAt": "2026-10-29T12:40:11.786Z",
"updatedAt": "2026-10-29T12:40:11.889Z"
}
},
{
"index": 1,
"ok": false,
"status": 404,
"error": "Contact not found"
}
]
}
Delete contacts in bulk
/v1/contacts/bulk/deleteDeletes contacts by contactIds. Up to 100 items, run one by one through the single route (same validation and plan limits, per item deactivated location check). Bulk runs no automations; webhooks still fire.
x-api-keystringrequiredcontactIdsstring[]requiredsucceededintegerfailedintegerresultsobject[]curl -X POST "https://api.whautomate.com/v1/contacts/bulk/delete" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contactIds": [
"ABo2fvzCBz",
"doesNotExist1"
]
}'
{
"succeeded": 1,
"failed": 1,
"results": [
{
"index": 0,
"ok": true,
"status": 200,
"data": {
"success": true
}
},
{
"index": 1,
"ok": false,
"status": 404,
"error": "Contact not found"
}
]
}
Add tags to contacts in bulk
/v1/contacts/bulk/add-tagsAdds tags to contacts. Up to 100 items, run one by one through the single route (same validation and plan limits, per item deactivated location check). Bulk runs no automations; webhooks still fire.
x-api-keystringrequiredcontactIdsstring[]requiredtagsstring[]requiredsucceededintegerfailedintegerresultsobject[]curl -X POST "https://api.whautomate.com/v1/contacts/bulk/add-tags" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contactIds": [
"ABo2fvzCBz",
"NSasDKs69e"
],
"tags": [
"November promo"
]
}'
{
"succeeded": 2,
"failed": 0,
"results": [
{
"index": 0,
"ok": true,
"status": 200,
"data": {
"id": "ABo2fvzCBz",
"tags": [
"Instagram ad",
"November promo"
]
}
},
{
"index": 1,
"ok": true,
"status": 200,
"data": {
"id": "NSasDKs69e",
"tags": [
"Corporate",
"Hot lead"
]
}
}
]
}
Remove tags from contacts in bulk
/v1/contacts/bulk/remove-tagsRemoves tags from contacts. Up to 100 items, run one by one through the single route (same validation and plan limits, per item deactivated location check). Bulk runs no automations; webhooks still fire.
x-api-keystringrequiredcontactIdsstring[]requiredtagsstring[]requiredsucceededintegerfailedintegerresultsobject[]curl -X POST "https://api.whautomate.com/v1/contacts/bulk/remove-tags" \
-H "x-api-key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"contactIds": [
"ABo2fvzCBz",
"NSasDKs69e"
],
"tags": [
"November promo"
]
}'
{
"succeeded": 2,
"failed": 0,
"results": [
{
"index": 0,
"ok": true,
"status": 200,
"data": {
"id": "ABo2fvzCBz",
"tags": [
"Instagram ad"
]
}
},
{
"index": 1,
"ok": true,
"status": 200,
"data": {
"id": "NSasDKs69e",
"tags": [
"Corporate",
"Hot lead"
]
}
}
]
}