In some future life I'll have more time to do a deep-dive in this latest API from 3CX. But from what I can see the only real-time events 3CX offers are call events, and even that event information is extremely limited. They do not appear to have separate events you can subscribe to for presence status or phone status.
As noted by
@NicholasP_3CX the original 3CX Call Control API does expose more event information, but even that API does not make getting phone or presence status straightforward. For example, you can get an event from 3CX that something has changed about a DN (extension) but it does not indicate what has changed.
Like you, we need to know when a user's phone status and presence status changes. To accomplish this, we subscribe to the real-time 3CX DN events published by the Call Control API. When our Relay API starts, we check the presence status of every user extension and save that in memory. When we get a new DN event, we compare the event data with the list in memory, and only if the presence value has changed do we push a presence-specific event to our applications. Our applications subscribe to our VoIPTools events rather than the original 3CX events. It makes it far easier than the native events.
But there are more challenges with the Call Control API. Perhaps the biggest challenge is that it only accepts requests from "localhost". So, if you have your application running on a server other than the 3CX server (required by 3CX), then how can your application subscribe to events? You cannot. That is the 2nd purpose of our VoIPTools Relay. Our Relay exposes our REST API, and Events API via HTTPS/JWT expiring tokens. That means your application can subscribe to events from anywhere provided your application can "see" the 3CX server.
If you need phone and presence status information, you
may be able to poll the new 3CX REST API for changes rather than subscribe to real-time events, but that is not an ideal approach even if it is possible.