Your connection has timed out and you cannot join the meeting. Verify your network connectivity and try again

@tommy @michael_p.zoom

I think this issue occurs when someone tries to join a meeting which is not created by the same account (that their API key and secret were generated from)
I have tried this twice and this seems to be the issue. Can you please confirm ASAP?

hi…i am using 1.7.7,still not working. getting ‘Your connection has timed out and you cannot join the meeting. Verify your network connectivity and try again.

Hi @michael_p.zoom and @tommy I’m so experiencing the same issue of successful ZoomMtg.init but failure on ZoomMtg.join with 1.7.7 . This subsequently shows the error “Your connection has timed out and you cannot join the meeting. Verify your network connectivity and try again.” I’ve tried several different meetings and I’ve tried both http and https, both locally and CDN.

1 Like

I’m having this issue too with 1.7.7 My guess is that it’s due to the time() in the generate_signature() function. What timezone should we be using? I’m using PHP’s date_default_timezone_set(‘America/Denver’);

I just updated to 1.7.7 and am getting this error when most accounts create a meeting and then my sdk app connects. However when I use my account to create the meeting this issue does not occur. I need solution to this. Does it have something to do with the SDK api key as it relates to the account which creates the meeting? Should I be using the SDK or JWT key type? Has my SDK trial expired?

Hi All,

Here are a couple steps that helped others resolve their request timeout issue.

  1. Upgrade to a Pro account. That account that using the JWT app credentials within the Web SDK or hosting the meeting needs to be a Pro account as a workaround for this error right now.

  2. Use a newly generated scheduled meeting ID instead of using a PMI meeting number.

  3. Make sure that the meeting ID is valid and not deleted. One way to test is to try to join via Native client. If you get an invalid meeting ID error, that most likely means that the Meeting ID is invalid or deleted.

  4. If you are getting a Generated Signature error. Please make sure that you’re generating a signature properly on your end by
    a) Try to run the meeting using the sample web app to verify that your signature and account/meeting info is able to join successfully.
    b) If you’re able to join the meeting successfully using the sample web app and you want to generate the signature on the backend, make sure that your systems time syncs with World time - Join meeting timeout or signature expired.


I experience the same issue.

Have tried all 4 “workarounds” and nothing works :frowning:

this is the console output for the sample app:

{method: “join”, status: false, result: null, errorMessage: undefined, errorCode: 1}
method: “join”
status: false
result: null
errorMessage: undefined
errorCode: 1
proto: Object

Btw, I am a Pro Licensed Account

I’m able to join a regular meeting, but when I try to join a webinar it just gives me the connection time out error.

Michael_Purnell what is “world time”? do you mean UTC? Can you explain more to us how zoom’s servers handle the time in the signature? What clock server are your systems using as the definitive?

My linux server is set to sync to The server is in MST. I’ve tried the below code as well as setting date_default_timezone_set(‘UTC’); but no luck

Here’s my PHP code


