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

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/ , 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 :smiley: @+

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 :smiley:

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!!! :wink:

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!!! :wink:

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

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!!!

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!!!

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 !

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

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

Payload :

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

Réponse :

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

:link: 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é)

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

Payload :

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

Réponse :

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

:link: 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

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

Payload :

{
  "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 :

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

:link: 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

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

Payload :

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

Réponse :

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

:link: 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

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

Payload :

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

Réponse :

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

:link: 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

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

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

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

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

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

Payload :

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

Réponse :

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

:link: 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

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

Payload :

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

Réponse : 200 OK

Point d’attention / Warning

: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

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

Réponse :

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

:link: Chaînage : Stockez le LINE_ID = 25

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

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

Réponse :

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

:link: Chaînage : Stockez le DEVICE_ID = 001122334455

Étape 3 : Dissocier le device de la ligne

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

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

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

Réponse :

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

:link: Chaphinage : Stockez EXT_ID = 156

Étape 6 : Dissocier l’extension de la ligne

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

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

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

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

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

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

: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

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

Réponse (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

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

Étape 2 : Importer le fichier CSV

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

Body (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 :

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

:link: 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

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

Réponse :

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

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

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

Point d’attention / Warning

: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

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

Réponse :

{
  "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

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

Payload :

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

Réponse :

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

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

Étape 3 : Configurer le renvoi sur occupation

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

Payload :

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

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

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

Payload :

{
  "enabled": true,
  "destination": "3000",
  "timeout": 18
}
Paramètre Description
timeout Durée avant renvoi (en secondes, défaut: 18)

Point d’attention / Warning

: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

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 :

{
  "enabled": true
}

Étape 2 : Désactiver le DND

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

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 :

{
  "enabled": true
}

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

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

: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

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

Payload :

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

Réponse :

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

:link: 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

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

Payload :

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

Réponse :

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

:link: Chaînage : Stockez ADMIN_AUTH_UUID

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

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

Payload :

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

Réponse :

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

:link: Chaînage : Stockez POLICY_UUID

Étape 4 : Assigner la policy à l’administrateur

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

Payload :

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

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

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

Payload :

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

Réponse :

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

:link: Chaînage : Stockez CTX_INTERNAL_ID = 45

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

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

Payload :

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

Réponse :

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

:link: Chaînage : Stockez CTX_INCALL_ID = 46

Étape 7 : Vérifier le tenant

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

Point d’attention / Warning

: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

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

Réponse :

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

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

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

Payload :

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

Étape 3 : Configurer le fallback sur occupation

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

Payload :

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

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

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

Payload :

{
  "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

: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

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

Réponse :

{
  "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

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

Payload :

{
  "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 :

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

:link: Chaînage : Stockez TEMPLATE_ID = 5

Étape 3 : Appliquer le template à un utilisateur

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)

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

Payload :

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

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

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

Point d’attention / Warning

: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

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

Joli travail !

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.

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é

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 , j’ai pondu ou fais pondre des scripts de deploiement pour ava-ai pour wazo dans un repo privé!!!

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.

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

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.

// 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

┌─────────────────────────────────────────────────────────────────────────────┐
│                        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

┌─────────────────────────────────────────────────────────────────────────────┐
│                      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 :

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

Wazo-Tenant: {tenant_uuid}

Exemples de Requêtes

# 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 :

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

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"
    }
  ]
}

:warning: 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 :

# 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é

# 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

{
  "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

{
  "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 :

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

# 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

┌─────────────────────────────────────────────────────────────────────────────┐
│                   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

:warning: 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.


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

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.

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 :

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.

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.

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)

{
  "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 :

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

401 Unauthorized — Backend invalide :

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

400 Bad Request — Données manquantes :

{
  "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 :

GET /api/auth/0.1/token/{token}
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) :

{
  "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) :

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

2.3.2 Suppression d’un Token (Logout)

Pour invalider un token avant son expiration :

DELETE /api/auth/0.1/token/{token}
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 :

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

{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

:warning: 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

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

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) :

{
  "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

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 :

PUT /api/auth/0.1/users/{user_uuid}/policies/{policy_uuid}
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

DELETE /api/auth/0.1/users/{user_uuid}/policies/{policy_uuid}
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 :

# 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 :

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

2.5.2 Exemple Pratique

# 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”

:warning: 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).

POST /api/auth/0.1/users
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) :

{
  "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

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

PUT /api/auth/0.1/users/{user_uuid}/password
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

DELETE /api/auth/0.1/users/{user_uuid}
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/.

# /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

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

Réponse :

{
  "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 :

# 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)


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

┌─────────────────────────────────────────────────────────────────────────────┐
│                      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

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

Liste des Contextes

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

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)

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

:warning: 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

┌─────────────────────────────────────────────────────────────────────────────┐
│                  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
GET/POST    /api/confd/1.1/endpoints/sip
GET/PUT/DELETE /api/confd/1.1/endpoints/sip/{endpoint_uuid}
Liste des Endpoints SIP
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
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

:warning: 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)

{
  "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
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
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
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
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)

{
  "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
GET/POST    /api/confd/1.1/extensions
GET/PUT/DELETE /api/confd/1.1/extensions/{extension_id}
Création d’une 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 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

{
  "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

PUT /api/confd/1.1/lines/{line_id}/endpoints/sip/{endpoint_uuid}
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

PUT /api/confd/1.1/lines/{line_id}/extensions/{extension_id}
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

DELETE /api/confd/1.1/lines/{line_id}/extensions/{extension_id}
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

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

Création d’un Utilisateur Simple

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)

{
  "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

PUT /api/confd/1.1/users/{user_uuid}/lines/{line_id}
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

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

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

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

Création d’un Voicemail

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

{
  "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

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

Dissocier une boîte

DELETE /api/confd/1.1/users/{user_uuid}/voicemails
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

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

Création d’une Permission

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

{
  "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

POST /api/confd/1.1/callpermissions/{permission_id}/rules
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

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

PUT /api/confd/1.1/users/{user_uuid}/callpermissions/{permission_id}
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 :

# =============================================================================
# É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

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

┌─────────────────────────────────────────────────────────────────────────────┐
│                   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

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)

# =============================================================================
# É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 :

# =============================================================================
# É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

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

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

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

Création d’un Outcall

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

{
  "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

POST /api/confd/1.1/outcalls/{outcall_id}/dialpatterns
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) 9797

4.3.4 Association Trunk ↔ Outcall

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

PUT /api/confd/1.1/outcalls/{outcall_id}/trunks/{trunk_id}
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.

PUT /api/confd/1.1/contexts/{context_id}/outcalls/{outcall_id}
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

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

Création d’un Incall (DID)

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

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

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

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)

# 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 :

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 :

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 :

# =============================================================================
# É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)


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

:warning: 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

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

Création d’une Queue Complète

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)

{
  "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

PUT /api/confd/1.1/queues/{queue_id}/members/agents/{agent_id}
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

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

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

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

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

Création d’un Ring Group

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

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

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

Création d’un IVR

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

{
  "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

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

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

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)

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

# 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

# =============================================================================
# É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