curl --request POST \
--url https://api.assistable.ai/v3/assistants \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"prompt": "<string>",
"temperature": 1,
"voice_id": "<string>",
"language": "<string>",
"voice_enabled": true,
"inbound_greeting": "<string>",
"outbound_greeting": "<string>",
"platform_tools": [
"<string>"
],
"voice_settings": {
"inbound_opening_message": "<string>",
"outbound_opening_message": "<string>",
"voicemail_message": "<string>",
"enable_voicemail_detection": true
},
"subaccount_id": "<string>",
"location_id": "<string>"
}
'import requests
url = "https://api.assistable.ai/v3/assistants"
payload = {
"name": "<string>",
"description": "<string>",
"prompt": "<string>",
"temperature": 1,
"voice_id": "<string>",
"language": "<string>",
"voice_enabled": True,
"inbound_greeting": "<string>",
"outbound_greeting": "<string>",
"platform_tools": ["<string>"],
"voice_settings": {
"inbound_opening_message": "<string>",
"outbound_opening_message": "<string>",
"voicemail_message": "<string>",
"enable_voicemail_detection": True
},
"subaccount_id": "<string>",
"location_id": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '<string>',
prompt: '<string>',
temperature: 1,
voice_id: '<string>',
language: '<string>',
voice_enabled: true,
inbound_greeting: '<string>',
outbound_greeting: '<string>',
platform_tools: ['<string>'],
voice_settings: {
inbound_opening_message: '<string>',
outbound_opening_message: '<string>',
voicemail_message: '<string>',
enable_voicemail_detection: true
},
subaccount_id: '<string>',
location_id: '<string>'
})
};
fetch('https://api.assistable.ai/v3/assistants', 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.assistable.ai/v3/assistants",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>',
'prompt' => '<string>',
'temperature' => 1,
'voice_id' => '<string>',
'language' => '<string>',
'voice_enabled' => true,
'inbound_greeting' => '<string>',
'outbound_greeting' => '<string>',
'platform_tools' => [
'<string>'
],
'voice_settings' => [
'inbound_opening_message' => '<string>',
'outbound_opening_message' => '<string>',
'voicemail_message' => '<string>',
'enable_voicemail_detection' => true
],
'subaccount_id' => '<string>',
'location_id' => '<string>'
]),
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.assistable.ai/v3/assistants"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"prompt\": \"<string>\",\n \"temperature\": 1,\n \"voice_id\": \"<string>\",\n \"language\": \"<string>\",\n \"voice_enabled\": true,\n \"inbound_greeting\": \"<string>\",\n \"outbound_greeting\": \"<string>\",\n \"platform_tools\": [\n \"<string>\"\n ],\n \"voice_settings\": {\n \"inbound_opening_message\": \"<string>\",\n \"outbound_opening_message\": \"<string>\",\n \"voicemail_message\": \"<string>\",\n \"enable_voicemail_detection\": true\n },\n \"subaccount_id\": \"<string>\",\n \"location_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.assistable.ai/v3/assistants")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"prompt\": \"<string>\",\n \"temperature\": 1,\n \"voice_id\": \"<string>\",\n \"language\": \"<string>\",\n \"voice_enabled\": true,\n \"inbound_greeting\": \"<string>\",\n \"outbound_greeting\": \"<string>\",\n \"platform_tools\": [\n \"<string>\"\n ],\n \"voice_settings\": {\n \"inbound_opening_message\": \"<string>\",\n \"outbound_opening_message\": \"<string>\",\n \"voicemail_message\": \"<string>\",\n \"enable_voicemail_detection\": true\n },\n \"subaccount_id\": \"<string>\",\n \"location_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.assistable.ai/v3/assistants")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"prompt\": \"<string>\",\n \"temperature\": 1,\n \"voice_id\": \"<string>\",\n \"language\": \"<string>\",\n \"voice_enabled\": true,\n \"inbound_greeting\": \"<string>\",\n \"outbound_greeting\": \"<string>\",\n \"platform_tools\": [\n \"<string>\"\n ],\n \"voice_settings\": {\n \"inbound_opening_message\": \"<string>\",\n \"outbound_opening_message\": \"<string>\",\n \"voicemail_message\": \"<string>\",\n \"enable_voicemail_detection\": true\n },\n \"subaccount_id\": \"<string>\",\n \"location_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "<string>",
"name": "<string>",
"description": "<string>",
"model": "<string>",
"prompt": "<string>",
"temperature": 123,
"voiceId": "<string>",
"assistantType": "<string>",
"language": "<string>",
"voiceEnabled": true,
"webCallsEnabled": true,
"lastSyncedAt": "<string>",
"folderId": "<string>",
"archived": true,
"createdAt": "<string>",
"updatedAt": "<string>",
"voice_settings": {
"inbound_opening_message": "<string>",
"outbound_opening_message": "<string>",
"inbound_greeting": "<string>",
"outbound_greeting": "<string>",
"voicemail_message": "<string>",
"enable_voicemail_detection": true
},
"platform_tools": [
"<string>"
]
},
"request_id": "<string>",
"error": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}Create an assistant
Requires scope assistants:create.
curl --request POST \
--url https://api.assistable.ai/v3/assistants \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"name": "<string>",
"description": "<string>",
"prompt": "<string>",
"temperature": 1,
"voice_id": "<string>",
"language": "<string>",
"voice_enabled": true,
"inbound_greeting": "<string>",
"outbound_greeting": "<string>",
"platform_tools": [
"<string>"
],
"voice_settings": {
"inbound_opening_message": "<string>",
"outbound_opening_message": "<string>",
"voicemail_message": "<string>",
"enable_voicemail_detection": true
},
"subaccount_id": "<string>",
"location_id": "<string>"
}
'import requests
url = "https://api.assistable.ai/v3/assistants"
payload = {
"name": "<string>",
"description": "<string>",
"prompt": "<string>",
"temperature": 1,
"voice_id": "<string>",
"language": "<string>",
"voice_enabled": True,
"inbound_greeting": "<string>",
"outbound_greeting": "<string>",
"platform_tools": ["<string>"],
"voice_settings": {
"inbound_opening_message": "<string>",
"outbound_opening_message": "<string>",
"voicemail_message": "<string>",
"enable_voicemail_detection": True
},
"subaccount_id": "<string>",
"location_id": "<string>"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: '<string>',
description: '<string>',
prompt: '<string>',
temperature: 1,
voice_id: '<string>',
language: '<string>',
voice_enabled: true,
inbound_greeting: '<string>',
outbound_greeting: '<string>',
platform_tools: ['<string>'],
voice_settings: {
inbound_opening_message: '<string>',
outbound_opening_message: '<string>',
voicemail_message: '<string>',
enable_voicemail_detection: true
},
subaccount_id: '<string>',
location_id: '<string>'
})
};
fetch('https://api.assistable.ai/v3/assistants', 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.assistable.ai/v3/assistants",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => '<string>',
'description' => '<string>',
'prompt' => '<string>',
'temperature' => 1,
'voice_id' => '<string>',
'language' => '<string>',
'voice_enabled' => true,
'inbound_greeting' => '<string>',
'outbound_greeting' => '<string>',
'platform_tools' => [
'<string>'
],
'voice_settings' => [
'inbound_opening_message' => '<string>',
'outbound_opening_message' => '<string>',
'voicemail_message' => '<string>',
'enable_voicemail_detection' => true
],
'subaccount_id' => '<string>',
'location_id' => '<string>'
]),
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.assistable.ai/v3/assistants"
payload := strings.NewReader("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"prompt\": \"<string>\",\n \"temperature\": 1,\n \"voice_id\": \"<string>\",\n \"language\": \"<string>\",\n \"voice_enabled\": true,\n \"inbound_greeting\": \"<string>\",\n \"outbound_greeting\": \"<string>\",\n \"platform_tools\": [\n \"<string>\"\n ],\n \"voice_settings\": {\n \"inbound_opening_message\": \"<string>\",\n \"outbound_opening_message\": \"<string>\",\n \"voicemail_message\": \"<string>\",\n \"enable_voicemail_detection\": true\n },\n \"subaccount_id\": \"<string>\",\n \"location_id\": \"<string>\"\n}")
req, _ := http.NewRequest("POST", 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.post("https://api.assistable.ai/v3/assistants")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"prompt\": \"<string>\",\n \"temperature\": 1,\n \"voice_id\": \"<string>\",\n \"language\": \"<string>\",\n \"voice_enabled\": true,\n \"inbound_greeting\": \"<string>\",\n \"outbound_greeting\": \"<string>\",\n \"platform_tools\": [\n \"<string>\"\n ],\n \"voice_settings\": {\n \"inbound_opening_message\": \"<string>\",\n \"outbound_opening_message\": \"<string>\",\n \"voicemail_message\": \"<string>\",\n \"enable_voicemail_detection\": true\n },\n \"subaccount_id\": \"<string>\",\n \"location_id\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.assistable.ai/v3/assistants")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"<string>\",\n \"description\": \"<string>\",\n \"prompt\": \"<string>\",\n \"temperature\": 1,\n \"voice_id\": \"<string>\",\n \"language\": \"<string>\",\n \"voice_enabled\": true,\n \"inbound_greeting\": \"<string>\",\n \"outbound_greeting\": \"<string>\",\n \"platform_tools\": [\n \"<string>\"\n ],\n \"voice_settings\": {\n \"inbound_opening_message\": \"<string>\",\n \"outbound_opening_message\": \"<string>\",\n \"voicemail_message\": \"<string>\",\n \"enable_voicemail_detection\": true\n },\n \"subaccount_id\": \"<string>\",\n \"location_id\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"id": "<string>",
"name": "<string>",
"description": "<string>",
"model": "<string>",
"prompt": "<string>",
"temperature": 123,
"voiceId": "<string>",
"assistantType": "<string>",
"language": "<string>",
"voiceEnabled": true,
"webCallsEnabled": true,
"lastSyncedAt": "<string>",
"folderId": "<string>",
"archived": true,
"createdAt": "<string>",
"updatedAt": "<string>",
"voice_settings": {
"inbound_opening_message": "<string>",
"outbound_opening_message": "<string>",
"inbound_greeting": "<string>",
"outbound_greeting": "<string>",
"voicemail_message": "<string>",
"enable_voicemail_detection": true
},
"platform_tools": [
"<string>"
]
},
"request_id": "<string>",
"error": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}{
"error": {
"code": "<string>",
"message": "<string>"
},
"request_id": "<string>",
"data": null
}Authorizations
Your v3 API key, e.g. ask_live_…
Headers
Target subaccount for the request. Required unless the API key is authorized for exactly one subaccount (then it defaults to that one). Alternatively pass subaccount_id (or legacy location_id) in the request body. Omitting it on a multi-subaccount key returns 400 subaccount_required.
Body
Display name for the assistant.
1System prompt. If omitted, a minimal default prompt is generated from the name.
LLM model. Defaults to KIMI_K2_5 when omitted.
QWEN_3_235B_A22B, GPT_5_4, GPT_5_2, GPT_5_1, GPT_5, GPT_5_MINI, GPT_5_NANO, GPT_4_1, GPT_4_1_MINI, GPT_4_1_NANO, GPT_4O, GPT_4O_MINI, GPT_4_TURBO, GPT_4, GPT_3_5_TURBO, CLAUDE_4_1_OPUS, CLAUDE_4_SONNET, CLAUDE_3_7_SONNET, CLAUDE_HAIKU_4_5, CLAUDE_3_5_HAIKU, CLAUDE_3_SONNET, CLAUDE_3_HAIKU, GEMINI_2_5_FLASH, GEMINI_2_0_FLASH, GEMINI_2_0_FLASH_LITE, KIMI_K2_5, KIMI_K2_6, CUSTOM Sampling temperature 0–2 (default 0).
0 <= x <= 2Voice PK (the id from GET /v3/voices). Defaults to the system default voice when omitted.
Assistant type. STANDARD (default) is a prompt-driven assistant; FLOW_BUILDER is node/flow driven.
STANDARD, FLOW_BUILDER BCP-47 language code (default 'en').
Whether voice calling is enabled (default true).
Platform tool names to attach, e.g. ["book_appointment", "send_email"]. Declarative within the platform catalog: tools in the list are attached, catalog tools missing from the list are detached, custom tools are never touched. Omit for no change; [] detaches all platform tools. See GET /v3/tools for the catalog; custom tools attach via POST /v3/tools/{id}/assign.
Show child attributes
Show child attributes
Target subaccount id. Prefer the X-Subaccount-Id header; this body field is a fallback.
Alias for subaccount_id (GHL location id).
