PortSIP Knowledge Base
  • PortSIP Communications Solution
    • What is PortSIP?
    • The Advantages of PortSIP PBX vs. Other PBXs
    • Cloud PBX Empowering Service Providers
    • Simplifying Unified Communications with WebRTC and SIP
    • What is CPaaS? Communications Platform as a Service Explained
    • UCaaS is Unified Communications as a Service
    • PortSIP PBX Administration Guide
      • Overview
      • PortSIP Security Features
      • Summary of Changes
      • Before Started
      • 1 Installation of the PortSIP PBX
        • Installation of PortSIP PBX v22.x
          • Install PortSIP PBX on Linux
          • Install PortSIP IM Server on Linux
          • Install PortSIP PBX on Windows
          • Upgrade to the Latest Version Within v22.x on Linux
          • Upgrade to the Latest v22.x on Windows
          • Upgrade v16.x to the Latest v22.x on Linux
        • Installation of PortSIP PBX v16.x
          • Upgrade to the Latest v16.x Release
      • 2 Configuring the PortSIP PBX
      • 3 Tenant Management
        • Password and Sign-In Security
      • 4 Phone Device Management
        • Managing Phones
        • Auto Provisioning Security
        • Custom IP Phone Template
        • Bulk Importing Users and Auto Provisioning IP Phones
        • Zero Touch Provisioning Phones
        • Provision Phone Using PnP
        • PnP Auto Provisioning IP Phone Multicast Debug
        • Provision Phone Using RPS
        • Provision Phone Using DHCP Option 66
        • Provision Phone Using TFTP
        • Provisioning Cisco 79xx IP Phones
        • Provision Fanvil DECT IP Phones
        • Provision Yealink DECT IP Phones
        • Provision SNOM DECT IP Phones
        • Configuring Private RPS Account
      • 5 User Management
        • Users
        • How to Configure the Endpoints?
        • User Groups
        • DND and Automatic Callback
        • Speed Dial 8
        • Speed Dial 100
      • 6 Transport Management
      • 7 Trunk Management
        • Configuring SIP Trunk
        • Handle Outbound Calls Through SIP Trunk
      • 8 Call Route Management
        • Configuring Inbound Rule
        • Configuring Outbound Rule
      • 9 Configuring PortSIP SBC
        • Topology
        • Summary of Changes
        • Installation PortSIP SBC v11.x
        • Installation PortSIP SBC v10.x
        • Configuring PortSIP SBC for WebRTC
        • Upgrade to the Latest v11.x Release
        • Upgrade to the Latest v10.x Release
      • 10 Configuring SBC for MS Teams
        • Architecture
        • Configuring Microsoft Teams
        • Configuring SBC and PBX
        • Configure an SBC for Multiple Tenants
      • 11 Deploy the SBC Cluster
      • 12 Configuring Virtual Receptionist
        • Managing Virtual Receptionist
        • Visual IVR Editor Guide
        • Direct Inward System Access (DISA)
      • 13 Configuring Ring Group
      • 14 Call Parking
        • PortSIP Call Parking Feature
        • Using Call Parking Feature
        • Using Enhanced Call Park on Fanvil IP Phones
        • Using Enhanced Call Park on Yealink IP Phones
        • Using Enhanced Call Park on Grandstream IP Phones
        • Using Enhanced Call Park on SNOM IP Phones
        • Using Enhanced Call Park on Dinstar IP Phones
        • Using Enhanced Call Park on Htek IP Phones
      • 15 Shared Voicemail
      • 16 Call Queue
        • Configuring Call Queue
        • Configuring Queue Callback
        • Agent States and Work Modes
        • Skills-Based Routing
        • Silent Monitoring
        • Wallboards
      • 17 Roles and Permissions
      • 18 E164 Number Processing
      • 19 Billing
      • 20 CDR and Call Recordings
        • CDR
        • Call Recordings
        • CDR Field Descriptions
      • 21 Call Reports
      • 22 Dealers
      • 23 Feature Access Codes
      • 24 Call Pickup
      • 25 Meetings
        • Joining a Meeting with the Invite Link
      • 26 Hot Desking
      • 27 STIR/SHAKEN
        • Configuring STIR/SHAKEN
      • 28 Digital Engagement Channels
        • SMS Channel
        • WhatsApp Channel
        • Manage SMS/WhatsApp Message Conversations
      • 29 Integrations
        • Microsoft 365 Integration
        • Google Workspace Integration
      • 30 Office Hours and Holiday Schedule
        • Configuring Office Hours and Holiday Schedule
        • Routing Calls Based on Office Hours and Holidays
      • 31 Configuring Email Notifications
      • 32 Night Mode
      • PBX and SIP Trunk using PortSIP SBC
      • SIP Header Manipulation
      • Rebranding PortSIP PBX, SBC
      • System Service Extension Numbers
      • Certificates for TLS/HTTPS/WebRTC
        • Preparing TLS Certificates
        • Update Certificates
      • Backup and Restore: An Essential Guide
        • Backup and Restore PortSIP PBX
        • Backup and Restore PortSIP SBC
      • Storing Into AWS S3
      • Storing Into Azure Blob Storage
      • Trace Server - A Better Way to Monitoring SIP Messages and QoS for PortSIP PBX
    • Configuring SIP Trunks
      • QuestBlue SIP Trunk
        • Purchase a DID on QuestBlue Platform
        • Configuring QuestBlue IP Authentication Trunk
        • Configuring QuestBlue Register Authentication Trunk
        • Configuring Outbound & Inbound Calls
        • QuestBlue SMS Integration
      • Twilio SIP Trunk
        • Purchase a DID on the Twilio
        • Configuring Twilio Register Based Trunk
        • Configuring Twilio Interconnect Trunk
        • Configuring Outbound & Inbound Calls
        • Twilio SMS Integration
      • Telnyx SIP Trunk
        • Purchase a DID on Telnyx Platform
        • Configuring Telnyx IP Authentication Trunk
        • Configuring Telnyx Register Authentication Trunk
        • Configuring Outbound & Inbound Calls
        • Telnyx SMS Integration
      • Vonage SIP Trunk
        • Purchase a DID on Vonage Platform
        • Configuring Vonage IP Authentication Trunk
        • Configuring Vonage Register Authentication Trunk
        • Configuring Outbound & Inbound Calls
        • Vonage SMS Integration
      • VoIP.ms SIP Trunk
        • Purchase a DID on VoIP.ms
        • Configuring VoIP.ms Register Based Trunk
        • Configuring Outbound & Inbound Calls
        • VoIP.ms SMS Integration
      • Voxtelesys SIP Trunk
        • Purchase a DID on Voxtelesys Platform
        • Configuring Voxtelesys IP Authentication Trunk
        • Configuring Voxtelesys Register Authentication Trunk
        • Configuring Outbound & Inbound Calls
        • Voxtelesys SMS Integration
      • Wavix SIP Trunk
        • Purchase a DID on Wavix Platform
        • Configuring Wavix IP Authentication Trunk
        • Configuring Wavix Digest Trunk
        • Configuring Outbound & Inbound Calls
        • Wavix SMS Integration
      • VoIP Innovations SIP Trunk
        • Purchase a DID on VoIP Innovations Platform
        • Configuring VoIP Innovations IP Authentication Trunk
        • Configuring Outbound & Inbound Calls
        • VoIP Innovations SMS Integration
      • Bandwidth SIP Trunk
        • Purchase a DID on Bandwidth Platform
        • Configuring Bandwidth IP Authentication Trunk
        • Configuring Outbound & Inbound Calls
        • Bandwidth SMS Integration
      • Flowroute SIP Trunk
        • Purchase a DID on Flowroute Platform
        • Configuring Flowroute IP Authentication Trunk
        • Configuring Outbound & Inbound Calls
        • Flowroute SMS Integration
      • Gamma SIP Trunk
      • Aire Networks SIP Trunk
      • VoiceMeUp SIP Trunk
        • Configuring VoiceMeUp Trunk
        • VoiceMeUp SMS Integration
    • PBX Cluster (v22.x)
      • Topology
      • Preparing Cluster Servers
      • Configuring Cluster Servers
      • Managing Cluster
    • High Availability (v22.x)
      • High Availability and Sclability On-Premise
        • PortSIP PBX High Availability Architecture
        • High Availability Installations on Ubuntu
        • Upgrading High Availability Installation
        • Scaling Servers On-Premise for High Availability
        • Scaling SBC On-Premise for High Availability
        • Scaling IM Server On-Premise for High Availability
      • High Availability and Scalability on AWS
        • PortSIP PBX High Availability Architecture
        • High Availability Installations on AWS
        • Upgrading High Availability Installation
        • Increase Size of EBS Volume
        • Scaling Servers on AWS for High Availability
    • PBX Cluster(v16.x)
      • Topology
      • Preparing Cluster Servers
      • Configuring Cluster Servers
      • Managing Cluster
      • Configuring Cluster Servers for High Availability
    • High Availability (v16.x)
      • High Availability for On-Premise
        • PortSIP PBX High Availability Architecture
        • High Availability Installations on Ubuntu
        • Upgrading High Availability Installation
      • High Availability and Scalability on AWS
        • PortSIP PBX High Availability Architecture
        • High Availability Installations on AWS
        • Upgrading High Availability Installations
        • Increase Size of EBS Volume
        • Scaling Servers on AWS for HA
    • PortSIP UCaaS
    • FAQ
      • Troubleshooting Call Issues
      • How to Activate License key?
      • What File Format Is Required for PortSIP PBX Prompt?
      • What is the Multi-Tenant PBX?
      • Is the PortSIP PBX built on Asterisk, FreeSwitch?
      • What is the SBC?
      • What is the PBX? Features, Benefits
      • What is Direct Inward Dialing (DID)?
      • What is the DID Pool?
      • What are IP Phones Work with PortSIP PBX?
      • Hardware Specifications
      • How to Adjust the REST API Rate Limit?
      • SIP Status Code of Response
      • What is SIP ALG and Why You Need to Disable It?
      • Essential Factors for Choosing a Could PBX Solution
      • Migrate from legacy FCM APIs to HTTP v1 for Android Push Notifications
      • PortSIP SDK License Agreement
      • PortSIP Software End-User License Agreement
  • Apps Guides
    • PortSIP ONE Desktop App
      • Sign in to PBX
      • Calls, Messages, and Voicemails
      • Customize Your Caller ID
      • SMS and WhatsApp Messaging
      • Click to Call
      • Calling from Another Device
      • Change Your Call Queue Status
    • PortSIP ONE Mobile App
      • Sign in to PBX
      • Calls, Messages, and Voicemails
      • Customize Your Caller ID
      • SMS and WhatsApp Messaging
      • Change Your Call Queue Status
    • PortSIP Softphone
  • DEVELOPING WITH PORTSIP
    • Getting Started
    • Calling APIs
      • User Manual for Windows
      • User Manual for iOS
      • User Manual for Android
      • User Manual for macOS
    • REST APIs
      • Version 22.2
        • Get Started
          • Schema
          • Authentication and Authorization
          • HTTP verbs
          • Summary Representations
          • Resource ID
          • Query Options Overview
          • Detailed representations
          • Timezones
          • API Response
          • Error Handling
          • Resource Synchronization
          • Personal Contacts Synchronization
        • Authentication
        • Administrations
        • Extensions
        • Authentication
        • Tenants
        • Call Queues
        • Billing
        • CTI
        • Call Sessions
        • Call Detail Records
        • Conference
        • Contact
        • Emergency Numbers
        • Extensions
        • Files
        • Blobs
        • Trunks
        • Inbound Rules
        • Outbound rules
        • Virtual Receptionists
        • Media Server
        • MOH
        • Automatic Callback
        • Auto Provisioning
        • Push Notification
        • Ring Groups
        • Shared Voicemails
        • Security
        • Feature Access Codes
        • Voicemails
        • Call Park
        • Call Pickup
        • Hot Desking
        • External Message
        • Notification
        • Troubleshooting
        • Microsoft 365
        • Models
      • Version 22.1
        • About
        • API reference
          • Info
          • Login
            • By microsoft
          • Logout
          • Network
          • Sbc
            • Token
              • Destroy
          • Im
            • Token
              • Destroy
          • Dealers
            • Password
            • Destroy
          • Mobile push
            • Destroy
          • Ip filters
            • Destroy
            • Export
          • Transports
            • Destroy
            • Status
          • Tenants
            • Switch
            • Dealers
              • Destroy
            • Destroy
          • Tenant
            • Status
            • Notification
              • Test email
            • Password policy
            • Billing
            • Balance
            • Custom headers
          • Conference servers
            • Status
            • Destroy
          • Media servers
            • Status
            • Destroy
          • License
          • Key
          • Brand
          • Dealer
            • Status
            • Username
            • Password
          • Roles
            • Destroy
          • User
            • Password
            • Extension password
            • Profile
            • Status
            • Presence
            • Balance
            • Greetings
              • Enable
              • Disable
              • Destroy
            • Phones
              • Destroy
            • Cdrs
              • Sync tokens
                • Diff
            • External messages
            • Recordings
              • Destroy
            • Speed dial 8
              • Destroy
            • Speed dial 100
              • Destroy
            • Meetings
              • Destroy
              • Status
              • Mute
              • Unmute
              • Lock
              • Unlock
              • Start
              • Stop
              • Start recording
              • Stop recording
              • Participants
                • Layout
                • Invite
                • Mute
                • Unmute
                • Chairman
                • Position
                • Destroy
            • Holidays
              • Destroy
            • Global holidays
            • Contacts
              • Favorite
              • Unfavorite
              • Destroy
              • Sync tokens
                • Diff
            • Call queues
              • Agent
            • Outbound caller ids
            • Ring groups
            • Business contacts
              • Favorite
              • Unfavorite
              • Sync tokens
                • Diff
            • Extension contacts
              • Favorite
              • Unfavorite
              • Sync tokens
                • Diff
          • Users
            • Profile
            • Password
            • Extension password
            • Role
            • Ms365 binding
              • Destroy
            • Destroy
            • Status
              • Destroy status
            • Balance
            • Greetings
              • Enable
              • Disable
              • Destroy
            • Phones
              • Destroy
            • Holidays
              • Destroy
            • Global holidays
            • Call queues
              • Agent
            • Speed dial 8
              • Destroy
            • Speed dial 100
              • Destroy
          • Extension numbers
          • Groups
            • Destroy
            • Members
              • Destroy
          • Voicemails
            • Set read
            • Set unread
            • Destroy
          • Recordings
            • Destroy
          • Call queue servers
            • Status
            • Destroy
          • Call queues
            • Status
            • Destroy
            • Waiting
              • Pickup
            • Agents
          • Exclusive numbers
            • Destroy
            • Call queues
              • Agents
              • Destroy
            • Export
          • Vip numbers
            • Destroy
            • Export
          • Call queue blacklisted numbers
            • Destroy
            • Export
          • Call queue blacklist prompts
          • Sessions
            • Directly
            • Hold
            • Unhold
            • Refer
            • Attended refer
            • Destroy
          • Conference rooms
            • Destroy
            • Status
            • Mute
            • Unmute
            • Lock
            • Unlock
            • Start recording
            • Stop recording
            • Participants
              • Layout
              • Invite
              • Mute
              • Unmute
              • Chairman
              • Position
              • Destroy
            • Recordings
              • Destroy
              • Set read
              • Set unread
          • Contacts
            • Destroy
            • Export
          • Emergency numbers
            • Destroy
          • Files
            • Destroy
          • Blobs
            • Uploads
              • Append
              • Complete
              • Status
              • Destroy
          • Inbound rules
            • Destroy
            • Export
          • Moh server
            • Musics
              • Destroy
          • Monitor
          • Monitor groups
            • Destroy
            • Members
              • Destroy
            • Managers
              • Destroy
          • Call park
          • Call park groups
            • Destroy
            • Members
              • Destroy
          • Call pickup groups
            • Destroy
            • Members
          • Voicemail
          • Acb
          • Outbound rules
            • Destroy
            • Export
            • Applied groups
              • Destroy
          • Phone models
          • Phones
            • Reprovision
            • Assignee
            • Reboot
            • Reject
          • Dect phone models
          • Dect phones
            • Destroy
            • Members
          • Providers
            • Status
            • Destroy
            • Export
            • Assignees
              • Destroy
          • Ring groups
            • Agents
            • Destroy
          • Shared voicemails
            • Destroy
            • Voicemails
              • Set read
              • Set unread
              • Destroy
            • Greetings
              • Enable
              • Disable
              • Destroy
          • Holidays
            • Destroy
          • Allowed country codes
          • Disallowed codes
            • Destroy
            • Export
          • Blacklisted numbers
            • Destroy
            • Export
          • Call rates
            • Destroy
            • Export
          • Ivr servers
            • Status
            • Destroy
          • Ivrs
            • Status
            • Destroy
            • Action urls
              • Destroy
          • Hotdesking
            • Status
            • Logout
            • Destroy
          • Sms
            • Destroy
          • Whatsapp
            • Destroy
          • Cdrs
          • Calllogs
          • External messages
          • Call reports
            • Destroy
          • Completed call reports
            • Destroy
          • Feature access codes
          • Default email templates
          • Custom email templates
          • Audit logs
          • Event logs
          • Ms365
            • Certificate
            • Users
          • Google
          • Admin
            • Status
            • Username
            • Password
            • Settings
            • Notification
              • Test email
            • Ms365
              • Certificate
            • Google
          • Templates
            • Phones
              • Destroy
        • Specification
      • Version 22.0
        • About
        • API reference
          • Info
          • Login
            • By microsoft
          • Logout
          • Network
          • Sbc
            • Token
              • Destroy
          • Im
            • Token
              • Destroy
          • Dealers
            • Password
            • Destroy
          • Mobile push
            • Destroy
          • Ip filters
            • Destroy
            • Export
          • Transports
            • Destroy
            • Status
          • Tenants
            • Switch
            • Dealers
              • Destroy
            • Destroy
          • Tenant
            • Status
            • Notification
            • Password policy
            • Billing
            • Balance
            • Custom headers
          • Conference servers
            • Status
            • Destroy
          • Media servers
            • Status
            • Destroy
          • License
          • Key
          • Brand
          • Dealer
            • Status
            • Username
            • Password
          • Roles
            • Destroy
          • User
            • Password
            • Extension password
            • Profile
            • Status
            • Presence
            • Balance
            • Greetings
              • Enable
              • Disable
              • Destroy
            • Phones
              • Destroy
            • Cdrs
              • Sync tokens
                • Diff
            • Recordings
              • Destroy
            • Speed dial 8
              • Destroy
            • Speed dial 100
              • Destroy
            • Meetings
              • Destroy
              • Status
              • Mute
              • Unmute
              • Lock
              • Unlock
              • Start
              • Stop
              • Start recording
              • Stop recording
              • Participants
                • Layout
                • Invite
                • Mute
                • Unmute
                • Chairman
                • Position
                • Destroy
            • Holidays
              • Destroy
            • Global holidays
            • Contacts
              • Favorite
              • Unfavorite
              • Destroy
              • Sync tokens
                • Diff
            • Call queues
              • Agent
            • Outbound caller ids
            • Ring groups
            • Business contacts
              • Favorite
              • Unfavorite
              • Sync tokens
                • Diff
            • Extension contacts
              • Favorite
              • Unfavorite
              • Sync tokens
                • Diff
          • Users
            • Profile
            • Password
            • Extension password
            • Role
            • Ms365 binding
              • Destroy
            • Destroy
            • Status
              • Destroy status
            • Balance
            • Greetings
              • Enable
              • Disable
              • Destroy
            • Phones
              • Destroy
            • Holidays
              • Destroy
            • Global holidays
            • Call queues
              • Agent
            • Speed dial 8
              • Destroy
            • Speed dial 100
              • Destroy
          • Extension numbers
          • Groups
            • Destroy
            • Members
              • Destroy
          • Voicemails
            • Set read
            • Set unread
            • Destroy
          • Recordings
            • Destroy
          • Call queue servers
            • Status
            • Destroy
          • Call queues
            • Status
            • Destroy
            • Waiting
              • Pickup
            • Agents
          • Exclusive numbers
            • Destroy
            • Call queues
              • Agents
              • Destroy
            • Export
          • Vip numbers
            • Destroy
            • Export
          • Call queue blacklisted numbers
            • Destroy
            • Export
          • Call queue blacklist prompts
          • Sessions
            • Directly
            • Hold
            • Unhold
            • Refer
            • Attended refer
            • Destroy
          • Conference rooms
            • Destroy
            • Status
            • Mute
            • Unmute
            • Lock
            • Unlock
            • Start recording
            • Stop recording
            • Participants
              • Layout
              • Invite
              • Mute
              • Unmute
              • Chairman
              • Position
              • Destroy
            • Recordings
              • Destroy
              • Set read
              • Set unread
          • Contacts
            • Destroy
            • Export
          • Emergency numbers
            • Destroy
          • Files
            • Destroy
          • Blobs
            • Uploads
              • Append
              • Complete
              • Status
              • Destroy
          • Inbound rules
            • Destroy
            • Export
          • Moh server
            • Musics
              • Destroy
          • Monitor
          • Monitor groups
            • Destroy
            • Members
              • Destroy
            • Managers
              • Destroy
          • Call park
          • Call park groups
            • Destroy
            • Members
              • Destroy
          • Call pickup groups
            • Destroy
            • Members
          • Voicemail
          • Acb
          • Outbound rules
            • Destroy
            • Export
            • Applied groups
              • Destroy
          • Phone models
          • Phones
            • Reprovision
            • Assignee
            • Reboot
            • Reject
          • Dect phone models
          • Dect phones
            • Destroy
            • Members
          • Providers
            • Status
            • Destroy
            • Export
            • Assignees
              • Destroy
          • Ring groups
            • Agents
            • Destroy
          • Shared voicemails
            • Destroy
            • Voicemails
              • Set read
              • Set unread
              • Destroy
            • Greetings
              • Enable
              • Disable
              • Destroy
          • Holidays
            • Destroy
          • Allowed country codes
          • Disallowed codes
            • Destroy
            • Export
          • Blacklisted numbers
            • Destroy
            • Export
          • Call rates
            • Destroy
            • Export
          • Ivr servers
            • Status
            • Destroy
          • Ivrs
            • Status
            • Destroy
            • Action urls
              • Destroy
          • Hotdesking
            • Status
            • Logout
            • Destroy
          • Sms
            • Destroy
          • Whatsapp
            • Destroy
          • Cdrs
          • Call reports
            • Destroy
          • Completed call reports
            • Destroy
          • Feature access codes
          • Default email templates
          • Custom email templates
          • Audit logs
          • Event logs
          • Test email
          • Ms365
            • Certificate
            • Users
          • Admin
            • Status
            • Username
            • Password
            • Settings
            • Notification
          • Templates
            • Phones
              • Destroy
        • Specification
      • Authentication
      • Accessing CDRs and Recordings
    • Call Control APIs
    • Messaging APIs
      • Protocol
      • API Examples
    • WSI: Pub/Sub
    • Webhook Events
      • Registering a Webhook
      • Receiving Events via a Webhook
      • Event Reference
    • Mobile Push Notifications
      • How Do Push Notifications Work with PortSIP PBX?
      • Integrating the Push Notifications in Native iOS APP
      • Integrating the Push Notifications in Android APP
  • PBX v12.x (EOL)
    • PortSIP PBX v12.x is EOL
    • High Availability
      • PortSIP PBX High Availability
      • UCaaS High Availability
      • Deploy the PortSIP PBX HA on AWS
      • Deploy PortSIP PBX HA for CentOS
      • Deploy PortSIP PBX HA for Ubuntu
      • Migrate the HA data
    • Push Notifications
      • How do push notifications work with PortSIP PBX?
      • Implement the PUSH notifications in Xamarin iOS APP with PortSIP PBX 12.x
      • Implement the PUSH notifications in native iOS APP with PortSIP PBX 12.x
      • Implement PUSH notifications in Android APP with PortSIP PBX 12.x
      • Implement PUSH notifications in Xamarin Android APP with PortSIP PBX 12.x
    • Tutorials
      • REST API Examples
      • Trace server - A Better Way to Debug PortSIP UC
      • Setup SSL Certificates for HTTPS/WebRTC
      • Going Real-Time with PortSIP PBX Pub/Sub
      • Upgrade PortSIP PBX for offline
      • PortSIP UC Architecture
      • PortSIP PBX Features
      • PortSIP Security Feature
      • Hardware Specifications
      • Setup PortSIP PBX for Linux
      • Upgrade PortSIP PBX
      • Upgrade PortSIP PBX v12.x to the v12.8.7
      • Add Extended Media Server
      • Store the recording files to AWS S3
      • Configure Notifications for Kubernetes
      • Rebranding PortSIP PBX
