@efren , for Android SDK, you can capture the log in the initParams.enableLog parameter

I would recommend setting the expiry to be 60 mins or more if you are using mobile SDK.

thanks for your answer @chunsiong.zoom ,

We will enable the android logs on a test device and we’ll wait for the next time this issue happens.

Is there any log in server side that I could check from the Zoom platform ?


Hi @chunsiong.zoom ,

Regarding the “signature has expired error”
We set the iat -60 mins and we still have signature errors few times a week.

As we are losing the confidence of our client we need to solve the problem.
Is there any premium support or the possibility to hire any zoom technical specialist?


@efren you might be able to sign up for developer support here

Nonetheless, did you managed to capture the log from android ?

If you are able to replicate this on the Web SDK, let me know too, we might be able to capture the tracking ID

@efren wanted to double check something with you too. Did you do minutes or seconds btw?
I realised previously the code sample was -60 seconds, instead of -60 minutes

Hi @chunsiong.zoom ,

Based on what the client reports to us, the “signature is expired” error message appears 5% -10% ot the times the users join a meeting.

The code is the following (It is in server side, the web client requests a signature each time it enters a meeting):

//static readonly int roleId = 0; // 0 for participant, 1 for host
        private static long ToEpoch(DateTime value) => (value.Ticks - 621355968000000000) / (10000 * 1000);
        public static string GetSignature(long meetingNumber, string sdkKey, string sdkSecret)
            var now = DateTime.UtcNow;
            int roleId = 1;
            var iat = ToEpoch(now.AddMinutes(-65));
            var exp = ToEpoch(now.AddDays(1));

            var payload = new Dictionary<string, object>()
              { "appKey", sdkKey },
              { "sdkKey", sdkKey },
              { "mn", meetingNumber },
              { "role", roleId },
              { "iat", iat },
              { "exp", exp },
              { "tokenExp", exp },
            return Jose.JWT.Encode(payload, Encoding.UTF8.GetBytes(sdkSecret), JwsAlgorithm.HS256);

@efren ,

Here’s what I would do.

  1. Try to capture the log from the SDK running on Android
  2. Use a different roleId for Participant and Host. There should be more participants than host.

I’ve tried out the c# code which you have shared, and tested it on my own meeting, it works fine (at least from the few test which I’ve done)

Some other considerations which might be farfetched, but still possible

  1. Cache of the web service which might be serving stale data
  2. static variables which might be using stale / older datetime data.

Hi @chunsiong.zoom ,

Yesterday we did the following test:

  1. We entered a meeting using our platform through web meeting SDK. We get the signature expired error message. We printed the signature used.
  2. A minute later, we “hardcoded” this signature to force using the same to enter the same meeting. It worked fine.

So, we understand that the problem is not in the signature although the sdk error message told us so.

We assume then the problem is in the way the meeting sdk is used. The structure is the following:

                    debug: true,
                    zoomAppRoot: meetingElement,
                    language: 'es-ES',
                    customize: {
                        video: {
                            isResizable: false,
                            popper: {
                                disableDraggable: true
                            viewSizes: {
                                default: {
                                        window.innerWidth -
                                        window.innerWidth / 2.5,
                                    height: window.innerHeight - 180
                                ribbon: {
                                    width: 300,
                                    height: 300
                        meetingInfo: [
                .then(() => {
           = 'none';

                    this.joinZoom(this.meeting!.data).then((connected: any) => {
                        this.connected = connected;

               = 'initial';

                        // Once zoom is loaded, we get the initial status of the meeting
                        this.getMeetingStatus().then((data) => {
                            resolve({ meetingStatus: data, isReady: true });
                .catch((err: any) => {
                    console.log('ERROR joining zoom');

joinZoom(data: any) {
        return new Promise((resolve, reject) => {
            const config = {
                sdkKey: Config.get().zoomSDK.KEY,
                signature: data.signature,
                meetingNumber: data.meeting.zoomId,
                password: data.meeting.zoomPwd,
                userName: data.userDisplayName

            console.log('Zoom Config', config);

            setTimeout(() => {
                    .then(() => {
                    .catch((err: any) => {
                        console.log('Error joining zoom', err);
            }, 200);

In this code, this.client = ZoomMtgEmbedded.createClient();

Do you have any idea where the problem is?

Regarding the ratio host/participant. We have seen that we set roleId in the signature = 1 for all users. We’ll set roleId = 0 for participants and try again. I’m not sure this is the problem because when we get the error, there are no participants in the meeting yet.


@efren I’ll private message you to get some additional information