Zoom Phone Integration into a web application with (Inbound/Outbound/Call data analytics)

Description
We have purchased a Zoom phone license and we are trying to do a POC before starting off the full development. We have couple of queries to clarify whether our requirement would become feasible with the features to offer by Zoom.

We have an enterprise application used by our customers. It’s like a CRM tool. The logged in users want to be able to initiate calls upon the click of phone numbers from our application and later they want to be able to see the call recordings in the applications for the calls made specific to the logged in user.

Insights we got through documentation:

Click a phone number in the browser => Invoke the Zoom client installed in user’s computer => Initiate the call

Create an app in the Zoom Market place (JWT/ OAuth) => Subscribe to Web hook events => get notified about the call status.

We have following queries:

  • Q1. If our web application is used by many users who logs in and want to create calls, does buying single zoom phone license would be suffice and how it functions if multiple users logs into zoom client app with same account on different computers and trying to make calls concurrently?

  • Q2. If each user should have dedicated Zoom phone license then how can we capture their calls events? Do we need to create an app on each account and configure events exclusively or we can have one common app created and will be able to route all calls from different accounts to the common app and trigger the web hooks?

  • Q3. There could be at least one thousand users who can log into our web application and try to make calls to their assigned customers and we might want to get call data information associated with only logged in user, will this be possible?

We can’t get much out of available zoom phone integration documentation in the less time we have, we really appreciate any possible features or ideas to go with that suits our client needs.

Which App Type (OAuth / JWT / Webhook)?

Which Endpoint/s?
Configured through event subscription using web-hooks feature on an account created in the market place for a user.

Hi @sreekanth.g,

Thanks for reaching out about this, and welcome to our Developer Community. :slight_smile:

You ask some great questions, and I’m happy to help clarify a few of your points. First, regarding your proposed flow:

Click a phone number in the browser => Invoke the Zoom client installed in user’s computer => Initiate the call

Yes, this can be accomplished. You would need to utilize our Phone Schema outlined here:
https://marketplace.zoom.us/docs/guides/zoom-phone/outbound-call

Create an app in the Zoom Market place (JWT/ OAuth) => Subscribe to Web hook events => get notified about the call status.

This is also possible—you can find our Phone Webhook events outlined here.

As for your specific questions:

Q1. If our web application is used by many users who logs in and want to create calls, does buying single zoom phone license would be suffice and how it functions if multiple users logs into zoom client app with same account on different computers and trying to make calls concurrently?

No, in order to place outbound calls, each user will need their own Zoom Phone license. You will need more than 1 license to have users handling more than 1 call simultaneously.

Q2. If each user should have dedicated Zoom phone license then how can we capture their calls events? Do we need to create an app on each account and configure events exclusively or we can have one common app created and will be able to route all calls from different accounts to the common app and trigger the web hooks?

You can create an OAuth App that your users would authorize. This would then allow you to capture events for their phone calls.

Q3. There could be at least one thousand users who can log into our web application and try to make calls to their assigned customers and we might want to get call data information associated with only logged in user, will this be possible?

You can leverage our webhooks for this—they returns the unique user ID for each user/event, so that you can determine which call belongs to which user.

I hope this information helps!
Will

Hi @will.zoom ,

Thanks for your prompt reply.

I have couple more queries now. I will describe our requirement and please suggest the best possible solution.

Q1). Like I said earlier, we want to be able to make outbound calls from our web application and be able to view the links to the call recordings in the app immediately after call gets finished using the web hooks configured on the OAuth application. Let’s say we have over one thousand users.

  • a). How many licenses we might then need approximately to accommodate a thousand users with inbound/outbound calls facility as well as access to call recordings?

Q2) Based on our analysis, and your answer to our earlier question (Q2), we are thinking the following approach but still need couple of insights here to kick start the integration in full force.

Create an OAuth Application => Account-level / User-managed => Subscribe to Phone events => Add scopes for Phone => Publish the app publicly / Share Privately