Powered by GitBook
On this page
  • Connecting IM Server
  • Authentication
  • Obtain Access Token
  • Authenticate with IM Service using the Access Token
  • Subscribe to P2P Topic
  • Sending Message to P2P Topic
  • Get the Topics I Have Subscribed To
  • Query Topic Details
  • Obtain Historical Messages
  • Creating a Group Chat
  • Join a Group
  • Sending a Message to a Group
  • Leave From a Group
  • Remove a Member from the Group
  • Delete a Group
  • Update Group Information
  • Transfer Group Ownership
  • Uploading a File to the IM Server
  • Download the Chat File
  1. DEVELOPING WITH PORTSIP
  2. Messaging APIs

API Examples

PreviousProtocolNextWSI: Pub/Sub

Last updated 7 months ago

In this article, we will provide examples in Python to demonstrate how the client application interacts with the PortSIP PBX IM service. For these examples, we assume the PBX server is hosted at https://pbx.portsip.com:8887.

Connecting IM Server

The client application needs to use WebSocket to connect to the URL wss://pbx.portsip.com:8887/im.

ssl_context = ssl.create_default_context()  
ssl_context.check_hostname = False  
ssl_context.verify_mode = ssl.CERT_NONE
websocket = await websockets.connect(uri, ssl = ssl_context)

