> ## Documentation Index
> Fetch the complete documentation index at: https://docs.intellixent.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Create assistant

> Create a new AI assistant with your desired configuration.

Creates a new AI assistant. The assistant is created with `inactive` status and is ready to configure and activate.

## Endpoint

`POST /user/assistant`

## Engine modes

The assistant supports three engine modes, each with different requirements:

| Mode         | Description                            | Required field        |
| ------------ | -------------------------------------- | --------------------- |
| `pipeline`   | Traditional STT → LLM → TTS pipeline   | `llm_model_id`        |
| `multimodal` | Real-time multimodal AI                | `multimodal_model_id` |
| `dualplex`   | Multimodal brain with custom TTS voice | `multimodal_model_id` |

## Request

### Core required fields

<ParamField body="name" type="string" required>
  Name of the assistant. Maximum 255 characters.
</ParamField>

<ParamField body="voice_id" type="integer" required>
  Voice ID to use. Use the Get Voices endpoint with the `mode` parameter to retrieve voices compatible with your engine mode.
</ParamField>

<ParamField body="language_id" type="integer" required>
  Primary language ID. Use the Get Languages endpoint to retrieve available languages.
</ParamField>

<ParamField body="type" type="string" required>
  Assistant type: `inbound` or `outbound`.
</ParamField>

<ParamField body="mode" type="string" required>
  Engine mode: `pipeline`, `multimodal`, or `dualplex`.
</ParamField>

<ParamField body="timezone" type="string" required>
  Timezone identifier (e.g., `America/New_York`, `Europe/Bucharest`).
</ParamField>

<ParamField body="initial_message" type="string" required>
  Greeting message spoken at the start of a call. Maximum 200 characters.
</ParamField>

<ParamField body="system_prompt" type="string" required>
  System prompt defining the assistant's behavior and personality.
</ParamField>

### Mode-specific fields

<ParamField body="llm_model_id" type="integer">
  LLM model ID. **Required for `pipeline` mode.** Use the Get Models endpoint to retrieve available models.
</ParamField>

<ParamField body="multimodal_model_id" type="integer">
  Multimodal model ID. **Required for `multimodal` and `dualplex` modes.** Use the Get Models endpoint to retrieve available multimodal models.
</ParamField>

<ParamField body="chat_llm_fallback_id" type="integer">
  Fallback LLM model ID for tool calls in multimodal/dualplex modes. Optional.
</ParamField>

<ParamField body="turn_detection_threshold" type="number">
  Turn detection sensitivity for multimodal/dualplex modes. Range: 0–1. Defaults to auto.
</ParamField>

### Secondary languages

<ParamField body="secondary_language_ids" type="integer[]">
  Additional language IDs the assistant can speak. The assistant auto-detects and switches languages during the call.

  ```json theme={null}
  "secondary_language_ids": [2, 3, 4]
  ```
</ParamField>

### Knowledge base

<ParamField body="knowledgebase_id" type="integer">
  ID of the knowledge base to attach to this assistant.
</ParamField>

<ParamField body="knowledgebase_mode" type="string">
  How the assistant uses the knowledge base:

  * `function_call` — AI calls a function to search. Required for `multimodal` and `dualplex` modes.
  * `prompt` — Knowledge is injected into the system prompt. Pipeline mode only.
</ParamField>

### Phone number

<ParamField body="phone_number_id" type="integer">
  ID of the phone number to assign. Must belong to your account.

  <Warning>
    For `inbound` assistants, the phone number cannot be a Caller ID type and cannot already be assigned to another inbound assistant.
  </Warning>
</ParamField>

### Custom mid-call tools

<ParamField body="tool_ids" type="integer[]">
  IDs of custom mid-call tools to attach. Each tool must belong to your account.

  ```json theme={null}
  "tool_ids": [1, 5, 12]
  ```
</ParamField>

### Built-in tools

<ParamField body="tools" type="array">
  Built-in tools to enable on the assistant. Each tool object has a `type` and type-specific fields.

  <Expandable title="Available tool types">
    **`call_transfer`** — Transfer the call to another number.

    * `phone_number` *(required)*: Destination phone number (e.g., `+1234567890`).
    * `description`: When the AI should transfer.
    * `custom`: If `true`, the AI dynamically determines the transfer number.
    * `warm_transfer`: Send a message before transferring. Default: `false`.
    * `warm_transfer_message`: Prompt for what the AI says before transferring.

    **`warm_call_transfer`** — Warm transfer with supervisor briefing.

    * `supervisor_phone` *(required)*: Phone number to dial for the transfer.
    * `outbound_phone_id` *(required)*: ID of the phone number used to dial the supervisor.
    * `description` *(required)*: When the AI should initiate the warm transfer.
    * `caller_id_mode`: Number the supervisor sees: `outbound_number` (default), `customer_number`, or `custom`.
    * `hold_music`: Hold audio: `hold_music` (default) or `none`.
    * `hold_message`: Message spoken to the caller before being placed on hold.

    **`end_call`** — End the call programmatically.

    * `description`: When the AI should end the call.

    **`dtmf_input`** — Send DTMF tones for IVR navigation.

    * `description`: When to use DTMF input.

    **`collect_keypad`** — Collect keypad input from the caller.

    * `timeout`: Seconds to wait for input. Range: 1–30. Default: `5`.
    * `stop_key`: Key that ends input: `#` (default) or `*`.

    **`calendar_integration`** — Schedule appointments via Cal.com.

    * `calcom_api_key` *(required)*: Your Cal.com API key.
    * `calcom_event_slug` *(required)*: Event type slug from Cal.com.
    * `description`: When the AI should offer scheduling.
  </Expandable>
