Kanadr API reference
Public API: everything the portal does goes through it. **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. 311 operations. Interactive reference: Redoc; machine-readable description: openapi.en.json. Kanadr is a white-label hosted PBX for telecom operators: www.kanadr.com.
Instance status
GET /api/v1/marque: Operator brand: name, colors, logo. No session required.GET /api/v1/marque/icone: Square app icon (favicon, installed app): the uploaded one (PNG), otherwise the operator's name initial, in white on its color (maskable icon safe zone respected). No session.GET /api/v1/marque/logo: Operator logo. No session required; cached by the browser (the URL changes with it).GET /api/v1/marque/manifeste: Installable portal manifest (PWA): operator name and color, icon in its color. No session required.GET /api/v1/marque/manifeste-telephone: Manifest of the installable softphone (D107): an application separate from the portal (`id`, scope and start `/telephone/`), "Phone" under the operator's brand, which opens `tel:` and `sip:` links. No session; name in English if the browser prefers it.GET /api/v1/mise-en-route: Setup state: the wizard's steps and findings. Operator admin.PUT /api/v1/mise-en-route/affichage: Hides or shows again the setup tile on the operator's home page.GET /api/v1/mise-en-route/certificat: Certificate served over HTTPS and last Let's Encrypt request. Operator admin.POST /api/v1/mise-en-route/certificat: Requests a Let's Encrypt certificate for the instance's host (`KANADR_URL_PUBLIQUE`), and only that host: the system service that runs certbot reads the host from the machine's settings; nothing comes from the request. The result is read on `GET /mise-en-route/certificat`.GET /api/v1/mise-en-route/domaines: What the DNS gives for the instance's host name, and for a name under the customer domain suffix (wildcard record). Operator admin.PUT /api/v1/mise-en-route/etapes/{etape}: Sets the state of a step: done, skipped or to do again.POST /api/v1/mise-en-route/premier-acces: First access: creates the operator and its first administrator, like `kanadr initialiser`. The link works only once. No session.POST /api/v1/mise-en-route/premier-acces/verification: Is the first access link valid? No session; 404 otherwise, like any unknown address.GET /api/v1/sante: The instance responds and its database is reachable.
Login, session and password
POST /api/v1/connexion: Opens a session. The token is set in an `HttpOnly`, `Secure`, `SameSite=Strict` cookie. A `appareil` cookie valid for this account (trusted device, D53) waives the second factor: the step is then `connecte`. On a trusted device, the session lasts until the trust ends (30 days at most, D76).POST /api/v1/connexion/passkey/debut: Starts passkey login (session awaiting the second factor): options to pass to `navigator.credentials.get()`.POST /api/v1/connexion/passkey/fin: Completes passkey sign-in: full session (new cookie). A rejection counts as a failed sign-in (lockout after 5).POST /api/v1/connexion/second-facteur: Completes sign-in with a TOTP code or a backup code. Five wrong codes lock the account for 15 minutes, like wrong passwords. With `confiance`, this browser is exempt from the code for 30 days (the password is still required).POST /api/v1/deconnexion: Closes the current session.POST /api/v1/deconnexion/partout: Logs the account out of all its devices: closes all its sessions, including the current one, and forgets its trusted devices (password and code asked again everywhere, D76).GET /api/v1/moi: Account of the current session.GET /api/v1/moi/contacts: Personal contacts of the signed-in account, by name.POST /api/v1/moi/contacts: Adds a personal contact.PUT /api/v1/moi/contacts/{id}: Changes a personal contact.DELETE /api/v1/moi/contacts/{id}: Deletes a personal contact, and its favourite.GET /api/v1/moi/favoris: Favourites of the signed-in account, in order.PUT /api/v1/moi/favoris: Replaces the signed-in account's favourites (ordered list, 30 at most, no duplicates); a personal favourite points to one of its personal contacts.GET /api/v1/moi/telephone: SIP credentials of the logged-in account's extension, for the softphone (D107): to its holder only, logged in in person (no API key, authorized application, assistant or MCP), never to an admin on behalf of someone else. Read is logged, without the password.GET /api/v1/moi/telephone/contacts: Softphone contacts: the other in-service extensions of the account's customer, then its shared directory.POST /api/v1/moi/telephone/mobile: Registers the signed-in account's mobile app on its extension (D117), or refreshes its push token. For the extension holder, in person. A new registration sets up waking for the extension.DELETE /api/v1/moi/telephone/mobile/acces: Sign-out of the in-house mobile app (D117): it revokes its own device token and forgets its push registration. With a device token only.DELETE /api/v1/moi/telephone/mobile/{identifiant}: Removes the signed-in account's mobile app (sign-out from the app): it is no longer woken.POST /api/v1/mot-de-passe: Sets the password with an invitation or reset token. Closes the account's open sessions.POST /api/v1/mot-de-passe/oubli: Forgotten password: if an active account has this address and an email server is configured, a link to choose a new password (valid for one hour) is sent to this address. The response is the same in every case, and returned before sending: it does not reveal whether the account exists.GET /api/v1/second-facteur/passkeys: Passkeys of the signed-in account.POST /api/v1/second-facteur/passkeys/debut: Starts registering a passkey: options to pass to `navigator.credentials.create()`.POST /api/v1/second-facteur/passkeys/fin: Completes the registration. If the session was limited to second-factor enrollment, it becomes full (new cookie).DELETE /api/v1/second-facteur/passkeys/{id}: Deletes a passkey of the signed-in account.POST /api/v1/second-facteur/totp: Starts enrolling an authenticator app (TOTP).POST /api/v1/second-facteur/totp/confirmation: Confirms enrollment with a first code. Returns the backup codes; if the session was limited to enrollment, it becomes full (new cookie).GET /api/v1/sso/jeton: Login with a signed token from the operator's portal (D79): the tool sends its customer's browser there. Token valid for ten minutes at most, single use. Success: session opened (cookie) and return to the portal; rejected: login page with `?sso=` (`ferme`, `invalide`, `expire`, `deja_utilise`, `compte_inconnu`, `compte_inactif`).POST /api/v1/sso/oidc/debut: Starts login through the directory of the account's organization: returns the URL to send the browser to. 404 `sso_absent` if no directory applies to this address.GET /api/v1/sso/oidc/retour: Identity provider callback: the code is exchanged for the `id_token`, verified, then the session is opened and the portal displayed; otherwise the sign-in page with `?sso=` (`invalide`, `expire`, `compte_inconnu`, `compte_inactif`, `annule`).
End customers, their users and extensions
GET /api/v1/clients/{client_id}: A customer.DELETE /api/v1/clients/{client_id}: Terminates a customer: extensions, voicemail, SIP connectors, call flow, phonebook and SIP domain deleted, with their files (announcements, messages, recordings, music); accounts, API keys and webhook deleted. Permanent. The organization remains (disabled, dated) for the audit log and CDRs of past months. Refused while the customer has numbers (remove them: they return to the inventory) or a trunk (delete it). Restricted to the parent level.PATCH /api/v1/clients/{client_id}: Renames, suspends or reactivates a customer, sets its call recording (D111) or whether its admin can add users and extensions (D121). Suspended: its accounts can no longer sign in (sessions closed), its API keys no longer work, its phones no longer register and its numbers no longer ring (SIP domain out of service), it no longer counts towards the license (D71). Everything stays in place for reactivation. Reserved to the level above (operator, the customer's reseller).GET /api/v1/clients/{client_id}/appels-bloques: Customer's blocked inbound calls.PUT /api/v1/clients/{client_id}/appels-bloques: Replaces the customer's blocked inbound calls; its inbound routes are rewritten.GET /api/v1/clients/{client_id}/appels-chiffres: The customer's encrypted calls.PUT /api/v1/clients/{client_id}/appels-chiffres: Turns the customer's encrypted calls on or off.GET /api/v1/clients/{client_id}/evenements: Live changes of a customer, as `text/event-stream`: `changement` events (JSON), one hour at most, then the browser reconnects. The portal then reads the state of extensions or calls again, without polling the telephony engine.GET /api/v1/clients/{client_id}/postes/etat: Status of a customer's extensions: currently registered, devices, last registration.GET /api/v1/clients/{client_id}/postes/{poste}/enregistrement: Recording setting of the extension.PUT /api/v1/clients/{client_id}/postes/{poste}/enregistrement: Configures call recording for the extension; the published call flow is rewritten (armed before a pre-answer).GET /api/v1/clients/{client_id}/postes/{poste}/ne-pas-deranger: The extension's "do not disturb".PUT /api/v1/clients/{client_id}/postes/{poste}/ne-pas-deranger: Sets the extension's "do not disturb", applied from the next call.GET /api/v1/clients/{client_id}/postes/{poste}/renvois: Extension call forwarding.PUT /api/v1/clients/{client_id}/postes/{poste}/renvois: Configures the extension's call forwarding, applied to the next call (without publishing the call flow).GET /api/v1/clients/{client_id}/securite: A customer's security.PUT /api/v1/clients/{client_id}/securite: Requires (or not) the second factor for the customer's regular users.GET /api/v1/clients/{client_id}/utilisateurs: A customer's users, with their extension.POST /api/v1/clients/{client_id}/utilisateurs: Creates a user at a customer, with their extension if they have one, and sends them their invitation by email (the operator's SMTP server). The operator and the customer's reseller can always add users; the customer admin only if the operator or the reseller allows it (D121: each account counts towards the license and what the operator bills).GET /api/v1/clients/{client_id}/voix: The customer's announcement voice: its choice, the instance voice and the one that reads.PUT /api/v1/clients/{client_id}/voix: Chooses the customer's announcement voice, among the instance's voices for its language, or returns to the instance voice. Announcements already saved do not change: the voice is used for the next texts read.GET /api/v1/clients/{client_id}/voix/disponibles: Voices the customer can choose: the instance's voices for its announcement language, the instance voice first.POST /api/v1/clients/{client_id}/voix/essai: Has a voice read a short sentence in the customer's language, to listen to it before choosing it; nothing is saved. As for an announcement, Piper reads if Google fails.GET /api/v1/organisations/{id}/clients: Customers visible from an organization (its descendants).POST /api/v1/organisations/{id}/clients: Creates a customer under an operator or a reseller, with its SIP domain.GET /api/v1/organisations/{id}/suffixe-domaine: Customer domain suffix (D108), for those who create customers (the operator and its resellers) or view the settings.DELETE /api/v1/utilisateurs/{id}: Deletes an account and its extension: extension, voicemail box and messages, call restrictions. Refused while the customer's published call flow leads to the extension: modify the call flow first. A phone left configured will not get the site banned for 30 days; uninstall it. Never one's own account.PATCH /api/v1/utilisateurs/{id}: Modifies an account: name (used as its extension's display name), email address, role of the same level, disabling or re-enabling, phone-only restriction (D107). When disabled, the account loses its sessions, no longer counts towards the license (D71), and its extension is put out of service (it no longer registers, neither receives nor makes calls; its voicemail and settings remain). Never one's own role or status. The email address is the sign-in identifier: never that of an account with a higher role; when changed, it closes the account's sessions and authorized applications, cancels its pending invitation or forgotten-password links, and notifies the old and the new address (a new invitation goes to the new one if the account has not chosen its password yet); the before and after go to the audit log.GET /api/v1/utilisateurs/{id}/donnees: Export of a user's personal data (right of access and portability), as JSON. By the person themselves or an admin of their organization (`utilisateur.modifier`). The numbers are shown in full for the person and whoever may see them (D60), masked otherwise. Logged.POST /api/v1/utilisateurs/{id}/effacement: Erases a user (right to erasure): account, extension, voicemail and messages, and the recordings of their extension's calls. CDRs remain (one-year retention obligation, CPCE L34-1), as does the audit log. By an admin of their organization; never their own account. Rejected while the published call flow leads to their extension (`poste_utilise`).POST /api/v1/utilisateurs/{id}/invitation: Sends (or resends) a user's invitation: a new link to choose their password, to their email address; the previous link stops working. Also used for forgotten passwords. Permission `utilisateur.modifier` on the account's organization.POST /api/v1/utilisateurs/{id}/poste: Gives an extension to a customer account that has none (created without a phone, or by the company directory): same rules and same settings as when creating a team member with an extension (extension, voicemail, the customer's hold music, display name = account name). An account has a single extension: to change it, create the new team member, then delete the old one.POST /api/v1/utilisateurs/{id}/second-facteur/reinitialisation: Resets a user's second factor (lost phone, misplaced passkey): TOTP, passkeys and backup codes deleted, sessions closed; the user sets up a new one at their next sign-in. Restricted to an admin **of the parent level** (§6): ancestor organization, or customer admin for a regular user of their customer. Never one's own account, never through an API key.
Operator's resellers, team accounts of the operator and resellers (D7)
GET /api/v1/organisations/{id}: An organization: name, type, parent.GET /api/v1/organisations/{id}/comptes: An organization's accounts (its own, not those of its descendants).POST /api/v1/organisations/{id}/comptes: Creates a team account at the operator (admin or support) or at a reseller (admin), and sends them their invitation by email. The second factor will be required at their first login (§6).GET /api/v1/organisations/{id}/fonctions: Features turned on for the instance.PUT /api/v1/organisations/{id}/fonctions: Turns resellers, the AI assistant and voicemail on or off. Turning voicemail off disables every mailbox (their state is kept, and so are their messages); turning it back on gives each mailbox its previous state back.GET /api/v1/organisations/{id}/revendeurs: Resellers visible from an organization (its descendants), with their number of customers.POST /api/v1/organisations/{id}/revendeurs: Creates a reseller under the operator. Its customers are then created under it (`POST /organisations/{id}/clients`), its admins via `POST /organisations/{id}/comptes`.GET /api/v1/organisations/{id}/supervision: Status of the monitoring token (never the token itself).POST /api/v1/organisations/{id}/supervision/jeton: Creates the monitoring token, or replaces it: the old one stops working at once.DELETE /api/v1/organisations/{id}/supervision/jeton: Revokes the monitoring token: `/metrics` is local only again.
Number inventory, reservation, assignment and destination (D28, D40)
GET /api/v1/clients/{client_id}/numeros: A customer's numbers.POST /api/v1/clients/{client_id}/numeros: Assigns a free number from the inventory to a customer. A reserved number only goes to a customer of the reseller; a reseller only assigns its reserved numbers (D40).DELETE /api/v1/clients/{client_id}/numeros/{numero_id}: Removes a number from a customer: it becomes free again in the inventory, with its reservation, leaves the call flow (new published version) and is no longer routed.PUT /api/v1/clients/{client_id}/numeros/{numero_id}/destination: Sets the destination of a customer number: one of its extensions, or none. Call flow shortcut: publishes a new version (the draft based on the served version receives the same change), and the inbound route is rewritten immediately.PUT /api/v1/clients/{client_id}/postes/{poste}/numero-presente: Chooses the number an extension presents externally, among the customer's numbers (as in production).PUT /api/v1/numeros/{numero_id}/etat: Changes a number's status. Outside a customer: `libre`, `porte_sortant` or `resilie`. A number at a customer can only go to `porte_sortant`: it leaves the customer like a removal (call flow republished, route deleted, no longer presented) and cannot be assigned again.PUT /api/v1/numeros/{numero_id}/reservation: Reserves a number from the inventory for a reseller, or lifts the reservation.GET /api/v1/organisations/{id}/numeros: Numbers visible from an organization: all for the operator; for a reseller, its reserved ones and those of its customers; for a customer, its own.POST /api/v1/organisations/{id}/numeros: Adds numbers to the operator's inventory, as free. All or nothing.
A customer's call flow: draft, validation, publication, versions
GET /api/v1/clients/{client_id}/annonces: Announcements uploaded for the modules of the published call flow and the draft.GET /api/v1/clients/{client_id}/annonces/{nature}/{cible}: Playback of an announcement: the WAV as the telephony engine plays it.PUT /api/v1/clients/{client_id}/annonces/{nature}/{cible}: Uploads an announcement: the file (WAV, MP3, AAC/M4A, Ogg Vorbis, FLAC; 20 MB, 10 minutes at most) is converted to 16-bit 8 kHz mono WAV and replaces any announcement in place. The published version of the call flow is rewritten to reference it (without a new version).DELETE /api/v1/clients/{client_id}/annonces/{nature}/{cible}: Removes an announcement; the published call flow version stops referencing it.GET /api/v1/clients/{client_id}/horaires: Schedules of the published call flow: open or closed now, and until when.GET /api/v1/clients/{client_id}/musique-attente: Playback of the customer's music on hold.PUT /api/v1/clients/{client_id}/musique-attente: Uploads the customer's music on hold: the file (WAV, MP3, AAC/M4A, Ogg Vorbis, FLAC; 20 MB, 10 minutes at most) is converted to 16-bit 8 kHz mono WAV and played in a loop, from the start, on every hold on its extensions.DELETE /api/v1/clients/{client_id}/musique-attente: Removes the customer's hold music: the generic music applies again.GET /api/v1/clients/{client_id}/parcours: The customer's call flow: served version, and draft with its validation.PUT /api/v1/clients/{client_id}/parcours/brouillon: Saves the customer's draft (it replaces the previous one).DELETE /api/v1/clients/{client_id}/parcours/brouillon: Discards the customer's draft.PUT /api/v1/clients/{client_id}/parcours/connecteurs-sip/{ext}/mot-de-passe: Saves the password of the SIP connector with internal number `ext`, encrypted (D27), outside the call flow. If the published version contains this connector, its gateway is updated right away (stop then reload), without a new version: a connector left out for lack of a password goes into service. Logged, without the password.GET /api/v1/clients/{client_id}/parcours/disposition: Layout of the customer's call flow diagram.PUT /api/v1/clients/{client_id}/parcours/disposition: Replaces the diagram layout (empty: everything becomes automatic again, "Rearrange").POST /api/v1/clients/{client_id}/parcours/publication: Publishes the customer's draft: it becomes the served version and is removed. Modules rejected by validation keep what was served.POST /api/v1/clients/{client_id}/parcours/verification: Checks a call flow without saving it: validation against the customer's extensions and numbers, and changes compared to the published version.GET /api/v1/clients/{client_id}/parcours/versions: The customer's published versions, from newest to oldest.GET /api/v1/clients/{client_id}/parcours/versions/{version}: A published version, with its content.POST /api/v1/clients/{client_id}/parcours/versions/{version}/restauration: Restores a published version into the draft (it replaces the current draft), to be published afterward.POST /api/v1/clients/{client_id}/synthese: Reads a text with the voice chosen by the customer (`…/voix`), otherwise the instance voice set by the operator (Piper, or Google with Piper as fallback), and returns the WAV as the phone will play it; nothing is stored. To make it an announcement, upload this WAV (`PUT …/annonces/…`).
IP banning: settings, banned addresses, unblocking (D23, D43)
GET /api/v1/organisations/{id}/destinations-bloquees: Destinations blocked for all customers (D23).PUT /api/v1/organisations/{id}/destinations-bloquees: Replaces the blocked destinations; the outbound routes of all customers are rewritten in the same transaction. Emergency numbers always remain reachable (D22).GET /api/v1/organisations/{id}/garde: Ban settings and currently banned addresses.PUT /api/v1/organisations/{id}/garde: Changes threshold, window, duration and allowlist.POST /api/v1/organisations/{id}/garde/bannies: Bans an address by hand (§8), for SIP and RTP: a scanner, a device to cut off. Refused for an address in the allow list or of a trunk. Logged.DELETE /api/v1/organisations/{id}/garde/bannies/{ip}: Lifts the ban on an address.
Customer C5 trunk, operator trunk profiles and extension call restrictions (D38, D42, D95)
GET /api/v1/clients/{client_id}/plafond: A customer's usage cap: thresholds, usage and current restriction.PUT /api/v1/clients/{client_id}/plafond: Sets a customer's own thresholds (absent: the instance's); operator admin only.POST /api/v1/clients/{client_id}/plafond/levee: 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.GET /api/v1/clients/{client_id}/postes/{poste}/restrictions: Call restrictions of an extension: for whoever sees the customer's extensions, and for its holder, who reads them in « My extension » without being able to change them.PUT /api/v1/clients/{client_id}/postes/{poste}/restrictions: Replaces an extension's restrictions. Emergency numbers always remain reachable (D22).GET /api/v1/clients/{client_id}/restrictions: Call restrictions for a customer's extensions.GET /api/v1/clients/{client_id}/trunk: A customer's C5 trunk.PUT /api/v1/clients/{client_id}/trunk: Creates or replaces a customer's C5 trunk: its gateway, its outbound routes and its provider's networks.DELETE /api/v1/clients/{client_id}/trunk: Deletes a customer's trunk: its gateway and its outbound routes. The customer can no longer make external calls.GET /api/v1/organisations/{id}/profils-trunk: Operator's trunk profiles.POST /api/v1/organisations/{id}/profils-trunk: Creates a trunk profile.PUT /api/v1/organisations/{id}/profils-trunk/{profil_id}: Updates a trunk profile: the trunks based on it follow (gateways, outbound routes, provider ACL).DELETE /api/v1/organisations/{id}/profils-trunk/{profil_id}: Deletes a trunk profile that no trunk uses.
API keys: service accounts with restricted permissions
DELETE /api/v1/cles-api/{id}: Revokes an API key, permanently.GET /api/v1/organisations/{id}/cles-api: An organization's API keys (without their secret).POST /api/v1/organisations/{id}/cles-api: Creates an API key for an organization.
Applications an account has authorized to use the MCP server with its rights (OAuth 2.1, D105)
GET /api/v1/moi/applications: Applications authorized by the signed-in account (OAuth, MCP server), still in force.DELETE /api/v1/moi/applications/{id}: Removes an application's access: its tokens stop working at once.GET /api/v1/oauth/demandes/{id}: Authorization request awaiting the signed-in account's approval.POST /api/v1/oauth/demandes/{id}/reponse: Grants or refuses the requested access; the grant is recorded in the audit log.
Outbound webhooks: endpoint, secret, deliveries; monthly CSV via signed link (D61)
GET /api/v1/organisations/{id}/webhook: The organization's endpoint.PUT /api/v1/organisations/{id}/webhook: Creates or updates the endpoint (and reactivates it). On creation, the secret is returned once.DELETE /api/v1/organisations/{id}/webhook: Deletes the endpoint, its secret and its queue.GET /api/v1/organisations/{id}/webhook/envois: The endpoint's last 100 deliveries.POST /api/v1/organisations/{id}/webhook/secret: Renews the secret; the new one is returned once.GET /api/v1/webhooks/audio: Audio of a voicemail message, via the `voicemail.new` webhook link (no session: the signed token identifies the message, seven days).GET /api/v1/webhooks/cdr.csv: CSV of one month for the customer base, via the `cdr.month` webhook link (no session: the signed token identifies the organization and the month, seven days).GET /api/v1/webhooks/enregistrement: Recording of a call, via the `call.recorded` webhook link (no session: the signed token identifies the call, seven days).
Call recordings: list, playback, ZIP export, deletion (D62)
GET /api/v1/clients/{client_id}/enregistrements: Customer's call recordings, most recent first.GET /api/v1/clients/{client_id}/enregistrements.zip: ZIP export of the selected or filtered recordings (customer admin): one folder per extension, customer time in file names, 500 files and 1.5 GiB at most (production). Streamed, size announced in advance.GET /api/v1/clients/{client_id}/enregistrements/{id}: Playback of a recording, by ranges (`Range`) to seek within the audio.DELETE /api/v1/clients/{client_id}/enregistrements/{id}: Deletes a recording (the file); the call remains in the call log and in billing. Customer admin only.
Customer's shared phonebook: contacts shared by its extensions
GET /api/v1/clients/{client_id}/repertoire: Customer's shared phonebook, by name.POST /api/v1/clients/{client_id}/repertoire: Adds a contact to the shared directory.GET /api/v1/clients/{client_id}/repertoire-ouvert: Is the customer's shared directory open to its users?PUT /api/v1/clients/{client_id}/repertoire-ouvert: Opens or closes the shared directory to the customer's users.PUT /api/v1/clients/{client_id}/repertoire/{id}: Modifies a contact in the shared directory.DELETE /api/v1/clients/{client_id}/repertoire/{id}: Removes a contact from the shared phonebook.
Phone setup: extension links, link by email (D35)
POST /api/v1/clients/{client_id}/appareils/{id}/identifiants: Reveals the device's HTTP credentials, to configure it by hand (like D114): to whoever can install the customer's phones, never through the assistant or MCP; each reveal is in the audit log, without the password. `POST` and `no-store`.POST /api/v1/clients/{client_id}/appareils/{id}/identifiants/renouveler: Renews the device's HTTP password (after losing the phone, for example): the device no longer reads its configuration until it is given the new one.GET /api/v1/clients/{client_id}/postes/{poste}/informations-sip: SIP details of the extension, to configure it by hand (username, server and domain, outbound proxy when needed, ports); the password is requested with `revelerMotDePasseSip`.POST /api/v1/clients/{client_id}/postes/{poste}/informations-sip/mot-de-passe: Reveals the SIP password of the extension (D114), to configure a phone by hand: to whoever can install the extension, in person or with an API key, never through the assistant or MCP. Each reveal is written to the audit log (without the password). `POST` and `Cache-Control: no-store` so that no cache or prefetch keeps it.POST /api/v1/clients/{client_id}/postes/{poste}/installation: Emails the link to the phone setup page (valid for seven days), through the operator's SMTP server. The page picks the app based on the device.GET /api/v1/clients/{client_id}/postes/{poste}/mobile/acces: In-house mobile apps activated on this extension (D117), without their tokens.DELETE /api/v1/clients/{client_id}/postes/{poste}/mobile/acces/{id}: Revokes an in-house mobile app activated on this extension (D117): its device token stops working and its push registration is forgotten.POST /api/v1/clients/{client_id}/postes/{poste}/mobile/installation: Setup QR code of the in-house mobile app on this extension (D117): a signed link, valid for one day, that the app exchanges only once for a device token on behalf of the extension's owner. For whoever can set up the extension (`poste.provisionner`).GET /api/v1/clients/{client_id}/postes/{poste}/mobiles: Mobile apps registered on an extension (without their push token): to whoever may install the extension (`poste.provisionner` permission).DELETE /api/v1/clients/{client_id}/postes/{poste}/mobiles/{id}: Removes a mobile app from an extension (lost phone, departing team member): it is no longer woken.POST /api/v1/clients/{client_id}/postes/{poste}/mot-de-passe-sip: Renews the extension's SIP password (D41), for instance after a phone is lost: the installed phones no longer register, and all installation links already issued are revoked (their signature depends on the password). Then set up the extension's phones again with a new link. The password is never returned.POST /api/v1/clients/{client_id}/postes/{poste}/provisionnement: Setup links for a mobile phone on this extension. They carry the SIP password: show them to its holder only.POST /api/v1/mobile/activation: Activation of the in-house mobile app (D117), without a session: the QR code token, valid and never used, for a device token on behalf of the extension's owner. The SIP configuration is then read with this token (`GET /moi/telephone`).GET /api/v1/provision/acrobits: Acrobits configuration (Account XML), reloaded daily by the app. Opened in a browser (QR code scanned with the camera), redirects to the app (`provlinks:`).GET /api/v1/provision/acrobits-contacts: Phone contacts (Acrobits JSON format): the customer's other extensions and its shared directory.GET /api/v1/provision/cloudsoftphone: Initial provisioning of the operator's mobile app (Cloud Softphone), to configure at Acrobits: `…/api/v1/provision/cloudsoftphone?p=%password%`. Rejection: the message the app displays.POST /api/v1/provision/installation: Setup page (link sent by email, no session): the extension's setup links, renewed. POST: the token stays out of access logs.GET /api/v1/provision/materiel/{dossier}/{fichier}: File of a desk phone stored under its MAC (`{mac}/annuaire.xml`).GET /api/v1/provision/materiel/{fichier}: Configuration file of a desk phone (`{mac}.cfg`, `y000000000000.cfg`, `cfg{mac}.xml`…), built on request from its profile. HTTP Basic authentication: the device's MAC and its password (`revelerIdentifiantsAppareil`).
Desk phones: the operator's hardware profiles, customers' devices (D115)
GET /api/v1/clients/{client_id}/appareils: Desk phones of the customer; with `poste`, those carrying that extension (open to its holder).POST /api/v1/clients/{client_id}/appareils: Adds a desk phone (or a DECT base) to a customer, with its accounts. A MAC is unique on the instance: one belonging to another customer is refused (an account would be grafted onto a third party's phone).DELETE /api/v1/clients/{client_id}/appareils/{id}: Removes a device and all its accounts (for a shared DECT base, all its handsets).PATCH /api/v1/clients/{client_id}/appareils/{id}: Changes a device: name, serial number, model (from the same profile), keys, additional parameters (operator and reseller only).POST /api/v1/clients/{client_id}/appareils/{id}/lignes: Adds one more account to a device (one more handset on a shared DECT base).DELETE /api/v1/clients/{client_id}/appareils/{id}/lignes/{rang}: Removes a single account from a device: the others (handsets of the same base) remain.POST /api/v1/clients/{client_id}/appareils/{id}/redemarrer: Asks the phone to restart (the profile's restart NOTIFY): operator, reseller, customer admin; not the extension holder.GET /api/v1/clients/{client_id}/appareils/{id}/requetes: Last requests received from the device by the file service (diagnosis: file, response, address, agent).POST /api/v1/clients/{client_id}/appareils/{id}/resynchroniser: Asks the phone to read its configuration again (the profile's resync NOTIFY). The holder of an extension it carries may ask for it.POST /api/v1/clients/{client_id}/appareils/{id}/rps: Registers (or registers again, after a failure) a device with the RPS: a device of a Yealink profile, with its serial number.GET /api/v1/clients/{client_id}/materiel/modeles: Models that can be added to the customer's extensions, by profile (shipped, then the operator's copies).GET /api/v1/clients/{client_id}/materiel/parametres: Additional parameters of the customer's phones, stacked between those of the profile and those of the device.PUT /api/v1/clients/{client_id}/materiel/parametres: Replaces the customer's additional parameters (operator and reseller only).POST /api/v1/materiel/apercu: Files a profile produces for a fictitious device of the chosen model (fictitious data, passwords masked); a failing template gives its message and position.GET /api/v1/materiel/profils: Hardware profiles: those Kanadr ships and the operator's copies.POST /api/v1/materiel/profils: Copies a profile (shipped or already copied) to edit it: the copy keeps its original shipped profile and its version.GET /api/v1/materiel/profils/{reference}: A profile and its content (templates included).PUT /api/v1/materiel/profils/{reference}: Saves a new version of a copy (shipped profiles are not edited: they are copied). Templates compiled and parameters checked before writing.DELETE /api/v1/materiel/profils/{reference}: Deletes a copy that no device uses.GET /api/v1/materiel/profils/{reference}/differences: Differences between a copy and the current shipped version of its original profile, template by template.GET /api/v1/materiel/profils/{reference}/versions: History of a copy, most recent first.POST /api/v1/materiel/profils/{reference}/versions/{version}/restaurer: Restores a version from the history: it becomes the next version.GET /api/v1/materiel/rps: The operator's RPS keys, without the secret.PUT /api/v1/materiel/rps: Saves the operator's RPS keys (YMCS › Integration › API): the secret is encrypted and never returned; when absent, the saved one is kept.DELETE /api/v1/materiel/rps: Removes the RPS keys (and their secret).POST /api/v1/materiel/rps/essai: Tries the keys: YMCS token, then the named RPS server.
Diagnostics (D5): call trace, ongoing calls, logged actions
GET /api/v1/clients/{client_id}/appels/{id}/trace: Trace of a call from the call log (diagnostics): path through the dialplan, applications, end.GET /api/v1/clients/{client_id}/capture: Live capture of a customer's logs and SIP trace, as `text/event-stream`: `ligne` events (JSON: `sip` or `journal` type, level, text), then `fin`. Five minutes at most; closing the connection stops the capture. Logged.POST /api/v1/clients/{client_id}/capture/pcap: pcap file (Wireshark) of the SIP messages of a capture: IP, UDP and TCP headers rebuilt around each message. Nothing is kept on the server.POST /api/v1/clients/{client_id}/parcours/rejouer: Replays the publication of a customer's call flow: its latest version is rewritten to the telephony engine, without a new version; audited.POST /api/v1/clients/{client_id}/trunk/reenregistrer: Forces a customer's trunk to re-register with its provider (`killgw` then `rescan`); logged.GET /api/v1/organisations/{id}/appels-en-cours: Ongoing calls at the organization's customers (diagnostics).DELETE /api/v1/organisations/{id}/appels-en-cours/{uuid}: Hangs up an ongoing call (one leg) of a customer of the organization; logged.GET /api/v1/organisations/{id}/audit: Audit log of an organization and its descendants.POST /api/v1/organisations/{id}/diagnostic/recharger: Reloads the telephony engine configuration: caches cleared, configuration, dialplan and ACL read again. For the operator (whole instance); audited.POST /api/v1/organisations/{id}/diagnostic/redemarrer: Restarts the telephony engine, after ongoing calls or immediately. Whole instance: restricted to the operator admin; audited.GET /api/v1/organisations/{id}/machine: Machine monitoring: processor, memory, load and disks, minute by minute.GET /api/v1/organisations/{id}/sante: Instance health: telephony engine, database, CDRs, trunks and webhooks of the organization's customers.
A customer's call log: rated calls, number masking (D20, D60)
GET /api/v1/clients/{client_id}/appels: The customer's call log.GET /api/v1/clients/{client_id}/appels.csv: CSV export of the customer's calls, oldest first.GET /api/v1/clients/{client_id}/appels/statistiques: Statistics of received calls: daily by outcome, and an hour-by-hour map of the week.GET /api/v1/clients/{client_id}/appels/synthese: Call log figures over a period (all calls, not one page).GET /api/v1/clients/{client_id}/budget: Monthly budget of a customer: amount, this month's usage at the customer's selling price and current restriction (D116).PUT /api/v1/clients/{client_id}/budget: Sets the monthly budget of a customer: amount (absent: no budget) and blocking at the threshold. Starts the month afresh: a manual lift is forgotten, and the budget is evaluated at once (a budget lowered below the usage restricts, if it blocks).POST /api/v1/clients/{client_id}/budget/levee: Lifts the restriction set by the budget until the end of the month (customer admin, operator, the customer's reseller). The anti-fraud cap (D106) is not affected.GET /api/v1/clients/{client_id}/journal: Call log setting of the customer.PUT /api/v1/clients/{client_id}/journal: Configures the customer's call log: masking of external numbers (D60).GET /api/v1/organisations/{id}/appels.csv: CSV export of calls for all customers of an operator or a reseller (and its resellers), oldest first: the basis for billing (D13).GET /api/v1/organisations/{id}/simultanes: Peaks of concurrent calls hour by hour (operator, reseller or customer): the largest number of calls in progress at the same instant, from the start and end of the CDRs.GET /api/v1/organisations/{id}/statistiques: Call statistics for the customer base: daily volume, outgoing call quality by provider.GET /api/v1/organisations/{id}/tableau: Dashboard of an organisation (operator, reseller or customer) over a period: calls and amounts per slot, comparison, destinations, top-consuming customers.
Rate tables: purchase, sale to reseller, sale to customer; assignment (D13, D59)
GET /api/v1/clients/{client_id}/forfaits: A customer's indicative plan fees (D120): its rate table's and its own, sale to the reseller and sale to the customer. The customer itself cannot read them.PUT /api/v1/clients/{client_id}/forfaits/{niveau}: Sets a customer's indicative plan fee at one sales level, instead of its rate table's (D120); without a plan fee: the rate table's applies again. Sale to the customer: the operator or the customer's reseller; sale to the reseller: the operator only. Recorded in the audit log.POST /api/v1/clients/{client_id}/revalorisation: Recalculates the prices of the customer's outgoing calls over the period, from the rate plans in force on the day of each call: preview of the difference, then application.GET /api/v1/clients/{client_id}/tarifs: Customer rates: their sale rate plan (assigned, otherwise the default one of their reseller or of the operator), read-only.GET /api/v1/grilles/{id}: A rate table and its lines.DELETE /api/v1/grilles/{id}: Deletes a rate table; CDRs already rated keep their amounts (D13).PUT /api/v1/grilles/{id}/defaut: Makes the rate table its owner's default, for its kind.PUT /api/v1/grilles/{id}/forfait: Sets the default indicative plan fee of a sales rate table (D120): per user or flat, for the margin of customers without their own; without a plan fee: none.GET /api/v1/organisations/{id}/consommation: Usage of an organization's customers (operator or reseller) for a month.GET /api/v1/organisations/{id}/grille: Rate table assigned to a customer or a reseller; `null`: the default one.PUT /api/v1/organisations/{id}/grille: Assigns a sales rate sheet to a customer (sale to the customer) or to a reseller (sale to the reseller); without a rate sheet: the default one applies again. Requires managing the rate sheets of the organization and of the rate sheet's owner: a reseller cannot assign itself a rate sheet of the operator.GET /api/v1/organisations/{id}/grilles: The organization's rate tables (operator or reseller).POST /api/v1/organisations/{id}/grilles: Creates a rate sheet, from a CSV (`prefixe;destination;prix_minute;frais;palier`) or from an existing rate sheet marked up by a margin.
Extension voicemail mailboxes: settings, greeting, messages (D37, D56, D57)
GET /api/v1/clients/{client_id}/boites: Voicemail mailboxes of the customer's extensions.GET /api/v1/clients/{client_id}/boites/{poste}: A voicemail box.PUT /api/v1/clients/{client_id}/boites/{poste}: Configures a voicemail mailbox.POST /api/v1/clients/{client_id}/boites/{poste}: Creates the voicemail mailbox of an extension that has none.GET /api/v1/clients/{client_id}/boites/{poste}/annonce: Playback of the mailbox greeting.PUT /api/v1/clients/{client_id}/boites/{poste}/annonce: Uploads the mailbox greeting (D56): the file (WAV, MP3, AAC/M4A, Ogg Vorbis, FLAC; 20 MB, 10 minutes at most) is converted to 16-bit 8 kHz mono WAV. A text read by a voice goes through `POST /synthese`, then this upload.DELETE /api/v1/clients/{client_id}/boites/{poste}/annonce: Removes the greeting: the default greeting applies again.GET /api/v1/clients/{client_id}/boites/{poste}/messages: Mailbox messages, most recent first.GET /api/v1/clients/{client_id}/boites/{poste}/messages/{message}: Playback of a message: the file as uploaded.PUT /api/v1/clients/{client_id}/boites/{poste}/messages/{message}: Marks a message as read or new; the phones' indicator light follows.DELETE /api/v1/clients/{client_id}/boites/{poste}/messages/{message}: Deletes a message (database and file); the phones' message waiting indicator updates accordingly.
assistant
GET /api/v1/assistant: The assistant for the logged-in account: available, budget reached.POST /api/v1/assistant: Converses with the assistant: sends the conversation (and the answer to a pending write), receives the updated conversation. Read tools run on their own; a write stops pending confirmation.GET /api/v1/organisations/{id}/assistant: Assistant setting, without the key.PUT /api/v1/organisations/{id}/assistant: Configures the setup assistant: operator's Claude key, model, budgets, pricing.DELETE /api/v1/organisations/{id}/assistant: Removes the assistant: nobody can use it anymore; the key is erased.
reglages
GET /api/v1/clients/{client_id}/sso: Customer choice for login through the operator's portal.PUT /api/v1/clients/{client_id}/sso: Sets the customer's choice: whether to create the account of an unknown address on its first sign-in through the operator's portal.GET /api/v1/fuseaux: Available time zones (IANA names, sorted).GET /api/v1/organisations/{id}/acrobits: The Cloud ID of the operator's mobile app.PUT /api/v1/organisations/{id}/acrobits: Sets the Cloud ID of the operator's mobile app: CSC links carry it. The initial provisioning is configured at Acrobits (`…/api/v1/provision/cloudsoftphone?p=%password%`).DELETE /api/v1/organisations/{id}/acrobits: Removes the Cloud ID: no more CSC link (Acrobits Softphone remains possible).GET /api/v1/organisations/{id}/alertes: Addresses that receive an organization's alerts.PUT /api/v1/organisations/{id}/alertes: Sets the alert addresses (ten at most).GET /api/v1/organisations/{id}/assistance: State of the vendor's support access.PUT /api/v1/organisations/{id}/assistance: Opens the support access for a limited time (7 days at most). Logged.DELETE /api/v1/organisations/{id}/assistance: Closes the support access immediately. Logged.GET /api/v1/organisations/{id}/devise: Instance currency, read from any organization whose settings you can read.PUT /api/v1/organisations/{id}/devise: Sets the instance currency (operator only). No conversion: refused as soon as a rate table exists or a call has been rated, unless keeping the same currency.GET /api/v1/organisations/{id}/fuseau: An organization's time zone.PUT /api/v1/organisations/{id}/fuseau: Sets the time zone of an organization (operator, reseller or customer). The operator's or a reseller's applies to customers created afterward. A customer's published opening hours switch to its new time zone at once.GET /api/v1/organisations/{id}/langue: An organization's language.PUT /api/v1/organisations/{id}/langue: Sets the email language of an organization (operator, reseller or customer). The operator's or a reseller's applies to its accounts and to customers created afterward.GET /api/v1/organisations/{id}/licence: Instance license: identity, public key, users and latest readings.PUT /api/v1/organisations/{id}/licence/fichier: Loads the license issued by the vendor (manual mode, without the Hub). It must be signed by the vendor and issued to this instance; a license shorter than the current one is ignored.GET /api/v1/organisations/{id}/licence/releves/{jour}: Signed usage report for one day, to send to the vendor (manual report).PUT /api/v1/organisations/{id}/marque: Sets the branding name and colors; an absent value reverts to the default. The accent must keep white button text readable (contrast of at least 4.5), the menu a light or dark text (4.5), the text the page background (7).PUT /api/v1/organisations/{id}/marque/icone: Uploads the icon (favicon, installed app): a square PNG of at least 192 pixels per side and 256 KiB at most. The logo is not reused: often wide, it would be unreadable at 16 pixels.DELETE /api/v1/organisations/{id}/marque/icone: Removes the uploaded icon: the generated icon (initial on the accent) comes back.PUT /api/v1/organisations/{id}/marque/logo: Uploads the logo: PNG, JPEG or WebP, 256 KiB at most. The portal displays it 28 pixels high (56 on high density): a square or wide, plain logo works best.DELETE /api/v1/organisations/{id}/marque/logo: Removes the logo.GET /api/v1/organisations/{id}/pays: Country of an organisation.PUT /api/v1/organisations/{id}/pays: 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.GET /api/v1/organisations/{id}/plafond: The instance's default thresholds.PUT /api/v1/organisations/{id}/plafond: Sets the instance's default thresholds.GET /api/v1/organisations/{id}/retention: An organization's retention periods: configured and applied.PUT /api/v1/organisations/{id}/retention: Sets an organization's retention periods. Bounds: recordings from 1 to 183 days (D63), messages from 1 to 3,650 days, CDRs from 365 to 3,650 days (CPCE L34-1); `null`: the level above.GET /api/v1/organisations/{id}/smtp: The operator's SMTP server, without its password.PUT /api/v1/organisations/{id}/smtp: Configures the operator's SMTP server (replaces the previous one).DELETE /api/v1/organisations/{id}/smtp: Removes the SMTP server: no emails are sent anymore.POST /api/v1/organisations/{id}/smtp/essai: Sends a test email through the configured server. The server error is returned as is for diagnosis (authentication rejected, TLS, host unreachable).GET /api/v1/organisations/{id}/sso/jeton: Token login from the operator's portal: key status.POST /api/v1/organisations/{id}/sso/jeton: Creates (or replaces) the token login key; it is returned once. The old one is no longer valid.DELETE /api/v1/organisations/{id}/sso/jeton: Closes the token connection: the key is erased.GET /api/v1/organisations/{id}/sso/oidc: Directory configured on an organization.PUT /api/v1/organisations/{id}/sso/oidc: Configures an organization's identity provider. The issuer is verified (discovery document read) before saving.DELETE /api/v1/organisations/{id}/sso/oidc: Removes an organization's identity provider and its secret.PUT /api/v1/organisations/{id}/suffixe-domaine: Sets the instance's customer domain suffix (D108). Existing customers keep their domain.GET /api/v1/organisations/{id}/synthese: The announcement text-to-speech voice set by the operator, without the key.PUT /api/v1/organisations/{id}/synthese: Sets the announcement text-to-speech voice: engine, Google key (kept, replaced or erased), French and English voices.POST /api/v1/organisations/{id}/synthese/essai: Reads a short sentence with the saved setting and returns the WAV. No fallback: Google's error is returned with its detail for troubleshooting (key refused, IP restriction, API not enabled).GET /api/v1/organisations/{id}/transcription: The operator's transcription service, without its key.PUT /api/v1/organisations/{id}/transcription: Configures the operator's transcription service (replaces the previous one).DELETE /api/v1/organisations/{id}/transcription: Removes the transcription service: nothing is transcribed anymore.POST /api/v1/organisations/{id}/transcription/essai: Has the configured service transcribe one second of silence. The service error is returned as is for diagnosis (key rejected, unknown model, host unreachable).GET /api/v1/pays: Supported countries, with their numbering plan.
compte
GET /api/v1/moi/accueil/{espace}: Home page layout of the signed-in account, in a space.PUT /api/v1/moi/accueil/{espace}: Sets the home page layout of the logged-in account; `instances` absent: back to the default layout. Audited.PUT /api/v1/moi/langue: Sets the language of the signed-in account (portal, emails sent to it); if missing, that of its organization. Audited.