Authentication

Once the connection to the IM server is successfully established, the client must authenticate with the server in order to send and receive messages.

Obtain Access Token

The IM service authenticates the client application using the PortSIP PBX access token. Please follow the instructions in the article "" to obtain the token.

Authenticate with IM Service using the Access Token

Once the access token is obtained, you can authenticate with the IM service by sending the login command to the server.

auth = str(user) + "@" + domain + ":" + access_token
secret = base64.b64encode(auth.encode())
uuid4 = uuid.uuid4()
message = {
    "login": {
    "id": str(uuid4),
    "scheme": "access_token",
    "secret": secret.decode()
    }
}
await websocket.send(json.dumps(message))
response = await websocket.recv()
logger.debug("client_auth  response : " + response)
ret = json.loads(response)
if ret["ctrl"]["code"] == 200 :
    return ret["ctrl"]["params"]["user"]
else :
    logger.error("client_auth [" + str(user) + "] retcode not 200  response : " + response) 
return ""

If authentication is successful, the server will respond as shown below.

{
    "ctrl": {
        "id": "fef15fa2-3e27-49ec-9286-50279d67cde3",
        "params": {
            "authlvl": "auth",
            "token": "AAAAhnJBgwwAAAAvbEGDDB7R+mgUAAAAAQAC9wKOmcHTClrJc8wtV5MD7AIx0LTN5iy5E901p+EBgg==",
            "user": "usr804252613548777777"
        },
        "code": 200,
        "text": "ok",
        "ts": "2024-10-24T01:06:38.924626Z"
    }
}
  • ["ctrl"]["params"]["user"]: Represents the user ID.

  • ["ctrl"]["params"]["token"]: Represents the user's authentication token, which can be used for verifying permissions in future HTTP file uploads to the IM server.

