curl --request POST \
--url https://app.thinnest.ai/api/v1/customers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Sunrise Dental Clinic",
"externalId": "clinic-0042",
"metadata": {
"city": "Pune",
"tier": "gold",
"seats": 3
},
"timezone": "Asia/Kolkata"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Sunrise Dental Clinic',
externalId: 'clinic-0042',
metadata: {city: 'Pune', tier: 'gold', seats: 3},
timezone: 'Asia/Kolkata'
})
};
fetch('https://app.thinnest.ai/api/v1/customers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.thinnest.ai/api/v1/customers"
payload = {
"name": "Sunrise Dental Clinic",
"externalId": "clinic-0042",
"metadata": {
"city": "Pune",
"tier": "gold",
"seats": 3
},
"timezone": "Asia/Kolkata"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "org_5b2f9c1e-8a4d-4f7b-9e3a-2c6d1f0a7b84",
"name": "Sunrise Dental Clinic",
"externalId": "clinic-0042",
"metadata": {
"city": "Pune",
"tier": "gold",
"seats": 3
},
"timezone": "Asia/Kolkata",
"allottedCallLines": null,
"archivedAt": null,
"eraseAfter": null,
"createdAt": "2026-10-06T09:30:12.881Z"
}{
"error": "`externalId` is your own id for this customer: 1-128 letters, digits, `.`, `_`, `:` or `-`."
}{
"error": "Send a valid API key as `Authorization: Bearer <key>`."
}{
"error": "This plan includes 3 customers. Upgrade to add more, or delete one you no longer need."
}{
"error": "This API key is read-only: it can read everything but change nothing."
}{
"error": "A customer with externalId `clinic-0042` already exists."
}{
"error": "Over 240 requests a minute. Slow down and retry."
}Create Customer
Creates a workspace for one of your customers and answers with its id — send that id as Thinnest-Workspace to act inside it. Your first customer makes your workspace a developer workspace; everything a customer uses (calls, messages, replies, number rental) is charged to your balance at your plan’s prices, and your plan caps how many customers you may have (3 on Free and pay-as-you-go, 100 on Pro, 1,000 on Scale, 10,000 on Enterprise; a deleted customer counts until it is erased). Send an Idempotency-Key so a retry never makes a second workspace. Needs a full key.
curl --request POST \
--url https://app.thinnest.ai/api/v1/customers \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "Sunrise Dental Clinic",
"externalId": "clinic-0042",
"metadata": {
"city": "Pune",
"tier": "gold",
"seats": 3
},
"timezone": "Asia/Kolkata"
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'Sunrise Dental Clinic',
externalId: 'clinic-0042',
metadata: {city: 'Pune', tier: 'gold', seats: 3},
timezone: 'Asia/Kolkata'
})
};
fetch('https://app.thinnest.ai/api/v1/customers', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.thinnest.ai/api/v1/customers"
payload = {
"name": "Sunrise Dental Clinic",
"externalId": "clinic-0042",
"metadata": {
"city": "Pune",
"tier": "gold",
"seats": 3
},
"timezone": "Asia/Kolkata"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "org_5b2f9c1e-8a4d-4f7b-9e3a-2c6d1f0a7b84",
"name": "Sunrise Dental Clinic",
"externalId": "clinic-0042",
"metadata": {
"city": "Pune",
"tier": "gold",
"seats": 3
},
"timezone": "Asia/Kolkata",
"allottedCallLines": null,
"archivedAt": null,
"eraseAfter": null,
"createdAt": "2026-10-06T09:30:12.881Z"
}{
"error": "`externalId` is your own id for this customer: 1-128 letters, digits, `.`, `_`, `:` or `-`."
}{
"error": "Send a valid API key as `Authorization: Bearer <key>`."
}{
"error": "This plan includes 3 customers. Upgrade to add more, or delete one you no longer need."
}{
"error": "This API key is read-only: it can read everything but change nothing."
}{
"error": "A customer with externalId `clinic-0042` already exists."
}{
"error": "Over 240 requests a minute. Slow down and retry."
}Authorizations
Your API key (ta_live_…) from Settings → API keys, sent as Authorization: Bearer <key>. Keep it on a server: it can message every customer you have. A key is full, build or read-only; a request its level does not allow is refused with 403.
Headers
Any unique string. A retry with the same key within 24 hours returns the first request's answer instead of acting twice.
255Body
The customer's name, as your dashboard shows it. Trimmed.
1 - 120"Sunrise Dental Clinic"
Your own id for this customer: 1-128 letters, digits, ., _, : or -. Unique among your customers, and filterable on List Customers.
128^[A-Za-z0-9._:-]{1,128}$"clinic-0042"
Your own flat key-value data about the customer: up to 50 keys of 1-40 characters, each value a string (up to 500 characters), a number or a boolean. No nested objects or lists; 8 KB in all.
Show child attributes
Show child attributes
{
"city": "Pune",
"tier": "gold",
"seats": 3
}
An IANA time zone such as Asia/Kolkata or Europe/London. Leave it out for the default.
"Asia/Kolkata"
The same as the Idempotency-Key header, for clients that cannot set headers. The header wins when both are sent.
255Response
The customer was created.
A workspace you created for one of your customers.
The customer's id (org_…). Send it as Thinnest-Workspace to act inside this customer.
"org_5b2f9c1e-8a4d-4f7b-9e3a-2c6d1f0a7b84"
The customer's name.
120"Sunrise Dental Clinic"
Your own id for this customer, unique among your customers; null when you gave none.
"clinic-0042"
Your own flat key-value data about the customer: up to 50 keys of 1-40 characters, each value a string (up to 500 characters), a number or a boolean. No nested objects or lists; 8 KB in all.
Show child attributes
Show child attributes
{
"city": "Pune",
"tier": "gold",
"seats": 3
}
The customer's IANA time zone; every date its console shows is in it.
"Asia/Kolkata"
How many of your call lines this customer may use at once; null for no cap.
x >= 02
When the customer was deleted; null while it is live.
null
When a deleted customer will be erased for good (30 days after deletion); null while it is live.
null
When the customer was created.
"2026-10-02T06:14:22.418Z"