# Get Started with Zoom Cobrowse SDK Complete setup guide from credentials to your first cobrowse session. ## Overview In a cobrowse session, there are **two roles**: - **Customer** (role_type=1) – Integrates the SDK into their website - **Agent** (role_type=2) – Uses an embedded iframe to interact with the customer This guide shows you how to set up a **customer-initiated session** (the most common pattern). ## Step 1: Get SDK Credentials ### Requirements 1. **Zoom Workplace Account** with SDK Universal Credit - See [Build platform - create or update account](https://developers.zoom.us/docs/build/account/) for details 2. **Video SDK App** in Zoom Marketplace - Cobrowse SDK is a **feature of Video SDK** (not a separate product) ### Get Your Credentials 1. Access your SDK account web portal: - In your Zoom Workplace account, go to **Advanced** > **Zoom CPaaS** > **Manage** 2. Click **Build App** 3. Locate your **SDK credentials** in the Cobrowse tab You'll receive **4 credentials**: | Credential | Type | Purpose | |------------|------|---------| | **SDK Key** | Public | Used in CDN URL and JWT `app_key` claim | | **SDK Secret** | Private | Used to sign JWTs (server-side only) | | **API Key** | Private | REST API authentication (optional) | | **API Secret** | Private | REST API authentication (optional) | **Save these credentials securely** - you'll need them in the next step. ## Step 2: Generate JWT Tokens Both customers and agents require JSON Web Tokens (JWTs) for authentication. ### JWT Structure All JWTs have the same header: ```json { "alg": "HS256", "typ": "JWT" } ``` The payload differs by role: **Customer JWT payload** (role_type=1): ```json { "user_id": "user1_customer", "app_key": "YOUR_SDK_KEY", "role_type": 1, "user_name": "customer", "exp": 1723103759, "iat": 1723102859 } ``` **Agent JWT payload** (role_type=2): ```json { "user_id": "user2_agent", "app_key": "YOUR_SDK_KEY", "role_type": 2, "user_name": "agent", "exp": 1723103759, "iat": 1723102859 } ``` ### JWT Payload Fields | Field | Required | Description | |-------|----------|-------------| | `app_key` | Yes | Your Zoom SDK Key (not API Key) | | `role_type` | Yes | User role: `1` = customer, `2` = agent | | `iat` | Yes | Token issue timestamp (epoch) | | `exp` | Yes | Token expiration timestamp (epoch). Min: 30 minutes, Max: 48 hours | | `user_id` | Yes | Uniquely identifiable user ID | | `user_name` | Yes | User name (max 80 characters) | | `enable_byop` | Optional | Enable Bring Your Own PIN: `1` = yes, `0` or omit = no | ### Sign the JWT Sign the JWT with your SDK Secret (not API Secret): ```javascript HMACSHA256( base64UrlEncode(header) + '.' + base64UrlEncode(payload), ZOOM_SDK_SECRET ); ``` ### Set Up a Token Server **CRITICAL**: JWT signing must happen **server-side** to protect your SDK Secret. Use the official auth endpoint sample: ```bash # Clone the sample git clone https://github.com/zoom/cobrowsesdk-auth-endpoint-sample.git cd cobrowsesdk-auth-endpoint-sample # Install dependencies npm install # Create .env file cat > .env << EOF ZOOM_SDK_KEY=your_sdk_key_here ZOOM_SDK_SECRET=your_sdk_secret_here PORT=4000 EOF # Start the server npm start ``` The server will run on the base URL you configure for your token service. **Token Request:** ```javascript // POST https://YOUR_TOKEN_SERVICE_BASE_URL { "role": 1, // 1 = customer, 2 = agent "userId": "user123", "userName": "John Doe" } // Response { "token": "eyJhbGciOiJIUzI1NiIs..." } ``` **See also**: [JWT Authentication Concept](concepts/jwt-authentication.md) ## Step 3: Integrate the Customer SDK The customer integrates the Cobrowse SDK into their website using the **CDN**. > **Critical PIN Rule** > > The PIN agents should use comes from customer SDK event `pincode_updated`. > Do not show or rely on provisional PIN values from backend/session placeholders. > In UI, display one explicit value (for example, **Support PIN**) and pass only that to agent flow. ### Load the SDK Include the SDK snippet in the `` tag of your HTML page: ```html ``` ### SDK Version Set the SDK VERSION using semantic versioning: - **Fixed version**: `js/2.13.2` - Use exact version 2.13.2 - **Latest patch**: `js/2.13.x` - Use latest `>=2.13.0 and <2.14.0` **Current version**: 2.13.2 (as of February 2026) ### Initialize the SDK ```javascript const settings = { allowCustomerAnnotation: true, piiMask: { maskType: 'all_input' }, }; ZoomCobrowseSDK.init(settings, function ({ success, session, error }) { if (success) { console.log("SDK initialized successfully"); // session object is now available } else { console.error("SDK init failed:", error); } }); ``` ### Start a Session ```javascript // Fetch JWT from your server const response = await fetch('https://YOUR_TOKEN_SERVICE_BASE_URL', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ role: 1, userId: 'customer_' + Date.now(), userName: 'Customer' }) }); const { token } = await response.json(); // Start cobrowse session session.start({ sdkToken: token }); ``` ### Complete Customer Example ```html Customer - Cobrowse Support