Subscribe to P2P Topic

P2P topics represent a communication channel between two users, and these topics do not have an owner.

The topic IDs for the two participating users are different. Each user views the other user’s ID as the P2P topic ID. For example, if the two users in the topic are usr804252613548703744 and usr804252613548777777, the first user will see the topic ID as usr804252613548777777, while the second user will see the topic ID as usr804252613548703744.

uuid4 = uuid.uuid4()
message = {
    "sub": {
        "id": str(uuid4),
        "topic": "usr804252613548703744"
    }
}
await websocket.send(json.dumps(message))
response = await websocket.recv()
logger.debug("p2p_sub_message to : usr804252613548703744 response : " + response)

Sending Message to P2P Topic

You can send a message to a P2P topic for another user using the following code snippet. The ["pub"]["id"] is a UUID that the client application must generate. The server will return this ID in its response, allowing the client to track the message by this ID.

uuid4 = uuid.uuid4()
message = {
    "pub": {
        "id": str(uuid4),
        "topic": "usr804252613548703744",
        "noecho": False,
        "content": "test test test"
    }
}
try:
    await websocket.send(json.dumps(message))
    response = await websocket.recv()
except ConnectionClosedError as e:
    logger.error("Connection closed unexpectedly : " + str(e))
    break
logger.debug("pub_message to : usr804252613548703744 response : " + response)
ret = json.loads(response)
if 'ctrl' in ret and ret["ctrl"]["code"] >= 300:
    logger.error("pub_message  retcode error  response : " + response)

