Zoom show as webhook url validated even not sending a webhook event

I have configured a server-to-server application. In there I tried to enable Event subscription. Since I am in developing stage yet I provide a ngrok url to handle the webhooks. I am using nextjs in my application and I have setup handler correclty there.

I tested this webhook url with postman to identify is ngrok routing the request correclty.

The problem is when I hit “Validate” to validate my url, it shows as “Validated”. But there is no event triggered. Even endpoint.url_validation.

Hi @Comma
Thanks for reaching out to us and welcome to the Zoom Developer Forum.
Are you still facing this issue? I have never seen this before, so I am happy to look into this

1 Like

@elisa.zoom Yes. may be I am doing something wrong. What are the inputs do you want from my side

Could you try inspecting the requests in ngrok here:
http://127.0.0.1:4040/inspect/http

Also, here is a code snippet to handle validation:

const crypto = require('crypto')

// Webhook request event type is a challenge-response check
if(request.body.event === 'endpoint.url_validation') {
  const hashForValidate = crypto.createHmac('sha256', ZOOM_WEBHOOK_SECRET_TOKEN).update(request.body.payload.plainToken).digest('hex')

  response.status(200)
  response.json({
    "plainToken": request.body.payload.plainToken,
    "encryptedToken": hashForValidate
  })
}

https://21dd-112-134-153-150.ngrok-free.app/api/zoom/webhook
This is the webhook url that I provided.

import { NextResponse } from 'next/server';
import getLogger from '~/core/logger';

import {
  throwInternalServerErrorException,
} from '~/core/http-exceptions';

/**
 * @description Handle the webhooks from Zoom related to meetings
 */
export async function POST(request: Request) {
  const logger = getLogger();
  const zoomEvent: any = await request.json();
  logger.info(`[Zoom] Received Zoom Webhook`);
  // Zoom Challenge Validation (for first-time setup)
  if (zoomEvent?.event === "endpoint.url_validation") {
    const hashForValidation = require("crypto")
      .createHmac("sha256", process.env.ZOOM_SECRET_TOKEN)
      .update(zoomEvent.payload.plainToken)
      .digest("hex");

    return NextResponse.json({
      plainToken: zoomEvent.payload.plainToken,
      encryptedToken: hashForValidation,
    });
  }

  // Log received event
  console.log("📩 Received Zoom Event:", zoomEvent?.payload);

  try {

    logger.info(
      {
        type: zoomEvent.event.type,
      },
      `[Zoom] Processing Zoom Webhook...`,
    );

    switch (zoomEvent.event) {
        case "meeting.started":
            console.log(`📢 Meeting Started: ${zoomEvent.payload.object.id}`);
            break;
        case "meeting.ended":
            console.log(`⏹ Meeting Ended: ${zoomEvent.payload.object.id}`);
            break;
        case "recording.completed":
            console.log(`🎥 Recording Available: ${zoomEvent.payload.object.recording_files[0].download_url}`);
            break;
        default:
            console.log("⚠️ Unknown Event Received");
    }

    return NextResponse.json({ success: true });
  } catch (error) {
    logger.error(
      {
        error,
      },
      `[Zoom] Webhook handling failed`,
    );

    return throwInternalServerErrorException();
  }
}

And this is my handler function.

When I add url to webhook validation and press “Validate” there is no request show in the ngrok inspect.

But when I make a test post request to same endpoint by postman. there is 200 response and the logs on my server also write.

Interesting @Comma
Could you try restarting ngrok and providing your app’s new endpoint URL?
I have not seen this issue before.
We also have a helpful blog that might help you troubleshoot, could you give it a try to verify if the app is sending events:

Here is the new ngrok url @elisa.zoom

could you now test again @Comma to check if you are receiving event,

with my ngrok link, https://7d82-112-134-153-51.ngrok-free.app/api/zoom/webhook its not receive any events,

But with the way you provide by svix play, the app sends the events. Where is the issue from my side? @elisa.zoom

Also using postman, I can trigger the above ngrok end point, that hit to my handler also.

Hey @Comma
So it might be the way you are setting up your url in your application.
Make sure that the URL you are setting in the marketplace matches the one in your application

@elisa.zoom So to check that i used that exact same url to call from postman, and it is working without any problem and it is call my handler also.

The last troubleshooting I can think of is, if you could run this sample app

it uses ngrok as well.

I ran into something I think is related. I think the app configuration is incorrectly showing an endpoint as “Validated” when it shouldn’t be. For example, I can validate google as the webhook endpoint.

A brief background - I set up a webhook only app and began working on the endpoint that will eventually receive the events. I needed to get a sample of the validation request from Zoom, so I hit “Validate”, which I expected to absolutely fail. That was going to be fine because I had not configured the endpoint yet, but to my surprise it showed as “Validated”. I also checked my endpoint’s logs and it there were no requests from Zoom.

@cbirchall Did you able to find solution for that?

Not yet. Until I can confirm with Zoom that this is unexpected behavior and that webhook only apps are not able to be properly registered for at least myself and possibly you, I’m not sure what else I can do. I’ll post back to this thread with any progress.

Hi @cbirchall and @Comma
This is not expected, at least I have never seen this behavior.
Let me message you both independently so I can take a closer look.
Please follow up in your DMs

I am facing the same issue - app configuration shows my ngrok url as validated but I do not receive any event - not even endpoint url validation one.

I also tried svix play url and there I got the endpoint url validation event but not the chat received event.

1 Like

Thanks for chiming in @himanshu-zeppy
And yes Svix play is a great tool for testing our webhooks.
Here is a blog we have about that:

Do we have a resolution for this? I’m now facing exactly the same issue - validated URL and no webhook being sent.