User will login to our web app => Authorize the app with their zoom credentials => Install the OAuth app => make / receive phone calls through the Zoom client => Web hooks on the app will get triggered

  • Do we need to publish the app so that all the rest of the users can access and install it on their accounts after passing through the authorization ?

  • If the app must be published then how can we restrict the installation / access to our set of users alone?

  • Once any user gets through the authorization process and have the app installed on his account then all his/her call events would automatically get captured by the web-hook events configured on the app and the authorization may not be needed in the subsequent visits to our web application ?

  • If we assume that authorization is not required once it’s finished for a user then what if there are any changes made to the app and we want the latest app to be installed for all users, in this case how to enforce the users to have latest version of app to be installed?

  • We are thinking that once the user finishes the authorization with OAuth app, the app will be installed on his/her account and henceforth all the call events will get subscribed and this doesn’t require any token to be sent to invoke the Zoom client upon the click on a phone number in the web page using URL scheme?
    [https://marketplace.zoom.us/docs/guides/zoom-phone/outbound-call#supported-uri-schemes]

      zoomphonecall://{phoneNumbertoCall}?cat=seccall&token={jwttoken}
      zoomphonecall://tel:{number1}?cat=seccall   => (tested, can open client without token part)
      zoomphonecall://tel:{number2}?cat=seccall&token=   => (tested, can open the client with empty token)
    

I think I have listed too many queries.:slight_smile:
We look forward for your answer, thanks a ton.

Hi @sreekanth.g,

Regarding:

  • a). How many licenses we might then need approximately to accommodate a thousand users with inbound/outbound calls facility as well as access to call recordings?

You will need a Zoom Phone license for each individual you wish to enable to send/receive calls.

As for your flow:

Create an OAuth Application => Account-level / User-managed => Subscribe to Phone events => Add scopes for Phone => Publish the app publicly / Share Privately

User will login to our web app => Authorize the app with their zoom credentials => Install the OAuth app => make / receive phone calls through the Zoom client => Web hooks on the app will get triggered

Yes, this makes sense. :slight_smile:

As for your questions:

Do we need to publish the app so that all the rest of the users can access and install it on their accounts after passing through the authorization ?

Yes

If the app must be published then how can we restrict the installation / access to our set of users alone?

One option is to put the authorization behind a login screen for just your users.

Once any user gets through the authorization process and have the app installed on his account then all his/her call events would automatically get captured by the web-hook events configured on the app and the authorization may not be needed in the subsequent visits to our web application ?

That’s correct.

If we assume that authorization is not required once it’s finished for a user then what if there are any changes made to the app and we want the latest app to be installed for all users, in this case how to enforce the users to have latest version of app to be installed?

They will be prompted to upgrade to the latest version of each app upon it being updated.

We are thinking that once the user finishes the authorization with OAuth app, the app will be installed on his/her account and henceforth all the call events will get subscribed and this doesn’t require any token to be sent to invoke the Zoom client upon the click on a phone number in the web page using URL scheme?

To place outbound calls using our schema, you will need to generate a token in the following format:
image

To just open the client, this may not be necessary.

Thanks!
Will

Hi @will.zoom

Thanks a ton for answering our queries. It certainly clears up ambiguity with couple of things.
We will explore further in detail to start off the integration.

We will contact in case of further questions.

No problem, glad I could help :slight_smile:

Hi @will.zoom,

I have gotten couple more interesting questions now.

Q1). For each user to be able to make / receive phone calls through Zoom Client, you said we need to have an explicit Zoom phone license. Can we buy this license alone with a Basic membership or that user must have membership other than Basic?

Q2). We have over a thousand users, who will be using the Zoom Phone for call facility. We would like to know if we can create extension numbers to a set of users from an existing account with Zoom phone license. If this is possible then how the behavior of Outbound / Inbound calls that are made through extension numbers would be ?

  • Making an outbound call from an extension number => Under what number this call data will be received to web hook events? (main number / extension number)

  • User chooses extension in IVR and receive an inbound call to extension number => under what number this call data gets received to web hook events?
    (main number / extension number)

  • Is there any limit on extensions that can be created for an account ?

