# Zoom Meeting SDK Web - Error Codes

Comprehensive reference for all error codes returned by the Zoom Meeting SDK for Web.

## Quick Lookup

| Code Range | Category |
|------------|----------|
| 0-2 | General/Success |
| 3000-3999 | Meeting Validation |
| 4000-4999 | Connection Status |
| 6000+ | System/Service |
| 10000+ | SDK Version |
| 13000+ | Simulive |

## General Errors (0-2)

| Code | Name | Description | Solution |
|------|------|-------------|----------|
| `0` | SUCCESS | Function invoked successfully | N/A |
| `1` | FAIL | General function error | Check parameters and SDK state |
| `2` | MEETING_NOT_INIT | Meeting not initialized | Call `init()` before `join()` |

## Meeting Validation Errors (3000-3999)

### Authentication Errors

| Code | Name | Description | Solution |
|------|------|-------------|----------|
| `3704` | API_KEY_INVALID | SDK Key/Client ID is invalid | Verify SDK credentials in Marketplace |
| `3705` | SIGNATURE_EXPIRED | JWT signature has expired | Generate new signature with valid `exp` |
| `3708` | ROLE_ERROR | Incorrect role in signature | Use role 0 (participant) or 1 (host) |
| `3710` | API_KEY_DISABLED | SDK Key is deactivated | Re-enable in Marketplace or create new app |
| `3712` | SIGNATURE_INVALID | Signature verification failed | Check SDK secret, verify signature generation |
| `3265` | TOKEN_ERROR | Token validation failed | Check ZAK/OBF token format and expiry |
| `3623` | TOKEN_ERROR_ALT | Token error (alternate) | Same as 3265 |
| `3713` | NO_PERMISSION | Insufficient permissions | Verify account permissions and scopes |

### Meeting Errors

| Code | Name | Description | Solution |
|------|------|-------------|----------|
| `3001` | ERROR_NOT_EXIST | Meeting does not exist | Verify meeting number |
| `3003` | ERROR_NOT_HOST | Not meeting host | Use host's ZAK token to start |
| `3004` | WRONG_MEETING_PASSWORD | Incorrect password | Verify `passWord` (Client View) or `password` (Component View) |
| `3005` | ANOTHER_MEETING_RUNNING | Already in another meeting | Leave current meeting first |
| `3008` | MEETING_NOT_START | Meeting hasn't started | Wait for host or use "join before host" |
| `3009` | BE_REMOVED | User was removed from meeting | Cannot rejoin; contact host |
| `3610` | MEETING_NOT_EXIST_ALT | Meeting does not exist (alt) | Same as 3001 |

### Registration & Login

| Code | Name | Description | Solution |
|------|------|-------------|----------|
| `3000` | EMAIL_REQUIRED | Email required for webinar | Provide `userEmail` in join params |
| `3099` | REGISTRATION_REQUIRED | Meeting requires registration | Get `tk` token from registration API |
| `3100` | LOGIN_REQUIRED | Zoom login required | Provide ZAK token for authenticated join |
| `3624` | HOST_EMAIL_REQUIRED | Host/alt host needed for webinar | Use host credentials to start |

### Host Errors

| Code | Name | Description | Solution |
|------|------|-------------|----------|
| `3625` | HOST_INACTIVE | Meeting host is inactive | Contact host to activate account |
| `3702` | HOST_NOT_FOUND | Host does not exist | Verify host account |
| `3709` | HOST_NOT_FOUND | Host not found (alt) | Same as 3702 |
| `3711` | CANT_HOST_CONCURRENT | Can't host multiple meetings | End other meeting first |

### Platform Restrictions

| Code | Name | Description | Solution |
|------|------|-------------|----------|
| `3603` | NOT_SUPPORT_WEBCLIENT | Web join not allowed | Admin must enable web client |
| `3608` | TSP_NOT_SUPPORT | TSP audio not supported on web | Use computer audio or phone |
| `3611` | USE_DESKTOP_OR_MOBILE | Browser join disabled | Use Zoom desktop/mobile app |
| `3620` | EMAIL_BLOCKED | Email blocked by admin | Contact account administrator |
| `3621` | NO_RESPONSE_FROM_WEB | Server timeout | Retry request |

## Connection Errors (4000-4999)

| Code | Name | Description | Solution |
|------|------|-------------|----------|
| `4000` | RE_CONNECTING | Reconnecting to meeting | Wait for reconnection |
| `4001` | DISCONNECT | Disconnected from meeting | Check network, try rejoining |
| `4003` | INVALID_PARAMETER | Invalid join parameter | Check all required fields |
| `4004` | MEETING_ENDED | Meeting has ended | Cannot join ended meeting |
| `4005` | MEETING_CAPACITY_REACHED | Meeting is full | Host needs to increase capacity |
| `4006` | MEETING_LOCKED | Meeting is locked | Host must unlock to allow joins |
| `4007` | REJECT_BARRIERS | Information barriers rejection | Contact admin about policies |
| `4008` | PARTICIPANT_EXIST | Already a participant | Already in meeting or leave first |
| `4009` | SERVER_ERROR | Internal server error | Retry request |
| `4011` | NOT_ALLOW_CROSS_JOIN | Cross-account join blocked | Publish app on Marketplace (see 6.1 ToS) |

## OBF/Anonymous Join Errors (March 2026+)

