Mitel: API specification - Empire Telecom

Mitel: API specification

Empire Telecom · Mitel

How to integrate with Mitel phone systems: the CloudLink cloud APIs (authentication, admin, call control, presence, chat, notifications), the on-premise MiVoice Business gateway, MiCollab, MiContact Center, and what changed after Mitel's 2025 restructuring.

Visit Mitel support →Where: Mitel's document center has the user, quick reference and installation guides for the 6920, 6930 and 6940 phones.
Direct link: https://www.mitel.com/document-center/devices-and-accessories/ip-phones/6900-series/6900-sip-phones

Mitel makes business phone systems that are mostly installed on site or in a private cloud: MiVoice Business, MiVoice MX-ONE, MiVoice Office 400, MiVoice 5000 and the older MiVoice Connect (ShoreTel), plus MiCollab for unified communications and MiContact Center Business for contact centers. Verdict: Mitel's modern public API is CloudLink, a set of REST APIs at *.api.mitel.io with open documentation and a Postman library. It works with any PBX connected through a CloudLink Gateway (MiVoice Business is the main one). Access requires a CloudLink account from a Mitel partner and approval of your app, so it is open documentation with a gated door. The older on-premise interfaces (MiVoice Business Open Integration Gateway, MiContact Center SDK) exist but are licensed and aimed at Mitel's developer partners.

Important: Mitel cloud phone customers (MiCloud Connect) were moved to RingCentral. If your Mitel service is actually MiCloud Connect, see the RingCentral API specification instead.

Company changes you should know about

DateChangeWhat it means for you
2021RingCentral became the preferred partner for Mitel customers moving to the cloudNew cloud UC goes to RingCentral
Q2 2024RingCentral took over the MiCloud Connect and Sky UCaaS customer relationships; the partnership became non-exclusive in August 2024MiCloud Connect integrations now use RingCentral's APIs
6 July 2024MiVoice Connect (formerly ShoreTel) stopped being sold to new systemsNo new MiVoice Connect APIs; plan a move
9 March 2025Mitel agreed a financial restructuring with its lenders, carried out through Chapter 11Day-to-day service and support continued
20 June 2025Mitel completed the restructuring: about $1.15 billion of debt removed, control moved from Searchlight Capital to its lenders, Mike Robinson later named CEOMitel continues as a going concern focused on on-premise and hybrid systems
2025Mitel CX (AI contact center) became generally available (March), Mitel CX 2.0 announced (November); Zoom Workplace integration with Mitel telephony; Workflow Studio (no-code integration)New contact center work is on Mitel CX
31 Dec 2029End of Mitel technical support for MiVoice ConnectMitel's upgrade path is MiVoice Business

At a glance

ItemDetail
API typeCloudLink: REST over HTTPS, JSON. On-premise MiVoice Business OIG: SOAP/XML (call control) and REST/JSON (sessions, data access)
Base URLs (CloudLink)https://authentication.api.mitel.io/2017-09-01, https://admin.api.mitel.io/2017-09-01, https://media.api.mitel.io/2017-09-01, https://presence.api.mitel.io/2017-09-01, https://chat.api.mitel.io/2017-09-01, https://notifications.api.mitel.io/2017-09-01, https://service-delivery.api.mitel.io/2022-01-30
AuthenticationOAuth 2.0 style bearer tokens: authorization code with PKCE (OpenID Connect) for user apps, client credentials for server apps, password grant for testing only, refresh tokens. SAML SSO through the Mitel Auth Portal
Required headerx-mitel-app: app=<name>/<version>;platform=<os>/<version>;session=<id>; (lower case) on every call
FormatJSON; token requests are application/x-www-form-urlencoded
VersioningDate-stamped path segment (2017-09-01; Service Delivery 2022-01-30). Each API serves its own spec at /_spec
Query optionsOData style: $top, $skip, $filter, $orderby, $search, $expand
SandboxNo shared sandbox. Use a dedicated sub-account with its own CloudLink Gateway and PBX (partners), or join the Mitel Technology Network for lab access
Rate limitsNo published numbers. Mitel warns it may temporarily disable a CloudLink account that retries too often
Webhooks/eventsNotifications API: subscriptions delivered by webhook (signed) or WebSocket (MQTT)
SDKsNo official client SDKs. Official Postman library and Node.js code samples on GitHub
Developer portaldeveloper.mitel.io
Status pagestatus.mitel.io (CloudLink services by region: US, EU, AP)
How to get accessCloudLink account from a Mitel partner (customers) or partner CloudLink account (partners); app approved under the CloudLink API Terms of Use; Mitel Technology Network for on-premise interfaces

