V2 preview
POST
https://app.sulus.ai/api/v2/assistants/preview
Validate the merged configuration without creating anything
Authentication
Send a bearer token created on your dashboard's Developer page:
Authorization: Bearer <YOUR_API_KEY>
Request body
base_config_id
integer
Optional
Nullable
The layered base configuration; may be derived from a template instead.
Validation:
required_without_all:prompt_template_id,industry_template_id|nullable|integer|exists:assistant_base_configs,idStored in
assistants.base_config_idname
string
Required
Validation:
required|string|max:40Stored in
assistants.nametype
string
Optional
Nullable
Validation:
nullable|string|in:demo,productionStored in
assistants.typelayer2_key
string
Optional
Nullable
Layer-2 preset key.
Validation:
nullable|string|max:64prompt_template_id
integer
Optional
Nullable
Validation:
nullable|integer|exists:prompt_templates,idStored in
assistants.template_idindustry_template_id
integer
Optional
Nullable
Validation:
nullable|integer|exists:industry_templates,idsystem_prompt
string
Optional
Nullable
Free-form system prompt override.
Validation:
nullable|stringStored in
assistants.modelfirst_message
string
Optional
Nullable
Validation:
nullable|string (firstMessage also accepted)Stored in
assistants.first_messageend_call_message
string
Optional
Nullable
Validation:
nullable|string (endCallMessage also accepted)Stored in
assistants.end_call_messageserver_url
string
Optional
Nullable
Webhook for call events.
Validation:
nullable|string|urlStored in
assistants.webhook_urlpersonality_id
integer
Optional
Nullable
Validation:
nullable|integer|exists:personalities,idStored in
assistants.personality_idmetadata
object
Optional
Nullable
Validation:
nullable|arrayStored in
assistants.metadatavariable_values
object
Optional
Nullable
Template variable values.
Validation:
nullable|arrayStored in
assistants.metadataErrors
| Status | Meaning | Body |
|---|---|---|
422 |
No buildable base | {"success":false,"message":"base_config_id is required, or provide prompt_template_id or industry_template_id whose template has a base config."} |
422 |
Merged config invalid | {"success":false,"message":"Configuration validation failed","errors":{"name":["The name field is required."]}} |
422 |
Validation failed | |
401 |
Missing or invalid bearer token | |
403 |
Feature assistants not enabled for the account |
Notes
- `data.config` is the merged, not-yet-created assistant configuration; its `voice`/`model`/`transcriber` provider-selection sub-keys are platform-managed and excluded from this example.
curl --request POST \
--url https://app.sulus.ai/api/v2/assistants/preview \
--header 'Authorization: Bearer <YOUR_API_KEY>' \
--header 'Content-Type: application/json' \
--data '{
"base_config_id": 3,
"name": "Reception",
"type": "production",
"layer2_key": "friendly-professional",
"prompt_template_id": 5,
"industry_template_id": 7,
"system_prompt": "You are Sarah, the AI voice receptionist for Acme Dental.",
"first_message": "Thank you for calling {{companyName}}, this is {{personalityName}}. How can I help you today?",
"end_call_message": "Thank you for calling {{companyName}}, have a great day!",
"server_url": "https://automations.sulus.ai/webhook/lhg-live-demo-agents",
"personality_id": 12,
"metadata": {
"company_name": "Acme Dental",
"industry": "Dental"
},
"variable_values": {
"companyName": "Acme Dental",
"industry": "Dental",
"personalityName": "Sarah"
}
}'
import requests
url = "https://app.sulus.ai/api/v2/assistants/preview"
headers = {"Authorization": "Bearer <YOUR_API_KEY>"}
payload = {
"base_config_id": 3,
"name": "Reception",
"type": "production",
"layer2_key": "friendly-professional",
"prompt_template_id": 5,
"industry_template_id": 7,
"system_prompt": "You are Sarah, the AI voice receptionist for Acme Dental.",
"first_message": "Thank you for calling {{companyName}}, this is {{personalityName}}. How can I help you today?",
"end_call_message": "Thank you for calling {{companyName}}, have a great day!",
"server_url": "https://automations.sulus.ai/webhook/lhg-live-demo-agents",
"personality_id": 12,
"metadata": {
"company_name": "Acme Dental",
"industry": "Dental"
},
"variable_values": {
"companyName": "Acme Dental",
"industry": "Dental",
"personalityName": "Sarah"
}
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
package main
import (
"fmt"
"io"
"net/http"
"strings"
)
func main() {
url := "https://app.sulus.ai/api/v2/assistants/preview"
payload := strings.NewReader(`{
"base_config_id": 3,
"name": "Reception",
"type": "production",
"layer2_key": "friendly-professional",
"prompt_template_id": 5,
"industry_template_id": 7,
"system_prompt": "You are Sarah, the AI voice receptionist for Acme Dental.",
"first_message": "Thank you for calling {{companyName}}, this is {{personalityName}}. How can I help you today?",
"end_call_message": "Thank you for calling {{companyName}}, have a great day!",
"server_url": "https://automations.sulus.ai/webhook/lhg-live-demo-agents",
"personality_id": 12,
"metadata": {
"company_name": "Acme Dental",
"industry": "Dental"
},
"variable_values": {
"companyName": "Acme Dental",
"industry": "Dental",
"personalityName": "Sarah"
}
}`)
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <YOUR_API_KEY>")
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))
}
Response
200
{
"success": true,
"message": "Config is valid. You can create the assistant.",
"data": {
"config": {
"id": null,
"name": "Reception",
"firstMessage": "Thank you for calling Acme Dental, this is Sarah. How can I help you today?",
"voicemailMessage": "Please leave a message after the tone and we'll call you back.",
"endCallMessage": "Thank you for calling Acme Dental, have a great day!",
"endCallPhrases": [
"goodbye",
"that's all, thank you"
],
"maxDurationSeconds": 1800,
"backgroundSound": "office",
"voice": {
"voiceId": "sarah-professional-01",
"speed": 1
},
"model": {
"messages": [
{
"role": "system",
"content": "You are Sarah, the AI voice receptionist for Acme Dental. Greet callers warmly, answer questions about services and hours, and offer to book an appointment or transfer to the front desk as needed."
}
],
"maxTokens": 300,
"toolIds": [
"c3d4e5f6-7a8b-49c0-8d1e-2f3a4b5c6d7e"
]
},
"transcriber": {
"language": "en",
"confidenceThreshold": 0.4,
"formatTurns": true
},
"server": {
"url": "https://automations.sulus.ai/webhook/lhg-live-demo-agents"
},
"metadata": {
"company_name": "Acme Dental",
"industry": "Dental",
"location": "Austin, TX",
"services_products": "General and cosmetic dentistry, teeth whitening, emergency dental care",
"country": "United States",
"assistant_phone_number": "+14155550142",
"webhook_url": "https://automations.sulus.ai/webhook/lhg-live-demo-agents",
"personality": "Sarah",
"personality_id": 12,
"user_id": 17,
"user": "Jordan Lee",
"type": "production",
"available24_7": false,
"standard_hours": "Mon-Fri 9:00 AM - 5:00 PM",
"business_hours": {
"monday": "9:00 AM - 5:00 PM",
"tuesday": "9:00 AM - 5:00 PM",
"wednesday": "9:00 AM - 5:00 PM",
"thursday": "9:00 AM - 5:00 PM",
"friday": "9:00 AM - 5:00 PM",
"saturday": "Closed",
"sunday": "Closed"
},
"always_say": [
"We look forward to seeing you!"
],
"never_say": [
"I don't know, let me transfer you"
],
"pronunciation": [
{
"word": "Sulus",
"soundsLike": "SOO-luss"
}
],
"spam_handling": "end_call",
"variable_values": {
"companyName": "Acme Dental",
"industry": "Dental",
"personalityName": "Sarah"
},
"sms_notifications": [
"+14155550199"
],
"email_notifications": [
"[email protected]"
],
"created_at": "2026-01-15T10:22:03.000000Z",
"updated_at": "2026-07-28T14:05:41.000000Z"
}
}
}
}
Response — POST
/v2/assistants/preview
200
{
"success": true,
"message": "Config is valid. You can create the assistant.",
"data": {
"config": {
"id": null,
"name": "Reception",
"firstMessage": "Thank you for calling Acme Dental, this is Sarah. How can I help you today?",
"voicemailMessage": "Please leave a message after the tone and we'll call you back.",
"endCallMessage": "Thank you for calling Acme Dental, have a great day!",
"endCallPhrases": [
"goodbye",
"that's all, thank you"
],
"maxDurationSeconds": 1800,
"backgroundSound": "office",
"voice": {
"voiceId": "sarah-professional-01",
"speed": 1
},
"model": {
"messages": [
{
"role": "system",
"content": "You are Sarah, the AI voice receptionist for Acme Dental. Greet callers warmly, answer questions about services and hours, and offer to book an appointment or transfer to the front desk as needed."
}
],
"maxTokens": 300,
"toolIds": [
"c3d4e5f6-7a8b-49c0-8d1e-2f3a4b5c6d7e"
]
},
"transcriber": {
"language": "en",
"confidenceThreshold": 0.4,
"formatTurns": true
},
"server": {
"url": "https://automations.sulus.ai/webhook/lhg-live-demo-agents"
},
"metadata": {
"company_name": "Acme Dental",
"industry": "Dental",
"location": "Austin, TX",
"services_products": "General and cosmetic dentistry, teeth whitening, emergency dental care",
"country": "United States",
"assistant_phone_number": "+14155550142",
"webhook_url": "https://automations.sulus.ai/webhook/lhg-live-demo-agents",
"personality": "Sarah",
"personality_id": 12,
"user_id": 17,
"user": "Jordan Lee",
"type": "production",
"available24_7": false,
"standard_hours": "Mon-Fri 9:00 AM - 5:00 PM",
"business_hours": {
"monday": "9:00 AM - 5:00 PM",
"tuesday": "9:00 AM - 5:00 PM",
"wednesday": "9:00 AM - 5:00 PM",
"thursday": "9:00 AM - 5:00 PM",
"friday": "9:00 AM - 5:00 PM",
"saturday": "Closed",
"sunday": "Closed"
},
"always_say": [
"We look forward to seeing you!"
],
"never_say": [
"I don't know, let me transfer you"
],
"pronunciation": [
{
"word": "Sulus",
"soundsLike": "SOO-luss"
}
],
"spam_handling": "end_call",
"variable_values": {
"companyName": "Acme Dental",
"industry": "Dental",
"personalityName": "Sarah"
},
"sms_notifications": [
"+14155550199"
],
"email_notifications": [
"[email protected]"
],
"created_at": "2026-01-15T10:22:03.000000Z",
"updated_at": "2026-07-28T14:05:41.000000Z"
}
}
}
}