> **IMPORTANT**: Starting **March 2, 2026**, anonymous joins to external meetings are blocked. You must provide a valid OBF or ZAK token.

| Code | Name | Description | Solution |
|------|------|-------------|----------|
| `4012` | NOT_ALLOW_ANONYMOUS_JOIN | Anonymous join not allowed | Provide valid OBF or ZAK token |
| `4013` | USER_LEVEL_TOKEN_NOT_HAVE_HOST_ZAK_OBF | OBF/ZAK token invalid or missing | Verify token is not expired or malformed |

### 4012 Error Response

```json
{
  "meetingStatus": 3,
  "errorCode": 4012,
  "errorMessage": "Anonymous joins are not allowed for this SDK app. Authenticate the Zoom user and provide a ZAK or OBF token."
}
```

**Solutions for 4012:**
1. Generate OBF token via Zoom API
2. Or get user's ZAK token via `/users/me/zak`
3. Pass token in `obfToken` or `zak` join parameter

### 4013 Error Response

```json
{
  "meetingStatus": 3,
  "errorCode": 4013,
  "errorMessage": "The OBF or ZAK token is not provided or invalid. Make sure it's not expired or malformed."
}
```

**Solutions for 4013:**
1. Check token expiration (OBF tokens expire)
2. Verify token format is correct
3. Regenerate token if expired

## System Errors (6000+)

| Code | Name | Description | Solution |
|------|------|-------------|----------|
| `6603` | BLOCKED_BY_HOST_ADMIN | SDK Key blocked by host's admin | Contact host's admin to whitelist |

## SDK Version Errors (10000+)

| Code | Name | Description | Solution |
|------|------|-------------|----------|
| `10000` | SDK_VERSION_UNSUPPORTED | SDK version no longer supported | Upgrade to latest SDK version |

## Simulive Errors (13000+)

| Code | Name | Description | Solution |
|------|------|-------------|----------|
| `13208` | UNABLE_JOIN_ENDED_SIMULIVE | Simulive webinar has ended | Cannot join ended simulive |

## Error Handling Patterns

### Client View

```javascript
ZoomMtg.join({
  // ... options
  success: (res) => {
    console.log('Joined successfully');
  },
  error: (err) => {
    console.error('Join failed:', err);
    
    switch (err.errorCode) {
      case 3004:
        alert('Incorrect meeting password');
        break;
      case 3712:
        console.error('Signature invalid - check SDK secret');
        break;
      case 4012:
        console.error('OBF token required for external meetings');
        break;
      default:
        console.error(`Error ${err.errorCode}: ${err.errorMessage}`);
    }
  }
});
```

### Component View

```javascript
try {
  await client.join({
    // ... options
  });
} catch (error) {
  console.error('Join failed:', error);
  
  // error.reason contains error code
  // error.message contains description
  
  if (error.reason === 'WRONG_MEETING_PASSWORD') {
    alert('Incorrect password');
  }
}
```

### Listen for Connection Changes

```javascript
// Client View
ZoomMtg.inMeetingServiceListener('onMeetingStatus', (data) => {
  // status: 1=connecting, 2=connected, 3=disconnected, 4=reconnecting
  if (data.status === 3) {
    console.error('Disconnected:', data.errorCode);
  }
});

// Component View
client.on('connection-change', (payload) => {
  if (payload.state === 'Closed') {
    console.error('Connection closed:', payload.reason);
  }
});
```

## Common Error Scenarios

### "Signature is invalid" (3712)

**Causes:**
1. SDK Secret doesn't match SDK Key
2. Signature generated with wrong algorithm (must be HS256)
3. Clock skew between server and Zoom
4. Missing or incorrect `appKey` field in signature

**Debug Steps:**
1. Verify SDK Key and Secret in Marketplace
2. Check signature generation code
3. Ensure server time is accurate (NTP sync)
4. Test with official [auth-endpoint-sample](https://github.com/zoom/meetingsdk-auth-endpoint-sample)

### "Meeting does not exist" (3001/3610)

**Causes:**
1. Typo in meeting number
2. Meeting was deleted
3. Meeting ID vs Meeting Number confusion

**Note:** Meeting ID (from API) and Meeting Number (shown in client) are the same.

### "Anonymous join not allowed" (4012)

**Causes:**
1. Joining meeting outside your account without authorization
2. No OBF or ZAK token provided

**Solutions:**
1. For bots: Use App Privilege Token (OBF)
2. For users: Get their ZAK token
3. For same-account meetings: No token needed

### "Cross-account join blocked" (4011)

**Cause:** Your app isn't published on Marketplace and is trying to join meetings outside your account.

**Solutions:**
1. Publish your app on Zoom Marketplace
2. Or only join meetings within your account
3. Or use OBF token for authorization

## OBF Token Timeline

| Date | Enforcement |
|------|-------------|
| **February 7, 2026** | If OBF provided, must be valid (not expired/malformed) |
| **March 2, 2026** | Cannot join external meetings without valid OBF/ZAK |

## Additional Resources

- [OBF FAQ](https://developers.zoom.us/docs/meeting-sdk/obf-faq/)
- [Signature Generation](https://developers.zoom.us/docs/meeting-sdk/auth/)
- [ZAK Token API](https://developers.zoom.us/docs/api/users/#tag/users/get/users/me/zak)