Which API fits which Mitel product

ProductWhat to usePublic?
MiVoice Business (on site or private cloud)CloudLink APIs through a CloudLink Gateway; or the Open Integration Gateway (OIG) on the local networkCloudLink docs are public; OIG guides are downloadable but development requires MTN membership and Mitel licences
MiCollabConnects to CloudLink for sign-in, user sync and chat, so the CloudLink Admin and Chat APIs apply once it is connected. MiCollab has no separate public APIYes (via CloudLink)
MiVoice MX-ONE, MiVoice 5000, MiVoice Office 400CloudLink where a gateway is supported; otherwise CTI/TAPI-style interfaces through the Mitel Technology NetworkPartner only for the native interfaces
MiVoice Connect (ShoreTel)No CloudLink API path in Mitel's public material; legacy CTI only; end of support 2029Partner only
MiCloud ConnectNow RingCentralSee RingCentral
MiContact Center BusinessMiCC SDK / Open Media REST API on the customer's own server (version 9.0 or later)Not publicly documented; ask your Mitel partner
Mitel CXMitel's AI contact center; check with Mitel for its integration optionsCheck the provider's docs

Getting access

1Get a CloudLink account. Customers get one from their Mitel authorised partner. Partners get one after meeting Mitel's certification requirements and deploying a PBX with a connected CloudLink Gateway. Ask Empire Telecom to arrange this if Empire manages your Mitel system.
2Connect the PBX. A CloudLink Gateway (with MiVoice Border Gateway for MiVoice Business) links the phone system to CloudLink. After onboarding, MiVoice Business is configured automatically. Without this, the call and presence APIs have nothing to control.
3Join the developer forum. Create an account on the Mitel developer forum for CloudLink API support.
4Set up a test account. Mitel recommends a dedicated development environment. Partners can create sub-accounts under their partner account. Third-party developers can join the Mitel Technology Network (MTN), which replaced the older Mitel Solutions Alliance and Unify programs, for CloudLink access and lab equipment.
5Register your application. An application (client) has an applicationId (also called clientId), a name, an active flag and its allowed redirectUris. It is usually managed by a PARTNER_ADMIN. For server-to-server use, an account admin creates a client with POST /accounts/{accountId}/clients on the Admin API.
6Accept the terms. The CloudLink API Terms of Use require a valid CloudLink account and token, Mitel's approval of your application at its discretion, and say the APIs are currently free. Direct competitors of Mitel may not use them.
7Activate the app on the customer account. When you deploy, the app may need to be activated on the target account and its redirect URIs updated.
8For on-premise OIG work, join MTN at the Developer Advanced level, register the application and request a certificate through MiAccess, and buy the OIG licences through Mitel's licensing system. A 60-day trial and hosted virtual lab are available.

Authentication

All token calls go to https://authentication.api.mitel.io/2017-09-01. Send the returned access_token as Authorization: Bearer <token> on every other API, together with the x-mitel-app header.

Testing only: password grant

POST /2017-09-01/token
Content-Type: application/x-www-form-urlencoded

grant_type=password&username=<user>&password=<pass>&account_id=<accountId>

