# Webhook - URL Validation failed!

**URL:** <https://devforum.zoom.us/t/webhook-url-validation-failed/88506>\
**Category:** API and Webhooks\
**Created:** [May 16, 2023, 11:08pm UTC](https://devforum.zoom.us/t/webhook-url-validation-failed/88506 "2023-05-16T23:08:14Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![vladimir.rivera](https://avatars.discourse-cdn.com/v4/letter/v/3e96dc/32.png) [@vladimir.rivera](https://devforum.zoom.us/u/vladimir.rivera)\
**Post date:** [May 16, 2023, 11:08pm UTC](https://devforum.zoom.us/t/webhook-url-validation-failed/88506/1 "2023-05-16T23:08:14Z")

</div>

Hey I want a help to solve why I’m getting the error: _URL Validation Failed!,_ always

I’m following up the example posted here: [https://developers.zoom.us/docs/api/rest/webhook-reference/#validate-your-webhook-endpoint](https://developers.zoom.us/docs/api/rest/webhook-reference/#validate-your-webhook-endpoint), just in my case is from C#, using Azure function to validate the URL  
I have configured ngrok to validate my endpoint but I’m not sure what happens really

```auto

[FunctionName("Events")]
        public static async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.User, "post", Route = "Zoom")] HttpRequest req,
            ILogger log)
        {
            var eventSecretToken = "Here my secret token goes";
            log.LogInformation("C# HTTP trigger function processed a request.");
            string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
            var data = JsonConvert.DeserializeObject<DataResponse>(requestBody);
            var sha256 = new System.Security.Cryptography.HMACSHA256();
            sha256.Key = Encoding.ASCII.GetBytes(eventSecretToken);
            var hash = sha256.ComputeHash(System.Text.Encoding.ASCII.GetBytes(data.PayLoad.PlainToken));
            var hashString = ToHex(hash, false);

            return new OkObjectResult(new
            {
                plainToken = data.PayLoad.PlainToken,
                encryptedToken = hash,

            });

        }

        private static string ToHex(byte[] bytes, bool upperCase)
        {
            StringBuilder result = new StringBuilder(bytes.Length * 2);
            for (int i = 0; i < bytes.Length; i++)
                result.Append(bytes[i].ToString(upperCase ? "X2" : "x2"));
            return result.ToString();
        }

```

---

<div class="post-metadata">

**Author:** ![elisa.zoom](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/elisa.zoom/32/47836_2.png) [@elisa.zoom](https://devforum.zoom.us/u/elisa.zoom)\
**Post date:** [May 18, 2023, 3:14pm UTC](https://devforum.zoom.us/t/webhook-url-validation-failed/88506/2 "2023-05-18T15:14:46Z")

</div>

Hi @vladimir.rivera  
Thanks for reaching out to us!  
Have you taken a look at this sample app?

> <https://github.com/zoom/webhook-sample/blob/master/index.js#L34>

It looks like in your function you are not listening to the endpoint.url\_validation event

---

<div class="post-metadata">

**Author:** ![vladimir.rivera](https://avatars.discourse-cdn.com/v4/letter/v/3e96dc/32.png) [@vladimir.rivera](https://devforum.zoom.us/u/vladimir.rivera)\
**Post date:** [June 2, 2023, 3:48pm UTC](https://devforum.zoom.us/t/webhook-url-validation-failed/88506/3 "2023-06-02T15:48:44Z")

</div>

Hi Elisa,

I convert that code into C# code and I have the same problem.

if (!(payload.Event.IsNullOrDefault()) && payload.Event == “endpoint.url\_validation”)  
{

```
            var hashForValidate = new System.Security.Cryptography.HMACSHA256(Encoding.UTF8.GetBytes(secretToken)).ComputeHash(Encoding.UTF8.GetBytes(payload.payload.plainToken));

             //hmac.ComputeHash(Encoding.UTF8.GetBytes(payload.payload.plainToken));
            var hashed = ToHex(hashForValidate, false);
            var validationResponse = new
            {
                message = new
                {
                    plainToken = payload.payload.plainToken,
                    encryptedToken = hashed
                },
                status = 200
            };

            log.LogInformation($"Validation Response: {JsonConvert.SerializeObject(validationResponse)}");

            return new OkObjectResult(validationResponse);
        }

```

---

<div class="post-metadata">

**Author:** ![arkarthi2006](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/arkarthi2006/32/49069_2.png) [@arkarthi2006](https://devforum.zoom.us/u/arkarthi2006)\
**Post date:** [June 30, 2023, 6:54am UTC](https://devforum.zoom.us/t/webhook-url-validation-failed/88506/4 "2023-06-30T06:54:17Z")

</div>

> [@vladimir.rivera](#):
>
> ` var hashForValidate = new System.Security.Cryptography.HMACSHA256(Encoding.UTF8.GetBytes(secretToken)).ComputeHash(Encoding.UTF8.GetBytes(payload.payload.plainToke`

Any update on the above request?

---

<div class="post-metadata">

**Author:** ![vladimir.rivera](https://avatars.discourse-cdn.com/v4/letter/v/3e96dc/32.png) [@vladimir.rivera](https://devforum.zoom.us/u/vladimir.rivera)\
**Post date:** [June 30, 2023, 1:44pm UTC](https://devforum.zoom.us/t/webhook-url-validation-failed/88506/5 "2023-06-30T13:44:04Z")

</div>

Hi All, this way I fix the problem:

[FunctionName(“Events”)]  
public static async Task Run(  
[HttpTrigger(AuthorizationLevel.User, “post”)] HttpRequest req,  
ILogger log)  
{  
log.LogInformation(“C# Zoom Webhook function processed a request.”);

```
        string hashed = "";
        string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
        var data = JsonConvert.DeserializeObject<ZoomWebhookPayload>(requestBody);

        //To validate EndPoint in Zoom MarketPlace
        if (!(string.IsNullOrEmpty(data.Event)) && data.Event == "endpoint.url_validation")
        {
            var encoding = new System.Text.ASCIIEncoding();
            var sha256 = new System.Security.Cryptography.HMACSHA256();
            sha256.Key = encoding.GetBytes(Environment.GetEnvironmentVariable("ZOOM_WEBHOOK_SECRET_TOKEN"));
            var hash = sha256.ComputeHash(encoding.GetBytes(data.payload.plainToken));
            hashed = ToHex(hash, false);
            return new OkObjectResult(new
            {
                plainToken = data.payload.plainToken,
                encryptedToken = hashed
            });
        }

```

}  
private static string ToHex(byte bytes, bool upperCase)  
{  
StringBuilder result = new StringBuilder(bytes.Length \* 2);  
for (int i = 0; i \< bytes.Length; i++)  
result.Append(bytes[i].ToString(upperCase ? “X2” : “x2”));  
return result.ToString();  
}  
protected class ZoomWebhookPayload  
{  
public ZoomWebhookEventPayload payload { get; set; }  
public string Event { get; set; }  
}

```
    protected class ZoomWebhookEventPayload
    {
        public string plainToken { get; set; }

    }

```

---

<div class="post-metadata">

**Author:** ![oyusuf](https://avatars.discourse-cdn.com/v4/letter/o/13edae/32.png) [@oyusuf](https://devforum.zoom.us/u/oyusuf)\
**Post date:** [December 13, 2023, 2:50pm UTC](https://devforum.zoom.us/t/webhook-url-validation-failed/88506/6 "2023-12-13T14:50:18Z")

</div>

hello @vladimir.rivera  
i did the same api like  
public async Task ZoomEndSessionWebhook()  
{  
string requestBody = await new StreamReader(\_baseService.HttpContextAccessor.HttpContext.Request.Body).ReadToEndAsync();  
var timeSpane = \_baseService.HttpContextAccessor.HttpContext.Request.Headers[“x-zm-request-timestamp”].ToString();  
var EndZoomSessionWebhookDto = JsonConvert.DeserializeObject(requestBody);  
var encoding = new System.Text.ASCIIEncoding();  
var sha256 = new System.Security.Cryptography.HMACSHA256();  
string message = $“v0:{timeSpane}:{requestBody}”;  
sha256.Key = encoding.GetBytes(\_zoomSetting.ZoomWebhookSecretKey);  
var hash = sha256.ComputeHash(encoding.GetBytes(message));

```
   var hashed = ToHex(hash, false);
   
   string signature = $"v0={hashed}";
  
   if (signature == _baseService.HttpContextAccessor.HttpContext.Request.Headers["x-zm-signature"]) {
     if (EndZoomSessionWebhookDto.@event == "endpoint.url_validation") { 
         var plain = new System.Security.Cryptography.HMACSHA256();
     plain.Key = encoding.GetBytes(_zoomSetting.ZoomWebhookSecretKey);
     var hashForValidate = plain.ComputeHash(encoding.GetBytes(EndZoomSessionWebhookDto.payload.plainToken));

```

var hashString = ToHex(hashForValidate, false);  
return Ok(new { plainToken = result.message.plainToken, encryptedToken = result.message.encryptedToken });  
but still getting invalid url

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/3X/6/1/614bdd549b610bbaa46ff934617683a02bdaa03c.png) [@system](https://devforum.zoom.us/u/system)\
**Post date:** [December 14, 2023, 2:50pm UTC](https://devforum.zoom.us/t/webhook-url-validation-failed/88506/7 "2023-12-14T14:50:58Z")

</div>

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