Need Help?

``` ## Step 4: Use Zoom-Hosted Agent Portal Agents connect to cobrowse sessions by embedding an iframe. ### Agent Portal Iframe ```html Agent Portal

Agent Support Portal

``` ### Iframe Permissions The `allow` attribute must include these permissions: - `autoplay *` - Auto-play media - `camera *` - Camera access - `microphone *` - Microphone access - `display-capture *` - Screen capture - `geolocation *` - Location services ## Step 5: Test the Cobrowse SDK ### Testing Steps 1. **Open two browsers** (or use incognito + normal mode): - Browser A: Customer page - Browser B: Agent page 2. **Customer browser**: - Open customer page - Click "Start Support Session" button - Note the 6-digit PIN displayed 3. **Agent browser**: - Open agent page - Enter the PIN code in the iframe 4. **Verify connection**: - Agent should now see the customer's browser - Both sides should show "Connected" status 5. **Test features**: - **Annotations**: Agent can draw on the screen - **Data masking**: Masked fields show asterisks for agent - **Remote assist**: Agent can scroll the page (if enabled) 6. **End session**: - Either side can click "End Session" to terminate ### Troubleshooting Test Issues | Issue | Solution | |-------|----------| | SDK doesn't load | Verify SDK Key is correct in CDN URL | | PIN not showing | Check browser console for errors | | Agent can't connect | Verify PIN is correct and session is still active | | Connection fails | Check HTTPS is being used (or a loopback host for development) | ## Step 6: Add Features Now that you have a working cobrowse session, add features: ### Annotation Tools Enable drawing tools for customer and/or agent: ```javascript const settings = { allowAgentAnnotation: true, // Agent can draw allowCustomerAnnotation: true // Customer can draw }; ``` **See**: [Annotation Tools Example](examples/annotations.md) ### Data Masking Hide sensitive fields from agents: ```javascript const settings = { piiMask: { maskType: 'custom_input', maskCssSelectors: '.sensitive-field, #ssn, #credit-card', maskHTMLAttributes: 'data-sensitive=true' } }; ``` **See**: [Privacy Masking Example](examples/privacy-masking.md) ### Remote Assist Allow agent to scroll the customer's page: ```javascript const settings = { remoteAssist: { enable: true, enableCustomerConsent: true, // Customer must approve remoteAssistTypes: ['scroll_page'] } }; ``` **See**: [Remote Assist Example](examples/remote-assist.md) ### Bring Your Own PIN (BYOP) Use custom PIN codes instead of auto-generated ones: 1. Enable BYOP in JWT payload: ```json { "enable_byop": 1, ... } ``` 2. Provide custom PIN when starting session: ```javascript session.start({ customPinCode: 'MYPIN123', sdkToken: token }); ``` **See**: [BYOP Custom PIN Example](examples/byop-custom-pin.md) ## Next Steps - **Learn core concepts**: [Session Lifecycle](concepts/session-lifecycle.md) - **Explore features**: [Complete documentation index](SKILL.md) - **Handle errors**: [Error Codes Reference](troubleshooting/error-codes.md) - **Production checklist**: [CORS and CSP Configuration](troubleshooting/cors-csp.md) ## PIN Code Access - Bring Your Own PIN (BYOP) The Cobrowse SDK supports connecting agents and customers using a PIN code. In the simple example above, Zoom automatically generates a 6-digit PIN code displayed to the customer. **Auto-generated PIN flow:** 1. Customer clicks "Start Support Session" 2. Zoom generates 6-digit PIN 3. Customer shares PIN with agent 4. Agent enters PIN to connect **Custom PIN flow (BYOP):** 1. Your app generates custom PIN code (1-10 characters, letters/numbers) 2. Pass PIN when starting session: `session.start({ customPinCode: 'MYPIN', sdkToken })` 3. Agent enters your custom PIN to connect **BYOP enables**: - Integration with existing support ticket systems - Use of case/ticket IDs as PINs - npm integration for custom agent UI **See**: [Bring Your Own PIN (BYOP)](examples/byop-custom-pin.md) for complete guide. ## Resources - **Official Docs**: https://developers.zoom.us/docs/cobrowse-sdk/ - **API Reference**: https://marketplacefront.zoom.us/sdk/cobrowse/ - **Quickstart Repo**: https://github.com/zoom/CobrowseSDK-Quickstart - **Auth Endpoint Sample**: https://github.com/zoom/cobrowsesdk-auth-endpoint-sample - **Dev Forum**: https://devforum.zoom.us/ ## Common Questions **Q: Can I use HTTP instead of HTTPS?** A: Only for loopback/local development. Production must use HTTPS. **Q: What's the difference between SDK Key and API Key?** A: SDK Key is used in the CDN URL and JWT `app_key` claim. API Key is for optional REST API calls. **Q: Can multiple agents join the same session?** A: Yes, up to 5 agents can join a single customer session. **Q: Does the customer need to install anything?** A: No, it's pure JavaScript delivered via CDN. No plugins or extensions needed. **Q: What happens if the customer refreshes the page?** A: The session will attempt to automatically reconnect within a 2-minute window. **Q: Can I customize the agent portal UI?** A: Not with the iframe approach. For custom UI, use npm integration with BYOP mode.