Response (HTTP 201) includes token_type (bearer), expires_in, access_token, refresh_token and scope. Mitel says user-facing apps must not use this; use OpenID Connect instead.

User apps: authorization code with PKCE (OpenID Connect)

1Send the user to the Mitel Auth Portal: https://auth.mitel.io/authorize?client_id=<applicationId>&response_type=code&redirect_uri=<registered URI> (with a code_challenge and code_challenge_method=S256). Or call POST /authorize on the Authentication API directly with client_id, response_type, username, password, account_id, redirect_uri, code_challenge_method and code_challenge.
2Exchange the code:
POST /2017-09-01/token
grant_type=authorization_code&code=<code>&client_id=<applicationId>&code_verifier=<verifier>

Accounts that use single sign-on (SAML; Mitel officially supports Microsoft Azure / Entra ID as the identity provider) must use the Auth Portal flow.

Server apps: client credentials

POST /2017-09-01/token
grant_type=client_credentials&client_id=<clientId>&client_secret=<secret>&account_id=<accountId>

Other token calls

MethodPathWhat it does
POST/tokengrant_type=refresh_token&refresh_token=<token> gets a new access token
GET/tokenVerify the current token
POST/guest/tokenGuest token (principalId, accountId, name) for anonymous users
GET/_specThe API's own specification

If a user belongs to more than one account and you leave out account_id, you get HTTP 409. Do not decode tokens yourself; Mitel says their format may change.

Endpoints and resources

All paths below are relative to the base URL for that API (see At a glance). "My account" paths act on the token's own account; /accounts/{accountId}/... paths act on a named account (partner and admin use).

Admin: accounts

MethodPathWhat it does
GET/accountsList accounts you can see
GET/accounts/{accountId}One account
POST/accountsCreate an account (partners; Mitel advises against creating accounts by API)
PUT/accounts/{accountId}Update an account
DELETE/accounts/{accountId}Delete an account
GET/accounts/tagsAccounts with tags

Admin: users, contacts, groups, photos

MethodPathWhat it does
GET/usersUsers in my account
GET/accounts/{accountId}/usersUsers in a named account
GET/accounts/{accountId}/users/{userId}One user
POST/usersCreate a user in my account
PUT/users/{userId}Update a user
DELETE/users/{userId}Delete a user
POST/accounts/{accountId}/users/{userId}/welcomeSend the welcome email
PUT / DELETE/users/{userId}/photoUpload or remove a user photo
GET / POST/contactsList or create contacts (CORPORATE, PERSONAL_CONTACT, GUEST, admin types)
PUT / DELETE/contacts/{contactId}Update or delete a contact
GET / POST/groupsList or create groups
PUT / DELETE/groups/{groupId}Update or delete a group

User sync from the PBX is one way: changes made in CloudLink are not pushed back to the PBX.

Admin: application clients

MethodPathWhat it does
GET/accounts/{accountId}/clientsList server clients
POST/accounts/{accountId}/clientsCreate a client (name, role such as ACCOUNT_ADMIN, active)
PUT/accounts/{accountId}/clients/{clientId}Update a client
DELETE/accounts/{accountId}/clients/{clientId}Delete a client

Roles are PARTNER_ADMIN, ACCOUNT_ADMIN and USER.

Media: call control

An endpoint is a phone line (for example an extension) on the connected PBX. The device must support CTI.

MethodPathWhat it does
GET/endpoints/{endpointId}Line state
PUT/endpoints/{endpointId}Change line state: action dnd or messageWaiting, userAvailability (available, busy, dnd, away)
GET/endpoints/{endpointId}/callsActive calls on the line
POST/endpoints/{endpointId}/callsMake a call (to, optional from, fromName, timeoutMs)
GET/endpoints/{endpointId}/calls/{callId}State of one active call
PUT/endpoints/{endpointId}/calls/{callId}Act on a call (action, for example answer or redirect with a destination)
GET / PUT / DELETE/endpoints/{endpointId}/forwardingsRead, set or clear call forwarding (action such as always, destination, enabled)