Q3). Our requirement is to show the phone call recording url in our app right after the call (inbound / outbound) has been finished. We don’t want this recording to be downloadable but be able to listen to it after clicking on it in our web page. We have couple of questions in it.

Make / Receive a phone call => choose record option => call ended => OAuth app receives web-hook event subscribed => get call data => show call recording url in our app => click and listen to it

  • Does a user having Zoom phone license get call recordings for his/her account ?

  • If Yes, how long the call data will be persisted in the cloud and of what storage ?

  • If No, do we have any cloud storage recording options for this regard?

Hi @sreekanth.g,

Good questions.

For each user to be able to make / receive phone calls through Zoom Client, you said we need to have an explicit Zoom phone license . Can we buy this license alone with a Basic membership or that user must have membership other than Basic?

Zoom Phone licenses are separate from our standard plans. You can purchase just a Zoom Phone license if that is the only functionality you need to leverage.

We have over a thousand users, who will be using the Zoom Phone for call facility. We would like to know if we can create extension numbers to a set of users from an existing account with Zoom phone license . If this is possible then how the behavior of Outbound / Inbound calls that are made through extension numbers would be ?

  • Making an outbound call from an extension number => Under what number this call data will be received to web hook events? (main number / extension number)
  • User chooses extension in IVR and receive an inbound call to extension number => under what number this call data gets received to web hook events?
    (main number / extension number)
  • Is there any limit on extensions that can be created for an account ?

Yes this is possible. Regarding extensions, these will be reflected alongside the Zoom Phone number in our webhooks. For example:

Our requirement is to show the phone call recording url in our app right after the call (inbound / outbound) has been finished. We don’t want this recording to be downloadable but be able to listen to it after clicking on it in our web page. We have couple of questions in it.
Make / Receive a phone call => choose record option => call ended => OAuth app receives web-hook event subscribed => get call data => show call recording url in our app => click and listen to it

  • Does a user having Zoom phone license get call recordings for his/her account ?
  • If Yes, how long the call data will be persisted in the cloud and of what storage ?
  • If No, do we have any cloud storage recording options for this regard?

Please see here for details on Zoom Phone call recording and sharing:
https://support.zoom.us/hc/en-us/articles/360038521091-Accessing-and-sharing-call-recordings

Note that we have two endpoints for retrieving Call Recordings— a user level endpoint, and an endpoint for retrieving call recordings for an account:
https://marketplace.zoom.us/docs/api-reference/zoom-api/phone/phoneuserrecordings
https://marketplace.zoom.us/docs/api-reference/zoom-api/phone/getphonerecordings

I believe storage of Call recordings comes standard with Zoom Phone licenses.

Thanks!
Will

Hi @will.zoom ,

We have added web-hook for recording event and able to get the recording url in the data and download it but we want to be able to stream the recording upon the click in our web application.

Is there any way that we could make these call recordings into streamable format?

Hey @sreekanth.g,

While it’s a great suggestion, we don’t currently return a stream URL via API. Have you considered downloading the file and uploading it to a streaming service like Youtube or similar, where you can then embed it directly on your site?

Thanks,
Will

Hi @will.zoom ,

Have you considered downloading the file and uploading it to a streaming service like Youtube or similar, where you can then embed it directly on your site?

We are getting the new challenges as we progress through the implementation. Our whole idea is closely coupled with the web hooks. Although, we are receiving the download_url* node in the payload to our endpoint but we can’t use this url to directly download the audio and I presume it requires a separate API call with the token of the user to authenticate and then download the file.

Create an OAuth Application => User-managed => Subscribe to Phone events => Add scopes for Phone => Share Privately

