> This is a page from the ElevenLabs documentation. For a complete page index, fetch https://elevenlabs.io/docs/llms.txt. For the full documentation in a single file, fetch https://elevenlabs.io/docs/llms-full.txt.

# Gérer un appel sortant via Exotel

POST https://api.elevenlabs.io/v1/convai/exotel/outbound-call
Content-Type: application/json

Gère un appel sortant via l’API Exotel Connect.

Reference: https://elevenlabs.io/docs/api-reference/integrations/exotel/outbound-call

## Servers

- `https://api.elevenlabs.io` (Production, default)
- `https://api.us.elevenlabs.io` (Production US)
- `https://api.eu.residency.elevenlabs.io` (Production EU)
- `https://api.in.residency.elevenlabs.io` (Production India)
- `https://api.sg.residency.elevenlabs.io` (Production Singapore)

## Request

### Body (application/json)

This endpoint expects a Body_Handle_an_outbound_call_via_Exotel_v1_convai_exotel_outbound_call_post.

- `agent_id` (string, required)
- `agent_phone_number_id` (string, required)
- `to_number` (string, required)
- `conversation_initiation_client_data` (ConversationInitiationClientDataRequest-Input, optional, nullable)
- `telephony_call_config` (TelephonyCallConfig-Input, optional)

## Response

### 200

Réponse réussie

- `success` (boolean, required)
- `message` (string, required)
- `conversation_id` (string, required, nullable)
- `callSid` (string, required, nullable) — CallSid Exotel pour l'appel émis

## Errors

### 422 Unprocessable Entity Error

Erreur de validation

- `detail` (list of ValidationError, optional)

## Types

### ConversationInitiationClientDataRequest-Input

- `conversation_config_override` (ConversationConfigClientOverride-Input, optional)
- `custom_llm_extra_body` (map from string to any, optional)
- `user_id` (string, optional, nullable) — ID de l’utilisateur final participant à cette conversation, pour l’identification de l’utilisateur propriétaire de l’agent
- `source_info` (ConversationInitiationSourceInfo, optional) — Informations sur l’origine de l’initiation de la conversation
- `branch_id` (string, optional, nullable) — ID de la branche d’agent à utiliser pour cette conversation
- `environment` (string, optional, nullable) — Environnement à utiliser pour résoudre les variables d'environnement
- `starting_workflow_node_id` (string, optional, nullable) — Si défini, démarre le workflow à cet ID de nœud au lieu du point d’entrée par défaut.
- `procedure_ids` (list of string, optional, nullable) — Si défini, seules ces procédures sont disponibles pour l’agent initial. Chaque ID doit être associé à cet agent ; les ID inconnus empêchent le démarrage de la conversation. Une liste vide désactive toutes les procédures de cet agent. Ne s’applique pas après un transfert d’agent. Nécessite enable_procedure_ids_from_client.
- `dynamic_variables` (map from string to any, optional)

### TelephonyCallConfig-Input

- `ringing_timeout_secs` (integer, optional, default: 60) — Durée, en secondes, pendant laquelle faire sonner le destinataire avant d’abandonner. Cette durée est également limitée par les contraintes propres au fournisseur.
- `twilio_call_recording_enabled` (boolean, optional, default: false) — Indique s'il faut enregistrer l'appel à l'aide de l'enregistrement d'appels Twilio. Ignoré pour les fournisseurs autres que Twilio. Les enregistrements sont stockés dans votre compte Twilio.
- `twilio_machine_detection` (TwilioMachineDetectionConfig, optional, nullable) — Configuration de la détection de répondeur au niveau opérateur (AMD) de Twilio. Omettez-la ou définissez-la sur null pour la désactiver. Elle est ignorée pour les fournisseurs autres que Twilio et pour les appels entrants. Le verdict obtenu est transmis dans son propre événement webhook `answering_machine_detection`, ce qui exige que cet événement soit activé dans les paramètres de webhook du Workspace ou de l'agent ; il ne fait pas partie de la conversation ni du webhook post-appel. La détection s'exécute de manière asynchrone et ne retarde donc jamais le début de la conversation, et le verdict peut arriver à tout moment pendant l'appel, avec `detect_message_end`, même après sa fin. Twilio facture l'AMD séparément.

### ValidationError

- `loc` (list of ValidationErrorLocItems, required)
- `msg` (string, required)
- `type` (string, required)

### ConversationConfigClientOverride-Input

- `asr` (ASRConversationalConfigOverride, optional, nullable) — Configuration de la transcription conversationnelle
- `turn` (TurnConfigOverride, optional, nullable) — Configuration de la détection des tours de parole
- `tts` (TTSConversationalConfigOverride, optional, nullable) — Configuration de la synthèse vocale conversationnelle
- `conversation` (ConversationConfigOverride, optional, nullable) — Configuration des événements conversationnels
- `agent` (AgentConfigOverride-Input, optional, nullable) — Configuration spécifique à l'agent

