# Problem / AccessDenied on Downloading files from a WebHook event

**URL:** <https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232>\
**Category:** API and Webhooks\
**Created:** [March 22, 2020, 4:35pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232 "2020-03-22T16:35:20Z")\
**Posts on this page:** 18\
**Page:** 1

<div class="post-metadata">

**Author:** ![Nicolai](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/nicolai/32/3900_2.png) [@Nicolai](https://devforum.zoom.us/u/Nicolai)\
**Post date:** [March 22, 2020, 4:35pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/1 "2020-03-22T16:35:20Z")

</div>

Currently experiencing issues when trying to automatically download recordings after a webhook event (“event”: “recording.completed”)  
We automatically used the  
“download\_url”: “[https://XXXXXXXXXXXXXXXXXXXXXXXXXXX/](https://XXXXXXXXXXXXXXXXXXXXXXXXXXX/)”,  
to pull back the recording.

now getting a

\<?xml version="1.0" encoding="UTF-8"?\>`AccessDenied`Access denied

This was working properly over the last week, but seems to have changed in the last 12 hours (guessing updates w/ LOAD on zoom).

From the DOCS, I see they now have a spec for  
authorization: Bearer {download\_token}

Do we now need to use a JWT token to download the files ? Client\_ID / key or something to form an authenticated request?

Please advise, any suggestion / updates to DOCs would be appreciated, as currently not working and we have a university waiting to give green light on process.

I’ve tested this both on my PRO account as well as against an University instance.

**To Reproduce(If applicable)**  
Steps to reproduce the behavior:  
Try and download a file listed in the  
“recording\_files”: [{  
“id”: “GUID”,  
“meeting\_id”: “SYSYSYSYYSYSYSY”,  
“recording\_start”: “2020-03-22T15:55:44Z”,  
“recording\_end”: “2020-03-22T15:56:42Z”,  
“file\_type”: “MP4”,  
“file\_size”: “1962489”,  
“play\_url”: "XXXXXXXXXXXX,  
**"download\_url": “XXXXXXXXXXXXXXX”,**  
“status”: “completed”,  
“recording\_type”: “shared\_screen\_with\_speaker\_view”  
} ]

1. See error  
 ![image](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/2X/1/1a06ad5409d1fe6294719c607a1fdf8d8d0216f5.png)  
**Screenshots**

If I try and use the JWT Token but still getting  
Authentication Bearer Token I get the following error in a Postman GET  
{  
“status”: false,  
“errorCode”: 401,  
“errorMessage”: “java.lang.NullPointerException”,  
“result”: null  
}

Any updates / suggestion to get success in automating downloads ? can this be done as a JWT app ?

---

<div class="post-metadata">

**Author:** ![tomkl](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/tomkl/32/45709_2.png) [@tomkl](https://devforum.zoom.us/u/tomkl)\
**Post date:** [March 22, 2020, 8:16pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/2 "2020-03-22T20:16:22Z")

</div>

We have the exact same issue since about 7 hours ago.  
Anyone has a temporary workaround?  
We’ve already opened a ticket on behalf of the Open University of Israel but no response yet.  
This is a critical issue - can someoneat Zoom please investigate and escalate ASAP?  
Thanks.

---

<div class="post-metadata">

**Author:** ![Nicolai](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/nicolai/32/3900_2.png) [@Nicolai](https://devforum.zoom.us/u/Nicolai)\
**Post date:** [March 22, 2020, 8:58pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/3 "2020-03-22T20:58:56Z")

</div>

Hey Tom,  
So I’m not sure if this is NEW doc or not (don’t remember seen that in the past) they have additional information at  
(Can no longer find the documentation link)

but if you add  
?access\_token={YOUR\_VALID\_JWToken}  
to your “download\_url”  
as a querystring parameter it will start working again.  
My initial Bearer attempts where not working. but this works for now…

Hoping we get updates if the APIs see more changes.  
Good luck

---

<div class="post-metadata">

**Author:** ![tomkl](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/tomkl/32/45709_2.png) [@tomkl](https://devforum.zoom.us/u/tomkl)\
**Post date:** [March 22, 2020, 9:31pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/4 "2020-03-22T21:31:44Z")

</div>

Thanks Nicolai!  
This solution is working for us…  
Zoom definitely need to improve their API update notifications, this isn’t the first time…  
Good night,  
Tom.

---

<div class="post-metadata">

**Author:** ![Nicolai](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/nicolai/32/3900_2.png) [@Nicolai](https://devforum.zoom.us/u/Nicolai)\
**Post date:** [March 22, 2020, 10:46pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/5 "2020-03-22T22:46:35Z")

</div>

Glad it’s working for you as well.

Agreed on docs and any changes / updates to APIs and WebHooks, though I also appreciate these are pretty extenuating circumstances.

Let’s just all **Pay it forward** on the community forums, there is probably lots of people bashing their heads against the wall and I can only image how flooded support is at this point, so let’s all help each other out !

---

<div class="post-metadata">

**Author:** ![michael\_p.zoom](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/michael_p.zoom/32/18105_2.png) [@michael\_p.zoom](https://devforum.zoom.us/u/michael_p.zoom)\
**Post date:** [March 23, 2020, 1:31am UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/6 "2020-03-23T01:31:03Z")

</div>

Hi @Nicolai/@tomkl,

We’re glad that you were able to get it working! We do have the **?access\_token={download\_token}** listed within our Recording.completed reference docs[1], was it hard to find or just overlooked? We’re asking because we want to make sure our developers are able to easily find what they need within our docs without having to spend more time answering questions.

1 - [https://marketplace.zoom.us/docs/api-reference/webhook-reference/recording-events/recording-completed](https://marketplace.zoom.us/docs/api-reference/webhook-reference/recording-events/recording-completed)

 ![Screen Shot 2020-03-22 at 6.27.59 PM](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/2X/0/03f47dd63a079cf2c0fd98da4862e802564f6f10.png)

Thanks

---

<div class="post-metadata">

**Author:** ![tomkl](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/tomkl/32/45709_2.png) [@tomkl](https://devforum.zoom.us/u/tomkl)\
**Post date:** [March 23, 2020, 3:01pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/7 "2020-03-23T15:01:29Z")

</div>

Hi Michael,  
Our main concern is that it was not necessary to use the token this way prior to yesterday.  
A change was made by Zoom yesterday which made our old method of downloading records obselete.  
We were not aware of this change and apparently, other users were not aware as well, so I guess that the notification of API changes is something we hope will be executed better in the future.  
Thanks,  
Tom.

---

<div class="post-metadata">

**Author:** ![Nicolai](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/nicolai/32/3900_2.png) [@Nicolai](https://devforum.zoom.us/u/Nicolai)\
**Post date:** [March 23, 2020, 5:59pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/8 "2020-03-23T17:59:14Z")

</div>

As @tomkl indicated, it was more that the API spec changed w/ no notification, since it was working with no tokens most of last week and then suddenly stopped.

I’m not sure if that was a new addition to doc or oversight on my part, however yesterday, I saw the token documentation once, and then went back to find it again and couldn’t …  
so not sure if there are different versions of docs, or it being edited.  
Exceptional circumstances.

All good for now.

---

<div class="post-metadata">

**Author:** ![tommy](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/tommy/32/72769_2.png) [@tommy](https://devforum.zoom.us/u/tommy)\
**Post date:** [March 23, 2020, 10:33pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/10 "2020-03-23T22:33:55Z")

</div>

Hey @tomkl, @Nicolai,

We are aware of the issue and looking into if anything on the Zoom side affected this change. (ZOOM-146185)

For now, the work around is to add your [JWT Token](https://marketplace.zoom.us/docs/guides/authorization/jwt/jwt-with-zoom) to a **query param** to the download\_url and **not use the authorization bearer header** :

`$access_token=JWT_TOKEN_HERE`

Thanks,  
Tommy

---

<div class="post-metadata">

**Author:** ![tkrevh](https://avatars.discourse-cdn.com/v4/letter/t/ecae2f/32.png) [@tkrevh](https://devforum.zoom.us/u/tkrevh)\
**Post date:** [April 27, 2020, 9:48pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/11 "2020-04-27T21:48:21Z")

</div>

Hey @tommy is there any status update on this or ETA when this will be fixed?  
And what would be a workaround for users with OAuth access token?

---

<div class="post-metadata">

**Author:** ![tommy](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/tommy/32/72769_2.png) [@tommy](https://devforum.zoom.us/u/tommy)\
**Post date:** [April 30, 2020, 7:03pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/12 "2020-04-30T19:03:57Z")

</div>

Hey @tkrevh,

Unfortunately no ETA yet as the release was delayed.

For OAuth work around, use the download\_token in the [recording completed webhook](https://marketplace.zoom.us/docs/api-reference/webhook-reference/recording-events/recording-completed).

Thanks,  
Tommy

---

<div class="post-metadata">

**Author:** ![tkrevh](https://avatars.discourse-cdn.com/v4/letter/t/ecae2f/32.png) [@tkrevh](https://devforum.zoom.us/u/tkrevh)\
**Post date:** [April 30, 2020, 7:05pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/13 "2020-04-30T19:05:37Z")

</div>

Hey @tommy, I totally missed that, this is really helpful, thank you so much!

---

<div class="post-metadata">

**Author:** ![tommy](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/tommy/32/72769_2.png) [@tommy](https://devforum.zoom.us/u/tommy)\
**Post date:** [May 1, 2020, 9:21pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/14 "2020-05-01T21:21:04Z")

</div>

Hey @tkrevh,

You are welcome! 🙂

Thanks,  
Tommy

---

<div class="post-metadata">

**Author:** ![naveenkumarreddy.mal](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/naveenkumarreddy.mal/32/11935_2.png) [@naveenkumarreddy.mal](https://devforum.zoom.us/u/naveenkumarreddy.mal)\
**Post date:** [July 15, 2020, 3:14pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/15 "2020-07-15T15:14:39Z")

</div>

Any update on when we can expect Oauth token to work for downloading recordings.  
I am able to make it work with JWT workaround but it is not good for production scenario as suggested in doc.  
Does JWT reside at account level and cannot be generated at will ?

---

<div class="post-metadata">

**Author:** ![tommy](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/tommy/32/72769_2.png) [@tommy](https://devforum.zoom.us/u/tommy)\
**Post date:** [July 17, 2020, 6:26pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/16 "2020-07-17T18:26:18Z")

</div>

Hey @naveenkumarreddy.mal,

You can do so now! 🙂

download\_url?access\_token=ACCESS\_TOKEN\_HERE

Thanks,  
Tommy

---

<div class="post-metadata">

**Author:** ![naveenkumarreddy.mal](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/naveenkumarreddy.mal/32/11935_2.png) [@naveenkumarreddy.mal](https://devforum.zoom.us/u/naveenkumarreddy.mal)\
**Post date:** [July 20, 2020, 9:50am UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/17 "2020-07-20T09:50:34Z")

</div>

I have tried but it did not work. Does it need any update to the app.

---

<div class="post-metadata">

**Author:** ![tommy](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/tommy/32/72769_2.png) [@tommy](https://devforum.zoom.us/u/tommy)\
**Post date:** [July 22, 2020, 9:02pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/18 "2020-07-22T21:02:38Z")

</div>

Hey @naveenkumarreddy.mal,

Make sure you have the following scopes in your OAuth app:

Added support for private recordings to be downloaded using OAuth access token.

- Account-Level Apps will need " **recording:read:admin** , **recording:write:admin** , **recording:master**" scopes.
- User-Level Apps will need " **recording:read** , **recording:write**" scopes.
- A user with recording management permission can view private recordings recorded by another user in the same account.

> **[Zoom APIs, Webhooks, & WebSockets – Zoom Developer Support](https://devsupport.zoom.us/hc/en-us/sections/9481833134477)**

Thanks,  
Tommy

---

<div class="post-metadata">

**Author:** ![anawilliam850](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/anawilliam850/32/33827_2.png) [@anawilliam850](https://devforum.zoom.us/u/anawilliam850)\
**Post date:** [February 28, 2023, 10:51pm UTC](https://devforum.zoom.us/t/problem-accessdenied-on-downloading-files-from-a-webhook-event/9232/19 "2023-02-28T22:51:12Z")

</div>

> [@Nicolai](#):
>
> Currently experiencing issues when trying to automatically download recordings after a webhook event (“event”: “recording.completed”)  
> We automatically used the  
> “download\_url”: “[https://XXXXXXXXXXXXXXXXXXXXXXXXXXX/](https://XXXXXXXXXXXXXXXXXXXXXXXXXXX/)”,  
> to pull back the recording.
> 
> now getting a
> 
> \<?xml version="1.0" encoding="UTF-8"?\>`AccessDenied`Access denied
> 
> This was working properly over the last week, but seems to have changed in the last 12 hours (guessing updates w/ LOAD on zoom).
> 
> From the DOCS, I see they now have a spec for  
> authorization: Bearer {download\_token}
> 
> Do we now need to use a JWT token to download the files ? Client\_ID / key or something to form an authenticated request?
> 
> Please advise, any suggestion / updates to DOCs would be appreciated, as currently not working and we have a university waiting to give green light on process.
> 
> I’ve tested this both on my PRO account as well as against an University instance.
> 
> **To Reproduce(If applicable)**  
> Steps to reproduce the behavior:  
> Try and download a file listed in the  
> “recording\_files”: [{  
> “id”: “GUID”,  
> “meeting\_id”: “SYSYSYSYYSYSYSY”,  
> “recording\_start”: “2020-03-22T15:55:44Z”,  
> “recording\_end”: “2020-03-22T15:56:42Z”,  
> “file\_type”: “MP4”,  
> “file\_size”: “1962489”,  
> “play\_url”: "XXXXXXXXXXXX,  
> **“download\_url”: “XXXXXXXXXXXXXXX”,**  
> “status”: “completed”,  
> “recording\_type”: “shared\_screen\_with\_speaker\_view”  
> } ]
> 
> 1. See error
> 
> ![image](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/2X/1/1a06ad5409d1fe6294719c607a1fdf8d8d0216f5.png)
> 
> 5._Screenshots_\*
> 
> If I try and use the JWT Token but still getting  
> Authentication Bearer Token I get the following error in a Postman GET  
> {  
> “status”: false,  
> “errorCode”: 401,  
> “errorMessage”: “java.lang.NullPointerException”,  
> “result”: null  
> }
> 
> Any updates / suggestion to get success in automating downloads ? can this be done as a JWT app ?

It seems that Zoom has made some changes to their API, and now requires an authentication token to download recordings. You can generate this token by following the steps mentioned in their documentation.

To generate a token, you need to make a request to their token API endpoint with your API key and secret. Here’s an example of how to do it using cURL:

javascriptCopy code

```auto
curl -X POST https://zoom.us/oauth/token \
  -H 'Authorization: Basic base64_encode(api_key:api_secret)' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'grant_type=client_credentials'

```

Replace `api_key` and `api_secret` with your actual API key and secret, respectively. The `base64_encode()` function should be replaced with the appropriate function in your programming language to encode the string as base64.

Once you have the access token, you can use it to download the recording by sending a GET request to the download URL with the authorization header set to “Bearer {access\_token}”.

I hope this helps!
