# \[TUTO\] comment obtenir des fichiers ressources wazo api pour l'ia

**URL:** <https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923>\
**Category:** Uncategorized\
**Created:** [July 22, 2026, 7:09pm UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923 "2026-07-22T19:09:17Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Alloallo](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/alloallo/32/664_2.png) [@Alloallo](https://wazo-platform.discourse.group/u/Alloallo)\
**Post date:** [July 22, 2026, 7:09pm UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/1 "2026-07-22T19:09:17Z")

</div>

Bonjour,

Il y a quelque temps je me suis créé de la documentation api wazo pour perplexity et autres IA et llm.

Je n’ai plus les prompts exacts mais je vais expliquer le principe.

Pour commencer je suis allé sur [https://api.wazo.io/](https://api.wazo.io/) , pour chaque composant je suis allé sur API console et j’ai téléchargé la definition openapi en yml. Une fois le tout téléchargé , je suis allé sur perplexity en utilisant le modele claude de l’époque et j’ai inséré tout les fichiers de definition openapi \*.yml , en substance j’ai demandé à ce que je dispose de la bible des api wazo, extremement détaillé et expliqué au format markdown. Bon sachant que j’ai un prompt optimizer à partir de ces quelques mots ça m’a sorti un prompt de minimum 30 phrases. J’ai repris ce prompt en inserant toute les définitions openapi , et j’ai obtenu des fichier markdown, j’ai reitéré, jusqua obtenir le tout. Ensuite sur une autre session j’ai demandé à l’ia de me lister dans un document tout les scénarios chainés existant dans un fichiier markdown via l’api toujours en important les définitions de l’openapi. Bon la théorie c’est bien, mais le réeel c’est mieux. Quelques mois après j’ai donné tout ces fichier à mon hermes agent, j’ai mis en place un wazo de test auquel hermes agent avit accès afin qu’il vérifie tout les fichiers ressource via le serveur wazo de test auquel il avait accès via tailscale. Il a corrigé des fichiers ressources!!! Avec ces ressources il sait quasiment tout créé tout seul via l’api wazo. En tout cas il a su faire l’installation tout seul , la conf tout seul et plus!!! Je lui fais testé ,validé et documenté tout ce qu’il fait. Il bosse pas mal . J’avais fais le meme test avec openclaw il m’avait tout déglingué, je suis joueur , c’est qu’une vm !!

lol 😃 @+

---

<div class="post-metadata">

**Author:** ![Alloallo](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/alloallo/32/664_2.png) [@Alloallo](https://wazo-platform.discourse.group/u/Alloallo)\
**Post date:** [July 22, 2026, 7:16pm UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/2 "2026-07-22T19:16:15Z")

</div>

Plutot que me faire chier à tout tester moi meme, bien que je sois un vieux crabe, on est en 2026, autant laisser l’ia travailler et faire ses rapports!!! lol 😃

---

<div class="post-metadata">

**Author:** ![Alloallo](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/alloallo/32/664_2.png) [@Alloallo](https://wazo-platform.discourse.group/u/Alloallo)\
**Post date:** [July 22, 2026, 8:00pm UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/3 "2026-07-22T20:00:55Z")

</div>

Avec ce travail j’ai constaté quelques coquilles dans les api de wazo pltform et j’ai aussi compris que tout n’était pas exposé via l’api ou configuré sur wazo plateform!!! 😉

---

<div class="post-metadata">

**Author:** ![Alloallo](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/alloallo/32/664_2.png) [@Alloallo](https://wazo-platform.discourse.group/u/Alloallo)\
**Post date:** [July 22, 2026, 8:05pm UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/4 "2026-07-22T20:05:01Z")

</div>

Heureusement que j’ai fais bossé l’ia avec tests réels car la documentation est insuffisante et ne reflete pas la réalité des dernières versions!!! 😉

---

<div class="post-metadata">

**Author:** ![Alloallo](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/alloallo/32/664_2.png) [@Alloallo](https://wazo-platform.discourse.group/u/Alloallo)\
**Post date:** [July 22, 2026, 8:11pm UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/5 "2026-07-22T20:11:49Z")

</div>

J’ai test aussi la version micro service dockerizé qui était sabré, j’ai recréé avec l’ia le service qui était mock pour que ça tourne , ça fonctionnait bien mais je suis pas fan de docker!!! lol

---

<div class="post-metadata">

**Author:** ![Alloallo](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/alloallo/32/664_2.png) [@Alloallo](https://wazo-platform.discourse.group/u/Alloallo)\
**Post date:** [July 22, 2026, 8:14pm UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/6 "2026-07-22T20:14:31Z")

</div>

J’ai pas ma langue dans ma poche, mais j’ai l’impression que la version wazo plateform est sabré pour poussé les gens pas trop bricoleur vers wazo portal!!!

---

<div class="post-metadata">

**Author:** ![Alloallo](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/alloallo/32/664_2.png) [@Alloallo](https://wazo-platform.discourse.group/u/Alloallo)\
**Post date:** [July 22, 2026, 8:18pm UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/7 "2026-07-22T20:18:33Z")

</div>

Après c’est sur qu’il faut bien qu’une boite se finance, c’est sur que l’équilibre entre le gratuit et le payant n’est pas évident!!!

---

<div class="post-metadata">

**Author:** ![julienfr](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/julienfr/32/797_2.png) [@julienfr](https://wazo-platform.discourse.group/u/julienfr)\
**Post date:** [July 24, 2026, 7:59pm UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/8 "2026-07-24T19:59:25Z")

</div>

Bonjour,

J’ai fait pas mal de retours aux devs backend sur les fautes de documentation api et certaines sont corrigés.

Mais l’api ne couvre pas la logique et la documentation encore moins.

C’est cette logique, et/ou enchaînements d’actions qui est important.

Tu devrais utiliser le code source du wazo-js-sdk et mes applications toriphone pour améliorer ton agent ia.

Il serait même bien de récrire le js-sdk en intégrant toute la logique. J’avais commencé sur un repo privé, mais j’utilise peu l’ia et en suis déçu (chatgpt en gratuit).

Et cela me demande trop de temps.

L’idée serait d’avoir la gestion des events, un store des donnés directement dans le sdk. Ainsi il ne manquerai que le front pour avoir son app.

Et une ia pourrait utiliser ce sdk comme élément de compréhension des apis et du système, au point d’en faire rapidement une documentation complète et de pouvoir tout faire en quelques prompts.

Cheers !

---

<div class="post-metadata">

**Author:** ![Alloallo](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/alloallo/32/664_2.png) [@Alloallo](https://wazo-platform.discourse.group/u/Alloallo)\
**Post date:** [July 26, 2026, 7:16am UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/9 "2026-07-26T07:16:03Z")

</div>

Hello Merci pour ton retour,

Effectivement j’ai oublié de le mentionné mais j’avais inclus comme ressource le wazo-js-sdk , ce qui m’a permis de corriger et avoir plus d’informations. Effectivement il manque beaucoup d’information sur la logique et enchainement d’action je m’en suis aperçu lorsque j’ai créé une application permettant de créer en masse des lignes completes (utilisateurs, lignes, extensions, endpoints SIP, voicemails, comptes d’authentification) . Pour le gros travail de codage avec l’ia j’utilise hermes agent avec les modeles minimax3 ou deepseekv4 flash avec mes fichiers ressources, plus une vm de test wazo auxquels à accès hermes agent pour valider les informations et faire des tests. Pour l’instant j’ai une partie dela logique dans des fichier markdown , voici par exemple WAZO\_COOKBOOK\_PART1.md

* * *

# PARTIE 1 : Provisioning Core & Utilisateurs

Cette partie couvre les workflows fondamentaux de gestion des utilisateurs et du provisioning de base. Ces scénarios sont les plus fréquents et constituent le socle de toute intégration Wazo.

* * *

## 1.1 Création d’un Utilisateur Complet (8 Étapes)

### Objectif

Créer un utilisateur téléphonique complet avec tous les composants nécessaires : compte d’accès, ligne SIP, extension, boîte vocale, et les liaisons entre tous ces éléments. C’est le scénario le plus courant pour le provisioning de nouveaux employés.

### Services impliqués

- **wazo-confd** : Gestion des utilisateurs, lignes, extensions, endpoints SIP, voicemails
- **wazo-auth** : Gestion des comptes d’authentification

### Le Workflow détaillé

#### Étape 1 : Créer le compte utilisateur dans confd

```http
POST /api/confd/1.1/users
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "firstname": "Jean",
  "lastname": "Dupont",
  "email": "jean.dupont@acme.fr",
  "username": "jdupont",
  "caller_id": {"name": "Jean Dupont", "number": "1001"}
}

```

**Réponse :**

```json
{
  "uuid": "a1223fe6-bff8-4fb6-a982-f9157dea5094",
  "firstname": "Jean",
  "lastname": "Dupont",
  "email": "jean.dupont@acme.fr",
  "username": "jdupont",
  ...
}

```

> **🔗 Chaînage** : Récupérez le champ `uuid` — il sera utilisé dans toutes les étapes suivantes pour lier les ressources. Stockez-le dans **USER\_UUID**.

#### Étape 2 : Créer la boîte vocale (optionnel mais recommandé)

```http
POST /api/confd/1.1/voicemails
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "name": "jdupont",
  "number": "1001",
  "email": "jean.dupont@acme.fr",
  "timezone": "Europe/Paris",
  "password": "1234",
  "max_messages": 50
}

```

**Réponse :**

```json
{
  "id": 12,
  "name": "jdupont",
  "number": "1001",
  ...
}

```

> **🔗 Chaînage** : Récupérez le champ `id` — il sera utilisé pour lier la boîte vocale à l’utilisateur. Stockez-le dans **VM\_ID**.

#### Étape 3 : Créer l’endpoint SIP technique

```http
POST /api/confd/1.1/endpoints/sip
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "label": "jdupont-sip",
  "name": "jdupont",
  "auth_section_options": [
    ["username", "jdupont"],
    ["password", "secure_password_sip"]
  ],
  "endpoint_section_options": [
    ["disallow", "all"],
    ["allow", "ulaw,alaw,g722"],
    ["direct_media", "no"],
    ["rtp_symmetric", "yes"]
  ]
}

```

**Réponse :**

```json
{
  "uuid": "b2345gh7-abc9-4def-ghij-klmnopqr6789",
  "label": "jdupont-sip",
  "name": "jdupont",
  ...
}

```

> **🔗 Chaînage** : Récupérez le champ `uuid` — il sera utilisé pour lier l’endpoint SIP à la ligne. Stockez-le dans **SIP\_UUID**.

#### Étape 4 : Créer la ligne téléphonique

```http
POST /api/confd/1.1/lines
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "name": "jdupont-line",
  "context": "default",
  "caller_id_name": "Jean Dupont",
  "caller_id_number": "1001"
}

```

**Réponse :**

```json
{
  "id": 25,
  "name": "jdupont-line",
  "context": "default",
  ...
}

```

> **🔗 Chaînage** : Récupérez le champ `id` — il sera utilisé pour lier l’extension, l’endpoint SIP et l’utilisateur. Stockez-le dans **LINE\_ID**.

#### Étape 5 : Créer l’extension

```http
POST /api/confd/1.1/extensions
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "exten": "1001",
  "context": "default"
}

```

**Réponse :**

```json
{
  "id": 156,
  "exten": "1001",
  "context": "default"
}

```

> **🔗 Chaînage** : Récupérez le champ `id` — il sera utilisé pour lier l’extension à la ligne. Stockez-le dans **EXT\_ID**.

#### Étape 6 : Lier l’extension à la ligne

```http
PUT /api/confd/1.1/lines/{LINE_ID}/extensions/{EXT_ID}
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :** 204 No Content

#### Étape 7 : Lier l’endpoint SIP à la ligne

```http
PUT /api/confd/1.1/lines/{LINE_ID}/endpoints/sip/{SIP_UUID}
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :** 204 No Content

#### Étape 8 : Lier la ligne à l’utilisateur

```http
PUT /api/confd/1.1/users/{USER_UUID}/lines/{LINE_ID}
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :** 204 No Content

#### Étape 9 (optionnel) : Lier la boîte vocale à l’utilisateur

```http
PUT /api/confd/1.1/users/{USER_UUID}/voicemails/{VM_ID}
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :** 204 No Content

#### Étape 10 : Créer le compte d’authentification

```http
POST /api/auth/0.1/users
Content-Type: application/json
X-Auth-Token: {admin_token}

```

**Payload :**

```json
{
  "username": "jdupont",
  "password": "initial_password",
  "firstname": "Jean",
  "lastname": "Dupont",
  "email": "jean.dupont@acme.fr"
}

```

**Réponse :**

```json
{
  "uuid": "c3456ij8-def0-4abc-lmno-pqrstu901234",
  "username": "jdupont",
  ...
}

```

> **🔗 Chaînage** : Récupérez le champ `uuid` — il correspond au compte d’authentification. Stockez-le dans **AUTH\_USER\_UUID**.

#### Étape 11 : Lier le compte auth à l’utilisateur confd

```http
PUT /api/confd/1.1/users/{USER_UUID}
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "auth_user_uuid": "c3456ij8-def0-4abc-lmno-pqrstu901234"
}

```

**Réponse :** 200 OK

### Point d’attention / Warning

> **⚠ Important** :
> 
> - L’ordre des étapes est STRICT — l’extension doit être créée AVANT d’être liée à la ligne
> - Les passwords SIP doivent être sécurisés (minimum 12 caractères, complexité)
> - Le `context` doit exister dans Wazo (créez-le via `/api/confd/1.1/contexts` si nécessaire)
> - La boîte vocale est optionnelle mais recommandée pour un utilisateur complet

* * *

## 1.2 Suppression Propre d’un Utilisateur (8 Étapes)

### Objectif

Supprimer un utilisateur et toutes ses ressources associées de manière propre et ordonnée, sans laisser d’orphelins dans la base de données. L’ordre de suppression est critique pour éviter les erreurs de contrainte.

### Services impliqués

- **wazo-confd** : Tous les composants de configuration
- **wazo-provd** : Gestion des devices

### Le Workflow détaillé

#### Étape 1 : Récupérer les lignes de l’utilisateur

```http
GET /api/confd/1.1/users/{USER_UUID}/lines
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :**

```json
{
  "items": [
    {
      "id": 25,
      "name": "jdupont-line",
      ...
    }
  ]
}

```

> **🔗 Chaînage** : Stockez le **LINE\_ID** = 25

#### Étape 2 : Récupérer les devices associés à la ligne

```http
GET /api/confd/1.1/lines/{LINE_ID}/devices
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :**

```json
{
  "items": [
    {
      "id": "001122334455",
      "mac": "001122334455",
      "model": "Yealink T46S",
      ...
    }
  ]
}

```

> **🔗 Chaînage** : Stockez le **DEVICE\_ID** = 001122334455

#### Étape 3 : Dissocier le device de la ligne

```http
DELETE /api/confd/1.1/lines/{LINE_ID}/devices/{DEVICE_ID}
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :** 204 No Content

#### Étape 4 : Réinitialiser le device en mode autoprov

```http
POST /api/provd/0.1/devices/{DEVICE_ID}/autoprov
X-Auth-Token: {admin_token}

```

**Réponse :** 200 OK

> Cette étape permet au téléphone de se réapprovisionner automatiquement lors du prochain redémarrage.

#### Étape 5 : Récupérer les extensions de la ligne

```http
GET /api/confd/1.1/lines/{LINE_ID}/extensions
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :**

```json
{
  "items": [
    {
      "id": 156,
      "exten": "1001",
      "context": "default"
    }
  ]
}

```

> **🔗 Chaphinage** : Stockez **EXT\_ID** = 156

#### Étape 6 : Dissocier l’extension de la ligne

```http
DELETE /api/confd/1.1/lines/{LINE_ID}/extensions/{EXT_ID}
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :** 204 No Content

#### Étape 7 : Dissocier la ligne de l’utilisateur

```http
DELETE /api/confd/1.1/users/{USER_UUID}/lines/{LINE_ID}
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :** 204 No Content

#### Étape 8 : Supprimer l’extension

```http
DELETE /api/confd/1.1/extensions/{EXT_ID}
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :** 204 No Content

#### Étape 9 : Supprimer la ligne

```http
DELETE /api/confd/1.1/lines/{LINE_ID}
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :** 204 No Content

#### Étape 10 : Supprimer l’endpoint SIP

```http
DELETE /api/confd/1.1/endpoints/sip/{SIP_UUID}
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :** 204 No Content

#### Étape 11 : Supprimer l’utilisateur

```http
DELETE /api/confd/1.1/users/{USER_UUID}
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :** 204 No Content

### Point d’attention / Warning

> **⚠ Important** :
> 
> - L’ORDRE EST CRITIQUE : supprimez toujours dans l’ordre inverse de la création
> - Ne supprimez jamais un endpoint SIP utilisé par d’autres lignes
> - Le device doit être dissocié AVANT de supprimer la ligne
> - Vérifiez qu’aucun trunk ou queue n’utilise ces ressources avant suppression

* * *

## 1.3 Importation CSV en Masse d’Utilisateurs (4 Étapes)

### Objectif

Importer rapidement des dizaines ou centaines d’utilisateurs simultanément via un fichier CSV, en utilisant l’import automatique de Wazo qui crée tous les éléments en une seule opération.

### Services impliqués

- **wazo-confd** : Import des utilisateurs via endpoint spécialisé

### Le Workflow détaillé

#### Étape 1 : Récupérer le template CSV

```http
GET /api/confd/1.1/users/export
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}
Accept: text/csv

```

**Réponse (CSV) :**

```csv
firstname,lastname,email,username,extension,context,line_name,voicemail_number
Jean,Dupont,jd@acme.fr,jdupont,1001,default,jd-line,1001
Marie,Martin,mm@acme.fr,mmartin,1002,default,mm-line,1002

```

> **🔗 Chaînage** : Ce template vous montre les colonnes attendues. Préparez votre fichier CSV en suivant ce format.

#### Étape 2 : Importer le fichier CSV

```http
POST /api/confd/1.1/users/import
Content-Type: text/csv
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Body (CSV) :**

```csv
firstname,lastname,email,username,extension,context,line_name,voicemail_number
Jean,Dupont,jd@acme.fr,jdupont,1001,default,jd-line,1001
Marie,Martin,mm@acme.fr,mmartin,1002,default,mm-line,1002
Pierre,Durand,pd@acme.fr,pdurand,1003,default,pd-line,1003

```

**Réponse :**

```json
{
  "created_users": [
    {"uuid": "user-uuid-1", "username": "jdupont"},
    {"uuid": "user-uuid-2", "username": "mmartin"},
    {"uuid": "user-uuid-3", "username": "pdurand"}
  ],
  "errors": []
}

```

> **🔗 Chaînage** : La réponse contient les UUIDs créés. Stockez-les pour les utiliser dans les étapes suivantes si besoin.

#### Étape 3 : Vérifier les créations

```http
GET /api/confd/1.1/users?search=Dupont
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :**

```json
{
  "items": [
    {
      "uuid": "user-uuid-1",
      "firstname": "Jean",
      "lastname": "Dupont",
      ...
    }
  ]
}

```

#### Étape 4 : Associer les lignes aux utilisateurs (si nécessaire)

```http
PUT /api/confd/1.1/users/{USER_UUID}/lines/{LINE_ID}
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

### Point d’attention / Warning

> **⚠ Important** :
> 
> - L’import CSV crée automatiquement les lignes et extensions correspondantes
> - Les voicemails ne sont PAS créés automatiquement — faites-le séparément si besoin
> - En cas d’erreur sur une ligne, les autres lignes du fichier sont quand même créées
> - Vérifiez toujours le champ `errors` dans la réponse

* * *

## 1.4 Renvois d’Appel Utilisateur (4 Étapes)

### Objectif

Configurer les renvois d’appel (forwards) pour un utilisateur : inconditionnel, sur occupation, et sur non-réponse. Ces services permettent la continuité des communications en cas d’absence.

### Services impliqués

- **wazo-confd** : Configuration des services de renvoi

### Le Workflow détaillé

#### Étape 1 : Lister les renvois actuels

```http
GET /api/confd/1.1/users/{USER_UUID}/forwards
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :**

```json
{
  "items": [
    {
      "type": "unconditional",
      "enabled": false,
      "destination": null
    },
    {
      "type": "busy",
      "enabled": false,
      "destination": null
    },
    {
      "type": "noanswer",
      "enabled": false,
      "destination": null
    }
  ]
}

```

#### Étape 2 : Configurer le renvoi inconditionnel

```http
PUT /api/confd/1.1/users/{USER_UUID}/forwards/unconditional
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "enabled": true,
  "destination": "1005"
}

```

**Réponse :**

```json
{
  "enabled": true,
  "destination": "1005"
}

```

> **🔗 Chaînage** : Le numéro de destination peut être une extension interne ou un numéro externe

#### Étape 3 : Configurer le renvoi sur occupation

```http
PUT /api/confd/1.1/users/{USER_UUID}/forwards/busy
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "enabled": true,
  "destination": "2001"
}

```

#### Étape 4 : Configurer le renvoi sur non-réponse

```http
PUT /api/confd/1.1/users/{USER_UUID}/forwards/noanswer
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "enabled": true,
  "destination": "3000",
  "timeout": 18
}

```

| Paramètre | Description |
| --- | --- |
| `timeout` | Durée avant renvoi (en secondes, défaut: 18) |

### Point d’attention / Warning

> **⚠ Important** :
> 
> - Le renvoi inconditionnel est prioritaire sur tous les autres
> - Le timeout du renvoi sur non-réponse doit être inférieur au timeout de la ligne
> - Les destinations externes nécessitent les droits d’appels sortants appropriés

* * *

## 1.5 Services Utilisateur : DND et Filtre d’Appel (4 Étapes)

### Objectif

Activer le mode “Ne Pas Déranger” (DND) et le filtre d’appel entrant pour un utilisateur. Le DND bloque tous les appels entrants ; le filtre permet de筛选 les appels selon certaines règles.

### Services impliqués

- **wazo-confd** : Services DND et incallfilter

### Le Workflow détaillé

#### Étape 1 : Activer le DND

```http
PUT /api/confd/1.1/users/{USER_UUID}/services/dnd/enable
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :**

```json
{
  "enabled": true
}

```

#### Étape 2 : Désactiver le DND

```http
PUT /api/confd/1.1/users/{USER_UUID}/services/dnd/disable
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

#### Étape 3 : Activer le filtre d’appel entrant

```http
PUT /api/confd/1.1/users/{USER_UUID}/services/incallfilter/enable
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :**

```json
{
  "enabled": true
}

```

#### Étape 4 : Désactiver le filtre d’appel entrant

```http
PUT /api/confd/1.1/users/{USER_UUID}/services/incallfilter/disable
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

### Point d’attention / Warning

> **⚠ Important** :
> 
> - Depuis XiVO 16.13, le DND est effectif indépendamment de l’extension \*25
> - Le filtre d’appel nécessite une configuration supplémentaire des règles de filtrage

* * *

## 1.6 Création d’un Nouveau Tenant (Multi-Tenant) (7 Étapes)

### Objectif

Créer un nouveau tenant isolé pour un client ou un département, avec ses propres contextes, utilisateurs et politiques d’accès. Le multi-tenant permet une isolation complète des données.

### Services impliqués

- **wazo-auth** : Gestion des tenants et utilisateurs d’authentification
- **wazo-confd** : Gestion des contextes

### Le Workflow détaillé

#### Étape 1 : Créer le tenant

```http
POST /api/auth/0.1/tenants
Content-Type: application/json
X-Auth-Token: {admin_token}

```

**Payload :**

```json
{
  "name": "ACME Corp",
  "slug": "acme"
}

```

**Réponse :**

```json
{
  "uuid": "tenant-uuid-acme123",
  "name": "ACME Corp",
  "slug": "acme",
  "parent_uuid": "master-tenant-uuid"
}

```

> **🔗 Chaînage** : Récupérez le champ `uuid` — il sera utilisé pour toutes les opérations sur ce tenant. Stockez-le dans **TENANT\_UUID**.

#### Étape 2 : Créer l’utilisateur administrateur du tenant

```http
POST /api/auth/0.1/users
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "username": "admin_acme",
  "password": "secure_password",
  "firstname": "Admin",
  "lastname": "ACME"
}

```

**Réponse :**

```json
{
  "uuid": "admin-auth-uuid-456",
  "username": "admin_acme",
  ...
}

```

> **🔗 Chaînage** : Stockez **ADMIN\_AUTH\_UUID**

#### Étape 3 : Créer une policy d’administration

```http
POST /api/auth/0.1/policies
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "name": "admin-policy",
  "description": "Full admin access for ACME tenant",
  "acl": [
    "confd.#",
    "calld.#",
    "provd.#"
  ]
}

```

**Réponse :**

```json
{
  "uuid": "policy-uuid-789",
  "name": "admin-policy",
  ...
}

```

> **🔗 Chaînage** : Stockez **POLICY\_UUID**

#### Étape 4 : Assigner la policy à l’administrateur

```http
POST /api/auth/0.1/users/{ADMIN_AUTH_UUID}/policies
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "policy_uuid": "policy-uuid-789"
}

```

#### Étape 5 : Créer le contexte interne pour le tenant

```http
POST /api/confd/1.1/contexts
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "label": "interne-acme",
  "name": "Interne ACME",
  "type": "internal",
  "user_ranges": [
    {"start": "1000", "end": "1999"}
  ]
}

```

**Réponse :**

```json
{
  "id": 45,
  "label": "interne-acme",
  "type": "internal",
  ...
}

```

> **🔗 Chaînage** : Stockez **CTX\_INTERNAL\_ID** = 45

#### Étape 6 : Créer le contexte entrant pour le tenant

```http
POST /api/confd/1.1/contexts
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "label": "entrant-acme",
  "name": "Entrant ACME",
  "type": "incall",
  "incall_ranges": [
    {"start": "003338000100", "end": "003338000200"}
  ]
}

```

**Réponse :**

```json
{
  "id": 46,
  "label": "entrant-acme",
  "type": "incall",
  ...
}

```

> **🔗 Chaînage** : Stockez **CTX\_INCALL\_ID** = 46

#### Étape 7 : Vérifier le tenant

```http
GET /api/auth/0.1/tenants/{TENANT_UUID}
X-Auth-Token: {admin_token}

```

### Point d’attention / Warning

> **⚠ Important** :
> 
> - Le header `Wazo-Tenant` est OBLIGATOIRE pour toutes les opérations après la création du tenant
> - L’ACL `confd.#` donne accès à toutes les ressources confd du tenant
> - Les contextes créés n’ont pas de relation automatique — créez des liens explicites si nécessaire
> - La suppression d’un tenant est IRRÉVERSIBLE

* * *

## 1.7 Fallbacks et Options Utilisateur (4 Étapes)

### Objectif

Configurer les fallbacks (renvois en cas d’indisponibilité) et les options avancées d’un utilisateur : timeout, destination si pas de réponse, boîte vocale, etc.

### Services impliqués

- **wazo-confd** : Configuration des fallbacks utilisateur

### Le Workflow détaillé

#### Étape 1 : Récupérer les fallbacks actuels

```http
GET /api/confd/1.1/users/{USER_UUID}/fallbacks
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Réponse :**

```json
{
  "noanswer_destination": null,
  "busy_destination": null,
  "congestion_destination": null,
  "fail_destination": null,
  "noanswer_timeout": 18
}

```

#### Étape 2 : Configurer le fallback sur non-réponse

```http
PUT /api/confd/1.1/users/{USER_UUID}/fallbacks
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "noanswer_destination": {
    "type": "voicemail",
    "voicemail_id": 12
  },
  "noanswer_timeout": 25
}

```

#### Étape 3 : Configurer le fallback sur occupation

```http
PUT /api/confd/1.1/users/{USER_UUID}/fallbacks
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "busy_destination": {
    "type": "voicemail",
    "voicemail_id": 12
  }
}

```

#### Étape 4 : Configurer le fallback sur indisponibilité (fail)

```http
PUT /api/confd/1.1/users/{USER_UUID}/fallbacks
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "fail_destination": {
    "type": "extension",
    "extension": "1000",
    "context": "default"
  }
}

```

| Type de destination | Paramètres requis |
| --- | --- |
| `voicemail` | `voicemail_id` |
| `extension` | `extension`, `context` |
| `user` | `user_id` |
| `custom` | `content` (dialplan) |

### Point d’attention / Warning

> **⚠ Important** :
> 
> - Le `noanswer_timeout` doit être cohérent avec le timeout de sonnerie du téléphone
> - Les fallbacks sont évalués dans l’ordre : busy → noanswer → congestion → fail
> - Configurez toujours une destination de dernier recours (fallback final)

* * *

## 1.8 Gestion des Funckeys (Touches de Fonction) (5 Étapes)

### Objectif

Configurer les touches de fonction (BLF, speed dial, pickup) sur les телефонов prenant en charge les touches programmable. Ces touches permettent un accès rapide aux fonctions fréquentes.

### Services impliqués

- **wazo-confd** : Configuration des funckeys

### Le Workflow détaillé

#### Étape 1 : Lister les destinations disponibles

```http
GET /api/confd/1.1/funckeys/destinations
X-Auth-Token: {admin_token}

```

**Réponse :**

```json
{
  "items": [
    {"type": "user", "description": "Appeler un utilisateur"},
    {"type": "queue", "description": "Appeler une file d'attente"},
    {"type": "custom", "description": "Extension personnalisée"},
    {"type": "transfer", "description": "Transférer l'appel"},
    {"type": "bsfilter", "description": "Filtre boss-secrétaire"}
  ]
}

```

#### Étape 2 : Créer un template de funckeys

```http
POST /api/confd/1.1/funckeys/templates
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "name": "standard-template",
  "keys": {
    "1": {
      "destination_type": "user",
      "user_id": "user-uuid-1"
    },
    "2": {
      "destination_type": "queue",
      "queue_id": 10
    },
    "3": {
      "destination_type": "custom",
      "extension": "*25",
      "label": "DND"
    }
  }
}

```

**Réponse :**

```json
{
  "id": 5,
  "name": "standard-template",
  "keys": {...}
}

```

> **🔗 Chaînage** : Stockez **TEMPLATE\_ID** = 5

#### Étape 3 : Appliquer le template à un utilisateur

```http
PUT /api/confd/1.1/users/{USER_UUID}/funckeys/templates/{TEMPLATE_ID}
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

#### Étape 4 : Ajouter une funckey individuelle (override)

```http
PUT /api/confd/1.1/users/{USER_UUID}/funckeys/5
Content-Type: application/json
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

**Payload :**

```json
{
  "destination_type": "custom",
  "extension": "*26",
  "label": "Renvoi ON",
  "blf": true
}

```

#### Étape 5 : Récupérer les funckeys fusionnées

```http
GET /api/confd/1.1/users/{USER_UUID}/funckeys?view=merged
X-Auth-Token: {admin_token}
Wazo-Tenant: {tenant_uuid}

```

### Point d’attention / Warning

> **⚠ Important** :
> 
> - Le paramètre `blf: true` permet la surveillance d’état (Busy Lamp Field)
> - Les funckeys individuelles surchargent le template
> - La suppression d’une funckey la retire complètement

* * *

## 1.9 Récapitulatif des Endpoints Utilisateur

| Ressource | CRUD | Endpoint |
| --- | --- | --- |
| Utilisateur | C | POST /users |
| Utilisateur | R | GET /users/{uuid} |
| Utilisateur | U | PUT /users/{uuid} |
| Utilisateur | D | DELETE /users/{uuid} |
| Ligne | C | POST /lines |
| Extension | C | POST /extensions |
| Endpoint SIP | C | POST /endpoints/sip |
| Voicemail | C | POST /voicemails |
| Forward | U | PUT /users/{uuid}/forwards/{type} |
| DND | U | PUT /users/{uuid}/services/dnd/enable |
| Fallback | U | PUT /users/{uuid}/fallbacks |
| Funckey | C | PUT /users/{uuid}/funckeys/{position} |

* * *

_Fin de la PARTIE 1_

---

<div class="post-metadata">

**Author:** ![julienfr](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/julienfr/32/797_2.png) [@julienfr](https://wazo-platform.discourse.group/u/julienfr)\
**Post date:** [July 26, 2026, 7:52am UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/10 "2026-07-26T07:52:51Z")

</div>

Cela peut vraiment aider comme doc, et l’avoir sous forme de fonctions disponibles dans le sdk serait un réel plus.

Joli travail !

---

<div class="post-metadata">

**Author:** ![Alloallo](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/alloallo/32/664_2.png) [@Alloallo](https://wazo-platform.discourse.group/u/Alloallo)\
**Post date:** [July 26, 2026, 9:55am UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/11 "2026-07-26T09:55:24Z")

</div>

Merci . J’en ai 5 comme ça de cookbook plus 9 autres que j’ai appelé wazo bible couvrant toute les api couvrant à peu près toute les fonctionnalités. Javascript c’est pas trop ma tasse de thé donc j’ai fais travaillé L’ia . Au début j’ai fais bcp de choses en utilisant perplexity car tu peux créer un espace spécifique avec des instructions et donner des fichiers ressources de références. Donc j’avais créé un espace spécifique de développement wazo avec tout mes fichiers de références et le wazojs\_sdk et j’utilisais essentiellement le modèle claude sonnet qui est assez performant. Mais ça faisait bcp de va et vient entre perplexity et vscode + les tests. Après je suis passé à hermes agent couplé à opencode et openspec et une vm de test wazo afin que hermes agent puisse faire tout les test en automatique sur mon wazo de test quand je lui demande. Contrairement à un chat ia ou tu doit faire des va et vient avec ce workflow ça fait une bonne partie du code tout seul avec test unitaires, corrections, doc… Le couplage hermes agent et opencode et openspec est vraiment un banger j’ai de très bon résultat, meilleur que si je fais seulement codé hermes agent à partir d’un cahier des charges.

---

<div class="post-metadata">

**Author:** ![Alloallo](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/alloallo/32/664_2.png) [@Alloallo](https://wazo-platform.discourse.group/u/Alloallo)\
**Post date:** [July 26, 2026, 9:58am UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/12 "2026-07-26T09:58:09Z")

</div>

Re, le temps de faire quelques courses , j’ai fai créé à l’ia une version amélioré du wazo js intégrant tout les fonctionnalités des wazo cookbook je n’ai pas encore regardé et testé

---

<div class="post-metadata">

**Author:** ![Alloallo](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/alloallo/32/664_2.png) [@Alloallo](https://wazo-platform.discourse.group/u/Alloallo)\
**Post date:** [July 26, 2026, 10:45am UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/13 "2026-07-26T10:45:17Z")

</div>

Re,

J’ai poussé toute ma doc ici..

Le fichier **WAZO\_API\_BIBLE\_CH9\_ARI.md** est assez intéressant car très faux dans la doc d’origine. ça peut etre utile pour test [GitHub - hkjarral/AVA-AI-Voice-Agent-for-Asterisk: An open-source AI Voice Agent that integrates with Asterisk/FreePBX using Audiosocket/RTP technology · GitHub](https://github.com/hkjarral/AVA-AI-Voice-Agent-for-Asterisk) , j’ai pondu ou fais pondre des scripts de deploiement pour ava-ai pour wazo dans un repo privé!!!

---

<div class="post-metadata">

**Author:** ![chuckl](https://avatars.discourse-cdn.com/v4/letter/c/0ea827/32.png) [@chuckl](https://wazo-platform.discourse.group/u/chuckl)\
**Post date:** [July 27, 2026, 6:56pm UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/14 "2026-07-27T18:56:55Z")

</div>

En effet on est en connaissance qu’il manque des guides d’utilisation des APIs pour certains scénarios d’utilisation communs / complexes, et qu’il y a parfois des erreurs ou manquement à corriger.

Sentez-vous libre de contribuer à cette doc communautaire en soumettant des PRs pour remplir les trous ou corriger les erreurs que vous voyez, c’est bien apprécier.  
Évidemment soumettre une PR c’est pas une garantie qu’elle soit intégrée directement et rapidement, la revue est pas gratuite et on peut avoir à faire des demandes de changements avant que les PRs soient acceptées.

Faire de petites PRs qui minimizent les changements aide aussi à ce que les contributions soient faciles à reviser et d’avoir un cycle d’intégration rapide.

---

<div class="post-metadata">

**Author:** ![athom](https://avatars.discourse-cdn.com/v4/letter/a/e0b2c6/32.png) [@athom](https://wazo-platform.discourse.group/u/athom)\
**Post date:** [July 28, 2026, 1:24am UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/15 "2026-07-28T01:24:55Z")

</div>

Allo super interressant le job que tu as effectué. je debute avec wazo et j’apprends a comprendre l’ecosysteme j,ai galeré a mettre en place les fonctionnalités de base depuis le UI, j’aimerais donc prendre connaissance de tes fichiers .md mais malheuresement ton repo github ne fonctionne pas

 ![image](https://global.discourse-cdn.com/free1/uploads/wazo_platform/original/2X/d/d5740e23af5388d6d47366c3490b8f1175efa66f.png)

---

<div class="post-metadata">

**Author:** ![Alloallo](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/alloallo/32/664_2.png) [@Alloallo](https://wazo-platform.discourse.group/u/Alloallo)\
**Post date:** [July 28, 2026, 5:23am UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/16 "2026-07-28T05:23:11Z")

</div>

# Bible API Wazo — Guide du Développeur Expert

> **Document technique exclusif** — Wazo Platform (Unified Communications as a Service)
> 
> Version: 2.0 — Mars 2026
> 
> _Architecture microservices, REST API, WebSockets, Multi-tenant_

* * *

# CHAPITRE 1 : Fondations et Architecture Wazo

## 1.1 Écosystème Microservices Wazo

Wazo est une plateforme de communications unifiées reposant sur une architecture **microservices distribuée**. Chaque service est un démon indépendant, déployé sur le serveur Wazo, communiquant via des APIs RESTful et un bus de messages (RabbitMQ). Cette architecture permet une scalabilité horizontale, une maintenance modulaire et une isolation des fonctionnalités.

### 1.1.1 Cartographie des Services

> **IMPORTANT - Routing nginx** : Toutes les API Wazo Admin passent par nginx sur le **port 443**. Les ports directs ci-dessous sont uniquement pour debugging ou accès direct. Utilisez toujours les routes nginx.

| Service | Port Direct | Nginx Route | Version API | Rôle Métier | Base URL Complete |
| --- | --- | --- | --- | --- | --- |
| **wazo-auth** | 9497 | /api/auth/0.1/\* | 0.1 | Authentification, gestion des tokens, ACL | `https://{host}/api/auth/0.1` |
| **wazo-confd** | 9486 | /api/confd/1.1/\* | 1.1 | Configuration centrale | `https://{host}/api/confd/1.1` |
| **wazo-provd** | 8667 | /api/provd/0.1/\* | 0.1 | Provisioning terminaux | `https://{host}/api/provd/0.1` |
| **wazo-calld** | 9500 | /api/calld/1.0/\* | 1.0 | Contrôle appels temps réel | `https://{host}/api/calld/1.0` |
| **wazo-chatd** | 9500 | /api/chatd/1.0/\* | 1.0 | Présences XMPP, messaging | `https://{host}/api/chatd/1.0` |
| **wazo-webhookd** | 9300 | /api/webhookd/1.0/\* | 1.0 | Webhooks HTTP | `https://{host}/api/webhookd/1.0` |
| **wazo-call-logd** | 9298 | /api/call-logd/1.0/\* | 1.0 | Historique CDR | `https://{host}/api/call-logd/1.0` |
| **wazo-dird** | 9489 | /api/dird/0.1/\* | 0.1 | Annuaires | `https://{host}/api/dird/0.1` |
| **wazo-plugind** | 9400 | /api/plugind/0.1/\* | 0.1 | Plugins système | `https://{host}/api/plugind/0.1` |
| **wazo-agentd** | 9500 | /api/agentd/1.0/\* | 1.0 | Gestion agents ACD | `https://{host}/api/agentd/1.0` |
| **wazo-websocketd** | 9502 | /api/websocketd/\* | 2.0 | WebSocket events | `wss://{host}/api/websocketd/` |
| **wazo-amid** | 9498 | /api/amid/1.0/\* | 1.0 | Proxy AMI Asterisk | `https://{host}/api/amid/1.0` |
| **wazo-phoned** | 9496 | /api/phoned/0.1/\* | 0.1 | Push mobile, lookup | `https://{host}/api/phoned/0.1` |

> **Note critique** : wazo-calld, wazo-chatd et wazo-agentd partagent le port 9500 mais se distinguent par leur chemin de base. wazo-call-logd utilise le port 9298 (ne partage pas le 9500).

### 1.1.2 Communication Inter-Services

Les services Wazo communiquent selon deux modèles :

1. **Communication synchrone (REST)** : Requêtes HTTP directes entre le client et les services. Chaque requête doit inclure un token d’authentification valide.

2. **Communication asynchrone (Bus de messages)** : Wazo utilise **RabbitMQ** avec l’échange `wazo` (topic). Les événements sont publiés sous forme de messages JSON structurés. Les clients peuvent s’abonner à ces événements via WebSocket ou HTTP long-polling.

```json
// Exemple de message bus (événement user.created)
{
  "name": "user_created",
  "timestamp": "2026-03-07T15:30:00.000000Z",
  "origin_uuid": "server-uuid-001",
  "data": {
    "uuid": "user-uuid-1234",
    "firstname": "Alice",
    "lastname": "Dupont",
    "tenant_uuid": "tenant-uuid-main"
  }
}

```

### 1.1.3 Cycle de Vie d’une Requête API

```auto
┌─────────────────────────────────────────────────────────────────────────────┐
│ CYCLE DE VIE REQUÊTE API WAZO │
└─────────────────────────────────────────────────────────────────────────────┘

  [Client]
     │
     │ 1. Requête HTTP
     │ Headers: X-Auth-Token, Accept, Content-Type
     ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ wazo-auth (Port 9497) │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Validation du token │ │
│ │ ├─ Token expiré? → 401 Unauthorized │ │
│ │ ├─ ACL insuffisante? → 403 Forbidden │ │
│ │ └─ Token valide → Passage à wazo-confd │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
     │
     │ (Le token porte les infos: user_uuid, tenant_uuid, ACLs)
     ▼
┌─────────────────────────────────────────────────────────────────────────────┐
│ wazo-confd (Port 9486) │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ Vérification ACL + Filtrage tenant │ │
│ │ ├─ Tentative d'accès resource autre tenant → 404 │ │
│ │ └─ Autorisé → Exécution opération CRUD │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────┐ │
│ │ Réponse HTTP │ │
│ │ 200/201/204/400/ │ │
│ │ 401/403/404/409/500 │ │
│ └──────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
     │
     ▼
  [Client]

```

* * *

## 1.2 Architecture Multi-Tenant

Wazo est nativement **multi-tenant**. Chaque tenant (aussi appelé “organisation” ou “client”) est isolé des autres au niveau des données et des permissions. Cette isolation est gérée à trois niveaux :

1. **Niveau base de données** : Chaque tenant possède ses propres enregistrements dans les tables PostgreSQL.
2. **Niveau API** : Le header `Wazo-Tenant` permet de filtrer les requêtes.
3. **Niveau ACL** : Les politiques définissent les droits d’accès par tenant.

### 1.2.1 Structure Hiérarchique des Tenants

```auto
┌─────────────────────────────────────────────────────────────────────────────┐
│ HIÉRARCHIE TENANTS WAZO │
└─────────────────────────────────────────────────────────────────────────────┘

                          [Tenant Root]
                                │
                    ┌───────────┴───────────┐
                    │ │
            [Tenant Principal] [Sous-Tenant A]
            (Master Tenant) │
                    │ │
          ┌─────────┴─────────┐ │
          │ │ │
    [Sous-Tenant B] [Sous-Tenant C] [Sous-Tenant D]

```

Chaque tenant possède un **UUID unique** au format UUID v4 :

```auto
tenant-uuid-main: 6118e18b-17e2-49ef-a59c-0759063b9548
tenant-uuid-enfant: a1b2c3d4-e5f6-7890-abcd-ef1234567890

```

### 1.2.2 Header `Wazo-Tenant` — Guide Complet

Le header `Wazo-Tenant` est **obligatoire** pour toute opération multi-tenant, sauf pour le tenant principal (root).

#### Syntaxe

```http
Wazo-Tenant: {tenant_uuid}

```

#### Exemples de Requêtes

```bash
# Requête SANS header Wazo-Tenant → Accès au tenant root (premier tenant configuré)
curl -k -X GET \
  -H "Accept: application/json" \
  -H "X-Auth-Token: {token}" \
  https://wazo.example.com:9486/api/confd/1.1/users

# Requête AVEC header Wazo-Tenant → Accès à un tenant spécifique
curl -k -X GET \
  -H "Accept: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: 6118e18b-17e2-49ef-a59c-0759063b9548" \
  https://wazo.example.com:9486/api/confd/1.1/users

```

#### Création d’un Sous-Tenant

Pour créer un sous-tenant, utilisez l’API wazo-auth :

```bash
curl -k -X POST \
  -H "Accept: application/json" \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_parent_uuid}" \
  -d '{
    "name": "Sous-Tenant-A",
    "slug": "sous-tenant-a"
  }' \
  https://wazo.example.com:9497/api/auth/0.1/tenants

# Réponse (201 Created)
{
  "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "name": "Sous-Tenant-A",
  "slug": "sous-tenant-a",
  "parent_uuid": "6118e18b-17e2-49ef-a59c-0759063b9548"
}

```

#### Récupérer la Liste des Tenants Accessibles

```bash
curl -k -X GET \
  -H "Accept: application/json" \
  -H "X-Auth-Token: {token}" \
  https://wazo.example.com:9497/api/auth/0.1/tenants

# Réponse (200 OK)
{
  "total": 3,
  "items": [
    {
      "uuid": "6118e18b-17e2-49ef-a59c-0759063b9548",
      "name": "Tenant Principal",
      "slug": "tenant-principal",
      "parent_uuid": null
    },
    {
      "uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
      "name": "Sous-Tenant A",
      "slug": "sous-tenant-a",
      "parent_uuid": "6118e18b-17e2-49ef-a59c-0759063b9548"
    }
  ]
}

```

> **⚠ Attention** : Si vous êtes administrateur d’un sous-tenant, vous **ne pouvez pas** créer de tenant parent via l’API. Seuls les administrateurs du tenant root peuvent créer des hiérarchies de tenants.

### 1.2.3 Isolation des Ressources par Tenant

Chaque ressource Wazo est liée à un `tenant_uuid`. Les règles d’isolation sont les suivantes :

| Ressource | Champ tenant\_uuid | Comportement |
| --- | --- | --- |
| **Users** | `tenant_uuid` (propriété) | Réservé au tenant créateur |
| **Lines** | `tenant_uuid` (propriété) | Réservé au tenant créateur |
| **Extensions** | `tenant_uuid` (propriété) | Réservé au tenant créateur |
| **Devices** | `tenant_uuid` (propriété) | Réservé au tenant créateur |
| **Trunks** | `tenant_uuid` (propriété) | Réservé au tenant créateur |
| **Queues** | `tenant_uuid` (propriété) | Réservé au tenant créateur |
| **IVR** | `tenant_uuid` (propriété) | Réservé au tenant créateur |
| **Schedules** | `tenant_uuid` (propriété) | Réservé au tenant créateur |

**Requête avec tenant incorrect** :

```bash
# Tentative d'accès à un user d'un autre tenant
curl -k -X GET \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: tenant-a-uuid" \
  https://wazo.example.com:9486/api/confd/1.1/users/user-uuid-autre-tenant

# Réponse (404 Not Found) — Le user existe mais n'est pas dans ce tenant
{
  "error": "Not Found",
  "details": "User not found"
}

```

* * *

## 1.3 Règles Communes des APIs Wazo

### 1.3.1 Paramètres Génériques

Toutes les APIs Wazo (confd, auth, provd, calld, etc.) partagent un ensemble de paramètres communs pour la manipulation des listes de ressources.

| Paramètre | Type | Description | Exemple |
| --- | --- | --- | --- |
| `limit` | `int` | Nombre maximum d’éléments retournés (pagination) | `?limit=25` |
| `offset` | `int` | Index de départ pour la pagination | `?offset=50` |
| `search` | `string` | Recherche textuelle sur tous les champs indexables | `?search=alice` |
| `order` | `string` | Colonne de tri | `?order=firstname` |
| `direction` | `string` | Ordre de tri : `asc` ou `desc` | `?direction=desc` |

#### Exemple Combiné

```bash
# Liste des utilisateurs 26-50, triés par nom décroissant, contenant "dupont"
curl -k -X GET \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/users?limit=25&offset=25&search=dupont&order=firstname&direction=desc"

```

#### Format de Réponse Paginée

```json
{
  "total": 150,
  "items": [
    {
      "uuid": "user-uuid-001",
      "firstname": "Alice",
      "lastname": "Dupont",
      "email": "alice@example.com"
    }
  ]
}

```

Le champ `total` indique le nombre **total** de ressources correspondantes, toutes pages confondues. Utilisez-le pour calculer le nombre de pages : `pages = ceil(total / limit)`.

### 1.3.2 Headers HTTP Communs

| Header | Valeur | Obligatoire | Description |
| --- | --- | --- | --- |
| `Accept` | `application/json` | **Oui** | Indique que le client attend du JSON |
| `Content-Type` | `application/json` | Oui (POST/PUT) | Type du corps de la requête |
| `X-Auth-Token` | `{token_string}` | **Oui** | Token d’authentification |
| `Wazo-Tenant` | `{tenant_uuid}` | Conditionnel | UUID du tenant (obligatoire si multi-tenant) |

### 1.3.3 Codes HTTP et Gestion des Erreurs

Wazo utilise les codes HTTP standard. Voici les codes les plus fréquents :

| Code | Signification | Cause Commune | Détail |
| --- | --- | --- | --- |
| **200** | OK | Requête GET/PUT réussie | Corps de réponse présent |
| **201** | Created | Ressource créée avec POST | Corps avec la nouvelle ressource |
| **204** | No Content | DELETE ou PUT réussie sans retour | Pas de corps de réponse |
| **400** | Bad Request | JSON invalide, paramètre manquant | Voir `details` dans la réponse |
| **401** | Unauthorized | Token manquant ou expiré | Token non valide ou expiré |
| **403** | Forbidden | Token valide mais ACL insuffisante | Permissions insuffisantes |
| **404** | Not Found | Ressource inexistante ou endpoint invalide | UUID incorrect ou permission denied |
| **409** | Conflict | Ressource déjà existante | Doublon sur champ unique |
| **415** | Unsupported Media Type | Header `Content-Type` manquant | POST/PUT sans JSON |
| **422** | Unprocessable Entity | Données syntaxiquement correctes mais sémantiquement invalides | Contrainte métier non respectée |
| **500** | Internal Server Error | Erreur interne Wazo | Erreur côté serveur |

#### Format Standard des Réponses d’Erreur

```json
{
  "error": "Bad Request",
  "details": "Missing required field: 'firstname'",
  "timestamp": "2026-03-07T15:30:00.123456Z",
  "resource": "users"
}

```

#### Classe Exception Python (WazoAPIError)

Si vous utilisez le SDK Python `wazo-confd-client`, les erreurs sont levées sous forme d’exception :

```python
from wazo_confd_client import Client
from wazo_confd_client.error import WazoAPIError

client = Client('wazo.example.com', username='admin', password='pass')

try:
    user = client.users.create({'firstname': 'Alice'})
except WazoAPIError as e:
    print(f"Status: {e.status_code}") # 400
    print(f"Error: {e.message}") # Bad Request
    print(f"Details: {e.details}") # Missing required field: 'firstname'

```

### 1.3.4 Conventions de Nommage des Endpoints

Wazo suit les conventions RESTful :

- **Collection** : `/users` — GET (liste), POST (création)
- **Ressource individuelle** : `/users/{uuid}` — GET, PUT, DELETE
- **Sous-ressource (association)** : `/users/{uuid}/lines/{line_id}` — PUT, DELETE
- **Action spécifique** : `/users/{uuid}/lines/{line_id}/update` — POST

#### Ressources Imbriquées Courantes

```bash
# Ligne liée à un utilisateur
/users/{user_uuid}/lines/{line_id}

# Extension liée à une ligne
/lines/{line_id}/extensions/{extension_id}

# Endpoint SIP lié à une ligne
/lines/{line_id}/endpoints/sip/{endpoint_uuid}

# Extension liée à un groupe
/groups/{group_uuid}/extensions/{extension_id}

```

* * *

## 1.4 Modèle de Données Relationnel

Wazo est un système **fortement relationnel**. Comprendre les relations entre objets est crucial pour l’intégration.

### 1.4.1 Schéma de Relations Fondamental

```auto
┌─────────────────────────────────────────────────────────────────────────────┐
│ SCHÉMA RELATIONNEL WAZO CORE │
└─────────────────────────────────────────────────────────────────────────────┘

                           ┌──────────────┐
                           │ CONTEXT │
                           │ (default, │
                           │ from-extern) │
                           └──────┬───────┘
                                  │
            ┌─────────────────────┼─────────────────────┐
            │ │ │
            ▼ ▼ ▼
    ┌───────────────┐ ┌───────────────┐ ┌───────────────┐
    │ EXTENSION │ │ EXTENSION │ │ EXTENSION │
    │ (numéro) │ │ (numéro) │ │ (numéro) │
    └───────┬───────┘ └───────┬───────┘ └───────┬───────┘
            │ │ │
            └──────────┬──────────┘ │
                       │ │
                       ▼ │
              ┌────────────────┐ │
              │ LINE │◄────────────────────────┘
              │ (protocol) │
              └───────┬───────┘
                      │
      ┌───────────────┼───────────────┐
      │ │ │
      ▼ ▼ ▼
┌───────────┐ ┌───────────┐ ┌───────────┐
│ ENDPOINT │ │ USER │ │ DEVICE │
│ (SIP) │ │ (agent) │ │ (phone) │
└───────────┘ └───────────┘ └───────────┘

```

### 1.4.2 Règles d’Association

| Association | Régle | Exemple |
| --- | --- | --- |
| **Line → Extension** | 1:1 ou 1:0 (optionnelle) | Une ligne peut avoir 0 ou 1 extension |
| **Line → Endpoint SIP** | 1:1 | Une ligne doit être liée à exactement 1 endpoint |
| **Line → User** | 1:N | Un utilisateur peut avoir plusieurs lignes |
| **Extension → Destination** | N:1 | Plusieurs extensions peuvent pointer vers un même IVR, Queue, Group |
| **User → Voicemail** | 1:0 ou 1:1 | Un utilisateur peut avoir 0 ou 1 boite vocale |
| **Device → Line** | N:M | Un téléphone peut être associé à plusieurs lignes |

> **⚠ Attention critique** : Une ligne **doit** être liée à un endpoint SIP pour fonctionner. Sans endpoint, la ligne n’a pas de configuration technique et le téléphone ne pourra pas s’enregistrer. De même, sans extension, la ligne n’est pas joignable depuis l’extérieur.

* * *

---

<div class="post-metadata">

**Author:** ![Alloallo](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/alloallo/32/664_2.png) [@Alloallo](https://wazo-platform.discourse.group/u/Alloallo)\
**Post date:** [July 28, 2026, 5:25am UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/17 "2026-07-28T05:25:48Z")

</div>

# CHAPITRE 2 : Authentification et Sécurité (wazo-auth)

## 2.1 Introduction à wazo-auth

**wazo-auth** est le service central d’authentification de la plateforme Wazo. Il gère :

- La création et la validation des **tokens d’accès**
- Les **utilisateurs d’authentification** (distincts des utilisateurs telephony)
- Les **politiques d’accès** (policies) et les **ACL** (Access Control Lists)
- Les **groupes d’utilisateurs** pour le regroupement de permissions
- L’ **usurpation d’identité** (impersonation) pour les requêtes admin
- L’authentification **LDAP** et **SAML**

> **Distinction fondamentale** : Les utilisateurs gérés par wazo-auth (`/api/auth/0.1/users`) sont **différents** des utilisateurs telephony gérés par wazo-confd (`/api/confd/1.1/users`). Les premiers concernent l’accès à l’API, les seconds représentent les agents dans le système de communications.

## 2.2 Création de Token — Guide Complet

### 2.2.1 Endpoint

```http
POST /api/auth/0.1/token

```

### 2.2.2 Headers

| Header | Valeur | Obligatoire |
| --- | --- | --- |
| `Content-Type` | `application/json` | **Oui** |
| `Accept` | `application/json` | Non (défaut) |

### 2.2.3 Méthodes d’Authentification

Wazo supporte plusieurs “backends” d’authentification :

#### Backend `wazo_user` — Utilisateur Local Wazo

Ce backend autentifie les utilisateurs créés directement dans wazo-auth.

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  "https://wazo.example.com:9497/api/auth/0.1/token" \
  -u "admin:mon_mot_de_passe" \
  -d '{
    "expiration": 3600
  }'

```

**Équivalent avec JSON inline** :

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  "https://wazo.example.com:9497/api/auth/0.1/token" \
  -d '{
    "username": "admin",
    "password": "mon_mot_de_passe",
    "backend": "wazo_user",
    "expiration": 3600
  }'

```

#### Backend `ldap_user` — Utilisateur LDAP Externe

Ce backend délègue l’authentification à un serveur LDAP configuré sur le serveur Wazo.

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  "https://wazo.example.com:9497/api/auth/0.1/token" \
  -d '{
    "username": "alice@mondomaine.local",
    "password": "mot_de_passe_ldap",
    "backend": "ldap_user",
    "expiration": 7200
  }'

```

#### Backend `xivo_admin` — Administrateur Wazo (Legacy)

Pour les administrateurs définis via l’interface d’administration Wazo.

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  "https://wazo.example.com:9497/api/auth/0.1/token" \
  -d '{
    "username": "admin_wazo",
    "password": "password_admin",
    "backend": "xivo_admin",
    "expiration": 1800
  }'

```

### 2.2.4 Paramètres du Payload

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `username` | `string` | **Oui** (si pas auth HTTP) | Nom d’utilisateur |
| `password` | `string` | **Oui** (si pas auth HTTP) | Mot de passe |
| `backend` | `string` | Non (défaut: wazo\_user) | Type de backend (`wazo_user`, `ldap_user`, `xivo_admin`) |
| `expiration` | `int` | Non (durée par défaut: 3600s) | Durée de vie du token en secondes |

**Valeurs d’expiration conseillées** :

- `3600` (1 heure) — Usage standard
- `7200` (2 heures) — Applications longue durée
- `86400` (24 heures) — Scripts batch (avec précaution)
- `0` — Token sans expiration (déprécié, utiliser avec précaution)

### 2.2.5 Réponse Succès (201 Created)

```json
{
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3V1aWQiOiI2MTE4ZTE4Yi0xN2UyLTQ5ZWYtYTU5Yy0wNzU5MDYzYjk1NDgiLCJ0ZW5hbnRfdXVpZCI6IjYxMThlMThiLTE3ZTItNDllZi1hNTljLTA3NTkwNjNiOTU0OCIsImFjbCI6WyJjb25mZC51c2Vycy4jIiwiY29uZmQuKiIsImF1dGguKiJdLCJpYXQiOjE3MzU2NDA2MDB9.signature",
  "user_uuid": "6118e18b-17e2-49ef-a59c-0759063b9548",
  "tenant_uuid": "6118e18b-17e2-49ef-a59c-0759063b9548",
  "expiration": 3600,
  "issued_at": "2026-03-07T15:30:00.000000Z",
  "expires_at": "2026-03-07T16:30:00.000000Z",
  "acl": [
    "confd.users.#",
    "confd.lines.#",
    "confd.extensions.#",
    "confd.queues.#",
    "auth.#"
  ]
}

```

#### Détail des Champs de Réponse

| Champ | Type | Description |
| --- | --- | --- |
| `token` | `string` | Le token JWT à utiliser dans le header `X-Auth-Token` |
| `user_uuid` | `uuid` | UUID de l’utilisateur authentifié |
| `tenant_uuid` | `uuid` | UUID du tenant principal de l’utilisateur |
| `expiration` | `int` | Durée de vie en secondes |
| `issued_at` | `datetime` | Timestamp de création (ISO 8601) |
| `expires_at` | `datetime` | Timestamp d’expiration (ISO 8601) |
| `acl` | `array[string]` | Liste des permissions ACL |

### 2.2.6 Réponses d’Erreur

**401 Unauthorized — Identifiants invalides** :

```json
{
  "error": "Unauthorized",
  "details": "Invalid credentials"
}

```

**401 Unauthorized — Backend invalide** :

```json
{
  "error": "Unauthorized",
  "details": "Backend 'ldap_user' is not enabled"
}

```

**400 Bad Request — Données manquantes** :

```json
{
  "error": "Bad Request",
  "details": "Missing 'username' or 'password'"
}

```

* * *

## 2.3 Cycle de Vie du Token

### 2.3.1 Validation d’un Token

Pour vérifier la validité d’un token sans créer de nouvelle requête :

```http
GET /api/auth/0.1/token/{token}

```

```bash
curl -k -X GET \
  -H "Accept: application/json" \
  "https://wazo.example.com:9497/api/auth/0.1/token/{token_a_valider}"

```

**Réponse (200 OK)** :

```json
{
  "user_uuid": "6118e18b-17e2-49ef-a59c-0759063b9548",
  "tenant_uuid": "6118e18b-17e2-49ef-a59c-0759063b9548",
  "issued_at": "2026-03-07T15:30:00.000000Z",
  "expires_at": "2026-03-07T16:30:00.000000Z",
  "acl": ["confd.users.#", "confd.lines.#"]
}

```

**Réponse (404 Not Found — Token expiré ou invalide)** :

```json
{
  "error": "Not Found",
  "details": "Token not found"
}

```

### 2.3.2 Suppression d’un Token (Logout)

Pour invalider un token avant son expiration :

```http
DELETE /api/auth/0.1/token/{token}

```

```bash
curl -k -X DELETE \
  -H "X-Auth-Token: {token}" \
  "https://wazo.example.com:9497/api/auth/0.1/token/{token_a_invalider}"

```

**Réponse (204 No Content)** : Le token est immédiatement invalidé.

### 2.3.3 Refresh Token (Auto-extension)

Wazo ne dispose pas d’un mécanisme de “refresh token” explicite. Pour maintenir une session active, renouvelez le token avant son expiration :

```python
import time
import requests

def get_valid_token(auth_url, username, password):
    """Récupère un token et le renouvelle automatiquement avant expiration."""
    
    response = requests.post(
        f"{auth_url}/0.1/token",
        json={
            "username": username,
            "password": password,
            "backend": "wazo_user",
            "expiration": 3600
        },
        verify=False
    )
    response.raise_for_status()
    
    data = response.json()
    token = data['token']
    expires_at = data['expires_at']
    
    return token, expires_at

# Utilisation
token, expires_at = get_valid_token(
    "https://wazo.example.com:9497/api/auth",
    "admin",
    "password"
)

# Avant expiration, renouvellement
if time.time() > (parse_datetime(expires_at) - 300): # 5 min avant
    token, expires_at = get_valid_token(...)

```

* * *

## 2.4 ACL (Access Control Lists) — Guide Expert

### 2.4.1 Concept des ACLs

Les **ACL** définissent quelles ressources un utilisateur peut accéder via l’API. Une ACL est une chaîne au format `{service}.{ressource}.{action}` avec des wildcards (`#`).

#### Structure d’une ACL

```auto
{service}.{ressource}.{cible}

```

| Composant | Description | Exemple |
| --- | --- | --- |
| `service` | Nom du service API | `confd`, `auth`, `provd`, `calld` |
| `ressource` | Nom de la ressource | `users`, `lines`, `extensions`, `queues` |
| `cible` | Action ou sous-ressource | `read`, `write`, `#` (toutes) |

#### Exemples d’ACLs

| ACL | Permission |
| --- | --- |
| `confd.users.#` | Accès complet à tous les utilisateurs |
| `confd.users.read` | Lecture seule des utilisateurs |
| `confd.lines.#` | Accès complet aux lignes |
| `confd.extensions.read` | Lecture seule des extensions |
| `auth.users.#` | Gestion des utilisateurs d’auth |
| `provd.devices.#` | Accès complet aux devices |
| `#` | **Super-admin** : Accès à toutes les APIs |

> **⚠ Attention** : L’ACL `#` donne un accès illimité à toutes les ressources. Utilisez-la avec précaution et uniquement pour les administrateurs système.

### 2.4.2 Création d’une Politique (Policy)

Les ACLs sont regroupées dans des **politiques** (policies). Une politique peut être appliquée à un ou plusieurs utilisateurs.

#### Endpoint

```http
POST /api/auth/0.1/policies

```

#### Headers

| Header | Valeur |
| --- | --- |
| `X-Auth-Token` | Token admin |
| `Wazo-Tenant` | UUID du tenant |
| `Content-Type` | `application/json` |

#### Payload Complet

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {admin_token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "Technicien-Telecom",
    "description": "Politique pour technicians helpdesk",
    "acl_templates": [
      "confd.users.#",
      "confd.users.read",
      "confd.lines.#",
      "confd.extensions.#",
      "confd.queues.#",
      "confd.queues.members.#",
      "confd.sounds.#",
      "confd.voicemails.#",
      "confd.IVR.#",
      "confd.schedules.#"
    ]
  }' \
  "https://wazo.example.com:9497/api/auth/0.1/policies"

```

**Réponse (201 Created)** :

```json
{
  "uuid": "policy-uuid-1234",
  "name": "Technicien-Telecom",
  "description": "Politique pour technicians helpdesk",
  "tenant_uuid": "tenant-uuid-main",
  "acl_templates": [
    "confd.users.#",
    "confd.lines.#"
  ],
  "created_at": "2026-03-07T15:30:00.000000Z"
}

```

### 2.4.3 Liste des Politiques Existantes

```bash
curl -k -X GET \
  -H "X-Auth-Token: {admin_token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9497/api/auth/0.1/policies"

```

### 2.4.4 Association Politique ↔ Utilisateur

Pour appliquer une politique à un utilisateur :

```http
PUT /api/auth/0.1/users/{user_uuid}/policies/{policy_uuid}

```

```bash
curl -k -X PUT \
  -H "X-Auth-Token: {admin_token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9497/api/auth/0.1/users/{user_uuid}/policies/{policy_uuid}"

```

**Réponse (204 No Content)** : Politique appliquée.

### 2.4.5 Désassociation

```http
DELETE /api/auth/0.1/users/{user_uuid}/policies/{policy_uuid}

```

```bash
curl -k -X DELETE \
  -H "X-Auth-Token: {admin_token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9497/api/auth/0.1/users/{user_uuid}/policies/{policy_uuid}"

```

### 2.4.6 Récupérer les ACLs d’un Token

Pour debugging ou audit, vérifiez les ACLs portées par un token :

```bash
# Via le token lui-même (décodage JWT - partie payload)
# OU via l'API de validation

curl -k -X GET \
  -H "X-Auth-Token: {token}" \
  "https://wazo.example.com:9497/api/auth/0.1/token/{token}"

```

* * *

## 2.5 Usurpation d’Identité (Impersonation)

L’ **usurpation d’identité** permet à un administrateur d’effectuer des requêtes “en tant que” un autre utilisateur, tout en conservant la trace de l’action dans les logs. C’est particulièrement utile pour le support ou le débogage.

### 2.5.1 Mécanisme

L’administrateur ajoute le header `Wazo-Impersonation` avec l’UUID de l’utilisateur cible :

```http
X-Auth-Token: {admin_token}
Wazo-Impersonation: {user_uuid_cible}

```

### 2.5.2 Exemple Pratique

```bash
# Admin authentifié (token: admin-token)
# Souhaite voir ce que voit l'utilisateur alice-uuid

curl -k -X GET \
  -H "X-Auth-Token: admin-token" \
  -H "Wazo-Impersonation: alice-uuid-1234" \
  -H "Accept: application/json" \
  "https://wazo.example.com:9486/api/confd/1.1/users"

```

**Comportement** :

1. Le système vérifie que `admin-token` a le droit d’usurper (`auth.users.impostor.#`)
2. Les ressources retournées sont filtrées selon les permissions de `alice-uuid-1234`
3. L’action est logguée comme effectuée par l’admin “en tant qu’Alice”

> **⚠ Attention** : L’usurpation d’identité ne fonctionne que pour les utilisateurs du **même tenant** ou des **sous-tenants**. Un admin root peut usurper n’importe quel utilisateur.

* * *

## 2.6 Gestion des Utilisateurs d’Auth (wazo-auth)

### 2.6.1 Création d’un Utilisateur d’Auth

Ces utilisateurs sont distincts des utilisateurs telephony (confd).

```http
POST /api/auth/0.1/users

```

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {admin_token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "username": "alice.tech",
    "password": "SecureP4ssw0rd!",
    "purpose": "external_api",
    "email": "alice@example.com",
    "firstname": "Alice",
    "lastname": "Technician"
  }' \
  "https://wazo.example.com:9497/api/auth/0.1/users"

```

**Payload détaillé** :

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `username` | `string` | **Oui** | Identifiant unique (par tenant) |
| `password` | `string` | **Oui** | Mot de passe (min 8 caractères) |
| `purpose` | `string` | Non (défaut: `user`) | `user` ou `external_api` |
| `email` | `string` | Non | Adresse email |
| `firstname` | `string` | Non | Prénom |
| `lastname` | `string` | Non | Nom |

**Réponse (201 Created)** :

```json
{
  "uuid": "user-auth-uuid-1234",
  "username": "alice.tech",
  "purpose": "external_api",
  "email": "alice@example.com",
  "firstname": "Alice",
  "lastname": "Technician",
  "tenant_uuid": "tenant-uuid-main",
  "enabled": true,
  "created_at": "2026-03-07T15:30:00.000000Z"
}

```

### 2.6.2 Liste des Utilisateurs d’Auth

```bash
curl -k -X GET \
  -H "X-Auth-Token: {admin_token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9497/api/auth/0.1/users"

```

### 2.6.3 Modification de Mot de Passe

```http
PUT /api/auth/0.1/users/{user_uuid}/password

```

```bash
curl -k -X PUT \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {admin_token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "password": "NouveauMdp2026!"
  }' \
  "https://wazo.example.com:9497/api/auth/0.1/users/{user_uuid}/password"

```

### 2.6.4 Suppression d’un Utilisateur

```http
DELETE /api/auth/0.1/users/{user_uuid}

```

```bash
curl -k -X DELETE \
  -H "X-Auth-Token: {admin_token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9497/api/auth/0.1/users/{user_uuid}"

```

* * *

## 2.7 Configuration LDAP

### 2.7.1 Prérequis LDAP

Pour utiliser l’authentification LDAP, le service wazo-auth doit être configuré avec les paramètres LDAP dans `/etc/wazo-auth/conf.d/`.

```yaml
# /etc/wazo-auth/conf.d/ldap.yml
enabled_backend_plugins:
  ldap_user: true

ldap:
  uri: ldap://ldap.example.com:389
  bind_dn: cn=wazo,dc=example,dc=org
  bind_password: ldap_bind_password
  user_base_dn: ou=users,dc=example,dc=org
  user_login_attribute: uid
  user_email_attribute: mail
  user_filter: "(objectClass=inetOrgPerson)"

```

> **Note** : La configuration LDAP nécessite un redémarrage du service wazo-auth (`systemctl restart wazo-auth`).

### 2.7.2 Vérification du Backend LDAP

```bash
curl -k -X GET \
  -H "X-Auth-Token: {admin_token}" \
  "https://wazo.example.com:9497/api/auth/0.1/backends"

```

**Réponse** :

```json
{
  "total": 3,
  "items": [
    {"name": "wazo_user"},
    {"name": "ldap_user"},
    {"name": "xivo_admin"}
  ]
}

```

* * *

## 2.8 Bonnes Pratiques de Sécurité

### 2.8.1 Rotation des Tokens

- Utilisez des tokens à courte durée de vie (1-2 heures) pour les applications web
- Implémentez un mécanisme de refresh automatique avant expiration
- Pour les scripts batch, créez un token dédié avec une politique restrictive

### 2.8.2 Gestion des Credentials

**✓ Bonnes pratiques** :

- Stockez les credentials dans un vault (HashiCorp Vault, AWS Secrets Manager)
- Utilisez des variables d’environnement pour les scripts
- Limitez les permissions au minimum nécessaire (principe du moindre privilège)

**✗ À éviter** :

- Coder en dur les mots de passe dans le code source
- Partager un token admin entre plusieurs applications
- Créer des tokens avec `expiration: 0`

### 2.8.3 Audit des Accès

Wazo log toutes les opérations dans les journaux système. Pour auditer :

```bash
# Voir les logs d'authentification
journalctl -u wazo-auth -f

# Rechercher les échecs d'authentification
journalctl -u wazo-auth | grep "Unauthorized"

```

* * *

## Résumé du Chapitre 2

| Sujet | Endpoint Clé | Point Critique |
| --- | --- | --- |
| **Création token** | `POST /api/auth/0.1/token` | Backend (`wazo_user`, `ldap_user`) |
| **Validation** | `GET /api/auth/0.1/token/{token}` | Vérification ACL et expiration |
| **Politiques** | `POST /api/auth/0.1/policies` | ACL templates structurés |
| **Association user-policy** | `PUT /api/auth/0.1/users/{uuid}/policies/{uuid}` | Granularité des permissions |
| **Usurpation** | Header `Wazo-Impersonation` | Pour support/debugging |
| **Multi-tenant** | Header `Wazo-Tenant` | Obligatoire en multi-tenant |

* * *

_Fin du Chapitre 2 — Suite : Chapitre 3 (Configuration Core)_

---

<div class="post-metadata">

**Author:** ![Alloallo](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/alloallo/32/664_2.png) [@Alloallo](https://wazo-platform.discourse.group/u/Alloallo)\
**Post date:** [July 28, 2026, 5:26am UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/18 "2026-07-28T05:26:31Z")

</div>

* * *

# CHAPITRE 3 : Configuration Core (wazo-confd) — Utilisateurs et Routage

## 3.1 Introduction à wazo-confd

**wazo-confd** est le service central de configuration de la plateforme Wazo. Il gère l’intégralité des ressources liées à la téléphonies IP : utilisateurs telephony, lignes, extensions, endpoints SIP, trunks, files d’attente, IVR, conférences, etc.

> **Rappel fondamental** : Ce chapitre détaille les objets de **routage interne** (contextes, extensions, lignes, endpoints, utilisateurs) ainsi que les **restrictions d’appels** (call permissions). Le Chapitre 4 couvrira les communications avec l’extérieur (trunks, outcalls, incalls).

### 3.1.1 Portée du Service

| Catégorie | Ressources gérées |
| --- | --- |
| **Utilisateurs** | Utilisateurs telephony, voicemails, forwards, DND |
| **Lignes** | Lignes SIP, SCCP, IAX, personnalisées |
| **Endpoints** | SIP (PJSIP), SCCP, IAX, Custom |
| **Extensions** | Numéros internes, extensions de routage |
| **Routage** | Contextes, incoming calls, outgoing calls |
| **Services** | Queues, Groups, IVR, Conferences, Schedules |
| **Audio** | Sounds, Music on Hold |
| **Configuration** | SIP templates, fonction keys, call pickups |

* * *

## 3.2 Les Contextes (Contexts)

### 3.2.1 Concept

Les **contextes** (contexts) sont le fondement du routage téléphonique dans Wazo/Asterisk. Un contexte définit un “domaine logique” d extensions — un périmètre à l’intérieur duquel les appels peuvent transiter selon des règles définies.

#### Types de Contextes

| Type | Nom usuel | Rôle |
| --- | --- | --- |
| **Interne** | `default`, `interne` | Communications entre extensions internes du même site |
| **Entrant (DID)** | `from-extern`, `from-did` | Appels entrants depuis l’extérieur (trunk) |
| **Sortant** | `outside`, `externe` | Appels sortants vers l’extérieur via trunk |
| **Service** | ` voicemail`, `parkedcalls` | Contextes système pour services particuliers |

#### Schéma de Routage par Contextes

```auto
┌─────────────────────────────────────────────────────────────────────────────┐
│ ROUTAGE PAR CONTEXTES WAZO │
└─────────────────────────────────────────────────────────────────────────────┘

   APPEL ENTRANT APPEL INTERNE APPEL SORTANT
   (from-extern) (default) (outside)
         │ │ │
         ▼ ▼ ▼
  ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
  │ INCALL │ │ EXTENSION │ │ OUTCALL │
  │ (DID/SDAs) │ │ (1001- │ │ (Strip, │
  │ │ │ 1099) │ │ Prefix) │
  └──────┬──────┘ └──────┬──────┘ └──────┬──────┘
         │ │ │
         └──────────────┬──────────────┘ │
                        │ │
                        ▼ ▼
               ┌────────────────┐ ┌────────────────┐
               │ DESTINATION │ │ TRUNK │
               │ User/Queue/ │◄─────────────────────────────┤ (SIP/IAX) │
               │ IVR/Group │ │ │
               └────────────────┘ └────────────────┘

```

### 3.2.2 CRUD des Contextes

#### Endpoint

```http
GET/POST /api/confd/1.1/contexts
GET/PUT/DELETE /api/confd/1.1/contexts/{context_id}

```

#### Liste des Contextes

```bash
curl -k -X GET \
  -H "Accept: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/contexts"

```

#### Création d’un Contexte

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "bureau-paris",
    "display_name": "Bureau Paris",
    "context_type": "internal",
    "description": "Contexte interne du bureau de Paris"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/contexts"

```

#### Payload Complet

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `name` | `string` | **Oui** | Identifiant technique unique (ex: `bureau-paris`) |
| `display_name` | `string` | Non | Nom affiché dans l’interface |
| `context_type` | `string` | Non | Type : `internal`, `external`, `others` |
| `description` | `string` | Non | Description textuelle |

#### Réponse (201 Created)

```json
{
  "id": 5,
  "name": "bureau-paris",
  "display_name": "Bureau Paris",
  "context_type": "internal",
  "description": "Contexte interne du bureau de Paris",
  "tenant_uuid": "tenant-uuid-main"
}

```

> **⚠ Attention** : Les contextes `default`, `from-extern` et `outside` sont créés par défaut lors de l’installation. Ne les supprimez pas — ils sont requis pour le fonctionnement de base.

* * *

## 3.3 La Trinité Wazo : Endpoints SIP, Lignes et Extensions

Dans Wazo, toute ligne téléphonique fonctionnel repose sur l’assemblage de trois objets distincts mais interdépendants :

1. **Endpoint SIP** — Configuration technique PJSIP (authentification, codec, DTMF)
2. **Ligne** — Objet logique reliant l’endpoint à l’extension
3. **Extension** — Numéro de téléphone joignable

> **Règle d’or** : Une ligne **doit** être liée à un endpoint SIP **et** à une extension pour être joignable et permettant les appels.

### 3.3.1 Endpoints SIP (PJSIP)

#### Concept

Un **endpoint SIP** représente la configuration technique complète d’un dispositif SIP dans Asterisk via le module **PJSIP**. Cette configuration est structurée en “sections” PJSIP.

#### Architecture des Sections PJSIP

```auto
┌─────────────────────────────────────────────────────────────────────────────┐
│ CONFIGURATION PJSIP D'UN ENDPOINT │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ AUTH SECTION │ │ AOR SECTION │ │ ENDPOINT SECTION│
│ │ │ │ │ │
│ - username │ │ - contact │ │ - context │
│ - password │ │ - max_contacts │ │ - disallow │
│ - realm │ │ - qualify │ │ - allow │
│ │ │ - expiry │ │ - callerid │
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘
         │ │ │
         └──────────────────────┼──────────────────────┘
                                │
                                ▼
                    ┌─────────────────────┐
                    │ PJSIP ENDPOINT │
                    │ (Référence les │
                    │ 3 sections) │
                    └─────────────────────┘

```

#### CRUD des Endpoints SIP

##### Endpoint

```http
GET/POST /api/confd/1.1/endpoints/sip
GET/PUT/DELETE /api/confd/1.1/endpoints/sip/{endpoint_uuid}

```

##### Liste des Endpoints SIP

```bash
curl -k -X GET \
  -H "Accept: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/endpoints/sip"

```

##### Création d’un Endpoint SIP Complet

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "alice-sip-001",
    "auth_section_options": [
      ["username", "alice_auth"],
      ["password", "P4ssw0rd!SIP2026"],
      ["realm", "asterisk"]
    ],
    "aor_section_options": [
      ["max_contacts", "1"],
      ["remove_existing", "yes"],
      ["qualify_frequency", "60"],
      ["expiry", "3600"]
    ],
    "endpoint_section_options": [
      ["disallow", "all"],
      ["allow", "ulaw,alaw,g722,h264"],
      ["context", "default"],
      ["dtmf_mode", "rfc4733"],
      ["direct_media", "no"],
      ["callerid", "Alice Dupont <1001>"],
      ["call_forward", "yes"],
      ["call_transfer", "yes"],
      ["force_rport", "yes"],
      ["rewrite_contact", "yes"],
      ["ice_support", "yes"],
      ["candiate_acl", "any"]
    ],
    "registration_section_options": [
      ["server_uri", "sip:provider.example.com:5060"],
      ["client_uri", "sip:alice@provider.example.com"],
      ["contact_uri", "sip:alice@192.168.1.50:5060"]
    ],
    "transport": null,
    "templates": ["standard"]
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/endpoints/sip"

```

#### Payload Détaillé des Sections PJSIP

##### auth\_section\_options (Authentification)

| Option | Type | Description | Exemple |
| --- | --- | --- | --- |
| `username` | `string` | Identifiant d’authentification SIP | `alice_auth` |
| `password` | `string` | Mot de passe SIP | `P4ssw0rd!` |
| `realm` | `string` | Realm d’authentification (optionnel) | `asterisk` |

##### aor\_section\_options (Address of Record)

| Option | Type | Description | Exemple |
| --- | --- | --- | --- |
| `max_contacts` | `string` | Nombre max de contacts simultanés | `1` |
| `remove_existing` | `string` | Supprimer les anciens contacts | `yes` |
| `qualify_frequency` | `string` | Fréquence de qualification (secondes) | `60` |
| `expiry` | `string` | Expiration des registrations | `3600` |

##### endpoint\_section\_options (Configuration de l’endpoint)

| Option | Type | Description | Valeurs possibles |
| --- | --- | --- | --- |
| `disallow` | `string` | Désactiver tous les codecs | `all` |
| `allow` | `string` | Activer les codecs | `ulaw,alaw,g722,h264` |
| `context` | `string` | Contexte de routage | `default`, `from-extern` |
| `dtmf_mode` | `string` | Mode DTMF | `rfc4733`, `info`, `inband` |
| `direct_media` | `string` | Media direct peer-to-peer | `yes`, `no` |
| `callerid` | `string` | Caller ID par défaut | `Alice <1001>` |
| `force_rport` | `string` | Forcer le rport | `yes` |
| `rewrite_contact` | `string` | Réécrire le contact | `yes` |
| `ice_support` | `string` | Support ICE pour STUN | `yes` |

> **⚠ Attention critique** : Le mot de passe SIP doit respecter les politiques du fournisseur/OP. Certains providers refusent les caractères spéciaux ou exigent une longueur minimale.

#### Réponse (201 Created)

```json
{
  "uuid": "endpoint-uuid-1234",
  "name": "alice-sip-001",
  "auth_section_options": [
    ["username", "alice_auth"],
    ["password", "***"]
  ],
  "aor_section_options": [
    ["max_contacts", "1"]
  ],
  "endpoint_section_options": [
    ["disallow", "all"],
    ["allow", "ulaw,alaw,g722"]
  ],
  "transport": null,
  "templates": ["standard"],
  "tenant_uuid": "tenant-uuid-main",
  "created_at": "2026-03-07T15:30:00.000000Z"
}

```

##### Modification d’un Endpoint SIP

```bash
curl -k -X PUT \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "endpoint_section_options": [
      ["callerid", "Alice Dupont <1002>"]
    ]
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/endpoints/sip/{endpoint_uuid}"

```

##### Suppression d’un Endpoint SIP

```bash
curl -k -X DELETE \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/endpoints/sip/{endpoint_uuid}"

```

### 3.3.2 Lignes (Lines)

#### Concept

Une **ligne** (line) est l’objet central qui relie :

- L’endpoint SIP (configuration technique)
- L’extension (numéro de téléphone)
- L’utilisateur (agent telephony)

#### CRUD des Lignes

##### Endpoint

```http
GET/POST /api/confd/1.1/lines
GET/POST /api/confd/1.1/lines/sip (création rapide ligne SIP)
GET/PUT/DELETE /api/confd/1.1/lines/{line_id}

```

##### Création Rapide d’une Ligne SIP

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "context": "default",
    "name": "alice-line-001",
    "protocol": "sip"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/lines/sip"

```

#### Payload Complet d’une Ligne

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `context` | `string` | **Oui** | Contexte de routage |
| `name` | `string` | Non | Nom logique de la ligne |
| `protocol` | `string` | **Oui** | `sip`, `sccp`, `iax`, `custom` |
| `device` | `uuid` | Non | UUID du device associé |
| `description` | `string` | Non | Description |

#### Réponse (201 Created)

```json
{
  "id": 42,
  "context": "default",
  "name": "alice-line-001",
  "protocol": "sip",
  "device": null,
  "description": null,
  "tenant_uuid": "tenant-uuid-main"
}

```

### 3.3.3 Extensions

#### Concept

Une **extension** est un numéro de téléphone associé à une ligne. Elle peut être :

- **Interne** : joignable depuis l’intérieur du système
- **Partie d’un routage entrant** : destination d’un DID/SDD

#### CRUD des Extensions

##### Endpoint

```http
GET/POST /api/confd/1.1/extensions
GET/PUT/DELETE /api/confd/1.1/extensions/{extension_id}

```

##### Création d’une Extension

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "exten": "1001",
    "context": "default",
    "description": "Extension principale Alice"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/extensions"

```

#### Payload

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `exten` | `string` | **Oui** | Numéro de l’extension |
| `context` | `string` | **Oui** | Contexte de routage |
| `description` | `string` | Non | Description |

#### Réponse

```json
{
  "id": 88,
  "exten": "1001",
  "context": "default",
  "description": "Extension principale Alice",
  "tenant_uuid": "tenant-uuid-main"
}

```

### 3.3.4 Associations — La Trinité en Pratique

L’assemblage des trois objets nécessite des appels API spécifiques :

#### Association Ligne ↔ Endpoint SIP

```http
PUT /api/confd/1.1/lines/{line_id}/endpoints/sip/{endpoint_uuid}

```

```bash
curl -k -X PUT \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/lines/42/endpoints/sip/endpoint-uuid-1234"

```

**Réponse (204 No Content)** : Association créée.

#### Association Ligne ↔ Extension

```http
PUT /api/confd/1.1/lines/{line_id}/extensions/{extension_id}

```

```bash
curl -k -X PUT \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/lines/42/extensions/88"

```

#### Dissociation Ligne ↔ Extension

```http
DELETE /api/confd/1.1/lines/{line_id}/extensions/{extension_id}

```

```bash
curl -k -X DELETE \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/lines/42/extensions/88"

```

* * *

## 3.4 Utilisateurs Telephony (wazo-confd)

### 3.4.1 Distinction Importante

> **Rappel** : Il existe **deux types d’utilisateurs** dans Wazo :
> 
> - **Utilisateurs d’authentification** (wazo-auth) — `/api/auth/0.1/users` — Permettent l’accès à l’API
> - **Utilisateurs telephony** (wazo-confd) — `/api/confd/1.1/users` — Représentent les agents dans le système de communications

Cette section concerne les **utilisateurs telephony**.

### 3.4.2 CRUD des Utilisateurs Telephony

#### Endpoint

```http
GET/POST /api/confd/1.1/users
GET/PUT/DELETE /api/confd/1.1/users/{user_uuid}

```

#### Création d’un Utilisateur Simple

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "firstname": "Alice",
    "lastname": "Dupont",
    "email": "alice@example.com",
    "language": "fr_FR",
    "timezone": "Europe/Paris",
    "enabled": true,
    "caller_id_name": "Alice Dupont",
    "caller_id_number": "1001"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/users"

```

#### Payload Complet

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `firstname` | `string` | **Oui** | Prénom |
| `lastname` | `string` | Non | Nom |
| `email` | `string` | Non | Adresse email |
| `language` | `string` | Non | Langue (`fr_FR`, `en_US`, etc.) |
| `timezone` | `string` | Non | Fuseau horaire |
| `enabled` | `boolean` | Non (défaut: `true`) | Utilisateur activé |
| `caller_id_name` | `string` | Non | Nom affiché Caller ID (ex: `"Alice Dupont"`) |
| `caller_id_number` | `string` | Non | Numéro affiché Caller ID (ex: `"1001"`) |
| `calling_login` | | | |
| `calling_password` | `string` | Non | Mot de passe agent |
| `purpose` | `string` | Non (défaut: `user`) | `user` ou `warmline` |

#### Réponse (201 Created)

```json
{
  "uuid": "user-uuid-1234",
  "firstname": "Alice",
  "lastname": "Dupont",
  "email": "alice@example.com",
  "language": "fr_FR",
  "timezone": "Europe/Paris",
  "enabled": true,
  "caller_id": {
    "display_name": "Alice Dupont",
    "internal": false
  },
  "tenant_uuid": "tenant-uuid-main"
}

```

### 3.4.3 Association Utilisateur ↔ Ligne

Pour qu’un utilisateur puisse passer et recevoir des appels, il doit être lié à au moins une ligne.

#### Association

```http
PUT /api/confd/1.1/users/{user_uuid}/lines/{line_id}

```

```bash
curl -k -X PUT \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/users/user-uuid-1234/lines/42"

```

#### Liste des Lignes d’un Utilisateur

```bash
curl -k -X GET \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/users/user-uuid-1234/lines"

```

#### Dissociation

```http
DELETE /api/confd/1.1/users/{user_uuid}/lines/{line_id}

```

* * *

## 3.5 Voicemails

### 3.5.1 Concept

Un **voicemail** est une boîte vocale associée à un utilisateur. Elle permet :

- La réception de messages vocaux
- La notification par email
- L’accès par code PIN

### 3.5.2 CRUD des Voicemails

#### Endpoint

```http
GET/POST /api/confd/1.1/voicemails
GET/PUT/DELETE /api/confd/1.1/voicemails/{voicemail_id}

```

#### Création d’un Voicemail

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "alice_vm",
    "number": "1001",
    "context": "default",
    "password": "1234",
    "email": "alice@example.com",
    "attach_audio": true,
    "delete_messages": false,
    "max_messages": 50,
    "announcement": null,
    "skip_instructions": false
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/voicemails"

```

#### Payload Détaillé

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `name` | `string` | **Oui** | Nom de la boîte vocale |
| `number` | `string` | **Oui** | Numéro (généralement same que l’extension) |
| `context` | `string` | **Oui** | Contexte |
| `password` | `string` | Non | PIN d’accès (4 chiffres) |
| `email` | `string` | Non | Email de notification |
| `attach_audio` | `boolean` | Non | Joindre fichier audio à l’email |
| `delete_messages` | `boolean` | Non | Supprimer après notification |
| `max_messages` | `int` | Non | Nb max de messages |

#### Réponse

```json
{
  "id": 15,
  "name": "alice_vm",
  "number": "1001",
  "context": "default",
  "email": "alice@example.com",
  "attach_audio": true,
  "tenant_uuid": "tenant-uuid-main"
}

```

### 3.5.3 Association Voicemail ↔ Utilisateur

#### Associer une boîte

```http
PUT /api/confd/1.1/users/{user_uuid}/voicemails/{voicemail_id}

```

#### Dissocier une boîte

```http
DELETE /api/confd/1.1/users/{user_uuid}/voicemails

```

```bash
curl -k -X DELETE \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/users/user-uuid-1234/voicemails"

```

* * *

## 3.6 Call Permissions (Restrictions d’Appels)

### 3.6.1 Concept

Les **call permissions** (permissions d’appels) permettent de contrôler quels numéros/tendus peuvent être appelés par un utilisateur. C’est un système de **whitelist** (autorisation) ou **blacklist** (interdiction).

### 3.6.2 CRUD des Call Permissions

#### Endpoint

```http
GET/POST /api/confd/1.1/callpermissions
GET/PUT/DELETE /api/confd/1.1/callpermissions/{permission_id}

```

#### Création d’une Permission

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "appel-international",
    "description": "Autorise les appels internationaux"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/callpermissions"

```

#### Réponse

```json
{
  "id": 3,
  "name": "appel-international",
  "description": "Autorise les appels internationaux",
  "tenant_uuid": "tenant-uuid-main"
}

```

### 3.6.3 Régles de Permission (Rules)

Chaque call permission contient des règles définissant les préfixes autorisés/interdits.

#### Création d’une Règle

```http
POST /api/confd/1.1/callpermissions/{permission_id}/rules

```

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "prefix": "00",
    "action": "allow"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/callpermissions/3/rules"

```

#### Payload des Règles

| Champ | Type | Description |
| --- | --- | --- |
| `prefix` | `string` | Préfixe numérique (ex: `00`, `0`, `0800`) |
| `action` | `string` | `allow` ou `deny` |

#### Liste des Règles

```bash
curl -k -X GET \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/callpermissions/3/rules"

```

### 3.6.4 Association Permission ↔ Utilisateur

```http
PUT /api/confd/1.1/users/{user_uuid}/callpermissions/{permission_id}

```

```bash
curl -k -X PUT \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/users/user-uuid-1234/callpermissions/3"

```

* * *

## 3.7 Scénario Complet : Création d’un Utilisateur Opérationnel

Voici la séquence complète pour créer un utilisateur telephony avec ligne SIP et voicemail :

```bash
# =============================================================================
# ÉTAPE 1 : Créer l'endpoint SIP
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "alice-sip-001",
    "auth_section_options": [
      ["username", "alice_auth"],
      ["password", "P4ssw0rd!SIP"]
    ],
    "endpoint_section_options": [
      ["disallow", "all"],
      ["allow", "ulaw722"],
      ["context", "default"],
      ["c,alaw,gallerid", "Alice Dupont <1001>"]
    ]
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/endpoints/sip"

# Réponse : {"uuid": "endpoint-uuid-001", ...}
# ↑ NOTER : endpoint-uuid-001

# =============================================================================
# ÉTAPE 2 : Créer la ligne SIP
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "context": "default",
    "name": "alice-line-001",
    "protocol": "sip"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/lines"

# Réponse : {"id": 42, ...}
# ↑ NOTER : line-id = 42

# =============================================================================
# ÉTAPE 3 : Lier endpoint à la ligne
# =============================================================================
curl -k -X PUT \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/lines/42/endpoints/sip/endpoint-uuid-001"
# Réponse : 204 No Content

# =============================================================================
# ÉTAPE 4 : Créer l'extension
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "exten": "1001",
    "context": "default",
    "description": "Extension Alice"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/extensions"

# Réponse : {"id": 88, ...}
# ↑ NOTER : extension-id = 88

# =============================================================================
# ÉTAPE 5 : Lier extension à la ligne
# =============================================================================
curl -k -X PUT \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/lines/42/extensions/88"
# Réponse : 204 No Content

# =============================================================================
# ÉTAPE 6 : Créer l'utilisateur
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "firstname": "Alice",
    "lastname": "Dupont",
    "email": "alice@example.com",
    "language": "fr_FR"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/users"

# Réponse : {"uuid": "user-uuid-001", ...}
# ↑ NOTER : user-uuid-001

# =============================================================================
# ÉTAPE 7 : Lier ligne à l'utilisateur
# =============================================================================
curl -k -X PUT \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/users/user-uuid-001/lines/42"
# Réponse : 204 No Content

# =============================================================================
# ÉTAPE 8 : Créer le voicemail (optionnel)
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "alice_vm",
    "number": "1001",
    "context": "default",
    "password": "1234",
    "email": "alice@example.com",
    "attach_audio": true
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/voicemails"

# Réponse : {"id": 15, ...}
# ↑ NOTER : voicemail-id = 15

# =============================================================================
# ÉTAPE 9 : Lier voicemail à l'utilisateur
# =============================================================================
curl -k -X PUT \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/users/user-uuid-001/voicemails/15"
# Réponse : 204 No Content

```

* * *

## Résumé du Chapitre 3

| Ressource | Endpoints Clés | Point Critique |
| --- | --- | --- |
| **Contextes** | `POST /contexts` | Contextes `default`, `from-extern` requis |
| **Endpoints SIP** | `POST /endpoints/sip` | Sections PJSIP (auth, aor, endpoint) |
| **Lignes** | `POST /lines/sip` | Protocole obligatoire (`sip`) |
| **Extensions** | `POST /extensions` | Contexte obligatoire |
| **Associations** | `PUT /lines/{id}/endpoints/sip/{uuid}` | Ordre : endpoint → ligne → extension → user |
| **Utilisateurs** | `POST /users` | Distincts des utilisateurs auth |
| **Voicemails** | `POST /voicemails` | Lié à l’utilisateur, pas à la ligne |
| **Call Permissions** | `POST /callpermissions/{id}/rules` | Système whitelist/blacklist par préfixes |

---

<div class="post-metadata">

**Author:** ![Alloallo](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/alloallo/32/664_2.png) [@Alloallo](https://wazo-platform.discourse.group/u/Alloallo)\
**Post date:** [July 28, 2026, 5:29am UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/19 "2026-07-28T05:29:42Z")

</div>

# CHAPITRE 4 : Trunks SIP, Outcalls et Incalls

## 4.1 Introduction

Ce chapitre couvre les communications entre Wazo et l’extérieur :

- **Trunks** : Connexions SIP vers les fournisseurs/opérateurs
- **Outcalls** : Routage des appels sortants (vers l’extérieur)
- **Incalls** : Routage des appels entrants (depuis l’extérieur via DID/SDD)

### 4.1.1 Architecture de Communication

```auto
┌─────────────────────────────────────────────────────────────────────────────┐
│ ARCHITECTURE COMMUNICATIONS WAZO │
└─────────────────────────────────────────────────────────────────────────────┘

    ┌─────────────┐ ┌─────────────┐
    │ APPEL │ │ APPEL │
    │ ENTRANT │ │ SORTANT │
    └──────┬──────┘ └──────┬──────┘
           │ │
           ▼ ▼
    ┌─────────────┐ ┌─────────────┐
    │ INCALL │ │ OUTCALL │
    │ (DID/SDD) │ │ (Plans de │
    └──────┬──────┘ │ numérotie)
           │ └──────┬──────┘
           ▼ ▼
    ┌─────────────┐ ┌─────────────┐
    │ CONTEXT: │ │ CONTEXT: │
    │ from-extern │ │ outside │
    └──────┬──────┘ └──────┬──────┘
           │ │
           └───────────────┬────────────────────────┘
                           │
                           ▼
                   ┌─────────────┐
                   │ TRUNK │
                   │ (SIP) │
                   └──────┬──────┘
                           │
                           ▼
                   ┌─────────────┐
                   │ OPERATOR / │
                   │ PROVIDER │
                   │ (SIP trunk)│
                   └─────────────┘

```

* * *

## 4.2 Trunks SIP

### 4.2.1 Concept

Un **trunk** est une connexion SIP reliant Wazo à :

- Un opérateur VoIP (SIP trunking)
- Une autre PBX (interconnexion)
- Un service de terminaison (ITSP)

### 4.2.2 Structure d’un Trunk SIP

Un trunk SIP se compose de plusieurs éléments :

| Composant | Endpoint API | Description |
| --- | --- | --- |
| **Endpoint SIP** | `/endpoints/sip` | Configuration technique du trunk |
| **Registration** | `/registrations` | Configuration SIP REGISTER (si requis) |
| **Trunk** | `/trunks` | Objet logique regroupant les éléments |

### 4.2.3 CRUD des Trunks

#### Endpoint

```http
GET/POST /api/confd/1.1/trunks
GET/PUT/DELETE /api/confd/1.1/trunks/{trunk_id}

```

#### Création d’un Trunk SIP (avec registration)

```bash
# =============================================================================
# ÉTAPE 1 : Créer l'endpoint SIP du trunk
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "trunk-operateur-001",
    "endpoint_section_options": [
      ["disallow", "all"],
      ["allow", "ulaw,alaw,g722"],
      ["context", "from-extern"],
      ["dtmf_mode", "rfc4733"],
      ["trust_connected_line", "yes"]
    ]
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/endpoints/sip"

# Réponse : {"uuid": "trunk-endpoint-uuid", ...}
# ↑ NOTER : trunk-endpoint-uuid

# =============================================================================
# ÉTAPE 2 : Créer le trunk
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "Trunk Opérateur",
    "endpoint_sip_uuid": "trunk-endpoint-uuid",
    "context": "from-extern"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/trunks"

# Réponse : {"id": 5, "name": "Trunk Opérateur", ...}

```

#### Payload du Trunk

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `name` | `string` | **Oui** | Nom du trunk |
| `endpoint_sip_uuid` | `uuid` | Non | UUID de l’endpoint SIP associé |
| `endpoint_iax_uuid` | `uuid` | Non | UUID de l’endpoint IAX associé |
| `endpoint_custom_uuid` | `uuid` | Non | UUID de l’endpoint custom |
| `context` | `string` | Non | Contexte de routage entrant |

#### Trunk avec Registration (SIP REGISTER)

Si votre opérateur nécessite une registration SIP :

```bash
# =============================================================================
# ÉTAPE 1 : Créer l'endpoint SIP
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "trunk-registered",
    "endpoint_section_options": [
      ["context", "from-extern"]
    ]
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/endpoints/sip"

# Réponse : {"uuid": "endpoint-uuid", ...}

# =============================================================================
# ÉTAPE 2 : Créer la registration
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "endpoint_sip_uuid": "endpoint-uuid",
    "registration_section_options": [
      ["server_uri", "sip:sip.operator.com:5060"],
      ["client_uri", "sip:moncompte@sip.operator.com"],
      ["contact_uri", "sip:moncompte@192.168.1.10:5060"],
      ["expiry", "3600"]
    ],
    "auth_section_options": [
      ["username", "moncompte"],
      ["password", "motdepasse"]
    ]
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/registrations"

# Réponse : {"id": 10, ...}
# ↑ NOTER : registration-id = 10

# =============================================================================
# ÉTAPE 3 : Créer le trunk
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "Trunk Opérateur Enregistré",
    "endpoint_sip_uuid": "endpoint-uuid",
    "context": "from-extern"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/trunks"

```

### 4.2.4 Transport SIP (Optionnel)

Pour les trunks utilisant un transport spécifique (TLS, TCP) :

#### Création d’un Transport

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "transport-tls",
    "type": "transport-tls",
    "options": [
      ["bind", "0.0.0.0:5061"],
      ["protocol", "tls"],
      ["cert_file", "/etc/asterisk/keys/asterisk.crt"],
      ["priv_key_file", "/etc/asterisk/keys/asterisk.key"],
      ["method", "tlsv1_2"]
    ]
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/sip/transports"

```

#### Association Transport à un Endpoint

```bash
curl -k -X PUT \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{"transport": "transport-tls-uuid"}' \
  "https://wazo.example.com:9486/api/confd/1.1/endpoints/sip/{endpoint_uuid}"

```

* * *

## 4.3 Outcalls (Appels Sortants)

### 4.3.1 Concept

Les **outcalls** (appelés aussi “outgoing calls” ou “dial patterns”) définissent les règles de numérotation pour les appels sortants. Ils permettent de :

- Définir quels préfixes sont autorisés
- Transformer les numéros (strip/prefix)
- Appliquer un Caller ID spécifique
- Sélectionner un trunk spécifique

### 4.3.2 CRUD des Outcalls

#### Endpoint

```http
GET/POST /api/confd/1.1/outcalls
GET/PUT/DELETE /api/confd/1.1/outcalls/{outcall_id}

```

#### Création d’un Outcall

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "appels-sortants-france",
    "description": "Règles d'appels vers la France",
    "enabled": true,
    "internal": false,
    "schedules": []
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/outcalls"

```

#### Réponse

```json
{
  "id": 7,
  "name": "appels-sortants-france",
  "description": "Règles d'appels vers la France",
  "enabled": true,
  "internal": false,
  "tenant_uuid": "tenant-uuid-main"
}

```

### 4.3.3 Dial Patterns (Règles de Numérotation)

Les **dial patterns** définissent les transformations de numéros.

#### Création d’un Dial Pattern

```http
POST /api/confd/1.1/outcalls/{outcall_id}/dialpatterns

```

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "prefix": "0",
    "match_pattern": ".",
    "strip": "0",
    "caller_id": "0143321000"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/outcalls/7/dialpatterns"

```

#### Payload des Dial Patterns

| Champ | Type | Description |
| --- | --- | --- |
| `prefix` | `string` | Préfixe requis pour utiliser cette règle |
| `match_pattern` | `string` | Pattern de correspondance (`.` = tout) |
| `strip` | `int` | Nombre de chiffres à supprimer au début |
| `prepend` | `string` | Chiffres à ajouter au début |
| `caller_id` | `string` | Caller ID à utiliser |

#### Exemples de Dial Patterns

| Préfixe | Match | Strip | Prepend | Transformation |
| --- | --- | --- | --- | --- |
| `0` | `.` | 0 | `+33` | `0612345678` → `+33612345678` |
| `00` | `.` | 2 | `+` | `003312345678` → `+3312345678` |
| `*` | `.` | 0 | (aucun) | `97` → `97` |

### 4.3.4 Association Trunk ↔ Outcall

Un outcall doit être lié à un trunk pour fonctionner.

```http
PUT /api/confd/1.1/outcalls/{outcall_id}/trunks/{trunk_id}

```

```bash
curl -k -X PUT \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/outcalls/7/trunks/5"

```

### 4.3.5 Association Extension/Contexte ↔ Outcall

Pour utiliser un outcall, liez-le à un contexte.

```http
PUT /api/confd/1.1/contexts/{context_id}/outcalls/{outcall_id}

```

```bash
curl -k -X PUT \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/contexts/outside/outcalls/7"

```

* * *

## 4.4 Incalls (Appels Entrants / DID)

### 4.4.1 Concept

Les **incalls** (appelés aussi “incoming calls” ou “DID/SDD”) définissent le routage des appels entrants. Chaque DID (Direct Inward Dialing) est routé vers une destination.

### 4.4.2 CRUD des Incalls

#### Endpoint

```http
GET/POST /api/confd/1.1/incalls
GET/PUT/DELETE /api/confd/1.1/incalls/{incall_id}

```

#### Création d’un Incall (DID)

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "exten": "0143321001",
    "context": "from-extern",
    "priority": 1,
    "destination": {
      "type": "user",
      "user_uuid": "user-uuid-1234"
    }
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/incalls"

```

#### Payload des Incalls

| Champ | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `exten` | `string` | **Oui** | Numéro DID (ex: `0143321001`) |
| `context` | `string` | **Oui** | Contexte entrant (ex: `from-extern`) |
| `priority` | `int` | Non (défaut: 1) | Priorité de routage |
| `destination.type` | `string` | **Oui** | Type de destination |

#### Types de Destinations

| Type | Description | Paramètre supplémentaire |
| --- | --- | --- |
| `user` | Utilisateur | `user_uuid` |
| `voicemail` | Boîte vocale | `voicemail_id` |
| `queue` | File d’attente | `queue_id` |
| `group` | Groupe d’appel | `group_id` |
| `ivr` | Menu IVR | `ivr_id` |
| `conference` | Conférence | `conference_id` |
| `extension` | Extension | `extension_id` |
| `custom` | Destination personnalisée (dialplan) | `custom_src` |

### 4.4.3 Exemples de Destinations

#### Destination vers un Utilisateur

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "exten": "0143321001",
    "context": "from-extern",
    "destination": {
      "type": "user",
      "user_uuid": "user-uuid-1234"
    }
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/incalls"

```

#### Destination vers un IVR

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "exten": "0143321002",
    "context": "from-extern",
    "destination": {
      "type": "ivr",
      "ivr_id": 3
    }
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/incalls"

```

#### Destination vers une File d’Attente

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "exten": "0143321003",
    "context": "from-extern",
    "destination": {
      "type": "queue",
      "queue_id": 5
    }
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/incalls"

```

#### Destination avec Fallback (priorités multiples)

```bash
# Priorité 1 : utilisateur
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "exten": "0143321001",
    "context": "from-extern",
    "priority": 1,
    "destination": {
      "type": "user",
      "user_uuid": "user-uuid-1234"
    }
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/incalls"

# Priorité 2 : voicemail (si pas de réponse)
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "exten": "0143321001",
    "context": "from-extern",
    "priority": 2,
    "destination": {
      "type": "voicemail",
      "voicemail_id": 15
    }
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/incalls"

```

* * *

## 4.5 Caller ID pour Appels Entrants/Sortants

### 4.5.1 Caller ID Externe (Outgoing)

Pour définir le Caller ID présenté aux correspondants externes :

```bash
curl -k -X PUT \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "endpoint_section_options": [
      ["callerid", "Entreprise ABC <+33143321000>"]
    ]
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/endpoints/sip/{endpoint_uuid}"

```

### 4.5.2 Caller ID Interne

Pour un utilisateur spécifique :

```bash
curl -k -X PUT \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "caller_id": {
      "display_name": "Alice Dupont",
      "internal": false
    }
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/users/{user_uuid}"

```

* * *

## 4.6 Scénario Complet : Trunk Opérateur avec DID

Voici la séquence complète pour configurer un trunk SIP avec registration, DID entrant et routage :

```bash
# =============================================================================
# ÉTAPE 1 : Créer l'endpoint SIP du trunk
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "trunk-monoperateur",
    "endpoint_section_options": [
      ["disallow", "all"],
      ["allow", "ulaw,alaw,g722"],
      ["context", "from-extern"],
      ["trust_connected_line", "yes"],
      ["send_connected_line_info", "yes"]
    ]
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/endpoints/sip"

# Réponse : {"uuid": "trunk-ep-uuid", ...}

# =============================================================================
# ÉTAPE 2 : Créer la registration (si nécessaire)
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "endpoint_sip_uuid": "trunk-ep-uuid",
    "registration_section_options": [
      ["server_uri", "sip:sip.monoperateur.fr:5060"],
      ["client_uri", "sip:moncompte@monoperateur.fr"],
      ["expiry", "3600"]
    ],
    "auth_section_options": [
      ["username", "moncompte"],
      ["password", "MotDePasseOperateur"]
    ]
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/registrations"

# =============================================================================
# ÉTAPE 3 : Créer le trunk
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "Trunk MonOpérateur",
    "endpoint_sip_uuid": "trunk-ep-uuid",
    "context": "from-extern"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/trunks"

# Réponse : {"id": 8, ...}

# =============================================================================
# ÉTAPE 4 : Créer l'outcall pour appels sortants
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "sortant-monoperateur",
    "enabled": true
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/outcalls"

# Réponse : {"id": 10, ...}

# =============================================================================
# ÉTAPE 5 : Ajouter dial pattern (France: 00 + numéro)
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "prefix": "00",
    "match_pattern": ".",
    "strip": "2",
    "prepend": "+"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/outcalls/10/dialpatterns"

# =============================================================================
# ÉTAPE 6 : Lier outcall au trunk
# =============================================================================
curl -k -X PUT \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/outcalls/10/trunks/8"

# =============================================================================
# ÉTAPE 7 : Créer le DID entrant (0143321000)
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "exten": "0143321000",
    "context": "from-extern",
    "priority": 1,
    "destination": {
      "type": "user",
      "user_uuid": "user-uuid-cible"
    }
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/incalls"

# =============================================================================
# ÉTAPE 8 : Créer un second DID vers standard (IVR)
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "exten": "0143321001",
    "context": "from-extern",
    "priority": 1,
    "destination": {
      "type": "ivr",
      "ivr_id": 5
    }
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/incalls"

```

* * *

## Résumé du Chapitre 4

| Ressource | Endpoints Clés | Point Critique |
| --- | --- | --- |
| **Trunk** | `POST /trunks` | Lie endpoint SIP + registration |
| **Endpoint SIP (trunk)** | `POST /endpoints/sip` | Context `from-extern` obligatoire |
| **Registration** | `/registrations` | Si Opérateur nécessite REGISTER |
| **Outcall** | `POST /outcalls/{id}/dialpatterns` | Strip/prefix pour transformation |
| **Dial Pattern** | `/outcalls/{id}/trunks/{trunk_id}` | Association trunk obligatoire |
| **Incall (DID)** | `POST /incalls` | Destination: user/queue/ivr/conference |
| **Caller ID** | Endpoint + user | `trust_connected_line` pour préserver CID |

* * *

## Résumé des Chapitres 3 & 4

### Objets de Configuration Core (Chapitre 3)

| Objet | Relations | Clé |
| --- | --- | --- |
| Context | Contient extensions | `context_type` |
| Endpoint SIP | → Ligne (1:1) | Sections PJSIP |
| Ligne | → Endpoint (1:1), Extension (1:1), User (1:N) | `protocol` |
| Extension | → Ligne (1:1) | `exten` + `context` |
| User | → Ligne (N:M), Voicemail (1:1) | `uuid` |
| Voicemail | → User (1:1) | `number` |
| Call Permission | → User (N:M), Rules | `prefix` + `action` |

### Objets de Communication Externe (Chapitre 4)

| Objet | Relations | Clé |
| --- | --- | --- |
| Trunk | → Endpoint SIP, Registration | `endpoint_sip_uuid` |
| Registration | → Endpoint SIP | `server_uri`, `auth` |
| Outcall | → Dial Patterns, Trunks | `strip`/`prepend` |
| Dial Pattern | → Outcall | `prefix` |
| Incall | → Destination (user/queue/ivr) | `exten` (DID) |

* * *

_Fin des Chapitres 3 et 4 — Suite : Chapitre 5 (Services Avancés)_

---

<div class="post-metadata">

**Author:** ![Alloallo](https://yyz2.discourse-cdn.com/free1/user_avatar/wazo-platform.discourse.group/alloallo/32/664_2.png) [@Alloallo](https://wazo-platform.discourse.group/u/Alloallo)\
**Post date:** [July 28, 2026, 5:30am UTC](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923/20 "2026-07-28T05:30:21Z")

</div>

* * *

# CHAPITRE 5 : Services Avancés (wazo-confd)

## 5.1 Files d’Attente (Queues)

### 5.1.1 Concept

Les **queues** (files d’attente) sont le composant central d’un centre d’appels (ACD - Automatic Call Distributor). Elles permettent de :

- Distribuer les appels entrants vers plusieurs agents
- Gérer les temps d’attente
- Appliquer des stratégies de sonnerie multiples
- Mettre en place des compétences (skills) pour le routage intelligent
- Collecter des statistiques détaillées

### 5.1.2 Stratégies de Distribution

| Stratégie | Description | Cas d’usage |
| --- | --- | --- |
| `ringall` | Appelle tous les agents simultanément | Urgence, support rapide |
| `leastrecent` | Agent ayant reçu le moins récemment | Distribution uniforme |
| `fewestcalls` | Agent avec le moins d’appels complétés | Équilibre de charge |
| `rrmemory` | Round-robin avec mémoire | Distribution cyclique |
| `random` | Agent aléatoire | Sampling, tests |
| `wrandom` | Aléatoire pondéré par pénalité | Priorisation fine |
| `linear` | Ordre défini (login ou manuel) | Hiérarchie stricte |

> **⚠ Attention** : La stratégie `linear` ne peut pas être activée via l’API si elle n’était pas initialement configurée. C’est une limitation Asterisk.

### 5.1.3 CRUD des Queues

#### Endpoint

```http
GET/POST /api/confd/1.1/queues
GET/PUT/DELETE /api/confd/1.1/queues/{queue_id}

```

#### Création d’une Queue Complète

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "support-technique",
    "display_name": "Support Technique",
    "context": "default",
    "timeout": 30,
    "retry": 5,
    "maxlen": 0,
    "options": [
      ["strategy", "rrmemory"],
      ["announce-frequency", "30"],
      ["announce-holdtime", "yes"],
      ["announce-position", "yes"],
      ["periodic-announce-frequency", "60"],
      ["periodic-announce", "queue-periodic-announce"],
      ["music_on_hold", "default"],
      ["joinempty", "yes"],
      ["leavewhenempty", "yes"],
      ["ringinuse", "no"],
      ["setinterfacevar", "yes"],
      ["timeoutrouting", "yes"]
    ],
    "weight": 0,
    "preprocess_subroutine": null,
    "description": "File d'attente support technique niveau 1"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/queues"

```

#### Payload Détaillé des Options de Queue

| Option | Type | Description | Valeurs |
| --- | --- | --- | --- |
| `strategy` | `string` | Stratégie de distribution | `ringall`, `leastrecent`, `fewestcalls`, `rrmemory`, `random`, `wrandom`, `linear` |
| `timeout` | `int` | Timeout d’appel par agent (secondes) | 10-60 |
| `retry` | `int` | Nb de tentatives avant abandon | 1-10 |
| `maxlen` | `int` | Taille max file (0 = illimité) | 0-100 |
| `announce-frequency` | `int` | Fréquence announcement position (secondes) | 15-300 |
| `announce-holdtime` | `string` | Annoncer temps d’attente | `yes`, `no` |
| `announce-position` | `string` | Annoncer position dans la file | `yes`, `no`, `limit` |
| `periodic-announce-frequency` | `int` | Fréquence announcement périodique | 30-600 |
| `music_on_hold` | `string` | Musique d’attente | Nom MOH |
| `joinempty` | `string` | Autoriser entrée si vide | `yes`, `no`, `strict` |
| `leavewhenempty` | `string` | Quitter si file vide | `yes`, `no`, `strict` |
| `ringinuse` | `string` | Sonner si agent en appel | `yes`, `no` |
| `setinterfacevar` | `string` | Variables AMI | `yes`, `no` |
| `timeoutrouting` | `string` | Timeout applique au routage | `yes`, `no` |

#### Réponse (201 Created)

```json
{
  "id": 12,
  "name": "support-technique",
  "display_name": "Support Technique",
  "context": "default",
  "timeout": 30,
  "retry": 5,
  "maxlen": 0,
  "options": [
    ["strategy", "rrmemory"],
    ["announce-frequency", "30"]
  ],
  "weight": 0,
  "tenant_uuid": "tenant-uuid-main"
}

```

### 5.1.4 Association Agent ↔ Queue

#### Ajouter un Agent dans une Queue

```http
PUT /api/confd/1.1/queues/{queue_id}/members/agents/{agent_id}

```

```bash
curl -k -X PUT \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "priority": 0,
    "penalty": 0
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/queues/12/members/agents/agent-id-001"

```

#### Payload d’Association Agent

| Champ | Type | Description |
| --- | --- | --- |
| `priority` | `int` | Priorité de l’agent (0 = plus haute) |
| `penalty` | `int` | Pénalité (pour stratégie weighted) |

#### Liste des Membres d’une Queue

```bash
curl -k -X GET \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/queues/12/members"

```

### 5.1.5 Queue avec Skills (Routage par Compétences)

Pour du skills-based routing, créez d’abord des skills :

#### Création d’un Skill

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "anglais",
    "display_name": "Anglais"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/queueskills"

```

#### Association Skill à un Agent

```bash
curl -k -X PUT \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "skill_id": 3,
    "agent_id": "agent-id-001",
    "weight": 5
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/agent_skills"

```

* * *

## 5.2 Groupes d’Appel (Ring Groups)

### 5.2.1 Concept

Les **ring groups** (groupes de sonnerie) permettent de faire sonner plusieurs utilisateurs simultanément ou séquentiellement lorsqu’un numéro interne est composé. Contrairement aux queues, pas de distribution ACD.

### 5.2.2 CRUD des Ring Groups

#### Endpoint

```http
GET/POST /api/confd/1.1/groups
GET/PUT/DELETE /api/confd/1.1/groups/{group_uuid}

```

#### Création d’un Ring Group

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "equipe-commerciale",
    "display_name": "Équipe Commerciale",
    "context": "default",
    "extension": "200",
    "options": [
      ["strategy", "ringall"],
      ["timeout", "30"],
      ["music_on_hold", "default"]
    ],
    "description": "Groupe sonnerie équipe commerciale"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/groups"

```

#### Options des Ring Groups

| Option | Description | Valeurs |
| --- | --- | --- |
| `strategy` | Stratégie de sonnerie | `ringall`, `hunt`, `memory`, `firstavailable`, `random` |
| `timeout` | Timeout total (secondes) | 10-300 |
| `music_on_hold` | Musique d’attente | Nom MOH |

#### Ajout de Membres

```bash
curl -k -X PUT \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  "https://wazo.example.com:9486/api/confd/1.1/groups/group-uuid/members/users/user-uuid-001"

```

* * *

## 5.3 Menus Vocaux (IVR)

### 5.3.1 Concept

Un **IVR** (Interactive Voice Response) est un menu vocal interactif qui accueille l’appelant et permet des choix via tonalité DTMF.

### 5.3.2 CRUD des IVR

#### Endpoint

```http
GET/POST /api/confd/1.1/ivr
GET/PUT/DELETE /api/confd/1.1/ivr/{ivr_id}

```

#### Création d’un IVR

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "standard-automatique",
    "display_name": "Standard Automatique",
    "context": "default",
    "announcement": null,
    "menu_sound": "",
    "choices": [
      {
        "exten": "1",
        "destination": {
          "type": "queue",
          "queue_id": 12
        }
      },
      {
        "exten": "2",
        "destination": {
          "type": "ivr",
          "ivr_id": 5
        }
      },
      {
        "exten": "3",
        "destination": {
          "type": "voicemail",
          "voicemail_id": 15
        }
      }
    ],
    "timeout": 5,
    "max_timeout_trials": 3,
    "invalid_destination": {
      "type": "ivr",
      "ivr_id": 4
    },
    "description": "Menu d'accueil standard"
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/ivr"

```

#### Structure des Choix IVR

```json
{
  "exten": "1",
  "destination": {
    "type": "user|queue|ivr|voicemail|conference|extension|hangup",
    "{resource}_id": "..."
  }
}

```

#### Types de Destinations IVR

| Type | Description |
| --- | --- |
| `user` | Routage vers utilisateur |
| `queue` | Routage vers file d’attente |
| `ivr` | Routage vers sous-menu IVR |
| `voicemail` | Routage vers messagerie vocale |
| `conference` | Routage vers conférence |
| `extension` | Routage vers extension |
| `hangup` | Raccrochage |

* * *

## 5.4 Conférences

### 5.4.1 Concept

Les **conferences** permettent des appels audio à plusieurs participants.

### 5.4.2 CRUD des Conférences

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "conference-direction",
    "display_name": "Conference Direction",
    "context": "default",
    "extension": "3000",
    "pin": "1234",
    "options": [
      ["announce_join_leave", "yes"],
      ["music_on_hold", "default"],
      ["quiet", "no"],
      ["record", "no"]
    ]
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/conferences"

```

* * *

## 5.5 Plannings (Schedules)

### 5.5.1 Concept

Les **schedules** définissent les plages horaires d’ouverture pour le routage des appels.

### 5.5.2 CRUD des Schedules

#### Création d’un Schedule

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "horaires-bureau",
    "display_name": "Horaires Bureau",
    "timezone": "Europe/Paris",
    "description": "Ouverture du lundi au vendredi",
    "closed_destination": {"type": "none"}
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/schedules"

```

#### Création de Time Periods

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "horaire-journee",
    "display_name": "Heures de journee",
    "timeframes": [
      {
        "days": ["monday", "tuesday", "wednesday", "thursday", "friday"],
        "hours": [
          {"begin": "09:00", "end": "12:00"},
          {"begin": "14:00", "end": "18:00"}
        ]
      }
    ]
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/schedules/timeperiods"

```

#### Time Rules (Exceptions / Jours fériés)

```bash
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "feries-2026",
    "display_name": "Jours feries",
    "timeframes": [
      {
        "dates": ["2026-01-01", "2026-05-01", "2026-07-14", "2026-12-25"],
        "hours": [{"begin": "00:00", "end": "00:00"}]
      }
    ]
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/schedules/timerules"

```

#### Association Schedule → Incall

```bash
# L'incall utilise le schedule pour le routage conditionnel
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "exten": "0143321000",
    "context": "from-extern",
    "priority": 1,
    "destination": {
      "type": "queue",
      "queue_id": 12
    },
    "schedule_id": 7,
    "fallback_destination": {
      "type": "voicemail",
      "voicemail_id": 15
    }
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/incalls"

```

* * *

## 5.6 Scénario Complet : Centre d’Appels avec Skills

```bash
# =============================================================================
# ÉTAPE 1 : Créer les skills
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{"name": "technique", "display_name": "Support Technique"}' \
  "https://wazo.example.com:9486/api/confd/1.1/queueskills"

curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{"name": "commercial", "display_name": "Support Commercial"}' \
  "https://wazo.example.com:9486/api/confd/1.1/queueskills"

# =============================================================================
# ÉTAPE 2 : Créer la queue
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "support-unifie",
    "display_name": "Support Unifié",
    "context": "default",
    "options": [
      ["strategy", "leastrecent"],
      ["timeout", "25"],
      ["announce-position", "yes"]
    ]
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/queues"

# =============================================================================
# ÉTAPE 3 : Créer l'IVR de routage
# =============================================================================
curl -k -X POST \
  -H "Content-Type: application/json" \
  -H "X-Auth-Token: {token}" \
  -H "Wazo-Tenant: {tenant_uuid}" \
  -d '{
    "name": "accueil-support",
    "display_name": "Accueil Support",
    "context": "default",
    "choices": [
      {"exten": "1", "destination": {"type": "queue", "queue_id": 15}},
      {"exten": "2", "destination": {"type": "queue", "queue_id": 16}}
    ]
  }' \
  "https://wazo.example.com:9486/api/confd/1.1/ivr"

```

* * *

## Résumé du Chapitre 5

| Ressource | Endpoints Clés | Point Critique |
| --- | --- | --- |
| **Queue** | `POST /queues` + `/queues/{id}/members/agents` | Stratégies, timeout, skills |
| **Ring Group** | `POST /groups` | Strategie sonnerie (`ringall`, `hunt`) |
| **IVR** | `POST /ivr` | Choices avec destinations imbriquées |
| **Conference** | `POST /conferences` | PIN, extension |
| **Schedule** | `POST /schedules` + `/timeperiods` + `/timerules` | Timezone, exceptions |
| **Skills** | `/queueskills` + `/agent_skills` | Skills-based routing |

[Next page](https://wazo-platform.discourse.group/t/tuto-comment-obtenir-des-fichiers-ressources-wazo-api-pour-lia/1923.md?page=2)