### ConversationInitiationSourceInfo

Informations sur l’origine de l’initiation de la conversation

- `source` (enum, optional, nullable, default: unknown) — Source de l’initiation de la conversation
  - Allowed values: `unknown`, `android_sdk`, `node_js_sdk`, `react_native_sdk`, `react_sdk`, `js_sdk`, `python_sdk`, `widget`, `sip_trunk`, `twilio`, `exotel`, `genesys`, `avaya`, `audiocodes`, `swift_sdk`, `whatsapp`, `twilio_sms`, `flutter_sdk`, `zendesk_integration`, `slack_integration`, `telegram_integration`, `intercom_integration`, `freshdesk_integration`, `salesforce_integration`, `template_preview`, `genesys_bot_connector`, `subagent_tool`
- `version` (string, optional, nullable) — Le numéro de version du SDK

### TwilioMachineDetectionConfig

Méthode d’exécution de la détection de répondeur au niveau de l’opérateur (AMD) de Twilio sur un appel.

- `mode` (enum, optional, default: enable) — Niveau de précision de la détection. `enable` renvoie un verdict dès que Twilio peut distinguer un humain d’une machine. `detect_message_end` attend également la fin du message d’accueil de la messagerie vocale, ce qui produit les verdicts `machine_end_*`, mais renvoie le résultat plus tard.
  - Allowed values: `enable`, `detect_message_end`
- `actions` (list of TwilioMachineDetectionRule, optional) — Actions à entreprendre lors de l’appel pour chaque verdict AMD. Chaque action ne peut figurer que dans une seule règle. Regroupez donc tous les verdicts correspondants. Les verdicts sans règle laissent l’appel se poursuivre.

### ValidationErrorLocItems

- string
- integer

### ASRConversationalConfigOverride

- `keywords` (list of string, optional, nullable) — Mots-clés dont la probabilité de prédiction doit être augmentée

### TurnConfigOverride

- `soft_timeout_config` (SoftTimeoutConfigOverride, optional, nullable) — Configuration de la fonctionnalité de délai d'expiration souple. Fournit un retour immédiat pendant les réponses plus longues des LLM.

### TTSConversationalConfigOverride

- `model_id` (enum, optional, nullable, default: eleven_v4_turbo) — Le modèle à utiliser pour le TTS
  - Allowed values: `eleven_turbo_v2`, `eleven_turbo_v2_5`, `eleven_flash_v2`, `eleven_flash_v2_5`, `eleven_multilingual_v2`, `eleven_v3_conversational`, `eleven_v4`, `eleven_v4_turbo`
- `voice_id` (string, optional, nullable) — L’ID de voix à utiliser pour le TTS
- `supported_voices` (list of SupportedVoice, optional, nullable) — Voix supplémentaires prises en charge pour l'agent
- `stability` (double, optional, nullable) — La stabilité de la parole générée
- `speed` (double, optional, nullable) — La vitesse de la parole générée
- `similarity_boost` (double, optional, nullable) — L'amélioration de similarité pour la parole générée
- `pronunciation_dictionary_locators` (list of PydanticPronunciationDictionaryVersionLocator, optional, nullable) — Les localisateurs de dictionnaires de prononciation

### ConversationConfigOverride

- `text_only` (boolean, optional, nullable) — Si cette option est activée, l’audio ne sera pas traité et seul le texte sera utilisé, afin d’éviter la tarification audio.
- `max_duration_seconds` (integer, optional, nullable) — La durée maximale d’une conversation, en secondes

### AgentConfigOverride-Input

- `first_message` (string, optional, nullable) — S’il n’est pas vide, premier message que l’agent prononcera. S’il est vide, l’agent attend que l’utilisateur commence la discussion.
- `language` (string, optional, nullable) — Langue de l'agent, utilisée pour l'ASR et le TTS
- `max_conversation_duration_message` (string, optional, nullable) — S’il n’est pas vide, message que l’agent enverra lorsque la durée maximale de la conversation sera atteinte.
- `prompt` (PromptAgentAPIModelOverride-Input, optional, nullable) — Le prompt de l’agent

### TwilioMachineDetectionRule

Action à entreprendre lors d’un appel en cours pour les verdicts AMD indiqués.

- `action` (enum, required)
  - Allowed values: `hang_up`
- `answered_by` (list of enum, required) — Verdicts qui déclenchent l’action.
  - Allowed values: `human`, `fax`, `unknown`, `machine_start`, `machine_end_beep`, `machine_end_silence`, `machine_end_other`

