Les Smart Routings décident où aboutit un appel entrant, selon des règles entrantes (files d'attente), des horaires d'ouverture, des exceptions, la géographie, des clés CTI ou des contacts. Pour une présentation fonctionnelle, voir la documentation Smart Routings.
Cette page présente les concepts communs à tous les endpoints Smart Routings, puis les endpoints des règles entrantes. Les autres ressources ont leur propre page :
| Page | Ressources |
|---|---|
| CTI | CTI et leurs destinations, lookups CTI |
| Contacts | Contacts de routage et champs de contact |
| Routage géographique | Modèles, listes et destinations géographiques, lookup géographique |
| Enquêtes | Enquêtes et réponses aux enquêtes |
En-têtes : Authorization: Bearer {token-workspace}
#Choix du compte client
Les données Smart Routings appartiennent à un compte client. Chaque endpoint Smart Routings (ainsi que les autres endpoints scopés au client, comme les clés d'intégration ou l'historique des appels) doit savoir sur quel client il agit. Le client n'est pas déduit du token : il doit être indiqué dans la requête.
| Paramètre | Description |
|---|---|
customer_account |
Code de compte client (recommandé) |
customer_id |
ID du client, utilisé en l'absence de customer_account |
account_id |
Alias de customer_id |
Le paramètre est généralement passé dans la query string (?customer_account=ACME01) ; il est aussi lu dans le corps de la requête.
La requête est rejetée avec un code 403 lorsque :
- aucun client ne correspond aux paramètres (
No valid account specified.) ; - l'utilisateur authentifié n'appartient pas à ce client (
You do not have access to this account.) ; - le client OAuth est restreint à un autre client (
This credential is not authorized for this account.).
Utilisez GET /api/customers/resolve pour vérifier vers quel client pointent un identifiant d'accès et un customer_account.
#Scopes et authentification
| Scope | Donne accès à |
|---|---|
client |
Tous les endpoints Smart Routings |
cfd |
Endpoints de lookup (règles entrantes, géographique, CTI) et enregistrement des réponses aux enquêtes uniquement |
Les call flows s'authentifient généralement avec un token CFD, échangé contre un token d'accès court avec le scope cfd. Tout token OAuth disposant du scope client fonctionne aussi sur les lookups (voir Authentification).
#Permissions
Les permissions sont vérifiées sur le rôle de l'utilisateur authentifié. Le propriétaire du workspace et les utilisateurs ayant le rôle superadmin disposent de toutes les permissions.
| Ressource | Permissions |
|---|---|
| Règles entrantes | call-queue.view, call-queue.create, call-queue.edit, call-queue.delete, call-queue.lookup |
| Groupes | call-queue-group.view, call-queue-group.create, call-queue-group.edit, call-queue-group.delete |
| Plages horaires et exceptions | Mêmes permissions que leur parent : view pour lire, edit pour créer, modifier ou supprimer |
| Tokens CFD | cfd-token.view, cfd-token.create |
#Conventions
- Les endpoints d'écriture attendent un corps JSON (
Content-Type: application/json), sauf l'endpoint d'import (multipart). - Les listes sont paginées (voir Pagination) et acceptent les paramètres
filter[...],sortetincludeindiqués pour chaque endpoint. Les filtres texte acceptent des valeurs partielles. - Les erreurs de validation renvoient un code
400avec un tableauhint:
{
"response": "bad request: please check body parameters.",
"hint": ["The name field is required."]
}
- Les erreurs de règle métier renvoient un
message:
{ "message": "The provided time span conflicts with another span for this entity." }
- Types de destination, utilisés par les règles entrantes, les plages horaires et les exceptions :
extension,voicemail,call_queue,end_call,external_number,other. - Heure locale. Les plages horaires et les exceptions sont évaluées dans le fuseau horaire du client (paramètre
timezone, voirPUT /api/customers/settings).
#Règles entrantes (files d'attente)
Une règle entrante décrit une file d'attente 3CX ou un numéro SDA (DID), sa destination par défaut et, éventuellement, le groupe dont elle hérite les plages horaires et les exceptions.
#L'objet règle entrante
{
"id": 5,
"customer_id": 12,
"call_queue_group_id": 2,
"active": true,
"name": "Support",
"host_name": "acme.3cx.eu",
"type": "queue",
"code": "SUP",
"number": "800",
"did_number": null,
"default_destination_type": "voicemail",
"default_destination": "800",
"created_at": "2025-01-15T09:30:00.000000Z",
"updated_at": "2025-01-20T16:02:11.000000Z",
"group": { "id": 2, "name": "Business hours" }
}
| Champ | Description |
|---|---|
type |
queue (identifiée par number) ou did (identifiée par did_number) |
host_name |
Nom d'hôte 3CX sur lequel se trouve la file |
code |
Code libre, 50 caractères max. |
call_queue_group_id |
Groupe auquel appartient la règle, ou null |
#GET /api/smart-routings/call-queues/queues
Retourne les règles entrantes du client, de la plus récemment modifiée à la plus ancienne.
Paramètres de requête
| Paramètre | Description |
|---|---|
customer_account |
Requis. Code de compte client |
filter[call_queue_group_id] |
ID de groupe exact |
filter[active] |
Valeur exacte, 1 ou 0 |
filter[type] |
queue ou did |
filter[name], filter[code], filter[number], filter[did_number], filter[host_name] |
Correspondance partielle |
filter[search] |
Correspondance partielle sur le nom, le code, le numéro ou le numéro SDA |
include |
customer, exceptions, timeSpans |
sort |
id, created_at, updated_at, name, code, type, call_queue_group_id, resource (numéro ou numéro SDA). Préfixer par - pour un ordre décroissant. Par défaut : -updated_at |
per_page |
Résultats par page (défaut : 20) |
Réponse 200 : liste paginée d'objets règle entrante
#GET /api/smart-routings/call-queues/queues/{id}
Retourne une règle entrante avec son group, ses exceptions et ses time_spans.
Réponse 200 : objet règle entrante
#POST /api/smart-routings/call-queues/queues
Crée une règle entrante pour le client. Si call_queue_group_id est renseigné, les plages horaires et exceptions du groupe sont copiées sur la nouvelle règle.
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
name |
string | oui | Nom, 50 caractères max. |
type |
string | non | queue ou did |
number |
string | non | Numéro de la file, 50 caractères max. |
did_number |
string | non | Numéro SDA, 255 caractères max. |
host_name |
string | non | Nom d'hôte 3CX |
code |
string | non | Code libre, 50 caractères max. |
active |
boolean | non | Règle active ou non |
call_queue_group_id |
integer | non | ID d'un groupe existant |
default_destination_type |
string | non | Un des types de destination |
default_destination |
string | non | Destination par défaut, 255 caractères max. |
Réponse 201 : l'objet règle entrante créé
#PUT /api/smart-routings/call-queues/queues/{id}
Modifie une règle entrante. Accepte les mêmes champs que la création, tous facultatifs.
Déplacer la règle dans un autre groupe remplace ses plages horaires et exceptions par des copies de celles du nouveau groupe. Passer call_queue_group_id à null la détache du groupe : les copies deviennent ses propres lignes, modifiables.
Réponse 201 : l'objet règle entrante modifié
#DELETE /api/smart-routings/call-queues/queues/{id}
Supprime une règle entrante ainsi que ses plages horaires et exceptions.
Réponse 200
{ "response": "element deleted" }
#PATCH /api/smart-routings/call-queues/queues/bulk
Modifie plusieurs règles entrantes du client en une fois. Seuls les champs présents dans le corps sont modifiés. Requiert call-queue.edit.
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
ids |
integer[] | oui | IDs des règles à modifier |
active |
boolean | non | Active ou désactive |
default_destination_type |
string | non | Un des types de destination |
default_destination |
string | non | Destination par défaut |
{ "ids": [5, 6, 9], "default_destination_type": "voicemail", "default_destination": "800" }
Réponse 200 : tableau des objets règle entrante modifiés
#DELETE /api/smart-routings/call-queues/queues/bulk
Supprime plusieurs règles entrantes du client, ainsi que leurs plages horaires et leurs exceptions. Requiert call-queue.delete. Les règles d'un autre client sont ignorées.
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
ids |
integer[] | oui | IDs des règles à supprimer |
Réponse 200
{ "response": "elements deleted" }
#Groupes
Un groupe partage ses plages horaires et ses exceptions avec toutes les règles entrantes qu'il contient. Les règles en reçoivent des copies verrouillées : seuls destination et destination_type peuvent être modifiés sur la règle elle-même.
#L'objet groupe
{
"id": 2,
"customer_id": 12,
"name": "Business hours",
"created_at": "2025-01-10T08:00:00.000000Z",
"updated_at": "2025-01-10T08:00:00.000000Z",
"queues_count": 4
}
queues_count n'est présent que dans les listes.
#GET /api/smart-routings/call-queues/groups
Retourne les groupes du client, du plus récemment modifié au plus ancien.
Paramètres de requête
| Paramètre | Description |
|---|---|
customer_account |
Requis. Code de compte client |
filter[name] |
Correspondance partielle |
include |
queues, customer, exceptions, timeSpans |
sort |
id, created_at, updated_at, name. Par défaut : -updated_at |
per_page |
Résultats par page (défaut : 20) |
Réponse 200 : liste paginée d'objets groupe
#GET /api/smart-routings/call-queues/groups/{id}
Retourne un groupe avec ses queues, exceptions et time_spans.
Réponse 200 : objet groupe
#POST /api/smart-routings/call-queues/groups
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
name |
string | oui | Nom, 50 caractères max. |
Réponse 201 : l'objet groupe créé
#PUT /api/smart-routings/call-queues/groups/{id}
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
name |
string | non | Nom, 50 caractères max. |
Réponse 201 : l'objet groupe modifié
#DELETE /api/smart-routings/call-queues/groups/{id}
Supprime un groupe. Ses règles entrantes sont conservées et détachées du groupe ; les copies héritées deviennent leurs propres lignes.
Réponse 200
{ "response": "element deleted" }
#Plages horaires
Une plage horaire route les appels vers une destination pendant une période d'ouverture, chaque semaine (day_of_week) ou à une date précise (date_full). Une plage horaire appartient à une règle entrante ou à un groupe : les endpoints qui listent ou créent des plages identifient ce parent avec deux paramètres de requête.
| Paramètre | Description |
|---|---|
time_spanable_type |
call_queue (règle entrante) ou call_queue_group |
time_spanable_id |
ID de la règle entrante ou du groupe |
Une règle entrante qui appartient à un groupe ne peut pas avoir ses propres plages horaires : créez-les sur le groupe (422).
#L'objet plage horaire
{
"id": 31,
"source_time_span_id": null,
"imported_at": null,
"time_spanable_id": 5,
"time_spanable_type": "call_queue",
"reference": "morning",
"destination": "800",
"destination_type": "call_queue",
"day_of_week": 1,
"date_full": null,
"start_time": "08:30:00",
"end_time": "12:30:00",
"created_at": "2025-01-15T09:35:00.000000Z",
"updated_at": "2025-01-15T09:35:00.000000Z"
}
| Champ | Description |
|---|---|
day_of_week |
1 (lundi) à 7 (dimanche) |
date_full |
Date précise (AAAA-MM-JJ). Prioritaire sur les plages hebdomadaires ce jour-là |
source_time_span_id |
Renseigné sur les copies héritées d'un groupe (lignes verrouillées) |
imported_at |
Renseigné sur les plages créées par un import |
#GET /api/smart-routings/call-queues/time-spans
Paramètres de requête
| Paramètre | Description |
|---|---|
customer_account |
Requis. Code de compte client |
time_spanable_type, time_spanable_id |
Requis. Parent des plages |
filter[reference], filter[destination], filter[day_of_week], filter[date_full], filter[start_time], filter[end_time] |
Filtres |
sort |
id, created_at, updated_at. Par défaut : -updated_at |
per_page |
Résultats par page (défaut : 20) |
Réponse 200 : liste paginée d'objets plage horaire
#GET /api/smart-routings/call-queues/time-spans/{id}
Retourne une plage horaire avec son parent (time_spanable).
Réponse 200 : objet plage horaire
#POST /api/smart-routings/call-queues/time-spans
Crée une plage horaire sur le parent indiqué dans la query string. Les plages créées sur un groupe sont copiées sur toutes les règles entrantes du groupe.
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
start_time |
string | oui | Heure de début, HH:MM:SS |
end_time |
string | oui | Heure de fin, HH:MM:SS, postérieure à start_time |
day_of_week |
integer | oui* | 1 (lundi) à 7 (dimanche) |
date_full |
string | oui* | Date précise, AAAA-MM-JJ |
destination_type |
string | non | Un des types de destination |
destination |
string | non | Destination, 50 caractères max. |
reference |
string | non | Référence libre, 50 caractères max. |
*Fournir day_of_week ou date_full. Si les deux sont envoyés, day_of_week est ignoré.
Réponse 201 : l'objet plage horaire créé
Réponse 422 : la plage chevauche une autre plage du même parent le même jour
#PUT /api/smart-routings/call-queues/time-spans/{id}
Modifie une plage horaire. Accepte les mêmes champs, tous facultatifs. Sur une plage verrouillée (héritée d'un groupe), seuls destination et destination_type peuvent être envoyés (422 sinon).
Réponse 201 : l'objet plage horaire modifié
#DELETE /api/smart-routings/call-queues/time-spans/{id}
Supprime une plage horaire. Les plages verrouillées ne peuvent pas être supprimées (403) : supprimez-les sur le groupe.
Réponse 200
{ "response": "element deleted" }
#POST /api/smart-routings/call-queues/time-spans/bulk
Crée la même période d'ouverture sur plusieurs jours en une fois : une plage par valeur de day_of_week et de date_full. Requiert les paramètres de requête time_spanable_type et time_spanable_id.
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
day_of_week |
integer[] | oui* | Jours de la semaine, 1 à 7 |
date_full |
string[] | oui* | Dates, AAAA-MM-JJ |
start_time |
string | oui | Heure de début, HH:MM:SS |
end_time |
string | oui | Heure de fin, HH:MM:SS |
destination_type |
string | non | Un des types de destination |
destination |
string | non | Destination |
reference |
string | non | Référence libre |
*Fournir day_of_week, date_full, ou les deux.
{
"day_of_week": [1, 2, 3, 4, 5],
"start_time": "08:30:00",
"end_time": "12:30:00",
"destination_type": "call_queue",
"destination": "800"
}
Réponse 201 : tableau de toutes les plages horaires du parent
Réponse 422 : une des plages entre en conflit avec une plage existante
#PATCH /api/smart-routings/call-queues/time-spans/bulk
Modifie la destination de plusieurs plages horaires du parent. Fonctionne aussi sur les plages verrouillées.
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
ids |
integer[] | oui | IDs des plages horaires |
destination_type |
string | non | Un des types de destination |
destination |
string | non | Destination |
Réponse 200 : tableau des objets plage horaire modifiés
#DELETE /api/smart-routings/call-queues/time-spans/bulk
Supprime plusieurs plages horaires du parent.
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
ids |
integer[] | non | IDs des plages horaires à supprimer |
Sans
ids, toutes les plages horaires du parent sont supprimées.
Réponse 200
{ "response": "elements deleted" }
Réponse 403 : une des plages ciblées est verrouillée (héritée d'un groupe)
#Exceptions
Une exception remplace les plages horaires un jour donné (jour férié, fermeture…). Les exceptions sont prioritaires sur les plages horaires. Comme les plages horaires, elles appartiennent à une règle entrante ou à un groupe, identifié par deux paramètres de requête sur les endpoints de liste, de création et de traitement par lot.
| Paramètre | Description |
|---|---|
exceptionable_type |
call_queue (règle entrante) ou call_queue_group |
exceptionable_id |
ID de la règle entrante ou du groupe |
Une règle entrante qui appartient à un groupe ne peut pas avoir ses propres exceptions : créez-les sur le groupe (422).
#L'objet exception
{
"id": 77,
"source_exception_id": null,
"exceptionable_id": 2,
"exceptionable_type": "call_queue_group",
"reference": "France:christmasDay",
"label": "Noël",
"destination": "800",
"destination_type": "voicemail",
"day": "2026-12-25",
"created_at": "2026-01-05T10:00:00.000000Z",
"updated_at": "2026-01-05T10:00:00.000000Z"
}
source_exception_id est renseigné sur les copies verrouillées héritées d'un groupe.
#GET /api/smart-routings/call-queues/exceptions
Paramètres de requête
| Paramètre | Description |
|---|---|
customer_account |
Requis. Code de compte client |
exceptionable_type, exceptionable_id |
Requis. Parent des exceptions |
filter[reference], filter[destination], filter[day] |
Filtres |
sort |
id, created_at, updated_at, day. Par défaut : day |
per_page |
Résultats par page (défaut : 20) |
Réponse 200 : liste paginée d'objets exception
#GET /api/smart-routings/call-queues/exceptions/{id}
Retourne une exception avec son parent (exceptionable).
Réponse 200 : objet exception
#POST /api/smart-routings/call-queues/exceptions
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
day |
string | oui | Date, AAAA-MM-JJ |
label |
string | non | Libellé, 50 caractères max. |
reference |
string | non | Référence, 50 caractères max., unique par parent |
destination_type |
string | non | Un des types de destination |
destination |
string | non | Destination, 50 caractères max. |
Réponse 201 : l'objet exception créé
Réponse 400 : la référence existe déjà, ou une autre exception existe ce jour-là
#PUT /api/smart-routings/call-queues/exceptions/{id}
Modifie une exception. Accepte les mêmes champs, tous facultatifs. Sur une exception verrouillée, seuls destination et destination_type peuvent être envoyés (422 sinon).
Réponse 201 : l'objet exception modifié
#DELETE /api/smart-routings/call-queues/exceptions/{id}
Supprime une exception. Les exceptions verrouillées ne peuvent pas être supprimées (403).
Réponse 200
{ "response": "element deleted" }
#PATCH /api/smart-routings/call-queues/exceptions/bulk
Modifie la destination de plusieurs exceptions du parent. Fonctionne aussi sur les exceptions verrouillées.
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
ids |
integer[] | oui | IDs des exceptions |
destination_type |
string | non | Un des types de destination |
destination |
string | non | Destination |
Réponse 200 : tableau des objets exception modifiés
#DELETE /api/smart-routings/call-queues/exceptions/bulk
Supprime plusieurs exceptions du parent.
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
ids |
integer[] | oui | IDs des exceptions à supprimer |
Réponse 200
{ "response": "elements deleted" }
Réponse 403 : une des exceptions ciblées est verrouillée
#GET /api/smart-routings/call-queues/exceptions/holidays
Liste les pays disponibles pour l'import des jours fériés.
Réponse 200
{ "countries": ["Andorra", "Argentina", "Australia", "Austria", "Belgium", "...", "France", "..."] }
#POST /api/smart-routings/call-queues/exceptions/holidays
Crée une exception par jour férié d'un pays sur le parent indiqué par exceptionable_type et exceptionable_id. Sans year, ce sont les jours fériés des 12 prochains mois (à partir d'aujourd'hui, sur deux années civiles si besoin) qui sont créés ; avec year, ceux de cette année civile. Chaque exception reçoit le nom du jour férié comme label et {pays}:{jour férié} comme reference (ex. France:christmasDay).
Un jour férié est ignoré lorsque le parent a déjà une exception ce jour-là : la requête peut donc être relancée sans créer de doublons.
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
country |
string | oui | Nom du pays tel que renvoyé par GET …/exceptions/holidays (ex. France) |
year |
integer | non | Année (4 chiffres). Par défaut : les 12 prochains mois |
destination_type |
string | non | Type de destination appliqué à chaque jour férié |
destination |
string | non | Destination appliquée à chaque jour férié |
Réponse 201 : tableau des objets exception créés (vide si chaque jour férié avait déjà une exception)
Réponse 422 : pays inconnu ou année invalide
#Import et export
Les règles entrantes d'un client peuvent être exportées vers un tableur et importées depuis celui-ci. Le fichier contient une ligne par plage horaire ; les règles sans plage horaire occupent une seule ligne.
| Ligne | Contenu |
|---|---|
| 1 | Intitulés de section : Call queue, Time span |
| 2 | Noms des colonnes |
| 3+ | Données |
| Colonne | Description |
|---|---|
name |
Nom de la règle |
number |
Numéro de la file, ou numéro SDA pour les règles did |
type |
queue ou did |
host_name |
Nom d'hôte 3CX, doit faire partie des hôtes du client |
group_name |
Nom du groupe ; créé s'il n'existe pas |
active |
1 ou 0 |
code |
Code libre |
default_destination_type, default_destination |
Destination par défaut |
day_of_week |
1 (lundi) à 7 (dimanche) |
full_date |
Date précise, AAAA-MM-JJ |
start, end |
Heures, HH:MM:SS |
destination_type, destination |
Destination de la plage horaire |
reference |
Référence de la plage horaire |
#GET /api/smart-routings/call-queues/export
Télécharge les règles entrantes du client au format inbound_rules.xlsx. Requiert call-queue.view.
Réponse 200 : fichier Excel
#POST /api/smart-routings/call-queues/import
Importe des règles entrantes depuis un fichier .xlsx ou .csv (CSV : séparateur ;, délimiteur de texte "). Requiert call-queue.create. Envoyez la requête en multipart/form-data.
Les règles sont rapprochées sur type et number (ou numéro SDA) : les règles existantes sont mises à jour, les autres sont créées. Le fichier entier est d'abord validé puis importé en une seule transaction : si une ligne est invalide, rien n'est importé.
Champs du formulaire
| Champ | Type | Requis | Description |
|---|---|---|---|
document |
file | oui | Fichier .xlsx ou .csv |
replace_all |
boolean | non | Supprime aussi les règles du client absentes du fichier, et les groupes restés vides |
Réponse 200
{ "response": "Import successful." }
Réponse 422 : lignes invalides
{
"response": "The import failed validation.",
"failures": [
{
"row": 4,
"attribute": "host_name",
"errors": ["The selected host_name is invalid."],
"values": { "name": "Support", "number": "800", "type": "queue", "host_name": "unknown.3cx.eu" }
}
]
}
#Lookup des règles entrantes
#GET /api/smart-routings/call-queues/lookup
Retourne la destination d'une règle entrante à un instant donné. C'est l'endpoint appelé par un call flow à l'arrivée d'un appel. Accepte le scope client ou cfd et requiert call-queue.lookup.
La destination est choisie dans cet ordre :
- une exception ce jour-là ;
- une plage horaire à cette date précise (
date_full) couvrant l'heure ; - une plage horaire hebdomadaire (
day_of_week) couvrant l'heure.
Seules les règles actives sont prises en compte. Le jour et l'heure sont évalués dans le fuseau horaire du client.
Paramètres de requête
| Paramètre | Type | Requis | Description |
|---|---|---|---|
customer_account |
string | oui* | Code de compte client |
customer_id |
integer | oui* | ID du client |
queue_id |
integer | oui** | ID de la règle entrante |
queue_number |
string | oui** | Numéro de la file |
queue_name |
string | oui** | Nom de la règle |
day |
string | non | Jour à évaluer, AAAA-MM-JJ. Par défaut : aujourd'hui |
time |
string | non | Heure à évaluer, HH:MM:SS. Par défaut : maintenant |
*Fournir customer_account ou customer_id.
**Fournir un des paramètres queue_id, queue_number ou queue_name (vérifiés dans cet ordre).
Réponse 200
{
"reference": "morning",
"destination": "800",
"label": null,
"inherited": true,
"matched": "time_span,day_of_week"
}
| Champ | Description |
|---|---|
reference |
Référence de l'exception ou de la plage horaire trouvée |
destination |
Destination vers laquelle router l'appel |
label |
Libellé de l'exception (null pour les plages horaires) |
inherited |
true lorsque la correspondance provient du groupe de la règle |
matched |
exception, time_span,date_full ou time_span,day_of_week |
Réponse 404
{ "message": "No destination found matching given parameters." }
Autres messages 404 : No customer found matching given parameters., No queue found matching given parameters.. Si rien ne correspond, appliquez la destination par défaut de la règle dans votre call flow.
Réponse 400 : paramètres invalides, ou day/time invalide
#Tokens CFD
Un token CFD est un secret de longue durée conçu pour les call flows (3CX Call Flow Designer). Il est rattaché à un utilisateur et s'échange contre un token d'accès court avec le scope cfd, qui ne donne accès qu'aux endpoints de lookup et à l'enregistrement des réponses aux enquêtes.
Les tokens CFD sont définis au niveau du workspace : ils ne sont pas filtrés par client, mais les endpoints requièrent tout de même customer_account.
#L'objet token CFD
{
"id": 3,
"user_id": 8,
"name": "Main call flow",
"token": "q8V3...80 characters...Xz",
"hosts": ["203.0.113.10"],
"expires_at": "2027-01-01T00:00:00.000000Z",
"created_at": "2026-01-05T10:00:00.000000Z",
"updated_at": "2026-01-05T10:00:00.000000Z",
"expired": false,
"user": { "id": 8, "name": "Call flow bot", "group": "admin", "email": "cfd@acme.com" }
}
La valeur
tokenest renvoyée par tous les endpoints de tokens CFD. Traitez-la comme un mot de passe.
| Champ | Description |
|---|---|
hosts |
Adresses IP autorisées à échanger le token. null ou ["*"] autorise toutes les adresses |
expires_at |
Date d'expiration, ou null sans expiration |
expired |
true dès que expires_at est passée. Toujours false quand expires_at vaut null |
L'endpoint de liste ne renvoie pas hosts.
#GET /api/smart-routings/cfd-tokens
Requiert cfd-token.view.
Paramètres de requête
| Paramètre | Description |
|---|---|
customer_account |
Requis. Code de compte client |
filter[name] |
Correspondance partielle |
include |
user (toujours chargé) |
sort |
id, name, expires_at, created_at, updated_at. Par défaut : -updated_at |
per_page |
Résultats par page (défaut : 20) |
Réponse 200 : liste paginée d'objets token CFD
#GET /api/smart-routings/cfd-tokens/{id}
Requiert cfd-token.view. Les utilisateurs non admin ne peuvent lire que leurs propres tokens.
Réponse 200 : objet token CFD
#POST /api/smart-routings/cfd-tokens
Crée un token CFD. La valeur token est générée (80 caractères). Requiert cfd-token.create.
Corps de la requête
| Champ | Type | Requis | Description |
|---|---|---|---|
user_id |
integer | oui | Utilisateur au nom duquel le token s'authentifie |
name |
string | non | Nom, 50 caractères max. |
hosts |
string[] | non | Adresses IP autorisées |
expires_at |
string | non | Date d'expiration, AAAA-MM-JJ. Le token expire à 00:00 UTC à cette date. Omettez-la pour un token qui n'expire jamais |
Réponse 201 : l'objet token CFD créé
#PUT /api/smart-routings/cfd-tokens/{id}
Modifie un token CFD (user_id, name, hosts, expires_at). La valeur token ne peut pas être modifiée. Autorisé aux utilisateurs admin et au propriétaire du token.
Réponse 201 : l'objet token CFD modifié
#DELETE /api/smart-routings/cfd-tokens/{id}
Autorisé aux utilisateurs admin et au propriétaire du token.
Réponse 200
{ "response": "element deleted" }
#GET /api/smart-routings/cfd-auth/t/{token}
Échange un token CFD contre un token d'accès avec le scope cfd. Aucun en-tête Authorization n'est nécessaire.
Réponse 200
{
"message": "success",
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOi...",
"expires_at": "2026-10-09T11:42:00+00:00",
"user": { "id": 8, "name": "Call flow bot", "email": "cfd@acme.com", ... }
}
Utilisez le token renvoyé comme Bearer token des appels de lookup. Il est valable 1 heure (expires_at) : échangez à nouveau le token CFD à chaque appel plutôt que de conserver le token d'accès.
Réponse 403
{ "message": "Host not authorised." }
Réponse 404 : token inconnu, token expiré, ou son utilisateur n'existe plus
{ "message": "This token does not exists or has expired." }
L'expiration est vérifiée à chaque échange : une fois expires_at passée, le token CFD ne peut plus être échangé contre un token d'accès. Un token sans expires_at n'expire jamais. La vérification dans le contrôleur :
if (! $cfdToken || $cfdToken->expired) {
return response()->json([
'message' => 'This token does not exists or has expired.',
], 404);
}
Faire expirer ou supprimer un token CFD révoque aussi les tokens d'accès qu'il a émis : les lookups faits avec eux répondent
401immédiatement.