{"openapi": "3.1.0", "info": {"title": "Kanadr API", "description": "Public API: everything the portal does goes through it.\n\n**Read-only**: when the platform license expired more than 30 days ago, every write (`POST`, `PUT`, `PATCH`, `DELETE`) answers 403 `licence_lecture_seule`, except signing in and account security, a user's telephony (forwarding, do not disturb, voicemail messages, mobile devices), loading the license and a few operator maintenance actions (unbanning an address, reloading, re-registering a trunk). Reads stay allowed and telephony is never cut.", "license": {"name": "LicenseRef-Kanadr-Commercial", "identifier": "LicenseRef-Kanadr-Commercial"}, "version": "0.5.0"}, "paths": {"/api/v1/assistant": {"get": {"tags": ["assistant"], "summary": "The assistant for the logged-in account: available, budget reached.", "operationId": "etatAssistant", "responses": {"200": {"description": "Assistant status", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EtatAssistant"}}}}, "403": {"description": "`interdit` (permission `assistant.utiliser`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["assistant"], "summary": "Converses with the assistant: sends the conversation (and the answer to a pending write),\nreceives the updated conversation. Read tools run on their own; a write\nstops pending confirmation.", "operationId": "converserAssistant", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Conversation"}}}, "required": true}, "responses": {"200": {"description": "Updated conversation", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReponseAssistant"}}}}, "403": {"description": "`interdit` (permission `assistant.utiliser`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: assistant not configured by the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`assistant_desactive`: AI assistant turned off by the operator (D94)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`conversation_invalide`: malformed messages, or pending write without confirmation", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "502": {"description": "`assistant_injoignable`: Claude unreachable or returned an error", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/cles-api/{id}": {"delete": {"tags": ["cles-api"], "summary": "Revokes an API key, permanently.", "operationId": "revoquerCleApi", "parameters": [{"name": "id", "in": "path", "description": "Key", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Key revoked"}, "403": {"description": "`interdit`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}": {"get": {"tags": ["clients"], "summary": "A customer.", "operationId": "lireClient", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Client"}}}}, "403": {"description": "`interdit` (permission `client.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["clients"], "summary": "Terminates a customer: extensions, voicemail, SIP connectors, call flow, phonebook and SIP\ndomain deleted, with their files (announcements, messages, recordings, music);\naccounts, API keys and webhook deleted. Permanent. The organization remains (disabled,\ndated) for the audit log and CDRs of past months. Refused while the customer has\nnumbers (remove them: they return to the inventory) or a trunk (delete it). Restricted to the\nparent level.", "operationId": "resilierClient", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Customer terminated"}, "403": {"description": "`interdit`: permission `client.modifier`, or the customer's own account", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`client_avec_numeros` (remove numbers first), `client_avec_trunk` (delete trunk first)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "patch": {"tags": ["clients"], "summary": "Renames, suspends or reactivates a customer, sets its call recording (D111) or\nwhether its admin can add users and extensions (D121).\nSuspended: its accounts can no longer sign in (sessions closed), its API keys no longer\nwork, its phones no longer register and its numbers no longer ring (SIP domain\nout of service), it no longer counts towards the license (D71). Everything stays in place for\nreactivation. Reserved to the level above (operator, the customer's reseller).", "operationId": "modifierClient", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ModificationClient"}}}, "required": true}, "responses": {"204": {"description": "Customer updated"}, "403": {"description": "`interdit`: permission `client.modifier`, or the customer's own account; `licence_bloquee`: reactivation refused, license expired more than 30 days ago (D78)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`numero_deja_route`: the rewritten call flow (recording changed) routes a number already routed elsewhere", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`nom_invalide`, `texte_interdit`, `parcours_invalide` (the published call flow cannot be rewritten)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/annonces": {"get": {"tags": ["parcours"], "summary": "Announcements uploaded for the modules of the published call flow and the draft.", "operationId": "listerAnnonces", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Uploaded announcements", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/AnnonceDeposee"}}}}}, "403": {"description": "`interdit` (permission `parcours.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/annonces/{nature}/{cible}": {"get": {"tags": ["parcours"], "summary": "Playback of an announcement: the WAV as the telephony engine plays it.", "operationId": "ecouterAnnonce", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "nature", "in": "path", "description": "Announcement kind", "required": true, "schema": {"$ref": "#/components/schemas/Nature"}}, {"name": "cible", "in": "path", "description": "Module internal number, or E.164 of the number", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "WAV mono 16-bit 8 kHz", "content": {"audio/wav": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}}, "403": {"description": "`interdit` (permission `parcours.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or announcement", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`annonce_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["parcours"], "summary": "Uploads an announcement: the file (WAV, MP3, AAC/M4A, Ogg Vorbis, FLAC; 20 MB, 10 minutes at\nmost) is converted to 16-bit 8 kHz mono WAV and replaces any announcement in place. The\npublished version of the call flow is rewritten to reference it (without a new version).", "operationId": "deposerAnnonce", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "nature", "in": "path", "description": "Announcement kind", "required": true, "schema": {"$ref": "#/components/schemas/Nature"}}, {"name": "cible", "in": "path", "description": "Module internal number, or E.164 of the number", "required": true, "schema": {"type": "string"}}, {"name": "format", "in": "query", "description": "Extension of the original file (`mp3`, `m4a`…): helps identify the format.", "required": false, "schema": {"type": ["string", "null"]}}], "requestBody": {"description": "Audio file", "content": {"application/octet-stream": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}, "required": true}, "responses": {"200": {"description": "Announcement in place", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AnnonceDeposee"}}}}, "403": {"description": "`interdit` (permission `parcours.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`numero_deja_route`: the rewritten call flow routes a number already routed elsewhere", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "413": {"description": "`annonce_trop_grosse`: over 20 MB", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`annonce_invalide`, `audio_illisible` (unrecognized format), `audio_vide`, `audio_trop_long` (over 10 minutes), `numero_inconnu` (not one of the customer's numbers), `parcours_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["parcours"], "summary": "Removes an announcement; the published call flow version stops referencing it.", "operationId": "retirerAnnonce", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "nature", "in": "path", "description": "Announcement kind", "required": true, "schema": {"$ref": "#/components/schemas/Nature"}}, {"name": "cible", "in": "path", "description": "Module internal number, or E.164 of the number", "required": true, "schema": {"type": "string"}}], "responses": {"204": {"description": "Announcement removed"}, "403": {"description": "`interdit` (permission `parcours.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or announcement", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`numero_deja_route`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`annonce_invalide`, `parcours_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appareils": {"get": {"tags": ["materiel"], "summary": "Desk phones of the customer; with `poste`, those carrying that extension (open to its\nholder).", "operationId": "listerAppareils", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "query", "description": "Phones of this extension only (open to its holder).", "required": false, "schema": {"type": ["string", "null"]}}], "responses": {"200": {"description": "Devices", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/AppareilMateriel"}}}}}, "403": {"description": "`interdit` (permission `poste.provisionner` on the customer, or holder of the requested extension)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["materiel"], "summary": "Adds a desk phone (or a DECT base) to a customer, with its accounts. A MAC is\nunique on the instance: one belonging to another customer is refused (an account would be grafted onto a\nthird party's phone).", "operationId": "ajouterAppareil", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouvelAppareil"}}}, "required": true}, "responses": {"201": {"description": "Device", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppareilMateriel"}}}}, "403": {"description": "`interdit` (permission `poste.provisionner` on the customer; additional parameters: operator or reseller account; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or profile", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`appareil_mac_utilisee`: MAC already registered (for this customer or another)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`appareil_invalide`: invalid MAC, model, lines, handsets or keys; `parametres_invalides`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appareils/{id}": {"delete": {"tags": ["materiel"], "summary": "Removes a device and all its accounts (for a shared DECT base, all its handsets).", "operationId": "retirerAppareil", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "id", "in": "path", "description": "Device", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Removed"}, "403": {"description": "`interdit` (permission `poste.provisionner` on the customer; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "patch": {"tags": ["materiel"], "summary": "Changes a device: name, serial number, model (from the same profile), keys, additional\nparameters (operator and reseller only).", "operationId": "modifierAppareil", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "id", "in": "path", "description": "Device", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ModificationAppareil"}}}, "required": true}, "responses": {"200": {"description": "Device", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppareilMateriel"}}}}, "403": {"description": "`interdit` (permission `poste.provisionner` on the customer; additional parameters: operator or reseller account; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`appareil_invalide`: model, keys; `parametres_invalides`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appareils/{id}/identifiants": {"post": {"tags": ["provisionnement"], "summary": "Reveals the device's HTTP credentials, to configure it by hand (like D114): to\nwhoever can install the customer's phones, never through the assistant or MCP; each\nreveal is in the audit log, without the password. `POST` and `no-store`.", "operationId": "revelerIdentifiantsAppareil", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "id", "in": "path", "description": "Device", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Credentials", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/IdentifiantsAppareil"}}}}, "403": {"description": "`interdit` (permission `poste.provisionner` on the customer; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appareils/{id}/identifiants/renouveler": {"post": {"tags": ["provisionnement"], "summary": "Renews the device's HTTP password (after losing the phone, for example):\nthe device no longer reads its configuration until it is given the new one.", "operationId": "renouvelerIdentifiantsAppareil", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "id", "in": "path", "description": "Device", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Renewed (the new one is revealed with `revelerIdentifiantsAppareil`)"}, "403": {"description": "`interdit` (permission `poste.provisionner` on the customer; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appareils/{id}/lignes": {"post": {"tags": ["materiel"], "summary": "Adds one more account to a device (one more handset on a shared DECT base).", "operationId": "ajouterLigneAppareil", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "id", "in": "path", "description": "Device", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouvelleLigne"}}}, "required": true}, "responses": {"200": {"description": "Device", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppareilMateriel"}}}}, "403": {"description": "`interdit` (permission `poste.provisionner` on the customer; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`ligne_occupee`: rank or handset already taken", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`appareil_invalide`: invalid rank, handset or extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appareils/{id}/lignes/{rang}": {"delete": {"tags": ["materiel"], "summary": "Removes a single account from a device: the others (handsets of the same base) remain.", "operationId": "retirerLigneAppareil", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "id", "in": "path", "description": "Device", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "rang", "in": "path", "description": "Account rank", "required": true, "schema": {"type": "integer", "format": "int32", "minimum": 0}}], "responses": {"200": {"description": "Device", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppareilMateriel"}}}}, "403": {"description": "`interdit` (permission `poste.provisionner` on the customer; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: device or line", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appareils/{id}/redemarrer": {"post": {"tags": ["materiel"], "summary": "Asks the phone to restart (the profile's restart NOTIFY): operator, reseller,\ncustomer admin; not the extension holder.", "operationId": "redemarrerAppareil", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "id", "in": "path", "description": "Device", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Request sent to the phone"}, "403": {"description": "`interdit` (permission `poste.provisionner` on the customer; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`appareil_non_enregistre`: the phone is not registered", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`appareil_commande_inconnue`: the profile cannot restart its phones; `appareil_invalide`: no extension on the phone", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "503": {"description": "`moteur_injoignable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appareils/{id}/requetes": {"get": {"tags": ["materiel"], "summary": "Last requests received from the device by the file service (diagnosis: file,\nresponse, address, agent).", "operationId": "listerRequetesAppareil", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "id", "in": "path", "description": "Device", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Requests, most recent first", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/RequeteAppareil"}}}}}, "403": {"description": "`interdit` (permission `poste.provisionner` on the customer)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appareils/{id}/resynchroniser": {"post": {"tags": ["materiel"], "summary": "Asks the phone to read its configuration again (the profile's resync NOTIFY). The\nholder of an extension it carries may ask for it.", "operationId": "resynchroniserAppareil", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "id", "in": "path", "description": "Device", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Request sent to the phone"}, "403": {"description": "`interdit` (permission `poste.provisionner` on the customer, or holder of an extension on the phone; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`appareil_non_enregistre`: the phone is not registered (it will read its configuration at its next boot)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`appareil_invalide`: no extension on the phone", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "503": {"description": "`moteur_injoignable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appareils/{id}/rps": {"post": {"tags": ["materiel"], "summary": "Registers (or registers again, after a failure) a device with the RPS: a device of a\nYealink profile, with its serial number.", "operationId": "declarerAppareilRps", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "id", "in": "path", "description": "Device", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Device, with the state of its registration (`rps_etat`, `rps_message`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppareilMateriel"}}}}, "403": {"description": "`interdit` (permission `poste.provisionner` on the customer; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`appareil_invalide`: profile without RPS, or no serial number", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appels": {"get": {"tags": ["journal"], "summary": "The customer's call log.", "operationId": "listerAppels", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "du", "in": "query", "description": "Start of the period (RFC 3339), inclusive.", "required": false, "schema": {"type": ["string", "null"], "format": "date-time"}}, {"name": "au", "in": "query", "description": "End of the period (RFC 3339), exclusive.", "required": false, "schema": {"type": ["string", "null"], "format": "date-time"}}, {"name": "sens", "in": "query", "description": "`entrant`, `sortant` or `interne`.", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "poste", "in": "query", "description": "Calls of an extension; the extension owner sees their own.", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "limite", "in": "query", "description": "Calls per page (100 by default, 500 at most).", "required": false, "schema": {"type": ["integer", "null"], "format": "int64"}}, {"name": "avant", "in": "query", "description": "Next page: `suivant` from the previous page.", "required": false, "schema": {"type": ["string", "null"], "format": "date-time"}}, {"name": "numeros", "in": "query", "description": "`complets`: full numbers (permission `journal.voir_numeros`, logged).", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "repondu", "in": "query", "description": "True: answered calls (an inbound call connected to a person, D66); false: missed\ncalls (neither connected nor message) and unanswered outbound calls.", "required": false, "schema": {"type": ["boolean", "null"]}}, {"name": "issue", "in": "query", "description": "Outcome (D66): `repondu`, `manque` or `message` (inbound), `sans_reponse` (outbound or\ninternal call not answered).", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "duree_min", "in": "query", "description": "Minimum duration, in answered seconds.", "required": false, "schema": {"type": ["integer", "null"], "format": "int32"}}, {"name": "mois", "in": "query", "description": "Month `AAAA-MM` in Paris time (fleet export): replaces `du` and `au`, like\nusage.", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "recherche", "in": "query", "description": "Search (100 characters at most): a number, even partial, typed in national form (`06…`),\nwith `00…` or `+33…`, an extension, or a contact's name (extension, shared directory,\nthe account's personal contacts; accent- and case-insensitive). Unavailable on masked\nnumbers.", "required": false, "schema": {"type": ["string", "null"]}}], "responses": {"200": {"description": "Calls, most recent first", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Journal"}}}}, "403": {"description": "`interdit` (permission `journal.lire` on the customer, or on the requested extension for its assigned user; `journal.voir_numeros` for full numbers)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`journal_invalide`: invalid direction, outcome, minimum duration, extension, limit or search (search unavailable on masked numbers)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appels-bloques": {"get": {"tags": ["clients"], "summary": "Customer's blocked inbound calls.", "operationId": "lireAppelsBloques", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Blocks", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppelsBloques"}}}}, "403": {"description": "`interdit` (permission `client.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["clients"], "summary": "Replaces the customer's blocked inbound calls; its inbound routes are rewritten.", "operationId": "reglerAppelsBloques", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppelsBloques"}}}, "required": true}, "responses": {"200": {"description": "Blocks in place", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppelsBloques"}}}}, "403": {"description": "`interdit` (permission `restriction.gerer`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`blocage_invalide`: unreadable number, name too long, more than 500 numbers", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appels-chiffres": {"get": {"tags": ["clients"], "summary": "The customer's encrypted calls.", "operationId": "lireAppelsChiffres", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Setting", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppelsChiffres"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["clients"], "summary": "Turns the customer's encrypted calls on or off.", "operationId": "reglerAppelsChiffres", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppelsChiffres"}}}, "required": true}, "responses": {"200": {"description": "Setting", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppelsChiffres"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appels.csv": {"get": {"tags": ["journal"], "summary": "CSV export of the customer's calls, oldest first.", "operationId": "exporterAppels", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "du", "in": "query", "description": "Start of the period (RFC 3339), inclusive.", "required": false, "schema": {"type": ["string", "null"], "format": "date-time"}}, {"name": "au", "in": "query", "description": "End of the period (RFC 3339), exclusive.", "required": false, "schema": {"type": ["string", "null"], "format": "date-time"}}, {"name": "sens", "in": "query", "description": "`entrant`, `sortant` or `interne`.", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "poste", "in": "query", "description": "Calls of an extension; the extension owner sees their own.", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "limite", "in": "query", "description": "Calls per page (100 by default, 500 at most).", "required": false, "schema": {"type": ["integer", "null"], "format": "int64"}}, {"name": "avant", "in": "query", "description": "Next page: `suivant` from the previous page.", "required": false, "schema": {"type": ["string", "null"], "format": "date-time"}}, {"name": "numeros", "in": "query", "description": "`complets`: full numbers (permission `journal.voir_numeros`, logged).", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "repondu", "in": "query", "description": "True: answered calls (an inbound call connected to a person, D66); false: missed\ncalls (neither connected nor message) and unanswered outbound calls.", "required": false, "schema": {"type": ["boolean", "null"]}}, {"name": "issue", "in": "query", "description": "Outcome (D66): `repondu`, `manque` or `message` (inbound), `sans_reponse` (outbound or\ninternal call not answered).", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "duree_min", "in": "query", "description": "Minimum duration, in answered seconds.", "required": false, "schema": {"type": ["integer", "null"], "format": "int32"}}, {"name": "mois", "in": "query", "description": "Month `AAAA-MM` in Paris time (fleet export): replaces `du` and `au`, like\nusage.", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "recherche", "in": "query", "description": "Search (100 characters at most): a number, even partial, typed in national form (`06…`),\nwith `00…` or `+33…`, an extension, or a contact's name (extension, shared directory,\nthe account's personal contacts; accent- and case-insensitive). Unavailable on masked\nnumbers.", "required": false, "schema": {"type": ["string", "null"]}}], "responses": {"200": {"description": "CSV in the caller's language (French: `;` and decimal comma; English: `,` and decimal point), times in the customer's time zone, amounts excluding tax according to the role", "content": {"text/csv": {"schema": {"type": "string"}}}}, "403": {"description": "`interdit` (permission `journal.lire`, or `journal.voir_numeros` for full numbers)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`journal_invalide`: invalid direction, outcome, minimum duration or search (search unavailable on masked numbers), more than 200,000 calls", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appels/statistiques": {"get": {"tags": ["journal"], "summary": "Statistics of received calls: daily by outcome, and an hour-by-hour map of the week.", "operationId": "statistiquesAppels", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "jours", "in": "query", "description": "Days covered, up to and including today (30 by default, 90 at most).", "required": false, "schema": {"type": ["integer", "null"], "format": "int64"}}], "responses": {"200": {"description": "Statistics for the period", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/StatistiquesClient"}}}}, "403": {"description": "`interdit` (permission `journal.lire` on the client)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`periode_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appels/synthese": {"get": {"tags": ["journal"], "summary": "Call log figures over a period (all calls, not one page).", "operationId": "syntheseAppels", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "du", "in": "query", "description": "Start of the period (RFC 3339), inclusive.", "required": false, "schema": {"type": ["string", "null"], "format": "date-time"}}, {"name": "au", "in": "query", "description": "End of the period (RFC 3339), exclusive.", "required": false, "schema": {"type": ["string", "null"], "format": "date-time"}}, {"name": "poste", "in": "query", "description": "Calls of an extension; the extension owner sees their own.", "required": false, "schema": {"type": ["string", "null"]}}], "responses": {"200": {"description": "Figures for the period", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SyntheseAppels"}}}}, "403": {"description": "`interdit` (permission `journal.lire` on the customer, or on the requested extension for its assigned user)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/appels/{id}/trace": {"get": {"tags": ["diagnostic"], "summary": "Trace of a call from the call log (diagnostics): path through the dialplan, applications, end.", "operationId": "tracerAppel", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "id", "in": "path", "description": "Call", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Trace", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TraceAppel"}}}}, "403": {"description": "`interdit` (permission `diagnostic.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: call", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/boites": {"get": {"tags": ["messagerie"], "summary": "Voicemail mailboxes of the customer's extensions.", "operationId": "listerBoites", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Mailboxes, by extension number", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/BoiteVocale"}}}}}, "403": {"description": "`interdit` (permission `messagerie.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`messagerie_desactivee`: voicemail turned off by the operator (D94)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/boites/{poste}": {"get": {"tags": ["messagerie"], "summary": "A voicemail box.", "operationId": "lireBoite", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "The mailbox", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BoiteVocale"}}}}, "403": {"description": "`interdit` (permission `messagerie.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension; `boite_absente`: extension without a voicemail mailbox", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`messagerie_desactivee`: voicemail turned off by the operator (D94)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["messagerie"], "summary": "Configures a voicemail mailbox.", "operationId": "reglerBoite", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglagesBoite"}}}, "required": true}, "responses": {"200": {"description": "The configured mailbox", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BoiteVocale"}}}}, "403": {"description": "`interdit` (permission `messagerie.regler`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension; `boite_absente`: extension without a voicemail mailbox", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`messagerie_desactivee`: voicemail turned off by the operator (D94)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`boite_invalide`: invalid address, more than 5 addresses, or message not kept without an email attachment", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["messagerie"], "summary": "Creates the voicemail mailbox of an extension that has none.", "description": "Extension reported by `boite_absente` when read. The mailbox is set up like a new\nextension's: enabled, no PIN, message kept, no email and no transcription.", "operationId": "creerBoite", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "responses": {"201": {"description": "The created mailbox", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BoiteVocale"}}}}, "403": {"description": "`interdit` (permission `messagerie.regler`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`messagerie_desactivee`: voicemail turned off by the operator (D94); `boite_existante`: the extension already has its voicemail mailbox", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/boites/{poste}/annonce": {"get": {"tags": ["messagerie"], "summary": "Playback of the mailbox greeting.", "operationId": "ecouterAnnonceBoite", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "WAV mono 16-bit 8 kHz", "content": {"audio/wav": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}}, "403": {"description": "`interdit` (permission `messagerie.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer, extension or announcement; `boite_absente`: extension without a voicemail mailbox", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`messagerie_desactivee`: voicemail turned off by the operator (D94)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["messagerie"], "summary": "Uploads the mailbox greeting (D56): the file (WAV, MP3, AAC/M4A, Ogg Vorbis,\nFLAC; 20 MB, 10 minutes at most) is converted to 16-bit 8 kHz mono WAV. A text read by a\nvoice goes through `POST /synthese`, then this upload.", "operationId": "deposerAnnonceBoite", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}, {"name": "format", "in": "query", "description": "Extension of the original file (`mp3`, `m4a`…): helps identify the format.", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "texte", "in": "query", "description": "Text read by the synthetic voice (`POST /synthese`) that produced the file, kept to edit it\nlater (1500 characters at most); absent: the kept text is forgotten.", "required": false, "schema": {"type": ["string", "null"]}}], "requestBody": {"description": "Audio file", "content": {"application/octet-stream": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}, "required": true}, "responses": {"200": {"description": "Announcement in place", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BoiteVocale"}}}}, "403": {"description": "`interdit` (permission `messagerie.regler`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension; `boite_absente`: extension without a voicemail mailbox", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`messagerie_desactivee`: voicemail turned off by the operator (D94)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "413": {"description": "`annonce_trop_grosse`: over 20 MB", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`audio_illisible` (unrecognized format), `audio_vide`, `audio_trop_long` (over 10 minutes)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["messagerie"], "summary": "Removes the greeting: the default greeting applies again.", "operationId": "retirerAnnonceBoite", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "responses": {"204": {"description": "Announcement removed"}, "403": {"description": "`interdit` (permission `messagerie.regler`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer, extension or announcement; `boite_absente`: extension without a voicemail mailbox", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`messagerie_desactivee`: voicemail turned off by the operator (D94)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/boites/{poste}/messages": {"get": {"tags": ["messagerie"], "summary": "Mailbox messages, most recent first.", "operationId": "listerMessages", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Messages; number masked and no transcription without the `messagerie.ecouter` permission", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/MessageVocal"}}}}}, "403": {"description": "`interdit` (permission `messagerie.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension; `boite_absente`: extension without a voicemail mailbox", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`messagerie_desactivee`: voicemail turned off by the operator (D94)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/boites/{poste}/messages/{message}": {"get": {"tags": ["messagerie"], "summary": "Playback of a message: the file as uploaded.", "operationId": "ecouterMessage", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}, {"name": "message", "in": "path", "description": "Message", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "WAV, or MP3 for a message recorded by the telephony engine", "content": {"audio/wav": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}}, "403": {"description": "`interdit` (permission `messagerie.ecouter`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer, extension, message or file; `boite_absente`: extension without a voicemail mailbox", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`messagerie_desactivee`: voicemail turned off by the operator (D94)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["messagerie"], "summary": "Marks a message as read or new; the phones' indicator light follows.", "operationId": "marquerMessage", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}, {"name": "message", "in": "path", "description": "Message", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/StatutMessage"}}}, "required": true}, "responses": {"204": {"description": "Status changed"}, "403": {"description": "`interdit` (permission `messagerie.ecouter`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer, extension or message; `boite_absente`: extension without a voicemail mailbox", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`messagerie_desactivee`: voicemail turned off by the operator (D94)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["messagerie"], "summary": "Deletes a message (database and file); the phones' message waiting indicator updates accordingly.", "operationId": "supprimerMessage", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}, {"name": "message", "in": "path", "description": "Message", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Message deleted"}, "403": {"description": "`interdit` (permission `messagerie.ecouter`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer, extension or message; `boite_absente`: extension without a voicemail mailbox", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`messagerie_desactivee`: voicemail turned off by the operator (D94)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/budget": {"get": {"tags": ["journal"], "summary": "Monthly budget of a customer: amount, this month's usage at the customer's selling price and\ncurrent restriction (D116).", "operationId": "lireBudget", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Customer's budget", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BudgetClient"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["journal"], "summary": "Sets the monthly budget of a customer: amount (absent: no budget) and blocking at the\nthreshold. Starts the month afresh: a manual lift is forgotten, and the budget is evaluated at\nonce (a budget lowered below the usage restricts, if it blocks).", "operationId": "reglerBudget", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageBudget"}}}, "required": true}, "responses": {"200": {"description": "Customer's budget", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BudgetClient"}}}}, "403": {"description": "`interdit` (permission `client.modifier`: customer admin, operator, the customer's reseller)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`budget_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/budget/levee": {"post": {"tags": ["journal"], "summary": "Lifts the restriction set by the budget until the end of the month (customer admin, operator,\nthe customer's reseller). The anti-fraud cap (D106) is not affected.", "operationId": "leverBudget", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Customer's budget", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/BudgetClient"}}}}, "403": {"description": "`interdit` (permission `client.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`pas_de_limitation`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/capture": {"get": {"tags": ["diagnostic"], "summary": "Live capture of a customer's logs and SIP trace, as `text/event-stream`:\n`ligne` events (JSON: `sip` or `journal` type, level, text), then `fin`. Five\nminutes at most; closing the connection stops the capture. Logged.", "operationId": "capturerClient", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "duree", "in": "query", "description": "Duration in seconds (300 at most, and by default).", "required": false, "schema": {"type": ["integer", "null"], "format": "int64", "minimum": 0}}], "responses": {"200": {"description": "Event stream (`ligne`, `fin`)", "content": {"text/event-stream": {"schema": {"$ref": "#/components/schemas/LigneCapturee"}}}}, "403": {"description": "`interdit` (permission `diagnostic.agir`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/capture/pcap": {"post": {"tags": ["diagnostic"], "summary": "pcap file (Wireshark) of the SIP messages of a capture: IP, UDP and TCP headers\nrebuilt around each message. Nothing is kept on the server.", "operationId": "exporterCapturePcap", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DemandePcap"}}}, "required": true}, "responses": {"200": {"description": "pcap file", "content": {"application/vnd.tcpdump.pcap": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}}, "403": {"description": "`interdit` (permission `diagnostic.agir`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "413": {"description": "`capture_trop_grosse`: more than 64 MB of messages", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`capture_invalide`: unreadable messages or addresses", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/enregistrements": {"get": {"tags": ["enregistrements"], "summary": "Customer's call recordings, most recent first.", "operationId": "listerEnregistrements", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "du", "in": "query", "description": "Start of the period (RFC 3339), inclusive.", "required": false, "schema": {"type": ["string", "null"], "format": "date-time"}}, {"name": "au", "in": "query", "description": "End of the period (RFC 3339), exclusive.", "required": false, "schema": {"type": ["string", "null"], "format": "date-time"}}, {"name": "poste", "in": "query", "description": "Recordings of an extension; the extension owner sees their own.", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "q", "in": "query", "description": "Number searched among caller and callee (digits, as in production).", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "limite", "in": "query", "description": "At most (100 by default, 500 at most).", "required": false, "schema": {"type": ["integer", "null"], "format": "int64"}}, {"name": "ids", "in": "query", "description": "Export: selected identifiers (comma-separated), instead of the filters.", "required": false, "schema": {"type": ["string", "null"]}}], "responses": {"200": {"description": "Recordings", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/EnregistrementAppel"}}}}}, "403": {"description": "`interdit` (permission `enregistrement.ecouter` on the customer, or on the requested extension for its assigned user), `enregistrement_non_autorise` (option turned off for this customer, D111)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`enregistrement_invalide`: invalid limit", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/enregistrements.zip": {"get": {"tags": ["enregistrements"], "summary": "ZIP export of the selected or filtered recordings (customer admin): one folder per extension,\ncustomer time in file names, 500 files and 1.5 GiB at most (production). Streamed,\nsize announced in advance.", "operationId": "exporterEnregistrements", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "du", "in": "query", "description": "Start of the period (RFC 3339), inclusive.", "required": false, "schema": {"type": ["string", "null"], "format": "date-time"}}, {"name": "au", "in": "query", "description": "End of the period (RFC 3339), exclusive.", "required": false, "schema": {"type": ["string", "null"], "format": "date-time"}}, {"name": "poste", "in": "query", "description": "Recordings of an extension; the extension owner sees their own.", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "q", "in": "query", "description": "Number searched among caller and callee (digits, as in production).", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "limite", "in": "query", "description": "At most (100 by default, 500 at most).", "required": false, "schema": {"type": ["integer", "null"], "format": "int64"}}, {"name": "ids", "in": "query", "description": "Export: selected identifiers (comma-separated), instead of the filters.", "required": false, "schema": {"type": ["string", "null"]}}], "responses": {"200": {"description": "ZIP archive (stored)", "content": {"application/zip": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}}, "403": {"description": "`interdit` (permission `enregistrement.ecouter` on the whole customer), `enregistrement_non_autorise` (option turned off for this customer, D111)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "413": {"description": "`archive_trop_grosse`: over 500 files or 1.5 GiB", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/enregistrements/{id}": {"get": {"tags": ["enregistrements"], "summary": "Playback of a recording, by ranges (`Range`) to seek within the audio.", "operationId": "ecouterEnregistrement", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "id", "in": "path", "description": "Call", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "telecharger", "in": "query", "description": "True: as an attachment (download), otherwise displayed in the browser.", "required": false, "schema": {"type": "boolean"}}], "responses": {"200": {"description": "MP3 or WAV", "content": {"audio/mpeg": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}}, "206": {"description": "Requested range", "content": {"audio/mpeg": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}}, "403": {"description": "`interdit` (permission `enregistrement.ecouter`), `enregistrement_non_autorise` (option turned off for this customer, D111)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: recording or file", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "416": {"description": "`plage_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["enregistrements"], "summary": "Deletes a recording (the file); the call remains in the call log and in billing.\nCustomer admin only.", "operationId": "supprimerEnregistrement", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "id", "in": "path", "description": "Call", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Recording deleted"}, "403": {"description": "`interdit` (permission `enregistrement.ecouter` on the whole customer), `enregistrement_non_autorise` (option turned off for this customer, D111)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/evenements": {"get": {"tags": ["clients"], "summary": "Live changes of a customer, as `text/event-stream`: `changement` events (JSON), one hour at\nmost, then the browser reconnects. The portal then reads the state of extensions or calls again,\nwithout polling the telephony engine.", "operationId": "evenementsDuClient", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Event stream (`changement`)", "content": {"text/event-stream": {"schema": {"$ref": "#/components/schemas/Changement"}}}}, "403": {"description": "`interdit` (permission `poste.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "503": {"description": "`moteur_injoignable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/forfaits": {"get": {"tags": ["grilles"], "summary": "A customer's indicative plan fees (D120): its rate table's and its own, sale to the reseller and\nsale to the customer. The customer itself cannot read them.", "operationId": "lireForfaits", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "The customer's plan fees", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ForfaitsClient"}}}}, "403": {"description": "`interdit` (permission `grille.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/forfaits/{niveau}": {"put": {"tags": ["grilles"], "summary": "Sets a customer's indicative plan fee at one sales level, instead of its rate table's\n(D120); without a plan fee: the rate table's applies again. Sale to the customer: the operator or the\ncustomer's reseller; sale to the reseller: the operator only. Recorded in the audit log.", "operationId": "reglerForfait", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "niveau", "in": "path", "description": "Sales level", "required": true, "schema": {"type": "string", "description": "Sales level of a plan fee.", "enum": ["vente_revendeur", "vente_client"]}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageForfait"}}}, "required": true}, "responses": {"200": {"description": "The customer's plan fees", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ForfaitsClient"}}}}, "403": {"description": "`interdit` (permission `grille.gerer` on the customer, or on the operator for the sale to the reseller)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`forfait_invalide`: amount outside 0 to 100,000 in the instance currency, or sale to the reseller of a direct customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/horaires": {"get": {"tags": ["parcours"], "summary": "Schedules of the published call flow: open or closed now, and until when.", "operationId": "etatHoraires", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Schedules of the published call flow (none without a published call flow)", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/EtatHoraires"}}}}}, "403": {"description": "`interdit` (permission `parcours.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/journal": {"get": {"tags": ["journal"], "summary": "Call log setting of the customer.", "operationId": "lireReglageJournal", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Setting", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageJournal"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["journal"], "summary": "Configures the customer's call log: masking of external numbers (D60).", "operationId": "reglerJournal", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageJournal"}}}, "required": true}, "responses": {"200": {"description": "Setting", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageJournal"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/materiel/modeles": {"get": {"tags": ["materiel"], "summary": "Models that can be added to the customer's extensions, by profile (shipped, then the\noperator's copies).", "operationId": "listerModelesMateriel", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Models", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/ModeleDisponible"}}}}}, "403": {"description": "`interdit` (permission `poste.provisionner` on the customer)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/materiel/parametres": {"get": {"tags": ["materiel"], "summary": "Additional parameters of the customer's phones, stacked between those of the profile and those of\nthe device.", "operationId": "lireParametresMaterielClient", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Parameters", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ParametresMateriel"}}}}, "403": {"description": "`interdit` (permission `poste.provisionner` on the customer)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["materiel"], "summary": "Replaces the customer's additional parameters (operator and reseller only).", "operationId": "reglerParametresMaterielClient", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ParametresMateriel"}}}, "required": true}, "responses": {"200": {"description": "Parameters", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ParametresMateriel"}}}}, "403": {"description": "`interdit` (permission `poste.provisionner` on the customer, and operator or reseller account; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`parametres_invalides`: unreadable line (the detail gives its number)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/musique-attente": {"get": {"tags": ["parcours"], "summary": "Playback of the customer's music on hold.", "operationId": "ecouterMusiqueAttente", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "WAV mono 16-bit 8 kHz", "content": {"audio/wav": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}}, "403": {"description": "`interdit` (permission `parcours.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: no custom music (the default one is played)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["parcours"], "summary": "Uploads the customer's music on hold: the file (WAV, MP3, AAC/M4A, Ogg Vorbis, FLAC;\n20 MB, 10 minutes at most) is converted to 16-bit 8 kHz mono WAV and played in a loop, from\nthe start, on every hold on its extensions.", "operationId": "deposerMusiqueAttente", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "format", "in": "query", "description": "Extension of the original file (`mp3`, `m4a`…): helps identify the format.", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "texte", "in": "query", "description": "Text read by the synthetic voice (`POST /synthese`) that produced the file, kept to edit it\nlater (1500 characters at most); absent: the kept text is forgotten.", "required": false, "schema": {"type": ["string", "null"]}}], "requestBody": {"description": "Audio file", "content": {"application/octet-stream": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}, "required": true}, "responses": {"204": {"description": "Music in place on all extensions"}, "403": {"description": "`interdit` (permission `parcours.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "413": {"description": "`annonce_trop_grosse`: over 20 MB", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`audio_illisible` (unrecognized format), `audio_vide`, `audio_trop_long` (over 10 minutes)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["parcours"], "summary": "Removes the customer's hold music: the generic music applies again.", "operationId": "retirerMusiqueAttente", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Music removed"}, "403": {"description": "`interdit` (permission `parcours.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/numeros": {"get": {"tags": ["numeros"], "summary": "A customer's numbers.", "operationId": "listerNumerosClient", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "The customer's numbers", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Numero"}}}}}, "403": {"description": "`interdit` (permission `numero.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["numeros"], "summary": "Assigns a free number from the inventory to a customer. A reserved number only goes to a customer of the\nreseller; a reseller only assigns its reserved numbers (D40).", "operationId": "affecterNumero", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Affectation"}}}, "required": true}, "responses": {"200": {"description": "Number assigned", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Numero"}}}}, "403": {"description": "`interdit` (permission `numero.affecter`, or number not reserved for the reseller)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`numero_indisponible`: not available", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`reservation_autre_revendeur`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/numeros/{numero_id}": {"delete": {"tags": ["numeros"], "summary": "Removes a number from a customer: it becomes free again in the inventory, with its reservation, leaves\nthe call flow (new published version) and is no longer routed.", "operationId": "retirerNumero", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "numero_id", "in": "path", "description": "Number", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Number returned to stock", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Numero"}}}}, "403": {"description": "`interdit` (permission `numero.affecter`, or number not reserved for the reseller)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a number of this customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`numero_deja_route`: one of the customer's numbers is routed in another domain", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`parcours_invalide`: the published call flow can no longer be published", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/numeros/{numero_id}/destination": {"put": {"tags": ["numeros"], "summary": "Sets the destination of a customer number: one of its extensions, or none. Call flow\nshortcut: publishes a new version (the draft based on the served version receives\nthe same change), and the inbound route is rewritten immediately.", "operationId": "routerNumero", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "numero_id", "in": "path", "description": "Number", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Destination"}}}, "required": true}, "responses": {"200": {"description": "Number routed", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Numero"}}}}, "403": {"description": "`interdit` (permission `numero.router`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a number of this customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`numero_deja_route`: one of the customer's numbers is routed in another domain", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`poste_inconnu`; `parcours_invalide`: the published call flow can no longer be published", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/parcours": {"get": {"tags": ["parcours"], "summary": "The customer's call flow: served version, and draft with its validation.", "operationId": "lireParcours", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Published version and draft", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EtatParcours"}}}}, "403": {"description": "`interdit` (permission `parcours.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/parcours/brouillon": {"put": {"tags": ["parcours"], "summary": "Saves the customer's draft (it replaces the previous one).", "operationId": "enregistrerBrouillon", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauBrouillon"}}}, "required": true}, "responses": {"200": {"description": "Draft saved, with its validation", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Brouillon"}}}}, "403": {"description": "`interdit` (permission `parcours.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer, or unknown base version", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["parcours"], "summary": "Discards the customer's draft.", "operationId": "abandonnerBrouillon", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Draft discarded"}, "403": {"description": "`interdit` (permission `parcours.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or draft", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/parcours/connecteurs-sip/{ext}/mot-de-passe": {"put": {"tags": ["parcours"], "summary": "Saves the password of the SIP connector with internal number `ext`, encrypted (D27), outside the\ncall flow. If the published version contains this connector, its gateway is updated right\naway (stop then reload), without a new version: a connector left out for lack of a\npassword goes into service. Logged, without the password.", "operationId": "definirMotDePasseConnecteurSip", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "ext", "in": "path", "description": "Connector internal number", "required": true, "schema": {"type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/MotDePasseConnecteur"}}}, "required": true}, "responses": {"204": {"description": "Password saved"}, "403": {"description": "`interdit` (permission `parcours.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`numero_deja_route`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`ext_invalide`; `mot_de_passe_invalide`: 1 to 128 printable ASCII characters, no spaces or `\"'<>&\\`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/parcours/disposition": {"get": {"tags": ["parcours"], "summary": "Layout of the customer's call flow diagram.", "operationId": "lireDisposition", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Manually placed modules (empty: everything is automatic)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Disposition"}}}}, "403": {"description": "`interdit` (permission `parcours.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["parcours"], "summary": "Replaces the diagram layout (empty: everything becomes automatic again, \"Rearrange\").", "operationId": "enregistrerDisposition", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Disposition"}}}, "required": true}, "responses": {"200": {"description": "Layout saved", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Disposition"}}}}, "403": {"description": "`interdit` (permission `parcours.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`disposition_invalide`: more than 500 modules, identifier or coordinate out of bounds", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/parcours/publication": {"post": {"tags": ["parcours"], "summary": "Publishes the customer's draft: it becomes the served version and is removed. Modules\nrejected by validation keep what was served.", "operationId": "publierParcours", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DemandePublication"}}}, "required": true}, "responses": {"201": {"description": "New served version", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Publication"}}}}, "403": {"description": "`interdit` (permission `parcours.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or draft", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`parcours_modifie`: a version was published since the draft was started; `numero_deja_route`: a number is routed in another domain", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`parcours_invalide`: error that blocks any publication (duplicate identifier, link to an unknown module)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/parcours/rejouer": {"post": {"tags": ["diagnostic"], "summary": "Replays the publication of a customer's call flow: its latest version is rewritten to\nthe telephony engine, without a new version; audited.", "operationId": "rejouerParcours", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Call flow rewritten (nothing without a published version)"}, "403": {"description": "`interdit` (permission `diagnostic.agir`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`numero_deja_route`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/parcours/verification": {"post": {"tags": ["parcours"], "summary": "Checks a call flow without saving it: validation against the customer's extensions and numbers, and\nchanges compared to the published version.", "operationId": "verifierParcours", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Parcours"}}}, "required": true}, "responses": {"200": {"description": "Validation and changes", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Verification"}}}}, "403": {"description": "`interdit` (permission `parcours.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/parcours/versions": {"get": {"tags": ["parcours"], "summary": "The customer's published versions, from newest to oldest.", "operationId": "listerVersionsParcours", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Versions, without their content", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/ResumeVersion"}}}}}, "403": {"description": "`interdit` (permission `parcours.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/parcours/versions/{version}": {"get": {"tags": ["parcours"], "summary": "A published version, with its content.", "operationId": "lireVersionParcours", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "version", "in": "path", "description": "Version number", "required": true, "schema": {"type": "integer", "format": "int32"}}], "responses": {"200": {"description": "The version", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/VersionParcours"}}}}, "403": {"description": "`interdit` (permission `parcours.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: version", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/parcours/versions/{version}/restauration": {"post": {"tags": ["parcours"], "summary": "Restores a published version into the draft (it replaces the current draft), to be\npublished afterward.", "operationId": "restaurerVersionParcours", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "version", "in": "path", "description": "Version number", "required": true, "schema": {"type": "integer", "format": "int32"}}], "responses": {"200": {"description": "Draft restored from the version", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Brouillon"}}}}, "403": {"description": "`interdit` (permission `parcours.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or version", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/plafond": {"get": {"tags": ["trunks"], "summary": "A customer's usage cap: thresholds, usage and current restriction.", "operationId": "lirePlafond", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Customer's usage cap", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PlafondClient"}}}}, "403": {"description": "`interdit` (permission `client.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["trunks"], "summary": "Sets a customer's own thresholds (absent: the instance's); operator admin only.", "operationId": "reglerPlafondClient", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SeuilsDuClient"}}}, "required": true}, "responses": {"200": {"description": "Customer's usage cap", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PlafondClient"}}}}, "403": {"description": "`interdit` (operator admin only)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`plafond_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/plafond/levee": {"post": {"tags": ["trunks"], "summary": "Lifts a customer's restriction: at the hourly level, by the customer admin or the operator; at the daily level, by the operator only. The window's count starts again from zero.", "operationId": "leverPlafond", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Customer's usage cap", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PlafondClient"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`; at the daily level, operator admin only)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`pas_de_limitation`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/postes/etat": {"get": {"tags": ["clients"], "summary": "Status of a customer's extensions: currently registered, devices, last registration.", "operationId": "etatDesPostes", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Status of each extension", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/EtatPoste"}}}}}, "403": {"description": "`interdit` (permission `poste.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "503": {"description": "`moteur_injoignable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/postes/{poste}/enregistrement": {"get": {"tags": ["clients"], "summary": "Recording setting of the extension.", "operationId": "lireEnregistrementPoste", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Setting", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Enregistrement"}}}}, "403": {"description": "`interdit` (permission `utilisateur.lire`), `enregistrement_non_autorise` (option turned off for this customer, D111)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["clients"], "summary": "Configures call recording for the extension; the published call flow is rewritten (armed before\na pre-answer).", "operationId": "reglerEnregistrementPoste", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Enregistrement"}}}, "required": true}, "responses": {"200": {"description": "Setting", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Enregistrement"}}}}, "403": {"description": "`interdit` (permission `utilisateur.modifier`), `enregistrement_non_autorise` (option turned off for this customer, D111)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`numero_deja_route`: the rewritten call flow routes a number already routed elsewhere", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`parcours_invalide`: the published call flow cannot be rewritten", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/postes/{poste}/informations-sip": {"get": {"tags": ["provisionnement"], "summary": "SIP details of the extension, to configure it by hand (username, server and domain, outbound\nproxy when needed, ports); the password is requested with `revelerMotDePasseSip`.", "operationId": "lireInformationsSip", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "SIP details, without the password", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/InformationsSip"}}}}, "403": {"description": "`interdit` (permission `poste.provisionner`, on the customer or for the extension's assigned user)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/postes/{poste}/informations-sip/mot-de-passe": {"post": {"tags": ["provisionnement"], "summary": "Reveals the SIP password of the extension (D114), to configure a phone by hand: to whoever can\ninstall the extension, in person or with an API key, never through the assistant or MCP. Each\nreveal is written to the audit log (without the password). `POST` and `Cache-Control: no-store`\nso that no cache or prefetch keeps it.", "operationId": "revelerMotDePasseSip", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "SIP password of the extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/MotDePasseSip"}}}}, "403": {"description": "`interdit` (permission `poste.provisionner`, on the customer or for the extension holder; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/postes/{poste}/installation": {"post": {"tags": ["provisionnement"], "summary": "Emails the link to the phone setup page (valid for seven days), through\nthe operator's SMTP server. The page picks the app based on the device.", "operationId": "envoyerInstallation", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DemandeInstallation"}}}, "required": true}, "responses": {"200": {"description": "Link sent", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/InstallationEnvoyee"}}}}, "403": {"description": "`interdit` (permission `poste.provisionner`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension, or extension disabled", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`smtp_absent`: no email server configured by the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`courriel_invalide`: invalid address, or no address (extension without an assigned user)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "502": {"description": "`smtp_echec`: the server refused or did not respond (server details)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/postes/{poste}/mobile/acces": {"get": {"tags": ["provisionnement"], "summary": "In-house mobile apps activated on this extension (D117), without their tokens.", "operationId": "listerAccesMobiles", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Current accesses, newest first", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/AccesMobile"}}}}}, "403": {"description": "`interdit` (permission `poste.provisionner`, on the customer or for the extension's assigned user)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/postes/{poste}/mobile/acces/{id}": {"delete": {"tags": ["provisionnement"], "summary": "Revokes an in-house mobile app activated on this extension (D117): its device token stops\nworking and its push registration is forgotten.", "operationId": "revoquerAccesMobile", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}, {"name": "id", "in": "path", "description": "Access", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Access revoked"}, "403": {"description": "`interdit` (permission `poste.provisionner`, on the customer or for the extension's assigned user)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer, extension or access", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/postes/{poste}/mobile/installation": {"post": {"tags": ["provisionnement"], "summary": "Setup QR code of the in-house mobile app on this extension (D117): a signed link, valid\nfor one day, that the app exchanges only once for a device token on behalf of the\nextension's owner. For whoever can set up the extension (`poste.provisionner`).", "operationId": "installerAppliMobile", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Setup link (response never cached)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/InstallationMobile"}}}}, "403": {"description": "`interdit` (permission `poste.provisionner`, on the customer or for the extension's assigned user)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension, or extension disabled", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`appli_mobile_desactivee`, or `sans_titulaire`: the extension has no owner account", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/postes/{poste}/mobiles": {"get": {"tags": ["provisionnement"], "summary": "Mobile apps registered on an extension (without their push token): to whoever may install the\nextension (`poste.provisionner` permission).", "operationId": "listerMobiles", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Mobile devices of the extension", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/AppareilMobile"}}}}}, "403": {"description": "`interdit` (permission `poste.provisionner`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/postes/{poste}/mobiles/{id}": {"delete": {"tags": ["provisionnement"], "summary": "Removes a mobile app from an extension (lost phone, departing team member): it is no\nlonger woken.", "operationId": "retirerMobile", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}, {"name": "id", "in": "path", "description": "Mobile device", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Device removed"}, "403": {"description": "`interdit` (permission `poste.provisionner`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer, extension or device", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/postes/{poste}/mot-de-passe-sip": {"post": {"tags": ["provisionnement"], "summary": "Renews the extension's SIP password (D41), for instance after a phone is lost: the\ninstalled phones no longer register, and all installation links already issued are\nrevoked (their signature depends on the password). Then set up the extension's phones again\nwith a new link. The password is never returned.", "operationId": "renouvelerMotDePasseSip", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "responses": {"204": {"description": "Password renewed"}, "403": {"description": "`interdit` (permission `poste.provisionner`, on the customer or for the extension's assigned user)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/postes/{poste}/ne-pas-deranger": {"get": {"tags": ["clients"], "summary": "The extension's \"do not disturb\".", "operationId": "lireNePasDeranger", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "State", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/NePasDeranger"}}}}, "403": {"description": "`interdit` (permission `renvoi.lire`, on the customer or for the extension's assigned user)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["clients"], "summary": "Sets the extension's \"do not disturb\", applied from the next call.", "operationId": "reglerNePasDeranger", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NePasDeranger"}}}, "required": true}, "responses": {"200": {"description": "State", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/NePasDeranger"}}}}, "403": {"description": "`interdit` (permission `renvoi.regler`, on the customer or for the extension's assigned user)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/postes/{poste}/numero-presente": {"put": {"tags": ["numeros"], "summary": "Chooses the number an extension presents externally, among the customer's numbers (as in\nproduction).", "operationId": "choisirNumeroPresente", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ChoixNumeroPresente"}}}, "required": true}, "responses": {"200": {"description": "Extension caller ID", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/NumeroPresente"}}}}, "403": {"description": "`interdit` (permission `numero.router`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer, extension or number of this customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/postes/{poste}/provisionnement": {"post": {"tags": ["provisionnement"], "summary": "Setup links for a mobile phone on this extension. They carry the SIP password: show them\nto its holder only.", "operationId": "provisionnerPoste", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Setup links", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LiensPoste"}}}}, "403": {"description": "`interdit` (permission `poste.provisionner`, on the customer or for the extension's assigned user)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension, or extension disabled", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/postes/{poste}/renvois": {"get": {"tags": ["clients"], "summary": "Extension call forwarding.", "operationId": "lireRenvois", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Call forwarding", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RenvoisPoste"}}}}, "403": {"description": "`interdit` (permission `renvoi.lire`, on the customer or for the extension's assigned user)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["clients"], "summary": "Configures the extension's call forwarding, applied to the next call (without publishing the call flow).", "operationId": "reglerRenvois", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RenvoisPoste"}}}, "required": true}, "responses": {"200": {"description": "Call forwarding", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RenvoisPoste"}}}}, "403": {"description": "`interdit` (permission `renvoi.regler`, on the customer or for the extension's assigned user)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`renvoi_invalide`: number that is not a landline or mobile in the customer's country (special number, other country), active forwarding without a number", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/postes/{poste}/restrictions": {"get": {"tags": ["trunks"], "summary": "Call restrictions of an extension: for whoever sees the customer's extensions, and for its holder,\nwho reads them in « My extension » without being able to change them.", "operationId": "lireRestrictionsPoste", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Restrictions of the extension (empty: none)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RestrictionsPoste"}}}}, "403": {"description": "`interdit` (permission `poste.lire`, or holder of the extension)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["trunks"], "summary": "Replaces an extension's restrictions. Emergency numbers always remain reachable (D22).", "operationId": "restreindrePoste", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "poste", "in": "path", "description": "Extension number", "required": true, "schema": {"type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouvellesRestrictions"}}}, "required": true}, "responses": {"200": {"description": "Extension restrictions", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RestrictionsPoste"}}}}, "403": {"description": "`interdit` (permission `restriction.gerer`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`nature_invalide`, `poste_inconnu`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/repertoire": {"get": {"tags": ["repertoire"], "summary": "Customer's shared phonebook, by name.", "operationId": "listerRepertoire", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Contacts", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/ContactRepertoire"}}}}}, "403": {"description": "`interdit` (permission `repertoire.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["repertoire"], "summary": "Adds a contact to the shared directory.", "operationId": "ajouterContact", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SaisieContact"}}}, "required": true}, "responses": {"201": {"description": "Contact added", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ContactRepertoire"}}}}, "403": {"description": "`interdit` (permission `repertoire.gerer`, or a user of the customer in person); `repertoire_ferme`: the customer does not open it to its users", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`contact_invalide`: empty or too long name, non-external number", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/repertoire-ouvert": {"get": {"tags": ["repertoire"], "summary": "Is the customer's shared directory open to its users?", "operationId": "lireRepertoireOuvert", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Setting", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RepertoireOuvert"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["repertoire"], "summary": "Opens or closes the shared directory to the customer's users.", "operationId": "reglerRepertoireOuvert", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/RepertoireOuvert"}}}, "required": true}, "responses": {"200": {"description": "Setting", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RepertoireOuvert"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/repertoire/{id}": {"put": {"tags": ["repertoire"], "summary": "Modifies a contact in the shared directory.", "operationId": "modifierContact", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "id", "in": "path", "description": "Contact", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SaisieContact"}}}, "required": true}, "responses": {"200": {"description": "Contact updated", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ContactRepertoire"}}}}, "403": {"description": "`interdit` (permission `repertoire.gerer`, or the contact's author); `repertoire_ferme`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or contact", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`contact_invalide`: empty or too long name, non-external number", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["repertoire"], "summary": "Removes a contact from the shared phonebook.", "operationId": "supprimerContact", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "id", "in": "path", "description": "Contact", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Contact removed"}, "403": {"description": "`interdit` (permission `repertoire.gerer`, or the contact's author); `repertoire_ferme`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: customer or contact", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/restrictions": {"get": {"tags": ["trunks"], "summary": "Call restrictions for a customer's extensions.", "operationId": "listerRestrictions", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Restricted extensions", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/RestrictionsPoste"}}}}}, "403": {"description": "`interdit` (permission `poste.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/revalorisation": {"post": {"tags": ["grilles"], "summary": "Recalculates the prices of the customer's outgoing calls over the period, from the rate plans in\nforce on the day of each call: preview of the difference, then application.", "operationId": "revaloriserClient", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DemandeRevalorisation"}}}, "required": true}, "responses": {"200": {"description": "Preview, or result if applied", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApercuRevalorisation"}}}}, "403": {"description": "`interdit` (operator admin only)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`revalorisation_invalide`: invalid day, end of period before its start", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/securite": {"get": {"tags": ["clients"], "summary": "A customer's security.", "operationId": "lireSecuriteClient", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Setting", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SecuriteClient"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["clients"], "summary": "Requires (or not) the second factor for the customer's regular users.", "operationId": "reglerSecuriteClient", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SecuriteClient"}}}, "required": true}, "responses": {"200": {"description": "Setting", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SecuriteClient"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/sso": {"get": {"tags": ["reglages"], "summary": "Customer choice for login through the operator's portal.", "operationId": "lireSsoClient", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Setting", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageSsoClient"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["reglages"], "summary": "Sets the customer's choice: whether to create the account of an unknown address on its first\nsign-in through the operator's portal.", "operationId": "reglerSsoClient", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageSsoClient"}}}, "required": true}, "responses": {"200": {"description": "Setting saved", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageSsoClient"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/synthese": {"post": {"tags": ["parcours"], "summary": "Reads a text with the voice chosen by the customer (`…/voix`), otherwise the instance voice set\nby the operator (Piper, or Google with Piper as fallback), and returns the WAV as the phone\nwill play it; nothing is stored. To make it an announcement, upload this WAV\n(`PUT …/annonces/…`).", "operationId": "synthetiser", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Texte"}}}, "required": true}, "responses": {"200": {"description": "WAV mono 16-bit 8 kHz", "content": {"audio/wav": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}}, "403": {"description": "`interdit` (permission `parcours.modifier`, or `messagerie.regler` on the given extension)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`texte_invalide`: empty or over 1500 characters", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "500": {"description": "`synthese_echouee`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "503": {"description": "Reading by Piper (chosen engine, or fallback for Google): `synthese_indisponible` (Piper not installed), `synthese_anglaise_indisponible` (customer set to English, English voice not installed), `synthese_occupee`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/tarifs": {"get": {"tags": ["grilles"], "summary": "Customer rates: their sale rate plan (assigned, otherwise the default one of their reseller or\nof the operator), read-only.", "operationId": "lireTarifs", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Customer rates", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/TarifsClient"}}}}, "403": {"description": "`interdit` (permission `client.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer, or no sale rate plan", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/trunk": {"get": {"tags": ["trunks"], "summary": "A customer's C5 trunk.", "operationId": "lireTrunk", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Trunk, without its password", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Trunk"}}}}, "403": {"description": "`interdit` (permission `trunk.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: no trunk", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["trunks"], "summary": "Creates or replaces a customer's C5 trunk: its gateway, its outbound routes and its\nprovider's networks.", "operationId": "enregistrerTrunk", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauTrunk"}}}, "required": true}, "responses": {"200": {"description": "Trunk, without its password", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Trunk"}}}}, "403": {"description": "`interdit` (permission `trunk.gerer`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`numero_deja_route`: the main number changed and the rewritten call flow routes a number already routed elsewhere", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`profil_inconnu`, `proxy_invalide` (missing or invalid without a profile), `identifiant_invalide`, `mot_de_passe_requis`, `format_invalide` (missing or invalid without a profile), `reseau_invalide`, `ndi_inconnu` (not one of the customer's numbers), `parcours_invalide` (the main number changed and the published call flow can no longer be rewritten)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["trunks"], "summary": "Deletes a customer's trunk: its gateway and its outbound routes. The customer can no\nlonger make external calls.", "operationId": "supprimerTrunk", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Trunk deleted"}, "403": {"description": "`interdit` (permission `trunk.gerer`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: no trunk", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`numero_deja_route`: the call flow, rewritten without a main number, routes a number already routed elsewhere", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`parcours_invalide`: the published call flow, rewritten without a main number, can no longer be rewritten", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/trunk/reenregistrer": {"post": {"tags": ["diagnostic"], "summary": "Forces a customer's trunk to re-register with its provider (`killgw` then\n`rescan`); logged.", "operationId": "reenregistrerTrunk", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Trunk restarted"}, "403": {"description": "`interdit` (permission `diagnostic.agir`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: no trunk", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/utilisateurs": {"get": {"tags": ["clients"], "summary": "A customer's users, with their extension.", "operationId": "listerUtilisateurs", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Users", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/UtilisateurClient"}}}}}, "403": {"description": "`interdit` (permission `utilisateur.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["clients"], "summary": "Creates a user at a customer, with their extension if they have one, and sends them their\ninvitation by email (the operator's SMTP server). The operator and the customer's reseller\ncan always add users; the customer admin only if the operator or the reseller allows it\n(D121: each account counts towards the license and what the operator bills).", "operationId": "creerUtilisateur", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouvelUtilisateur"}}}, "required": true}, "responses": {"201": {"description": "User (and extension) created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UtilisateurClient"}}}}, "403": {"description": "`interdit` (permissions `utilisateur.creer`, `poste.creer`); `ajout_utilisateurs_non_autorise`: customer account while the operator does not let it add users (D121); `licence_bloquee`: license expired more than 30 days ago (D78)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`courriel_pris`, `poste_existant`, `numero_de_module` (internal number of a call flow module)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`nom_invalide`, `courriel_invalide`, `role_invalide`, `poste_invalide`, `poste_numero_urgence`, `telephone_seulement_invalide` (an admin cannot be restricted to the phone)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/voix": {"get": {"tags": ["clients"], "summary": "The customer's announcement voice: its choice, the instance voice and the one that reads.", "operationId": "lireVoixClient", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Customer's voice", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/VoixDuClient"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["clients"], "summary": "Chooses the customer's announcement voice, among the instance's voices for its language, or\nreturns to the instance voice. Announcements already saved do not change: the voice is used for\nthe next texts read.", "operationId": "reglerVoixClient", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouvelleVoixClient"}}}, "required": true}, "responses": {"200": {"description": "Voice saved", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/VoixDuClient"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`voix_indisponible`: voice the instance does not offer; `voix_autre_langue`: voice in another language than the customer's", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/voix/disponibles": {"get": {"tags": ["clients"], "summary": "Voices the customer can choose: the instance's voices for its announcement language, the\ninstance voice first.", "operationId": "listerVoix", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Available voices (empty if the instance has none for this language)", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/VoixSynthese"}}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/clients/{client_id}/voix/essai": {"post": {"tags": ["clients"], "summary": "Has a voice read a short sentence in the customer's language, to listen to it before choosing\nit; nothing is saved. As for an announcement, Piper reads if Google fails.", "operationId": "ecouterVoix", "parameters": [{"name": "client_id", "in": "path", "description": "Customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/EssaiVoixClient"}}}, "required": true}, "responses": {"200": {"description": "WAV mono 16-bit 8 kHz", "content": {"audio/wav": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`voix_indisponible`: voice the instance does not offer; `voix_autre_langue`: voice in another language than the customer's", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "500": {"description": "`synthese_echouee`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "503": {"description": "`synthese_indisponible` (no voice installed), `synthese_anglaise_indisponible` (customer set to English, without an English voice), `synthese_occupee`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/connexion": {"post": {"tags": ["connexion"], "summary": "Opens a session. The token is set in an `HttpOnly`, `Secure`, `SameSite=Strict` cookie.\nA `appareil` cookie valid for this account (trusted device, D53) waives the\nsecond factor: the step is then `connecte`. On a trusted device, the session lasts\nuntil the trust ends (30 days at most, D76).", "operationId": "seConnecter", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Identifiants"}}}, "required": true}, "responses": {"200": {"description": "Password verified; session at the indicated step (cookie `session`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EtatConnexion"}}}}, "401": {"description": "`identifiants_invalides`: unknown, inactive or locked account, or wrong password", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "429": {"description": "`trop_de_requetes`: too many attempts from this address (`Retry-After` header)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/connexion/passkey/debut": {"post": {"tags": ["connexion"], "summary": "Starts passkey login (session awaiting the second factor): options to pass\nto `navigator.credentials.get()`.", "operationId": "commencerConnexionPasskey", "responses": {"200": {"description": "WebAuthn authentication options (`publicKey`)", "content": {"application/json": {"schema": {}}}}, "409": {"description": "`aucune_passkey`, `etape_de_connexion_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/connexion/passkey/fin": {"post": {"tags": ["connexion"], "summary": "Completes passkey sign-in: full session (new cookie). A rejection counts as\na failed sign-in (lockout after 5).", "operationId": "terminerConnexionPasskey", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/FinAuthentification"}}}, "required": true}, "responses": {"200": {"description": "Logged in", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EtatConnexion"}}}}, "400": {"description": "`pas_de_ceremonie`, `passkey_refusee`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "401": {"description": "`passkey_refusee`: signature rejected or account locked", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "429": {"description": "`trop_de_requetes`: too many attempts from this address (`Retry-After` header)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/connexion/second-facteur": {"post": {"tags": ["connexion"], "summary": "Completes sign-in with a TOTP code or a backup code. Five wrong codes lock the\naccount for 15 minutes, like wrong passwords. With `confiance`, this browser is exempt\nfrom the code for 30 days (the password is still required).", "operationId": "validerSecondFacteur", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodeDeConnexion"}}}, "required": true}, "responses": {"200": {"description": "Logged in: new full session (new cookie; with `confiance`, also `appareil`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EtatConnexion"}}}}, "401": {"description": "`code_invalide` or `non_connecte`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`etape_de_connexion_invalide`: the session is not awaiting a second factor", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "429": {"description": "`trop_de_requetes`: too many attempts from this address (`Retry-After` header)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/deconnexion": {"post": {"tags": ["connexion"], "summary": "Closes the current session.", "operationId": "seDeconnecter", "responses": {"204": {"description": "Session closed, cookie cleared"}}}}, "/api/v1/deconnexion/partout": {"post": {"tags": ["connexion"], "summary": "Logs the account out of all its devices: closes all its sessions, including the current one,\nand forgets its trusted devices (password and code asked again everywhere, D76).", "operationId": "seDeconnecterPartout", "responses": {"204": {"description": "Sessions closed, cookies cleared"}, "401": {"description": "`non_connecte`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "403": {"description": "`interdit`: call made with an API key", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/fuseaux": {"get": {"tags": ["reglages"], "summary": "Available time zones (IANA names, sorted).", "operationId": "listerFuseaux", "responses": {"200": {"description": "IANA names", "content": {"application/json": {"schema": {"type": "array", "items": {"type": "string"}}}}}}, "security": [{"session": []}]}}, "/api/v1/grilles/{id}": {"get": {"tags": ["grilles"], "summary": "A rate table and its lines.", "operationId": "lireGrille", "parameters": [{"name": "id", "in": "path", "description": "Rate table", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "The rate table", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GrilleTarifaireDetaillee"}}}}, "403": {"description": "`interdit` (permission `grille.lire` on its owner)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["grilles"], "summary": "Deletes a rate table; CDRs already rated keep their amounts (D13).", "operationId": "supprimerGrille", "parameters": [{"name": "id", "in": "path", "description": "Rate table", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Rate table deleted, along with its assignments"}, "403": {"description": "`interdit` (permission `grille.gerer` on its owner)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/grilles/{id}/defaut": {"put": {"tags": ["grilles"], "summary": "Makes the rate table its owner's default, for its kind.", "operationId": "grilleParDefaut", "parameters": [{"name": "id", "in": "path", "description": "Rate table", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Default rate table", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GrilleTarifaire"}}}}, "403": {"description": "`interdit` (permission `grille.gerer` on its owner)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/grilles/{id}/forfait": {"put": {"tags": ["grilles"], "summary": "Sets the default indicative plan fee of a sales rate table (D120): per user or\nflat, for the margin of customers without their own; without a plan fee: none.", "operationId": "reglerForfaitGrille", "parameters": [{"name": "id", "in": "path", "description": "Rate table", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageForfait"}}}, "required": true}, "responses": {"200": {"description": "The rate table and its plan fee", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GrilleTarifaire"}}}}, "403": {"description": "`interdit` (permission `grille.gerer` on its owner)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`forfait_invalide`: purchase rate table, or amount outside 0 to 100,000 in the instance currency", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/marque": {"get": {"tags": ["exploitation"], "summary": "Operator brand: name, colors, logo. No session required.", "operationId": "lireMarque", "responses": {"200": {"description": "Brand", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Marque"}}}}}}}, "/api/v1/marque/icone": {"get": {"tags": ["exploitation"], "summary": "Square app icon (favicon, installed app): the uploaded one (PNG), otherwise the\noperator's name initial, in white on its color (maskable icon safe zone respected). No\nsession.", "operationId": "lireIcone", "responses": {"200": {"description": "Uploaded PNG, otherwise generated SVG", "content": {"image/svg+xml": {"schema": {"type": "string"}}}}}}}, "/api/v1/marque/logo": {"get": {"tags": ["exploitation"], "summary": "Operator logo. No session required; cached by the browser (the URL changes with\nit).", "operationId": "lireLogo", "responses": {"200": {"description": "PNG, JPEG or WebP", "content": {"image/png": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}}, "404": {"description": "`introuvable`: no logo", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/marque/manifeste": {"get": {"tags": ["exploitation"], "summary": "Installable portal manifest (PWA): operator name and color, icon in its color.\nNo session required.", "operationId": "lireManifeste", "responses": {"200": {"description": "Manifest", "content": {"application/manifest+json": {"schema": {"type": "object"}}}}}}}, "/api/v1/marque/manifeste-telephone": {"get": {"tags": ["exploitation"], "summary": "Manifest of the installable softphone (D107): an application separate from the portal (`id`,\nscope and start `/telephone/`), \"Phone\" under the operator's brand, which opens `tel:` and\n`sip:` links. No session; name in English if the browser prefers it.", "operationId": "lireManifesteTelephone", "responses": {"200": {"description": "Manifest", "content": {"application/manifest+json": {"schema": {"type": "object"}}}}}}}, "/api/v1/materiel/apercu": {"post": {"tags": ["materiel"], "summary": "Files a profile produces for a fictitious device of the chosen model (fictitious data,\npasswords masked); a failing template gives its message and position.", "operationId": "apercuMateriel", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DemandeApercu"}}}, "required": true}, "responses": {"200": {"description": "Preview", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ApercuMateriel"}}}}, "403": {"description": "`interdit` (operator team or reseller admin)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: profile", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`profil_materiel_invalide`: neither profile nor content, or model missing from the profile", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/materiel/profils": {"get": {"tags": ["materiel"], "summary": "Hardware profiles: those Kanadr ships and the operator's copies.", "operationId": "listerProfilsMateriel", "responses": {"200": {"description": "Profiles", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProfilsMateriel"}}}}, "403": {"description": "`interdit` (operator team or reseller admin)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["materiel"], "summary": "Copies a profile (shipped or already copied) to edit it: the copy keeps its original shipped\nprofile and its version.", "operationId": "dupliquerProfilMateriel", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DuplicationProfil"}}}, "required": true}, "responses": {"201": {"description": "Copy", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProfilMateriel"}}}}, "403": {"description": "`interdit` (operator admin; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: copied profile", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`profil_materiel_invalide`: name empty or too long", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/materiel/profils/{reference}": {"get": {"tags": ["materiel"], "summary": "A profile and its content (templates included).", "operationId": "lireProfilMateriel", "parameters": [{"name": "reference", "in": "path", "description": "Identifier of a shipped profile or uuid of a copy", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Profile", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProfilMateriel"}}}}, "403": {"description": "`interdit` (operator team or reseller admin)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["materiel"], "summary": "Saves a new version of a copy (shipped profiles are not edited: they are\ncopied). Templates compiled and parameters checked before writing.", "operationId": "modifierProfilMateriel", "parameters": [{"name": "reference", "in": "path", "description": "Operator's copy", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ModificationProfil"}}}, "required": true}, "responses": {"200": {"description": "Profile", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProfilMateriel"}}}}, "403": {"description": "`interdit` (operator admin; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`profil_materiel_invalide`: name, models, patterns, template that does not compile, unreadable parameters (the detail locates the error)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["materiel"], "summary": "Deletes a copy that no device uses.", "operationId": "supprimerProfilMateriel", "parameters": [{"name": "reference", "in": "path", "description": "Operator's copy", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Deleted"}, "403": {"description": "`interdit` (operator admin; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`profil_materiel_utilise`: devices use it", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/materiel/profils/{reference}/differences": {"get": {"tags": ["materiel"], "summary": "Differences between a copy and the current shipped version of its original profile, template\nby template.", "operationId": "differencesProfilMateriel", "parameters": [{"name": "reference", "in": "path", "description": "Operator's copy", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Differences", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DifferencesProfil"}}}}, "403": {"description": "`interdit` (operator team or reseller admin)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: copy, or original profile no longer shipped", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/materiel/profils/{reference}/versions": {"get": {"tags": ["materiel"], "summary": "History of a copy, most recent first.", "operationId": "listerVersionsProfilMateriel", "parameters": [{"name": "reference", "in": "path", "description": "Operator's copy", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Versions", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/VersionProfil"}}}}}, "403": {"description": "`interdit` (operator team or reseller admin)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/materiel/profils/{reference}/versions/{version}/restaurer": {"post": {"tags": ["materiel"], "summary": "Restores a version from the history: it becomes the next version.", "operationId": "restaurerVersionProfilMateriel", "parameters": [{"name": "reference", "in": "path", "description": "Operator's copy", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "version", "in": "path", "description": "Restored version", "required": true, "schema": {"type": "integer", "format": "int32", "minimum": 0}}], "responses": {"200": {"description": "Profile", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProfilMateriel"}}}}, "403": {"description": "`interdit` (operator admin; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: copy or version", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/materiel/rps": {"get": {"tags": ["materiel"], "summary": "The operator's RPS keys, without the secret.", "operationId": "lireRps", "responses": {"200": {"description": "Keys set", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageRps"}}}}, "403": {"description": "`interdit` (permission `reglages.lire` on the operator)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: no keys set", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["materiel"], "summary": "Saves the operator's RPS keys (YMCS › Integration › API): the secret is encrypted and\nnever returned; when absent, the saved one is kept.", "operationId": "reglerRps", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauReglageRps"}}}, "required": true}, "responses": {"200": {"description": "Keys saved", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageRps"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier` on the operator; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`rps_invalide`: key ID, region, server or secret missing or invalid", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["materiel"], "summary": "Removes the RPS keys (and their secret).", "operationId": "retirerRps", "responses": {"204": {"description": "Removed"}, "403": {"description": "`interdit` (permission `reglages.modifier` on the operator; never through the assistant or MCP)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: no keys set", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/materiel/rps/essai": {"post": {"tags": ["materiel"], "summary": "Tries the keys: YMCS token, then the named RPS server.", "operationId": "essayerRps", "responses": {"204": {"description": "Keys accepted and RPS server found"}, "403": {"description": "`interdit` (permission `reglages.modifier` on the operator)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: no keys set", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "502": {"description": "`rps_echec`: refused by YMCS (its message), or RPS server not found", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/mise-en-route": {"get": {"tags": ["exploitation"], "summary": "Setup state: the wizard's steps and findings. Operator admin.", "operationId": "lireMiseEnRoute", "responses": {"200": {"description": "Setup", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/MiseEnRoute"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/mise-en-route/affichage": {"put": {"tags": ["exploitation"], "summary": "Hides or shows again the setup tile on the operator's home page.", "operationId": "reglerAffichageMiseEnRoute", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AffichageMiseEnRoute"}}}, "required": true}, "responses": {"200": {"description": "Setup", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/MiseEnRoute"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/mise-en-route/certificat": {"get": {"tags": ["exploitation"], "summary": "Certificate served over HTTPS and last Let's Encrypt request. Operator admin.", "operationId": "lireCertificat", "responses": {"200": {"description": "Certificate", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Certificat"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["exploitation"], "summary": "Requests a Let's Encrypt certificate for the instance's host (`KANADR_URL_PUBLIQUE`), and\nonly that host: the system service that runs certbot reads the host from the machine's\nsettings; nothing comes from the request. The result is read on `GET /mise-en-route/certificat`.", "operationId": "demanderCertificat", "responses": {"202": {"description": "Request passed to the certificate service", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Certificat"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`demande_en_cours`: a request is waiting or running", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`hote_non_public`: public address without `https://` or without a domain name", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "503": {"description": "`service_certificat_absent`: state directory not reachable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/mise-en-route/domaines": {"get": {"tags": ["exploitation"], "summary": "What the DNS gives for the instance's host name, and for a name under the customer\ndomain suffix (wildcard record). Operator admin.", "operationId": "verifierDomainesMiseEnRoute", "responses": {"200": {"description": "Host name resolution", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Domaines"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/mise-en-route/etapes/{etape}": {"put": {"tags": ["exploitation"], "summary": "Sets the state of a step: done, skipped or to do again.", "operationId": "reglerEtapeMiseEnRoute", "parameters": [{"name": "etape", "in": "path", "description": "Step (`langue`, `identite`, `domaines`…)", "required": true, "schema": {"type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageEtape"}}}, "required": true}, "responses": {"200": {"description": "Setup", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/MiseEnRoute"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: unknown step", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`etat_etape_invalide`: unknown state (neither to do, done nor skipped)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/mise-en-route/premier-acces": {"post": {"tags": ["exploitation"], "summary": "First access: creates the operator and its first administrator, like `kanadr initialiser`.\nThe link works only once. No session.", "operationId": "premierAcces", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/PremierAcces"}}}, "required": true}, "responses": {"201": {"description": "Operator created; the administrator's invitation link", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PremierAccesFait"}}}}, "404": {"description": "`introuvable`: unknown, expired or already used link", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`nom_invalide`, `courriel_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/mise-en-route/premier-acces/verification": {"post": {"tags": ["exploitation"], "summary": "Is the first access link valid? No session; 404 otherwise, like any unknown\naddress.", "operationId": "verifierPremierAcces", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/JetonMiseEnRoute"}}}, "required": true}, "responses": {"204": {"description": "Valid link: the instance is waiting for its operator"}, "404": {"description": "`introuvable`: unknown, expired or already used link", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/mobile/activation": {"post": {"tags": ["provisionnement"], "summary": "Activation of the in-house mobile app (D117), without a session: the QR code token, valid\nand never used, for a device token on behalf of the extension's owner. The SIP\nconfiguration is then read with this token (`GET /moi/telephone`).", "operationId": "activerAppliMobile", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DemandeActivation"}}}, "required": true}, "responses": {"200": {"description": "Device token (response never cached)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ActivationMobile"}}}}, "404": {"description": "`introuvable`: link invalid, expired, or revoked by a new SIP password", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`lien_deja_utilise`, `appli_mobile_desactivee` or `sans_titulaire`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`acces_mobile_invalide`: invalid identifier or name", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/moi": {"get": {"tags": ["connexion"], "summary": "Account of the current session.", "operationId": "moi", "responses": {"200": {"description": "Logged-in account", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Moi"}}}}, "401": {"description": "`non_connecte`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/moi/accueil/{espace}": {"get": {"tags": ["compte"], "summary": "Home page layout of the signed-in account, in a space.", "operationId": "lireDispositionAccueil", "parameters": [{"name": "espace", "in": "path", "description": "`operateur` or `client`", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Layout", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DispositionAccueil"}}}}, "403": {"description": "`interdit`: call made with an API key", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: unknown space", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["compte"], "summary": "Sets the home page layout of the logged-in account; `instances` absent: back to the\ndefault layout. Audited.", "operationId": "reglerDispositionAccueil", "parameters": [{"name": "espace", "in": "path", "description": "`operateur` or `client`", "required": true, "schema": {"type": "string"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DispositionAccueil"}}}, "required": true}, "responses": {"200": {"description": "Layout saved", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DispositionAccueil"}}}}, "403": {"description": "`interdit`: call made with an API key", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: unknown space", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`accueil_invalide`: malformed identifier, duplicate instance, or more than 30 modules", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/moi/applications": {"get": {"tags": ["oauth"], "summary": "Applications authorized by the signed-in account (OAuth, MCP server), still in force.", "operationId": "listerApplicationsAutorisees", "responses": {"200": {"description": "Authorized applications, most recent first", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/ApplicationAutorisee"}}}}}, "403": {"description": "`interdit`: call by API key, authorized application, assistant or MCP", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/moi/applications/{id}": {"delete": {"tags": ["oauth"], "summary": "Removes an application's access: its tokens stop working at once.", "operationId": "revoquerApplicationAutorisee", "parameters": [{"name": "id", "in": "path", "description": "Authorization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Access removed"}, "403": {"description": "`interdit`: call by API key, authorized application, assistant or MCP", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: unknown authorization, another account's, or already revoked", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/moi/contacts": {"get": {"tags": ["connexion"], "summary": "Personal contacts of the signed-in account, by name.", "operationId": "listerMesContacts", "responses": {"200": {"description": "Personal contacts", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/ContactPersonnel"}}}}}, "401": {"description": "`non_connecte`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "403": {"description": "`interdit`: API key, authorized application, assistant or MCP", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["connexion"], "summary": "Adds a personal contact.", "operationId": "ajouterMonContact", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SaisieContactPersonnel"}}}, "required": true}, "responses": {"201": {"description": "Contact added", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ContactPersonnel"}}}}, "403": {"description": "`interdit`: API key, authorized application, assistant or MCP", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`trop_de_contacts`: 500 at most", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`contact_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/moi/contacts/{id}": {"put": {"tags": ["connexion"], "summary": "Changes a personal contact.", "operationId": "modifierMonContact", "parameters": [{"name": "id", "in": "path", "description": "Contact", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SaisieContactPersonnel"}}}, "required": true}, "responses": {"200": {"description": "Contact updated", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ContactPersonnel"}}}}, "403": {"description": "`interdit`: API key, authorized application, assistant or MCP", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`contact_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["connexion"], "summary": "Deletes a personal contact, and its favourite.", "operationId": "supprimerMonContact", "parameters": [{"name": "id", "in": "path", "description": "Contact", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Contact deleted"}, "403": {"description": "`interdit`: API key, authorized application, assistant or MCP", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/moi/favoris": {"get": {"tags": ["connexion"], "summary": "Favourites of the signed-in account, in order.", "operationId": "listerMesFavoris", "responses": {"200": {"description": "Favourites", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Favori"}}}}}, "403": {"description": "`interdit`: API key, authorized application, assistant or MCP", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["connexion"], "summary": "Replaces the signed-in account's favourites (ordered list, 30 at most, no duplicates); a\npersonal favourite points to one of its personal contacts.", "operationId": "remplacerMesFavoris", "requestBody": {"content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Favori"}}}}, "required": true}, "responses": {"200": {"description": "Favourites saved", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Favori"}}}}}, "403": {"description": "`interdit`: API key, authorized application, assistant or MCP", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`favori_invalide`: more than 30, duplicate, empty reference or unknown personal contact", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/moi/langue": {"put": {"tags": ["compte"], "summary": "Sets the language of the signed-in account (portal, emails sent to it); if missing, that\nof its organization. Audited.", "operationId": "reglerLangueDuCompte", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/LangueDuCompte"}}}, "required": true}, "responses": {"200": {"description": "Account language", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LangueDuCompte"}}}}, "403": {"description": "`interdit`: call made with an API key", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`langue_invalide`: neither French nor English", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/moi/telephone": {"get": {"tags": ["connexion"], "summary": "SIP credentials of the logged-in account's extension, for the softphone (D107): to its\nholder only, logged in in person (no API key, authorized application, assistant or\nMCP), never to an admin on behalf of someone else. Read is logged, without the password.", "operationId": "lireMonTelephone", "responses": {"200": {"description": "Extension credentials and ICE servers (response never cached)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/MonTelephone"}}}}, "401": {"description": "`non_connecte`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "403": {"description": "`interdit`: API key, authorized application, assistant or MCP", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`sans_poste`: the account has no extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/moi/telephone/contacts": {"get": {"tags": ["connexion"], "summary": "Softphone contacts: the other in-service extensions of the account's customer, then its\nshared directory.", "operationId": "contactsDeMonTelephone", "responses": {"200": {"description": "Contacts", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/ContactTelephone"}}}}}, "401": {"description": "`non_connecte`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "403": {"description": "`interdit`: API key, authorized application, assistant or MCP", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`sans_poste`: the account has no extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/moi/telephone/mobile": {"post": {"tags": ["connexion"], "summary": "Registers the signed-in account's mobile app on its extension (D117), or refreshes its push\ntoken. For the extension holder, in person. A new registration sets up waking for the\nextension.", "operationId": "inscrireMobile", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/InscriptionMobile"}}}, "required": true}, "responses": {"200": {"description": "Device registered", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AppareilMobile"}}}}, "401": {"description": "`non_connecte`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "403": {"description": "`interdit`: API key, authorized application, assistant or MCP", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`sans_poste`: the account has no extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`mobile_non_disponible`: push gateway not set", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`appareil_mobile_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/moi/telephone/mobile/acces": {"delete": {"tags": ["connexion"], "summary": "Sign-out of the in-house mobile app (D117): it revokes its own device token and forgets\nits push registration. With a device token only.", "operationId": "deconnecterAppliMobile", "responses": {"204": {"description": "Token revoked"}, "401": {"description": "`non_connecte`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: call without a device token", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/moi/telephone/mobile/{identifiant}": {"delete": {"tags": ["connexion"], "summary": "Removes the signed-in account's mobile app (sign-out from the app): it is no longer\nwoken.", "operationId": "retirerMonMobile", "parameters": [{"name": "identifiant", "in": "path", "description": "Installation identifier", "required": true, "schema": {"type": "string"}}], "responses": {"204": {"description": "Device removed"}, "401": {"description": "`non_connecte`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "403": {"description": "`interdit`: API key, authorized application, assistant or MCP", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/mot-de-passe": {"post": {"tags": ["connexion"], "summary": "Sets the password with an invitation or reset token. Closes the\naccount's open sessions.", "operationId": "definirMotDePasse", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauMotDePasse"}}}, "required": true}, "responses": {"204": {"description": "Password set"}, "400": {"description": "`jeton_invalide`: unknown, expired or already used", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`mot_de_passe_trop_court`, `mot_de_passe_trop_long`, `mot_de_passe_contient_courriel` or `mot_de_passe_trop_courant`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "429": {"description": "`trop_de_requetes`: too many attempts from this address (`Retry-After` header)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/mot-de-passe/oubli": {"post": {"tags": ["connexion"], "summary": "Forgotten password: if an active account has this address and an email server is\nconfigured, a link to choose a new password (valid for one hour) is sent to this address.\nThe response is the same in every case, and returned before sending: it does not reveal whether the\naccount exists.", "operationId": "motDePasseOublie", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DemandeOubli"}}}, "required": true}, "responses": {"202": {"description": "Request accepted (email sent if the account exists)"}, "429": {"description": "`trop_de_requetes`: too many requests from this address (`Retry-After` header)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/numeros/{numero_id}/etat": {"put": {"tags": ["numeros"], "summary": "Changes a number's status. Outside a customer: `libre`, `porte_sortant` or `resilie`. A\nnumber at a customer can only go to `porte_sortant`: it leaves the customer like a removal\n(call flow republished, route deleted, no longer presented) and cannot be assigned again.", "operationId": "changerEtatNumero", "parameters": [{"name": "numero_id", "in": "path", "description": "Number", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ChangementEtat"}}}, "required": true}, "responses": {"200": {"description": "Number", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Numero"}}}}, "403": {"description": "`interdit` (permission `numero.gerer`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`numero_deja_route`: one of the customer's numbers is routed in another domain", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`etat_invalide`; `parcours_invalide`: the published call flow no longer publishes", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/numeros/{numero_id}/reservation": {"put": {"tags": ["numeros"], "summary": "Reserves a number from the inventory for a reseller, or lifts the reservation.", "operationId": "reserverNumero", "parameters": [{"name": "numero_id", "in": "path", "description": "Number", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Reservation"}}}, "required": true}, "responses": {"200": {"description": "Number", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Numero"}}}}, "403": {"description": "`interdit` (permission `numero.gerer`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`revendeur_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/oauth/demandes/{id}": {"get": {"tags": ["oauth"], "summary": "Authorization request awaiting the signed-in account's approval.", "operationId": "lireDemandeOauth", "parameters": [{"name": "id", "in": "path", "description": "Authorization request", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Application requesting access", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DemandeOauth"}}}}, "403": {"description": "`interdit`: call by API key, authorized application, assistant or MCP", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: request expired or already handled", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/oauth/demandes/{id}/reponse": {"post": {"tags": ["oauth"], "summary": "Grants or refuses the requested access; the grant is recorded in the audit log.", "operationId": "repondreDemandeOauth", "parameters": [{"name": "id", "in": "path", "description": "Authorization request", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReponseDemandeOauth"}}}, "required": true}, "responses": {"200": {"description": "Address to send the browser to", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RedirectionOauth"}}}}, "403": {"description": "`interdit`: call by API key, authorized application, assistant or MCP", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: request expired or already handled", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}": {"get": {"tags": ["organisations"], "summary": "An organization: name, type, parent.", "operationId": "lireOrganisation", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Organization", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/OrganisationLue"}}}}, "403": {"description": "`interdit` (permission `organisation.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/acrobits": {"get": {"tags": ["reglages"], "summary": "The Cloud ID of the operator's mobile app.", "operationId": "lireAcrobits", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Cloud ID configured", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageAcrobits"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator, or no Cloud ID configured", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["reglages"], "summary": "Sets the Cloud ID of the operator's mobile app: CSC links carry it. The\ninitial provisioning is configured at Acrobits (`…/api/v1/provision/cloudsoftphone?p=%password%`).", "operationId": "reglerAcrobits", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageAcrobits"}}}, "required": true}, "responses": {"200": {"description": "Cloud ID configured", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageAcrobits"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`cloud_id_invalide`: 2 to 32 uppercase letters, digits, hyphens or underscores", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["reglages"], "summary": "Removes the Cloud ID: no more CSC link (Acrobits Softphone remains possible).", "operationId": "retirerAcrobits", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Cloud ID removed"}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/alertes": {"get": {"tags": ["reglages"], "summary": "Addresses that receive an organization's alerts.", "operationId": "lireAlertes", "parameters": [{"name": "id", "in": "path", "description": "Operator or reseller", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Addresses", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AdressesAlerte"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: neither the operator nor a reseller", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["reglages"], "summary": "Sets the alert addresses (ten at most).", "operationId": "reglerAlertes", "parameters": [{"name": "id", "in": "path", "description": "Operator or reseller", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AdressesAlerte"}}}, "required": true}, "responses": {"200": {"description": "Addresses", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AdressesAlerte"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: neither the operator nor a reseller", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`courriel_invalide`: invalid address or more than ten", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/appels-en-cours": {"get": {"tags": ["diagnostic"], "summary": "Ongoing calls at the organization's customers (diagnostics).", "operationId": "appelsEnCours", "parameters": [{"name": "id", "in": "path", "description": "Organization (operator or reseller)", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Active legs", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/AppelEnCours"}}}}}, "403": {"description": "`interdit` (permission `diagnostic.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "503": {"description": "`moteur_injoignable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/appels-en-cours/{uuid}": {"delete": {"tags": ["diagnostic"], "summary": "Hangs up an ongoing call (one leg) of a customer of the organization; logged.", "operationId": "couperAppel", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "uuid", "in": "path", "description": "Leg", "required": true, "schema": {"type": "string"}}], "responses": {"204": {"description": "Call hung up"}, "403": {"description": "`interdit` (permission `diagnostic.agir`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: no ongoing call with this name among its customers", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "503": {"description": "`moteur_injoignable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/appels.csv": {"get": {"tags": ["journal"], "summary": "CSV export of calls for all customers of an operator or a reseller (and its\nresellers), oldest first: the basis for billing (D13).", "operationId": "exporterAppelsDuParc", "parameters": [{"name": "id", "in": "path", "description": "Operator or reseller", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "du", "in": "query", "description": "Start of the period (RFC 3339), inclusive.", "required": false, "schema": {"type": ["string", "null"], "format": "date-time"}}, {"name": "au", "in": "query", "description": "End of the period (RFC 3339), exclusive.", "required": false, "schema": {"type": ["string", "null"], "format": "date-time"}}, {"name": "sens", "in": "query", "description": "`entrant`, `sortant` or `interne`.", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "poste", "in": "query", "description": "Calls of an extension; the extension owner sees their own.", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "limite", "in": "query", "description": "Calls per page (100 by default, 500 at most).", "required": false, "schema": {"type": ["integer", "null"], "format": "int64"}}, {"name": "avant", "in": "query", "description": "Next page: `suivant` from the previous page.", "required": false, "schema": {"type": ["string", "null"], "format": "date-time"}}, {"name": "numeros", "in": "query", "description": "`complets`: full numbers (permission `journal.voir_numeros`, logged).", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "repondu", "in": "query", "description": "True: answered calls (an inbound call connected to a person, D66); false: missed\ncalls (neither connected nor message) and unanswered outbound calls.", "required": false, "schema": {"type": ["boolean", "null"]}}, {"name": "issue", "in": "query", "description": "Outcome (D66): `repondu`, `manque` or `message` (inbound), `sans_reponse` (outbound or\ninternal call not answered).", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "duree_min", "in": "query", "description": "Minimum duration, in answered seconds.", "required": false, "schema": {"type": ["integer", "null"], "format": "int32"}}, {"name": "mois", "in": "query", "description": "Month `AAAA-MM` in Paris time (fleet export): replaces `du` and `au`, like\nusage.", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "recherche", "in": "query", "description": "Search (100 characters at most): a number, even partial, typed in national form (`06…`),\nwith `00…` or `+33…`, an extension, or a contact's name (extension, shared directory,\nthe account's personal contacts; accent- and case-insensitive). Unavailable on masked\nnumbers.", "required": false, "schema": {"type": ["string", "null"]}}], "responses": {"200": {"description": "CSV in the caller's language (French: `;` and decimal comma; English: `,` and decimal point), times in the customer's time zone, amounts excluding tax according to the role", "content": {"text/csv": {"schema": {"type": "string"}}}}, "403": {"description": "`interdit` (permission `journal.lire`, or `journal.voir_numeros` for full numbers)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`journal_invalide`: invalid direction, outcome or minimum duration, search (single customer export only), more than 200,000 calls; `mois_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/assistance": {"get": {"tags": ["reglages"], "summary": "State of the vendor's support access.", "operationId": "lireAssistance", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "State", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EtatAssistance"}}}}, "403": {"description": "`interdit`: not the operator's team", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["reglages"], "summary": "Opens the support access for a limited time (7 days at most). Logged.", "operationId": "ouvrirAssistance", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/OuvertureAssistance"}}}, "required": true}, "responses": {"200": {"description": "State", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EtatAssistance"}}}}, "403": {"description": "`interdit`: not the operator's team", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`duree_invalide`: 1 to 168 hours", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["reglages"], "summary": "Closes the support access immediately. Logged.", "operationId": "fermerAssistance", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Closed"}, "403": {"description": "`interdit`: not the operator's team", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/assistant": {"get": {"tags": ["assistant"], "summary": "Assistant setting, without the key.", "operationId": "lireReglageAssistant", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Assistant configured", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageAssistant"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator, or assistant not configured", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["assistant"], "summary": "Configures the setup assistant: operator's Claude key, model, budgets, pricing.", "operationId": "reglerAssistant", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauReglageAssistant"}}}, "required": true}, "responses": {"200": {"description": "Assistant configured", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageAssistant"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`assistant_invalide`: key missing on first setup, invalid model, budget or price", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["assistant"], "summary": "Removes the assistant: nobody can use it anymore; the key is erased.", "operationId": "retirerAssistant", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Assistant removed"}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/audit": {"get": {"tags": ["diagnostic"], "summary": "Audit log of an organization and its descendants.", "operationId": "lireAudit", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "avant", "in": "query", "description": "Entries with a lower rank (next page); absent: the most recent.", "required": false, "schema": {"type": ["integer", "null"], "format": "int64"}}, {"name": "limite", "in": "query", "description": "Entries per page (50 by default, 200 at most).", "required": false, "schema": {"type": ["integer", "null"], "format": "int64"}}, {"name": "action", "in": "query", "description": "Action prefix or exact action (`utilisateur.`, `connexion`).", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "resultat", "in": "query", "description": "`succes`, `refus` or `echec`.", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "bannissements_automatiques", "in": "query", "description": "`false`: without the guard's automatic bans (`garde.bannir` by the system, D43), which\nare numerous; those made by a person remain. Absent: everything.", "required": false, "schema": {"type": ["boolean", "null"]}}], "responses": {"200": {"description": "Entries, most recent first", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PageAudit"}}}}, "403": {"description": "`interdit` (permission `audit.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/cles-api": {"get": {"tags": ["cles-api"], "summary": "An organization's API keys (without their secret).", "operationId": "listerClesApi", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Keys, including revoked ones", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Cle"}}}}}, "403": {"description": "`interdit`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["cles-api"], "summary": "Creates an API key for an organization.", "operationId": "creerCleApi", "parameters": [{"name": "id", "in": "path", "description": "Key organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DemandeCle"}}}, "required": true}, "responses": {"201": {"description": "Key created; `secret` is given only once", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CleCreee"}}}}, "403": {"description": "`interdit` (permission `cle_api.gerer`, or call made with a key); `escalade_interdite`: the key could do more than its creator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`role_invalide`, `permission_inconnue`, `nom_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/clients": {"get": {"tags": ["clients"], "summary": "Customers visible from an organization (its descendants).", "operationId": "listerClients", "parameters": [{"name": "id", "in": "path", "description": "Starting organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Customers", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Client"}}}}}, "403": {"description": "`interdit` (permission `client.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["clients"], "summary": "Creates a customer under an operator or a reseller, with its SIP domain.", "operationId": "creerClient", "parameters": [{"name": "id", "in": "path", "description": "Operator or reseller", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauClient"}}}, "required": true}, "responses": {"201": {"description": "Customer and SIP domain created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Client"}}}}, "403": {"description": "`interdit` (permission `client.creer`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`domaine_existant`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`nom_invalide`, `domaine_invalide`, `parent_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/comptes": {"get": {"tags": ["organisations"], "summary": "An organization's accounts (its own, not those of its descendants).", "operationId": "listerComptes", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Accounts", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/CompteEquipe"}}}}}, "403": {"description": "`interdit` (permission `utilisateur.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["organisations"], "summary": "Creates a team account at the operator (admin or support) or at a reseller (admin), and\nsends them their invitation by email. The second factor will be required at their first\nlogin (§6).", "operationId": "creerCompte", "parameters": [{"name": "id", "in": "path", "description": "Operator or reseller", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauCompte"}}}, "required": true}, "responses": {"201": {"description": "Account created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CompteEquipe"}}}}, "403": {"description": "`interdit` (permission `utilisateur.creer`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`courriel_pris`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`compte_de_client` (a customer: go through its users), `nom_invalide`, `courriel_invalide`, `role_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/consommation": {"get": {"tags": ["grilles"], "summary": "Usage of an organization's customers (operator or reseller) for a month.", "operationId": "lireConsommation", "parameters": [{"name": "id", "in": "path", "description": "Operator or reseller", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "mois", "in": "query", "description": "Month `AAAA-MM`; absent: the current month.", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "client", "in": "query", "description": "A single customer (customer page); omitted: all.", "required": false, "schema": {"type": ["string", "null"], "format": "uuid"}}], "responses": {"200": {"description": "Usage by customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Consommation"}}}}, "403": {"description": "`interdit` (permission `grille.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: neither the operator nor a reseller", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`mois_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/destinations-bloquees": {"get": {"tags": ["garde"], "summary": "Destinations blocked for all customers (D23).", "operationId": "listerDestinationsBloquees", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Blocked prefixes", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/DestinationBloquee"}}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["garde"], "summary": "Replaces the blocked destinations; the outbound routes of all customers are rewritten\nin the same transaction. Emergency numbers always remain reachable (D22).", "operationId": "bloquerDestinations", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/DestinationBloquee"}}}}, "required": true}, "responses": {"200": {"description": "Blocked prefixes", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/DestinationBloquee"}}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`prefixe_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/devise": {"get": {"tags": ["reglages"], "summary": "Instance currency, read from any organization whose settings you can read.", "operationId": "lireDevise", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Instance currency", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeviseInstance"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["reglages"], "summary": "Sets the instance currency (operator only). No conversion: refused as soon as a rate\ntable exists or a call has been rated, unless keeping the same currency.", "operationId": "reglerDevise", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageDevise"}}}, "required": true}, "responses": {"200": {"description": "Instance currency", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DeviseInstance"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`devise_tarifs_existants`: a rate table exists or a call has been rated; amounts are not converted", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`devise_invalide`: not a supported currency", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/diagnostic/recharger": {"post": {"tags": ["diagnostic"], "summary": "Reloads the telephony engine configuration: caches cleared, configuration, dialplan and\nACL read again. For the operator (whole instance); audited.", "operationId": "rechargerConfiguration", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Configuration reloaded"}, "403": {"description": "`interdit` (permission `diagnostic.agir` on an operator)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "503": {"description": "`moteur_injoignable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/diagnostic/redemarrer": {"post": {"tags": ["diagnostic"], "summary": "Restarts the telephony engine, after ongoing calls or immediately.\nWhole instance: restricted to the operator admin; audited.", "operationId": "redemarrerMoteur", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Redemarrage"}}}, "required": true}, "responses": {"202": {"description": "Restart requested"}, "403": {"description": "`interdit` (permission `reglages.modifier` on the operator)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "503": {"description": "`moteur_injoignable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/fonctions": {"get": {"tags": ["organisations"], "summary": "Features turned on for the instance.", "operationId": "lireFonctions", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Features", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Fonctions"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["organisations"], "summary": "Turns resellers, the AI assistant and voicemail on or off. Turning voicemail off disables\nevery mailbox (their state is kept, and so are their messages); turning it back on gives\neach mailbox its previous state back.", "operationId": "reglerFonctions", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Fonctions"}}}, "required": true}, "responses": {"200": {"description": "Features", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Fonctions"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`revendeurs_existants`: resellers still exist", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/fuseau": {"get": {"tags": ["reglages"], "summary": "An organization's time zone.", "operationId": "lireFuseau", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Time zone", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FuseauOrganisation"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["reglages"], "summary": "Sets the time zone of an organization (operator, reseller or customer). The operator's or\na reseller's applies to customers created afterward. A customer's published opening hours\nswitch to its new time zone at once.", "operationId": "reglerFuseau", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/FuseauOrganisation"}}}, "required": true}, "responses": {"200": {"description": "Time zone", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/FuseauOrganisation"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`fuseau_invalide`: not a name from `GET /fuseaux`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/garde": {"get": {"tags": ["garde"], "summary": "Ban settings and currently banned addresses.", "operationId": "lireGarde", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Settings and current bans", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Garde"}}}}, "403": {"description": "`interdit` (permission `diagnostic.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["garde"], "summary": "Changes threshold, window, duration and allowlist.", "operationId": "reglerGarde", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglagesGarde"}}}, "required": true}, "responses": {"200": {"description": "Settings saved", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglagesGarde"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`reglage_invalide`, `reseau_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/garde/bannies": {"post": {"tags": ["garde"], "summary": "Bans an address by hand (§8), for SIP and RTP: a scanner, a device to cut off. Refused\nfor an address in the allow list or of a trunk. Logged.", "operationId": "bannir", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauBannissement"}}}, "required": true}, "responses": {"204": {"description": "Banned address"}, "403": {"description": "`interdit` (permission `diagnostic.agir`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`ip_epargnee`: allow list or trunk network", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`ip_invalide`; `garde_invalide`: duration out of bounds", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/garde/bannies/{ip}": {"delete": {"tags": ["garde"], "summary": "Lifts the ban on an address.", "operationId": "debannir", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "ip", "in": "path", "description": "Banned address", "required": true, "schema": {"type": "string"}}], "responses": {"204": {"description": "Ban lifted"}, "403": {"description": "`interdit` (permission `diagnostic.agir`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator, or address not banned", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`ip_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/grille": {"get": {"tags": ["grilles"], "summary": "Rate table assigned to a customer or a reseller; `null`: the default one.", "operationId": "lireGrilleAttribuee", "parameters": [{"name": "id", "in": "path", "description": "Customer or reseller", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Rate table assigned", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/AttributionGrille"}}}}, "403": {"description": "`interdit` (permission `grille.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["grilles"], "summary": "Assigns a sales rate sheet to a customer (sale to the customer) or to a reseller (sale to the\nreseller); without a rate sheet: the default one applies again. Requires managing the rate sheets of\nthe organization and of the rate sheet's owner: a reseller cannot assign itself a rate sheet of\nthe operator.", "operationId": "attribuerGrille", "parameters": [{"name": "id", "in": "path", "description": "Customer or reseller", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/AttributionGrille"}}}, "required": true}, "responses": {"204": {"description": "Rate table assigned (or removed)"}, "403": {"description": "`interdit` (permission `grille.gerer` on the organization and on the rate table's owner)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: rate table", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`grille_invalide`: type not suitable for this organization, or rate table outside its lineage", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/grilles": {"get": {"tags": ["grilles"], "summary": "The organization's rate tables (operator or reseller).", "operationId": "listerGrilles", "parameters": [{"name": "id", "in": "path", "description": "Operator or reseller", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Rate tables, by kind then effective date", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/GrilleTarifaire"}}}}}, "403": {"description": "`interdit` (permission `grille.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["grilles"], "summary": "Creates a rate sheet, from a CSV (`prefixe;destination;prix_minute;frais;palier`) or from\nan existing rate sheet marked up by a margin.", "operationId": "creerGrille", "parameters": [{"name": "id", "in": "path", "description": "Operator or reseller", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouvelleGrilleTarifaire"}}}, "required": true}, "responses": {"201": {"description": "Rate table created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/GrilleTarifaire"}}}}, "403": {"description": "`interdit` (permission `grille.gerer`, or `grille.lire` on the base rate table)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: base rate table", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`grille_invalide`: kind not allowed for this organization, empty name, neither CSV nor source rate table (or both), faulty CSV line (number and reason, including a second `*` catch-all), invalid catch-all price or one given for a purchase rate table; `forfait_invalide`: plan fee for a purchase rate table, or amount outside 0 to 100,000 in the instance currency", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/langue": {"get": {"tags": ["reglages"], "summary": "An organization's language.", "operationId": "lireLangue", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Language", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LangueOrganisation"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["reglages"], "summary": "Sets the email language of an organization (operator, reseller or customer). The operator's\nor a reseller's applies to its accounts and to customers created afterward.", "operationId": "reglerLangue", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/LangueOrganisation"}}}, "required": true}, "responses": {"200": {"description": "Language", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/LangueOrganisation"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`langue_invalide`: neither French nor English", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/licence": {"get": {"tags": ["reglages"], "summary": "Instance license: identity, public key, users and latest readings.", "operationId": "lireLicence", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "License", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Licence"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/licence/fichier": {"put": {"tags": ["reglages"], "summary": "Loads the license issued by the vendor (manual mode, without the Hub). It must be signed by\nthe vendor and issued to this instance; a license shorter than the current one is\nignored.", "operationId": "chargerLicence", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/FichierLicence"}}}, "required": true}, "responses": {"200": {"description": "License status", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EtatLicence"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`licence_invalide`: bad signature, another instance, or unreadable content", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/licence/releves/{jour}": {"get": {"tags": ["reglages"], "summary": "Signed usage report for one day, to send to the vendor (manual report).", "operationId": "telechargerReleveLicence", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "jour", "in": "path", "description": "Day (`AAAA-MM-JJ`)", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Signed usage report (JSON file)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReleveSigne"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator, or no snapshot for that day", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/machine": {"get": {"tags": ["diagnostic"], "summary": "Machine monitoring: processor, memory, load and disks, minute by minute.", "operationId": "lireMachine", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "heures", "in": "query", "description": "Hours covered, up to now (24 by default, 48 at most).", "required": false, "schema": {"type": ["integer", "null"], "format": "int64"}}], "responses": {"200": {"description": "Readings", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Machine"}}}}, "403": {"description": "`interdit` (permission `diagnostic.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`periode_invalide`: hours from 1 to 48", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/marque": {"put": {"tags": ["reglages"], "summary": "Sets the branding name and colors; an absent value reverts to the default.\nThe accent must keep white button text readable (contrast of at least 4.5), the menu a light\nor dark text (4.5), the text the page background (7).", "operationId": "reglerMarque", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageMarque"}}}, "required": true}, "responses": {"200": {"description": "Brand", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Marque"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`nom_invalide`, `couleur_invalide` (not `#rrggbb`), `couleur_peu_lisible` (white text unreadable on it), `couleur_menu_peu_lisible` (no readable text on this menu), `couleur_texte_peu_lisible` (text unreadable on the page background)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/marque/icone": {"put": {"tags": ["reglages"], "summary": "Uploads the icon (favicon, installed app): a square PNG of at least 192 pixels per side\nand 256 KiB at most. The logo is not reused: often wide, it would be unreadable at\n16 pixels.", "operationId": "deposerIcone", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"description": "Square PNG", "content": {"application/octet-stream": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}, "required": true}, "responses": {"200": {"description": "Brand", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Marque"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "413": {"description": "`icone_trop_grosse`: more than 256 KiB", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`icone_invalide`: not a square PNG of at least 192 pixels per side", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["reglages"], "summary": "Removes the uploaded icon: the generated icon (initial on the accent) comes back.", "operationId": "retirerIcone", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Brand", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Marque"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/marque/logo": {"put": {"tags": ["reglages"], "summary": "Uploads the logo: PNG, JPEG or WebP, 256 KiB at most. The portal displays it 28 pixels\nhigh (56 on high density): a square or wide, plain logo works best.", "operationId": "deposerLogo", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"description": "Image", "content": {"application/octet-stream": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}, "required": true}, "responses": {"200": {"description": "Brand", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Marque"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "413": {"description": "`logo_trop_gros`: over 256 KiB", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`logo_invalide`: not PNG, JPEG or WebP", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["reglages"], "summary": "Removes the logo.", "operationId": "retirerLogo", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Logo removed"}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/numeros": {"get": {"tags": ["numeros"], "summary": "Numbers visible from an organization: all for the operator; for a reseller, its\nreserved ones and those of its customers; for a customer, its own.", "operationId": "listerNumeros", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "etat", "in": "query", "description": "Only numbers in this state.", "required": false, "schema": {"type": ["string", "null"]}}], "responses": {"200": {"description": "Numbers", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Numero"}}}}}, "403": {"description": "`interdit` (permission `numero.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`etat_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["numeros"], "summary": "Adds numbers to the operator's inventory, as free. All or nothing.", "operationId": "creerNumeros", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauxNumeros"}}}, "required": true}, "responses": {"201": {"description": "Numbers added to stock", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Numero"}}}}}, "403": {"description": "`interdit` (permission `numero.gerer`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`numero_existant`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`numero_invalide`, `pays_invalide` (country required, or not matching the country code), `organisation_invalide`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/pays": {"get": {"tags": ["reglages"], "summary": "Country of an organisation.", "operationId": "lirePays", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Country", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaysOrganisation"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["reglages"], "summary": "Sets the country of an organisation (operator, reseller or customer). The operator's or a reseller's applies to customers created afterwards. For a customer, its outbound routes and published call flow switch at once to the numbering plan of the new country; refused if an extension or a module uses one of its emergency numbers, if published business hours close on a public holiday that does not exist in the new country, or if forwardings or external numbers of the call flow, dialled in the former country, would change meaning.", "operationId": "reglerPays", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaysOrganisation"}}}, "required": true}, "responses": {"200": {"description": "Country", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PaysOrganisation"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`pays_urgence_occupee`: an extension or a module uses an emergency number of the country; `pays_feries`: business hours closing on a public holiday that does not exist in the country, to untick first; `pays_destinations_externes`: forwardings or external numbers to remove first", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`pays_invalide`: not a country from `GET /pays`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/plafond": {"get": {"tags": ["reglages"], "summary": "The instance's default thresholds.", "operationId": "lirePlafondParDefaut", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Default thresholds", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SeuilsPlafond"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["reglages"], "summary": "Sets the instance's default thresholds.", "operationId": "reglerPlafondParDefaut", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SeuilsPlafond"}}}, "required": true}, "responses": {"200": {"description": "Default thresholds", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SeuilsPlafond"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`plafond_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/profils-trunk": {"get": {"tags": ["trunks"], "summary": "Operator's trunk profiles.", "operationId": "listerProfilsTrunk", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Profiles, by name", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/ProfilTrunk"}}}}}, "403": {"description": "`interdit` (permission `trunk.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["trunks"], "summary": "Creates a trunk profile.", "operationId": "creerProfilTrunk", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauProfilTrunk"}}}, "required": true}, "responses": {"201": {"description": "Profile created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProfilTrunk"}}}}, "403": {"description": "`interdit` (permission `trunk.gerer`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`profil_existant`: name already taken", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`nom_invalide`, `proxy_invalide`, `format_invalide`, `reseau_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/profils-trunk/{profil_id}": {"put": {"tags": ["trunks"], "summary": "Updates a trunk profile: the trunks based on it follow (gateways, outbound\nroutes, provider ACL).", "operationId": "modifierProfilTrunk", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "profil_id", "in": "path", "description": "Profile", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauProfilTrunk"}}}, "required": true}, "responses": {"200": {"description": "Profile updated", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ProfilTrunk"}}}}, "403": {"description": "`interdit` (permission `trunk.gerer`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator, or no such profile", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`profil_existant`: name already taken", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`nom_invalide`, `proxy_invalide`, `format_invalide`, `reseau_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["trunks"], "summary": "Deletes a trunk profile that no trunk uses.", "operationId": "supprimerProfilTrunk", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "profil_id", "in": "path", "description": "Profile", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Profile deleted"}, "403": {"description": "`interdit` (permission `trunk.gerer`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator, or no such profile", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`profil_utilise`: trunks are based on it", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/retention": {"get": {"tags": ["reglages"], "summary": "An organization's retention periods: configured and applied.", "operationId": "lireRetention", "parameters": [{"name": "id", "in": "path", "description": "Operator or customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Retention", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Retention"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: neither the operator nor a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["reglages"], "summary": "Sets an organization's retention periods. Bounds: recordings from 1 to 183 days (D63),\nmessages from 1 to 3,650 days, CDRs from 365 to 3,650 days (CPCE L34-1); `null`: the level\nabove.", "operationId": "reglerRetention", "parameters": [{"name": "id", "in": "path", "description": "Operator or customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Durees"}}}, "required": true}, "responses": {"200": {"description": "Retention", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Retention"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: neither the operator nor a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`retention_invalide`: duration out of bounds", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/revendeurs": {"get": {"tags": ["organisations"], "summary": "Resellers visible from an organization (its descendants), with their number of customers.", "operationId": "listerRevendeurs", "parameters": [{"name": "id", "in": "path", "description": "Starting organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Resellers", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Revendeur"}}}}}, "403": {"description": "`interdit` (permission `organisation.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["organisations"], "summary": "Creates a reseller under the operator. Its customers are then created under it\n(`POST /organisations/{id}/clients`), its admins via `POST /organisations/{id}/comptes`.", "operationId": "creerRevendeur", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauRevendeur"}}}, "required": true}, "responses": {"201": {"description": "Reseller created", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Revendeur"}}}}, "403": {"description": "`interdit` (permission `revendeur.creer`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`revendeurs_desactives`: resellers turned off by the operator (D94)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`nom_invalide`, `parent_invalide`: a reseller belongs to the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/sante": {"get": {"tags": ["diagnostic"], "summary": "Instance health: telephony engine, database, CDRs, trunks and webhooks of the organization's\ncustomers.", "operationId": "santeInstance", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Health", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Sante"}}}}, "403": {"description": "`interdit` (permission `diagnostic.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/simultanes": {"get": {"tags": ["journal"], "summary": "Peaks of concurrent calls hour by hour (operator, reseller or customer): the largest\nnumber of calls in progress at the same instant, from the start and end of the CDRs.", "operationId": "lireSimultanes", "parameters": [{"name": "id", "in": "path", "description": "Operator, reseller or customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "periode", "in": "query", "description": "Period (`jour`, `24h`, `7j`, `30j`, `mois`); the last 24 hours by default.", "required": false, "schema": {"oneOf": [{"$ref": "#/components/schemas/PeriodeModule"}, {"type": "null"}]}}], "responses": {"200": {"description": "Peaks per hour", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Simultanes"}}}}, "403": {"description": "`interdit` (permission `journal.lire`; a user does not get the customer's figures)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`periode_invalide`: live period or over the year", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/smtp": {"get": {"tags": ["reglages"], "summary": "The operator's SMTP server, without its password.", "operationId": "lireSmtp", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "SMTP server configured", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageSmtp"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator, or no server configured", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["reglages"], "summary": "Configures the operator's SMTP server (replaces the previous one).", "operationId": "reglerSmtp", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauReglageSmtp"}}}, "required": true}, "responses": {"200": {"description": "SMTP server configured", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageSmtp"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`smtp_invalide`: invalid host, port, security or sender address, missing password", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["reglages"], "summary": "Removes the SMTP server: no emails are sent anymore.", "operationId": "retirerSmtp", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "SMTP server removed"}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/smtp/essai": {"post": {"tags": ["reglages"], "summary": "Sends a test email through the configured server. The server error is returned as is\nfor diagnosis (authentication rejected, TLS, host unreachable).", "operationId": "essayerSmtp", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/EssaiSmtp"}}}, "required": true}, "responses": {"204": {"description": "Email accepted by the server"}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator, or no server configured", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`smtp_invalide`: invalid recipient address", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "502": {"description": "`smtp_echec`: the server refused or did not respond (server details)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/sso/jeton": {"get": {"tags": ["reglages"], "summary": "Token login from the operator's portal: key status.", "operationId": "lireSsoJeton", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Setting", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageSsoJeton"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "post": {"tags": ["reglages"], "summary": "Creates (or replaces) the token login key; it is returned once. The old one\nis no longer valid.", "operationId": "creerSsoJeton", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "New key (shown this time only)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CleSsoJeton"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["reglages"], "summary": "Closes the token connection: the key is erased.", "operationId": "retirerSsoJeton", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Key deleted"}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/sso/oidc": {"get": {"tags": ["reglages"], "summary": "Directory configured on an organization.", "operationId": "lireSsoOidc", "parameters": [{"name": "id", "in": "path", "description": "Operator or customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Setting (without the secret)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageOidc"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: no directory configured, or neither the operator nor a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["reglages"], "summary": "Configures an organization's identity provider. The issuer is verified (discovery document read) before\nsaving.", "operationId": "reglerSsoOidc", "parameters": [{"name": "id", "in": "path", "description": "Operator or customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauReglageOidc"}}}, "required": true}, "responses": {"200": {"description": "Setting saved", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageOidc"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: neither the operator nor a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`oidc_invalide`: invalid issuer, client ID, secret, label or domain", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "502": {"description": "`oidc_injoignable`: unreadable discovery document", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["reglages"], "summary": "Removes an organization's identity provider and its secret.", "operationId": "retirerSsoOidc", "parameters": [{"name": "id", "in": "path", "description": "Operator or customer", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Directory removed"}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: neither the operator nor a customer", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/statistiques": {"get": {"tags": ["journal"], "summary": "Call statistics for the customer base: daily volume, outgoing call quality by provider.", "operationId": "statistiquesParc", "parameters": [{"name": "id", "in": "path", "description": "Operator or reseller", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "jours", "in": "query", "description": "Days covered, up to and including today (30 by default, 90 at most).", "required": false, "schema": {"type": ["integer", "null"], "format": "int64"}}], "responses": {"200": {"description": "Statistics for the period", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/StatistiquesParc"}}}}, "403": {"description": "`interdit` (permission `journal.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: neither the operator nor a reseller", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`periode_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/suffixe-domaine": {"get": {"tags": ["clients"], "summary": "Customer domain suffix (D108), for those who create customers (the operator and its\nresellers) or view the settings.", "operationId": "lireSuffixeDomaine", "parameters": [{"name": "id", "in": "path", "description": "Operator or reseller", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Customer domain suffix", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuffixeDomaine"}}}}, "403": {"description": "`interdit` (permission `client.creer` or `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["reglages"], "summary": "Sets the instance's customer domain suffix (D108). Existing customers keep\ntheir domain.", "operationId": "reglerSuffixeDomaine", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuffixeDomaine"}}}, "required": true}, "responses": {"200": {"description": "Customer domain suffix", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/SuffixeDomaine"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`suffixe_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/supervision": {"get": {"tags": ["organisations"], "summary": "Status of the monitoring token (never the token itself).", "operationId": "lireSupervision", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Monitoring token", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/JetonSupervision"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/supervision/jeton": {"post": {"tags": ["organisations"], "summary": "Creates the monitoring token, or replaces it: the old one stops working at once.", "operationId": "creerJetonSupervision", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"201": {"description": "Token created; `secret` is only given once", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/JetonSupervisionCree"}}}}, "403": {"description": "`interdit` (reserved to the operator admin in person: neither an API key nor the vendor's support)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["organisations"], "summary": "Revokes the monitoring token: `/metrics` is local only again.", "operationId": "revoquerJetonSupervision", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Token revoked (or none)"}, "403": {"description": "`interdit` (reserved to the operator admin in person: neither an API key nor the vendor's support)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/synthese": {"get": {"tags": ["reglages"], "summary": "The announcement text-to-speech voice set by the operator, without the key.", "operationId": "lireSynthese", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Setting (Piper and default Google voices if nothing is set)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageSynthese"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["reglages"], "summary": "Sets the announcement text-to-speech voice: engine, Google key (kept, replaced or erased),\nFrench and English voices.", "operationId": "reglerSynthese", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauReglageSynthese"}}}, "required": true}, "responses": {"200": {"description": "Setting saved", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageSynthese"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`synthese_invalide`: invalid voice (form `fr-FR-Chirp3-HD-Leda`) or key", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/synthese/essai": {"post": {"tags": ["reglages"], "summary": "Reads a short sentence with the saved setting and returns the WAV. No fallback: Google's\nerror is returned with its detail for troubleshooting (key refused, IP restriction, API not\nenabled).", "operationId": "essayerSynthese", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/EssaiSynthese"}}}, "required": true}, "responses": {"200": {"description": "WAV mono 16-bit 8 kHz", "content": {"audio/wav": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`synthese_invalide`: language other than fr or en; `synthese_google_sans_cle`: Google chosen with no stored key", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "500": {"description": "`synthese_echouee`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "502": {"description": "Refused by Google, with Google's detail: `synthese_google_cle_invalide`, `synthese_google_restriction_ip` (key restricted to another IP address), `synthese_google_api_refusee` (Text-to-Speech API not enabled, or key restricted to other APIs), `synthese_google_quota`, `synthese_google_voix_inconnue`, `synthese_google_refus`, `synthese_google_injoignable`, `synthese_google_reponse_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "503": {"description": "Piper chosen: `synthese_indisponible`, `synthese_anglaise_indisponible`, `synthese_occupee`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/tableau": {"get": {"tags": ["journal"], "summary": "Dashboard of an organisation (operator, reseller or customer) over a period:\ncalls and amounts per slot, comparison, destinations, top-consuming customers.", "operationId": "lireTableau", "parameters": [{"name": "id", "in": "path", "description": "Operator, reseller or customer", "required": true, "schema": {"type": "string", "format": "uuid"}}, {"name": "periode", "in": "query", "description": "Period (`jour`, `24h`, `7j`, `30j`, `mois`, `annee`); the current month by default.", "required": false, "schema": {"oneOf": [{"$ref": "#/components/schemas/PeriodeModule"}, {"type": "null"}]}}, {"name": "pas", "in": "query", "description": "Slot size; by default the hour over a day, the day up to a month, the month over a year.", "required": false, "schema": {"oneOf": [{"$ref": "#/components/schemas/Pas"}, {"type": "null"}]}}, {"name": "comparer", "in": "query", "description": "Adds the totals of the previous period of the same length.", "required": false, "schema": {"type": "boolean"}}], "responses": {"200": {"description": "Dashboard of the period", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Tableau"}}}}, "403": {"description": "`interdit` (permission `journal.lire`; a user does not get the customer's figures)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`periode_invalide`: live period, or too many slots (800 at most)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/transcription": {"get": {"tags": ["reglages"], "summary": "The operator's transcription service, without its key.", "operationId": "lireTranscription", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Service configured", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageTranscription"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator, or no service configured", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["reglages"], "summary": "Configures the operator's transcription service (replaces the previous one).", "operationId": "reglerTranscription", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauReglageTranscription"}}}, "required": true}, "responses": {"200": {"description": "Service configured", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/ReglageTranscription"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`transcription_invalide`: invalid address (http or https, no query string), model or language", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["reglages"], "summary": "Removes the transcription service: nothing is transcribed anymore.", "operationId": "retirerTranscription", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Service removed"}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/transcription/essai": {"post": {"tags": ["reglages"], "summary": "Has the configured service transcribe one second of silence. The service error is returned\nas is for diagnosis (key rejected, unknown model, host unreachable).", "operationId": "essayerTranscription", "parameters": [{"name": "id", "in": "path", "description": "Operator", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "The service responded", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/EssaiTranscription"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: not the operator, or no service configured", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "502": {"description": "`transcription_echec`: the service refused or did not respond (service details)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/webhook": {"get": {"tags": ["webhooks"], "summary": "The organization's endpoint.", "operationId": "lireWebhook", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Endpoint, without its secret", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Webhook"}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: no webhook", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "put": {"tags": ["webhooks"], "summary": "Creates or updates the endpoint (and reactivates it). On creation, the secret is returned once.", "operationId": "reglerWebhook", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauWebhook"}}}, "required": true}, "responses": {"200": {"description": "Endpoint updated, secret kept", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Webhook"}}}}, "201": {"description": "Endpoint created, with its secret (shown this time only)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/WebhookAvecSecret"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`webhook_invalide`: address rejected (https, port 443 or 8443, public address that resolves), event unknown for this organization", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "delete": {"tags": ["webhooks"], "summary": "Deletes the endpoint, its secret and its queue.", "operationId": "supprimerWebhook", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Webhook deleted"}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: no webhook", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/webhook/envois": {"get": {"tags": ["webhooks"], "summary": "The endpoint's last 100 deliveries.", "operationId": "listerEnvoisWebhook", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Deliveries, most recent first", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/Envoi"}}}}}, "403": {"description": "`interdit` (permission `reglages.lire`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/organisations/{id}/webhook/secret": {"post": {"tags": ["webhooks"], "summary": "Renews the secret; the new one is returned once.", "operationId": "renouvelerSecretWebhook", "parameters": [{"name": "id", "in": "path", "description": "Organization", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "New secret (shown this time only)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/WebhookAvecSecret"}}}}, "403": {"description": "`interdit` (permission `reglages.modifier`)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "404": {"description": "`introuvable`: no webhook", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/pays": {"get": {"tags": ["reglages"], "summary": "Supported countries, with their numbering plan.", "operationId": "listerPays", "responses": {"200": {"description": "Supported countries", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/PaysPrisEnCharge"}}}}}}, "security": [{"session": []}]}}, "/api/v1/provision/acrobits": {"get": {"tags": ["provisionnement"], "summary": "Acrobits configuration (Account XML), reloaded daily by the app. Opened in a\nbrowser (QR code scanned with the camera), redirects to the app (`provlinks:`).", "operationId": "provisionnerAcrobits", "parameters": [{"name": "jeton", "in": "query", "description": "Provisioning token.", "required": true, "schema": {"type": "string"}}, {"name": "app", "in": "query", "description": "`1`: request from the app (otherwise, redirect to it).", "required": false, "schema": {"type": ["string", "null"]}}], "responses": {"200": {"description": "Account XML", "content": {"application/xml": {"schema": {"type": "string"}}}}, "302": {"description": "To the app (`provlinks://…&app=1`)"}, "404": {"description": "Invalid or expired link, extension deleted or disabled", "content": {"application/xml": {"schema": {"type": "string"}}}}}}}, "/api/v1/provision/acrobits-contacts": {"get": {"tags": ["provisionnement"], "summary": "Phone contacts (Acrobits JSON format): the customer's other extensions and its\nshared directory.", "operationId": "contactsAcrobits", "parameters": [{"name": "jeton", "in": "query", "description": "Provisioning token.", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Contacts", "content": {"application/json": {"schema": {"type": "string"}}}}, "404": {"description": "`introuvable`: invalid or expired link", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/provision/cloudsoftphone": {"get": {"tags": ["provisionnement"], "summary": "Initial provisioning of the operator's mobile app (Cloud Softphone), to configure\nat Acrobits: `…/api/v1/provision/cloudsoftphone?p=%password%`. Rejection: the message the\napp displays.", "operationId": "provisionnerCloudSoftphone", "parameters": [{"name": "p", "in": "query", "description": "CSC link token (`%password%` in the URL configured at Acrobits).", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Account XML", "content": {"application/xml": {"schema": {"type": "string"}}}}, "401": {"description": "Invalid or expired link (`<error><message>`)", "content": {"application/xml": {"schema": {"type": "string"}}}}}}}, "/api/v1/provision/installation": {"post": {"tags": ["provisionnement"], "summary": "Setup page (link sent by email, no session): the extension's setup links,\nrenewed. POST: the token stays out of access logs.", "operationId": "lireInstallation", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/JetonInstallation"}}}, "required": true}, "responses": {"200": {"description": "Setup links", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Installation"}}}}, "404": {"description": "`introuvable`: invalid or expired link, extension deleted or disabled", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/provision/materiel/{dossier}/{fichier}": {"get": {"tags": ["provisionnement"], "summary": "File of a desk phone stored under its MAC (`{mac}/annuaire.xml`).", "operationId": "servirFichierMaterielDossier", "parameters": [{"name": "dossier", "in": "path", "description": "Folder (the device's MAC)", "required": true, "schema": {"type": "string"}}, {"name": "fichier", "in": "path", "description": "Name of the requested file", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "File", "content": {"application/xml": {"schema": {"type": "string"}}}}, "401": {"description": "Credentials missing or refused (`WWW-Authenticate: Basic` challenge)"}, "404": {"description": "File the device's profile does not serve"}}}}, "/api/v1/provision/materiel/{fichier}": {"get": {"tags": ["provisionnement"], "summary": "Configuration file of a desk phone (`{mac}.cfg`, `y000000000000.cfg`,\n`cfg{mac}.xml`…), built on request from its profile. HTTP Basic authentication:\nthe device's MAC and its password (`revelerIdentifiantsAppareil`).", "operationId": "servirFichierMateriel", "parameters": [{"name": "fichier", "in": "path", "description": "Name of the requested file", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "File", "content": {"text/plain": {"schema": {"type": "string"}}}}, "401": {"description": "Credentials missing or refused (`WWW-Authenticate: Basic` challenge)"}, "404": {"description": "File the device's profile does not serve"}}}}, "/api/v1/sante": {"get": {"tags": ["exploitation"], "summary": "The instance responds and its database is reachable.", "operationId": "sante", "responses": {"200": {"description": "Instance operational", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Sante"}}}}, "503": {"description": "Database unreachable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/second-facteur/passkeys": {"get": {"tags": ["connexion"], "summary": "Passkeys of the signed-in account.", "operationId": "listerPasskeys", "responses": {"200": {"description": "Passkeys", "content": {"application/json": {"schema": {"type": "array", "items": {"$ref": "#/components/schemas/ResumePasskey"}}}}}}, "security": [{"session": []}]}}, "/api/v1/second-facteur/passkeys/debut": {"post": {"tags": ["connexion"], "summary": "Starts registering a passkey: options to pass to `navigator.credentials.create()`.", "operationId": "commencerPasskey", "responses": {"200": {"description": "WebAuthn creation options (`publicKey`)", "content": {"application/json": {"schema": {}}}}, "409": {"description": "`etape_de_connexion_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/second-facteur/passkeys/fin": {"post": {"tags": ["connexion"], "summary": "Completes the registration. If the session was limited to second-factor enrollment, it\nbecomes full (new cookie).", "operationId": "terminerPasskey", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/FinInscription"}}}, "required": true}, "responses": {"200": {"description": "Passkey registered", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/PasskeyAjoutee"}}}}, "400": {"description": "`pas_de_ceremonie`, `passkey_refusee`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`nom_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/second-facteur/passkeys/{id}": {"delete": {"tags": ["connexion"], "summary": "Deletes a passkey of the signed-in account.", "operationId": "supprimerPasskey", "parameters": [{"name": "id", "in": "path", "description": "Passkey", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Deleted"}, "404": {"description": "`introuvable`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/second-facteur/totp": {"post": {"tags": ["connexion"], "summary": "Starts enrolling an authenticator app (TOTP).", "operationId": "commencerTotp", "responses": {"200": {"description": "Secret to configure, valid until confirmation", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/InscriptionTotp"}}}}, "409": {"description": "`second_facteur_deja_actif` or `etape_de_connexion_invalide`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/second-facteur/totp/confirmation": {"post": {"tags": ["connexion"], "summary": "Confirms enrollment with a first code. Returns the backup codes; if the session\nwas limited to enrollment, it becomes full (new cookie).", "operationId": "confirmerTotp", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/Code"}}}, "required": true}, "responses": {"200": {"description": "Second factor enabled", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/CodesDeSecours"}}}}, "400": {"description": "`code_invalide` or `pas_d_inscription`", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/sso/jeton": {"get": {"tags": ["connexion"], "summary": "Login with a signed token from the operator's portal (D79): the tool sends its customer's\nbrowser there. Token valid for ten minutes at most, single use. Success: session opened\n(cookie) and return to the portal; rejected: login page with `?sso=<code>` (`ferme`,\n`invalide`, `expire`, `deja_utilise`, `compte_inconnu`, `compte_inactif`).", "operationId": "connexionSsoJeton", "parameters": [{"name": "jeton", "in": "query", "description": "JWT token signed with HS256 by the operator's tool.", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "Page that opens the portal, with the session cookie; or the login page and the reason for refusal"}, "429": {"description": "`trop_de_requetes`: too many attempts from this address", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/sso/oidc/debut": {"post": {"tags": ["connexion"], "summary": "Starts login through the directory of the account's organization: returns the URL to\nsend the browser to. 404 `sso_absent` if no directory applies to this address.", "operationId": "debutSsoOidc", "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/DebutOidc"}}}, "required": true}, "responses": {"200": {"description": "Directory URL", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/RedirectionOidc"}}}}, "404": {"description": "`sso_absent`: no directory for this address", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "429": {"description": "`trop_de_requetes`: too many attempts from this address", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "502": {"description": "`oidc_injoignable`: directory unreachable", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/sso/oidc/retour": {"get": {"tags": ["connexion"], "summary": "Identity provider callback: the code is exchanged for the `id_token`, verified, then the session is\nopened and the portal displayed; otherwise the sign-in page with `?sso=<code>` (`invalide`,\n`expire`, `compte_inconnu`, `compte_inactif`, `annule`).", "operationId": "retourSsoOidc", "parameters": [{"name": "code", "in": "query", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "state", "in": "query", "required": false, "schema": {"type": ["string", "null"]}}, {"name": "error", "in": "query", "description": "Rejected by the identity provider (the user canceled, for example).", "required": false, "schema": {"type": ["string", "null"]}}], "responses": {"200": {"description": "Page that opens the portal, with the session cookie; or the login page and the reason for refusal"}, "429": {"description": "`trop_de_requetes`: too many attempts from this address", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/utilisateurs/{id}": {"delete": {"tags": ["clients"], "summary": "Deletes an account and its extension: extension, voicemail box and messages, call restrictions.\nRefused while the customer's published call flow leads to the extension: modify the call flow first.\nA phone left configured will not get the site banned for 30 days; uninstall it.\nNever one's own account.", "operationId": "supprimerCompte", "parameters": [{"name": "id", "in": "path", "description": "User", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Account (and extension) deleted"}, "403": {"description": "`interdit`: permissions `utilisateur.modifier` and `poste.creer`, account out of scope, or own account", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`poste_utilise`: the published call flow leads to the extension (modules in the details)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}, "patch": {"tags": ["clients"], "summary": "Modifies an account: name (used as its extension's display name), email address, role of the same\nlevel, disabling or re-enabling, phone-only restriction (D107). When disabled, the account\nloses its sessions, no longer counts towards the license (D71), and its extension is put out of service (it\nno longer registers, neither receives nor makes calls; its voicemail and settings\nremain). Never one's own role or status. The email address is the sign-in\nidentifier: never that of an account with a higher role; when changed, it closes the account's sessions and\nauthorized applications, cancels its pending invitation or forgotten-password\nlinks, and notifies the old and the new address (a new invitation goes\nto the new one if the account has not chosen its password yet); the before and after go\nto the audit log.", "operationId": "modifierCompte", "parameters": [{"name": "id", "in": "path", "description": "User", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/ModificationCompte"}}}, "required": true}, "responses": {"204": {"description": "Account updated"}, "403": {"description": "`interdit`: permission `utilisateur.modifier`, account out of reach, one's own role or status, or the address of an account with a higher role; `licence_bloquee`: reactivation refused, license expired more than 30 days ago (D78); `ajout_utilisateurs_non_autorise`: reactivation by a customer account while the operator does not let it add users (D121)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`courriel_pris`: address already used by another account", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`nom_invalide`, `courriel_invalide`, `role_invalide`, `texte_interdit`, `telephone_seulement_invalide` (an admin cannot be restricted to the phone)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/utilisateurs/{id}/donnees": {"get": {"tags": ["clients"], "summary": "Export of a user's personal data (right of access and portability), as JSON.\nBy the person themselves or an admin of their organization (`utilisateur.modifier`). The\nnumbers are shown in full for the person and whoever may see them (D60), masked otherwise. Logged.", "operationId": "exporterDonneesPersonnelles", "parameters": [{"name": "id", "in": "path", "description": "User", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Personal data", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/DonneesPersonnelles"}}}}, "403": {"description": "`interdit`: neither the person nor an admin of their organization", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/utilisateurs/{id}/effacement": {"post": {"tags": ["clients"], "summary": "Erases a user (right to erasure): account, extension, voicemail and messages, and the\nrecordings of their extension's calls. CDRs remain (one-year retention\nobligation, CPCE L34-1), as does the audit log. By an admin of their organization; never their own\naccount. Rejected while the published call flow leads to their extension (`poste_utilise`).", "operationId": "effacerUtilisateur", "parameters": [{"name": "id", "in": "path", "description": "User", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "User deleted"}, "403": {"description": "`interdit`: permissions `utilisateur.modifier` and `poste.creer`, account out of scope, or own account", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`poste_utilise`: the published call flow leads to the extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/utilisateurs/{id}/invitation": {"post": {"tags": ["clients"], "summary": "Sends (or resends) a user's invitation: a new link to choose their\npassword, to their email address; the previous link stops working. Also used for forgotten\npasswords. Permission `utilisateur.modifier` on the account's organization.", "operationId": "envoyerInvitation", "parameters": [{"name": "id", "in": "path", "description": "User", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"200": {"description": "Invitation sent", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/InvitationEnvoyee"}}}}, "403": {"description": "`interdit` (permission `utilisateur.modifier`), account inactive or out of scope", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`smtp_absent`: no email server configured by the operator", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "502": {"description": "`smtp_echec`: the server refused or did not respond (server details)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/utilisateurs/{id}/poste": {"post": {"tags": ["clients"], "summary": "Gives an extension to a customer account that has none (created without a phone, or by the\ncompany directory): same rules and same settings as when creating a team member with an\nextension (extension, voicemail, the customer's hold music, display name = account name). An\naccount has a single extension: to change it, create the new team member, then delete the\nold one.", "operationId": "attribuerPoste", "parameters": [{"name": "id", "in": "path", "description": "User", "required": true, "schema": {"type": "string", "format": "uuid"}}], "requestBody": {"content": {"application/json": {"schema": {"$ref": "#/components/schemas/NouveauPosteDuCompte"}}}, "required": true}, "responses": {"201": {"description": "Extension created and attached to the account", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/UtilisateurClient"}}}}, "403": {"description": "`interdit` (permission `poste.creer` on the account's customer, or account out of reach); `ajout_utilisateurs_non_autorise`: customer account while the operator does not let it add extensions (D121); `licence_bloquee`: license expired more than 30 days ago (D78)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "409": {"description": "`poste_deja_attribue`: the account already has an extension; `poste_existant`: number taken; `numero_de_module`: internal number of a call flow module", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}, "422": {"description": "`poste_invalide`, `poste_numero_urgence`; `poste_hors_client`: only a customer's accounts have an extension", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/utilisateurs/{id}/second-facteur/reinitialisation": {"post": {"tags": ["clients"], "summary": "Resets a user's second factor (lost phone, misplaced passkey): TOTP,\npasskeys and backup codes deleted, sessions closed; the user sets up a new one at their\nnext sign-in. Restricted to an admin **of the parent level** (§6): ancestor\norganization, or customer admin for a regular user of their customer. Never one's own account,\nnever through an API key.", "operationId": "reinitialiserSecondFacteur", "parameters": [{"name": "id", "in": "path", "description": "User", "required": true, "schema": {"type": "string", "format": "uuid"}}], "responses": {"204": {"description": "Second factor reset"}, "403": {"description": "`interdit`: not allowed, same level, own account, or API key", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}, "security": [{"session": []}]}}, "/api/v1/webhooks/audio": {"get": {"tags": ["webhooks"], "summary": "Audio of a voicemail message, via the `voicemail.new` webhook link (no session: the signed\ntoken identifies the message, seven days).", "operationId": "telechargerMessageVocal", "parameters": [{"name": "jeton", "in": "query", "description": "Token received in the `cdr.month` webhook.", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "WAV (MP3 for a message from the fallback voicemail)", "content": {"audio/wav": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}}, "404": {"description": "`introuvable`: invalid or expired token, message deleted", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/webhooks/cdr.csv": {"get": {"tags": ["webhooks"], "summary": "CSV of one month for the customer base, via the `cdr.month` webhook link (no session: the signed token\nidentifies the organization and the month, seven days).", "operationId": "telechargerCdrDuMois", "parameters": [{"name": "jeton", "in": "query", "description": "Token received in the `cdr.month` webhook.", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "CSV of the month (same as the customer base export)", "content": {"text/csv": {"schema": {"type": "string"}}}}, "404": {"description": "`introuvable`: invalid or expired token", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}, "/api/v1/webhooks/enregistrement": {"get": {"tags": ["webhooks"], "summary": "Recording of a call, via the `call.recorded` webhook link (no session: the signed\ntoken identifies the call, seven days).", "operationId": "telechargerEnregistrement", "parameters": [{"name": "jeton", "in": "query", "description": "Token received in the `cdr.month` webhook.", "required": true, "schema": {"type": "string"}}], "responses": {"200": {"description": "MP3 (or WAV)", "content": {"audio/mpeg": {"schema": {"type": "array", "items": {"type": "integer", "format": "int32", "minimum": 0}}}}}, "404": {"description": "`introuvable`: invalid or expired token, recording deleted, option turned off (D111)", "content": {"application/json": {"schema": {"$ref": "#/components/schemas/Probleme"}}}}}}}}, "components": {"schemas": {"AccesMobile": {"type": "object", "description": "Mobile app activated on an extension (without its token).", "required": ["id", "nom", "identifiant", "prefixe", "cree_le", "vu_le"], "properties": {"id": {"type": "string", "format": "uuid"}, "nom": {"type": "string"}, "identifiant": {"type": "string"}, "prefixe": {"type": "string"}, "cree_le": {"type": "string", "format": "date-time"}, "vu_le": {"type": "string", "format": "date-time"}}}, "AccesSip": {"type": "object", "description": "Port and transport a phone registers on.", "required": ["transport", "port"], "properties": {"transport": {"type": "string", "description": "`udp`, `tcp` or `tls`."}, "port": {"type": "integer", "format": "int32", "minimum": 0}}}, "ActionEnAttente": {"type": "object", "description": "Write proposed by the assistant, to be confirmed.", "required": ["id", "outil", "description", "arguments"], "properties": {"id": {"type": "string"}, "outil": {"type": "string", "description": "Tool (API `operationId`)."}, "description": {"type": "string"}, "arguments": {}}}, "ActionExportee": {"type": "object", "required": ["horodatage", "action", "resultat"], "properties": {"horodatage": {"type": "string", "format": "date-time"}, "action": {"type": "string"}, "adresse_ip": {"type": ["string", "null"]}, "resultat": {"type": "string"}}}, "ActivationMobile": {"type": "object", "description": "Activation response: the device token, given only once.", "required": ["jeton_appareil", "api", "poste"], "properties": {"jeton_appareil": {"type": "string", "description": "Device token (`Authorization: Bearer cxmob_…`), to keep in the phone's secure\nstorage."}, "api": {"type": "string", "description": "Address of the instance's API."}, "poste": {"type": "string", "description": "Extension number."}}}, "AdressesAlerte": {"type": "object", "required": ["courriels"], "properties": {"courriels": {"type": "array", "items": {"type": "string"}, "description": "Email addresses that receive alerts; empty: no alerts."}}}, "Affectation": {"type": "object", "required": ["numero_id"], "properties": {"numero_id": {"type": "string", "format": "uuid"}}}, "AffichageMiseEnRoute": {"type": "object", "required": ["masquee"], "properties": {"masquee": {"type": "boolean", "description": "Hides (`true`) or shows again the home tile."}}}, "AnnonceDeposee": {"type": "object", "description": "An uploaded announcement.", "required": ["nature", "cible", "module", "taille", "modifiee_le"], "properties": {"nature": {"$ref": "#/components/schemas/Nature"}, "cible": {"type": "string", "description": "Module internal number, or E.164 for a number's pre-answer."}, "module": {"type": "string", "description": "Identifier of the module concerned (`svi:900`)."}, "taille": {"type": "integer", "format": "int64", "description": "Size of the served WAV, in bytes.", "minimum": 0}, "modifiee_le": {"type": "string", "format": "date-time"}}}, "ApercuMateriel": {"type": "object", "description": "Files produced for a fictitious device (passwords masked).", "required": ["fichiers"], "properties": {"fichiers": {"type": "array", "items": {"$ref": "#/components/schemas/FichierApercu"}}}}, "ApercuRevalorisation": {"type": "object", "description": "Preview (or result) of a re-rating: the calls whose amount changes, their totals before\nand after, the difference.", "required": ["appels", "avant", "apres", "ecart", "applique"], "properties": {"appels": {"type": "integer", "format": "int64", "description": "Calls whose amount changes.", "minimum": 0}, "avant": {"$ref": "#/components/schemas/TotauxNatures"}, "apres": {"$ref": "#/components/schemas/TotauxNatures"}, "ecart": {"$ref": "#/components/schemas/TotauxNatures", "description": "After minus before."}, "applique": {"type": "boolean", "description": "The amounts were written (otherwise: simulation)."}}}, "Appareil": {"type": "object", "required": ["agent", "ip"], "properties": {"agent": {"type": "string", "description": "Device `User-Agent`."}, "ip": {"type": "string", "description": "Address as seen by the telephony engine."}, "expire_dans": {"type": ["integer", "null"], "format": "int32", "description": "Seconds before the registration expires.", "minimum": 0}}}, "AppareilMateriel": {"type": "object", "description": "A desk phone (or a DECT base).", "required": ["id", "mac", "modele", "profil", "nom", "lignes", "touches", "parametres", "adresse_provisionnement", "rps_possible", "redemarrage_possible"], "properties": {"id": {"type": "string", "format": "uuid"}, "mac": {"type": "string", "description": "12 lowercase hexadecimal digits: the device's HTTP identifier."}, "modele": {"type": "string"}, "modele_nom": {"type": ["string", "null"]}, "profil": {"type": "string"}, "profil_nom": {"type": ["string", "null"]}, "nom": {"type": "string"}, "numero_de_serie": {"type": ["string", "null"]}, "lignes": {"type": "array", "items": {"$ref": "#/components/schemas/LigneAppareil"}}, "touches": {"type": "array", "items": {"$ref": "#/components/schemas/ToucheAppareil"}}, "parametres": {"type": "string", "description": "Additional parameters of the device (empty for the customer admin, who does not set\nthem)."}, "derniere_lecture": {"type": ["string", "null"], "description": "Last configuration read (RFC 3339), address and agent of that request."}, "derniere_adresse": {"type": ["string", "null"]}, "dernier_agent": {"type": ["string", "null"]}, "adresse_provisionnement": {"type": "string", "description": "Provisioning address to give the device."}, "rps_possible": {"type": "boolean", "description": "The profile uses the Yealink RPS (registration possible with the serial number)."}, "rps_etat": {"type": ["string", "null"], "description": "RPS registration: `declare` (registered), `echec` (failed, see `rps_message`), absent if never attempted."}, "rps_message": {"type": ["string", "null"], "description": "Message from YMCS after a failure."}, "redemarrage_possible": {"type": "boolean", "description": "The profile can restart its phones remotely."}}}, "AppareilMobile": {"type": "object", "description": "Registered mobile device (without its push token).", "required": ["id", "plateforme", "identifiant", "version_appli", "cree_le", "vu_le"], "properties": {"id": {"type": "string", "format": "uuid"}, "plateforme": {"type": "string"}, "identifiant": {"type": "string"}, "version_appli": {"type": "string"}, "cree_le": {"type": "string", "format": "date-time"}, "vu_le": {"type": "string", "format": "date-time"}}}, "Appel": {"type": "object", "description": "A call from the call log. Amounts in millionths of the instance currency, excluding tax, present\ndepending on the role and whether the call is rated (answered outbound call, D59).", "required": ["id", "debut", "sens", "appelant", "appele", "duree", "decroche", "issue", "cause", "enregistre"], "properties": {"id": {"type": "string", "format": "uuid"}, "debut": {"type": "string", "format": "date-time"}, "sens": {"type": "string", "description": "`entrant`, `sortant` or `interne`."}, "appelant": {"type": "string", "description": "E.164 (masked according to the customer's setting) or extension number."}, "appele": {"type": "string"}, "poste": {"type": ["string", "null"]}, "nom_appelant": {"type": ["string", "null"], "description": "Caller ID name of the calling extension, when the caller is one of the customer's extensions and it has one."}, "nom_appele": {"type": ["string", "null"], "description": "Caller ID name of the called extension, when the callee is one of the customer's extensions and it has one."}, "nom_poste": {"type": ["string", "null"], "description": "Caller ID name of the extension concerned (`poste`), if any."}, "duree": {"type": "integer", "format": "int32", "description": "Seconds, from creation to hangup."}, "decroche": {"type": "integer", "format": "int32", "description": "Answered seconds (voice greeting included, for an inbound call)."}, "issue": {"type": "string", "description": "`repondu`, `message` or `manque` for an inbound call (D66); `repondu` or `sans_reponse` otherwise."}, "cause": {"type": "string"}, "destination": {"type": ["string", "null"]}, "categorie": {"type": ["string", "null"], "description": "Outbound: category of the called number, seen from the customer's country (D124): `fixe` (North American plan: landlines and mobiles), `mobile`, `international`, `surtaxe`, `court`, `urgence` or `speciaux`; absent for an inbound or internal call."}, "secondes_facturees": {"type": ["integer", "null"], "format": "int32"}, "montant_client": {"type": ["integer", "null"], "format": "int64"}, "montant_revendeur": {"type": ["integer", "null"], "format": "int64"}, "montant_achat": {"type": ["integer", "null"], "format": "int64"}, "enregistre": {"type": "boolean", "description": "The call is recorded (D62: listening is reserved for the customer); always false when\nthe option is off for the customer (D111), the recording being kept."}, "renvoi_de": {"type": ["string", "null"], "format": "uuid", "description": "Outgoing leg placed for another call (forwarding to an outside number, D104): that call. The portal\nshows it as its \"connection\"; it is billed as an outgoing call."}, "en_relation": {"type": ["integer", "null"], "format": "int32", "description": "Inbound call forwarded to an outside number: seconds connected with the other party."}}}, "AppelEnCours": {"type": "object", "description": "An ongoing call (one leg, in the telephony engine's sense).", "required": ["uuid", "client_id", "client", "direction", "appelant", "appele", "etat", "application"], "properties": {"uuid": {"type": "string", "description": "Leg identifier (`uuid_kill` to hang it up)."}, "client_id": {"type": "string", "format": "uuid"}, "client": {"type": "string"}, "direction": {"type": "string", "description": "`inbound` or `outbound`, as seen by the telephony engine."}, "appelant": {"type": "string"}, "appele": {"type": "string"}, "etat": {"type": "string", "description": "`RINGING`, `ACTIVE`, `HELD`…"}, "application": {"type": "string", "description": "Current application (`bridge`, `ivr`, `playback`…)."}, "debut": {"type": ["string", "null"], "format": "date-time"}}}, "AppelExporte": {"type": "object", "required": ["debut", "sens", "appelant", "appele", "duree"], "properties": {"debut": {"type": "string", "format": "date-time"}, "sens": {"type": "string"}, "appelant": {"type": "string"}, "appele": {"type": "string"}, "duree": {"type": "integer", "format": "int32"}}}, "AppelsBloques": {"type": "object", "description": "Customer's blocked inbound calls.", "required": ["demarchage", "numeros"], "properties": {"demarchage": {"type": "boolean", "description": "Reject telemarketing (ranges reserved by ARCEP): French customers only (D124), no effect\nelsewhere."}, "numeros": {"type": "array", "items": {"$ref": "#/components/schemas/NumeroBloque"}}}}, "AppelsChiffres": {"type": "object", "required": ["actif"], "properties": {"actif": {"type": "boolean", "description": "SRTP offered to the customer's SIP phones (set up with SIP TLS and SRTP)."}}}, "ApplicationAutorisee": {"type": "object", "description": "Application the account has given access to.", "required": ["id", "application", "client_id", "hote", "autorisee_le"], "properties": {"id": {"type": "string", "format": "uuid", "description": "Authorization (to revoke it)."}, "application": {"type": "string", "description": "Name the application gives itself."}, "client_id": {"type": "string"}, "hote": {"type": "string", "description": "Host of its redirect address."}, "autorisee_le": {"type": "string", "format": "date-time"}, "derniere_utilisation": {"type": ["string", "null"], "format": "date-time"}}}, "ApplicationTrace": {"type": "object", "description": "An application executed on the call.", "required": ["nom", "donnees"], "properties": {"nom": {"type": "string"}, "donnees": {"type": "string"}}}, "Attente": {"type": "object", "required": ["ext", "nom", "agent", "attente_max", "appels_max"], "properties": {"ext": {"type": "string"}, "nom": {"type": "string"}, "agent": {"type": "string", "description": "The extension that answers (`100`)."}, "attente_max": {"type": "integer", "format": "int32", "description": "Maximum wait time, in seconds.", "minimum": 0}, "appels_max": {"type": "integer", "format": "int32", "description": "Maximum calls waiting.", "minimum": 0}}}, "AttributionGrille": {"type": "object", "description": "Rate table assigned to a customer or a reseller; absent: the default one.", "properties": {"grille": {"type": ["string", "null"], "format": "uuid"}}}, "BoiteVocale": {"type": "object", "description": "A voicemail box and its settings.", "required": ["poste", "active", "courriels", "piece_jointe", "garder_apres_courriel", "transcription", "annonce", "nouveaux", "lus"], "properties": {"poste": {"type": "string", "description": "Extension number, also the mailbox number."}, "active": {"type": "boolean", "description": "A caller can leave a message."}, "courriels": {"type": "array", "items": {"type": "string"}, "description": "Addresses each message is sent to; empty: no email."}, "piece_jointe": {"type": "boolean", "description": "The message is sent as an attachment."}, "garder_apres_courriel": {"type": "boolean", "description": "The message stays in the mailbox after the email."}, "transcription": {"type": "boolean", "description": "Messages are transcribed (D19)."}, "annonce": {"type": "boolean", "description": "A greeting is uploaded (otherwise the default greeting)."}, "annonce_texte": {"type": ["string", "null"], "description": "Text of the greeting, if it was read by the synthetic voice: to reuse to edit it."}, "nouveaux": {"type": "integer", "format": "int64"}, "lus": {"type": "integer", "format": "int64"}}}, "BouchonGrille": {"type": "object", "description": "Price of the `*` catch-all line of a sales grid (D110): it replaces the one from the CSV or\nthe source grid, without margin.", "required": ["prix_minute"], "properties": {"prix_minute": {"type": "string", "description": "Price per minute in the instance currency, excluding tax (`0,50`)."}, "frais": {"type": ["string", "null"], "description": "Connection fee in the instance currency, excluding tax; absent: none."}, "palier": {"type": ["string", "null"], "description": "`minimum/increment` in seconds (`60/60`); absent: `60/60`."}}}, "Brouillon": {"type": "object", "description": "The customer's shared draft.", "required": ["contenu", "modifie_le", "verification"], "properties": {"contenu": {"$ref": "#/components/schemas/Parcours"}, "version_base": {"type": ["integer", "null"], "format": "int32", "description": "Published version it is based on; none: `null`."}, "modifie_le": {"type": "string", "format": "date-time"}, "verification": {"$ref": "#/components/schemas/Verification"}}}, "BudgetClient": {"type": "object", "description": "Monthly budget of a customer, this month's usage and current restriction.", "required": ["bloquer", "mois", "consommation"], "properties": {"montant": {"type": ["integer", "null"], "format": "int64", "description": "Monthly amount excluding tax at the customer's selling price, in millionths of the\ninstance currency; absent: no budget."}, "bloquer": {"type": "boolean", "description": "At the threshold, restrict outgoing calls to landlines and mobiles in the customer's country\n(otherwise, alert only)."}, "mois": {"type": "string", "description": "Current month in the customer's time zone (`YYYY-MM`)."}, "consommation": {"type": "integer", "format": "int64", "description": "Outgoing usage of the current month, at the customer's selling price (the amounts of the\ncall log)."}, "restriction": {"oneOf": [{"$ref": "#/components/schemas/RestrictionBudget", "description": "Current restriction; absent: none."}, {"type": "null"}]}}}, "CaseChaleur": {"type": "object", "description": "Calls received on one day of the week, at one hour.", "required": ["jour_semaine", "heure", "recus", "manques"], "properties": {"jour_semaine": {"type": "integer", "format": "int32", "description": "1 (Monday) to 7 (Sunday)."}, "heure": {"type": "integer", "format": "int32", "description": "0 to 23."}, "recus": {"type": "integer", "format": "int64"}, "manques": {"type": "integer", "format": "int64"}}}, "CauseEchec": {"type": "object", "description": "A failure cause and its number of calls.", "required": ["cause", "appels"], "properties": {"cause": {"type": "string", "description": "Call end cause (`CALL_REJECTED`, `NORMAL_TEMPORARY_FAILURE`…)."}, "appels": {"type": "integer", "format": "int64"}}}, "Certificat": {"type": "object", "required": ["hote", "lets_encrypt_possible"], "properties": {"hote": {"type": "string", "description": "The instance's host name (`KANADR_URL_PUBLIQUE`)."}, "lets_encrypt_possible": {"type": "boolean", "description": "Let's Encrypt possible: public address in `https://` on a domain name."}, "servi": {"oneOf": [{"$ref": "#/components/schemas/CertificatServi", "description": "Certificate nginx serves for this host; absent if it does not answer over HTTPS."}, {"type": "null"}]}, "demande": {"oneOf": [{"$ref": "#/components/schemas/DemandeCertificat", "description": "Last Let's Encrypt certificate request, if there was one."}, {"type": "null"}]}}}, "CertificatServi": {"type": "object", "required": ["emetteur", "sujet", "expire_le", "autosigne"], "properties": {"emetteur": {"type": "string", "description": "Issuer (`O=Let's Encrypt, CN=R11`)."}, "sujet": {"type": "string", "description": "Subject (`CN=pbx.operateur.exemple`)."}, "expire_le": {"type": "string", "format": "date-time", "description": "End of validity."}, "autosigne": {"type": "boolean", "description": "Self-signed certificate (the machine's own, from the first boot)."}}}, "Changement": {"type": "object", "required": ["nature"], "properties": {"nature": {"type": "string", "description": "`poste` (an extension registered) or `appel` (a call started or ended): the state is to be read again."}}}, "ChangementEtat": {"type": "object", "required": ["etat"], "properties": {"etat": {"type": "string", "description": "`libre`, `porte_sortant` or `resilie`. A number at a customer can only go to\n`porte_sortant`, which removes it from the customer like a removal."}}}, "ChoixNumeroPresente": {"type": "object", "properties": {"numero_id": {"type": ["string", "null"], "format": "uuid", "description": "A customer number; missing or `null`: no caller ID."}}}, "Cle": {"type": "object", "required": ["id", "organisation_id", "nom", "role", "prefixe", "cree_le"], "properties": {"id": {"type": "string", "format": "uuid"}, "organisation_id": {"type": "string", "format": "uuid"}, "nom": {"type": "string"}, "role": {"type": "string"}, "permissions": {"type": ["array", "null"], "items": {"type": "string"}}, "prefixe": {"type": "string", "description": "Start of the key, to recognize it."}, "cree_le": {"type": "string", "format": "date-time"}, "expire_le": {"type": ["string", "null"], "format": "date-time"}, "revoquee_le": {"type": ["string", "null"], "format": "date-time"}, "derniere_utilisation": {"type": ["string", "null"], "format": "date-time"}}}, "CleCreee": {"allOf": [{"$ref": "#/components/schemas/Cle"}, {"type": "object", "required": ["secret"], "properties": {"secret": {"type": "string", "description": "The key, to send in `Authorization: Bearer`. It will not be shown again."}}}], "description": "Key created: the secret is given only here, once."}, "CleSsoJeton": {"type": "object", "required": ["cle", "audience"], "properties": {"cle": {"type": "string", "description": "HS256 key to give to the operator's tool; shown this time only."}, "audience": {"type": "string"}}}, "Client": {"type": "object", "required": ["id", "nom", "domaine", "domaine_uuid", "parent_id", "actif", "utilisateurs", "enregistrement_autorise", "ajout_utilisateurs_autorise", "pays"], "properties": {"id": {"type": "string", "format": "uuid"}, "nom": {"type": "string"}, "domaine": {"type": "string"}, "domaine_uuid": {"type": "string", "format": "uuid", "description": "The customer's SIP domain, in the telephony engine."}, "parent_id": {"type": "string", "format": "uuid", "description": "Operator or reseller the customer depends on."}, "actif": {"type": "boolean", "description": "`false`: customer suspended (accounts cannot sign in, telephony stopped)."}, "utilisateurs": {"type": "integer", "format": "int64", "description": "Customer accounts (users and admins, active or not)."}, "enregistrement_autorise": {"type": "boolean", "description": "Call recording allowed by the operator or the reseller (D111); off: no\nsettings and no playback in the customer area."}, "ajout_utilisateurs_autorise": {"type": "boolean", "description": "The customer admin can add users and extensions (D121), as chosen by\nthe operator or the reseller; off by default: only they add them."}, "pays": {"type": "string", "description": "Customer's country (D124, code from `GET /pays`): the portal reads and displays the numbers\non its screens in its numbering plan, as the server reads its entries."}}}, "ClientTableau": {"type": "object", "description": "A ranked customer: its outbound calls over the period.", "required": ["client_id", "nom", "appels", "secondes_facturees"], "properties": {"client_id": {"type": "string", "format": "uuid"}, "nom": {"type": "string"}, "appels": {"type": "integer", "format": "int64"}, "secondes_facturees": {"type": "integer", "format": "int64"}, "ventes": {"type": ["integer", "null"], "format": "int64"}}}, "Code": {"type": "object", "required": ["code"], "properties": {"code": {"type": "string", "description": "6-digit TOTP code, or backup code."}}}, "CodeDeConnexion": {"type": "object", "required": ["code"], "properties": {"code": {"type": "string", "description": "6-digit TOTP code, or backup code."}, "confiance": {"type": "boolean", "description": "Trust this browser for 30 days (trusted device, D53, D76): no more\ncode, and a 30-day session; cookie `appareil` set with the session."}}}, "CodesDeSecours": {"type": "object", "description": "Backup codes, shown only once.", "required": ["codes_de_secours"], "properties": {"codes_de_secours": {"type": "array", "items": {"type": "string"}}}}, "CompteEquipe": {"type": "object", "required": ["id", "courriel", "nom", "role", "actif"], "properties": {"id": {"type": "string", "format": "uuid"}, "courriel": {"type": "string"}, "nom": {"type": "string"}, "role": {"type": "string"}, "actif": {"type": "boolean"}, "invitation_envoyee": {"type": ["boolean", "null"], "description": "On creation only: was the invitation sent by email? `false` when no email server\nis configured, or if the server rejected it (resend with\n`POST /utilisateurs/{id}/invitation`)."}}}, "CompteExporte": {"type": "object", "required": ["id", "nom", "courriel", "role", "actif", "organisation", "cree_le"], "properties": {"id": {"type": "string", "format": "uuid"}, "nom": {"type": "string"}, "courriel": {"type": "string"}, "role": {"type": "string"}, "actif": {"type": "boolean"}, "organisation": {"type": "string"}, "cree_le": {"type": "string", "format": "date-time"}}}, "Conference": {"type": "object", "required": ["ext", "nom", "code_participant", "code_moderateur", "attendre_moderateur", "participants_max"], "properties": {"ext": {"type": "string"}, "nom": {"type": "string"}, "code_participant": {"type": "string"}, "code_moderateur": {"type": "string"}, "attendre_moderateur": {"type": "boolean", "description": "Participants wait for the moderator."}, "participants_max": {"type": "integer", "format": "int32", "minimum": 0}}}, "Confirmation": {"type": "object", "required": ["id", "accepter"], "properties": {"id": {"type": "string", "description": "Pending tool call (`tool_use`)."}, "accepter": {"type": "boolean"}}}, "Consommation": {"type": "object", "required": ["mois", "estimation", "jours", "jours_du_mois", "clients"], "properties": {"mois": {"type": "string", "description": "`AAAA-MM`."}, "estimation": {"type": "boolean", "description": "Current month: plan fees estimated pro rata of elapsed days and current users."}, "jours": {"type": "integer", "format": "int32", "description": "Days of the month counted for plan fees (elapsed, today included, for the current\nmonth).", "minimum": 0}, "jours_du_mois": {"type": "integer", "format": "int32", "description": "Days in the month.", "minimum": 0}, "clients": {"type": "array", "items": {"$ref": "#/components/schemas/ConsommationClient"}}}}, "ConsommationClient": {"type": "object", "description": "A customer's usage for the month. Amounts in millionths of the instance currency, excluding tax; omitted when the\nrate sheet level does not apply or is not visible.", "required": ["client_id", "nom", "appels", "secondes_facturees", "utilisateurs", "marge"], "properties": {"client_id": {"type": "string", "format": "uuid"}, "nom": {"type": "string"}, "revendeur_id": {"type": ["string", "null"], "format": "uuid", "description": "The customer's reseller, if any."}, "appels": {"type": "integer", "format": "int64", "description": "Answered outbound calls with a price (D59)."}, "secondes_facturees": {"type": "integer", "format": "int64"}, "montant_achat": {"type": ["integer", "null"], "format": "int64", "description": "Operator's purchase price; visible to the operator only."}, "montant_revendeur": {"type": ["integer", "null"], "format": "int64", "description": "Sale from the operator to the reseller."}, "montant_client": {"type": ["integer", "null"], "format": "int64", "description": "Sale to the customer."}, "utilisateurs": {"type": "integer", "format": "int64", "description": "Users counted for plan fees (D71): current ones for the current month, otherwise those\nof the month's last licence report (current ones if there is none)."}, "forfait_revendeur": {"type": ["integer", "null"], "format": "int64", "description": "Indicative plan fee sold by the operator to the reseller for this customer, for the month (D120);\nomitted: direct customer or no plan fee."}, "forfait_client": {"type": ["integer", "null"], "format": "int64", "description": "Indicative plan fee sold to the customer, for the month; omitted: no plan fee."}, "marge": {"type": "integer", "format": "int64", "description": "The organization's indicative margin on the customer: plan fees and calls sold minus\nplan fees and calls bought (a missing amount counts as zero)."}}}, "ContactPersonnel": {"type": "object", "description": "A personal contact.", "required": ["id", "nom", "numeros", "modifie_le"], "properties": {"id": {"type": "string", "format": "uuid"}, "nom": {"type": "string"}, "entreprise": {"type": ["string", "null"]}, "numeros": {"type": "array", "items": {"type": "string"}, "description": "E.164, in the given order."}, "modifie_le": {"type": "string", "format": "date-time"}}}, "ContactRepertoire": {"type": "object", "description": "An entry of the shared phonebook.", "required": ["id", "nom", "numero"], "properties": {"id": {"type": "string", "format": "uuid"}, "nom": {"type": "string"}, "numero": {"type": "string", "description": "E.164."}}}, "ContactTelephone": {"type": "object", "description": "A softphone contact.", "required": ["id", "nom", "numero", "poste", "modifiable"], "properties": {"id": {"type": "string"}, "nom": {"type": "string"}, "numero": {"type": "string", "description": "Number dialed: an extension, or an E.164 number."}, "poste": {"type": "boolean", "description": "`true`: another extension of the customer; `false`: its shared directory."}, "modifiable": {"type": "boolean", "description": "Directory entry the account can change or delete: all of them for the customer's admin,\nthose it added for a user (open directory)."}}}, "ContenuProfil": {"type": "object", "description": "Content of a profile: what the operator edits and the history keeps.", "required": ["modeles", "fichiers", "gabarits", "resynchronisation", "parametres", "premiere_touche", "combines", "tls"], "properties": {"modeles": {"type": "array", "items": {"$ref": "#/components/schemas/ModeleMateriel"}}, "fichiers": {"type": "array", "items": {"$ref": "#/components/schemas/FichierServi"}}, "gabarits": {"type": "object", "description": "Templates (Jinja syntax) by key; variables documented in the operator guide.", "additionalProperties": {"type": "string"}, "propertyNames": {"type": "string"}}, "resynchronisation": {"type": "string", "description": "Event of the resynchronisation NOTIFY (`check-sync`, `resync`)."}, "redemarrage": {"type": "string", "description": "Event of the restart NOTIFY (`check-sync;reboot=true`); empty: no remote restart."}, "parametres": {"type": "string", "description": "Additional parameters of the profile, one `key = value` line each."}, "premiere_touche": {"type": "integer", "format": "int32", "description": "First free programmable key; 0 without keys.", "minimum": 0}, "combines": {"type": "boolean", "description": "A device line designates a handset (DECT base)."}, "tls": {"type": "boolean", "description": "The models can do SIP over TLS (encrypted calls, D92)."}}}, "Conversation": {"type": "object", "required": ["messages"], "properties": {"messages": {"type": "array", "items": {}, "description": "Conversation messages, in the Anthropic Messages API format (roles `user` and\n`assistant`), as returned by the previous call, plus the new message."}, "confirmation": {"oneOf": [{"$ref": "#/components/schemas/Confirmation", "description": "Response to the pending write."}, {"type": "null"}]}}}, "DebutOidc": {"type": "object", "required": ["courriel"], "properties": {"courriel": {"type": "string", "description": "Address entered on the login page."}}}, "DemandeActivation": {"type": "object", "description": "What the app sends to activate.", "required": ["jeton", "identifiant"], "properties": {"jeton": {"type": "string", "description": "Token of the setup link (`jeton` parameter of the QR code)."}, "identifiant": {"type": "string", "description": "Stable identifier of the installation (the same as when registering the push token)."}, "nom": {"type": "string", "description": "Name of the device, shown in the user page (\"Paul's iPhone\")."}}}, "DemandeApercu": {"type": "object", "description": "Preview of a profile, saved or being written.", "required": ["modele"], "properties": {"profil": {"type": ["string", "null"], "description": "Saved profile; ignored if `contenu` is given."}, "contenu": {"oneOf": [{"$ref": "#/components/schemas/ContenuProfil", "description": "Content not saved yet."}, {"type": "null"}]}, "modele": {"type": "string", "description": "Model code of the fictitious device."}}}, "DemandeCertificat": {"type": "object", "required": ["etat"], "properties": {"etat": {"type": "string", "description": "`en_attente` (request written, service not started yet), `en_cours`, `reussi` or `echec`."}, "debut": {"type": ["string", "null"], "format": "date-time", "description": "Start of the last run."}, "fin": {"type": ["string", "null"], "format": "date-time", "description": "End of the last run."}, "journal": {"type": ["string", "null"], "description": "End of the certbot log (to diagnose a failure)."}}}, "DemandeCle": {"type": "object", "required": ["nom", "role"], "properties": {"nom": {"type": "string", "description": "Purpose of the key (e.g. \"CRM\", \"billing\")."}, "role": {"type": "string", "description": "Predefined role, at the organization's level (`admin_client`, `utilisateur`…)."}, "permissions": {"type": ["array", "null"], "items": {"type": "string"}, "description": "Allowlist of permissions (`client.lire`…); absent: all those of the role."}, "expire_le": {"type": ["string", "null"], "format": "date-time", "description": "Expiration (RFC 3339), optional."}}}, "DemandeInstallation": {"type": "object", "properties": {"courriel": {"type": ["string", "null"], "description": "Address that receives the link; omitted: the extension owner's address."}}}, "DemandeOauth": {"type": "object", "description": "An application's authorization request, shown to the user before they agree.", "required": ["id", "application", "client_id", "hote", "boucle_locale", "portee"], "properties": {"id": {"type": "string", "format": "uuid"}, "application": {"type": "string", "description": "Name the application gives itself: declared by it, not verified."}, "client_id": {"type": "string", "description": "Client identifier: `cxcl_…` (registered), or the address of its document."}, "hote": {"type": "string", "description": "Host that will receive the access, as the redirect will read it: that of the expected assistant\n(`claude.ai`, `chatgpt.com`…)."}, "hote_du_client": {"type": ["string", "null"], "description": "Client described by a document: the host that publishes it, the only verified identity."}, "boucle_locale": {"type": "boolean", "description": "Redirect to this very computer (installed application, such as Claude Code): only\naccept if you just started it."}, "portee": {"type": "string", "description": "`mcp`, and `offline_access` if the application stays connected without asking again."}}}, "DemandeOubli": {"type": "object", "required": ["courriel"], "properties": {"courriel": {"type": "string"}}}, "DemandePcap": {"type": "object", "required": ["messages"], "properties": {"messages": {"type": "array", "items": {"$ref": "#/components/schemas/MessagePcap"}, "description": "Messages, in order (those of the `sip` lines of a capture)."}}}, "DemandePublication": {"type": "object", "properties": {"note": {"type": "string", "description": "Free-form version note."}}}, "DemandeRevalorisation": {"type": "object", "description": "Period of a recalculation, in days of the customer's time zone, and whether to apply it.", "required": ["du"], "properties": {"du": {"type": "string", "format": "date", "description": "First day (`YYYY-MM-DD`), from midnight in the customer's time zone."}, "au": {"type": ["string", "null"], "format": "date", "description": "Last day, included; absent: until now."}, "appliquer": {"type": "boolean", "description": "Writes the recalculated amounts; absent or false: preview only."}}}, "DepuisGrille": {"type": "object", "description": "Rate table derived from another, with prices and fees marked up by a margin.", "required": ["grille", "marge"], "properties": {"grille": {"type": "string", "format": "uuid"}, "marge": {"type": "integer", "format": "int32", "description": "Margin in percent (35: price × 1.35), rounded up to the nearest millionth.", "minimum": 0}}}, "Destination": {"type": "object", "properties": {"poste": {"type": ["string", "null"], "description": "Customer extension; missing or `null`: the number is no longer routed."}}}, "DestinationBloquee": {"type": "object", "required": ["prefixe"], "properties": {"prefixe": {"type": "string", "description": "E.164 prefix (`+882`, `+3389`)."}, "description": {"type": ["string", "null"]}}}, "DestinationTableau": {"type": "object", "description": "Answered outbound calls to a category of numbers.", "required": ["categorie", "appels", "secondes_facturees"], "properties": {"categorie": {"type": "string", "description": "Category seen from the country of the calling customer (D124): `fixe` (landline; North American plan: landlines and mobiles), `mobile`, `international`, `surtaxe` (premium rate), `court` (short number), `urgence` (emergency) or `speciaux` (freephone, shared cost…)."}, "appels": {"type": "integer", "format": "int64"}, "secondes_facturees": {"type": "integer", "format": "int64"}, "ventes": {"type": ["integer", "null"], "format": "int64"}}}, "DeviseInstance": {"type": "object", "description": "Instance currency.", "required": ["devise", "devises", "modifiable"], "properties": {"devise": {"type": "string", "description": "ISO 4217 code: `EUR` (default), `CHF`, `GBP`, `USD` or `CAD`. All amounts in the\nAPI are in millionths of this currency."}, "devises": {"type": "array", "items": {"type": "string"}, "description": "Supported currencies, in the order of the portal lists."}, "modifiable": {"type": "boolean", "description": "False as soon as a rate table exists or a call has been rated: the currency can no\nlonger change (amounts are not converted)."}}}, "Diff": {"type": "object", "description": "Modules added, removed or modified (content or outputs), by identifier, sorted.", "required": ["ajoutes", "retires", "modifies"], "properties": {"ajoutes": {"type": "array", "items": {"type": "string"}}, "retires": {"type": "array", "items": {"type": "string"}}, "modifies": {"type": "array", "items": {"type": "string"}}}}, "DifferenceGabarit": {"type": "object", "description": "Differences of a template.", "required": ["gabarit", "lignes"], "properties": {"gabarit": {"type": "string"}, "lignes": {"type": "array", "items": {"$ref": "#/components/schemas/LigneDifferenceProfil"}}}}, "DifferencesProfil": {"type": "object", "description": "Differences between a copy and the current shipped version of its original profile.", "required": ["origine", "origine_version", "version_livree", "nouvelle_version", "gabarits"], "properties": {"origine": {"type": "string"}, "origine_version": {"type": "integer", "format": "int32", "minimum": 0}, "version_livree": {"type": "integer", "format": "int32", "minimum": 0}, "nouvelle_version": {"type": "boolean"}, "gabarits": {"type": "array", "items": {"$ref": "#/components/schemas/DifferenceGabarit"}}}}, "Disposition": {"type": "object", "required": ["positions"], "properties": {"positions": {"type": "object", "description": "Position of each manually moved module, by identifier (`svi:900`); the others are\nplaced automatically.", "additionalProperties": {"$ref": "#/components/schemas/Position"}, "propertyNames": {"type": "string"}}}}, "DispositionAccueil": {"type": "object", "description": "Home page layout of a space.", "properties": {"instances": {"type": ["array", "null"], "items": {"$ref": "#/components/schemas/InstanceAccueil"}, "description": "Instances in display order; absent: the default layout."}}}, "Domaines": {"type": "object", "required": ["hote", "adresses"], "properties": {"hote": {"type": "string", "description": "The instance's host name (`KANADR_URL_PUBLIQUE`)."}, "adresses": {"type": "array", "items": {"type": "string"}, "description": "IPv4 and IPv6 addresses the DNS gives for this host (empty: it does not resolve)."}, "suffixe": {"type": ["string", "null"], "description": "Customer domain suffix (D108), if set."}, "generique": {"type": ["array", "null"], "items": {"type": "string"}, "description": "Addresses the DNS gives for any name under the suffix (wildcard record\n`*.<suffix>`); empty: no wildcard record. Absent without a suffix."}}}, "DonneesPersonnelles": {"type": "object", "description": "A user's personal data.", "required": ["exporte_le", "compte", "sessions", "actions", "appels", "messages", "applications", "contacts", "favoris"], "properties": {"exporte_le": {"type": "string", "format": "date-time"}, "compte": {"$ref": "#/components/schemas/CompteExporte"}, "poste": {"type": ["string", "null"]}, "sessions": {"type": "array", "items": {"$ref": "#/components/schemas/SessionExportee"}}, "actions": {"type": "array", "items": {"$ref": "#/components/schemas/ActionExportee"}, "description": "Their actions in the audit log (sign-ins included), the last 500."}, "appels": {"type": "array", "items": {"$ref": "#/components/schemas/AppelExporte"}, "description": "Calls of their extension, last twelve months."}, "messages": {"type": "array", "items": {"$ref": "#/components/schemas/MessageExporte"}}, "applications": {"type": "array", "items": {"$ref": "#/components/schemas/ApplicationAutorisee"}, "description": "Applications they have given access to (OAuth, MCP server), currently valid."}, "contacts": {"type": "array", "items": {"$ref": "#/components/schemas/ContactPersonnel"}, "description": "Their personal contacts in the softphone."}, "favoris": {"type": "array", "items": {"$ref": "#/components/schemas/Favori"}, "description": "Their favourites in the softphone, in order."}}}, "DuplicationProfil": {"type": "object", "description": "Copy of a profile (shipped or already copied).", "required": ["source", "nom"], "properties": {"source": {"type": "string", "description": "Copied profile: identifier of a shipped profile or uuid of a copy."}, "nom": {"type": "string"}}}, "Durees": {"type": "object", "description": "Durations configured on an organization; `null`: the one from the level above.", "properties": {"enregistrements_jours": {"type": ["integer", "null"], "format": "int32"}, "messages_jours": {"type": ["integer", "null"], "format": "int32"}, "cdr_jours": {"type": ["integer", "null"], "format": "int32"}}}, "EchecEnregistrement": {"type": "object", "description": "Trunk registration rejected by its provider.", "required": ["code", "motif", "le"], "properties": {"code": {"type": "integer", "format": "int32", "description": "SIP code (403, 408…).", "minimum": 0}, "motif": {"type": "string", "description": "Reason phrase given with the code (`Forbidden`…), as is."}, "le": {"type": "string", "format": "date-time"}}}, "EchecEnvoi": {"type": "object", "description": "Failure of a delivery: a stable code, translated by the portal (D81), and a technical detail\nwithout a sentence (HTTP status, network library message).", "required": ["code"], "properties": {"code": {"type": "string", "description": "`pas_https`, `identifiants`, `port`, `hote`, `adresse_privee` (address refused), `dns`\n(the host does not resolve), `reseau` (connection, timeout), `http` (non-2xx response)."}, "detail": {"type": ["string", "null"]}}}, "Enregistrement": {"type": "object", "description": "Recording setting of an extension (D103).", "required": ["actif"], "properties": {"actif": {"type": "boolean", "description": "All the extension's calls, received, outgoing and internal, are recorded."}}}, "EnregistrementAppel": {"type": "object", "description": "A call recording.", "required": ["id", "debut", "sens", "appelant", "appele", "duree"], "properties": {"id": {"type": "string", "format": "uuid", "description": "Call identifier (CDR)."}, "debut": {"type": "string", "format": "date-time"}, "sens": {"type": "string"}, "appelant": {"type": "string"}, "appele": {"type": "string"}, "poste": {"type": ["string", "null"]}, "duree": {"type": "integer", "format": "int32", "description": "Recording duration, in seconds."}}}, "EntreeAudit": {"type": "object", "description": "An audit log action.", "required": ["rang", "horodatage", "acteur_type", "acteur", "action", "canal", "resultat", "details"], "properties": {"rang": {"type": "integer", "format": "int64", "description": "Insertion order (pagination)."}, "horodatage": {"type": "string", "format": "date-time"}, "acteur_type": {"type": "string", "description": "`utilisateur`, `cle_api`, `systeme` or `cli`."}, "acteur": {"type": "string"}, "organisation_id": {"type": ["string", "null"], "format": "uuid"}, "organisation": {"type": ["string", "null"]}, "action": {"type": "string"}, "cible_type": {"type": ["string", "null"]}, "cible_id": {"type": ["string", "null"]}, "canal": {"type": "string"}, "adresse_ip": {"type": ["string", "null"]}, "resultat": {"type": "string"}, "details": {}}}, "Envoi": {"type": "object", "description": "A recent delivery, for diagnostics.", "required": ["evenement", "objet", "tentatives", "abandonne"], "properties": {"evenement": {"type": "string"}, "objet": {"type": "string"}, "tentatives": {"type": "integer", "format": "int32"}, "livre_le": {"type": ["string", "null"], "format": "date-time"}, "abandonne": {"type": "boolean"}, "derniere_erreur": {"oneOf": [{"$ref": "#/components/schemas/EchecEnvoi"}, {"type": "null"}]}}}, "Erreur": {"type": "object", "description": "Validation error: a stable code (translated in the portal, D81) and what it concerns,\nwithout text in any language.", "required": ["code", "objets"], "properties": {"code": {"type": "string"}, "objets": {"type": "array", "items": {"type": "string"}, "description": "Modules (`groupe:600`), links, outputs or values at fault."}}}, "ErreurGabaritMateriel": {"type": "object", "description": "Error in a template, with its position.", "required": ["gabarit", "message"], "properties": {"gabarit": {"type": "string"}, "message": {"type": "string"}, "ligne": {"type": ["integer", "null"], "minimum": 0}, "colonne": {"type": ["integer", "null"], "minimum": 0}}}, "EssaiSmtp": {"type": "object", "required": ["destinataire"], "properties": {"destinataire": {"type": "string", "description": "Address that receives the test email."}}}, "EssaiSynthese": {"type": "object", "properties": {"langue": {"type": ["string", "null"], "description": "Language of the test sentence and voice: `fr` (default) or `en`."}}}, "EssaiTranscription": {"type": "object", "required": ["texte"], "properties": {"texte": {"type": "string", "description": "Text returned by the service for one second of silence (often empty)."}}}, "EssaiVoixClient": {"type": "object", "properties": {"voix": {"type": ["string", "null"], "description": "Voice to listen to, among `…/voix/disponibles`; absent: the one that reads the customer's\nannouncements."}}}, "EtapeMiseEnRoute": {"type": "object", "required": ["etape", "etat"], "properties": {"etape": {"type": "string", "description": "`langue`, `identite`, `domaines`, `certificat`, `emails`, `reseau`, `fournisseur`,\n`numeros` or `premier_client`."}, "etat": {"type": "string", "description": "`a_faire`, `fait` or `passe` (set in the wizard)."}, "constate": {"type": ["boolean", "null"], "description": "Finding drawn from the settings: `true` if what the step sets already exists (operator\nlanguage or time zone chosen, brand, email server, trunk profile, number, customer);\nabsent when nothing can be found without a test (domains, certificate, network: see their\nroutes)."}}}, "EtapeTrace": {"type": "object", "description": "A step of a call's path through the dialplan.", "required": ["contexte", "numero", "extension"], "properties": {"contexte": {"type": "string", "description": "`public` (arriving through a trunk) or the customer's domain."}, "numero": {"type": "string"}, "extension": {"type": "string", "description": "Dialplan extension that took the call (`DID-…`, `Accueil`…)."}}}, "EtatAssistance": {"type": "object", "properties": {"ouvert_jusqu_a": {"type": ["string", "null"], "format": "date-time", "description": "End of the access if it is open; absent if it is closed."}}}, "EtatAssistant": {"type": "object", "description": "The assistant for the logged-in account.", "required": ["disponible", "budget_atteint"], "properties": {"disponible": {"type": "boolean", "description": "Set up and turned on by the operator (D94)."}, "budget_atteint": {"type": "boolean", "description": "Monthly budget reached (instance or customer): paused until next month."}}}, "EtatConnexion": {"type": "object", "description": "Result of a sign-in step.", "required": ["etape", "utilisateur"], "properties": {"etape": {"type": "string", "description": "`connecte`; `second_facteur` (TOTP or backup code expected on\n`/connexion/second-facteur`); `inscription_second_facteur` (mandatory second factor to\nset up on `/second-facteur/totp` before any other access)."}, "utilisateur": {"$ref": "#/components/schemas/Moi"}}}, "EtatHoraires": {"type": "object", "description": "Status of an opening hours schedule in the published call flow, in the customer's local time (its time zone, D81).", "required": ["ext", "nom", "ouvert"], "properties": {"ext": {"type": "string", "description": "Internal number of the schedule (`800`)."}, "nom": {"type": "string"}, "ouvert": {"type": "boolean"}, "jusqu_a": {"type": ["string", "null"], "description": "End of the current time slot, if open (`AAAA-MM-JJTHH:MM`, customer time)."}, "reouverture": {"type": ["string", "null"], "description": "Next opening within fifteen days, if closed (`AAAA-MM-JJTHH:MM`, customer's local time)."}}}, "EtatLicence": {"type": "object", "description": "Vendor license status (D78), for the portal.", "required": ["etat", "jours", "lecture_seule_le"], "properties": {"etat": {"type": "string", "description": "`valide`, `echue` (within the grace period) or `bloquee` (instance read-only for\nadministration; telephony keeps working)."}, "jusqu_au": {"type": ["string", "null"], "format": "date", "description": "Last day of validity; omitted: no license received."}, "jours": {"type": "integer", "format": "int64", "description": "Days remaining (`valide`) or elapsed since expiry (`echue`, `bloquee`)."}, "lecture_seule_le": {"type": "string", "format": "date", "description": "First read-only day (`YYYY-MM-DD`): the day after the 30-day grace period that follows\nthe end of the license (or, with no license received, the creation of the instance)."}, "utilisateurs_max": {"type": ["integer", "null"], "format": "int64", "description": "Number of users in the contract, if specified."}}}, "EtatParcours": {"type": "object", "description": "A customer's call flow: the served version and the current draft.", "required": ["pays", "feries"], "properties": {"publie": {"oneOf": [{"$ref": "#/components/schemas/VersionParcours"}, {"type": "null"}]}, "brouillon": {"oneOf": [{"$ref": "#/components/schemas/Brouillon"}, {"type": "null"}]}, "pays": {"type": "string", "description": "Customer's country (D124): that of external numbers and public holidays."}, "feries": {"type": "array", "items": {"$ref": "#/components/schemas/FerieDuPays"}, "description": "Public holidays offered by the customer's business hours (those of its country), in calendar order."}}}, "EtatPoste": {"type": "object", "required": ["poste", "inscrit", "appareils"], "properties": {"poste": {"type": "string"}, "nom": {"type": ["string", "null"], "description": "Extension display name."}, "inscrit": {"type": "boolean", "description": "Currently registered (at least one device)."}, "appareils": {"type": "array", "items": {"$ref": "#/components/schemas/Appareil"}, "description": "Devices currently registered."}, "derniere_inscription": {"type": ["string", "null"], "description": "Last registration seen (RFC 3339), even if the extension has gone offline since."}, "numero_presente": {"type": ["string", "null"], "description": "External caller ID, as saved."}}}, "Favori": {"type": "object", "description": "A favourite, in the chosen order.", "required": ["genre", "reference"], "properties": {"genre": {"$ref": "#/components/schemas/GenreFavori"}, "reference": {"type": "string", "description": "Contact identifier: the one from `/moi/telephone/contacts` (shared) or a personal\ncontact's."}}}, "FerieDuPays": {"type": "object", "description": "A public holiday offered in business hours.", "required": ["code", "par_defaut"], "properties": {"code": {"type": "string", "description": "Code stored in `feries_fermes` (`01-01`, `lundi_paques`, `thanksgiving`…)."}, "par_defaut": {"type": "boolean", "description": "Ticked when business hours are created."}, "date": {"type": ["string", "null"], "description": "Day off this year (`YYYY-MM-DD`), weekend substitution included."}, "date_suivante": {"type": ["string", "null"], "description": "Day off next year (`YYYY-MM-DD`)."}}}, "FichierApercu": {"type": "object", "description": "A preview file: its content, or the template error.", "required": ["motif", "gabarit"], "properties": {"motif": {"type": "string"}, "gabarit": {"type": "string"}, "contenu": {"type": ["string", "null"]}, "erreur": {"oneOf": [{"$ref": "#/components/schemas/ErreurGabaritMateriel"}, {"type": "null"}]}}}, "FichierLicence": {"type": "object", "description": "Vendor license, as issued (JSON file).", "required": ["contenu", "signature"], "properties": {"contenu": {"type": "string", "description": "JSON text of the license, signed as is."}, "signature": {"type": "string", "description": "Vendor's Ed25519 signature (hexadecimal)."}}}, "FichierServi": {"type": "object", "description": "A file the profile's phones request.", "required": ["motif", "gabarit", "type_contenu"], "properties": {"motif": {"type": "string", "description": "Requested name, with `{mac}` (that of the authenticated device) and `{chiffres}`; at most one\nslash."}, "gabarit": {"type": "string", "description": "Template that produces it."}, "type_contenu": {"type": "string", "description": "Served MIME type; an XML type escapes values."}}}, "FinAuthentification": {"type": "object", "required": ["reponse"], "properties": {"reponse": {"description": "Result of `navigator.credentials.get()`, serialized (binary data in base64url)."}, "confiance": {"type": "boolean", "description": "Trust this browser, like `confiance` in `/connexion/second-facteur`."}}}, "FinInscription": {"type": "object", "required": ["nom", "reponse"], "properties": {"nom": {"type": "string", "description": "Name given to the passkey (\"Office computer\")."}, "reponse": {"description": "Result of `navigator.credentials.create()`, serialized (binary data in base64url)."}}}, "Fonctions": {"type": "object", "required": ["revendeurs", "assistant"], "properties": {"revendeurs": {"type": "boolean", "description": "Resellers: menu, creation, reseller sale rate plans."}, "assistant": {"type": "boolean", "description": "AI assistant: menu, key and budget settings, conversations."}, "messagerie": {"type": "boolean", "description": "Voicemail: extension mailboxes, menu and settings, leaving and checking messages by\nphone, voicemail module of the call flow. Absent from the request: on."}, "appli_mobile": {"type": "boolean", "description": "In-house mobile app, prototype (D117): setup QR code in the user page, device tokens.\nMissing from the request: off."}}}, "Forfait": {"type": "object", "description": "Indicative monthly plan fee.", "required": ["mode", "montant"], "properties": {"mode": {"$ref": "#/components/schemas/ModeForfait"}, "montant": {"type": "integer", "format": "int64", "description": "Monthly amount excluding tax in millionths of the instance currency (per user or per\ncustomer), from 0 to 100,000 in that currency."}}}, "ForfaitsClient": {"type": "object", "description": "A customer's indicative plan fees, at both sales levels.", "required": ["utilisateurs", "vente_client"], "properties": {"utilisateurs": {"type": "integer", "format": "int64", "description": "The customer's users: active accounts of an active customer, as for the licence (D71)."}, "vente_revendeur": {"oneOf": [{"$ref": "#/components/schemas/NiveauForfait", "description": "Sale from the operator to the reseller for this customer; omitted for a direct customer."}, {"type": "null"}]}, "vente_client": {"$ref": "#/components/schemas/NiveauForfait", "description": "Sale to the customer."}}}, "Format": {"type": "object", "description": "Number format expected by the provider (D38). National format: `national`,\n`tel_que_compose`, `national`, PAI on the domain; E.164 format: `e164`, `plus`, `e164`, PAI\non the platform's public IP.", "required": ["appele_national", "appele_international", "numero_presente"], "properties": {"pays": {"type": "string", "description": "Provider's country (D124), that of its national format: code from `GET /pays`; `FR` by\ndefault."}, "appele_national": {"type": "string", "description": "Called number in the provider's country: `national` (`0…` in France), `e164` (`+33…`) or\n`e164_sans_plus` (`33…`)."}, "appele_international": {"type": "string", "description": "International called number: `prefixe_00`, `plus` or `tel_que_compose`."}, "numero_presente": {"type": "string", "description": "Caller ID: `national`, `e164` or `e164_sans_plus`."}, "hote_pai": {"type": ["string", "null"], "description": "P-Asserted-Identity host; absent: the customer's domain."}}}, "FuseauOrganisation": {"type": "object", "required": ["fuseau"], "properties": {"fuseau": {"type": "string", "description": "IANA name (`Europe/Paris`, `America/Martinique`…), from `GET /fuseaux`."}}}, "Garde": {"type": "object", "required": ["reglages", "bannies"], "properties": {"reglages": {"$ref": "#/components/schemas/ReglagesGarde"}, "bannies": {"type": "array", "items": {"$ref": "#/components/schemas/IpBannie"}, "description": "Active bans."}}}, "GenreFavori": {"type": "string", "description": "Kind of favourite.", "enum": ["commun", "personnel"]}, "Grille": {"type": "object", "required": ["ext", "nom", "semaine", "feries_fermes", "fermetures"], "properties": {"ext": {"type": "string"}, "nom": {"type": "string"}, "semaine": {"type": "array", "items": {"type": ["string", "null"]}, "description": "One `HH:MM-HH:MM` range per day (Monday first), `None`: closed."}, "pause": {"type": ["array", "null"], "items": false, "prefixItems": [{"type": "integer", "format": "int32", "minimum": 0}, {"type": "integer", "format": "int32", "minimum": 0}], "description": "Lunch break, in minutes since midnight; only splits the time ranges that strictly\ncontain it (production)."}, "feries_fermes": {"type": "array", "items": {"type": "string"}, "description": "Holidays when closed (codes from [`FERIES`]). Production stored the opposite (those when\nopen): a pitfall noted during the migration, avoided here."}, "fermetures": {"type": "array", "items": {"type": "string"}, "description": "Exceptional closures, `AAAA-MM-JJ`."}}}, "GrilleTarifaire": {"type": "object", "description": "A rate table, without its lines.", "required": ["id", "organisation", "nature", "nom", "effet", "par_defaut", "lignes", "bouchon"], "properties": {"id": {"type": "string", "format": "uuid"}, "organisation": {"type": "string", "format": "uuid", "description": "Owning organization (operator or reseller)."}, "nature": {"$ref": "#/components/schemas/NatureGrille"}, "nom": {"type": "string"}, "effet": {"type": "string", "format": "date", "description": "Effective date (a purchase rate sheet applies to calls from this day on)."}, "par_defaut": {"type": "boolean"}, "lignes": {"type": "integer", "format": "int64"}, "bouchon": {"type": "boolean", "description": "The grid has a `*` catch-all line (D110). Without it, a call to a missing destination is\nnot rated: to be flagged for a sales grid."}, "forfait": {"oneOf": [{"$ref": "#/components/schemas/Forfait", "description": "Default indicative plan fee of a sales rate table (D120), for the margin; omitted:\nnone."}, {"type": "null"}]}}}, "GrilleTarifaireDetaillee": {"allOf": [{"$ref": "#/components/schemas/GrilleTarifaire"}, {"type": "object", "required": ["lignes_detail"], "properties": {"lignes_detail": {"type": "array", "items": {"$ref": "#/components/schemas/LigneTarifaire"}}}}], "description": "A rate table and its lines, by prefix."}, "Groupe": {"type": "object", "required": ["ext", "nom", "strategie", "duree", "membres"], "properties": {"ext": {"type": "string"}, "nom": {"type": "string"}, "strategie": {"$ref": "#/components/schemas/Strategie"}, "duree": {"type": "integer", "format": "int32", "description": "Ring time of the ring group, in seconds.", "minimum": 0}, "membres": {"type": "array", "items": {"$ref": "#/components/schemas/Membre"}}}}, "HeureSimultanee": {"type": "object", "description": "Peak of concurrent calls in one hour.", "required": ["debut", "pic"], "properties": {"debut": {"type": "string", "format": "date-time"}, "pic": {"type": "integer", "format": "int64"}}}, "Identifiants": {"type": "object", "required": ["courriel", "mot_de_passe"], "properties": {"courriel": {"type": "string"}, "mot_de_passe": {"type": "string"}, "confiance": {"type": "boolean", "description": "Stay signed in on this browser for 30 days (trusted device, D53, D76).\nApplied here for an account without a second factor; otherwise, the choice is made at the\ncode step (`confiance` of `/connexion/second-facteur`)."}}}, "IdentifiantsAppareil": {"type": "object", "description": "HTTP credentials of the device, to configure it by hand.", "required": ["adresse", "identifiant", "mot_de_passe"], "properties": {"adresse": {"type": "string"}, "identifiant": {"type": "string"}, "mot_de_passe": {"type": "string"}}}, "InformationsSip": {"type": "object", "description": "What is needed to configure a SIP phone or app by hand, without the password\n(D114: it is requested separately).", "required": ["identifiant", "domaine", "acces"], "properties": {"identifiant": {"type": "string", "description": "SIP and authentication username: the extension number."}, "domaine": {"type": "string", "description": "SIP server (registrar) and domain of the customer, which is also the authentication realm: under\nthe instance suffix, it points to the instance through the wildcard DNS record (D108)."}, "proxy_sortant": {"type": ["string", "null"], "description": "Outbound proxy, only when the domain is not under the instance suffix (domain taken over as is,\ninstance without a suffix) and so may not point to it: the phone keeps the domain and reaches\nthis proxy."}, "acces": {"type": "array", "items": {"$ref": "#/components/schemas/AccesSip"}, "description": "Open ports and transports, from the most common to the encrypted one (D89)."}}}, "InscriptionMobile": {"type": "object", "description": "Registration of the mobile app, or refresh of its push token.", "required": ["plateforme", "jeton", "identifiant"], "properties": {"plateforme": {"type": "string", "description": "`ios` (APNs, PushKit VoIP) or `android` (FCM)."}, "jeton": {"type": "string", "description": "Push token of the device; the app also puts it in the `pn-prid` parameter of the\n`Contact` of its `REGISTER` (RFC 8599), to be recognised when it registers."}, "identifiant": {"type": "string", "description": "Stable identifier of the installation."}, "version_appli": {"type": "string"}}}, "InscriptionTotp": {"type": "object", "description": "Secret to enter in the authenticator app, displayed only once.", "required": ["secret", "uri"], "properties": {"secret": {"type": "string", "description": "Secret in base32."}, "uri": {"type": "string", "description": "`otpauth://` URI, to display as a QR code."}}}, "Installation": {"allOf": [{"$ref": "#/components/schemas/LiensPoste"}, {"type": "object", "required": ["poste", "marque"], "properties": {"poste": {"type": "string"}, "nom": {"type": ["string", "null"], "description": "Extension caller ID name, if any."}, "marque": {"type": "string", "description": "Operator name."}}}], "description": "What the setup page displays."}, "InstallationEnvoyee": {"type": "object", "required": ["courriel"], "properties": {"courriel": {"type": "string", "description": "Address the link was sent to."}}}, "InstallationMobile": {"type": "object", "description": "Setup link of the in-house mobile app, to show as a QR code.", "required": ["lien", "expire"], "properties": {"lien": {"type": "string", "description": "Address the app exchanges for a device token (`POST`), only once."}, "expire": {"type": "string", "format": "date-time", "description": "End of validity (RFC 3339)."}}}, "InstanceAccueil": {"type": "object", "description": "A module instance on the home page.", "required": ["id", "module"], "properties": {"id": {"type": "string", "description": "Instance identifier, unique within the layout (lowercase letters, digits and hyphens)."}, "module": {"type": "string", "description": "Module of the portal catalogue (lowercase letters, digits and hyphens)."}, "taille": {"oneOf": [{"$ref": "#/components/schemas/TailleModule", "description": "Size; absent: the module's default."}, {"type": "null"}]}, "periode": {"oneOf": [{"$ref": "#/components/schemas/PeriodeModule", "description": "Period; absent: the module's default."}, {"type": "null"}]}, "comparer": {"type": "boolean", "description": "Compare with the previous period, where the module supports it."}}}, "InvitationEnvoyee": {"type": "object", "required": ["courriel"], "properties": {"courriel": {"type": "string", "description": "Address the invitation was sent to."}}}, "IpBannie": {"type": "object", "required": ["ip", "debut", "fin", "raison", "echecs"], "properties": {"ip": {"type": "string"}, "debut": {"type": "string", "description": "RFC 3339."}, "fin": {"type": "string", "description": "Scheduled end (RFC 3339)."}, "raison": {"type": "string", "description": "`authentification`, `domaine_ip` or `manuel` (by hand)."}, "echecs": {"type": "integer", "format": "int32"}, "compte": {"type": ["string", "null"], "description": "Account targeted by the last failure (`poste@domaine`, or the domain alone): the\nmisconfigured phone to track down."}, "agent": {"type": ["string", "null"], "description": "Device `User-Agent` at the last failure."}}}, "JetonInstallation": {"type": "object", "required": ["jeton"], "properties": {"jeton": {"type": "string", "description": "Setup link token received by email."}}}, "JetonMiseEnRoute": {"type": "object", "required": ["jeton"], "properties": {"jeton": {"type": "string", "description": "Token of the setup address (after the `#`)."}}}, "JetonSupervision": {"type": "object", "required": ["actif"], "properties": {"actif": {"type": "boolean", "description": "A token is in place: `/metrics` answers whoever presents it."}, "prefixe": {"type": ["string", "null"], "description": "Start of the token (`cxs_1a2b3c`), to recognise it."}, "cree_le": {"type": ["string", "null"], "format": "date-time"}, "derniere_utilisation": {"type": ["string", "null"], "format": "date-time", "description": "Last read of `/metrics` with this token (to the minute)."}}}, "JetonSupervisionCree": {"allOf": [{"$ref": "#/components/schemas/JetonSupervision"}, {"type": "object", "required": ["secret"], "properties": {"secret": {"type": "string", "description": "To put in the Prometheus configuration (`authorization: credentials`)."}}}], "description": "Token created: `secret` is only given here, once."}, "JourClient": {"type": "object", "description": "Calls received on one day, by outcome (D66).", "required": ["jour", "recus", "repondus", "messages", "manques"], "properties": {"jour": {"type": "string", "format": "date"}, "recus": {"type": "integer", "format": "int64"}, "repondus": {"type": "integer", "format": "int64", "description": "Connected to a person."}, "messages": {"type": "integer", "format": "int64", "description": "The caller left a message."}, "manques": {"type": "integer", "format": "int64", "description": "Neither connected nor message."}}}, "JourParc": {"type": "object", "description": "Calls of one day across the customer base.", "required": ["jour", "entrants", "sortants", "internes"], "properties": {"jour": {"type": "string", "format": "date"}, "entrants": {"type": "integer", "format": "int64"}, "sortants": {"type": "integer", "format": "int64", "description": "Outgoing, forwarded calls included (D104)."}, "internes": {"type": "integer", "format": "int64"}}}, "Journal": {"type": "object", "description": "A page of the log.", "required": ["appels", "numeros_masques"], "properties": {"appels": {"type": "array", "items": {"$ref": "#/components/schemas/Appel"}}, "numeros_masques": {"type": "boolean", "description": "External numbers are masked (`06••••••78`); never for the holder asking for the calls of\ntheir own extension."}, "suivant": {"type": ["string", "null"], "format": "date-time", "description": "Pass as `avant` for the next page; absent: last page."}}}, "LangueDuCompte": {"type": "object", "properties": {"langue": {"type": ["string", "null"], "description": "`fr`, `en`, or absent: the organization's language."}}}, "LangueOrganisation": {"type": "object", "required": ["langue"], "properties": {"langue": {"type": "string", "description": "`fr` or `en`."}}}, "Licence": {"type": "object", "required": ["instance", "cle_publique", "hub", "utilisateurs", "clients", "releves", "licence"], "properties": {"instance": {"type": "string", "format": "uuid", "description": "Instance identifier, to give to the vendor along with the public key."}, "cle_publique": {"type": "string", "description": "Instance's Ed25519 public key (hexadecimal): the Hub verifies reports with it."}, "hub": {"type": "boolean", "description": "Reports sent to the Hub; otherwise, manual report (download)."}, "utilisateurs": {"type": "integer", "format": "int64", "description": "Current users: active accounts of customers (D71)."}, "clients": {"type": "array", "items": {"$ref": "#/components/schemas/UtilisateursClient"}, "description": "Breakdown by customer (its name does not leave the instance)."}, "releves": {"type": "array", "items": {"$ref": "#/components/schemas/ReleveLicence"}, "description": "Latest reports, most recent first."}, "licence": {"$ref": "#/components/schemas/EtatLicence", "description": "Vendor license (D78)."}}}, "Lien": {"type": "object", "description": "A link: the `sortie` exit of the `de` module sends the call to `vers` (module or address).", "required": ["de", "sortie", "vers"], "properties": {"de": {"type": "string"}, "sortie": {"type": "string"}, "vers": {"type": "string"}}}, "LiensPoste": {"type": "object", "description": "An extension's setup links.", "required": ["expire"], "properties": {"lien_csc": {"type": ["string", "null"], "description": "CSC link of the operator's mobile app (Cloud Softphone); absent without a configured\nCloud ID, or outside the Acrobits migration (D119)."}, "url_acrobits": {"type": ["string", "null"], "description": "Acrobits Softphone https link, to open on the phone (it reopens the app);\nabsent outside the Acrobits migration (D119)."}, "expire": {"type": "string", "description": "Link expiry (RFC 3339); the installed configuration renews itself."}}}, "LigneAppareil": {"type": "object", "description": "An account of a device.", "required": ["rang"], "properties": {"rang": {"type": "integer", "format": "int32", "minimum": 0}, "poste": {"type": ["string", "null"]}, "nom_poste": {"type": ["string", "null"]}, "combine": {"type": ["integer", "null"], "format": "int32", "description": "Handset of a DECT base.", "minimum": 0}}}, "LigneCapturee": {"type": "object", "description": "A captured line, sent as a `ligne` event (JSON). The `fin` event ends the capture.", "required": ["nature", "niveau", "texte"], "properties": {"nature": {"type": "string", "description": "`sip` (SIP trace) or `journal`."}, "niveau": {"type": "integer", "format": "int32", "description": "Syslog level (0 emergency … 7 debug).", "minimum": 0}, "texte": {"type": "string"}, "sip": {"oneOf": [{"$ref": "#/components/schemas/MessageSip", "description": "Parsed SIP message (readable `sip` lines only)."}, {"type": "null"}]}}}, "LigneDifferenceProfil": {"type": "object", "description": "A difference line.", "required": ["nature", "texte"], "properties": {"nature": {"type": "string", "description": "`egale`, `retiree` (only in the copy) or `ajoutee` (only in the shipped\nversion)."}, "texte": {"type": "string"}}}, "LigneTarifaire": {"type": "object", "description": "A rate table line. Amounts in millionths of the instance currency, excluding tax.", "required": ["prefixe", "destination", "prix_minute", "frais", "palier"], "properties": {"prefixe": {"type": "string", "description": "E.164 prefix (`+336`), or `*`: the catch-all, any missing destination (D110)."}, "destination": {"type": "string"}, "prix_minute": {"type": "integer", "format": "int64"}, "frais": {"type": "integer", "format": "int64"}, "palier": {"type": "string", "description": "`minimum/incrément` in seconds (`60/30`)."}}}, "LimitationPlafond": {"type": "object", "description": "A customer's current restriction.", "required": ["niveau", "depuis", "levable"], "properties": {"niveau": {"type": "string", "description": "`heure` or `jour`: the threshold reached."}, "depuis": {"type": "string", "format": "date-time"}, "levable": {"type": "boolean", "description": "Can the signed-in account lift it?"}}}, "Machine": {"type": "object", "description": "Machine readings and last backup.", "required": ["releves"], "properties": {"hote": {"type": ["string", "null"], "description": "Machine of the readings: the one of the most recent reading (after a failover, D74, the\nnew active one)."}, "releves": {"type": "array", "items": {"$ref": "#/components/schemas/ReleveMachine"}, "description": "Readings of this machine, oldest first, one per minute."}, "derniere_sauvegarde": {"oneOf": [{"$ref": "#/components/schemas/SauvegardeFaite"}, {"type": "null"}]}}}, "Marque": {"type": "object", "required": ["nom", "couleur", "couleur_foncee", "icone", "icone_deposee", "couleur_menu", "couleur_menu_texte", "couleur_menu_texte_fort", "couleur_menu_active", "couleur_texte", "couleur_texte_discret"], "properties": {"nom": {"type": "string", "description": "Display name: the configured one, otherwise the operator's."}, "couleur": {"type": "string", "description": "Accent color (`#rrggbb`)."}, "couleur_foncee": {"type": "string", "description": "Darkened accent (hover, visited links)."}, "logo": {"type": ["string", "null"], "description": "Logo URL (changes with the logo), if there is one."}, "icone": {"type": "string", "description": "Icon address (favicon, installed app; changes with the branding): the uploaded one,\notherwise the name's initial on the accent."}, "icone_deposee": {"type": "boolean", "description": "An icon was uploaded (PNG); otherwise the icon is generated."}, "couleur_menu": {"type": "string", "description": "Side menu background (`#rrggbb`)."}, "couleur_menu_texte": {"type": "string", "description": "Menu text, derived from the background (contrast of at least 4.5)."}, "couleur_menu_texte_fort": {"type": "string", "description": "Strong menu text (name, active entry), derived from the background."}, "couleur_menu_active": {"type": "string", "description": "Background of the active menu entry, derived from the background."}, "couleur_texte": {"type": "string", "description": "Text color (contrast of at least 7 on the page background)."}, "couleur_texte_discret": {"type": "string", "description": "Subdued text (hints, labels), derived from the text color."}}}, "Membre": {"type": "object", "required": ["cible", "delai"], "properties": {"cible": {"type": "string", "description": "`poste:100` or `externe:0612345678` (international: `externe:0041…`)."}, "delai": {"type": "integer", "format": "int32", "description": "Seconds before ringing this member.", "minimum": 0}, "duree": {"type": ["integer", "null"], "format": "int32", "description": "Ring time of this member, in seconds; `None`: the ring group's ring time.", "minimum": 0}}}, "MessageExporte": {"type": "object", "required": ["date", "numero_appelant", "duree"], "properties": {"date": {"type": "integer", "format": "int64", "description": "Upload time (Unix seconds)."}, "numero_appelant": {"type": "string"}, "duree": {"type": "integer", "format": "int64"}, "transcription": {"type": ["string", "null"], "description": "Transcription, for the person themselves and their company's admin (D57)."}}}, "MessagePcap": {"type": "object", "description": "Message of a pcap: the SIP messages of a capture fit as they are.", "required": ["transport", "source", "destination", "horodatage", "message"], "properties": {"transport": {"type": "string", "description": "`udp`, `tcp`, `tls`, `ws` or `wss` (TLS and websocket are written as TCP, in clear)."}, "source": {"type": "string", "description": "Sender, `ip:port`."}, "destination": {"type": "string", "description": "Receiver, `ip:port`."}, "horodatage": {"type": "string", "format": "date-time"}, "message": {"type": "string", "description": "SIP message as on the wire."}}}, "MessageSip": {"type": "object", "description": "SIP message of the trace, as seen by the telephony engine.", "required": ["sens", "transport", "source", "destination", "horodatage", "resume", "message"], "properties": {"sens": {"type": "string", "description": "`recu` (received) or `envoye` (sent) by the telephony engine."}, "transport": {"type": "string", "description": "`udp`, `tcp`, `tls`, `ws` or `wss`."}, "source": {"type": "string", "description": "Sender, `ip:port`."}, "destination": {"type": "string", "description": "Receiver, `ip:port`."}, "horodatage": {"type": "string", "format": "date-time", "description": "Time of the message."}, "resume": {"type": "string", "description": "Request or status line (`INVITE sip:… SIP/2.0`, `SIP/2.0 180 Ringing`)."}, "methode": {"type": ["string", "null"], "description": "Method (the `CSeq` one for a response)."}, "statut": {"type": ["integer", "null"], "format": "int32", "description": "Status code of a response.", "minimum": 0}, "call_id": {"type": ["string", "null"], "description": "Dialog (`Call-ID`)."}, "message": {"type": "string", "description": "Message as on the wire (CRLF), body included."}}}, "MessageVocal": {"type": "object", "description": "A voicemail message.", "required": ["id", "depose_le", "duree", "lu", "appelant_nom", "appelant_numero"], "properties": {"id": {"type": "string", "format": "uuid"}, "depose_le": {"type": "string", "format": "date-time"}, "duree": {"type": "integer", "format": "int64", "description": "Duration in seconds."}, "lu": {"type": "boolean"}, "appelant_nom": {"type": "string"}, "appelant_numero": {"type": "string", "description": "Masked (`06••••••78`) without the `messagerie.ecouter` permission."}, "transcription": {"type": ["string", "null"], "description": "Omitted without the `messagerie.ecouter` permission, or not yet transcribed."}}}, "MiseEnRoute": {"type": "object", "required": ["etapes", "terminees", "terminee", "masquee"], "properties": {"etapes": {"type": "array", "items": {"$ref": "#/components/schemas/EtapeMiseEnRoute"}, "description": "The nine steps, in order."}, "terminees": {"type": "integer", "description": "Steps done or skipped.", "minimum": 0}, "terminee": {"type": "boolean", "description": "All steps are done or skipped."}, "masquee": {"type": "boolean", "description": "Home tile hidden."}}}, "ModeForfait": {"type": "string", "description": "Basis of the plan fee.", "enum": ["par_utilisateur", "global"]}, "ModeleDisponible": {"type": "object", "description": "A model that can be added to a customer.", "required": ["profil", "profil_nom", "etiquette", "code", "nom", "comptes", "touches", "premiere_touche", "combines"], "properties": {"profil": {"type": "string"}, "profil_nom": {"type": "string"}, "etiquette": {"type": "string", "description": "`teste`, `communautaire` or `copie`."}, "code": {"type": "string"}, "nom": {"type": "string"}, "comptes": {"type": "integer", "format": "int32", "minimum": 0}, "touches": {"type": "integer", "format": "int32", "minimum": 0}, "premiere_touche": {"type": "integer", "format": "int32", "minimum": 0}, "combines": {"type": "boolean"}, "redirection": {"type": ["string", "null"], "description": "Redirection service of the brand (`yealink-rps`)."}}}, "ModeleMateriel": {"type": "object", "description": "A model covered by a profile.", "required": ["code", "nom", "comptes", "touches"], "properties": {"code": {"type": "string", "description": "Short, stable code (`t54w`)."}, "nom": {"type": "string"}, "comptes": {"type": "integer", "format": "int32", "description": "SIP accounts the model carries (lines, or handsets of a DECT base).", "minimum": 0}, "touches": {"type": "integer", "format": "int32", "description": "Programmable keys; 0 if the model has none.", "minimum": 0}}}, "ModificationAppareil": {"type": "object", "description": "Changes to a device: only the given fields change.", "properties": {"nom": {"type": ["string", "null"]}, "numero_de_serie": {"type": ["string", "null"], "description": "Empty string: removed."}, "modele": {"type": ["string", "null"]}, "touches": {"type": ["array", "null"], "items": {"$ref": "#/components/schemas/ToucheAppareil"}}, "parametres": {"type": ["string", "null"], "description": "Additional parameters (operator and reseller only)."}}}, "ModificationClient": {"type": "object", "properties": {"nom": {"type": ["string", "null"], "description": "Customer name (legal name)."}, "actif": {"type": ["boolean", "null"], "description": "`false`: customer suspended; `true`: reactivated."}, "enregistrement_autorise": {"type": ["boolean", "null"], "description": "Call recording allowed (D111). Off: extensions that were recording are\nsuspended, no settings and no playback in the customer area; restored on reactivation. Existing\nrecordings are kept (normal retention)."}, "ajout_utilisateurs_autorise": {"type": ["boolean", "null"], "description": "The customer admin can add users and extensions (D121). When off (the\ndefault): only the operator and the reseller add them; existing accounts remain."}}}, "ModificationCompte": {"type": "object", "properties": {"nom": {"type": ["string", "null"]}, "courriel": {"type": ["string", "null"]}, "role": {"type": ["string", "null"], "description": "Role of the same level: `admin_client` or `utilisateur` at a customer, `admin_operateur`\nor `support_operateur` at the operator."}, "actif": {"type": ["boolean", "null"], "description": "`false`: account disabled (can no longer sign in, no longer counts toward the license) and its\nextension out of service; `true`: reactivated."}, "telephone_seulement": {"type": ["boolean", "null"], "description": "\"Phone only\" account (D107): its session opens only the softphone, and its\nauthorized applications (OAuth) are revoked. `utilisateur` role only; once made\n`admin_client`, the account no longer is."}}}, "ModificationProfil": {"type": "object", "description": "New version of a copy.", "required": ["nom", "contenu"], "properties": {"nom": {"type": "string"}, "contenu": {"$ref": "#/components/schemas/ContenuProfil"}, "resume": {"type": "string", "description": "What changes, for the history."}}}, "Module": {"oneOf": [{"type": "object", "description": "A customer number (E.164), entry point for calls.", "required": ["numero", "type"], "properties": {"numero": {"type": "string"}, "type": {"type": "string", "enum": ["numero"]}}}, {"allOf": [{"$ref": "#/components/schemas/Grille", "description": "Opening hours: outputs `ouvert` and `ferme`."}, {"type": "object", "required": ["type"], "properties": {"type": {"type": "string", "enum": ["grille"]}}}], "description": "Opening hours: outputs `ouvert` and `ferme`."}, {"allOf": [{"$ref": "#/components/schemas/Svi", "description": "IVR: keys `0` to `9`, `*` and `#` (D50), `sinon` exit (nothing typed or too many\nerrors)."}, {"type": "object", "required": ["type"], "properties": {"type": {"type": "string", "enum": ["svi"]}}}], "description": "IVR: keys `0` to `9`, `*` and `#` (D50), `sinon` exit (nothing typed or too many\nerrors)."}, {"allOf": [{"$ref": "#/components/schemas/Groupe", "description": "Ring group: output `nonrepondu`."}, {"type": "object", "required": ["type"], "properties": {"type": {"type": "string", "enum": ["groupe"]}}}], "description": "Ring group: output `nonrepondu`."}, {"allOf": [{"$ref": "#/components/schemas/Attente", "description": "Queue with one agent: when unanswered, the agent's voicemail (fixed)."}, {"type": "object", "required": ["type"], "properties": {"type": {"type": "string", "enum": ["attente"]}}}], "description": "Queue with one agent: when unanswered, the agent's voicemail (fixed)."}, {"allOf": [{"$ref": "#/components/schemas/Conference", "description": "Conference room."}, {"type": "object", "required": ["type"], "properties": {"type": {"type": "string", "enum": ["conference"]}}}], "description": "Conference room."}, {"allOf": [{"$ref": "#/components/schemas/Renvoi", "description": "Call forwarding to an external number (in production since October 12, 2026): an end of call flow, with no\nexit. Numbers, keys, opening hours and ring groups lead to it; changing the number once updates\neverything."}, {"type": "object", "required": ["type"], "properties": {"type": {"type": "string", "enum": ["renvoi"]}}}], "description": "Call forwarding to an external number (in production since October 12, 2026): an end of call flow, with no\nexit. Numbers, keys, opening hours and ring groups lead to it; changing the number once updates\neverything."}, {"allOf": [{"$ref": "#/components/schemas/Sip", "description": "SIP connector (production as of 10/13/2026): a call flow ending that hands the call to a\nthird-party service (phone assistant…) through its own gateway, a SIP trunk with\nregistration, without outbound minutes. The password is not in the call flow (returned\nby the simulation, kept by the versions): it is encrypted separately (D27)."}, {"type": "object", "required": ["type"], "properties": {"type": {"type": "string", "enum": ["sip"]}}}], "description": "SIP connector (production as of 10/13/2026): a call flow ending that hands the call to a\nthird-party service (phone assistant…) through its own gateway, a SIP trunk with\nregistration, without outbound minutes. The password is not in the call flow (returned\nby the simulation, kept by the versions): it is encrypted separately (D27)."}]}, "Moi": {"type": "object", "description": "Logged-in account.", "required": ["id", "courriel", "nom", "role", "organisation_id"], "properties": {"id": {"type": "string", "format": "uuid"}, "courriel": {"type": "string"}, "nom": {"type": "string"}, "role": {"type": "string", "description": "Predefined role (`admin_operateur`, `admin_client`…)."}, "organisation_id": {"type": "string", "format": "uuid"}, "organisation": {"oneOf": [{"$ref": "#/components/schemas/OrganisationDuCompte", "description": "Account organization (absent in login responses)."}, {"type": "null"}]}, "poste": {"type": ["string", "null"], "description": "Account's extension number, if any (absent in login responses)."}, "langue": {"type": ["string", "null"], "description": "Portal language for this account (`fr` or `en`): its own, otherwise its\norganization's (absent in login responses)."}, "langue_compte": {"type": ["string", "null"], "description": "Language chosen by the account itself; absent: the organization's."}, "alerte_licence": {"oneOf": [{"$ref": "#/components/schemas/EtatLicence", "description": "Vendor license expired, or ending within 14 days (D78), for the banner: operator and\nreseller accounts only."}, {"type": "null"}]}, "lecture_seule": {"type": ["string", "null"], "format": "date", "description": "Instance read-only since this day (`YYYY-MM-DD`, license expired more than 30 days ago,\nD78): the portal disables writes, except those still allowed (sign-in, telephony,\nloading the license…). Absent otherwise; for every account."}, "fonctions": {"oneOf": [{"$ref": "#/components/schemas/Fonctions", "description": "Features turned on by the operator (D94), for the portal menus (absent from sign-in\nresponses)."}, {"type": "null"}]}, "telephone_seulement": {"type": ["boolean", "null"], "description": "\"Phone only\" account (D107): the portal sends it to the softphone (`/telephone/`)\n(absent from login responses)."}, "reprise_acrobits": {"type": ["boolean", "null"], "description": "Acrobits migration active on the instance (D119): the portal then shows its settings and\nlinks. Absent otherwise."}, "devise": {"type": ["string", "null"], "description": "Instance currency (ISO 4217 code, `EUR` by default): all amounts are in millionths of\nthis currency (absent from sign-in responses)."}}}, "MonTelephone": {"type": "object", "description": "What the softphone needs to register and place calls.", "required": ["poste", "domaine", "mot_de_passe", "nom_affiche", "websocket", "serveurs_ice", "repertoire_partageable", "pays", "langue"], "properties": {"poste": {"type": "string", "description": "Extension number, SIP username."}, "domaine": {"type": "string", "description": "Customer's SIP domain."}, "mot_de_passe": {"type": "string", "description": "Extension's SIP password."}, "nom_affiche": {"type": "string", "description": "Name shown on internal calls."}, "numero_externe": {"type": ["string", "null"], "description": "External number shown by the extension (E.164): the caller ID set for the extension,\notherwise the customer's main number (its trunk's CLI); absent if there is none."}, "websocket": {"type": "string", "description": "Address of the SIP over WebSocket relay (`wss://…/api/v1/telephone/ws`)."}, "serveurs_ice": {"type": "array", "items": {"$ref": "#/components/schemas/ServeurIce"}, "description": "STUN and TURN servers (TURN credentials valid for 12 hours); empty when no TURN is set."}, "repertoire_partageable": {"type": "boolean", "description": "The account can add to the customer's shared directory: its admin, or a user if the\ncustomer opens it to its users."}, "pays": {"type": "string", "description": "Customer's country (D124, code from `GET /pays`): the softphone reads entered numbers in\nits numbering plan."}, "langue": {"type": "string", "description": "Language of the account (`fr` or `en`): its own, otherwise its organization's. The\nmobile and desktop apps switch their texts to it."}}}, "MotDePasseConnecteur": {"type": "object", "description": "SIP connector password: never read back, never in the call flow.", "required": ["mot_de_passe"], "properties": {"mot_de_passe": {"type": "string"}}}, "MotDePasseSip": {"type": "object", "description": "SIP password of an extension, revealed on request (D114).", "required": ["mot_de_passe"], "properties": {"mot_de_passe": {"type": "string"}}}, "MoteurSynthese": {"type": "string", "description": "Text-to-speech engine (D123).", "enum": ["piper", "google"]}, "Nature": {"type": "string", "description": "Kind of announcement.", "enum": ["accueil_svi", "fermeture", "predecroche_numero", "predecroche_groupe", "musique_file"]}, "NatureGrille": {"type": "string", "enum": ["achat", "vente_revendeur", "vente_client"]}, "NePasDeranger": {"type": "object", "description": "An extension's \"do not disturb\": the phone no longer rings, the call follows the forward on\nbusy, otherwise voicemail (D107, softphone Status screen).", "required": ["actif"], "properties": {"actif": {"type": "boolean"}}}, "NiveauForfait": {"type": "object", "description": "A customer's plan fee at one sales level.", "properties": {"propre": {"oneOf": [{"$ref": "#/components/schemas/Forfait", "description": "The customer's own plan fee; omitted: the rate table's."}, {"type": "null"}]}, "grille": {"oneOf": [{"$ref": "#/components/schemas/Forfait", "description": "Default plan fee of the customer's sales rate table at this level (assigned, otherwise the\ndefault one); omitted: none."}, {"type": "null"}]}, "applique": {"oneOf": [{"$ref": "#/components/schemas/Forfait", "description": "Plan fee applied: the customer's own, otherwise the rate table's; omitted: no plan fee."}, {"type": "null"}]}, "mensuel": {"type": ["integer", "null"], "format": "int64", "description": "Amount for a full month with the current number of users; omitted: no plan fee."}}}, "NouveauBannissement": {"type": "object", "required": ["ip"], "properties": {"ip": {"type": "string", "description": "IPv4 or IPv6 address."}, "duree_secondes": {"type": ["integer", "null"], "format": "int32", "description": "Duration in seconds (60 to 2,592,000); absent: the one in the settings."}}}, "NouveauBrouillon": {"type": "object", "required": ["contenu"], "properties": {"contenu": {"$ref": "#/components/schemas/Parcours"}, "version_base": {"type": ["integer", "null"], "format": "int32", "description": "Published version the draft is based on; none: missing or `null`."}}}, "NouveauClient": {"type": "object", "required": ["nom", "domaine"], "properties": {"nom": {"type": "string", "description": "Customer name (legal name)."}, "domaine": {"type": "string", "description": "Customer identifier (`client`), completed with the instance's customer domain suffix\n(D108), or full SIP domain (`client.exemple`); it is also its context in the telephony engine."}}}, "NouveauCompte": {"type": "object", "required": ["courriel", "nom", "role"], "properties": {"courriel": {"type": "string"}, "nom": {"type": "string"}, "role": {"type": "string", "description": "`admin_operateur` or `support_operateur` at the operator, `admin_revendeur` at a\nreseller."}}}, "NouveauMotDePasse": {"type": "object", "required": ["jeton", "mot_de_passe"], "properties": {"jeton": {"type": "string", "description": "Invitation or reset token received by link."}, "mot_de_passe": {"type": "string"}}}, "NouveauNumero": {"type": "object", "required": ["numero"], "properties": {"numero": {"type": "string", "description": "E.164 (`+33123456789`)."}, "pays": {"type": ["string", "null"], "description": "Country (ISO 3166-1 alpha-2); by default, that of the country code if supported (`FR` for\na `+33`, `BE`, `CH`, `GB`, `US` or `CA` depending on the area code). It must match the\ncountry code (D124)."}, "fournisseur": {"type": ["string", "null"]}}}, "NouveauPosteDuCompte": {"type": "object", "required": ["numero"], "properties": {"numero": {"type": "string", "description": "Extension number to create (2 to 8 digits), free at the customer."}}}, "NouveauProfilTrunk": {"type": "object", "required": ["nom", "proxy", "format"], "properties": {"nom": {"type": "string"}, "proxy": {"type": "string", "description": "C5 address: `hôte` or `hôte:port`."}, "format": {"$ref": "#/components/schemas/Format"}, "reseaux": {"type": "array", "items": {"type": "string"}, "description": "Provider networks (CIDR) its calls come from."}}}, "NouveauReglageAssistant": {"type": "object", "required": ["budget_instance_centimes"], "properties": {"cle": {"type": ["string", "null"], "description": "Operator's Claude API key; omitted: the stored key is kept."}, "modele": {"type": ["string", "null"], "description": "Omitted: Sonnet."}, "budget_instance_centimes": {"type": "integer", "format": "int64"}, "budget_client_centimes": {"type": ["integer", "null"], "format": "int64"}, "prix_entree_centimes": {"type": ["integer", "null"], "format": "int32", "description": "Omitted: Sonnet pricing (3 and 15 per million tokens, in the instance currency)."}, "prix_sortie_centimes": {"type": ["integer", "null"], "format": "int32"}}}, "NouveauReglageOidc": {"type": "object", "required": ["emetteur", "client_id", "libelle"], "properties": {"emetteur": {"type": "string"}, "client_id": {"type": "string"}, "secret": {"type": ["string", "null"], "description": "OIDC client secret; missing: the one already saved is kept (required the\nfirst time)."}, "libelle": {"type": "string"}, "domaines": {"type": "array", "items": {"type": "string"}}, "creation_auto": {"type": "boolean"}}}, "NouveauReglageRps": {"type": "object", "description": "RPS keys to save.", "required": ["cle_id", "region", "serveur"], "properties": {"cle_id": {"type": "string"}, "secret": {"type": ["string", "null"], "description": "`AccessKey Secret`; when absent, the saved one is kept."}, "region": {"type": "string"}, "serveur": {"type": "string"}}}, "NouveauReglageSmtp": {"type": "object", "required": ["hote", "port", "securite", "expediteur"], "properties": {"hote": {"type": "string"}, "port": {"type": "integer", "format": "int32", "minimum": 0}, "securite": {"type": "string"}, "identifiant": {"type": ["string", "null"]}, "mot_de_passe": {"type": ["string", "null"], "description": "Omitted: the stored password is kept (if there is a username)."}, "expediteur": {"type": "string"}, "nom_expediteur": {"type": "string"}}}, "NouveauReglageSynthese": {"type": "object", "required": ["moteur"], "properties": {"moteur": {"$ref": "#/components/schemas/MoteurSynthese"}, "cle": {"type": ["string", "null"], "description": "Google API key. Absent: the stored key is kept; empty: erased."}, "voix_fr": {"type": ["string", "null"], "description": "Google voice for customers set to French; absent or empty: `fr-FR-Chirp3-HD-Leda`."}, "voix_en": {"type": ["string", "null"], "description": "Google voice for customers set to English; absent or empty: `en-US-Chirp3-HD-Leda`."}}}, "NouveauReglageTranscription": {"type": "object", "required": ["url", "modele"], "properties": {"url": {"type": "string"}, "cle": {"type": ["string", "null"], "description": "Omitted: the stored key is kept; empty: removed (open local engine)."}, "modele": {"type": "string"}, "langue": {"type": ["string", "null"], "description": "Language forced on every message (ISO 639-1); absent or empty: the language of each\nmailbox's customer (D81)."}}}, "NouveauRevendeur": {"type": "object", "required": ["nom"], "properties": {"nom": {"type": "string", "description": "Reseller name (legal name)."}}}, "NouveauTrunk": {"type": "object", "properties": {"profil_id": {"type": ["string", "null"], "format": "uuid", "description": "Operator's trunk profile (D95): it provides the provider, server, format and\nnetworks, and `fournisseur`, `proxy`, `format` and `reseaux` are ignored; absent:\nfully entered trunk."}, "fournisseur": {"type": ["string", "null"]}, "proxy": {"type": ["string", "null"], "description": "C5 address: `host` or `host:port`; required without a profile."}, "identifiant": {"type": ["string", "null"], "description": "Registration identifier; absent: IP-based trunk."}, "mot_de_passe": {"type": ["string", "null"], "description": "Required when creating a trunk with an identifier; absent on update: the\nsaved password is kept."}, "format": {"oneOf": [{"$ref": "#/components/schemas/Format", "description": "Required without a profile."}, {"type": "null"}]}, "reseaux": {"type": "array", "items": {"type": "string"}, "description": "Provider networks (CIDR) its calls come from: allowed in the ACL."}, "ndi": {"type": ["string", "null"], "description": "Main number (D48): one of the customer's numbers, E.164, presented by default on any outgoing call without\nits own number; absent: none."}}}, "NouveauWebhook": {"type": "object", "description": "New endpoint, or modified endpoint (the secret is kept).", "required": ["url", "evenements"], "properties": {"url": {"type": "string", "description": "`https://…`, port 443 or 8443, public address."}, "evenements": {"type": "array", "items": {"type": "string"}, "description": "Customer: `voicemail.new`, `call.recorded`; operator or reseller: `cdr.month`,\n`client.created`, `extension.created`, `trunk.down`, `trunk.up`."}}}, "NouveauxNumeros": {"type": "object", "required": ["numeros"], "properties": {"numeros": {"type": "array", "items": {"$ref": "#/components/schemas/NouveauNumero"}}}}, "NouvelAppareil": {"type": "object", "description": "Adding a phone to a customer.", "required": ["mac", "profil", "modele", "lignes"], "properties": {"mac": {"type": "string", "description": "MAC address, any separators (`80:5E:C0:00:00:01`)."}, "profil": {"type": "string", "description": "Profile: identifier of a shipped profile or uuid of a copy."}, "modele": {"type": "string"}, "nom": {"type": "string"}, "numero_de_serie": {"type": ["string", "null"]}, "lignes": {"type": "array", "items": {"$ref": "#/components/schemas/NouvelleLigne"}}, "touches": {"type": "array", "items": {"$ref": "#/components/schemas/ToucheAppareil"}}, "parametres": {"type": ["string", "null"], "description": "Additional parameters (operator and reseller only)."}, "declarer_rps": {"type": "boolean", "description": "Register the device with the Yealink RPS (Yealink profile, serial number required): it\nwill configure itself on first boot. A refusal from YMCS does not prevent adding it: the state\nshows it (`rps_etat`)."}}}, "NouvelUtilisateur": {"type": "object", "required": ["courriel", "nom", "role"], "properties": {"courriel": {"type": "string"}, "nom": {"type": "string"}, "role": {"type": "string", "description": "`admin_client` or `utilisateur`."}, "poste": {"type": ["string", "null"], "description": "Internal extension number to create (2 to 8 digits), optional."}, "telephone_seulement": {"type": ["boolean", "null"], "description": "\"Phone only\" account (D107): its session opens only the softphone. Absent:\nyes for the `utilisateur` role, no for `admin_client` (which cannot be)."}}}, "NouvelleGrilleTarifaire": {"type": "object", "description": "New rate table: a CSV or a starting rate table.", "required": ["nature", "nom"], "properties": {"nature": {"$ref": "#/components/schemas/NatureGrille"}, "nom": {"type": "string"}, "effet": {"type": ["string", "null"], "format": "date", "description": "Effective date (`2026-01-01`); omitted: today."}, "par_defaut": {"type": "boolean"}, "csv": {"type": ["string", "null"], "description": "`prefixe;destination;prix_minute;frais;palier`, one line per prefix."}, "depuis": {"oneOf": [{"$ref": "#/components/schemas/DepuisGrille"}, {"type": "null"}]}, "bouchon": {"oneOf": [{"$ref": "#/components/schemas/BouchonGrille", "description": "Sales grid: price of the `*` catch-all (D110), replacing the one from the CSV or the source\ngrid."}, {"type": "null"}]}, "forfait": {"oneOf": [{"$ref": "#/components/schemas/Forfait", "description": "Sales rate table: default indicative plan fee for its customers (D120); omitted: none."}, {"type": "null"}]}}}, "NouvelleLigne": {"type": "object", "description": "An account to set on a device.", "required": ["rang", "poste"], "properties": {"rang": {"type": "integer", "format": "int32", "minimum": 0}, "poste": {"type": "string", "description": "Number of the customer's extension."}, "combine": {"type": ["integer", "null"], "format": "int32", "description": "Handset of a DECT base; the rank by default.", "minimum": 0}}}, "NouvelleVoixClient": {"type": "object", "properties": {"voix": {"type": ["string", "null"], "description": "Identifier of a voice from `…/voix/disponibles`; absent or empty: the instance voice."}}}, "NouvellesRestrictions": {"type": "object", "required": ["natures"], "properties": {"natures": {"type": "array", "items": {"type": "string"}, "description": "`surtaxes`, `international`, `sortants`; empty: none."}}}, "Numero": {"type": "object", "required": ["id", "e164", "pays", "fournisseur", "etat"], "properties": {"id": {"type": "string", "format": "uuid"}, "e164": {"type": "string", "description": "The number, in E.164."}, "pays": {"type": "string", "description": "Country, ISO 3166-1 alpha-2."}, "fournisseur": {"type": "string"}, "etat": {"type": "string", "description": "`libre`, `affecte` (at a customer), `porte_sortant` (has left the operator) or\n`resilie`."}, "revendeur_id": {"type": ["string", "null"], "format": "uuid", "description": "Reseller for whom the number is reserved."}, "client_id": {"type": ["string", "null"], "format": "uuid", "description": "Customer that holds the number."}, "poste": {"type": ["string", "null"], "description": "Destination in the published call flow, when it is directly one of the customer's extensions."}, "destination": {"type": ["string", "null"], "description": "Destination in the published call flow (`poste:100`, `svi:900`, `grille:800`…); none:\n`null`."}}}, "NumeroBloque": {"type": "object", "description": "A blocked number.", "required": ["numero"], "properties": {"numero": {"type": "string", "description": "E.164 in responses; national (customer's country), international prefix or `+` on input."}, "nom": {"type": "string", "description": "As a reminder (\"insurance telemarketer\"), 100 characters at most."}}}, "NumeroPresente": {"type": "object", "required": ["poste"], "properties": {"poste": {"type": "string"}, "numero_presente": {"type": ["string", "null"], "description": "E.164."}}}, "OrganisationDuCompte": {"type": "object", "description": "An account's organization, for the portal header.", "required": ["nom", "type", "fuseau", "pays"], "properties": {"nom": {"type": "string"}, "type": {"type": "string", "description": "`operateur`, `revendeur` or `client`; another type denotes the vendor's root."}, "fuseau": {"type": "string", "description": "The organization's time zone (IANA name, D81): the portal displays dates in it."}, "pays": {"type": "string", "description": "Country of the organisation (D124, code from `GET /pays`): numbering plan of the numbers\nentered by its accounts."}, "enregistrement_autorise": {"type": ["boolean", "null"], "description": "Customer only: call recording allowed (D111); when off, the portal hides\nthe recording menu and settings."}, "ajout_utilisateurs_autorise": {"type": ["boolean", "null"], "description": "Customer only: its admin can add users and extensions (D121); when off,\nthe portal replaces the add buttons with a pointer to the operator."}}}, "OrganisationLue": {"type": "object", "required": ["id", "nom", "type", "actif"], "properties": {"id": {"type": "string", "format": "uuid"}, "nom": {"type": "string"}, "type": {"type": "string", "description": "`operateur`, `revendeur` or `client`; another type denotes the vendor's root."}, "parent_id": {"type": ["string", "null"], "format": "uuid"}, "actif": {"type": "boolean"}}}, "OuvertureAssistance": {"type": "object", "required": ["heures"], "properties": {"heures": {"type": "integer", "format": "int32", "description": "Duration of the opening, in hours (1 to 168).", "minimum": 0}}}, "PageAudit": {"type": "object", "required": ["entrees"], "properties": {"entrees": {"type": "array", "items": {"$ref": "#/components/schemas/EntreeAudit"}}, "suivant": {"type": ["integer", "null"], "format": "int64", "description": "Rank to pass as `avant` for the next page; missing: last page."}}}, "ParametresMateriel": {"type": "object", "description": "Additional parameters of a customer, one `key = value` line each.", "required": ["parametres"], "properties": {"parametres": {"type": "string"}}}, "Parcours": {"type": "object", "description": "A customer's call flow: its modules and their links.", "required": ["modules", "liens"], "properties": {"modules": {"type": "array", "items": {"$ref": "#/components/schemas/Module"}}, "liens": {"type": "array", "items": {"$ref": "#/components/schemas/Lien"}}}}, "Pas": {"type": "string", "description": "Slot size of a period.", "enum": ["heure", "jour", "semaine", "mois"]}, "PasskeyAjoutee": {"type": "object", "properties": {"codes_de_secours": {"type": ["array", "null"], "items": {"type": "string"}, "description": "Backup codes, if this is the account's first second factor (shown once)."}}}, "PaysOrganisation": {"type": "object", "required": ["pays"], "properties": {"pays": {"type": "string", "description": "ISO 3166-1 alpha-2 code, from `GET /pays` (`FR`, `BE`, `CH`, `GB`, `US`, `CA`)."}}}, "PaysPrisEnCharge": {"type": "object", "description": "A supported country and its numbering plan.", "required": ["code", "indicatif", "prefixe_national", "prefixe_international", "urgences"], "properties": {"code": {"type": "string", "description": "ISO 3166-1 alpha-2 code."}, "indicatif": {"type": "string", "description": "Country calling code, without `+` (`33`, `1`…)."}, "prefixe_national": {"type": "string", "description": "National (trunk) prefix (`0`, `1` in the North American plan)."}, "prefixe_international": {"type": "string", "description": "International prefix (`00`, `011` in the North American plan)."}, "urgences": {"type": "array", "items": {"type": "string"}, "description": "Emergency numbers and emergency services: always reachable, never extensions."}}}, "PeriodeModule": {"type": "string", "description": "Period covered by a module.", "enum": ["direct", "jour", "24h", "7j", "30j", "mois", "annee"]}, "PlafondClient": {"type": "object", "description": "A customer's usage cap: thresholds in force, usage and restriction.", "required": ["seuil_heure", "seuil_jour", "seuils_du_client", "consommation_heure", "consommation_jour"], "properties": {"seuil_heure": {"type": "integer", "format": "int64", "description": "Thresholds in force (the customer's, otherwise the instance's)."}, "seuil_jour": {"type": "integer", "format": "int64"}, "seuils_du_client": {"$ref": "#/components/schemas/SeuilsDuClient", "description": "The customer's own thresholds; absent: the instance's."}, "consommation_heure": {"type": "integer", "format": "int64", "description": "Outgoing usage at purchase price over the rolling hour, since the last lift."}, "consommation_jour": {"type": "integer", "format": "int64", "description": "Over the rolling day, since the last lift at the daily level."}, "limitation": {"oneOf": [{"$ref": "#/components/schemas/LimitationPlafond", "description": "Current restriction to landlines and mobiles in the customer's country; absent: none."}, {"type": "null"}]}}}, "Position": {"type": "object", "required": ["x", "y"], "properties": {"x": {"type": "integer", "format": "int32", "minimum": 0}, "y": {"type": "integer", "format": "int32", "minimum": 0}}}, "PremierAcces": {"type": "object", "required": ["jeton", "operateur", "admin_courriel", "admin_nom"], "properties": {"jeton": {"type": "string", "description": "Token of the setup address (after the `#`)."}, "operateur": {"type": "string", "description": "Operator name."}, "admin_courriel": {"type": "string", "description": "Email address of the first operator administrator."}, "admin_nom": {"type": "string", "description": "Name of the first operator administrator."}}}, "PremierAccesFait": {"type": "object", "required": ["operateur_id", "invitation"], "properties": {"operateur_id": {"type": "string", "format": "uuid", "description": "The operator created."}, "invitation": {"type": "string", "description": "The administrator's invitation link (`/invitation#<token>`), to open right away to\nchoose their password, then their second factor."}}}, "Probleme": {"type": "object", "description": "Body of every error response.", "required": ["code", "detail"], "properties": {"code": {"type": "string", "description": "Stable error code (e.g. `base_indisponible`), translation key on the portal side."}, "detail": {"type": "string", "description": "Technical detail, not meant to be displayed as is."}}}, "ProfilMateriel": {"type": "object", "description": "A profile and its content.", "required": ["resume", "contenu"], "properties": {"resume": {"$ref": "#/components/schemas/ResumeProfil"}, "contenu": {"$ref": "#/components/schemas/ContenuProfil"}}}, "ProfilTrunk": {"type": "object", "required": ["id", "nom", "proxy", "format", "reseaux", "trunks"], "properties": {"id": {"type": "string", "format": "uuid"}, "nom": {"type": "string", "description": "Provider name, copied onto the trunks (\"Provider A\")."}, "proxy": {"type": "string", "description": "C5 address: `hôte` or `hôte:port`."}, "format": {"$ref": "#/components/schemas/Format"}, "reseaux": {"type": "array", "items": {"type": "string"}, "description": "Provider networks (CIDR), allowed in the ACL."}, "trunks": {"type": "integer", "format": "int64", "description": "Customer trunks based on the profile."}}}, "ProfilsMateriel": {"type": "object", "description": "Profiles shipped by Kanadr and the operator's copies.", "required": ["livres", "copies"], "properties": {"livres": {"type": "array", "items": {"$ref": "#/components/schemas/ResumeProfil"}}, "copies": {"type": "array", "items": {"$ref": "#/components/schemas/ResumeProfil"}}}}, "Publication": {"type": "object", "description": "Result of a publication.", "required": ["version", "ecartes"], "properties": {"version": {"$ref": "#/components/schemas/VersionParcours"}, "ecartes": {"type": "array", "items": {"type": "string"}, "description": "Excluded modules (in error, or leading to a module in error): they keep what was\nserved."}}}, "QualiteFournisseur": {"type": "object", "description": "Outcome of outgoing calls placed through a provider's trunks.", "required": ["fournisseur", "appels", "aboutis", "non_decroches", "echecs", "causes"], "properties": {"fournisseur": {"type": "string", "description": "Trunk profile (D95), otherwise the provider entered on the trunk, otherwise its server."}, "appels": {"type": "integer", "format": "int64"}, "aboutis": {"type": "integer", "format": "int64", "description": "Answered by the callee."}, "non_decroches": {"type": "integer", "format": "int64", "description": "Busy, no answer, or hung up by the caller before being answered."}, "echecs": {"type": "integer", "format": "int64", "description": "Rejected or failed in the network."}, "causes": {"type": "array", "items": {"$ref": "#/components/schemas/CauseEchec"}, "description": "Failure causes, most frequent first."}}}, "QuestionAssistant": {"type": "object", "description": "Multiple-choice question asked by the assistant (D88): the choices as buttons; the user's next message, a choice or a free answer, replies to it.", "required": ["id", "question", "choix"], "properties": {"id": {"type": "string", "description": "Tool call (`tool_use`)."}, "question": {"type": "string"}, "choix": {"type": "array", "items": {"type": "string"}, "description": "Two to four suggested answers."}}}, "Redemarrage": {"type": "object", "description": "Telephony engine restart.", "properties": {"immediat": {"type": "boolean", "description": "`true`: immediately, ongoing calls dropped; `false`: as soon as no call is\nin progress (new calls refused meanwhile)."}}}, "RedirectionOauth": {"type": "object", "description": "Where to send the browser: the application's redirect address, with the authorization code\nor the refusal.", "required": ["redirection"], "properties": {"redirection": {"type": "string"}}}, "RedirectionOidc": {"type": "object", "required": ["url", "libelle"], "properties": {"url": {"type": "string", "description": "Directory URL to send the browser to."}, "libelle": {"type": "string", "description": "Directory name."}}}, "ReglageAcrobits": {"type": "object", "description": "Operator's mobile app.", "required": ["cloud_id"], "properties": {"cloud_id": {"type": "string", "description": "Acrobits Cloud ID of the app (Cloud Softphone): uppercase letters, digits, `-` or `_`."}}}, "ReglageAssistant": {"type": "object", "required": ["cle_definie", "modele", "budget_instance_centimes", "prix_entree_centimes", "prix_sortie_centimes", "consomme_mois_centimes"], "properties": {"cle_definie": {"type": "boolean", "description": "A key is saved (never returned)."}, "modele": {"type": "string"}, "budget_instance_centimes": {"type": "integer", "format": "int64", "description": "Monthly budget of the whole instance, in hundredths of the instance currency."}, "budget_client_centimes": {"type": ["integer", "null"], "format": "int64", "description": "Monthly budget of each customer, in hundredths of the instance currency; omitted: no\nspecific limit."}, "prix_entree_centimes": {"type": "integer", "format": "int32", "description": "Price in hundredths of the instance currency per million tokens."}, "prix_sortie_centimes": {"type": "integer", "format": "int32"}, "consomme_mois_centimes": {"type": "integer", "format": "int64", "description": "Used this month by the whole instance, in hundredths of the instance currency."}}}, "ReglageBudget": {"type": "object", "description": "Monthly budget setting.", "properties": {"montant": {"type": ["integer", "null"], "format": "int64", "description": "Monthly amount excluding tax, in millionths of the instance currency; absent: no budget."}, "bloquer": {"type": "boolean", "description": "At the threshold, restrict outgoing calls (otherwise, alert only)."}}}, "ReglageDevise": {"type": "object", "description": "Currency to set.", "required": ["devise"], "properties": {"devise": {"type": "string", "description": "ISO 4217 code: `EUR`, `CHF`, `GBP`, `USD` or `CAD`."}}}, "ReglageEtape": {"type": "object", "required": ["etat"], "properties": {"etat": {"type": "string", "description": "`a_faire`, `fait` or `passe`."}}}, "ReglageForfait": {"type": "object", "description": "Plan fee setting; omitted: none on the rate table, or the rate table's for a customer.", "properties": {"forfait": {"oneOf": [{"$ref": "#/components/schemas/Forfait"}, {"type": "null"}]}}}, "ReglageJournal": {"type": "object", "description": "Call log setting of a customer.", "required": ["masquer_numeros"], "properties": {"masquer_numeros": {"type": "boolean", "description": "External numbers partially masked (default)."}}}, "ReglageMarque": {"type": "object", "properties": {"nom": {"type": ["string", "null"], "description": "Display name; absent or empty: the operator's."}, "couleur": {"type": ["string", "null"], "description": "Accent color `#rrggbb`; omitted: the default one."}, "couleur_menu": {"type": ["string", "null"], "description": "Side menu background `#rrggbb` (text and active entry are derived from it); absent: the\ndefault one."}, "couleur_texte": {"type": ["string", "null"], "description": "Text color `#rrggbb`; absent: the default one."}}}, "ReglageOidc": {"type": "object", "required": ["emetteur", "client_id", "libelle", "domaines", "creation_auto", "redirection"], "properties": {"emetteur": {"type": "string", "description": "Issuer URL (`issuer`), over https."}, "client_id": {"type": "string"}, "libelle": {"type": "string", "description": "Name shown on the login button."}, "domaines": {"type": "array", "items": {"type": "string"}, "description": "Accepted address domains; empty: all."}, "creation_auto": {"type": "boolean", "description": "Customer only: create the account of an address from its domains at its first sign-in;\nno effect while the operator does not let the customer add users (D121)."}, "redirection": {"type": "string", "description": "Redirect URL to register with the directory."}}}, "ReglageRps": {"type": "object", "description": "The operator's RPS keys, without the secret.", "required": ["cle_id", "region", "serveur", "modifie_le"], "properties": {"cle_id": {"type": "string", "description": "YMCS `AccessKey ID`."}, "region": {"type": "string", "description": "Region of the YMCS account: `eu`, `us` or `au`."}, "serveur": {"type": "string", "description": "Name of the RPS server, created in YMCS, that sends the phones to the instance."}, "modifie_le": {"type": "string", "description": "Last change (RFC 3339)."}}}, "ReglageSmtp": {"type": "object", "required": ["hote", "port", "securite", "mot_de_passe_defini", "expediteur", "nom_expediteur"], "properties": {"hote": {"type": "string"}, "port": {"type": "integer", "format": "int32", "minimum": 0}, "securite": {"type": "string", "description": "`starttls` (587), `tls` (465) or `aucune` (local relay, 25)."}, "identifiant": {"type": ["string", "null"], "description": "Omitted: relay without authentication."}, "mot_de_passe_defini": {"type": "boolean", "description": "A password is saved (never returned)."}, "expediteur": {"type": "string", "description": "Sender address for emails."}, "nom_expediteur": {"type": "string", "description": "Sender display name."}}}, "ReglageSsoClient": {"type": "object", "required": ["creation_auto"], "properties": {"creation_auto": {"type": "boolean", "description": "Create the account (user role, no extension) of an unknown address at its first\nsign-in through the operator's portal; no effect while the operator does not let the\ncustomer add users (D121)."}}}, "ReglageSsoJeton": {"type": "object", "required": ["actif", "audience"], "properties": {"actif": {"type": "boolean", "description": "Is a key in use?"}, "cree_le": {"type": ["string", "null"], "format": "date-time", "description": "Creation of the key in use."}, "audience": {"type": "string", "description": "Audience expected in tokens (`aud`): the portal's public URL."}}}, "ReglageSynthese": {"type": "object", "required": ["moteur", "cle_definie", "voix_fr", "voix_en", "piper", "piper_anglais"], "properties": {"moteur": {"$ref": "#/components/schemas/MoteurSynthese", "description": "`piper` (default) or `google`."}, "cle_definie": {"type": "boolean", "description": "A Google API key is stored (never returned)."}, "voix_fr": {"type": "string", "description": "Google voice for customers set to French (`fr-FR-Chirp3-HD-Leda`); its prefix gives the\nlanguage requested from Google."}, "voix_en": {"type": "string", "description": "Google voice for customers set to English (`en-US-Chirp3-HD-Leda`)."}, "piper": {"type": "boolean", "description": "Piper is installed on this server (default engine, and fallback for Google)."}, "piper_anglais": {"type": "boolean", "description": "Piper's English voice is installed."}}}, "ReglageTranscription": {"type": "object", "required": ["url", "cle_definie", "modele"], "properties": {"url": {"type": "string", "description": "API base URL, before `/audio/transcriptions` (`https://api.openai.com/v1`)."}, "cle_definie": {"type": "boolean", "description": "An API key is saved (never returned)."}, "modele": {"type": "string", "description": "Model (`whisper-1`, `Systran/faster-whisper-large-v3`…)."}, "langue": {"type": ["string", "null"], "description": "Language forced on every message (ISO 639-1); absent: the language of each mailbox's\ncustomer (D81)."}}}, "ReglagesBoite": {"type": "object", "description": "Mailbox settings.", "required": ["active", "courriels", "piece_jointe", "garder_apres_courriel", "transcription"], "properties": {"active": {"type": "boolean"}, "courriels": {"type": "array", "items": {"type": "string"}, "description": "5 addresses at most."}, "piece_jointe": {"type": "boolean"}, "garder_apres_courriel": {"type": "boolean", "description": "False only with at least one address and the attachment: otherwise the message would be\nlost."}, "transcription": {"type": "boolean"}}}, "ReglagesGarde": {"type": "object", "required": ["seuil", "fenetre_secondes", "duree_secondes", "liste_blanche"], "properties": {"seuil": {"type": "integer", "format": "int32", "description": "Failures that trigger banning (1 to 1000)."}, "fenetre_secondes": {"type": "integer", "format": "int32", "description": "Counting window, in seconds (10 to 86,400)."}, "duree_secondes": {"type": "integer", "format": "int32", "description": "Ban duration, in seconds (60 to 2,592,000)."}, "liste_blanche": {"type": "array", "items": {"$ref": "#/components/schemas/ReseauAutorise"}, "description": "Addresses or networks (CIDR) never banned."}}}, "ReleveLicence": {"type": "object", "required": ["jour", "utilisateurs"], "properties": {"jour": {"type": "string", "description": "Day recorded (`AAAA-MM-JJ`)."}, "utilisateurs": {"type": "integer", "format": "int64"}, "envoye_le": {"type": ["string", "null"], "format": "date-time", "description": "Accepted by the Hub."}, "erreur": {"type": ["string", "null"], "description": "Last delivery error."}}}, "ReleveMachine": {"type": "object", "description": "A machine reading.", "required": ["instant", "coeurs", "memoire_totale", "memoire_disponible", "charge"], "properties": {"instant": {"type": "string", "format": "date-time"}, "processeur": {"type": ["number", "null"], "format": "float", "description": "Share of the processor in use since the previous reading, from 0 to 1; absent at the first\nreading after a start."}, "coeurs": {"type": "integer", "format": "int32", "description": "Processor cores."}, "memoire_totale": {"type": "integer", "format": "int64"}, "memoire_disponible": {"type": "integer", "format": "int64", "description": "Memory available without swapping (the disk cache counts as available)."}, "charge": {"type": "number", "format": "float", "description": "One-minute load average (to compare with the number of cores)."}, "systeme_taille": {"type": ["integer", "null"], "format": "int64"}, "systeme_libres": {"type": ["integer", "null"], "format": "int64"}, "enregistrements_taille": {"type": ["integer", "null"], "format": "int64", "description": "Recordings volume (D101)."}, "enregistrements_libres": {"type": ["integer", "null"], "format": "int64"}}}, "ReleveSigne": {"type": "object", "description": "Signed usage report, as sent to the Hub.", "required": ["contenu", "signature", "cle_publique"], "properties": {"contenu": {"type": "string", "description": "JSON text of the usage report, signed as is."}, "signature": {"type": "string", "description": "Ed25519 signature of the content (hexadecimal)."}, "cle_publique": {"type": "string", "description": "Instance's public key (hexadecimal)."}}}, "Renvoi": {"type": "object", "required": ["ext", "nom", "numero"], "properties": {"ext": {"type": "string"}, "nom": {"type": "string"}, "numero": {"type": "string", "description": "Landline or mobile in the customer's country, never a special number (extension forwarding\nrule, [`crate::numerotation::destination_de_renvoi`]); numbers from other countries are refused."}}}, "RenvoiPoste": {"type": "object", "description": "A call forwarding rule: enabled or not, and its destination, kept when disabled.", "required": ["actif"], "properties": {"actif": {"type": "boolean"}, "destination": {"type": ["string", "null"], "description": "Landline or mobile in the customer's country (D124), never a special number (in France,\nnever an 08) nor a number from another country: E.164 in responses; national, `+` or\ninternational prefix followed by the country code on input."}}}, "RenvoisPoste": {"type": "object", "description": "An extension's four call forwarding rules.", "required": ["tous", "occupe", "sans_reponse", "injoignable"], "properties": {"tous": {"$ref": "#/components/schemas/RenvoiPoste", "description": "All calls: the phone no longer rings."}, "occupe": {"$ref": "#/components/schemas/RenvoiPoste", "description": "The extension is already on a call."}, "sans_reponse": {"$ref": "#/components/schemas/RenvoiPoste", "description": "No answer (before voicemail)."}, "injoignable": {"$ref": "#/components/schemas/RenvoiPoste", "description": "No phone connected."}}}, "RepertoireOuvert": {"type": "object", "description": "Shared directory open or not to the customer's users.", "required": ["actif"], "properties": {"actif": {"type": "boolean", "description": "The customer's users can add to the shared directory (and change or delete the contacts\nthey added)."}}}, "ReponseAssistant": {"type": "object", "required": ["messages", "budget_atteint"], "properties": {"messages": {"type": "array", "items": {}, "description": "Updated conversation, to send back as is with the next message."}, "en_attente": {"oneOf": [{"$ref": "#/components/schemas/ActionEnAttente"}, {"type": "null"}]}, "question": {"oneOf": [{"$ref": "#/components/schemas/QuestionAssistant"}, {"type": "null"}]}, "budget_atteint": {"type": "boolean"}}}, "ReponseDemandeOauth": {"type": "object", "description": "The user's answer to an authorization request.", "required": ["accepter"], "properties": {"accepter": {"type": "boolean", "description": "`true`: grant access; `false`: refuse it."}}}, "RequeteAppareil": {"type": "object", "description": "A request received from the device by the file service.", "required": ["fichier", "statut", "recue_le"], "properties": {"fichier": {"type": "string"}, "statut": {"type": "integer", "format": "int32", "minimum": 0}, "adresse": {"type": ["string", "null"]}, "agent": {"type": ["string", "null"]}, "recue_le": {"type": "string"}}}, "ReseauAutorise": {"type": "object", "required": ["reseau"], "properties": {"reseau": {"type": "string"}, "description": {"type": ["string", "null"]}}}, "Reservation": {"type": "object", "properties": {"revendeur_id": {"type": ["string", "null"], "format": "uuid", "description": "Reseller; missing or `null`: reservation lifted."}}}, "RestrictionBudget": {"type": "object", "description": "Restriction set by the budget.", "required": ["depuis"], "properties": {"depuis": {"type": "string", "format": "date-time"}}}, "RestrictionsPoste": {"type": "object", "required": ["poste", "natures"], "properties": {"poste": {"type": "string"}, "natures": {"type": "array", "items": {"type": "string"}, "description": "`surtaxes`, `international`, `sortants`."}}}, "ResumePasskey": {"type": "object", "required": ["id", "nom", "cree_le"], "properties": {"id": {"type": "string", "format": "uuid"}, "nom": {"type": "string"}, "cree_le": {"type": "string", "format": "date-time"}, "derniere_utilisation": {"type": ["string", "null"], "format": "date-time"}}}, "ResumeProfil": {"type": "object", "description": "A profile, without its templates.", "required": ["reference", "nom", "marque", "etiquette", "version", "nouvelle_version", "modeles", "appareils"], "properties": {"reference": {"type": "string", "description": "Identifier of a shipped profile (`yealink-bureau`) or uuid of a copy."}, "nom": {"type": "string"}, "marque": {"type": "string"}, "etiquette": {"type": "string", "description": "`teste`, `communautaire` (shipped profiles) or `copie`."}, "version": {"type": "integer", "format": "int32", "minimum": 0}, "origine": {"type": ["string", "null"], "description": "Original shipped profile of a copy, and its version when copied."}, "origine_version": {"type": ["integer", "null"], "format": "int32", "minimum": 0}, "nouvelle_version": {"type": "boolean", "description": "Kanadr ships a more recent version of the original profile."}, "redirection": {"type": ["string", "null"], "description": "Redirection service of the brand (`yealink-rps`)."}, "modeles": {"type": "array", "items": {"$ref": "#/components/schemas/ModeleMateriel"}}, "appareils": {"type": "integer", "format": "int64", "description": "Devices that use it."}}}, "ResumeVersion": {"type": "object", "description": "A published version, without its content.", "required": ["version", "auteur", "note", "publie_le"], "properties": {"version": {"type": "integer", "format": "int32"}, "auteur": {"type": "string"}, "note": {"type": "string"}, "publie_le": {"type": "string", "format": "date-time"}}}, "Retention": {"type": "object", "required": ["reglees", "appliquees"], "properties": {"reglees": {"$ref": "#/components/schemas/Durees", "description": "What is configured on this organization."}, "appliquees": {"$ref": "#/components/schemas/Durees", "description": "What applies, including settings from higher levels and default values; `null`:\nkept without limit."}}}, "Revendeur": {"type": "object", "required": ["id", "nom", "actif", "clients"], "properties": {"id": {"type": "string", "format": "uuid"}, "nom": {"type": "string"}, "actif": {"type": "boolean"}, "clients": {"type": "integer", "format": "int64", "description": "Number of customers that depend on the reseller."}}}, "SaisieContact": {"type": "object", "description": "Entry to add or modify.", "required": ["nom", "numero"], "properties": {"nom": {"type": "string", "description": "1 to 100 characters."}, "numero": {"type": "string", "description": "E.164, national (`06…`) or international with `00`; spaces, dots and dashes ignored."}}}, "SaisieContactPersonnel": {"type": "object", "description": "Personal contact to create or change.", "required": ["nom", "numeros"], "properties": {"nom": {"type": "string", "description": "1 to 100 characters."}, "entreprise": {"type": ["string", "null"], "description": "Optional, 100 characters at most."}, "numeros": {"type": "array", "items": {"type": "string"}, "description": "1 to 5 numbers: E.164, national (`06…`) or international with `00`."}}}, "Sante": {"type": "object", "description": "Instance health as seen by the organization (diagnostics).", "required": ["schema", "trunks", "webhooks_abandonnes", "version"], "properties": {"moteur": {"oneOf": [{"$ref": "#/components/schemas/SanteMoteur", "description": "Omitted: the telephony engine is not responding."}, {"type": "null"}]}, "schema": {"type": "integer", "format": "int64", "description": "Database schema version."}, "dernier_cdr": {"type": ["string", "null"], "format": "date-time", "description": "Last CDR received from its customers."}, "trunks": {"type": "array", "items": {"$ref": "#/components/schemas/SanteTrunk"}}, "webhooks_abandonnes": {"type": "integer", "format": "int64", "description": "Webhook deliveries abandoned over the last seven days, across its descendants."}, "version": {"type": "string", "description": "Installed product version (Debian package, D10)."}, "mise_a_jour": {"type": ["string", "null"], "description": "Newer version available in the apt repository, to install with `apt upgrade`."}, "stockage": {"oneOf": [{"$ref": "#/components/schemas/Stockage", "description": "Recordings volume and system disk (D101); for the operator only."}, {"type": "null"}]}, "telephone": {"oneOf": [{"$ref": "#/components/schemas/SanteTelephone", "description": "WebRTC softphone (D107): `ws-binding` and TURN server; for the operator only."}, {"type": "null"}]}}}, "SanteMoteur": {"type": "object", "description": "Telephony engine status.", "required": ["version", "appels"], "properties": {"version": {"type": "string"}, "fonctionne_depuis_secondes": {"type": ["integer", "null"], "format": "int64", "description": "Uptime in seconds (first line of `status`); absent if the line\ndoes not have the expected form.", "minimum": 0}, "appels": {"type": "integer", "format": "int64", "description": "Ongoing calls across the whole instance.", "minimum": 0}}}, "SanteTelephone": {"type": "object", "description": "WebRTC softphone (D107): what it needs on the machine.", "required": ["websocket", "websocket_ecoute"], "properties": {"websocket": {"type": "string", "description": "Address of the `internal` profile's `ws-binding` (loopback)."}, "websocket_ecoute": {"type": "boolean", "description": "Is the `ws-binding` listening? No: the `internal` profile has not been restarted since it\nwas enabled (the binary does it as soon as no call is in progress)."}, "turn": {"type": ["string", "null"], "description": "Host name of the TURN server; absent: TURN not set, the softphone cannot get through\nnetworks that block UDP."}, "turn_ecoute": {"type": ["boolean", "null"], "description": "Is coturn listening on 3478? Absent when TURN is not set."}}}, "SanteTrunk": {"type": "object", "description": "Status of a customer's trunk.", "required": ["client_id", "client"], "properties": {"client_id": {"type": "string", "format": "uuid"}, "client": {"type": "string"}, "enregistrement": {"type": ["string", "null"], "description": "Registration status according to the telephony engine (`REGED`, `FAIL_WAIT`…), if it responds; `NOREG`\nfor an IP-based trunk."}, "dernier_echec": {"oneOf": [{"$ref": "#/components/schemas/EchecEnregistrement", "description": "Last registration rejection from the provider (SIP code, reason)."}, {"type": "null"}]}}}, "SauvegardeFaite": {"type": "object", "description": "Last backup made by `kanadr sauvegarder` (D25).", "required": ["faite_le", "hote", "taille_octets", "schema"], "properties": {"faite_le": {"type": "string", "format": "date-time"}, "hote": {"type": "string"}, "taille_octets": {"type": "integer", "format": "int64"}, "schema": {"type": "integer", "format": "int64", "description": "Schema version saved."}}}, "SecuriteClient": {"type": "object", "required": ["second_facteur_force"], "properties": {"second_facteur_force": {"type": "boolean", "description": "Second factor required for all the customer's accounts, admins included."}}}, "ServeurIce": {"type": "object", "description": "ICE server (STUN or TURN), as the browser expects it (`RTCIceServer`).", "required": ["urls"], "properties": {"urls": {"type": "array", "items": {"type": "string"}, "description": "Addresses (`stun:`, `turn:`, `turns:`)."}, "identifiant": {"type": ["string", "null"], "description": "Ephemeral TURN username (`username`)."}, "mot_de_passe": {"type": ["string", "null"], "description": "Ephemeral TURN password (`credential`)."}}}, "SessionExportee": {"type": "object", "required": ["ouverte_le", "expire_le"], "properties": {"ouverte_le": {"type": "string", "format": "date-time"}, "expire_le": {"type": "string", "format": "date-time"}, "adresse_ip": {"type": ["string", "null"]}, "agent": {"type": ["string", "null"]}}}, "SeuilsDuClient": {"type": "object", "description": "A customer's own thresholds; absent: the instance's.", "properties": {"seuil_heure": {"type": ["integer", "null"], "format": "int64"}, "seuil_jour": {"type": ["integer", "null"], "format": "int64"}}}, "SeuilsPlafond": {"type": "object", "description": "Usage thresholds, in millionths of the instance currency, excluding tax, at purchase price.", "required": ["seuil_heure", "seuil_jour"], "properties": {"seuil_heure": {"type": "integer", "format": "int64", "description": "Over a rolling hour."}, "seuil_jour": {"type": "integer", "format": "int64", "description": "Over a rolling day."}}}, "Simultanes": {"type": "object", "description": "Concurrent calls hour by hour over a period.", "required": ["heures", "pic"], "properties": {"heures": {"type": "array", "items": {"$ref": "#/components/schemas/HeureSimultanee"}, "description": "Every hour of the period, even without calls."}, "pic": {"type": "integer", "format": "int64", "description": "Highest peak of the period."}}}, "Sip": {"type": "object", "required": ["ext", "nom", "hote", "identifiant", "numero_sip"], "properties": {"ext": {"type": "string"}, "nom": {"type": "string"}, "hote": {"type": "string", "description": "Service host, optional port (`voip.exemple.fr`, `voip.exemple.fr:5080`)."}, "identifiant": {"type": "string", "description": "Recording identifier."}, "numero_sip": {"type": "string", "description": "SIP number to call at the service: an address of the service, not necessarily a reachable\nnumber (`+33112…`)."}}}, "StatistiquesClient": {"type": "object", "description": "Statistics of a client's received calls.", "required": ["jours", "chaleur"], "properties": {"jours": {"type": "array", "items": {"$ref": "#/components/schemas/JourClient"}, "description": "Every day of the period, even without calls."}, "chaleur": {"type": "array", "items": {"$ref": "#/components/schemas/CaseChaleur"}, "description": "The 168 cells of the week (7 days × 24 hours), even empty ones."}}}, "StatistiquesParc": {"type": "object", "description": "Statistics of an operator's or reseller's customer base.", "required": ["jours", "fournisseurs"], "properties": {"jours": {"type": "array", "items": {"$ref": "#/components/schemas/JourParc"}, "description": "Every day of the period, even without calls."}, "fournisseurs": {"type": "array", "items": {"$ref": "#/components/schemas/QualiteFournisseur"}, "description": "Providers, from the most outgoing calls to the fewest."}}}, "StatutMessage": {"type": "object", "description": "New status of a message.", "required": ["lu"], "properties": {"lu": {"type": "boolean"}}}, "Stockage": {"type": "object", "properties": {"enregistrements": {"oneOf": [{"$ref": "#/components/schemas/Volume", "description": "Call recordings volume; absent if unreadable."}, {"type": "null"}]}, "systeme": {"oneOf": [{"$ref": "#/components/schemas/Volume", "description": "System disk (database, voicemail, logs); absent if unreadable."}, {"type": "null"}]}}}, "Strategie": {"type": "string", "enum": ["simultane", "sequence"]}, "SuffixeDomaine": {"type": "object", "description": "The instance's customer domain suffix (D108).", "properties": {"suffixe": {"type": ["string", "null"], "description": "Operator's subdomain (`voip.operateur.fr`): a customer created with its identifier\nalone (`client`) gets `client.voip.operateur.fr`. Absent: a full domain at\neach creation."}}}, "Svi": {"type": "object", "required": ["ext", "nom"], "properties": {"ext": {"type": "string"}, "nom": {"type": "string"}}}, "SyntheseAppels": {"type": "object", "description": "Figures for a period (portal tiles from production): inbound and outbound calls,\ntheir answered duration, missed inbound calls (neither connected nor message, D66), messages\nleft and average time to connection.", "required": ["entrants", "entrants_secondes", "entrants_non_repondus", "entrants_messages", "sortants", "sortants_secondes", "internes", "mises_en_relation", "mises_en_relation_secondes", "tarife", "sous_revendeur"], "properties": {"entrants": {"type": "integer", "format": "int64"}, "entrants_secondes": {"type": "integer", "format": "int64", "description": "Answered seconds of inbound calls."}, "entrants_non_repondus": {"type": "integer", "format": "int64", "description": "Missed inbound calls: neither connected to a person nor message left (D66)."}, "entrants_messages": {"type": "integer", "format": "int64", "description": "Inbound calls where the caller left a message."}, "reponse_moyenne_secondes": {"type": ["integer", "null"], "format": "int64", "description": "Average seconds between an inbound call's arrival and its connection; missing if no call\nwas answered."}, "sortants": {"type": "integer", "format": "int64", "description": "Outgoing calls from extensions, excluding connections (which they would count twice)."}, "sortants_secondes": {"type": "integer", "format": "int64"}, "internes": {"type": "integer", "format": "int64"}, "mises_en_relation": {"type": "integer", "format": "int64", "description": "Connections: outgoing legs of a forwarding to an outside number (D104)."}, "mises_en_relation_secondes": {"type": "integer", "format": "int64", "description": "Seconds connected with the other party."}, "tarife": {"type": "boolean", "description": "The customer has a sales rate card (its own, otherwise the default one): its outgoing calls\nare valued (D13)."}, "sous_revendeur": {"type": "boolean", "description": "The customer belongs to a reseller; shown only to those who see the sale to the reseller."}, "montant_achat": {"type": ["integer", "null"], "format": "int64", "description": "Totals for the period, in millionths of the instance currency, excluding tax, by role (like\nthe calls): purchase (operator), sale to the reseller (operator, reseller), sale to the customer (all)."}, "montant_revendeur": {"type": ["integer", "null"], "format": "int64"}, "montant_client": {"type": ["integer", "null"], "format": "int64"}, "marge": {"type": ["integer", "null"], "format": "int64", "description": "The operator's margin over the period: its sale (to the reseller, otherwise to the customer) minus\nthe purchase, on calls valued on both sides; operator only."}}}, "Tableau": {"type": "object", "description": "Dashboard of an organisation over a period.", "required": ["pas", "du", "au", "totaux", "tranches", "destinations", "clients"], "properties": {"pas": {"$ref": "#/components/schemas/Pas"}, "du": {"type": "string", "format": "date-time"}, "au": {"type": "string", "format": "date-time"}, "totaux": {"$ref": "#/components/schemas/Totaux"}, "precedent": {"oneOf": [{"$ref": "#/components/schemas/Totaux", "description": "Previous period of the same length, if requested (`comparer`)."}, {"type": "null"}]}, "tranches": {"type": "array", "items": {"$ref": "#/components/schemas/Tranche"}, "description": "Every slot of the period, even empty."}, "destinations": {"type": "array", "items": {"$ref": "#/components/schemas/DestinationTableau"}, "description": "Answered outbound calls by destination category, from the largest number of calls to the\nsmallest."}, "clients": {"type": "array", "items": {"$ref": "#/components/schemas/ClientTableau"}, "description": "Top-consuming customers (by sales, otherwise by calls); empty for a customer."}}}, "TailleModule": {"type": "string", "description": "Size of a module on the standard 12-column grid with fixed-height rows.", "enum": ["S", "M", "L", "XL"]}, "TarifsClient": {"type": "object", "description": "A customer's rates (D96): the sale rate plan that prices their calls today, read-only.", "required": ["nom", "effet", "lignes"], "properties": {"nom": {"type": "string", "description": "Rate plan name."}, "effet": {"type": "string", "format": "date"}, "lignes": {"type": "array", "items": {"$ref": "#/components/schemas/LigneTarifaire"}, "description": "Lines, by prefix."}}}, "Texte": {"type": "object", "required": ["texte"], "properties": {"texte": {"type": "string", "description": "Message to read, 1,500 characters at most. \"9h\", numbers, addresses and \"€\" are\nrewritten for the Piper voice; the Google voice receives the text as is."}, "poste": {"type": ["string", "null"], "description": "Greeting of this extension's voicemail box: the permission `messagerie.regler` on the\nextension is enough (the holder sets up their voicemail); otherwise `parcours.modifier`."}}}, "Totaux": {"type": "object", "description": "Calls and amounts of a slot or a period. Amounts in millionths of the instance currency, excluding tax;\nabsent when the account cannot see them.", "required": ["entrants", "sortants", "internes", "valorises", "secondes_facturees"], "properties": {"entrants": {"type": "integer", "format": "int64"}, "sortants": {"type": "integer", "format": "int64", "description": "Outgoing, forwarded calls included (D104)."}, "internes": {"type": "integer", "format": "int64"}, "valorises": {"type": "integer", "format": "int64", "description": "Answered and rated outbound calls."}, "secondes_facturees": {"type": "integer", "format": "int64"}, "ventes": {"type": ["integer", "null"], "format": "int64", "description": "What the organisation sells (for a customer: what it spends)."}, "achats": {"type": ["integer", "null"], "format": "int64", "description": "What the organisation buys; absent for a customer."}, "marge": {"type": ["integer", "null"], "format": "int64"}}}, "TotauxNatures": {"type": "object", "description": "Totals of the three kinds of amount, in millionths of the instance currency, excluding tax (empty\ncounted as 0).", "required": ["achat", "revendeur", "client"], "properties": {"achat": {"type": "integer", "format": "int64"}, "revendeur": {"type": "integer", "format": "int64"}, "client": {"type": "integer", "format": "int64"}}}, "ToucheAppareil": {"type": "object", "description": "A programmable key of a device.", "required": ["position", "nature", "valeur", "libelle"], "properties": {"position": {"type": "integer", "format": "int32", "minimum": 0}, "nature": {"type": "string", "description": "`ligne`, `supervision` or `numero_abrege`."}, "valeur": {"type": "string", "description": "Monitored extension, speed-dial number (E.164 or extension) or line rank."}, "libelle": {"type": "string"}, "ligne": {"type": "integer", "format": "int32", "description": "Account that uses it (1 by default).", "minimum": 0}}}, "TraceAppel": {"type": "object", "description": "Trace of a call.", "required": ["etapes", "applications", "cause"], "properties": {"etapes": {"type": "array", "items": {"$ref": "#/components/schemas/EtapeTrace"}}, "applications": {"type": "array", "items": {"$ref": "#/components/schemas/ApplicationTrace"}}, "cause": {"type": "string", "description": "Telephony engine `hangup_cause`."}, "code_sip": {"type": ["string", "null"], "description": "Last SIP hangup code."}, "raccroche": {"type": ["string", "null"], "description": "`recv_bye`: the other party hung up; `send_bye`: we did."}, "mis_en_relation_avec": {"type": ["string", "null"]}, "cause_relation": {"type": ["string", "null"]}, "codecs": {"type": ["string", "null"]}, "ip_distante": {"type": ["string", "null"]}, "logiciel_distant": {"type": ["string", "null"]}}}, "Tranche": {"allOf": [{"$ref": "#/components/schemas/Totaux"}, {"type": "object", "required": ["debut"], "properties": {"debut": {"type": "string", "format": "date-time"}}}], "description": "A slot of the period."}, "Trunk": {"type": "object", "required": ["client_id", "passerelle_uuid", "fournisseur", "proxy", "mot_de_passe_defini", "format", "reseaux"], "properties": {"client_id": {"type": "string", "format": "uuid"}, "passerelle_uuid": {"type": "string", "format": "uuid", "description": "SIP gateway of the trunk (its name in the telephony engine)."}, "profil_id": {"type": ["string", "null"], "format": "uuid", "description": "Trunk profile it is based on (D95); absent: fully entered trunk."}, "fournisseur": {"type": "string"}, "proxy": {"type": "string"}, "identifiant": {"type": ["string", "null"]}, "mot_de_passe_defini": {"type": "boolean", "description": "A password is saved (never returned)."}, "format": {"$ref": "#/components/schemas/Format"}, "reseaux": {"type": "array", "items": {"type": "string"}}, "ndi": {"type": ["string", "null"], "description": "Main number (D48), if it is still one of the customer's numbers."}, "enregistrement": {"type": ["string", "null"], "description": "Registration status with the C5 according to the telephony engine (`REGED`, `FAILED`…), if it responds."}, "dernier_echec": {"oneOf": [{"$ref": "#/components/schemas/EchecEnregistrement", "description": "Last C5 registration rejection since the last trunk write."}, {"type": "null"}]}}}, "UtilisateurClient": {"type": "object", "required": ["id", "courriel", "nom", "role", "actif", "telephone_seulement"], "properties": {"id": {"type": "string", "format": "uuid"}, "courriel": {"type": "string"}, "nom": {"type": "string"}, "role": {"type": "string"}, "actif": {"type": "boolean"}, "poste": {"type": ["string", "null"], "description": "Extension number, if any."}, "telephone_seulement": {"type": "boolean", "description": "\"Phone only\" account (D107): its session opens only the softphone."}, "invitation_envoyee": {"type": ["boolean", "null"], "description": "On creation only: was the invitation sent by email? `false` when no email server\nis configured, or if the server rejected it (resend with\n`POST /utilisateurs/{id}/invitation`)."}}}, "UtilisateursClient": {"type": "object", "required": ["client_id", "nom", "utilisateurs"], "properties": {"client_id": {"type": "string", "format": "uuid"}, "nom": {"type": "string"}, "utilisateurs": {"type": "integer", "format": "int64"}}}, "Validation": {"type": "object", "description": "Validation result.", "required": ["globales", "par_module", "ecartes"], "properties": {"globales": {"type": "array", "items": {"$ref": "#/components/schemas/Erreur"}, "description": "Errors that block any publication."}, "par_module": {"type": "object", "description": "Errors specific to a module, by identifier (the module is excluded).", "additionalProperties": {"type": "array", "items": {"$ref": "#/components/schemas/Erreur"}}, "propertyNames": {"type": "string"}}, "ecartes": {"type": "array", "items": {"type": "string"}, "description": "Excluded modules: in error, or leading to a module in error. They keep what is\nserved today.", "uniqueItems": true}}}, "Verification": {"type": "object", "description": "How a call flow fares against the customer's situation: validation and changes compared\nwith the published version.", "required": ["validation", "diff"], "properties": {"validation": {"$ref": "#/components/schemas/Validation"}, "diff": {"$ref": "#/components/schemas/Diff"}}}, "VersionParcours": {"type": "object", "description": "A published version.", "required": ["version", "contenu", "auteur", "note", "publie_le"], "properties": {"version": {"type": "integer", "format": "int32"}, "contenu": {"$ref": "#/components/schemas/Parcours"}, "auteur": {"type": "string", "description": "Author name; empty for an automatic migration."}, "note": {"type": "string"}, "publie_le": {"type": "string", "format": "date-time"}}}, "VersionProfil": {"type": "object", "description": "A saved version of a copy.", "required": ["version", "nom", "auteur", "resume", "cree_le"], "properties": {"version": {"type": "integer", "format": "int32", "minimum": 0}, "nom": {"type": "string"}, "auteur": {"type": "string"}, "resume": {"type": "string"}, "cree_le": {"type": "string"}}}, "VoixDuClient": {"type": "object", "description": "A customer's announcement voice.", "required": ["langue"], "properties": {"voix": {"type": ["string", "null"], "description": "Voice chosen by the customer; absent: the instance voice."}, "langue": {"type": "string", "description": "Announcement language, the customer's: `fr` or `en`."}, "instance": {"oneOf": [{"$ref": "#/components/schemas/VoixSynthese", "description": "Instance voice for this language; absent if the instance has none."}, {"type": "null"}]}, "utilisee": {"oneOf": [{"$ref": "#/components/schemas/VoixSynthese", "description": "Voice that reads announcements typed as text; absent if none is installed."}, {"type": "null"}]}, "repli": {"type": ["string", "null"], "description": "The chosen voice is not used and the instance voice replaces it:\n`voix_indisponible` (the instance no longer offers it) or `voix_autre_langue` (it is not in\nthe customer's language)."}}}, "VoixSynthese": {"type": "object", "description": "A voice of the instance.", "required": ["id", "moteur", "nom", "libelle"], "properties": {"id": {"type": "string", "description": "Identifier to save: `piper:fr_FR-siwis-medium`, `google:fr-FR-Chirp3-HD-Leda`."}, "moteur": {"$ref": "#/components/schemas/MoteurSynthese", "description": "`piper` (on the server) or `google` (Google Cloud Text-to-Speech, operator's key)."}, "nom": {"type": "string", "description": "Name at the engine: Piper model or Google voice."}, "libelle": {"type": "string", "description": "Short name to display (`Siwis`, `Leda`)."}, "region": {"type": ["string", "null"], "description": "Region of the voice (`fr-FR`, `en-GB`), if its name gives it."}}}, "Volume": {"type": "object", "required": ["taille_octets", "libres_octets", "dedie"], "properties": {"taille_octets": {"type": "integer", "format": "int64", "minimum": 0}, "libres_octets": {"type": "integer", "format": "int64", "description": "Available bytes.", "minimum": 0}, "dedie": {"type": "boolean", "description": "Its own filesystem (recordings): when full, it does not fill the system\ndisk."}}}, "Webhook": {"type": "object", "description": "An organization's endpoint, without its secret.", "required": ["url", "evenements", "actif", "echecs"], "properties": {"url": {"type": "string"}, "evenements": {"type": "array", "items": {"type": "string"}}, "actif": {"type": "boolean"}, "echecs": {"type": "integer", "format": "int32", "description": "Consecutive failures (20 disable the endpoint)."}, "desactive_le": {"type": ["string", "null"], "format": "date-time", "description": "Turned off automatically at this time, after 20 consecutive failures."}}}, "WebhookAvecSecret": {"allOf": [{"$ref": "#/components/schemas/Webhook"}, {"type": "object", "required": ["secret"], "properties": {"secret": {"type": "string", "description": "64 hexadecimal characters; signs deliveries (`X-Webhook-Signature`)."}}}], "description": "Endpoint created or secret renewed: the secret, shown this time only."}}, "securitySchemes": {"cle_api": {"type": "http", "scheme": "bearer", "description": "API key (`cx_…`), except for managing keys."}, "session": {"type": "apiKey", "in": "cookie", "name": "session"}}}, "tags": [{"name": "exploitation", "description": "Instance status"}, {"name": "connexion", "description": "Login, session and password"}, {"name": "clients", "description": "End customers, their users and extensions"}, {"name": "organisations", "description": "Operator's resellers, team accounts of the operator and resellers (D7)"}, {"name": "numeros", "description": "Number inventory, reservation, assignment and destination (D28, D40)"}, {"name": "parcours", "description": "A customer's call flow: draft, validation, publication, versions"}, {"name": "garde", "description": "IP banning: settings, banned addresses, unblocking (D23, D43)"}, {"name": "trunks", "description": "Customer C5 trunk, operator trunk profiles and extension call restrictions (D38, D42, D95)"}, {"name": "cles-api", "description": "API keys: service accounts with restricted permissions"}, {"name": "oauth", "description": "Applications an account has authorized to use the MCP server with its rights (OAuth 2.1, D105)"}, {"name": "webhooks", "description": "Outbound webhooks: endpoint, secret, deliveries; monthly CSV via signed link (D61)"}, {"name": "enregistrements", "description": "Call recordings: list, playback, ZIP export, deletion (D62)"}, {"name": "repertoire", "description": "Customer's shared phonebook: contacts shared by its extensions"}, {"name": "provisionnement", "description": "Phone setup: extension links, link by email (D35)"}, {"name": "materiel", "description": "Desk phones: the operator's hardware profiles, customers' devices (D115)"}, {"name": "diagnostic", "description": "Diagnostics (D5): call trace, ongoing calls, logged actions"}, {"name": "journal", "description": "A customer's call log: rated calls, number masking (D20, D60)"}, {"name": "grilles", "description": "Rate tables: purchase, sale to reseller, sale to customer; assignment (D13, D59)"}, {"name": "messagerie", "description": "Extension voicemail mailboxes: settings, greeting, messages (D37, D56, D57)"}]}