### SoftTimeoutConfigOverride

- `message` (string, optional, nullable) — Message à afficher lorsque le premier délai d’expiration souple est atteint pendant l’attente d’une réponse LLM. Prend en charge les variables dynamiques, par exemple \{\{system\_\_time}} et \{\{custom\_variable}}.
- `additional_soft_timeout_messages` (list of string, optional, nullable) — Messages statiques de remplissage supplémentaires pour les délais d'attente souples suivants dans la même génération LLM. Le premier délai utilise `message`. Si moins de messages sont configurés que `max_soft_timeouts_per_generation`, le dernier message configuré est répété ; sinon, un message de remplissage intégré est utilisé.

### SupportedVoice

- `label` (string, required)
- `voice_id` (string, required)
- `description` (string, optional, nullable)
- `language` (string, optional, nullable)
- `model_family` (enum, optional, nullable)
  - Allowed values: `turbo`, `flash`, `multilingual`, `v3_conversational`, `v4`, `v4_turbo`
- `optimize_streaming_latency` (enum, optional, nullable)
  - Allowed values: `0`, `1`, `2`, `3`, `4`
- `stability` (double, optional, nullable)
- `speed` (double, optional, nullable)
- `similarity_boost` (double, optional, nullable)

### PydanticPronunciationDictionaryVersionLocator

Un localisateur permettant à d'autres documents de référencer un dictionnaire spécifique et sa version. Il s'agit d'une version Pydantic de PronunciationDictionaryVersionLocatorDBModel. Requis pour assurer la compatibilité avec les autres modèles de données de l'agent.

- `pronunciation_dictionary_id` (string, required) — L’ID du dictionnaire de prononciation
- `version_id` (string, required, nullable) — L’ID de la version du dictionnaire de prononciation

### PromptAgentAPIModelOverride-Input

- `prompt` (string, optional, nullable) — Le prompt de l’agent
- `llm` (enum, optional, nullable) — Le LLM à interroger avec le prompt et l’historique de discussion. En cas de résidence des données européenne, le LLM doit être pris en charge dans l’environnement de résidence des données.
  - Allowed values: `gpt-4o-mini`, `gpt-4o`, `gpt-4`, `gpt-4-turbo`, `gpt-4.1`, `gpt-4.1-mini`, `gpt-4.1-nano`, `gpt-5`, `gpt-5.1`, `gpt-5.2`, `gpt-5.2-chat-latest`, `gpt-5.4`, `gpt-5.4-mini`, `gpt-5.4-nano`, `gpt-5.5`, `gpt-5.6-sol`, `gpt-5.6-terra`, `gpt-5.6-luna`, `gpt-6-astra`, `gpt-6-sol`, `gpt-6-luna`, `gpt-6.1-sol`, `gpt-5-mini`, `gpt-5-nano`, `gpt-3.5-turbo`, `gemini-1.5-pro`, `gemini-1.5-flash`, `gemini-2.0-flash`, `gemini-2.0-flash-lite`, `gemini-2.5-flash-lite`, `gemini-2.5-flash`, `gemini-3-pro-preview`, `gemini-3-flash-preview`, `gemini-3.1-pro-preview`, `gemini-3.1-flash-lite-preview`, `gemini-3.1-flash-lite`, `gemini-3.5-flash`, `gemini-3.5-flash-lite`, `gemini-3.6-flash`, `gemini-3.7-flash`, `gemini-3.8-flash`, `gemini-4-argon`, `claude-sonnet-4-5`, `claude-opus-4-6`, `claude-opus-4-7`, `claude-opus-4-8`, `claude-opus-5`, `claude-opus-5-5`, `claude-sonnet-4-6`, `claude-sonnet-5`, `claude-sonnet-5-5`, `claude-sonnet-4`, `claude-haiku-4-5`, `claude-haiku-5-5`, `claude-3-7-sonnet`, `claude-3-5-sonnet`, `claude-3-5-sonnet-v1`, `claude-3-haiku`, `grok-beta`, `custom-llm`, `qwen3-4b`, `qwen3-30b-a3b`, `qwen36-35b-a3b`, `qwen35-397b-a17b`, `gpt-oss-20b`, `gpt-oss-120b`, `glm-45-air-fp8`, `glm-52`, `deepseek-v41-flash`, `nemotron-35-super-vl-nvfp4`, `gemini-2.5-flash-preview-09-2025`, `gemini-2.5-flash-lite-preview-09-2025`, `gemini-2.5-flash-preview-05-20`, `gemini-2.5-flash-preview-04-17`, `gemini-2.5-flash-lite-preview-06-17`, `gemini-2.0-flash-lite-001`, `gemini-2.0-flash-001`, `gemini-1.5-flash-002`, `gemini-1.5-flash-001`, `gemini-1.5-pro-002`, `gemini-1.5-pro-001`, `claude-sonnet-4@20250514`, `claude-sonnet-4-5@20250929`, `claude-haiku-4-5@20251001`, `claude-3-7-sonnet@20250219`, `claude-3-5-sonnet@20240620`, `claude-3-5-sonnet-v2@20241022`, `claude-3-haiku@20240307`, `gpt-5-2025-08-07`, `gpt-5.1-2025-11-13`, `gpt-5.2-2025-12-11`, `gpt-5.4-2026-03-05`, `gpt-5.4-mini-2026-03-17`, `gpt-5.4-nano-2026-03-17`, `gpt-5.5-2026-04-23`, `gpt-5-mini-2025-08-07`, `gpt-5-nano-2025-08-07`, `gpt-4.1-2025-04-14`, `gpt-4.1-mini-2025-04-14`, `gpt-4.1-nano-2025-04-14`, `gpt-4o-mini-2024-07-18`, `gpt-4o-2024-11-20`, `gpt-4o-2024-08-06`, `gpt-4o-2024-05-13`, `gpt-4-0613`, `gpt-4-0314`, `gpt-4-turbo-2024-04-09`, `gpt-3.5-turbo-0125`, `gpt-3.5-turbo-1106`, `watt-tool-8b`, `watt-tool-70b`
