curl --request PUT \
--url https://api.cal.id/users/edit-profile \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"username": "john-doe",
"name": "John Doe",
"bio": "Founder at Example Inc.",
"avatarUrl": "<string>",
"timeZone": "Asia/Kolkata",
"weekStart": "Monday",
"hideBranding": false,
"allowDynamicBooking": true,
"allowSEOIndexing": true,
"receiveMonthlyDigestEmail": true,
"brandColor": "#2563EB",
"darkBrandColor": "#1E40AF",
"theme": "light",
"appTheme": "light",
"completedOnboarding": true,
"locale": "en",
"timeFormat": 12,
"disableImpersonation": false,
"metadata": {
"additionalProp1": {}
}
}
'import requests
url = "https://api.cal.id/users/edit-profile"
payload = {
"username": "john-doe",
"name": "John Doe",
"bio": "Founder at Example Inc.",
"avatarUrl": "<string>",
"timeZone": "Asia/Kolkata",
"weekStart": "Monday",
"hideBranding": False,
"allowDynamicBooking": True,
"allowSEOIndexing": True,
"receiveMonthlyDigestEmail": True,
"brandColor": "#2563EB",
"darkBrandColor": "#1E40AF",
"theme": "light",
"appTheme": "light",
"completedOnboarding": True,
"locale": "en",
"timeFormat": 12,
"disableImpersonation": False,
"metadata": { "additionalProp1": {} }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
username: 'john-doe',
name: 'John Doe',
bio: 'Founder at Example Inc.',
avatarUrl: '<string>',
timeZone: 'Asia/Kolkata',
weekStart: 'Monday',
hideBranding: false,
allowDynamicBooking: true,
allowSEOIndexing: true,
receiveMonthlyDigestEmail: true,
brandColor: '#2563EB',
darkBrandColor: '#1E40AF',
theme: 'light',
appTheme: 'light',
completedOnboarding: true,
locale: 'en',
timeFormat: 12,
disableImpersonation: false,
metadata: {additionalProp1: {}}
})
};
fetch('https://api.cal.id/users/edit-profile', 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.cal.id/users/edit-profile",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'username' => 'john-doe',
'name' => 'John Doe',
'bio' => 'Founder at Example Inc.',
'avatarUrl' => '<string>',
'timeZone' => 'Asia/Kolkata',
'weekStart' => 'Monday',
'hideBranding' => false,
'allowDynamicBooking' => true,
'allowSEOIndexing' => true,
'receiveMonthlyDigestEmail' => true,
'brandColor' => '#2563EB',
'darkBrandColor' => '#1E40AF',
'theme' => 'light',
'appTheme' => 'light',
'completedOnboarding' => true,
'locale' => 'en',
'timeFormat' => 12,
'disableImpersonation' => false,
'metadata' => [
'additionalProp1' => [
]
]
]),
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.cal.id/users/edit-profile"
payload := strings.NewReader("{\n \"username\": \"john-doe\",\n \"name\": \"John Doe\",\n \"bio\": \"Founder at Example Inc.\",\n \"avatarUrl\": \"<string>\",\n \"timeZone\": \"Asia/Kolkata\",\n \"weekStart\": \"Monday\",\n \"hideBranding\": false,\n \"allowDynamicBooking\": true,\n \"allowSEOIndexing\": true,\n \"receiveMonthlyDigestEmail\": true,\n \"brandColor\": \"#2563EB\",\n \"darkBrandColor\": \"#1E40AF\",\n \"theme\": \"light\",\n \"appTheme\": \"light\",\n \"completedOnboarding\": true,\n \"locale\": \"en\",\n \"timeFormat\": 12,\n \"disableImpersonation\": false,\n \"metadata\": {\n \"additionalProp1\": {}\n }\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.cal.id/users/edit-profile")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"username\": \"john-doe\",\n \"name\": \"John Doe\",\n \"bio\": \"Founder at Example Inc.\",\n \"avatarUrl\": \"<string>\",\n \"timeZone\": \"Asia/Kolkata\",\n \"weekStart\": \"Monday\",\n \"hideBranding\": false,\n \"allowDynamicBooking\": true,\n \"allowSEOIndexing\": true,\n \"receiveMonthlyDigestEmail\": true,\n \"brandColor\": \"#2563EB\",\n \"darkBrandColor\": \"#1E40AF\",\n \"theme\": \"light\",\n \"appTheme\": \"light\",\n \"completedOnboarding\": true,\n \"locale\": \"en\",\n \"timeFormat\": 12,\n \"disableImpersonation\": false,\n \"metadata\": {\n \"additionalProp1\": {}\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.id/users/edit-profile")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"username\": \"john-doe\",\n \"name\": \"John Doe\",\n \"bio\": \"Founder at Example Inc.\",\n \"avatarUrl\": \"<string>\",\n \"timeZone\": \"Asia/Kolkata\",\n \"weekStart\": \"Monday\",\n \"hideBranding\": false,\n \"allowDynamicBooking\": true,\n \"allowSEOIndexing\": true,\n \"receiveMonthlyDigestEmail\": true,\n \"brandColor\": \"#2563EB\",\n \"darkBrandColor\": \"#1E40AF\",\n \"theme\": \"light\",\n \"appTheme\": \"light\",\n \"completedOnboarding\": true,\n \"locale\": \"en\",\n \"timeFormat\": 12,\n \"disableImpersonation\": false,\n \"metadata\": {\n \"additionalProp1\": {}\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": 4021,
"username": "jordan-lee",
"email": "jordan.lee@example.com",
"name": "Jordan Lee",
"avatarUrl": "https://cal.id/avatar/jordan-lee.png"
},
"message": "Profile updated successfully"
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "Rate limit exceeded",
"error": {
"code": "TOO_MANY_REQUESTS",
"message": "Too many requests. Please retry after the rate limit window resets."
}
}Update your profile
Updates the authenticated user’s own profile: name, username, bio, timeZone, weekStart, locale, time format and branding fields such as brandColor, darkBrandColor and theme. Only the keys you send are changed — omitted fields keep their current values — and the response echoes the saved record (id, username, email, name, avatarUrl). Send Content-Type: application/json or the request is rejected with 415, and note that changing username rewrites every public booking link for the account.
curl --request PUT \
--url https://api.cal.id/users/edit-profile \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"username": "john-doe",
"name": "John Doe",
"bio": "Founder at Example Inc.",
"avatarUrl": "<string>",
"timeZone": "Asia/Kolkata",
"weekStart": "Monday",
"hideBranding": false,
"allowDynamicBooking": true,
"allowSEOIndexing": true,
"receiveMonthlyDigestEmail": true,
"brandColor": "#2563EB",
"darkBrandColor": "#1E40AF",
"theme": "light",
"appTheme": "light",
"completedOnboarding": true,
"locale": "en",
"timeFormat": 12,
"disableImpersonation": false,
"metadata": {
"additionalProp1": {}
}
}
'import requests
url = "https://api.cal.id/users/edit-profile"
payload = {
"username": "john-doe",
"name": "John Doe",
"bio": "Founder at Example Inc.",
"avatarUrl": "<string>",
"timeZone": "Asia/Kolkata",
"weekStart": "Monday",
"hideBranding": False,
"allowDynamicBooking": True,
"allowSEOIndexing": True,
"receiveMonthlyDigestEmail": True,
"brandColor": "#2563EB",
"darkBrandColor": "#1E40AF",
"theme": "light",
"appTheme": "light",
"completedOnboarding": True,
"locale": "en",
"timeFormat": 12,
"disableImpersonation": False,
"metadata": { "additionalProp1": {} }
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
username: 'john-doe',
name: 'John Doe',
bio: 'Founder at Example Inc.',
avatarUrl: '<string>',
timeZone: 'Asia/Kolkata',
weekStart: 'Monday',
hideBranding: false,
allowDynamicBooking: true,
allowSEOIndexing: true,
receiveMonthlyDigestEmail: true,
brandColor: '#2563EB',
darkBrandColor: '#1E40AF',
theme: 'light',
appTheme: 'light',
completedOnboarding: true,
locale: 'en',
timeFormat: 12,
disableImpersonation: false,
metadata: {additionalProp1: {}}
})
};
fetch('https://api.cal.id/users/edit-profile', 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.cal.id/users/edit-profile",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'username' => 'john-doe',
'name' => 'John Doe',
'bio' => 'Founder at Example Inc.',
'avatarUrl' => '<string>',
'timeZone' => 'Asia/Kolkata',
'weekStart' => 'Monday',
'hideBranding' => false,
'allowDynamicBooking' => true,
'allowSEOIndexing' => true,
'receiveMonthlyDigestEmail' => true,
'brandColor' => '#2563EB',
'darkBrandColor' => '#1E40AF',
'theme' => 'light',
'appTheme' => 'light',
'completedOnboarding' => true,
'locale' => 'en',
'timeFormat' => 12,
'disableImpersonation' => false,
'metadata' => [
'additionalProp1' => [
]
]
]),
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.cal.id/users/edit-profile"
payload := strings.NewReader("{\n \"username\": \"john-doe\",\n \"name\": \"John Doe\",\n \"bio\": \"Founder at Example Inc.\",\n \"avatarUrl\": \"<string>\",\n \"timeZone\": \"Asia/Kolkata\",\n \"weekStart\": \"Monday\",\n \"hideBranding\": false,\n \"allowDynamicBooking\": true,\n \"allowSEOIndexing\": true,\n \"receiveMonthlyDigestEmail\": true,\n \"brandColor\": \"#2563EB\",\n \"darkBrandColor\": \"#1E40AF\",\n \"theme\": \"light\",\n \"appTheme\": \"light\",\n \"completedOnboarding\": true,\n \"locale\": \"en\",\n \"timeFormat\": 12,\n \"disableImpersonation\": false,\n \"metadata\": {\n \"additionalProp1\": {}\n }\n}")
req, _ := http.NewRequest("PUT", 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.put("https://api.cal.id/users/edit-profile")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"username\": \"john-doe\",\n \"name\": \"John Doe\",\n \"bio\": \"Founder at Example Inc.\",\n \"avatarUrl\": \"<string>\",\n \"timeZone\": \"Asia/Kolkata\",\n \"weekStart\": \"Monday\",\n \"hideBranding\": false,\n \"allowDynamicBooking\": true,\n \"allowSEOIndexing\": true,\n \"receiveMonthlyDigestEmail\": true,\n \"brandColor\": \"#2563EB\",\n \"darkBrandColor\": \"#1E40AF\",\n \"theme\": \"light\",\n \"appTheme\": \"light\",\n \"completedOnboarding\": true,\n \"locale\": \"en\",\n \"timeFormat\": 12,\n \"disableImpersonation\": false,\n \"metadata\": {\n \"additionalProp1\": {}\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cal.id/users/edit-profile")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"username\": \"john-doe\",\n \"name\": \"John Doe\",\n \"bio\": \"Founder at Example Inc.\",\n \"avatarUrl\": \"<string>\",\n \"timeZone\": \"Asia/Kolkata\",\n \"weekStart\": \"Monday\",\n \"hideBranding\": false,\n \"allowDynamicBooking\": true,\n \"allowSEOIndexing\": true,\n \"receiveMonthlyDigestEmail\": true,\n \"brandColor\": \"#2563EB\",\n \"darkBrandColor\": \"#1E40AF\",\n \"theme\": \"light\",\n \"appTheme\": \"light\",\n \"completedOnboarding\": true,\n \"locale\": \"en\",\n \"timeFormat\": 12,\n \"disableImpersonation\": false,\n \"metadata\": {\n \"additionalProp1\": {}\n }\n}"
response = http.request(request)
puts response.read_body{
"success": true,
"data": {
"id": 4021,
"username": "jordan-lee",
"email": "jordan.lee@example.com",
"name": "Jordan Lee",
"avatarUrl": "https://cal.id/avatar/jordan-lee.png"
},
"message": "Profile updated successfully"
}{
"success": false,
"message": "<string>",
"error": {
"code": "<string>",
"message": "<string>",
"details": "<unknown>"
}
}{
"success": false,
"message": "Rate limit exceeded",
"error": {
"code": "TOO_MANY_REQUESTS",
"message": "Too many requests. Please retry after the rate limit window resets."
}
}Authorizations
Use the Authorization header with Bearer scheme.
Examples:
- API Key: Authorization: Bearer calid_xxxxx
Body
Public username slug shown on profile and booking pages.
"john-doe"
Display name for the user profile.
50"John Doe"
Short public profile biography.
"Founder at Example Inc."
IANA time zone used for schedules and booking display.
"Asia/Kolkata"
Preferred first day of week in calendar views.
"Monday"
Hide platform branding on booking pages and emails.
false
Allow dynamic booking behavior based on availability.
true
Allow search engines to index the public booking page.
true
Receive monthly usage and activity digest emails.
true
Primary brand color used on booking pages.
"#2563EB"
Brand color used for dark theme contexts.
"#1E40AF"
UI theme for the user profile.
light, dark "light"
Application theme preference for supported clients.
"light"
Marks onboarding as completed for the user.
true
Locale code used for formatting and localized content.
"en"
Preferred hour format. Typical values are 12 or 24.
12
Prevent admin impersonation for this user when enabled.
false
Flexible metadata object for advanced profile settings.
Show child attributes
Show child attributes
{ "additionalProp1": {} }
Was this page helpful?