The response will look like the following:

{
    "ctrl": {
        "id": "99c5075a-cf52-493c-8572-9e30437a02ce",
        "topic": "usr804252613548703744",
        "params": {
            "seq": 377
        },
        "code": 202,
        "text": "accepted",
        "ts": "2024-10-24T08:24:41.913558Z"
    }
}

The user with the ID 804252613548777777 will receive the message as shown below:

{
    "data": {
        "topic": "usr804252613548703744",
        "from": "usr804252613548777777",
        "ts": "2024-10-24T08:24:41.913558Z",
        "seq": 377,
        "content": "test test test",
        "reqid": "99c5075a-cf52-493c-8572-9e30437a02ce"
    }
}

Get the Topics I Have Subscribed To

You can use the following code to retrieve the topics you have subscribed to.

uuid4 = uuid.uuid4()
message = {
    "get": {
        "sub": {
            "ims": "2024-01-03T07:38:56.304Z"
         },
        "id": str(uuid4),
        "topic": "usr804252613548703744",
        "what": "sub"
    }
}
await websocket.send(json.dumps(message))
response = await websocket.recv()
logger.debug("p2p_sub_message to : usr804252613548703744 response : " + response)
 

The response will look like the following:

{
    "meta": {
        "id": "362c603e-4343-40a6-ab32-4e4248171d89",
        "topic": "usr804252613548703744",
        "ts": "2024-10-24T01:34:48.960092Z",
        "sub": [
            {
                "updated": "2024-10-24T01:04:20.272656Z",
                "acs": {
                    "want": "JRWPA",
                    "given": "JRWPAS",
                    "mode": "JRWPA"
                },
                "user": "usr804252613548703744"
            },
            {
                "updated": "2024-10-24T01:30:49.077521Z",
                "acs": {
                    "want": "JRWPA",
                    "given": "JRWPA",
                    "mode": "JRWPA"
                },
                "read": 367,
                "recv": 367,
                "user": "usr804252613548777777"
            }
        ]
    }
}