- `tool_ids` (list of string, optional, nullable) — Liste des ID des outils utilisés par l’agent.
- `tool_ids_strict` (boolean, optional, nullable) — Only applies as a conversation override, allowed whenever tool_ids may be overridden. When true, the overridden tool_ids is the full list of tools allowed in the conversation, including tools on workflow nodes. Ignored when set on the agent.
- `native_mcp_server_ids` (list of string, optional, nullable) — Liste des identifiants de serveurs MCP natifs à utiliser par l'agent
- `knowledge_base` (list of KnowledgeBaseLocator, optional, nullable) — Liste des bases de connaissances à utiliser par l'agent

### KnowledgeBaseLocator

- `type` (enum, required) — Le type de base de connaissances.
  - Allowed values: `file`, `url`, `text`, `folder`
- `name` (string, required) — Le nom de la base de connaissances
- `id` (string, required) — L’ID de la base de connaissances
- `usage_mode` (enum, optional, default: auto) — Le mode d’utilisation de la base de connaissances
  - Allowed values: `prompt`, `auto`

## Examples

**Request**

```json
{
  "agent_id": "string",
  "agent_phone_number_id": "string",
  "to_number": "string"
}
```

**Response**

```json
{
  "success": true,
  "message": "string",
  "conversation_id": "string",
  "callSid": "string"
}
```

**SDK Code**

```python
import requests

url = "https://api.elevenlabs.io/v1/convai/exotel/outbound-call"

payload = {
    "agent_id": "string",
    "agent_phone_number_id": "string",
    "to_number": "string"
}
headers = {"Content-Type": "application/json"}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.elevenlabs.io/v1/convai/exotel/outbound-call';
const options = {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: '{"agent_id":"string","agent_phone_number_id":"string","to_number":"string"}'
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.elevenlabs.io/v1/convai/exotel/outbound-call"

	payload := strings.NewReader("{\n  \"agent_id\": \"string\",\n  \"agent_phone_number_id\": \"string\",\n  \"to_number\": \"string\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Content-Type", "application/json")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.elevenlabs.io/v1/convai/exotel/outbound-call")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n  \"agent_id\": \"string\",\n  \"agent_phone_number_id\": \"string\",\n  \"to_number\": \"string\"\n}"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.elevenlabs.io/v1/convai/exotel/outbound-call")
  .header("Content-Type", "application/json")
  .body("{\n  \"agent_id\": \"string\",\n  \"agent_phone_number_id\": \"string\",\n  \"to_number\": \"string\"\n}")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.elevenlabs.io/v1/convai/exotel/outbound-call', [
  'body' => '{
  "agent_id": "string",
  "agent_phone_number_id": "string",
  "to_number": "string"
}',
  'headers' => [
    'Content-Type' => 'application/json',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.elevenlabs.io/v1/convai/exotel/outbound-call");
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"agent_id\": \"string\",\n  \"agent_phone_number_id\": \"string\",\n  \"to_number\": \"string\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = ["Content-Type": "application/json"]
let parameters = [
  "agent_id": "string",
  "agent_phone_number_id": "string",
  "to_number": "string"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.elevenlabs.io/v1/convai/exotel/outbound-call")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```