curl --request PATCH \
--url https://api.protodesk.io/v1/customers/{customerId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"externalId": "renter_123",
"name": "Maya",
"email": "maya@example.com",
"phone": "+628123456789",
"company": "Bali Villa Hub",
"language": "id",
"timezone": "Asia/Jakarta",
"avatarUrl": "<string>",
"claimedEmail": "<string>",
"emailStatus": "<string>",
"lastActiveChannel": "whatsapp",
"firstContactAt": "2023-11-07T05:31:56Z",
"lastSeenAt": "2023-11-07T05:31:56Z",
"tags": [
"<string>"
],
"createdAt": "2023-11-07T05:31:56Z",
"metadata": {
"tier": "gold"
}
}
'import requests
url = "https://api.protodesk.io/v1/customers/{customerId}"
payload = {
"externalId": "renter_123",
"name": "Maya",
"email": "maya@example.com",
"phone": "+628123456789",
"company": "Bali Villa Hub",
"language": "id",
"timezone": "Asia/Jakarta",
"avatarUrl": "<string>",
"claimedEmail": "<string>",
"emailStatus": "<string>",
"lastActiveChannel": "whatsapp",
"firstContactAt": "2023-11-07T05:31:56Z",
"lastSeenAt": "2023-11-07T05:31:56Z",
"tags": ["<string>"],
"createdAt": "2023-11-07T05:31:56Z",
"metadata": { "tier": "gold" }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
externalId: 'renter_123',
name: 'Maya',
email: 'maya@example.com',
phone: '+628123456789',
company: 'Bali Villa Hub',
language: 'id',
timezone: 'Asia/Jakarta',
avatarUrl: '<string>',
claimedEmail: '<string>',
emailStatus: '<string>',
lastActiveChannel: 'whatsapp',
firstContactAt: '2023-11-07T05:31:56Z',
lastSeenAt: '2023-11-07T05:31:56Z',
tags: ['<string>'],
createdAt: '2023-11-07T05:31:56Z',
metadata: {tier: 'gold'}
})
};
fetch('https://api.protodesk.io/v1/customers/{customerId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.protodesk.io/v1/customers/{customerId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'externalId' => 'renter_123',
'name' => 'Maya',
'email' => 'maya@example.com',
'phone' => '+628123456789',
'company' => 'Bali Villa Hub',
'language' => 'id',
'timezone' => 'Asia/Jakarta',
'avatarUrl' => '<string>',
'claimedEmail' => '<string>',
'emailStatus' => '<string>',
'lastActiveChannel' => 'whatsapp',
'firstContactAt' => '2023-11-07T05:31:56Z',
'lastSeenAt' => '2023-11-07T05:31:56Z',
'tags' => [
'<string>'
],
'createdAt' => '2023-11-07T05:31:56Z',
'metadata' => [
'tier' => 'gold'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.protodesk.io/v1/customers/{customerId}"
payload := strings.NewReader("{\n \"externalId\": \"renter_123\",\n \"name\": \"Maya\",\n \"email\": \"maya@example.com\",\n \"phone\": \"+628123456789\",\n \"company\": \"Bali Villa Hub\",\n \"language\": \"id\",\n \"timezone\": \"Asia/Jakarta\",\n \"avatarUrl\": \"<string>\",\n \"claimedEmail\": \"<string>\",\n \"emailStatus\": \"<string>\",\n \"lastActiveChannel\": \"whatsapp\",\n \"firstContactAt\": \"2023-11-07T05:31:56Z\",\n \"lastSeenAt\": \"2023-11-07T05:31:56Z\",\n \"tags\": [\n \"<string>\"\n ],\n \"createdAt\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {\n \"tier\": \"gold\"\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.protodesk.io/v1/customers/{customerId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"externalId\": \"renter_123\",\n \"name\": \"Maya\",\n \"email\": \"maya@example.com\",\n \"phone\": \"+628123456789\",\n \"company\": \"Bali Villa Hub\",\n \"language\": \"id\",\n \"timezone\": \"Asia/Jakarta\",\n \"avatarUrl\": \"<string>\",\n \"claimedEmail\": \"<string>\",\n \"emailStatus\": \"<string>\",\n \"lastActiveChannel\": \"whatsapp\",\n \"firstContactAt\": \"2023-11-07T05:31:56Z\",\n \"lastSeenAt\": \"2023-11-07T05:31:56Z\",\n \"tags\": [\n \"<string>\"\n ],\n \"createdAt\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {\n \"tier\": \"gold\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.protodesk.io/v1/customers/{customerId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"externalId\": \"renter_123\",\n \"name\": \"Maya\",\n \"email\": \"maya@example.com\",\n \"phone\": \"+628123456789\",\n \"company\": \"Bali Villa Hub\",\n \"language\": \"id\",\n \"timezone\": \"Asia/Jakarta\",\n \"avatarUrl\": \"<string>\",\n \"claimedEmail\": \"<string>\",\n \"emailStatus\": \"<string>\",\n \"lastActiveChannel\": \"whatsapp\",\n \"firstContactAt\": \"2023-11-07T05:31:56Z\",\n \"lastSeenAt\": \"2023-11-07T05:31:56Z\",\n \"tags\": [\n \"<string>\"\n ],\n \"createdAt\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {\n \"tier\": \"gold\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "cus_x6q5vl75f5d53m7oet2k4r5w6a",
"externalId": "renter_123",
"name": "Maya",
"email": "maya@example.com",
"phone": "+628123456789",
"company": "Bali Villa Hub",
"language": "id",
"timezone": "Asia/Jakarta",
"avatarUrl": "https://cdn.example.com/avatars/maya.png",
"claimedEmail": "<string>",
"emailStatus": "<string>",
"lastActiveChannel": "whatsapp",
"firstContactAt": "2023-11-07T05:31:56Z",
"lastSeenAt": "2023-11-07T05:31:56Z",
"tags": [
"<string>"
],
"metadata": {},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"conversationCount": 123
}{
"error": {
"code": "route.not_found",
"message": "Not found",
"requestId": "req_x6q5vl75f5d53m7oet2k4r5w6a"
}
}Update a customer
curl --request PATCH \
--url https://api.protodesk.io/v1/customers/{customerId} \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"externalId": "renter_123",
"name": "Maya",
"email": "maya@example.com",
"phone": "+628123456789",
"company": "Bali Villa Hub",
"language": "id",
"timezone": "Asia/Jakarta",
"avatarUrl": "<string>",
"claimedEmail": "<string>",
"emailStatus": "<string>",
"lastActiveChannel": "whatsapp",
"firstContactAt": "2023-11-07T05:31:56Z",
"lastSeenAt": "2023-11-07T05:31:56Z",
"tags": [
"<string>"
],
"createdAt": "2023-11-07T05:31:56Z",
"metadata": {
"tier": "gold"
}
}
'import requests
url = "https://api.protodesk.io/v1/customers/{customerId}"
payload = {
"externalId": "renter_123",
"name": "Maya",
"email": "maya@example.com",
"phone": "+628123456789",
"company": "Bali Villa Hub",
"language": "id",
"timezone": "Asia/Jakarta",
"avatarUrl": "<string>",
"claimedEmail": "<string>",
"emailStatus": "<string>",
"lastActiveChannel": "whatsapp",
"firstContactAt": "2023-11-07T05:31:56Z",
"lastSeenAt": "2023-11-07T05:31:56Z",
"tags": ["<string>"],
"createdAt": "2023-11-07T05:31:56Z",
"metadata": { "tier": "gold" }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
externalId: 'renter_123',
name: 'Maya',
email: 'maya@example.com',
phone: '+628123456789',
company: 'Bali Villa Hub',
language: 'id',
timezone: 'Asia/Jakarta',
avatarUrl: '<string>',
claimedEmail: '<string>',
emailStatus: '<string>',
lastActiveChannel: 'whatsapp',
firstContactAt: '2023-11-07T05:31:56Z',
lastSeenAt: '2023-11-07T05:31:56Z',
tags: ['<string>'],
createdAt: '2023-11-07T05:31:56Z',
metadata: {tier: 'gold'}
})
};
fetch('https://api.protodesk.io/v1/customers/{customerId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.protodesk.io/v1/customers/{customerId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'externalId' => 'renter_123',
'name' => 'Maya',
'email' => 'maya@example.com',
'phone' => '+628123456789',
'company' => 'Bali Villa Hub',
'language' => 'id',
'timezone' => 'Asia/Jakarta',
'avatarUrl' => '<string>',
'claimedEmail' => '<string>',
'emailStatus' => '<string>',
'lastActiveChannel' => 'whatsapp',
'firstContactAt' => '2023-11-07T05:31:56Z',
'lastSeenAt' => '2023-11-07T05:31:56Z',
'tags' => [
'<string>'
],
'createdAt' => '2023-11-07T05:31:56Z',
'metadata' => [
'tier' => 'gold'
]
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.protodesk.io/v1/customers/{customerId}"
payload := strings.NewReader("{\n \"externalId\": \"renter_123\",\n \"name\": \"Maya\",\n \"email\": \"maya@example.com\",\n \"phone\": \"+628123456789\",\n \"company\": \"Bali Villa Hub\",\n \"language\": \"id\",\n \"timezone\": \"Asia/Jakarta\",\n \"avatarUrl\": \"<string>\",\n \"claimedEmail\": \"<string>\",\n \"emailStatus\": \"<string>\",\n \"lastActiveChannel\": \"whatsapp\",\n \"firstContactAt\": \"2023-11-07T05:31:56Z\",\n \"lastSeenAt\": \"2023-11-07T05:31:56Z\",\n \"tags\": [\n \"<string>\"\n ],\n \"createdAt\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {\n \"tier\": \"gold\"\n }\n}")
req, _ := http.NewRequest("PATCH", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.patch("https://api.protodesk.io/v1/customers/{customerId}")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"externalId\": \"renter_123\",\n \"name\": \"Maya\",\n \"email\": \"maya@example.com\",\n \"phone\": \"+628123456789\",\n \"company\": \"Bali Villa Hub\",\n \"language\": \"id\",\n \"timezone\": \"Asia/Jakarta\",\n \"avatarUrl\": \"<string>\",\n \"claimedEmail\": \"<string>\",\n \"emailStatus\": \"<string>\",\n \"lastActiveChannel\": \"whatsapp\",\n \"firstContactAt\": \"2023-11-07T05:31:56Z\",\n \"lastSeenAt\": \"2023-11-07T05:31:56Z\",\n \"tags\": [\n \"<string>\"\n ],\n \"createdAt\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {\n \"tier\": \"gold\"\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.protodesk.io/v1/customers/{customerId}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"externalId\": \"renter_123\",\n \"name\": \"Maya\",\n \"email\": \"maya@example.com\",\n \"phone\": \"+628123456789\",\n \"company\": \"Bali Villa Hub\",\n \"language\": \"id\",\n \"timezone\": \"Asia/Jakarta\",\n \"avatarUrl\": \"<string>\",\n \"claimedEmail\": \"<string>\",\n \"emailStatus\": \"<string>\",\n \"lastActiveChannel\": \"whatsapp\",\n \"firstContactAt\": \"2023-11-07T05:31:56Z\",\n \"lastSeenAt\": \"2023-11-07T05:31:56Z\",\n \"tags\": [\n \"<string>\"\n ],\n \"createdAt\": \"2023-11-07T05:31:56Z\",\n \"metadata\": {\n \"tier\": \"gold\"\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "cus_x6q5vl75f5d53m7oet2k4r5w6a",
"externalId": "renter_123",
"name": "Maya",
"email": "maya@example.com",
"phone": "+628123456789",
"company": "Bali Villa Hub",
"language": "id",
"timezone": "Asia/Jakarta",
"avatarUrl": "https://cdn.example.com/avatars/maya.png",
"claimedEmail": "<string>",
"emailStatus": "<string>",
"lastActiveChannel": "whatsapp",
"firstContactAt": "2023-11-07T05:31:56Z",
"lastSeenAt": "2023-11-07T05:31:56Z",
"tags": [
"<string>"
],
"metadata": {},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z",
"conversationCount": 123
}{
"error": {
"code": "route.not_found",
"message": "Not found",
"requestId": "req_x6q5vl75f5d53m7oet2k4r5w6a"
}
}Authorizations
Use a workspace API key in the Authorization header. Keys use pk_live_<key_id> for production and pk_test<key_id>_ for test mode.
Path Parameters
"cus_x6q5vl75f5d53m7oet2k4r5w6a"
Body
Omitted fields are left unchanged. Empty externalId clears the external id.
Your stable id for this customer. Send an empty string to clear it.
"renter_123"
"Maya"
"maya@example.com"
"+628123456789"
"Bali Villa Hub"
"id"
"Asia/Jakarta"
An email the customer claimed but that is not verified.
Email deliverability/suppression state.
"whatsapp"
Backdates the record when it is first created (import semantics); ignored if the customer already exists.
Replaces the full customer metadata object. Evelin reads account context only from the reserved tenant object and only permits id, name, plan, status, domain, region, createdAt, and updatedAt.
{ "tier": "gold" }
Response
Updated customer.
Every key is always present; optional fields are null when unset (never empty strings).
"cus_x6q5vl75f5d53m7oet2k4r5w6a"
"renter_123"
"Maya"
"maya@example.com"
"+628123456789"
"Bali Villa Hub"
"id"
"Asia/Jakarta"
"https://cdn.example.com/avatars/maya.png"
An email the customer claimed but that is not verified.
Email deliverability/suppression state (e.g. active, unsubscribed, bounced).
"whatsapp"
Number of conversations for this customer. Present on list responses only.