Query Topic Details

You can use the following message {get what="desc"} to query the details of a topic. For example, group-related information can be found within the details of a group topic.

uuid4 = uuid.uuid4()
message = {
    "get": {
        "desc": {
            "ims": "2024-01-03T07:38:56.304Z"
         },
        "id": str(uuid4),
        "topic": "usr804252613548703744",
        "what": "desc"
    }
}
await websocket.send(json.dumps(message))
response = await websocket.recv()
logger.debug("p2p_sub_message to : usr804252613548703744 response : " + response)

The response will look like the following:

{
    "meta": {
        "id": "926c7203-0ff7-4241-b9d2-0b46a5e625c6",
        "topic": "usr804252613548703744",
        "ts": "2024-10-24T01:30:45.144013Z",
        "desc": {
            "created": "2024-10-24T01:04:20.286287Z",
            "updated": "2024-10-24T01:26:51.198007Z",
            "touched": "2024-10-24T01:26:51.197597Z",
            "acs": {
                "want": "JRWPA",
                "given": "JRWPA",
                "mode": "JRWPA"
            },
            "seq": 305,
            "read": 305,
            "recv": 305
        }
    }
}

Obtain Historical Messages

By using the ["meta"]["desc"]["seq"] field returned from the {get what="desc"} message, you can retrieve the number of messages in the subscribed topic. You can then use {get what="data"} to fetch historical messages.

uuid4 = uuid.uuid4()
message = {
    "get": {
        "data": {
            "before": 10000,
            "limit": 1000,
            "since": 0
        },
        "id": str(uuid4),
        "topic": "usr804252613548703744",
        "what": "data"
    }
}
try:
    await websocket.send(json.dumps(message))
    response = await websocket.recv()
except ConnectionClosedError as e:
    logger.error("Connection closed unexpectedly : " + str(e))
    break
logger.debug("sub_message to usr804252613548703744 response : " + response)
ret = json.loads(response)
if 'ctrl' in ret and ret["ctrl"]["code"] >= 300:
    logger.error("sub_message  retcode error  response : " + response)
while IS_RUNNING:
    try:
        message = await asyncio.wait_for(websocket.recv(), timeout=SENDER_SLEEP)
        logger.debug("sub_message  : " + message)
        ret = json.loads(message)
        if 'ctrl' in ret and ret["ctrl"]["code"] >= 300:
            logger.error("sub_message  retcode error  response : " + message)
        if 'data' in ret:
            //recived msg
    except asyncio.TimeoutError:
        break
    except ConnectionClosedError as e:
        logger.error("Connection closed unexpectedly : " + str(e))
        break