function generate_signature($api_key, $api_secret, $meeting_number, $role) {
     $time = time() * 1000 - 30000; //time in milliseconds (or close enough)

     $data = base64_encode($api_key . $meeting_number . $time . $role);

     $hash = hash_hmac('sha256', $data, $api_secret, true);

     $_sig = $api_key . "." . $meeting_number . "." . $time . "." . $role . "." . base64_encode($hash);

     return rtrim(strtr(base64_encode($_sig), '+/', '-_'), '=');

@mystery @jwiebe - What is the meeting/Webinar ID that you’re using?

@cinemed - Please refer to my response in this post, I have provided examples on how to do so with Windows and Mac, you would need to do the same with Linux -

Yes I referred to that. What I need an answer for is what “world time” is? I tried setting my timezone to “UTC” if that’s what you meant by “world time” and it didn’t change anything. What timezone are your servers using since there is no such thing as “world time”?

Yesterday app was not working (Timeout-error) but today is everything ok.
Thanks team.

@michael_p.zoom Hello, Meeting IDs were: 972 9690 4866, 916 1492 1969, 981 8708 1412

I was using a randomly generated ID, not my PMI.

Turns out that if you’re hosting a webinar, you cannot join using the Web SDK if you use the same email address as the host. Once I changed the email property to a different email, I had more success.

There was previously a planned new Web SDK release for today/tomorrow, but I’m no longer seeing that on the upcoming changes page. Has it been pushed back?

@michael_p.zoom also this meeting too

For those of you who are having success, what timezone are you guys using for your generate_signature() function?

I’m just using UTC, seems to be working.

Oh look what I found, an answer to my question about UTC Getting error 200 (No Permission) with new Webclient

Update your documentation Zoom. I found 3 errors in your sample code in the documentation that prevents people from running it too. missing commas and capitalization in variable names.

The timeout message is deceptive. This is the actual response I’m getting

{“status”:false,“errorCode”:200,“errorMessage”:“No permission”,“result”:null}

No permission, is that an error with my JWT? My signature? Something else? I’m using the php generate signature function found here: and I set my timezone with date_default_timezone_set(‘UTC’);

I’m having the same issue as described here. I am using a ruby implementation of the signature generation, the relevant code is here:

Note that this signature generation worked as recently as version 1.7.5, a week or so after its release. But somewhere between then and now, this broke.

Today I added the - 30000 to the timestamp and upgraded the plugin to SDK v 1.7.7, but I still suspect that something isn’t right with the time now. So, can we have some clear instructions on whether the timestamp needs to be a specific timezone?

To clarify, using the sample web app, I can join the event, but using the Ruby implementation I can’t.

Update: @deepak2’s code in Invalid Signature with Sample Web App solved my Ruby issue. Thanks Deepak!

1 Like

In the interest of moving things along for everyone I’m posting my sample code (HTML& PHP). Just save this as a .php file and put it on a server that can run PHP to test it. This code is what SHOULD be in the documentation so people don’t even have to mess with installing a node package or piecing together something usable from the documentation for a CDN implementation. I’ve replaced all the parts (like api secret, meeting number, etc) that people need to replace with their own data with the word REMOVED. There are 5 instances, one being a password so note that if you use this and setup a meeting or webinar that has no password. Please post your results or let me know what I’ve done wrong here.




	$api_secret = 'REMOVED';

	function generate_signature($api_key, $api_secret, $meeting_number, $role) {
		$time = time() * 1000 - 30000; //time in milliseconds (or close enough)
		$data = base64_encode($api_key . $meeting_number . $time . $role);
		$hash = hash_hmac('sha256', $data, $api_secret, true);
		$_sig = $api_key . "." . $meeting_number . "." . $time . "." . $role . "." . base64_encode($hash);
		//return signature, url safe base64 encoded
		return rtrim(strtr(base64_encode($_sig), '+/', '-_'), '=');

	$response = generate_signature($_POST['api_key'], $api_secret, $POST['meeting_number'], $POST['role']);
	header('Content-type: application/json');

<!DOCTYPE html>
<html lang="en">
	<meta charset="utf-8" />
	<meta http-equiv="X-UA-Compatible" content="IE=edge" />
	<meta name="viewport" content="width=device-width, initial-scale=1" />


	<link type="text/css" rel="stylesheet" href="" />
	<link type="text/css" rel="stylesheet" href="" />

	<script src=""></script>
	<script src=""></script>
	<script src=""></script>
	<script src=""></script>
	<script src=""></script>
	<script src=""></script>

<!-- must put this in the body -->
<script src=""></script>


ZoomMtg.setZoomJSLib('', '/av');

var meetConfig = {
	meetingNumber: 'REMOVED ',
	leaveUrl: 'REMOVED',
	userName: 'Firstname Lastname',
	userEmail: '', // required for webinar
	passWord: 'REMOVED', // if required
	role: 0 // 1 for host; 0 for attendee or webinar

	type: 'POST',
	timeout: 30000,
	url: '<?php echo $_SERVER['PHP_SELF']; ?>',
	dataType: 'json',
	data: 'api_key=' + meetConfig.apiKey + '&meeting_number=' + meetConfig.meetingNumber + '&role=' + meetConfig.role
.done(function(data) {

	// for debug
	console.log('signature: ' + data);

		leaveUrl: meetConfig.leaveUrl,
		debug: true,
		success: function() {
				signature: data,
				apiKey: meetConfig.apiKey,
				meetingNumber: meetConfig.meetingNumber,
				userName: meetConfig.userName,
				// Email required for Webinars
				userEmail: meetConfig.userEmail,
				// password optional; set by Host
				passWord: meetConfig.passWord,	// ZOOM ESSENTIAL GUIDE HAS password: without the capital W AND IS MISSING THE COMMA AT THE END OF THE LINE
				error: function(res){
		error: function() {
			console.log('init error');