</ParamField>

### Voice and TTS settings

<ParamField body="voice_stability" default="0.70" type="number">
  Voice stability. Range: 0–1. Higher values produce a more consistent voice.
</ParamField>

<ParamField body="voice_similarity" default="0.50" type="number">
  Voice similarity to the original. Range: 0–1.
</ParamField>

<ParamField body="speech_speed" default="1.00" type="number">
  Speech speed multiplier. Range: 0.7–1.2.
</ParamField>

<ParamField body="llm_temperature" default="0.10" type="number">
  LLM temperature. Range: 0–1. Lower values produce more deterministic responses.
</ParamField>

<ParamField body="tts_emotion_enabled" default="true" type="boolean">
  Whether to enable emotional TTS synthesis.
</ParamField>

<ParamField body="synthesizer_provider_id" type="integer">
  Custom TTS provider ID. Auto-selected based on language if not provided.
</ParamField>

<ParamField body="transcriber_provider_id" type="integer">
  Custom STT provider ID. Pipeline mode only. Auto-selected based on language if not provided.
</ParamField>

### Call behavior

<ParamField body="allow_interruptions" default="true" type="boolean">
  Whether the caller can interrupt the assistant.

  <Warning>
    Cannot be disabled for `multimodal` and `dualplex` modes.
  </Warning>
</ParamField>

<ParamField body="fillers" default="false" type="boolean">
  Whether to use filler audio while processing (e.g., "Hmm", "Let me check").

  <Warning>
    Only available in `pipeline` mode.
  </Warning>
</ParamField>

<ParamField body="filler_config" type="object">
  Custom filler phrases per category. Each category is an array of short strings.

  ```json theme={null}
  "filler_config": {
    "positive": ["Great!", "Perfect!"],
    "negative": ["Hmm.", "I see."],
    "question": ["Good question.", "Let me check."],
    "neutral": ["Ok.", "Noted."]
  }
  ```
</ParamField>

<ParamField body="record" default="false" type="boolean">
  Whether to record calls.
</ParamField>

<ParamField body="enable_noise_cancellation" default="true" type="boolean">
  Whether to enable noise cancellation.
</ParamField>

<ParamField body="wait_for_customer" default="false" type="boolean">
  If `true`, the assistant waits for the customer to speak first.
</ParamField>

### Timing

<ParamField body="max_duration" default="600" type="integer">
  Maximum call duration in seconds. Range: 20–1200.
</ParamField>

<ParamField body="max_silence_duration" default="40" type="integer">
  Maximum silence duration before re-engagement, in seconds. Range: 1–360.
</ParamField>

<ParamField body="max_initial_silence_duration" type="integer">
  Maximum silence at call start before ending, in seconds. Range: 1–120.
</ParamField>

<ParamField body="ringing_time" default="30" type="integer">
  Maximum ringing time before giving up, in seconds. Range: 1–60.
</ParamField>

### Re-engagement

<ParamField body="reengagement_interval" default="30" type="integer">
  Seconds between re-engagement attempts. Range: 7–600.
</ParamField>

<ParamField body="reengagement_prompt" type="string">
  Custom re-engagement message prompt. Maximum 1000 characters.
</ParamField>

### Voicemail

<ParamField body="end_call_on_voicemail" default="true" type="boolean">
  Whether to end the call when voicemail is detected.
</ParamField>

<ParamField body="voice_mail_message" type="string">
  Message to leave on voicemail before hanging up. Maximum 1000 characters.
</ParamField>

### Endpoint detection

<ParamField body="endpoint_type" default="vad" type="string">
  Voice activity detection type: `vad` or `ai`.
</ParamField>

<ParamField body="endpoint_sensitivity" default="0.5" type="number">
  Endpoint sensitivity level. Range: 0–5.
</ParamField>

<ParamField body="interrupt_sensitivity" default="0.5" type="number">
  Interrupt sensitivity level. Range: 0–5.
</ParamField>

<ParamField body="min_interrupt_words" type="integer">
  Minimum words spoken before an interruption is processed. Range: 0–10.
</ParamField>

### Ambient sound

<ParamField body="ambient_sound" type="string">
  Background ambient sound: `off`, `office`, `city`, `forest`, `crowded_room`, `cafe`, or `nature`.
</ParamField>