Creating a Group Chat

You can use the following message to create a group chat.

uuid4 = uuid.uuid4()
message = {
    "sub": {
        "id": str(uuid4),
        "topic": "new"
    }
}
await websocket.send(json.dumps(message))
response = await websocket.recv()
logger.debug("group_create  response : " + response)
ret = json.loads(response)
if ret["ctrl"]["code"] == 200 :
    return ret["ctrl"]["topic"]
else :
    logger.error("group_create retcode not 200  response : " + response) 
return ""

The response will look like the following, the ["ctrl"]["topic"] represents the group topic. Then other users can subscribe to group messages by sending {sub topic="grpf0NlkdDEQHs"}.

{
    "ctrl": {
        "id": "06679cbc-b1d8-4821-a71f-44c1229e350e",
        "topic": "grpf0NlkdDEQHs",
        "params": {
            "acs": {
                "want": "JRWPASDO",
                "given": "JRWPASDO",
                "mode": "JRWPASDO"
            },
            "tmpname": "new"
        },
        "code": 200,
        "text": "ok",
        "ts": "2024-10-24T01:12:11.153147Z"
    }
}

Join a Group

The user can send the following message to subscribe to the group topic, allowing them to join the group and send or receive messages within the group.

uuid4 = uuid.uuid4()
message = {
    "sub": {
        "id": str(uuid4),
        "topic": "grpf0NlkdDEQHs"
    }
}
await websocket.send(json.dumps(message))
response = await websocket.recv()
logger.debug("sub to : grpf0NlkdDEQHs response : " + response)

The response will look like the following:

{
    "ctrl": {
        "id": "9c1c98b5-5123-41be-a6b9-2fe03877b946",
        "topic": "grpf0NlkdDEQHs",
        "params": {
            "seq": 1
        },
        "code": 202,
        "text": "accepted",
        "ts": "2024-10-24T07:04:01.052963Z"
    }
}

Sending a Message to a Group

You can use the following code to send a message to a group.

uuid4 = uuid.uuid4()
message = {
    "pub": {
        "id": str(uuid4),
        "topic": "grpf0NlkdDEQHs",
        "noecho": False,
        "content": "test test test"
    }
}
try:
    await websocket.send(json.dumps(message))
    response = await websocket.recv()
except ConnectionClosedError as e:
    logger.error("Connection closed unexpectedly : " + str(e))
    break
logger.debug("pub_message to : grpf0NlkdDEQHs response : " + response)
ret = json.loads(response)
if 'ctrl' in ret and ret["ctrl"]["code"] >= 300:
    logger.error("pub_message  retcode error  response : " + response)

The response will look like the following if succeeds:

{
    "ctrl": {
        "id": "c1dd7a45-93db-4af9-870d-10643222b7e7",
        "topic": "grpf0NlkdDEQHs",
        "params": {
            "seq": 2
        },
        "code": 202,
        "text": "accepted",
        "ts": "2024-10-24T07:04:01.120034Z"
    }
}

The following message will be sent to all users who have subscribed to the group topic.

{
    "data": {
        "topic": "grpf0NlkdDEQHs",
        "from": "usr901636310534455296",
        "ts": "2024-10-24T07:04:01.120034Z",
        "seq": 2,
        "content": "test test test",
        "reqid": "c1dd7a45-93db-4af9-870d-10643222b7e7"
    }
}

Leave From a Group

Users can unsubscribe from a group by sending a {leave} message. This is the opposite function of the {sub} message. The {leave} message supports two options:

  • Leave without unsubscribing (unsub=false)

  • Unsubscribe and leave (unsub=true)

The server will respond to a {leave} message with a {ctrl} packet.

  • Leave without unsubscribing (unsub=false) only affects the current WebSocket session. You will still receive messages if you establish a new WebSocket session with the IM server, and if the user is connected to the IM server from another app, they will also continue receiving messages.

  • Unsubscribe and leave (unsub=true) affects all sessions for that user. The user will no longer receive messages from this group across any session unless he subscribes to this group topic again.

uuid4 = uuid.uuid4()
message = {
    "leave": {
        "id": str(uuid4),
        "topic": "grpf0NlkdDEQHs"
        "unsub": True 
    }
}
await websocket.send(json.dumps(message))
response = await websocket.recv()
logger.debug("leave to : grpf0NlkdDEQHs response : " + response)

The response will look like the following if succeeds:

{
    "ctrl": {
        "id": "b154ccc9-4ac8-4a71-bf74-288771d818e5",
        "topic": "grp5XUxk__lpVY",
        "code": 200,
        "text": "ok",
        "ts": "2024-10-24T07:35:51.253545Z"
    }
}

Remove a Member from the Group

The group administrator can remove a member from the group by sending the following message:

uuid4 = uuid.uuid4()
message = {
    "del": {
        "id": str(uuid4),
        "topic": "grpf0NlkdDEQHs",
        "user": "usr804252613548777777",
        "what": "sub"
    }
}
await websocket.send(json.dumps(message))
response = await websocket.recv()
logger.debug("del usr804252613548777777 from grpf0NlkdDEQHs response : " + response)

The response will look like the following if succeeds:

{
    "ctrl": {
        "id": "b154ccc9-4ac8-4a71-bf74-288771d818e5",
        "topic": "grpf0NlkdDEQHs",
        "code": 200,
        "text": "ok",
        "ts": "2024-10-24T07:35:51.253545Z"
    }
}

Delete a Group

The group administrator can delete a group by sending the following message:

