Fields & validation
Every field with its exact validation rule, nullability, and the database column that stores it.
Core fields
| Field | Type | Required | Nullable | Rules (verbatim) | DB column |
name | string | yes | no | required|string|max:40 | assistants.name |
type | string | no | yes | nullable|string|in:demo,production | assistants.type |
selected_phone_number | string | no | yes | nullable|string|max:20|regex:/^\+[1-9]\d{1,14}$/ | assistants.phone_number (after purchase) |
template_id | integer | no | yes | nullable|integer | assistants.template_id |
user_id | integer | no | yes | nullable|integer|exists:users,id (admins only) | assistants.user_id |
Conversation fields
| Field | Rules (verbatim) | DB column |
firstMessage | nullable|string|max:1000 | assistants.first_message |
firstMessageMode | nullable|string|in:assistant-speaks-first,assistant-speaks-first-with-model-generated-message,assistant-waits-for-user | assistants.first_message_mode |
firstMessageInterruptionsEnabled | nullable|boolean | assistants.first_message_interruptions_enabled |
voicemailMessage | nullable|string|max:1000 | assistants.voicemail_message |
endCallMessage | nullable|string|max:1000 | assistants.end_call_message |
endCallPhrases | nullable|array | assistants.end_call_phrases |
maxDurationSeconds | nullable|integer|min:10|max:43200 | assistants.max_duration_seconds |
backgroundSound | nullable|string|in:office,coffee-shop,convention-hall,summit,traffic,rain,storm,wind,fire,crackling-fire,rain-on-roof,coastal-storm,howling-wind,seagulls,night-insects,fan,white-noise,off | assistants.background_sound |
Behaviour plans
All plan objects validate as nullable|array and store one-to-one into their JSON columns:
| Field | Notable sub-rules (verbatim) | DB column |
voicemailDetection | enabled/beepDetection boolean · silenceDuration/greetingDuration integer|min:0 | assistants.voicemail_detection |
compliancePlan | recordingEnabled/transcriptionEnabled boolean · dataRetentionDays integer|min:1 | assistants.compliance_plan |
backgroundSpeechDenoisingPlan | smartDenoising/fourierDenoising boolean | assistants.background_speech_denoising_plan |
startSpeakingPlan / stopSpeakingPlan | initialDelayMs integer|min:0 · backgroundSoundVolume numeric|min:0|max:1 | assistants.start_speaking_plan / stop_speaking_plan |
monitorPlan | listenEnabled/controlEnabled boolean · websocketUrl url | assistants.monitor_plan |
keypadInputPlan | enabled/terminateOnHash boolean · maxDigits integer|min:1|max:10 | assistants.keypad_input_plan |
analysisPlan / artifactPlan (advanced editor) | artifactPlan.recording/transcript/summary/analysis boolean | assistants.analysis_plan / artifact_plan |
Constraints the rules cannot express
- Provider selection is platform-managed. The engine/provider keys inside
voice, model and transcriber are set by the platform (via personality and plan settings) and are not part of the public contract.
backgroundSound: "none" is normalised to "off"; "default"/"custom"/empty are treated as unset.
- The live voice platform is written first on create/update/delete; on failure nothing is saved locally.
- Updating re-renders the prompt from template + metadata + variables — direct prompt edits belong to the advanced editor.
- The platform mirror object sometimes present in responses is internal and excluded from this contract.