<ParamField body="ambient_sound_volume" default="0.5" type="number">
  Ambient sound volume. Range: 0–1.
</ParamField>

### Webhook configuration

<ParamField body="is_webhook_active" default="false" type="boolean">
  Whether to enable post-call webhook notifications.
</ParamField>

<ParamField body="webhook_url" type="string">
  Webhook URL for post-call notifications. Required if `is_webhook_active` is `true`.
</ParamField>

<ParamField body="send_webhook_only_on_completed" default="true" type="boolean">
  Whether to send webhooks only for completed calls.
</ParamField>

<ParamField body="include_recording_in_webhook" default="true" type="boolean">
  Whether to include the recording URL in webhook payloads.
</ParamField>

### Post-call evaluation

<ParamField body="post_call_evaluation" default="true" type="boolean">
  Whether to enable AI post-call evaluation.
</ParamField>

<ParamField body="post_call_schema" type="array">
  Schema for extracting structured data from calls.

  <Expandable title="Schema field properties">
    <ParamField body="name" type="string" required>
      Field name. 3–16 characters, lowercase alphanumeric and underscores only.
    </ParamField>

    <ParamField body="type" type="string" required>
      Data type: `string`, `number`, or `bool`.
    </ParamField>

    <ParamField body="description" type="string" required>
      Description of the field. 3–255 characters.
    </ParamField>
  </Expandable>

  ```json theme={null}
  "post_call_schema": [
    {"name": "status", "type": "bool", "description": "Was the call objective achieved"},
    {"name": "summary", "type": "string", "description": "Brief summary of the call"}
  ]
  ```
</ParamField>

### Variables

<ParamField body="variables" type="object">
  Custom key-value pairs accessible in prompts via `{{variable_name}}`.

  ```json theme={null}
  "variables": {
    "company_name": "Acme Corp",
    "product": "Premium Widget"
  }
  ```
</ParamField>

### Conversation ended settings

<ParamField body="conversation_inactivity_timeout" default="30" type="integer">
  Minutes of chat inactivity before the conversation is considered ended. Range: 1–1440.
</ParamField>

<ParamField body="conversation_ended_retrigger" default="false" type="boolean">
  Whether to allow re-triggering after the conversation ends due to inactivity.
</ParamField>

<ParamField body="conversation_ended_webhook_url" type="string">
  Webhook URL called when a chat conversation ends due to inactivity.
</ParamField>

## Response

<ResponseField name="message" type="string">
  Confirmation message.
</ResponseField>

<ResponseField name="data" type="object">
  <Expandable title="properties">
    <ResponseField name="id" type="integer">
      Unique identifier of the created assistant.
    </ResponseField>

    <ResponseField name="name" type="string">
      Name of the assistant.
    </ResponseField>

    <ResponseField name="status" type="string">
      Status — always
      `inactive`
      for new assistants.
    </ResponseField>

    <ResponseField name="type" type="string">
      `inbound`
      or
      `outbound`
      .
    </ResponseField>

    <ResponseField name="mode" type="string">
      Engine mode:
      `pipeline`
      ,
      `multimodal`
      , or
      `dualplex`
      .
    </ResponseField>
  </Expandable>
</ResponseField>

## Example

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://portal.intellixent.ai/api/user/assistant" \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Sales Assistant",
      "voice_id": 1,
      "language_id": 1,
      "type": "outbound",
      "mode": "pipeline",
      "timezone": "America/New_York",
      "initial_message": "Hello! How can I help you today?",
      "system_prompt": "You are a professional sales assistant...",
      "llm_model_id": 2,
      "record": true,
      "tools": [
        {
          "type": "end_call",
          "description": "End call when customer is satisfied"
        }
      ]
    }'
  ```

  ```javascript Node.js theme={null}
  const response = await fetch('https://portal.intellixent.ai/api/user/assistant', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer YOUR_API_KEY',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      name: 'Sales Assistant',
      voice_id: 1,
      language_id: 1,
      type: 'outbound',
      mode: 'pipeline',
      timezone: 'America/New_York',
      initial_message: 'Hello! How can I help you today?',
      system_prompt: 'You are a professional sales assistant...',
      llm_model_id: 2,
      record: true,
      tools: [
        { type: 'end_call', description: 'End call when customer is satisfied' }
      ]
    })
  });

  const data = await response.json();
  console.log(data.data.id); // New assistant ID
  ```
</CodeGroup>

```json 201 Success theme={null}
{
  "message": "Assistant created successfully",
  "data": {
    "id": 789,
    "name": "Sales Assistant",
    "status": "inactive",
    "type": "outbound",
    "mode": "pipeline"
  }
}
```

```json 422 Validation error theme={null}
{
  "message": "Validation failed",
  "errors": {
    "name": ["The name field is required."],
    "voice_id": ["The selected voice is not compatible with the chosen engine type."]
  }
}
```

<Note>
  New assistants are created with `inactive` status. Activate them through the DialogBot portal or by attaching a phone number and enabling them.
</Note>