Call states are ringing, connected and completed; causes include newCall, busy and callNotAnswer. You cannot play audio, collect keypad digits, control a softphone or change PBX configuration through CloudLink.

Media: call history, recordings and conferences

MethodPathWhat it does
GET/calls/recordsCall history (supports $top, $skip, $filter)
GET/calls/{callId}/recordsRecords for one call
PUT/calls/records or /calls/{callId}/recordsHide records ({"hide": true})
GET/recordingsAll recordings in the account
GET/recordings/{recordingId}Recording metadata and file
PUT/recordings/{recordingId}Update recording label
DELETE/recordings/{recordingId}Delete a recording
GET / POST/conferencesList or create conferences (type, lobbyPolicy, accessCodeLength)
GET / PUT / DELETE/conferences/{conferenceId}Read, update or delete a conference
POST/conferences/{conferenceId}Conference action, for example {"action":"end"}
GET / POST/conferences/{conferenceId}/participantsList or add participants
GET/users/{userId}/conferencesConferences for a user

The guides state recording start/stop is not available through the API.

Presence

MethodPathWhat it does
GET/presentitiesPresence for everyone you can see
GET/presentities/{principalId}Aggregate presence for one user or group
PUT/presentities/{principalId}Manual override (status, reason); set Available to go back to automatic
GET/presentities/{principalId}/categories/{categoryId}Sources in a category (phones, externalEngines, acd, calendar)
POST/presentities/{principalId}/categories/{categoryId}Add a presence source (sourceId, presence)
PUT/presentities/{principalId}/categories/{categoryId}/{sourceId}Update a source

Statuses: Available, Busy, Away, DoNotDisturb, Offline, Unknown. Mitel recommends reading aggregate presence and updating sources rather than overriding.

Chat (Conversations)

MethodPathWhat it does
GET / POST/conversationsList or create conversations (direct, group, or topic stream)
GET / PUT / DELETE/conversations/{conversationId}Read, update or delete
GET / POST/conversations/{conversationId}/messagesRead or send messages (body, contentType, fallbackText)
PUT / DELETE/conversations/{conversationId}/messages/{messageId}Edit or delete a message
GET / POST/conversations/{conversationId}/participantsList or add participants
POST/conversations/{conversationId}/participants/{participantId}/typingTyping indicator (START/STOP)
GET / PUT / DELETE/conversations/{conversationId}/attachments/{attachmentId}Attachments (up to 10 MB)
POST/conversations/{conversationId}/transcriptsCreate a transcript
GET/users/{userId}/conversationsA user's conversations with unread counts (call once at start-up)

Service Delivery (distributors)

Read-only today, based on TM Forum TMF637, for Mitel distributors.

MethodPathWhat it does
GET/agreements and /agreements/{id}Subscription agreements
GET/products and /products/{id}Products on agreements
GET/organizations and /organizations/{id}Parties

Mitel has announced later phases (creating subscriptions, changing seats, orders, invoices) as planned and subject to change.

MiVoice Business Open Integration Gateway (on-premise)

OIG is a web server on Mitel Standard Linux that fronts up to 250 MiVoice Business systems for up to 1,500 applications.

ServiceProtocolExample path
Session managementSOAP/XML or REST/JSON/mitel/oig/session/SessionService?wsdl, /mitel/oig/rest/resources/v1/sessions
Call control (standard and advanced)SOAP/XML over HTTPS/mitel/oig/cc/StandardCCService?wsdl
Data accessREST/JSON over HTTPS/mitel/oig/rest/resources/v1/databases

Login uses the company name, application name and application password from Mitel registration, plus a local password set on each OIG. Advanced services need a Mitel certificate. Sessions end unless kept alive within 10 minutes.

Webhooks and events