uuid4 = uuid.uuid4()
message = {
    "del": {
        "id": str(uuid4),
        "topic": "grpf0NlkdDEQHs",
        "what": "topic"
    }
}
await websocket.send(json.dumps(message))
response = await websocket.recv()
logger.debug("del grpf0NlkdDEQHs response : " + response)

The response will look like the following if succeeds:

{
    "ctrl": {
        "id": "b154ccc9-4ac8-4a71-bf74-288771d818e5",
        "topic": "grpf0NlkdDEQHs",
        "code": 200,
        "text": "ok",
        "ts": "2024-10-24T07:35:51.253545Z"
    }
}

Update Group Information

uuid4 = uuid.uuid4()
message =  {
    "set": {
    "id":str(uuid4),
        "topic":"grpf0NlkdDEQHs",
        "desc": {
            "public": {
                "fn": "My group"
            }
        }
    }
}
await websocket.send(json.dumps(message))
response = await websocket.recv()
logger.debug("group_set_test  response : " + response)
while True:
    try:
        message = await asyncio.wait_for(websocket.recv(), timeout=SENDER_SLEEP)
        logger.debug("group_set_test  response : " + message)
    except asyncio.TimeoutError:
        break
    except ConnectionClosedError as e:
        logger.error("Connection closed unexpectedly : " + str(e))
        break

The response will look like the following if succeeds:

{
  "ctrl": {
    "id": "83da454f-dad7-4bf0-b6d2-e32e104be8f3",
    "topic": "grpf0NlkdDEQHs",
    "code": 200,
    "text": "ok",
    "ts": "2024-10-25T03:53:20.337069Z"
  }
}

Transfer Group Ownership

The group administrator can transfer ownership of the group to another user by sending the following message. In this example, usr804252613548777777 indicates that the group ownership will be transferred to the user with the ID 804252613548777777.

uuid4 = uuid.uuid4()
message = {
    "set":{
        "id":str(uuid4),
        "topic":"grpf0NlkdDEQHs",
        "sub":{
            "mode":"JRWPASDO",
            "user":"usr804252613548777777"
        }
    }
}
await websocket.send(json.dumps(message))
response = await websocket.recv()
logger.debug("group_transfer_test  response : " + response)
while True:
    try:
        message = await asyncio.wait_for(websocket.recv(), timeout=SENDER_SLEEP)
        logger.debug("group_transfer_test  response : " + message)
    except asyncio.TimeoutError:
        break
    except ConnectionClosedError as e:
        logger.error("Connection closed unexpectedly : " + str(e))
        break

The responses will look like the following if succeed:

{
    "pres": {
        "topic": "grpf0NlkdDEQHs",
        "what": "acs",
        "dacs": {
            "want": "-ADO",
            "given": "-ADO"
        }
	}
}
{
  "ctrl": {
    "id": "5a98cfad-e9e7-4ac4-a2fa-915d3bd72f81",
    "topic": "grpf0NlkdDEQHs",
    "params": {
      "acs": {
        "want": "JRWPASDO",
        "given": "JRWPASDO",
        "mode": "JRWPASDO"
      },
      "user": "usr804252613548777777"
    },
    "code": 200,
    "text": "ok",
    "ts": "2024-10-25T03:40:52.35514Z"
  }
}

Uploading a File to the IM Server

To send a file in a chat, you first need to upload the file to the IM server using an HTTP POST form request to https://pbx.portsip.com:8887/im/file. An example code is provided below:

//uuid4 = uuid.uuid4()
filename = str(uuid4)
with open(TEMP_DIR + '/'+ filename, 'w') as f:
    f.write(str(uuid4) * REPEAT_SIZE)

form = FormData()  
form.add_field('id', str(uuid4))  
form.add_field('file', open(TEMP_DIR + '/'+ filename, 'rb'), filename=filename)  

header = {  
    'Authorization': 'token ' + token
}  
try:
    if 'https' in upload_url:
        async with aiohttp.ClientSession(connector=TCPConnector(ssl=False)) as session:  
            async with session.post(upload_url, data=form, headers=header) as response:  
                if response.status == 200:  
                    text = await response.text()  
                    logger.debug(text)
                    count_upload()
                else:
                    text = await response.text()   
                    logger.error("http  post error status :" +  str(response.status) + " response : " + text)
    else:
        async with aiohttp.ClientSession() as session:  
            async with session.post(upload_url, data=form, headers=header) as response:  
                if response.status == 200:  
                    text = await response.text()  
                    logger.debug(text)
                    count_upload()
                else:
                    text = await response.text()   
                    logger.error("http  post error status :" +  str(response.status) + " response : " + text)
except aiohttp.ClientError as e:
    logger.error("http post error : " + str(e))
    continue
os.remove(TEMP_DIR + '/'+ filename)
await asyncio.sleep(UPLOAD_SLEEP)  

The response will look like the following if succeeds:

{
    "ctrl": {
        "id": "93db2d24-6663-4071-a373-586b184be576",
        "params": {
            "url": "NDW4_NYseeH20iuC3rih_wAAwItyRIMM"
        },
        "code": 200,
        "text": "ok",
        "ts": "2024-10-24T01:13:54.464796Z"
    }
}

["ctrl"]["params"]["url"] is the file download URL. The sender can send this URL in a message to the recipient. After receiving the message, the recipient can download the file and display it in the chat according to the file type.

Download the Chat File

Once a user receives a message containing the file URL, they can assemble the URL as shown below and download the file using an HTTP GET request.

The group administrator can update the group information by sending the following message. The information structure is defined in the of the group topic.

PortSIP PBX REST API Authentication
https://pbx.portsip.com:8887/im/file/NDW4_NYseeH20iuC3rih_wAAwItyRIMM
Public attributes