User will login to our web app => Authorize the app with their zoom credentials => Install the OAuth app => Redirect to Our App => Click on a phone number in the Grid => Invoke the Zoom client => make / receive phone calls through the Zoom client => Web hooks on the app will get triggered

The model we have planned to integrate is having slight trouble with this approach as we no where store the user details except do the authorization and have the OAuth app installed on each user’s account to subscribe for phone events via webhooks. Please suggest any workaround here.

We have couple of new questions :slightly_smiling_face:

Q1). We want to enable the recording option as an automatic setting for phone calls (Inbound & Outbound) alone but not meetings and other things . Is this possible, If yes, where can we set this up in the account?

Q2). Is there any way to set automatic recording feature as automatic for a user through API call as we can’t ask each user in the whole system to enable this setting ?

If we can control it over the API call , we can tweak this setting based on our needs at a later point of time without a change request all thousand users.

Q3). caller_number node in the recording_completed event response, the phone number is not being sent but the extension number is provided. Is there any way to get the caller number ?

Once the recording event is fired, we want to retrieve the recording and associate this with the respective users involved in this call but we can’t map this activity as we can’t verify who is the caller, please let us know if we can rely on any other details for this regard.

Thanks
Sreekanth

Hi @will.zoom ,

Have you gotten the chance to look at our queries above?

Please assist with your insights on them.

Thanks,
Sreekanth

Hey @sreekanth.g,

Happy to help guide!

We want to enable the recording option as an automatic setting for phone calls (Inbound & Outbound) alone but not meetings and other things . Is this possible, If yes, where can we set this up in the account?

Yes, this is possible. Recording for Zoom Phone is separate from Cloud Recording (recording for Zoom Meetings). You can adjust settings for auto recording/Zoom Phone by following the steps outlined here:
https://support.zoom.us/hc/en-us/articles/360033511872-Changing-Zoom-Phone-policy-settings#h_fcb297bb-14e8-4094-91ca-dc61e1a18734

Is there any way to set automatic recording feature as automatic for a user through API call as we can’t ask each user in the whole system to enable this setting ?
If we can control it over the API call , we can tweak this setting based on our needs at a later point of time without a change request all thousand users.

Unfortunately, I don’t believe there is a way to update this setting on an individual user basis, via API.

caller_number node in the recording_completed event response, the phone number is not being sent but the extension number is provided. Is there any way to get the caller number ?

Are you seeing this across all Recording Completed webhooks, or just for some recordings? Similarly, do you see this returned when you poll the GET User’s Recordings or GET Call Recordings endpoints?

Let me know—thanks!
Will

Hi @will.zoom,

Thanks for your prompt reply!

Yes, we are seeing this across all Recording completed webhooks. We are unable to map caller, calle with an associated record url.Right after the recroding is finished, we need to know the accurate caller (phone_number) and calle (phone_number) information then only we can map them with the customer data we have in our system. We will be assigning each of our web app user with a zoom phone number and use these numbers as a look up against the data received in the recording completed event. But unfortunately this event is not returning caller phone_number instead extension number returned.

We haven’t tried the API calls as we are working with webhook events only.

q

Q1). Is there any way we can prevent this extension number coming in place of caller_number node?

Q2). We would like to display the call real time status in our application. We have gone through the doc depicting this feature here. Real time call status

It’s given that we can subscribe to call events and use webhooks to get the call status. But how to push this call status data to our UI simultaneously?

Fyi, our web application developed in ASP.NET Core MVC

  • How to push this call status data to UI after receiving data through webhooks?
  • Do we need to use any other technology for this?

Please let us know the best possible approaches for this.

Thanks
Sreekanth

Hi @sreekanth.g,

Thank you for sharing these details. Can you please share the full details of your example payload and follow up questions with me directly at developersupport@zoom.us?

We can continue the conversation there and this will help me to take a look at your specific use case/examples in greater detail, rather than here on our Forum.

Thank you,
Will

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.