CloudLink's Notifications API (Notify) delivers changes from the other APIs.

1Create a subscription: POST https://notifications.api.mitel.io/2017-09-01/subscriptions with applicationId, transport (webhook or websocket), deviceId (your webhook URL, or the MQTT client ID for WebSocket), topic, and optional subjectFilter (regular expression on the resource path), methodFilter (POST, PUT, DELETE), publicationFilter (JSONPath on content) and expiryDateTime.
2For WebSocket, call POST /connections with {"transport":"websocket"} to get the connection URL (MQTT).
3Manage subscriptions with GET /subscriptions, GET/DELETE /subscriptions/{subscriptionId}. GET /notifications shows delivery history.
TopicEvents
platform-api-mediaCall ringing, connected, ended on watched endpoints
platform-api-presencePresence changes
platform-api-conversationsNew messages and conversation changes
platform-api-adminUsers created (POST) or updated (PUT)

Example subject filters from Mitel's guide: ^/2017-09-01/endpoints/100[0-5] (extensions 1000-1005) and ^/accounts/<accountId>/users with methodFilter: POST (new users).

Verify webhooks: every webhook carries an x-notify-signature header. Compute a SHA-256 HMAC of the body using your applicationId as the key and compare.

On-premise OIG applications poll for events or register an asynchronous callback; MiCC Business integrations use its own SDK.

Errors, limits and good practice

CodeMeaning
200 / 201Success; token creation returns 201
401Token expired or invalid: refresh the token and retry once
409User belongs to several accounts and account_id was not sent
4xx / 5xxOther errors: check the provider's docs and the /_spec for each API
  • Refresh on 401, with an exit. Mitel's guidance is to refresh after a 401, retry the call, and stop after a limit. Endless retries can get the CloudLink account temporarily disabled.
  • Paging. Use $top and $skip on lists such as /calls/records; filter with $filter.
  • Headers. Always send x-mitel-app, in lower case.
  • Status. Check status.mitel.io for the Authentication, Admin, Media, Presence, Chat and Notifications services in your region before debugging.
  • Do not create accounts by API unless you are a partner automating onboarding; manage existing ones.
  • Keep secrets private. The Terms of Use require your client ID and token to be kept confidential.

Common tasks

Pull yesterday's call log

1Get a token (client credentials for a server job).
2GET https://media.api.mitel.io/2017-09-01/calls/records with $filter on the date range and $top for page size.
3Repeat with $skip until fewer than $top rows return.

Download a recording

1GET /recordings to find the recording (filter by date or call).
2GET /recordings/{recordingId} to get its metadata and file.

Click-to-call from a CRM

1Use OpenID Connect so each user signs in as themselves.
2POST /endpoints/{endpointId}/calls with {"to":"<number>"}, where endpointId is the user's line.
3Track the call with a platform-api-media subscription.

Get notified when a call ends

1POST /subscriptions on Notify with transport: "webhook", deviceId: "<your https URL>", topic: "platform-api-media" and a subjectFilter for the extensions you care about.
2Check x-notify-signature on each delivery.
3Act on events whose call state is completed.

Set Do Not Disturb or forwarding for a user

1PUT /endpoints/{endpointId} with {"action":"dnd","enabled":true}.
2Or PUT /endpoints/{endpointId}/forwardings with {"action":"always","enabled":true,"destination":"<number>"}.

Show live presence on a wallboard

1GET /presentities for the starting state.
2Subscribe to platform-api-presence by WebSocket and update tiles as events arrive.

Add a new employee

1POST /users (or /accounts/{accountId}/users) with name and email.
2POST /accounts/{accountId}/users/{userId}/welcome to send the welcome email.
3If the user comes from the PBX, add them on the PBX instead; sync is one way from PBX to CloudLink.

More information

Need a hand? Call Empire Telecom support at (732) 363-9898, email support@empiretelecomnj.com, or open a ticket in the customer portal.