[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-anthropic-zoom-oauth":3,"mdc-tec6g8-key":37,"related-repo-anthropic-zoom-oauth":7478,"related-org-anthropic-zoom-oauth":7597},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":32,"sourceUrl":35,"mdContent":36},"zoom-oauth","implement Zoom OAuth authentication","Reference skill for Zoom authentication. Use after routing to an auth workflow when choosing app credentials, grant types, scopes, token refresh behavior, or debugging Zoom OAuth failures.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"anthropic","Anthropic","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fanthropic.png","anthropics",[13,17,20,23],{"name":14,"slug":15,"type":16},"Authentication","authentication","tag",{"name":18,"slug":19,"type":16},"API Development","api-development",{"name":21,"slug":22,"type":16},"Zoom","zoom",{"name":24,"slug":25,"type":16},"OAuth","oauth",22885,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins","2026-04-10T04:56:21.322298",null,2736,[],{"repoUrl":27,"stars":26,"forks":30,"topics":33,"description":34},[],"Open source repository of plugins primarily intended for knowledge workers to use in Claude Cowork","https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fknowledge-work-plugins\u002Ftree\u002FHEAD\u002Fpartner-built\u002Fzoom-plugin\u002Fskills\u002Foauth","---\nname: zoom-oauth\ndescription: Reference skill for Zoom authentication. Use after routing to an auth workflow when choosing app credentials, grant types, scopes, token refresh behavior, or debugging Zoom OAuth failures.\nuser-invocable: false\ntriggers:\n  - zoom oauth\n  - zoom authentication\n  - zoom authorization\n  - server to server oauth\n  - s2s oauth\n  - zoom access token\n  - zoom refresh token\n  - authorization code flow\n  - device authorization\n  - pkce\n  - zoom api authentication\n  - oauth error 4709\n  - oauth error 4733\n  - oauth error 4735\n  - redirect uri mismatch\n---\n\n# Zoom OAuth\n\nBackground reference for Zoom auth and token lifecycle behavior. Prefer `setup-zoom-oauth` first, then use this skill for the exact flow, scope, and error details.\n\n# Zoom OAuth\n\nAuthentication and authorization for Zoom APIs.\n\n## 📖 Complete Documentation\n\nFor comprehensive guides, production patterns, and troubleshooting, see **Integrated Index section below**.\n\nQuick navigation:\n- **[5-Minute Runbook](RUNBOOK.md)** - Preflight checks before deep debugging\n- **[OAuth Flows](concepts\u002Foauth-flows.md)** - Which flow to use and how each works\n- **[Token Lifecycle](concepts\u002Ftoken-lifecycle.md)** - Expiration, refresh, and revocation\n- **[Production Examples](examples\u002Fs2s-oauth-redis.md)** - Redis caching, MySQL storage, auto-refresh\n- **[Troubleshooting](troubleshooting\u002Fcommon-errors.md)** - Error codes 4700-4741\n\n## Prerequisites\n\n- Zoom app created in [Marketplace](https:\u002F\u002Fmarketplace.zoom.us\u002F)\n- Client ID and Client Secret\n- For S2S OAuth: Account ID\n\n## Four Authorization Use Cases\n\n| Use Case | App Type | Grant Type | Industry Name |\n|----------|----------|------------|---------------|\n| **Account Authorization** | Server-to-Server | `account_credentials` | Client Credentials Grant, M2M, Two-legged OAuth |\n| **User Authorization** | General | `authorization_code` | Authorization Code Grant, Three-legged OAuth |\n| **Device Authorization** | General | `urn:ietf:params:oauth:grant-type:device_code` | Device Authorization Grant (RFC 8628) |\n| **Client Authorization** | General | `client_credentials` | Client Credentials Grant (chatbot-scoped) |\n\n### Industry Terminology\n\n| Term | Meaning |\n|------|---------|\n| **Two-legged OAuth** | No user involved (client ↔ server) |\n| **Three-legged OAuth** | User involved (user ↔ client ↔ server) |\n| **M2M** | Machine-to-Machine (backend services) |\n| **Public client** | Can't keep secrets (mobile, SPA) → use PKCE |\n| **Confidential client** | Can keep secrets (backend servers) |\n| **PKCE** | Proof Key for Code Exchange (RFC 7636), pronounced \"pixy\" |\n\n### Which Flow Should I Use?\n\n```\n                              ┌─────────────────────┐\n                              │  What are you       │\n                              │  building?          │\n                              └──────────┬──────────┘\n                                         │\n                    ┌────────────────────┼────────────────────┐\n                    │                    │                    │\n                    ▼                    ▼                    ▼\n          ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐\n          │  Backend        │  │  App for other  │  │  Chatbot only   │\n          │  automation     │  │  users\u002Faccounts │  │  (Team Chat)    │\n          │  (your account) │  │                 │  │                 │\n          └────────┬────────┘  └────────┬────────┘  └────────┬────────┘\n                   │                    │                    │\n                   ▼                    │                    ▼\n          ┌─────────────────┐           │           ┌─────────────────┐\n          │    ACCOUNT      │           │           │     CLIENT      │\n          │   (S2S OAuth)   │           │           │   (Chatbot)     │\n          └─────────────────┘           │           └─────────────────┘\n                                        │\n                                        ▼\n                              ┌─────────────────────┐\n                              │  Does device have   │\n                              │  a browser?         │\n                              └──────────┬──────────┘\n                                         │\n                         ┌───────────────┴───────────────┐\n                         │ NO                         YES│\n                         ▼                               ▼\n          ┌─────────────────────────┐         ┌─────────────────┐\n          │        DEVICE           │         │      USER       │\n          │     (Device Flow)       │         │  (Auth Code)    │\n          │                         │         │                 │\n          │ Examples:               │         │ + PKCE if       │\n          │ • Smart TV              │         │   public client │\n          │ • Meeting SDK device    │         │                 │\n          └─────────────────────────┘         └─────────────────┘\n```\n\n---\n\n## Account Authorization (Server-to-Server OAuth)\n\nFor backend automation without user interaction.\n\n### Request Access Token\n\n```bash\nPOST https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=account_credentials&account_id={ACCOUNT_ID}\n\nHeaders:\nAuthorization: Basic {Base64(ClientID:ClientSecret)}\n```\n\n### Response\n\n```json\n{\n  \"access_token\": \"eyJ...\",\n  \"token_type\": \"bearer\",\n  \"expires_in\": 3600,\n  \"scope\": \"user:read:user:admin\",\n  \"api_url\": \"https:\u002F\u002Fapi.zoom.us\"\n}\n```\n\n### Refresh\n\nAccess tokens expire after **1 hour**. No separate refresh flow - just request a new token.\n\n---\n\n## User Authorization (Authorization Code Flow)\n\nFor apps that act on behalf of users.\n\n### Step 1: Redirect User to Authorize\n\n```\nhttps:\u002F\u002Fzoom.us\u002Foauth\u002Fauthorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}\n```\n\nUse `https:\u002F\u002Fzoom.us\u002Foauth\u002Fauthorize` for consent, but `https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken` for token exchange.\n\n**Optional Parameters:**\n\n| Parameter | Description |\n|-----------|-------------|\n| `state` | CSRF protection, maintains state through flow |\n| `code_challenge` | For PKCE (see below) |\n| `code_challenge_method` | `S256` or `plain` (default: plain) |\n\n### Step 2: User Authorizes\n\n- User signs in and grants permission\n- Redirects to `redirect_uri` with authorization code:\n  ```\n  https:\u002F\u002Fexample.com\u002F?code={AUTHORIZATION_CODE}\n  ```\n\n### Step 3: Exchange Code for Token\n\n```bash\nPOST https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=authorization_code&code={CODE}&redirect_uri={REDIRECT_URI}\n\nHeaders:\nAuthorization: Basic {Base64(ClientID:ClientSecret)}\n```\n\n**With PKCE:** Add `code_verifier` parameter.\n\n### Response\n\n```json\n{\n  \"access_token\": \"eyJ...\",\n  \"token_type\": \"bearer\",\n  \"refresh_token\": \"eyJ...\",\n  \"expires_in\": 3600,\n  \"scope\": \"user:read:user\",\n  \"api_url\": \"https:\u002F\u002Fapi.zoom.us\"\n}\n```\n\n### Refresh Token\n\n```bash\nPOST https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=refresh_token&refresh_token={REFRESH_TOKEN}\n\nHeaders:\nAuthorization: Basic {Base64(ClientID:ClientSecret)}\n```\n\n- Access tokens expire after **1 hour**\n- Refresh token lifetime can vary; ~90 days is common for some user-based flows. Treat it as configuration\u002Fbehavior that can change and rely on runtime errors + re-auth fallback.\n- Always use the latest refresh token for the next request\n- If refresh token expires, redirect user to authorization URL to restart flow\n\n### User-Level vs Account-Level Apps\n\n| Type | Who Can Authorize | Scope Access |\n|------|-------------------|--------------|\n| **User-level** | Any individual user | Scoped to themselves |\n| **Account-level** | User with admin permissions | Account-wide access (admin scopes) |\n\n---\n\n## Device Authorization (Device Flow)\n\nFor devices without browsers (e.g., Meeting SDK apps).\n\n### Prerequisites\n\nEnable \"Use App on Device\" in: Features > Embed > Enable Meeting SDK\n\n### Step 1: Request Device Code\n\n```bash\nPOST https:\u002F\u002Fzoom.us\u002Foauth\u002Fdevicecode?client_id={CLIENT_ID}\n\nHeaders:\nAuthorization: Basic {Base64(ClientID:ClientSecret)}\n```\n\n### Response\n\n```json\n{\n  \"device_code\": \"DEVICE_CODE\",\n  \"user_code\": \"abcd1234\",\n  \"verification_uri\": \"https:\u002F\u002Fzoom.us\u002Foauth_device\",\n  \"verification_uri_complete\": \"https:\u002F\u002Fzoom.us\u002Foauth\u002Fdevice\u002Fcomplete\u002F{CODE}\",\n  \"expires_in\": 900,\n  \"interval\": 5\n}\n```\n\n### Step 2: User Authorization\n\nDirect user to:\n- `verification_uri` and display `user_code` for manual entry, OR\n- `verification_uri_complete` (user code prefilled)\n\nUser signs in and allows the app.\n\n### Step 3: Poll for Token\n\nPoll at the `interval` (5 seconds) until user authorizes:\n\n```bash\nPOST https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code={DEVICE_CODE}\n\nHeaders:\nAuthorization: Basic {Base64(ClientID:ClientSecret)}\n```\n\n### Response\n\n```json\n{\n  \"access_token\": \"eyJ...\",\n  \"token_type\": \"bearer\",\n  \"refresh_token\": \"eyJ...\",\n  \"expires_in\": 3599,\n  \"scope\": \"user:read:user user:read:token\",\n  \"api_url\": \"https:\u002F\u002Fapi.zoom.us\"\n}\n```\n\n### Polling Responses\n\n| Response | Meaning | Action |\n|----------|---------|--------|\n| Token returned | User authorized | Store tokens, done |\n| `error: authorization_pending` | User hasn't authorized yet | Keep polling at interval |\n| `error: slow_down` | Polling too fast | Increase interval by 5 seconds |\n| `error: expired_token` | Device code expired (15 min) | Restart flow from Step 1 |\n| `error: access_denied` | User denied authorization | Handle denial, don't retry |\n\n### Polling Implementation\n\n```javascript\nasync function pollForToken(deviceCode, interval) {\n  while (true) {\n    await sleep(interval * 1000);\n    \n    try {\n      const response = await axios.post(\n        `https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code=${deviceCode}`,\n        null,\n        { headers: { 'Authorization': `Basic ${credentials}` } }\n      );\n      return response.data; \u002F\u002F Success - got tokens\n    } catch (error) {\n      const err = error.response?.data?.error;\n      if (err === 'authorization_pending') continue;\n      if (err === 'slow_down') { interval += 5; continue; }\n      throw error; \u002F\u002F expired_token or access_denied\n    }\n  }\n}\n```\n\n### Refresh\n\nSame as User Authorization. If refresh token expires, restart device flow from Step 1.\n\n---\n\n## Client Authorization (Chatbot)\n\nFor chatbot message operations only.\n\n### Request Token\n\n```bash\nPOST https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=client_credentials\n\nHeaders:\nAuthorization: Basic {Base64(ClientID:ClientSecret)}\n```\n\n### Response\n\n```json\n{\n  \"access_token\": \"eyJ...\",\n  \"token_type\": \"bearer\",\n  \"expires_in\": 3600,\n  \"scope\": \"imchat:bot\",\n  \"api_url\": \"https:\u002F\u002Fapi.zoom.us\"\n}\n```\n\n### Refresh\n\nTokens expire after **1 hour**. No refresh flow - just request a new token.\n\n---\n\n## Using Access Tokens\n\n### Call API\n\n```bash\nGET https:\u002F\u002Fapi.zoom.us\u002Fv2\u002Fusers\u002Fme\n\nHeaders:\nAuthorization: Bearer {ACCESS_TOKEN}\n```\n\n### Me Context\n\nReplace `userID` with `me` to target the token's associated user:\n\n| Endpoint | Methods |\n|----------|---------|\n| `\u002Fv2\u002Fusers\u002Fme` | GET, PATCH |\n| `\u002Fv2\u002Fusers\u002Fme\u002Ftoken` | GET |\n| `\u002Fv2\u002Fusers\u002Fme\u002Fmeetings` | GET, POST |\n\n---\n\n## Revoke Access Token\n\nWorks for all authorization types.\n\n```bash\nPOST https:\u002F\u002Fzoom.us\u002Foauth\u002Frevoke?token={ACCESS_TOKEN}\n\nHeaders:\nAuthorization: Basic {Base64(ClientID:ClientSecret)}\n```\n\n### Response\n\n```json\n{\n  \"status\": \"success\"\n}\n```\n\n---\n\n## PKCE (Proof Key for Code Exchange)\n\nFor public clients that can't securely store secrets (mobile apps, SPAs, desktop apps).\n\n### When to Use PKCE\n\n| Client Type | Use PKCE? | Why |\n|-------------|-----------|-----|\n| Mobile app | **Yes** | Can't securely store client secret |\n| Single Page App (SPA) | **Yes** | JavaScript is visible to users |\n| Desktop app | **Yes** | Binary can be decompiled |\n| Meeting SDK (client-side) | **Yes** | Runs on user's device |\n| Backend server | Optional | Can keep secrets, but PKCE adds security |\n\n### How PKCE Works\n\n```\n┌──────────┐                              ┌──────────┐                    ┌──────────┐\n│  Client  │                              │   Zoom   │                    │   Zoom   │\n│   App    │                              │  Auth    │                    │  Token   │\n└────┬─────┘                              └────┬─────┘                    └────┬─────┘\n     │                                         │                              │\n     │ 1. Generate code_verifier (random)      │                              │\n     │ 2. Create code_challenge = SHA256(verifier)                            │\n     │                                         │                              │\n     │ ─────── \u002Fauthorize + code_challenge ──► │                              │\n     │                                         │                              │\n     │ ◄────── authorization_code ──────────── │                              │\n     │                                         │                              │\n     │ ─────────────── \u002Ftoken + code_verifier ─┼────────────────────────────► │\n     │                                         │                              │\n     │                                         │     Verify: SHA256(verifier) │\n     │                                         │            == challenge      │\n     │                                         │                              │\n     │ ◄───────────────────────────────────────┼─────── access_token ──────── │\n     │                                         │                              │\n```\n\n### Implementation (Node.js)\n\n```javascript\nconst crypto = require('crypto');\n\nfunction generatePKCE() {\n  const verifier = crypto.randomBytes(32).toString('base64url');\n  const challenge = crypto.createHash('sha256').update(verifier).digest('base64url');\n  return { verifier, challenge };\n}\n\nconst pkce = generatePKCE();\n\nconst authUrl = `https:\u002F\u002Fzoom.us\u002Foauth\u002Fauthorize?` +\n  `response_type=code&` +\n  `client_id=${CLIENT_ID}&` +\n  `redirect_uri=${REDIRECT_URI}&` +\n  `code_challenge=${pkce.challenge}&` +\n  `code_challenge_method=S256`;\n\n\u002F\u002F Store pkce.verifier in session for callback\n```\n\n### Token Exchange with PKCE\n\n```bash\nPOST https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=authorization_code&code={CODE}&redirect_uri={REDIRECT_URI}&code_verifier={VERIFIER}\n\nHeaders:\nAuthorization: Basic {Base64(ClientID:ClientSecret)}\n```\n\n---\n\n## Deauthorization\n\nWhen a user removes your app, Zoom sends a webhook to your Deauthorization Notification Endpoint URL.\n\n### Webhook Event\n\n```json\n{\n  \"event\": \"app_deauthorized\",\n  \"event_ts\": 1740439732278,\n  \"payload\": {\n    \"account_id\": \"ACCOUNT_ID\",\n    \"user_id\": \"USER_ID\",\n    \"signature\": \"SIGNATURE\",\n    \"deauthorization_time\": \"2019-06-17T13:52:28.632Z\",\n    \"client_id\": \"CLIENT_ID\"\n  }\n}\n```\n\n### Requirements\n\n- **Delete all associated user data** after receiving this event\n- **Verify webhook signature** (use secret token, verification token deprecated Oct 2023)\n- Only public apps receive deauthorization webhooks (not private\u002Fdev apps)\n\n---\n\n## Pre-Approval Flow\n\nSome Zoom accounts require Marketplace admin pre-approval before users can authorize apps.\n\n- Users can request pre-approval from their admin\n- Account-level apps (admin scopes) require appropriate role permissions\n\n---\n\n## Active Apps Notifier (AAN)\n\nIn-meeting feature showing apps with real-time access to content.\n\n- Displays icon + tooltip with app info, content type being accessed, approving account\n- Supported: Zoom client 5.6.7+, Meeting SDK 5.9.0+\n\n---\n\n## OAuth Scopes\n\n### Scope Types\n\n| Type | Description | For |\n|------|-------------|-----|\n| **Classic scopes** | Legacy scopes (user, admin, master levels) | Existing apps |\n| **Granular scopes** | New fine-grained scopes with optional support | New apps |\n\n### Classic Scopes\n\nFor previously-created apps. Three levels:\n- **User-level**: Access to individual user's data\n- **Admin-level**: Account-wide access, requires admin role\n- **Master-level**: For master-sub account setups, requires account owner\n\nFull list: https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Fintegrations\u002Foauth-scopes\u002F\n\n### Granular Scopes\n\nFor new apps. Format: `\u003Cservice>:\u003Caction>:\u003Cdata_claim>:\u003Caccess>`\n\n| Component | Values |\n|-----------|--------|\n| **service** | `meeting`, `webinar`, `user`, `recording`, etc. |\n| **action** | `read`, `write`, `update`, `delete` |\n| **data_claim** | Data category (e.g., `participants`, `settings`) |\n| **access** | empty (user), `admin`, `master` |\n\nExample: `meeting:read:list_meetings:admin`\n\nFull list: https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Fintegrations\u002Foauth-scopes-granular\u002F\n\n### Optional Scopes\n\nGranular scopes can be marked as **optional** - users choose whether to grant them.\n\n**Basic authorization** (uses build flow defaults):\n```\nhttps:\u002F\u002Fzoom.us\u002Foauth\u002Fauthorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}\n```\n\n**Advanced authorization** (custom scopes per request):\n```\nhttps:\u002F\u002Fzoom.us\u002Foauth\u002Fauthorize?client_id={CLIENT_ID}&response_type=code&redirect_uri={REDIRECT_URI}&scope={required_scopes}&optional_scope={optional_scopes}\n```\n\n**Include previously granted scopes:**\n```\nhttps:\u002F\u002Fzoom.us\u002Foauth\u002Fauthorize?...&include_granted_scopes&scope={additional_scopes}\n```\n\n### Migrating Classic to Granular\n\n1. Manage > select app > edit\n2. Scope page > Development tab > click **Migrate**\n3. Review auto-assigned granular scopes, remove unnecessary, mark optional\n4. Test\n5. Production tab > click **Migrate**\n\n**Notes:**\n- No review needed if only migrating or reducing scopes\n- Existing user tokens continue with classic scope values until re-authorization\n- New users get granular scopes after migration\n\n---\n\n## Common Error Codes\n\n| Code | Message | Solution |\n|------|---------|----------|\n| 4700 | Token cannot be empty | Check Authorization header has valid token |\n| 4702\u002F4704 | Invalid client | Verify Client ID and Client Secret |\n| 4705 | Grant type not supported | Use: `account_credentials`, `authorization_code`, `urn:ietf:params:oauth:grant-type:device_code`, or `client_credentials` |\n| 4706 | Client ID or secret missing | Add credentials to header or request params |\n| 4709 | Redirect URI mismatch | Ensure redirect_uri matches app configuration exactly (including trailing slash) |\n| 4711 | Refresh token invalid | Token scopes don't match client scopes |\n| 4717 | App has been disabled | Contact Zoom support |\n| 4733 | Code is expired | Authorization codes expire in 5 minutes - restart flow |\n| 4734 | Invalid authorization code | Regenerate authorization code |\n| 4735 | Owner of token does not exist | User was removed from account - re-authorize |\n| 4741 | Token has been revoked | Use the most recent token from latest authorization |\n\nSee `references\u002Foauth-errors.md` for complete error list.\n\n---\n\n## Quick Reference\n\n| Flow | Grant Type | Token Expiry | Refresh |\n|------|------------|--------------|---------|\n| Account (S2S) | `account_credentials` | 1 hour | Request new token |\n| User | `authorization_code` | 1 hour | Use refresh_token (90 day expiry) |\n| Device | `urn:ietf:params:oauth:grant-type:device_code` | 1 hour | Use refresh_token (90 day expiry) |\n| Client (Chatbot) | `client_credentials` | 1 hour | Request new token |\n\n---\n\n## Demo Guidance\n\nIf you build an OAuth demo app, document its runtime base URL in that demo project's own\nREADME or `.env.example`, not in this shared skill.\n\n## Resources\n\n- **OAuth docs**: https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Fintegrations\u002Foauth\u002F\n- **S2S OAuth docs**: https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Finternal-apps\u002Fs2s-oauth\u002F\n- **PKCE blog**: https:\u002F\u002Fdevelopers.zoom.us\u002Fblog\u002Fpcke-oauth-with-postman-rest-api\u002F\n- **Classic scopes**: https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Fintegrations\u002Foauth-scopes\u002F\n- **Granular scopes**: https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Fintegrations\u002Foauth-scopes-granular\u002F\n\n---\n\n## Integrated Index\n\n_This section was migrated from `SKILL.md`._\n\n## Quick Start Path\n\n**If you're new to Zoom OAuth, follow this order:**\n\n1. **Run preflight checks first** → [RUNBOOK.md](RUNBOOK.md)\n\n2. **Choose your OAuth flow** → [concepts\u002Foauth-flows.md](concepts\u002Foauth-flows.md)\n   - 4 flows: S2S (backend), User (SaaS), Device (no browser), Chatbot\n   - Decision matrix: Which flow fits your use case?\n\n3. **Understand token lifecycle** → [concepts\u002Ftoken-lifecycle.md](concepts\u002Ftoken-lifecycle.md)\n   - **CRITICAL**: How tokens expire, refresh, and revoke\n   - Common pitfalls: refresh token rotation\n\n4. **Implement your flow** → Jump to examples:\n   - Backend automation → [examples\u002Fs2s-oauth-redis.md](examples\u002Fs2s-oauth-redis.md)\n   - SaaS app → [examples\u002Fuser-oauth-mysql.md](examples\u002Fuser-oauth-mysql.md)\n   - Mobile\u002FSPA → [examples\u002Fpkce-implementation.md](examples\u002Fpkce-implementation.md)\n   - Device (TV\u002Fkiosk) → [examples\u002Fdevice-flow.md](examples\u002Fdevice-flow.md)\n\n5. **Fix redirect URI issues** → [troubleshooting\u002Fredirect-uri-issues.md](troubleshooting\u002Fredirect-uri-issues.md)\n   - Most common OAuth error: Redirect URI mismatch\n\n6. **Implement token refresh** → [examples\u002Ftoken-refresh.md](examples\u002Ftoken-refresh.md)\n   - Automatic middleware pattern\n   - Handle refresh token rotation\n\n7. **Troubleshoot errors** → [troubleshooting\u002Fcommon-errors.md](troubleshooting\u002Fcommon-errors.md)\n   - Error code tables (4700-4741 range)\n   - Quick diagnostic workflow\n\n---\n\n## Documentation Structure\n\n```\noauth\u002F\n├── SKILL.md                           # Main skill overview\n├── SKILL.md                           # This file - navigation guide\n│\n├── concepts\u002F                          # Core OAuth concepts\n│   ├── oauth-flows.md                # 4 flows: S2S, User, Device, Chatbot\n│   ├── token-lifecycle.md            # Expiration, refresh, revocation\n│   ├── pkce.md                       # PKCE security for public clients\n│   ├── scopes-architecture.md        # Classic vs Granular scopes\n│   └── state-parameter.md            # CSRF protection with state\n│\n├── examples\u002F                          # Complete working code\n│   ├── s2s-oauth-basic.md            # S2S OAuth minimal example\n│   ├── s2s-oauth-redis.md            # S2S OAuth with Redis caching (production)\n│   ├── user-oauth-basic.md           # User OAuth minimal example\n│   ├── user-oauth-mysql.md           # User OAuth with MySQL + encryption (production)\n│   ├── device-flow.md                # Device authorization flow\n│   ├── pkce-implementation.md        # PKCE for SPAs\u002Fmobile apps\n│   └── token-refresh.md              # Auto-refresh middleware pattern\n│\n├── troubleshooting\u002F                   # Problem solving guides\n│   ├── common-errors.md              # Error codes 4700-4741\n│   ├── redirect-uri-issues.md        # Most common OAuth error\n│   ├── token-issues.md               # Expired, revoked, invalid tokens\n│   └── scope-issues.md               # Scope mismatch errors\n│\n└── references\u002F                        # Reference documentation\n    ├── oauth-errors.md                # Complete error code reference\n    ├── classic-scopes.md              # Classic scope reference\n    └── granular-scopes.md             # Granular scope reference\n```\n\n---\n\n## By Use Case\n\n### I want to automate Zoom tasks on my own account\n1. [OAuth Flows](concepts\u002Foauth-flows.md#server-to-server-s2s-oauth) - S2S OAuth explained\n2. [S2S OAuth Redis](examples\u002Fs2s-oauth-redis.md) - Production pattern with Redis caching\n3. [Token Lifecycle](concepts\u002Ftoken-lifecycle.md) - 1hr token, no refresh\n\n### I want to build a SaaS app for other Zoom users\n1. [OAuth Flows](concepts\u002Foauth-flows.md#user-authorization-oauth) - User OAuth explained\n2. [User OAuth MySQL](examples\u002Fuser-oauth-mysql.md) - Production pattern with encryption\n3. [Token Refresh](examples\u002Ftoken-refresh.md) - Automatic refresh middleware\n4. [Redirect URI Issues](troubleshooting\u002Fredirect-uri-issues.md) - Fix most common error\n\n### I want to build a mobile or SPA app\n1. [PKCE](concepts\u002Fpkce.md) - Why PKCE is required for public clients\n2. [PKCE Implementation](examples\u002Fpkce-implementation.md) - Complete code example\n3. [State Parameter](concepts\u002Fstate-parameter.md) - CSRF protection\n\n### I want to build an app for devices without browsers (TV, kiosk)\n1. [OAuth Flows](concepts\u002Foauth-flows.md#device-authorization-flow) - Device flow explained\n2. [Device Flow Example](examples\u002Fdevice-flow.md) - Complete polling implementation\n3. [Common Errors](troubleshooting\u002Fcommon-errors.md) - Device-specific errors\n\n### I'm building a Team Chat bot\n1. [OAuth Flows](concepts\u002Foauth-flows.md#client-authorization-chatbot) - Chatbot flow explained\n2. [S2S OAuth Basic](examples\u002Fs2s-oauth-basic.md) - Similar pattern, different grant type\n3. [Scopes Architecture](concepts\u002Fscopes-architecture.md) - Chatbot-specific scopes\n\n### I'm getting redirect URI errors (4709)\n1. [Redirect URI Issues](troubleshooting\u002Fredirect-uri-issues.md) - **START HERE!**\n2. [Common Errors](troubleshooting\u002Fcommon-errors.md#4709-redirect-uri-mismatch) - Error details\n3. [User OAuth Basic](examples\u002Fuser-oauth-basic.md) - See correct pattern\n\n### I'm getting token errors (4700-4741)\n1. [Token Issues](troubleshooting\u002Ftoken-issues.md) - Diagnostic workflow\n2. [Token Lifecycle](concepts\u002Ftoken-lifecycle.md) - Understand expiration\n3. [Token Refresh](examples\u002Ftoken-refresh.md) - Implement auto-refresh\n4. [Common Errors](troubleshooting\u002Fcommon-errors.md) - Error code tables\n\n### I'm getting scope errors (4711)\n1. [Scope Issues](troubleshooting\u002Fscope-issues.md) - Mismatch causes\n2. [Scopes Architecture](concepts\u002Fscopes-architecture.md) - Classic vs Granular\n3. [Classic Scopes](references\u002Fclassic-scopes.md) - Complete scope reference\n4. [Granular Scopes](references\u002Fgranular-scopes.md) - Granular scope reference\n\n### I need to refresh tokens\n1. [Token Lifecycle](concepts\u002Ftoken-lifecycle.md#refresh-strategy) - When to refresh\n2. [Token Refresh](examples\u002Ftoken-refresh.md) - Middleware pattern\n3. [Token Issues](troubleshooting\u002Ftoken-issues.md#refresh-token-problems) - Common mistakes\n\n### I want to understand the difference between Classic and Granular scopes\n1. [Scopes Architecture](concepts\u002Fscopes-architecture.md) - **Complete comparison**\n2. [Classic Scopes](references\u002Fclassic-scopes.md) - `resource:level` format\n3. [Granular Scopes](references\u002Fgranular-scopes.md) - `service:action:data_claim:access` format\n\n### I need to secure my OAuth implementation\n1. [PKCE](concepts\u002Fpkce.md) - Public client security\n2. [State Parameter](concepts\u002Fstate-parameter.md) - CSRF protection\n3. [User OAuth MySQL](examples\u002Fuser-oauth-mysql.md#token-encryption) - Token encryption at rest\n\n### I want to migrate from JWT app to S2S OAuth\n1. [S2S OAuth Redis](examples\u002Fs2s-oauth-redis.md) - Modern replacement\n2. [Token Lifecycle](concepts\u002Ftoken-lifecycle.md) - Different token behavior\n\n> **Note**: JWT App Type was deprecated in June 2023. Migrate to S2S OAuth for server-to-server automation.\n\n---\n\n## Most Critical Documents\n\n### 1. OAuth Flows (DECISION DOCUMENT)\n**[concepts\u002Foauth-flows.md](concepts\u002Foauth-flows.md)**\n\nUnderstand which of the 4 flows to use:\n- **S2S OAuth**: Backend automation (your account)\n- **User OAuth**: SaaS apps (users authorize you)\n- **Device Flow**: Devices without browsers\n- **Chatbot**: Team Chat bots only\n\n### 2. Token Lifecycle (MOST COMMON ISSUE)\n**[concepts\u002Ftoken-lifecycle.md](concepts\u002Ftoken-lifecycle.md)**\n\n99% of OAuth issues stem from misunderstanding:\n- Token expiration (1 hour for all flows)\n- Refresh token rotation (must save new refresh token)\n- Revocation behavior (invalidates all tokens)\n\n### 3. Redirect URI Issues (MOST COMMON ERROR)\n**[troubleshooting\u002Fredirect-uri-issues.md](troubleshooting\u002Fredirect-uri-issues.md)**\n\nError 4709 (\"Redirect URI mismatch\") is the #1 OAuth error.\nMust match EXACTLY (including trailing slash, http vs https).\n\n---\n\n## Key Learnings\n\n### Critical Discoveries:\n\n1. **Refresh Token Rotation**\n   - Each refresh returns a NEW refresh token\n   - Old refresh token becomes invalid\n   - Failure to save new token causes 4735 errors\n   - See: [Token Refresh](examples\u002Ftoken-refresh.md)\n\n2. **S2S OAuth Uses Redis, User OAuth Uses Database**\n   - S2S: Single token for entire account → Redis (ephemeral)\n   - User: Per-user tokens → Database (persistent)\n   - See: [S2S OAuth Redis](examples\u002Fs2s-oauth-redis.md) vs [User OAuth MySQL](examples\u002Fuser-oauth-mysql.md)\n\n3. **Redirect URI Must Match EXACTLY**\n   - Trailing slash matters: `\u002Fcallback` ≠ `\u002Fcallback\u002F`\n   - Protocol matters: `http:\u002F\u002F` ≠ `https:\u002F\u002F`\n   - Port matters: `:3000` ≠ `:3001`\n   - See: [Redirect URI Issues](troubleshooting\u002Fredirect-uri-issues.md)\n\n4. **PKCE Required for Public Clients**\n   - Mobile apps CANNOT keep secrets\n   - SPAs CANNOT keep secrets\n   - PKCE prevents authorization code interception\n   - See: [PKCE](concepts\u002Fpkce.md)\n\n5. **State Parameter Prevents CSRF**\n   - Generate random state before redirect\n   - Store in session\n   - Verify on callback\n   - See: [State Parameter](concepts\u002Fstate-parameter.md)\n\n6. **Token Storage Must Be Encrypted**\n   - NEVER store tokens in plain text\n   - Use AES-256 minimum\n   - See: [User OAuth MySQL](examples\u002Fuser-oauth-mysql.md#token-encryption)\n\n7. **JWT App Type is Deprecated (June 2023)**\n   - No new JWT apps can be created\n   - Existing apps still work but will eventually be sunset\n   - Migrate to S2S OAuth or User OAuth\n\n8. **Scope Levels Determine Authorization Requirements**\n   - No suffix (user-level): Any user can authorize\n   - `:admin`: Requires admin role\n   - `:master`: Requires account owner (multi-account)\n   - See: [Scopes Architecture](concepts\u002Fscopes-architecture.md)\n\n9. **Authorization Codes Expire in 5 Minutes**\n   - Exchange code for token immediately\n   - Don't cache authorization codes\n   - See: [Token Lifecycle](concepts\u002Ftoken-lifecycle.md#authorization-code-expiration)\n\n10. **Device Flow Requires Polling**\n    - Poll at interval returned by `\u002Fdevicecode` (usually 5s)\n    - Handle `authorization_pending`, `slow_down`, `expired_token`\n    - See: [Device Flow](examples\u002Fdevice-flow.md)\n\n---\n\n## Quick Reference\n\n### \"Which OAuth flow should I use?\"\n→ [OAuth Flows](concepts\u002Foauth-flows.md)\n\n### \"Redirect URI mismatch error (4709)\"\n→ [Redirect URI Issues](troubleshooting\u002Fredirect-uri-issues.md)\n\n### \"Token expired or invalid\"\n→ [Token Issues](troubleshooting\u002Ftoken-issues.md)\n\n### \"Refresh token invalid (4735)\"\n→ [Token Refresh](examples\u002Ftoken-refresh.md) - Must save new refresh token\n\n### \"Scope mismatch error (4711)\"\n→ [Scope Issues](troubleshooting\u002Fscope-issues.md)\n\n### \"How do I secure my OAuth app?\"\n→ [PKCE](concepts\u002Fpkce.md) + [State Parameter](concepts\u002Fstate-parameter.md)\n\n### \"How do I implement auto-refresh?\"\n→ [Token Refresh](examples\u002Ftoken-refresh.md)\n\n### \"What's the difference between Classic and Granular scopes?\"\n→ [Scopes Architecture](concepts\u002Fscopes-architecture.md)\n\n### \"What error code means what?\"\n→ [Common Errors](troubleshooting\u002Fcommon-errors.md)\n\n---\n\n## Document Version\n\nBased on **Zoom OAuth API v2** (2024+)\n\n**Deprecated:** JWT App Type (June 2023)\n\n---\n\n**Happy coding!**\n\nRemember: Start with [OAuth Flows](concepts\u002Foauth-flows.md) to understand which flow fits your use case!\n\n## Environment Variables\n\n- See [references\u002Fenvironment-variables.md](references\u002Fenvironment-variables.md) for standardized `.env` keys and where to find each value.\n",{"data":38,"body":56},{"name":4,"description":6,"user-invocable":39,"triggers":40},false,[41,42,43,44,45,46,47,48,49,50,51,52,53,54,55],"zoom oauth","zoom authentication","zoom authorization","server to server oauth","s2s oauth","zoom access token","zoom refresh token","authorization code flow","device authorization","pkce","zoom api authentication","oauth error 4709","oauth error 4733","oauth error 4735","redirect uri mismatch",{"type":57,"children":58},"root",[59,67,82,87,92,99,112,117,193,199,225,231,387,394,512,518,530,534,540,545,551,663,669,877,883,895,898,904,909,915,924,945,953,1040,1046,1076,1082,1188,1206,1211,1433,1439,1524,1550,1556,1625,1628,1634,1639,1644,1649,1655,1719,1724,1946,1952,1957,1987,1992,1998,2010,2095,2100,2321,2327,2458,2464,3064,3069,3074,3077,3083,3088,3094,3158,3163,3348,3353,3364,3367,3373,3379,3430,3436,3457,3529,3532,3538,3543,3607,3612,3666,3669,3675,3680,3686,3812,3818,3827,3833,4388,4394,4519,4522,4528,4533,4539,4837,4843,4871,4874,4880,4885,4898,4901,4907,4912,4925,4928,4934,4940,5007,5013,5018,5050,5061,5067,5078,5243,5254,5264,5270,5282,5292,5300,5310,5319,5327,5336,5342,5380,5388,5406,5409,5415,5664,5677,5680,5686,5814,5817,5823,5836,5842,5917,5920,5926,5942,5948,5956,6157,6160,6166,6175,6178,6184,6190,6222,6228,6271,6277,6311,6317,6350,6356,6391,6397,6435,6441,6482,6488,6531,6537,6569,6575,6622,6628,6658,6664,6685,6699,6702,6708,6714,6724,6729,6772,6778,6788,6793,6811,6817,6827,6832,6835,6841,6847,7248,7251,7256,7262,7271,7277,7285,7291,7299,7305,7315,7321,7329,7335,7349,7355,7363,7369,7377,7383,7391,7394,7400,7412,7422,7425,7433,7444,7450,7472],{"type":60,"tag":61,"props":62,"children":63},"element","h1",{"id":4},[64],{"type":65,"value":66},"text","Zoom OAuth",{"type":60,"tag":68,"props":69,"children":70},"p",{},[71,73,80],{"type":65,"value":72},"Background reference for Zoom auth and token lifecycle behavior. Prefer ",{"type":60,"tag":74,"props":75,"children":77},"code",{"className":76},[],[78],{"type":65,"value":79},"setup-zoom-oauth",{"type":65,"value":81}," first, then use this skill for the exact flow, scope, and error details.",{"type":60,"tag":61,"props":83,"children":85},{"id":84},"zoom-oauth-1",[86],{"type":65,"value":66},{"type":60,"tag":68,"props":88,"children":89},{},[90],{"type":65,"value":91},"Authentication and authorization for Zoom APIs.",{"type":60,"tag":93,"props":94,"children":96},"h2",{"id":95},"complete-documentation",[97],{"type":65,"value":98},"📖 Complete Documentation",{"type":60,"tag":68,"props":100,"children":101},{},[102,104,110],{"type":65,"value":103},"For comprehensive guides, production patterns, and troubleshooting, see ",{"type":60,"tag":105,"props":106,"children":107},"strong",{},[108],{"type":65,"value":109},"Integrated Index section below",{"type":65,"value":111},".",{"type":60,"tag":68,"props":113,"children":114},{},[115],{"type":65,"value":116},"Quick navigation:",{"type":60,"tag":118,"props":119,"children":120},"ul",{},[121,137,151,165,179],{"type":60,"tag":122,"props":123,"children":124},"li",{},[125,135],{"type":60,"tag":105,"props":126,"children":127},{},[128],{"type":60,"tag":129,"props":130,"children":132},"a",{"href":131},"RUNBOOK.md",[133],{"type":65,"value":134},"5-Minute Runbook",{"type":65,"value":136}," - Preflight checks before deep debugging",{"type":60,"tag":122,"props":138,"children":139},{},[140,149],{"type":60,"tag":105,"props":141,"children":142},{},[143],{"type":60,"tag":129,"props":144,"children":146},{"href":145},"concepts\u002Foauth-flows.md",[147],{"type":65,"value":148},"OAuth Flows",{"type":65,"value":150}," - Which flow to use and how each works",{"type":60,"tag":122,"props":152,"children":153},{},[154,163],{"type":60,"tag":105,"props":155,"children":156},{},[157],{"type":60,"tag":129,"props":158,"children":160},{"href":159},"concepts\u002Ftoken-lifecycle.md",[161],{"type":65,"value":162},"Token Lifecycle",{"type":65,"value":164}," - Expiration, refresh, and revocation",{"type":60,"tag":122,"props":166,"children":167},{},[168,177],{"type":60,"tag":105,"props":169,"children":170},{},[171],{"type":60,"tag":129,"props":172,"children":174},{"href":173},"examples\u002Fs2s-oauth-redis.md",[175],{"type":65,"value":176},"Production Examples",{"type":65,"value":178}," - Redis caching, MySQL storage, auto-refresh",{"type":60,"tag":122,"props":180,"children":181},{},[182,191],{"type":60,"tag":105,"props":183,"children":184},{},[185],{"type":60,"tag":129,"props":186,"children":188},{"href":187},"troubleshooting\u002Fcommon-errors.md",[189],{"type":65,"value":190},"Troubleshooting",{"type":65,"value":192}," - Error codes 4700-4741",{"type":60,"tag":93,"props":194,"children":196},{"id":195},"prerequisites",[197],{"type":65,"value":198},"Prerequisites",{"type":60,"tag":118,"props":200,"children":201},{},[202,215,220],{"type":60,"tag":122,"props":203,"children":204},{},[205,207],{"type":65,"value":206},"Zoom app created in ",{"type":60,"tag":129,"props":208,"children":212},{"href":209,"rel":210},"https:\u002F\u002Fmarketplace.zoom.us\u002F",[211],"nofollow",[213],{"type":65,"value":214},"Marketplace",{"type":60,"tag":122,"props":216,"children":217},{},[218],{"type":65,"value":219},"Client ID and Client Secret",{"type":60,"tag":122,"props":221,"children":222},{},[223],{"type":65,"value":224},"For S2S OAuth: Account ID",{"type":60,"tag":93,"props":226,"children":228},{"id":227},"four-authorization-use-cases",[229],{"type":65,"value":230},"Four Authorization Use Cases",{"type":60,"tag":232,"props":233,"children":234},"table",{},[235,264],{"type":60,"tag":236,"props":237,"children":238},"thead",{},[239],{"type":60,"tag":240,"props":241,"children":242},"tr",{},[243,249,254,259],{"type":60,"tag":244,"props":245,"children":246},"th",{},[247],{"type":65,"value":248},"Use Case",{"type":60,"tag":244,"props":250,"children":251},{},[252],{"type":65,"value":253},"App Type",{"type":60,"tag":244,"props":255,"children":256},{},[257],{"type":65,"value":258},"Grant Type",{"type":60,"tag":244,"props":260,"children":261},{},[262],{"type":65,"value":263},"Industry Name",{"type":60,"tag":265,"props":266,"children":267},"tbody",{},[268,299,329,358],{"type":60,"tag":240,"props":269,"children":270},{},[271,280,285,294],{"type":60,"tag":272,"props":273,"children":274},"td",{},[275],{"type":60,"tag":105,"props":276,"children":277},{},[278],{"type":65,"value":279},"Account Authorization",{"type":60,"tag":272,"props":281,"children":282},{},[283],{"type":65,"value":284},"Server-to-Server",{"type":60,"tag":272,"props":286,"children":287},{},[288],{"type":60,"tag":74,"props":289,"children":291},{"className":290},[],[292],{"type":65,"value":293},"account_credentials",{"type":60,"tag":272,"props":295,"children":296},{},[297],{"type":65,"value":298},"Client Credentials Grant, M2M, Two-legged OAuth",{"type":60,"tag":240,"props":300,"children":301},{},[302,310,315,324],{"type":60,"tag":272,"props":303,"children":304},{},[305],{"type":60,"tag":105,"props":306,"children":307},{},[308],{"type":65,"value":309},"User Authorization",{"type":60,"tag":272,"props":311,"children":312},{},[313],{"type":65,"value":314},"General",{"type":60,"tag":272,"props":316,"children":317},{},[318],{"type":60,"tag":74,"props":319,"children":321},{"className":320},[],[322],{"type":65,"value":323},"authorization_code",{"type":60,"tag":272,"props":325,"children":326},{},[327],{"type":65,"value":328},"Authorization Code Grant, Three-legged OAuth",{"type":60,"tag":240,"props":330,"children":331},{},[332,340,344,353],{"type":60,"tag":272,"props":333,"children":334},{},[335],{"type":60,"tag":105,"props":336,"children":337},{},[338],{"type":65,"value":339},"Device Authorization",{"type":60,"tag":272,"props":341,"children":342},{},[343],{"type":65,"value":314},{"type":60,"tag":272,"props":345,"children":346},{},[347],{"type":60,"tag":74,"props":348,"children":350},{"className":349},[],[351],{"type":65,"value":352},"urn:ietf:params:oauth:grant-type:device_code",{"type":60,"tag":272,"props":354,"children":355},{},[356],{"type":65,"value":357},"Device Authorization Grant (RFC 8628)",{"type":60,"tag":240,"props":359,"children":360},{},[361,369,373,382],{"type":60,"tag":272,"props":362,"children":363},{},[364],{"type":60,"tag":105,"props":365,"children":366},{},[367],{"type":65,"value":368},"Client Authorization",{"type":60,"tag":272,"props":370,"children":371},{},[372],{"type":65,"value":314},{"type":60,"tag":272,"props":374,"children":375},{},[376],{"type":60,"tag":74,"props":377,"children":379},{"className":378},[],[380],{"type":65,"value":381},"client_credentials",{"type":60,"tag":272,"props":383,"children":384},{},[385],{"type":65,"value":386},"Client Credentials Grant (chatbot-scoped)",{"type":60,"tag":388,"props":389,"children":391},"h3",{"id":390},"industry-terminology",[392],{"type":65,"value":393},"Industry Terminology",{"type":60,"tag":232,"props":395,"children":396},{},[397,413],{"type":60,"tag":236,"props":398,"children":399},{},[400],{"type":60,"tag":240,"props":401,"children":402},{},[403,408],{"type":60,"tag":244,"props":404,"children":405},{},[406],{"type":65,"value":407},"Term",{"type":60,"tag":244,"props":409,"children":410},{},[411],{"type":65,"value":412},"Meaning",{"type":60,"tag":265,"props":414,"children":415},{},[416,432,448,464,480,496],{"type":60,"tag":240,"props":417,"children":418},{},[419,427],{"type":60,"tag":272,"props":420,"children":421},{},[422],{"type":60,"tag":105,"props":423,"children":424},{},[425],{"type":65,"value":426},"Two-legged OAuth",{"type":60,"tag":272,"props":428,"children":429},{},[430],{"type":65,"value":431},"No user involved (client ↔ server)",{"type":60,"tag":240,"props":433,"children":434},{},[435,443],{"type":60,"tag":272,"props":436,"children":437},{},[438],{"type":60,"tag":105,"props":439,"children":440},{},[441],{"type":65,"value":442},"Three-legged OAuth",{"type":60,"tag":272,"props":444,"children":445},{},[446],{"type":65,"value":447},"User involved (user ↔ client ↔ server)",{"type":60,"tag":240,"props":449,"children":450},{},[451,459],{"type":60,"tag":272,"props":452,"children":453},{},[454],{"type":60,"tag":105,"props":455,"children":456},{},[457],{"type":65,"value":458},"M2M",{"type":60,"tag":272,"props":460,"children":461},{},[462],{"type":65,"value":463},"Machine-to-Machine (backend services)",{"type":60,"tag":240,"props":465,"children":466},{},[467,475],{"type":60,"tag":272,"props":468,"children":469},{},[470],{"type":60,"tag":105,"props":471,"children":472},{},[473],{"type":65,"value":474},"Public client",{"type":60,"tag":272,"props":476,"children":477},{},[478],{"type":65,"value":479},"Can't keep secrets (mobile, SPA) → use PKCE",{"type":60,"tag":240,"props":481,"children":482},{},[483,491],{"type":60,"tag":272,"props":484,"children":485},{},[486],{"type":60,"tag":105,"props":487,"children":488},{},[489],{"type":65,"value":490},"Confidential client",{"type":60,"tag":272,"props":492,"children":493},{},[494],{"type":65,"value":495},"Can keep secrets (backend servers)",{"type":60,"tag":240,"props":497,"children":498},{},[499,507],{"type":60,"tag":272,"props":500,"children":501},{},[502],{"type":60,"tag":105,"props":503,"children":504},{},[505],{"type":65,"value":506},"PKCE",{"type":60,"tag":272,"props":508,"children":509},{},[510],{"type":65,"value":511},"Proof Key for Code Exchange (RFC 7636), pronounced \"pixy\"",{"type":60,"tag":388,"props":513,"children":515},{"id":514},"which-flow-should-i-use",[516],{"type":65,"value":517},"Which Flow Should I Use?",{"type":60,"tag":519,"props":520,"children":524},"pre",{"className":521,"code":523,"language":65},[522],"language-text","                              ┌─────────────────────┐\n                              │  What are you       │\n                              │  building?          │\n                              └──────────┬──────────┘\n                                         │\n                    ┌────────────────────┼────────────────────┐\n                    │                    │                    │\n                    ▼                    ▼                    ▼\n          ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐\n          │  Backend        │  │  App for other  │  │  Chatbot only   │\n          │  automation     │  │  users\u002Faccounts │  │  (Team Chat)    │\n          │  (your account) │  │                 │  │                 │\n          └────────┬────────┘  └────────┬────────┘  └────────┬────────┘\n                   │                    │                    │\n                   ▼                    │                    ▼\n          ┌─────────────────┐           │           ┌─────────────────┐\n          │    ACCOUNT      │           │           │     CLIENT      │\n          │   (S2S OAuth)   │           │           │   (Chatbot)     │\n          └─────────────────┘           │           └─────────────────┘\n                                        │\n                                        ▼\n                              ┌─────────────────────┐\n                              │  Does device have   │\n                              │  a browser?         │\n                              └──────────┬──────────┘\n                                         │\n                         ┌───────────────┴───────────────┐\n                         │ NO                         YES│\n                         ▼                               ▼\n          ┌─────────────────────────┐         ┌─────────────────┐\n          │        DEVICE           │         │      USER       │\n          │     (Device Flow)       │         │  (Auth Code)    │\n          │                         │         │                 │\n          │ Examples:               │         │ + PKCE if       │\n          │ • Smart TV              │         │   public client │\n          │ • Meeting SDK device    │         │                 │\n          └─────────────────────────┘         └─────────────────┘\n",[525],{"type":60,"tag":74,"props":526,"children":528},{"__ignoreMap":527},"",[529],{"type":65,"value":523},{"type":60,"tag":531,"props":532,"children":533},"hr",{},[],{"type":60,"tag":93,"props":535,"children":537},{"id":536},"account-authorization-server-to-server-oauth",[538],{"type":65,"value":539},"Account Authorization (Server-to-Server OAuth)",{"type":60,"tag":68,"props":541,"children":542},{},[543],{"type":65,"value":544},"For backend automation without user interaction.",{"type":60,"tag":388,"props":546,"children":548},{"id":547},"request-access-token",[549],{"type":65,"value":550},"Request Access Token",{"type":60,"tag":519,"props":552,"children":556},{"className":553,"code":554,"language":555,"meta":527,"style":527},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","POST https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=account_credentials&account_id={ACCOUNT_ID}\n\nHeaders:\nAuthorization: Basic {Base64(ClientID:ClientSecret)}\n","bash",[557],{"type":60,"tag":74,"props":558,"children":559},{"__ignoreMap":527},[560,605,615,624],{"type":60,"tag":561,"props":562,"children":565},"span",{"class":563,"line":564},"line",1,[566,572,578,584,590,595,600],{"type":60,"tag":561,"props":567,"children":569},{"style":568},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[570],{"type":65,"value":571},"POST",{"type":60,"tag":561,"props":573,"children":575},{"style":574},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[576],{"type":65,"value":577}," https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=account_credentials",{"type":60,"tag":561,"props":579,"children":581},{"style":580},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[582],{"type":65,"value":583},"&",{"type":60,"tag":561,"props":585,"children":587},{"style":586},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[588],{"type":65,"value":589},"account_id",{"type":60,"tag":561,"props":591,"children":592},{"style":580},[593],{"type":65,"value":594},"=",{"type":60,"tag":561,"props":596,"children":597},{"style":586},[598],{"type":65,"value":599},"{",{"type":60,"tag":561,"props":601,"children":602},{"style":568},[603],{"type":65,"value":604},"ACCOUNT_ID}\n",{"type":60,"tag":561,"props":606,"children":608},{"class":563,"line":607},2,[609],{"type":60,"tag":561,"props":610,"children":612},{"emptyLinePlaceholder":611},true,[613],{"type":65,"value":614},"\n",{"type":60,"tag":561,"props":616,"children":618},{"class":563,"line":617},3,[619],{"type":60,"tag":561,"props":620,"children":621},{"style":568},[622],{"type":65,"value":623},"Headers:\n",{"type":60,"tag":561,"props":625,"children":627},{"class":563,"line":626},4,[628,633,638,643,648,653,658],{"type":60,"tag":561,"props":629,"children":630},{"style":568},[631],{"type":65,"value":632},"Authorization:",{"type":60,"tag":561,"props":634,"children":635},{"style":574},[636],{"type":65,"value":637}," Basic",{"type":60,"tag":561,"props":639,"children":640},{"style":574},[641],{"type":65,"value":642}," {Base64",{"type":60,"tag":561,"props":644,"children":645},{"style":580},[646],{"type":65,"value":647},"(",{"type":60,"tag":561,"props":649,"children":650},{"style":568},[651],{"type":65,"value":652},"ClientID:ClientSecret",{"type":60,"tag":561,"props":654,"children":655},{"style":580},[656],{"type":65,"value":657},")",{"type":60,"tag":561,"props":659,"children":660},{"style":574},[661],{"type":65,"value":662},"}\n",{"type":60,"tag":388,"props":664,"children":666},{"id":665},"response",[667],{"type":65,"value":668},"Response",{"type":60,"tag":519,"props":670,"children":674},{"className":671,"code":672,"language":673,"meta":527,"style":527},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"access_token\": \"eyJ...\",\n  \"token_type\": \"bearer\",\n  \"expires_in\": 3600,\n  \"scope\": \"user:read:user:admin\",\n  \"api_url\": \"https:\u002F\u002Fapi.zoom.us\"\n}\n","json",[675],{"type":60,"tag":74,"props":676,"children":677},{"__ignoreMap":527},[678,686,729,766,796,834,869],{"type":60,"tag":561,"props":679,"children":680},{"class":563,"line":564},[681],{"type":60,"tag":561,"props":682,"children":683},{"style":580},[684],{"type":65,"value":685},"{\n",{"type":60,"tag":561,"props":687,"children":688},{"class":563,"line":607},[689,694,700,705,710,715,720,724],{"type":60,"tag":561,"props":690,"children":691},{"style":580},[692],{"type":65,"value":693},"  \"",{"type":60,"tag":561,"props":695,"children":697},{"style":696},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[698],{"type":65,"value":699},"access_token",{"type":60,"tag":561,"props":701,"children":702},{"style":580},[703],{"type":65,"value":704},"\"",{"type":60,"tag":561,"props":706,"children":707},{"style":580},[708],{"type":65,"value":709},":",{"type":60,"tag":561,"props":711,"children":712},{"style":580},[713],{"type":65,"value":714}," \"",{"type":60,"tag":561,"props":716,"children":717},{"style":574},[718],{"type":65,"value":719},"eyJ...",{"type":60,"tag":561,"props":721,"children":722},{"style":580},[723],{"type":65,"value":704},{"type":60,"tag":561,"props":725,"children":726},{"style":580},[727],{"type":65,"value":728},",\n",{"type":60,"tag":561,"props":730,"children":731},{"class":563,"line":617},[732,736,741,745,749,753,758,762],{"type":60,"tag":561,"props":733,"children":734},{"style":580},[735],{"type":65,"value":693},{"type":60,"tag":561,"props":737,"children":738},{"style":696},[739],{"type":65,"value":740},"token_type",{"type":60,"tag":561,"props":742,"children":743},{"style":580},[744],{"type":65,"value":704},{"type":60,"tag":561,"props":746,"children":747},{"style":580},[748],{"type":65,"value":709},{"type":60,"tag":561,"props":750,"children":751},{"style":580},[752],{"type":65,"value":714},{"type":60,"tag":561,"props":754,"children":755},{"style":574},[756],{"type":65,"value":757},"bearer",{"type":60,"tag":561,"props":759,"children":760},{"style":580},[761],{"type":65,"value":704},{"type":60,"tag":561,"props":763,"children":764},{"style":580},[765],{"type":65,"value":728},{"type":60,"tag":561,"props":767,"children":768},{"class":563,"line":626},[769,773,778,782,786,792],{"type":60,"tag":561,"props":770,"children":771},{"style":580},[772],{"type":65,"value":693},{"type":60,"tag":561,"props":774,"children":775},{"style":696},[776],{"type":65,"value":777},"expires_in",{"type":60,"tag":561,"props":779,"children":780},{"style":580},[781],{"type":65,"value":704},{"type":60,"tag":561,"props":783,"children":784},{"style":580},[785],{"type":65,"value":709},{"type":60,"tag":561,"props":787,"children":789},{"style":788},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[790],{"type":65,"value":791}," 3600",{"type":60,"tag":561,"props":793,"children":794},{"style":580},[795],{"type":65,"value":728},{"type":60,"tag":561,"props":797,"children":799},{"class":563,"line":798},5,[800,804,809,813,817,821,826,830],{"type":60,"tag":561,"props":801,"children":802},{"style":580},[803],{"type":65,"value":693},{"type":60,"tag":561,"props":805,"children":806},{"style":696},[807],{"type":65,"value":808},"scope",{"type":60,"tag":561,"props":810,"children":811},{"style":580},[812],{"type":65,"value":704},{"type":60,"tag":561,"props":814,"children":815},{"style":580},[816],{"type":65,"value":709},{"type":60,"tag":561,"props":818,"children":819},{"style":580},[820],{"type":65,"value":714},{"type":60,"tag":561,"props":822,"children":823},{"style":574},[824],{"type":65,"value":825},"user:read:user:admin",{"type":60,"tag":561,"props":827,"children":828},{"style":580},[829],{"type":65,"value":704},{"type":60,"tag":561,"props":831,"children":832},{"style":580},[833],{"type":65,"value":728},{"type":60,"tag":561,"props":835,"children":837},{"class":563,"line":836},6,[838,842,847,851,855,859,864],{"type":60,"tag":561,"props":839,"children":840},{"style":580},[841],{"type":65,"value":693},{"type":60,"tag":561,"props":843,"children":844},{"style":696},[845],{"type":65,"value":846},"api_url",{"type":60,"tag":561,"props":848,"children":849},{"style":580},[850],{"type":65,"value":704},{"type":60,"tag":561,"props":852,"children":853},{"style":580},[854],{"type":65,"value":709},{"type":60,"tag":561,"props":856,"children":857},{"style":580},[858],{"type":65,"value":714},{"type":60,"tag":561,"props":860,"children":861},{"style":574},[862],{"type":65,"value":863},"https:\u002F\u002Fapi.zoom.us",{"type":60,"tag":561,"props":865,"children":866},{"style":580},[867],{"type":65,"value":868},"\"\n",{"type":60,"tag":561,"props":870,"children":872},{"class":563,"line":871},7,[873],{"type":60,"tag":561,"props":874,"children":875},{"style":580},[876],{"type":65,"value":662},{"type":60,"tag":388,"props":878,"children":880},{"id":879},"refresh",[881],{"type":65,"value":882},"Refresh",{"type":60,"tag":68,"props":884,"children":885},{},[886,888,893],{"type":65,"value":887},"Access tokens expire after ",{"type":60,"tag":105,"props":889,"children":890},{},[891],{"type":65,"value":892},"1 hour",{"type":65,"value":894},". No separate refresh flow - just request a new token.",{"type":60,"tag":531,"props":896,"children":897},{},[],{"type":60,"tag":93,"props":899,"children":901},{"id":900},"user-authorization-authorization-code-flow",[902],{"type":65,"value":903},"User Authorization (Authorization Code Flow)",{"type":60,"tag":68,"props":905,"children":906},{},[907],{"type":65,"value":908},"For apps that act on behalf of users.",{"type":60,"tag":388,"props":910,"children":912},{"id":911},"step-1-redirect-user-to-authorize",[913],{"type":65,"value":914},"Step 1: Redirect User to Authorize",{"type":60,"tag":519,"props":916,"children":919},{"className":917,"code":918,"language":65},[522],"https:\u002F\u002Fzoom.us\u002Foauth\u002Fauthorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}\n",[920],{"type":60,"tag":74,"props":921,"children":922},{"__ignoreMap":527},[923],{"type":65,"value":918},{"type":60,"tag":68,"props":925,"children":926},{},[927,929,935,937,943],{"type":65,"value":928},"Use ",{"type":60,"tag":74,"props":930,"children":932},{"className":931},[],[933],{"type":65,"value":934},"https:\u002F\u002Fzoom.us\u002Foauth\u002Fauthorize",{"type":65,"value":936}," for consent, but ",{"type":60,"tag":74,"props":938,"children":940},{"className":939},[],[941],{"type":65,"value":942},"https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken",{"type":65,"value":944}," for token exchange.",{"type":60,"tag":68,"props":946,"children":947},{},[948],{"type":60,"tag":105,"props":949,"children":950},{},[951],{"type":65,"value":952},"Optional Parameters:",{"type":60,"tag":232,"props":954,"children":955},{},[956,972],{"type":60,"tag":236,"props":957,"children":958},{},[959],{"type":60,"tag":240,"props":960,"children":961},{},[962,967],{"type":60,"tag":244,"props":963,"children":964},{},[965],{"type":65,"value":966},"Parameter",{"type":60,"tag":244,"props":968,"children":969},{},[970],{"type":65,"value":971},"Description",{"type":60,"tag":265,"props":973,"children":974},{},[975,992,1009],{"type":60,"tag":240,"props":976,"children":977},{},[978,987],{"type":60,"tag":272,"props":979,"children":980},{},[981],{"type":60,"tag":74,"props":982,"children":984},{"className":983},[],[985],{"type":65,"value":986},"state",{"type":60,"tag":272,"props":988,"children":989},{},[990],{"type":65,"value":991},"CSRF protection, maintains state through flow",{"type":60,"tag":240,"props":993,"children":994},{},[995,1004],{"type":60,"tag":272,"props":996,"children":997},{},[998],{"type":60,"tag":74,"props":999,"children":1001},{"className":1000},[],[1002],{"type":65,"value":1003},"code_challenge",{"type":60,"tag":272,"props":1005,"children":1006},{},[1007],{"type":65,"value":1008},"For PKCE (see below)",{"type":60,"tag":240,"props":1010,"children":1011},{},[1012,1021],{"type":60,"tag":272,"props":1013,"children":1014},{},[1015],{"type":60,"tag":74,"props":1016,"children":1018},{"className":1017},[],[1019],{"type":65,"value":1020},"code_challenge_method",{"type":60,"tag":272,"props":1022,"children":1023},{},[1024,1030,1032,1038],{"type":60,"tag":74,"props":1025,"children":1027},{"className":1026},[],[1028],{"type":65,"value":1029},"S256",{"type":65,"value":1031}," or ",{"type":60,"tag":74,"props":1033,"children":1035},{"className":1034},[],[1036],{"type":65,"value":1037},"plain",{"type":65,"value":1039}," (default: plain)",{"type":60,"tag":388,"props":1041,"children":1043},{"id":1042},"step-2-user-authorizes",[1044],{"type":65,"value":1045},"Step 2: User Authorizes",{"type":60,"tag":118,"props":1047,"children":1048},{},[1049,1054],{"type":60,"tag":122,"props":1050,"children":1051},{},[1052],{"type":65,"value":1053},"User signs in and grants permission",{"type":60,"tag":122,"props":1055,"children":1056},{},[1057,1059,1065,1067],{"type":65,"value":1058},"Redirects to ",{"type":60,"tag":74,"props":1060,"children":1062},{"className":1061},[],[1063],{"type":65,"value":1064},"redirect_uri",{"type":65,"value":1066}," with authorization code:\n",{"type":60,"tag":519,"props":1068,"children":1071},{"className":1069,"code":1070,"language":65},[522],"https:\u002F\u002Fexample.com\u002F?code={AUTHORIZATION_CODE}\n",[1072],{"type":60,"tag":74,"props":1073,"children":1074},{"__ignoreMap":527},[1075],{"type":65,"value":1070},{"type":60,"tag":388,"props":1077,"children":1079},{"id":1078},"step-3-exchange-code-for-token",[1080],{"type":65,"value":1081},"Step 3: Exchange Code for Token",{"type":60,"tag":519,"props":1083,"children":1085},{"className":553,"code":1084,"language":555,"meta":527,"style":527},"POST https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=authorization_code&code={CODE}&redirect_uri={REDIRECT_URI}\n\nHeaders:\nAuthorization: Basic {Base64(ClientID:ClientSecret)}\n",[1086],{"type":60,"tag":74,"props":1087,"children":1088},{"__ignoreMap":527},[1089,1143,1150,1157],{"type":60,"tag":561,"props":1090,"children":1091},{"class":563,"line":564},[1092,1096,1101,1105,1109,1113,1117,1122,1126,1130,1134,1138],{"type":60,"tag":561,"props":1093,"children":1094},{"style":568},[1095],{"type":65,"value":571},{"type":60,"tag":561,"props":1097,"children":1098},{"style":574},[1099],{"type":65,"value":1100}," https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=authorization_code",{"type":60,"tag":561,"props":1102,"children":1103},{"style":580},[1104],{"type":65,"value":583},{"type":60,"tag":561,"props":1106,"children":1107},{"style":586},[1108],{"type":65,"value":74},{"type":60,"tag":561,"props":1110,"children":1111},{"style":580},[1112],{"type":65,"value":594},{"type":60,"tag":561,"props":1114,"children":1115},{"style":586},[1116],{"type":65,"value":599},{"type":60,"tag":561,"props":1118,"children":1119},{"style":568},[1120],{"type":65,"value":1121},"CODE}",{"type":60,"tag":561,"props":1123,"children":1124},{"style":580},[1125],{"type":65,"value":583},{"type":60,"tag":561,"props":1127,"children":1128},{"style":586},[1129],{"type":65,"value":1064},{"type":60,"tag":561,"props":1131,"children":1132},{"style":580},[1133],{"type":65,"value":594},{"type":60,"tag":561,"props":1135,"children":1136},{"style":586},[1137],{"type":65,"value":599},{"type":60,"tag":561,"props":1139,"children":1140},{"style":568},[1141],{"type":65,"value":1142},"REDIRECT_URI}\n",{"type":60,"tag":561,"props":1144,"children":1145},{"class":563,"line":607},[1146],{"type":60,"tag":561,"props":1147,"children":1148},{"emptyLinePlaceholder":611},[1149],{"type":65,"value":614},{"type":60,"tag":561,"props":1151,"children":1152},{"class":563,"line":617},[1153],{"type":60,"tag":561,"props":1154,"children":1155},{"style":568},[1156],{"type":65,"value":623},{"type":60,"tag":561,"props":1158,"children":1159},{"class":563,"line":626},[1160,1164,1168,1172,1176,1180,1184],{"type":60,"tag":561,"props":1161,"children":1162},{"style":568},[1163],{"type":65,"value":632},{"type":60,"tag":561,"props":1165,"children":1166},{"style":574},[1167],{"type":65,"value":637},{"type":60,"tag":561,"props":1169,"children":1170},{"style":574},[1171],{"type":65,"value":642},{"type":60,"tag":561,"props":1173,"children":1174},{"style":580},[1175],{"type":65,"value":647},{"type":60,"tag":561,"props":1177,"children":1178},{"style":568},[1179],{"type":65,"value":652},{"type":60,"tag":561,"props":1181,"children":1182},{"style":580},[1183],{"type":65,"value":657},{"type":60,"tag":561,"props":1185,"children":1186},{"style":574},[1187],{"type":65,"value":662},{"type":60,"tag":68,"props":1189,"children":1190},{},[1191,1196,1198,1204],{"type":60,"tag":105,"props":1192,"children":1193},{},[1194],{"type":65,"value":1195},"With PKCE:",{"type":65,"value":1197}," Add ",{"type":60,"tag":74,"props":1199,"children":1201},{"className":1200},[],[1202],{"type":65,"value":1203},"code_verifier",{"type":65,"value":1205}," parameter.",{"type":60,"tag":388,"props":1207,"children":1209},{"id":1208},"response-1",[1210],{"type":65,"value":668},{"type":60,"tag":519,"props":1212,"children":1214},{"className":671,"code":1213,"language":673,"meta":527,"style":527},"{\n  \"access_token\": \"eyJ...\",\n  \"token_type\": \"bearer\",\n  \"refresh_token\": \"eyJ...\",\n  \"expires_in\": 3600,\n  \"scope\": \"user:read:user\",\n  \"api_url\": \"https:\u002F\u002Fapi.zoom.us\"\n}\n",[1215],{"type":60,"tag":74,"props":1216,"children":1217},{"__ignoreMap":527},[1218,1225,1260,1295,1331,1358,1394,1425],{"type":60,"tag":561,"props":1219,"children":1220},{"class":563,"line":564},[1221],{"type":60,"tag":561,"props":1222,"children":1223},{"style":580},[1224],{"type":65,"value":685},{"type":60,"tag":561,"props":1226,"children":1227},{"class":563,"line":607},[1228,1232,1236,1240,1244,1248,1252,1256],{"type":60,"tag":561,"props":1229,"children":1230},{"style":580},[1231],{"type":65,"value":693},{"type":60,"tag":561,"props":1233,"children":1234},{"style":696},[1235],{"type":65,"value":699},{"type":60,"tag":561,"props":1237,"children":1238},{"style":580},[1239],{"type":65,"value":704},{"type":60,"tag":561,"props":1241,"children":1242},{"style":580},[1243],{"type":65,"value":709},{"type":60,"tag":561,"props":1245,"children":1246},{"style":580},[1247],{"type":65,"value":714},{"type":60,"tag":561,"props":1249,"children":1250},{"style":574},[1251],{"type":65,"value":719},{"type":60,"tag":561,"props":1253,"children":1254},{"style":580},[1255],{"type":65,"value":704},{"type":60,"tag":561,"props":1257,"children":1258},{"style":580},[1259],{"type":65,"value":728},{"type":60,"tag":561,"props":1261,"children":1262},{"class":563,"line":617},[1263,1267,1271,1275,1279,1283,1287,1291],{"type":60,"tag":561,"props":1264,"children":1265},{"style":580},[1266],{"type":65,"value":693},{"type":60,"tag":561,"props":1268,"children":1269},{"style":696},[1270],{"type":65,"value":740},{"type":60,"tag":561,"props":1272,"children":1273},{"style":580},[1274],{"type":65,"value":704},{"type":60,"tag":561,"props":1276,"children":1277},{"style":580},[1278],{"type":65,"value":709},{"type":60,"tag":561,"props":1280,"children":1281},{"style":580},[1282],{"type":65,"value":714},{"type":60,"tag":561,"props":1284,"children":1285},{"style":574},[1286],{"type":65,"value":757},{"type":60,"tag":561,"props":1288,"children":1289},{"style":580},[1290],{"type":65,"value":704},{"type":60,"tag":561,"props":1292,"children":1293},{"style":580},[1294],{"type":65,"value":728},{"type":60,"tag":561,"props":1296,"children":1297},{"class":563,"line":626},[1298,1302,1307,1311,1315,1319,1323,1327],{"type":60,"tag":561,"props":1299,"children":1300},{"style":580},[1301],{"type":65,"value":693},{"type":60,"tag":561,"props":1303,"children":1304},{"style":696},[1305],{"type":65,"value":1306},"refresh_token",{"type":60,"tag":561,"props":1308,"children":1309},{"style":580},[1310],{"type":65,"value":704},{"type":60,"tag":561,"props":1312,"children":1313},{"style":580},[1314],{"type":65,"value":709},{"type":60,"tag":561,"props":1316,"children":1317},{"style":580},[1318],{"type":65,"value":714},{"type":60,"tag":561,"props":1320,"children":1321},{"style":574},[1322],{"type":65,"value":719},{"type":60,"tag":561,"props":1324,"children":1325},{"style":580},[1326],{"type":65,"value":704},{"type":60,"tag":561,"props":1328,"children":1329},{"style":580},[1330],{"type":65,"value":728},{"type":60,"tag":561,"props":1332,"children":1333},{"class":563,"line":798},[1334,1338,1342,1346,1350,1354],{"type":60,"tag":561,"props":1335,"children":1336},{"style":580},[1337],{"type":65,"value":693},{"type":60,"tag":561,"props":1339,"children":1340},{"style":696},[1341],{"type":65,"value":777},{"type":60,"tag":561,"props":1343,"children":1344},{"style":580},[1345],{"type":65,"value":704},{"type":60,"tag":561,"props":1347,"children":1348},{"style":580},[1349],{"type":65,"value":709},{"type":60,"tag":561,"props":1351,"children":1352},{"style":788},[1353],{"type":65,"value":791},{"type":60,"tag":561,"props":1355,"children":1356},{"style":580},[1357],{"type":65,"value":728},{"type":60,"tag":561,"props":1359,"children":1360},{"class":563,"line":836},[1361,1365,1369,1373,1377,1381,1386,1390],{"type":60,"tag":561,"props":1362,"children":1363},{"style":580},[1364],{"type":65,"value":693},{"type":60,"tag":561,"props":1366,"children":1367},{"style":696},[1368],{"type":65,"value":808},{"type":60,"tag":561,"props":1370,"children":1371},{"style":580},[1372],{"type":65,"value":704},{"type":60,"tag":561,"props":1374,"children":1375},{"style":580},[1376],{"type":65,"value":709},{"type":60,"tag":561,"props":1378,"children":1379},{"style":580},[1380],{"type":65,"value":714},{"type":60,"tag":561,"props":1382,"children":1383},{"style":574},[1384],{"type":65,"value":1385},"user:read:user",{"type":60,"tag":561,"props":1387,"children":1388},{"style":580},[1389],{"type":65,"value":704},{"type":60,"tag":561,"props":1391,"children":1392},{"style":580},[1393],{"type":65,"value":728},{"type":60,"tag":561,"props":1395,"children":1396},{"class":563,"line":871},[1397,1401,1405,1409,1413,1417,1421],{"type":60,"tag":561,"props":1398,"children":1399},{"style":580},[1400],{"type":65,"value":693},{"type":60,"tag":561,"props":1402,"children":1403},{"style":696},[1404],{"type":65,"value":846},{"type":60,"tag":561,"props":1406,"children":1407},{"style":580},[1408],{"type":65,"value":704},{"type":60,"tag":561,"props":1410,"children":1411},{"style":580},[1412],{"type":65,"value":709},{"type":60,"tag":561,"props":1414,"children":1415},{"style":580},[1416],{"type":65,"value":714},{"type":60,"tag":561,"props":1418,"children":1419},{"style":574},[1420],{"type":65,"value":863},{"type":60,"tag":561,"props":1422,"children":1423},{"style":580},[1424],{"type":65,"value":868},{"type":60,"tag":561,"props":1426,"children":1428},{"class":563,"line":1427},8,[1429],{"type":60,"tag":561,"props":1430,"children":1431},{"style":580},[1432],{"type":65,"value":662},{"type":60,"tag":388,"props":1434,"children":1436},{"id":1435},"refresh-token",[1437],{"type":65,"value":1438},"Refresh Token",{"type":60,"tag":519,"props":1440,"children":1442},{"className":553,"code":1441,"language":555,"meta":527,"style":527},"POST https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=refresh_token&refresh_token={REFRESH_TOKEN}\n\nHeaders:\nAuthorization: Basic {Base64(ClientID:ClientSecret)}\n",[1443],{"type":60,"tag":74,"props":1444,"children":1445},{"__ignoreMap":527},[1446,1479,1486,1493],{"type":60,"tag":561,"props":1447,"children":1448},{"class":563,"line":564},[1449,1453,1458,1462,1466,1470,1474],{"type":60,"tag":561,"props":1450,"children":1451},{"style":568},[1452],{"type":65,"value":571},{"type":60,"tag":561,"props":1454,"children":1455},{"style":574},[1456],{"type":65,"value":1457}," https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=refresh_token",{"type":60,"tag":561,"props":1459,"children":1460},{"style":580},[1461],{"type":65,"value":583},{"type":60,"tag":561,"props":1463,"children":1464},{"style":586},[1465],{"type":65,"value":1306},{"type":60,"tag":561,"props":1467,"children":1468},{"style":580},[1469],{"type":65,"value":594},{"type":60,"tag":561,"props":1471,"children":1472},{"style":586},[1473],{"type":65,"value":599},{"type":60,"tag":561,"props":1475,"children":1476},{"style":568},[1477],{"type":65,"value":1478},"REFRESH_TOKEN}\n",{"type":60,"tag":561,"props":1480,"children":1481},{"class":563,"line":607},[1482],{"type":60,"tag":561,"props":1483,"children":1484},{"emptyLinePlaceholder":611},[1485],{"type":65,"value":614},{"type":60,"tag":561,"props":1487,"children":1488},{"class":563,"line":617},[1489],{"type":60,"tag":561,"props":1490,"children":1491},{"style":568},[1492],{"type":65,"value":623},{"type":60,"tag":561,"props":1494,"children":1495},{"class":563,"line":626},[1496,1500,1504,1508,1512,1516,1520],{"type":60,"tag":561,"props":1497,"children":1498},{"style":568},[1499],{"type":65,"value":632},{"type":60,"tag":561,"props":1501,"children":1502},{"style":574},[1503],{"type":65,"value":637},{"type":60,"tag":561,"props":1505,"children":1506},{"style":574},[1507],{"type":65,"value":642},{"type":60,"tag":561,"props":1509,"children":1510},{"style":580},[1511],{"type":65,"value":647},{"type":60,"tag":561,"props":1513,"children":1514},{"style":568},[1515],{"type":65,"value":652},{"type":60,"tag":561,"props":1517,"children":1518},{"style":580},[1519],{"type":65,"value":657},{"type":60,"tag":561,"props":1521,"children":1522},{"style":574},[1523],{"type":65,"value":662},{"type":60,"tag":118,"props":1525,"children":1526},{},[1527,1535,1540,1545],{"type":60,"tag":122,"props":1528,"children":1529},{},[1530,1531],{"type":65,"value":887},{"type":60,"tag":105,"props":1532,"children":1533},{},[1534],{"type":65,"value":892},{"type":60,"tag":122,"props":1536,"children":1537},{},[1538],{"type":65,"value":1539},"Refresh token lifetime can vary; ~90 days is common for some user-based flows. Treat it as configuration\u002Fbehavior that can change and rely on runtime errors + re-auth fallback.",{"type":60,"tag":122,"props":1541,"children":1542},{},[1543],{"type":65,"value":1544},"Always use the latest refresh token for the next request",{"type":60,"tag":122,"props":1546,"children":1547},{},[1548],{"type":65,"value":1549},"If refresh token expires, redirect user to authorization URL to restart flow",{"type":60,"tag":388,"props":1551,"children":1553},{"id":1552},"user-level-vs-account-level-apps",[1554],{"type":65,"value":1555},"User-Level vs Account-Level Apps",{"type":60,"tag":232,"props":1557,"children":1558},{},[1559,1580],{"type":60,"tag":236,"props":1560,"children":1561},{},[1562],{"type":60,"tag":240,"props":1563,"children":1564},{},[1565,1570,1575],{"type":60,"tag":244,"props":1566,"children":1567},{},[1568],{"type":65,"value":1569},"Type",{"type":60,"tag":244,"props":1571,"children":1572},{},[1573],{"type":65,"value":1574},"Who Can Authorize",{"type":60,"tag":244,"props":1576,"children":1577},{},[1578],{"type":65,"value":1579},"Scope Access",{"type":60,"tag":265,"props":1581,"children":1582},{},[1583,1604],{"type":60,"tag":240,"props":1584,"children":1585},{},[1586,1594,1599],{"type":60,"tag":272,"props":1587,"children":1588},{},[1589],{"type":60,"tag":105,"props":1590,"children":1591},{},[1592],{"type":65,"value":1593},"User-level",{"type":60,"tag":272,"props":1595,"children":1596},{},[1597],{"type":65,"value":1598},"Any individual user",{"type":60,"tag":272,"props":1600,"children":1601},{},[1602],{"type":65,"value":1603},"Scoped to themselves",{"type":60,"tag":240,"props":1605,"children":1606},{},[1607,1615,1620],{"type":60,"tag":272,"props":1608,"children":1609},{},[1610],{"type":60,"tag":105,"props":1611,"children":1612},{},[1613],{"type":65,"value":1614},"Account-level",{"type":60,"tag":272,"props":1616,"children":1617},{},[1618],{"type":65,"value":1619},"User with admin permissions",{"type":60,"tag":272,"props":1621,"children":1622},{},[1623],{"type":65,"value":1624},"Account-wide access (admin scopes)",{"type":60,"tag":531,"props":1626,"children":1627},{},[],{"type":60,"tag":93,"props":1629,"children":1631},{"id":1630},"device-authorization-device-flow",[1632],{"type":65,"value":1633},"Device Authorization (Device Flow)",{"type":60,"tag":68,"props":1635,"children":1636},{},[1637],{"type":65,"value":1638},"For devices without browsers (e.g., Meeting SDK apps).",{"type":60,"tag":388,"props":1640,"children":1642},{"id":1641},"prerequisites-1",[1643],{"type":65,"value":198},{"type":60,"tag":68,"props":1645,"children":1646},{},[1647],{"type":65,"value":1648},"Enable \"Use App on Device\" in: Features > Embed > Enable Meeting SDK",{"type":60,"tag":388,"props":1650,"children":1652},{"id":1651},"step-1-request-device-code",[1653],{"type":65,"value":1654},"Step 1: Request Device Code",{"type":60,"tag":519,"props":1656,"children":1658},{"className":553,"code":1657,"language":555,"meta":527,"style":527},"POST https:\u002F\u002Fzoom.us\u002Foauth\u002Fdevicecode?client_id={CLIENT_ID}\n\nHeaders:\nAuthorization: Basic {Base64(ClientID:ClientSecret)}\n",[1659],{"type":60,"tag":74,"props":1660,"children":1661},{"__ignoreMap":527},[1662,1674,1681,1688],{"type":60,"tag":561,"props":1663,"children":1664},{"class":563,"line":564},[1665,1669],{"type":60,"tag":561,"props":1666,"children":1667},{"style":568},[1668],{"type":65,"value":571},{"type":60,"tag":561,"props":1670,"children":1671},{"style":574},[1672],{"type":65,"value":1673}," https:\u002F\u002Fzoom.us\u002Foauth\u002Fdevicecode?client_id={CLIENT_ID}\n",{"type":60,"tag":561,"props":1675,"children":1676},{"class":563,"line":607},[1677],{"type":60,"tag":561,"props":1678,"children":1679},{"emptyLinePlaceholder":611},[1680],{"type":65,"value":614},{"type":60,"tag":561,"props":1682,"children":1683},{"class":563,"line":617},[1684],{"type":60,"tag":561,"props":1685,"children":1686},{"style":568},[1687],{"type":65,"value":623},{"type":60,"tag":561,"props":1689,"children":1690},{"class":563,"line":626},[1691,1695,1699,1703,1707,1711,1715],{"type":60,"tag":561,"props":1692,"children":1693},{"style":568},[1694],{"type":65,"value":632},{"type":60,"tag":561,"props":1696,"children":1697},{"style":574},[1698],{"type":65,"value":637},{"type":60,"tag":561,"props":1700,"children":1701},{"style":574},[1702],{"type":65,"value":642},{"type":60,"tag":561,"props":1704,"children":1705},{"style":580},[1706],{"type":65,"value":647},{"type":60,"tag":561,"props":1708,"children":1709},{"style":568},[1710],{"type":65,"value":652},{"type":60,"tag":561,"props":1712,"children":1713},{"style":580},[1714],{"type":65,"value":657},{"type":60,"tag":561,"props":1716,"children":1717},{"style":574},[1718],{"type":65,"value":662},{"type":60,"tag":388,"props":1720,"children":1722},{"id":1721},"response-2",[1723],{"type":65,"value":668},{"type":60,"tag":519,"props":1725,"children":1727},{"className":671,"code":1726,"language":673,"meta":527,"style":527},"{\n  \"device_code\": \"DEVICE_CODE\",\n  \"user_code\": \"abcd1234\",\n  \"verification_uri\": \"https:\u002F\u002Fzoom.us\u002Foauth_device\",\n  \"verification_uri_complete\": \"https:\u002F\u002Fzoom.us\u002Foauth\u002Fdevice\u002Fcomplete\u002F{CODE}\",\n  \"expires_in\": 900,\n  \"interval\": 5\n}\n",[1728],{"type":60,"tag":74,"props":1729,"children":1730},{"__ignoreMap":527},[1731,1738,1775,1812,1849,1886,1914,1939],{"type":60,"tag":561,"props":1732,"children":1733},{"class":563,"line":564},[1734],{"type":60,"tag":561,"props":1735,"children":1736},{"style":580},[1737],{"type":65,"value":685},{"type":60,"tag":561,"props":1739,"children":1740},{"class":563,"line":607},[1741,1745,1750,1754,1758,1762,1767,1771],{"type":60,"tag":561,"props":1742,"children":1743},{"style":580},[1744],{"type":65,"value":693},{"type":60,"tag":561,"props":1746,"children":1747},{"style":696},[1748],{"type":65,"value":1749},"device_code",{"type":60,"tag":561,"props":1751,"children":1752},{"style":580},[1753],{"type":65,"value":704},{"type":60,"tag":561,"props":1755,"children":1756},{"style":580},[1757],{"type":65,"value":709},{"type":60,"tag":561,"props":1759,"children":1760},{"style":580},[1761],{"type":65,"value":714},{"type":60,"tag":561,"props":1763,"children":1764},{"style":574},[1765],{"type":65,"value":1766},"DEVICE_CODE",{"type":60,"tag":561,"props":1768,"children":1769},{"style":580},[1770],{"type":65,"value":704},{"type":60,"tag":561,"props":1772,"children":1773},{"style":580},[1774],{"type":65,"value":728},{"type":60,"tag":561,"props":1776,"children":1777},{"class":563,"line":617},[1778,1782,1787,1791,1795,1799,1804,1808],{"type":60,"tag":561,"props":1779,"children":1780},{"style":580},[1781],{"type":65,"value":693},{"type":60,"tag":561,"props":1783,"children":1784},{"style":696},[1785],{"type":65,"value":1786},"user_code",{"type":60,"tag":561,"props":1788,"children":1789},{"style":580},[1790],{"type":65,"value":704},{"type":60,"tag":561,"props":1792,"children":1793},{"style":580},[1794],{"type":65,"value":709},{"type":60,"tag":561,"props":1796,"children":1797},{"style":580},[1798],{"type":65,"value":714},{"type":60,"tag":561,"props":1800,"children":1801},{"style":574},[1802],{"type":65,"value":1803},"abcd1234",{"type":60,"tag":561,"props":1805,"children":1806},{"style":580},[1807],{"type":65,"value":704},{"type":60,"tag":561,"props":1809,"children":1810},{"style":580},[1811],{"type":65,"value":728},{"type":60,"tag":561,"props":1813,"children":1814},{"class":563,"line":626},[1815,1819,1824,1828,1832,1836,1841,1845],{"type":60,"tag":561,"props":1816,"children":1817},{"style":580},[1818],{"type":65,"value":693},{"type":60,"tag":561,"props":1820,"children":1821},{"style":696},[1822],{"type":65,"value":1823},"verification_uri",{"type":60,"tag":561,"props":1825,"children":1826},{"style":580},[1827],{"type":65,"value":704},{"type":60,"tag":561,"props":1829,"children":1830},{"style":580},[1831],{"type":65,"value":709},{"type":60,"tag":561,"props":1833,"children":1834},{"style":580},[1835],{"type":65,"value":714},{"type":60,"tag":561,"props":1837,"children":1838},{"style":574},[1839],{"type":65,"value":1840},"https:\u002F\u002Fzoom.us\u002Foauth_device",{"type":60,"tag":561,"props":1842,"children":1843},{"style":580},[1844],{"type":65,"value":704},{"type":60,"tag":561,"props":1846,"children":1847},{"style":580},[1848],{"type":65,"value":728},{"type":60,"tag":561,"props":1850,"children":1851},{"class":563,"line":798},[1852,1856,1861,1865,1869,1873,1878,1882],{"type":60,"tag":561,"props":1853,"children":1854},{"style":580},[1855],{"type":65,"value":693},{"type":60,"tag":561,"props":1857,"children":1858},{"style":696},[1859],{"type":65,"value":1860},"verification_uri_complete",{"type":60,"tag":561,"props":1862,"children":1863},{"style":580},[1864],{"type":65,"value":704},{"type":60,"tag":561,"props":1866,"children":1867},{"style":580},[1868],{"type":65,"value":709},{"type":60,"tag":561,"props":1870,"children":1871},{"style":580},[1872],{"type":65,"value":714},{"type":60,"tag":561,"props":1874,"children":1875},{"style":574},[1876],{"type":65,"value":1877},"https:\u002F\u002Fzoom.us\u002Foauth\u002Fdevice\u002Fcomplete\u002F{CODE}",{"type":60,"tag":561,"props":1879,"children":1880},{"style":580},[1881],{"type":65,"value":704},{"type":60,"tag":561,"props":1883,"children":1884},{"style":580},[1885],{"type":65,"value":728},{"type":60,"tag":561,"props":1887,"children":1888},{"class":563,"line":836},[1889,1893,1897,1901,1905,1910],{"type":60,"tag":561,"props":1890,"children":1891},{"style":580},[1892],{"type":65,"value":693},{"type":60,"tag":561,"props":1894,"children":1895},{"style":696},[1896],{"type":65,"value":777},{"type":60,"tag":561,"props":1898,"children":1899},{"style":580},[1900],{"type":65,"value":704},{"type":60,"tag":561,"props":1902,"children":1903},{"style":580},[1904],{"type":65,"value":709},{"type":60,"tag":561,"props":1906,"children":1907},{"style":788},[1908],{"type":65,"value":1909}," 900",{"type":60,"tag":561,"props":1911,"children":1912},{"style":580},[1913],{"type":65,"value":728},{"type":60,"tag":561,"props":1915,"children":1916},{"class":563,"line":871},[1917,1921,1926,1930,1934],{"type":60,"tag":561,"props":1918,"children":1919},{"style":580},[1920],{"type":65,"value":693},{"type":60,"tag":561,"props":1922,"children":1923},{"style":696},[1924],{"type":65,"value":1925},"interval",{"type":60,"tag":561,"props":1927,"children":1928},{"style":580},[1929],{"type":65,"value":704},{"type":60,"tag":561,"props":1931,"children":1932},{"style":580},[1933],{"type":65,"value":709},{"type":60,"tag":561,"props":1935,"children":1936},{"style":788},[1937],{"type":65,"value":1938}," 5\n",{"type":60,"tag":561,"props":1940,"children":1941},{"class":563,"line":1427},[1942],{"type":60,"tag":561,"props":1943,"children":1944},{"style":580},[1945],{"type":65,"value":662},{"type":60,"tag":388,"props":1947,"children":1949},{"id":1948},"step-2-user-authorization",[1950],{"type":65,"value":1951},"Step 2: User Authorization",{"type":60,"tag":68,"props":1953,"children":1954},{},[1955],{"type":65,"value":1956},"Direct user to:",{"type":60,"tag":118,"props":1958,"children":1959},{},[1960,1977],{"type":60,"tag":122,"props":1961,"children":1962},{},[1963,1968,1970,1975],{"type":60,"tag":74,"props":1964,"children":1966},{"className":1965},[],[1967],{"type":65,"value":1823},{"type":65,"value":1969}," and display ",{"type":60,"tag":74,"props":1971,"children":1973},{"className":1972},[],[1974],{"type":65,"value":1786},{"type":65,"value":1976}," for manual entry, OR",{"type":60,"tag":122,"props":1978,"children":1979},{},[1980,1985],{"type":60,"tag":74,"props":1981,"children":1983},{"className":1982},[],[1984],{"type":65,"value":1860},{"type":65,"value":1986}," (user code prefilled)",{"type":60,"tag":68,"props":1988,"children":1989},{},[1990],{"type":65,"value":1991},"User signs in and allows the app.",{"type":60,"tag":388,"props":1993,"children":1995},{"id":1994},"step-3-poll-for-token",[1996],{"type":65,"value":1997},"Step 3: Poll for Token",{"type":60,"tag":68,"props":1999,"children":2000},{},[2001,2003,2008],{"type":65,"value":2002},"Poll at the ",{"type":60,"tag":74,"props":2004,"children":2006},{"className":2005},[],[2007],{"type":65,"value":1925},{"type":65,"value":2009}," (5 seconds) until user authorizes:",{"type":60,"tag":519,"props":2011,"children":2013},{"className":553,"code":2012,"language":555,"meta":527,"style":527},"POST https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code={DEVICE_CODE}\n\nHeaders:\nAuthorization: Basic {Base64(ClientID:ClientSecret)}\n",[2014],{"type":60,"tag":74,"props":2015,"children":2016},{"__ignoreMap":527},[2017,2050,2057,2064],{"type":60,"tag":561,"props":2018,"children":2019},{"class":563,"line":564},[2020,2024,2029,2033,2037,2041,2045],{"type":60,"tag":561,"props":2021,"children":2022},{"style":568},[2023],{"type":65,"value":571},{"type":60,"tag":561,"props":2025,"children":2026},{"style":574},[2027],{"type":65,"value":2028}," https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=urn:ietf:params:oauth:grant-type:device_code",{"type":60,"tag":561,"props":2030,"children":2031},{"style":580},[2032],{"type":65,"value":583},{"type":60,"tag":561,"props":2034,"children":2035},{"style":586},[2036],{"type":65,"value":1749},{"type":60,"tag":561,"props":2038,"children":2039},{"style":580},[2040],{"type":65,"value":594},{"type":60,"tag":561,"props":2042,"children":2043},{"style":586},[2044],{"type":65,"value":599},{"type":60,"tag":561,"props":2046,"children":2047},{"style":568},[2048],{"type":65,"value":2049},"DEVICE_CODE}\n",{"type":60,"tag":561,"props":2051,"children":2052},{"class":563,"line":607},[2053],{"type":60,"tag":561,"props":2054,"children":2055},{"emptyLinePlaceholder":611},[2056],{"type":65,"value":614},{"type":60,"tag":561,"props":2058,"children":2059},{"class":563,"line":617},[2060],{"type":60,"tag":561,"props":2061,"children":2062},{"style":568},[2063],{"type":65,"value":623},{"type":60,"tag":561,"props":2065,"children":2066},{"class":563,"line":626},[2067,2071,2075,2079,2083,2087,2091],{"type":60,"tag":561,"props":2068,"children":2069},{"style":568},[2070],{"type":65,"value":632},{"type":60,"tag":561,"props":2072,"children":2073},{"style":574},[2074],{"type":65,"value":637},{"type":60,"tag":561,"props":2076,"children":2077},{"style":574},[2078],{"type":65,"value":642},{"type":60,"tag":561,"props":2080,"children":2081},{"style":580},[2082],{"type":65,"value":647},{"type":60,"tag":561,"props":2084,"children":2085},{"style":568},[2086],{"type":65,"value":652},{"type":60,"tag":561,"props":2088,"children":2089},{"style":580},[2090],{"type":65,"value":657},{"type":60,"tag":561,"props":2092,"children":2093},{"style":574},[2094],{"type":65,"value":662},{"type":60,"tag":388,"props":2096,"children":2098},{"id":2097},"response-3",[2099],{"type":65,"value":668},{"type":60,"tag":519,"props":2101,"children":2103},{"className":671,"code":2102,"language":673,"meta":527,"style":527},"{\n  \"access_token\": \"eyJ...\",\n  \"token_type\": \"bearer\",\n  \"refresh_token\": \"eyJ...\",\n  \"expires_in\": 3599,\n  \"scope\": \"user:read:user user:read:token\",\n  \"api_url\": \"https:\u002F\u002Fapi.zoom.us\"\n}\n",[2104],{"type":60,"tag":74,"props":2105,"children":2106},{"__ignoreMap":527},[2107,2114,2149,2184,2219,2247,2283,2314],{"type":60,"tag":561,"props":2108,"children":2109},{"class":563,"line":564},[2110],{"type":60,"tag":561,"props":2111,"children":2112},{"style":580},[2113],{"type":65,"value":685},{"type":60,"tag":561,"props":2115,"children":2116},{"class":563,"line":607},[2117,2121,2125,2129,2133,2137,2141,2145],{"type":60,"tag":561,"props":2118,"children":2119},{"style":580},[2120],{"type":65,"value":693},{"type":60,"tag":561,"props":2122,"children":2123},{"style":696},[2124],{"type":65,"value":699},{"type":60,"tag":561,"props":2126,"children":2127},{"style":580},[2128],{"type":65,"value":704},{"type":60,"tag":561,"props":2130,"children":2131},{"style":580},[2132],{"type":65,"value":709},{"type":60,"tag":561,"props":2134,"children":2135},{"style":580},[2136],{"type":65,"value":714},{"type":60,"tag":561,"props":2138,"children":2139},{"style":574},[2140],{"type":65,"value":719},{"type":60,"tag":561,"props":2142,"children":2143},{"style":580},[2144],{"type":65,"value":704},{"type":60,"tag":561,"props":2146,"children":2147},{"style":580},[2148],{"type":65,"value":728},{"type":60,"tag":561,"props":2150,"children":2151},{"class":563,"line":617},[2152,2156,2160,2164,2168,2172,2176,2180],{"type":60,"tag":561,"props":2153,"children":2154},{"style":580},[2155],{"type":65,"value":693},{"type":60,"tag":561,"props":2157,"children":2158},{"style":696},[2159],{"type":65,"value":740},{"type":60,"tag":561,"props":2161,"children":2162},{"style":580},[2163],{"type":65,"value":704},{"type":60,"tag":561,"props":2165,"children":2166},{"style":580},[2167],{"type":65,"value":709},{"type":60,"tag":561,"props":2169,"children":2170},{"style":580},[2171],{"type":65,"value":714},{"type":60,"tag":561,"props":2173,"children":2174},{"style":574},[2175],{"type":65,"value":757},{"type":60,"tag":561,"props":2177,"children":2178},{"style":580},[2179],{"type":65,"value":704},{"type":60,"tag":561,"props":2181,"children":2182},{"style":580},[2183],{"type":65,"value":728},{"type":60,"tag":561,"props":2185,"children":2186},{"class":563,"line":626},[2187,2191,2195,2199,2203,2207,2211,2215],{"type":60,"tag":561,"props":2188,"children":2189},{"style":580},[2190],{"type":65,"value":693},{"type":60,"tag":561,"props":2192,"children":2193},{"style":696},[2194],{"type":65,"value":1306},{"type":60,"tag":561,"props":2196,"children":2197},{"style":580},[2198],{"type":65,"value":704},{"type":60,"tag":561,"props":2200,"children":2201},{"style":580},[2202],{"type":65,"value":709},{"type":60,"tag":561,"props":2204,"children":2205},{"style":580},[2206],{"type":65,"value":714},{"type":60,"tag":561,"props":2208,"children":2209},{"style":574},[2210],{"type":65,"value":719},{"type":60,"tag":561,"props":2212,"children":2213},{"style":580},[2214],{"type":65,"value":704},{"type":60,"tag":561,"props":2216,"children":2217},{"style":580},[2218],{"type":65,"value":728},{"type":60,"tag":561,"props":2220,"children":2221},{"class":563,"line":798},[2222,2226,2230,2234,2238,2243],{"type":60,"tag":561,"props":2223,"children":2224},{"style":580},[2225],{"type":65,"value":693},{"type":60,"tag":561,"props":2227,"children":2228},{"style":696},[2229],{"type":65,"value":777},{"type":60,"tag":561,"props":2231,"children":2232},{"style":580},[2233],{"type":65,"value":704},{"type":60,"tag":561,"props":2235,"children":2236},{"style":580},[2237],{"type":65,"value":709},{"type":60,"tag":561,"props":2239,"children":2240},{"style":788},[2241],{"type":65,"value":2242}," 3599",{"type":60,"tag":561,"props":2244,"children":2245},{"style":580},[2246],{"type":65,"value":728},{"type":60,"tag":561,"props":2248,"children":2249},{"class":563,"line":836},[2250,2254,2258,2262,2266,2270,2275,2279],{"type":60,"tag":561,"props":2251,"children":2252},{"style":580},[2253],{"type":65,"value":693},{"type":60,"tag":561,"props":2255,"children":2256},{"style":696},[2257],{"type":65,"value":808},{"type":60,"tag":561,"props":2259,"children":2260},{"style":580},[2261],{"type":65,"value":704},{"type":60,"tag":561,"props":2263,"children":2264},{"style":580},[2265],{"type":65,"value":709},{"type":60,"tag":561,"props":2267,"children":2268},{"style":580},[2269],{"type":65,"value":714},{"type":60,"tag":561,"props":2271,"children":2272},{"style":574},[2273],{"type":65,"value":2274},"user:read:user user:read:token",{"type":60,"tag":561,"props":2276,"children":2277},{"style":580},[2278],{"type":65,"value":704},{"type":60,"tag":561,"props":2280,"children":2281},{"style":580},[2282],{"type":65,"value":728},{"type":60,"tag":561,"props":2284,"children":2285},{"class":563,"line":871},[2286,2290,2294,2298,2302,2306,2310],{"type":60,"tag":561,"props":2287,"children":2288},{"style":580},[2289],{"type":65,"value":693},{"type":60,"tag":561,"props":2291,"children":2292},{"style":696},[2293],{"type":65,"value":846},{"type":60,"tag":561,"props":2295,"children":2296},{"style":580},[2297],{"type":65,"value":704},{"type":60,"tag":561,"props":2299,"children":2300},{"style":580},[2301],{"type":65,"value":709},{"type":60,"tag":561,"props":2303,"children":2304},{"style":580},[2305],{"type":65,"value":714},{"type":60,"tag":561,"props":2307,"children":2308},{"style":574},[2309],{"type":65,"value":863},{"type":60,"tag":561,"props":2311,"children":2312},{"style":580},[2313],{"type":65,"value":868},{"type":60,"tag":561,"props":2315,"children":2316},{"class":563,"line":1427},[2317],{"type":60,"tag":561,"props":2318,"children":2319},{"style":580},[2320],{"type":65,"value":662},{"type":60,"tag":388,"props":2322,"children":2324},{"id":2323},"polling-responses",[2325],{"type":65,"value":2326},"Polling Responses",{"type":60,"tag":232,"props":2328,"children":2329},{},[2330,2349],{"type":60,"tag":236,"props":2331,"children":2332},{},[2333],{"type":60,"tag":240,"props":2334,"children":2335},{},[2336,2340,2344],{"type":60,"tag":244,"props":2337,"children":2338},{},[2339],{"type":65,"value":668},{"type":60,"tag":244,"props":2341,"children":2342},{},[2343],{"type":65,"value":412},{"type":60,"tag":244,"props":2345,"children":2346},{},[2347],{"type":65,"value":2348},"Action",{"type":60,"tag":265,"props":2350,"children":2351},{},[2352,2370,2392,2414,2436],{"type":60,"tag":240,"props":2353,"children":2354},{},[2355,2360,2365],{"type":60,"tag":272,"props":2356,"children":2357},{},[2358],{"type":65,"value":2359},"Token returned",{"type":60,"tag":272,"props":2361,"children":2362},{},[2363],{"type":65,"value":2364},"User authorized",{"type":60,"tag":272,"props":2366,"children":2367},{},[2368],{"type":65,"value":2369},"Store tokens, done",{"type":60,"tag":240,"props":2371,"children":2372},{},[2373,2382,2387],{"type":60,"tag":272,"props":2374,"children":2375},{},[2376],{"type":60,"tag":74,"props":2377,"children":2379},{"className":2378},[],[2380],{"type":65,"value":2381},"error: authorization_pending",{"type":60,"tag":272,"props":2383,"children":2384},{},[2385],{"type":65,"value":2386},"User hasn't authorized yet",{"type":60,"tag":272,"props":2388,"children":2389},{},[2390],{"type":65,"value":2391},"Keep polling at interval",{"type":60,"tag":240,"props":2393,"children":2394},{},[2395,2404,2409],{"type":60,"tag":272,"props":2396,"children":2397},{},[2398],{"type":60,"tag":74,"props":2399,"children":2401},{"className":2400},[],[2402],{"type":65,"value":2403},"error: slow_down",{"type":60,"tag":272,"props":2405,"children":2406},{},[2407],{"type":65,"value":2408},"Polling too fast",{"type":60,"tag":272,"props":2410,"children":2411},{},[2412],{"type":65,"value":2413},"Increase interval by 5 seconds",{"type":60,"tag":240,"props":2415,"children":2416},{},[2417,2426,2431],{"type":60,"tag":272,"props":2418,"children":2419},{},[2420],{"type":60,"tag":74,"props":2421,"children":2423},{"className":2422},[],[2424],{"type":65,"value":2425},"error: expired_token",{"type":60,"tag":272,"props":2427,"children":2428},{},[2429],{"type":65,"value":2430},"Device code expired (15 min)",{"type":60,"tag":272,"props":2432,"children":2433},{},[2434],{"type":65,"value":2435},"Restart flow from Step 1",{"type":60,"tag":240,"props":2437,"children":2438},{},[2439,2448,2453],{"type":60,"tag":272,"props":2440,"children":2441},{},[2442],{"type":60,"tag":74,"props":2443,"children":2445},{"className":2444},[],[2446],{"type":65,"value":2447},"error: access_denied",{"type":60,"tag":272,"props":2449,"children":2450},{},[2451],{"type":65,"value":2452},"User denied authorization",{"type":60,"tag":272,"props":2454,"children":2455},{},[2456],{"type":65,"value":2457},"Handle denial, don't retry",{"type":60,"tag":388,"props":2459,"children":2461},{"id":2460},"polling-implementation",[2462],{"type":65,"value":2463},"Polling Implementation",{"type":60,"tag":519,"props":2465,"children":2469},{"className":2466,"code":2467,"language":2468,"meta":527,"style":527},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","async function pollForToken(deviceCode, interval) {\n  while (true) {\n    await sleep(interval * 1000);\n    \n    try {\n      const response = await axios.post(\n        `https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code=${deviceCode}`,\n        null,\n        { headers: { 'Authorization': `Basic ${credentials}` } }\n      );\n      return response.data; \u002F\u002F Success - got tokens\n    } catch (error) {\n      const err = error.response?.data?.error;\n      if (err === 'authorization_pending') continue;\n      if (err === 'slow_down') { interval += 5; continue; }\n      throw error; \u002F\u002F expired_token or access_denied\n    }\n  }\n}\n","javascript",[2470],{"type":60,"tag":74,"props":2471,"children":2472},{"__ignoreMap":527},[2473,2521,2551,2591,2599,2611,2653,2684,2692,2767,2780,2813,2844,2895,2944,3016,3038,3047,3056],{"type":60,"tag":561,"props":2474,"children":2475},{"class":563,"line":564},[2476,2481,2486,2492,2496,2502,2507,2512,2516],{"type":60,"tag":561,"props":2477,"children":2478},{"style":696},[2479],{"type":65,"value":2480},"async",{"type":60,"tag":561,"props":2482,"children":2483},{"style":696},[2484],{"type":65,"value":2485}," function",{"type":60,"tag":561,"props":2487,"children":2489},{"style":2488},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[2490],{"type":65,"value":2491}," pollForToken",{"type":60,"tag":561,"props":2493,"children":2494},{"style":580},[2495],{"type":65,"value":647},{"type":60,"tag":561,"props":2497,"children":2499},{"style":2498},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[2500],{"type":65,"value":2501},"deviceCode",{"type":60,"tag":561,"props":2503,"children":2504},{"style":580},[2505],{"type":65,"value":2506},",",{"type":60,"tag":561,"props":2508,"children":2509},{"style":2498},[2510],{"type":65,"value":2511}," interval",{"type":60,"tag":561,"props":2513,"children":2514},{"style":580},[2515],{"type":65,"value":657},{"type":60,"tag":561,"props":2517,"children":2518},{"style":580},[2519],{"type":65,"value":2520}," {\n",{"type":60,"tag":561,"props":2522,"children":2523},{"class":563,"line":607},[2524,2530,2536,2542,2547],{"type":60,"tag":561,"props":2525,"children":2527},{"style":2526},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[2528],{"type":65,"value":2529},"  while",{"type":60,"tag":561,"props":2531,"children":2533},{"style":2532},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[2534],{"type":65,"value":2535}," (",{"type":60,"tag":561,"props":2537,"children":2539},{"style":2538},"--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC",[2540],{"type":65,"value":2541},"true",{"type":60,"tag":561,"props":2543,"children":2544},{"style":2532},[2545],{"type":65,"value":2546},") ",{"type":60,"tag":561,"props":2548,"children":2549},{"style":580},[2550],{"type":65,"value":685},{"type":60,"tag":561,"props":2552,"children":2553},{"class":563,"line":617},[2554,2559,2564,2568,2572,2577,2582,2586],{"type":60,"tag":561,"props":2555,"children":2556},{"style":2526},[2557],{"type":65,"value":2558},"    await",{"type":60,"tag":561,"props":2560,"children":2561},{"style":2488},[2562],{"type":65,"value":2563}," sleep",{"type":60,"tag":561,"props":2565,"children":2566},{"style":2532},[2567],{"type":65,"value":647},{"type":60,"tag":561,"props":2569,"children":2570},{"style":586},[2571],{"type":65,"value":1925},{"type":60,"tag":561,"props":2573,"children":2574},{"style":580},[2575],{"type":65,"value":2576}," *",{"type":60,"tag":561,"props":2578,"children":2579},{"style":788},[2580],{"type":65,"value":2581}," 1000",{"type":60,"tag":561,"props":2583,"children":2584},{"style":2532},[2585],{"type":65,"value":657},{"type":60,"tag":561,"props":2587,"children":2588},{"style":580},[2589],{"type":65,"value":2590},";\n",{"type":60,"tag":561,"props":2592,"children":2593},{"class":563,"line":626},[2594],{"type":60,"tag":561,"props":2595,"children":2596},{"style":2532},[2597],{"type":65,"value":2598},"    \n",{"type":60,"tag":561,"props":2600,"children":2601},{"class":563,"line":798},[2602,2607],{"type":60,"tag":561,"props":2603,"children":2604},{"style":2526},[2605],{"type":65,"value":2606},"    try",{"type":60,"tag":561,"props":2608,"children":2609},{"style":580},[2610],{"type":65,"value":2520},{"type":60,"tag":561,"props":2612,"children":2613},{"class":563,"line":836},[2614,2619,2624,2629,2634,2639,2643,2648],{"type":60,"tag":561,"props":2615,"children":2616},{"style":696},[2617],{"type":65,"value":2618},"      const",{"type":60,"tag":561,"props":2620,"children":2621},{"style":586},[2622],{"type":65,"value":2623}," response",{"type":60,"tag":561,"props":2625,"children":2626},{"style":580},[2627],{"type":65,"value":2628}," =",{"type":60,"tag":561,"props":2630,"children":2631},{"style":2526},[2632],{"type":65,"value":2633}," await",{"type":60,"tag":561,"props":2635,"children":2636},{"style":586},[2637],{"type":65,"value":2638}," axios",{"type":60,"tag":561,"props":2640,"children":2641},{"style":580},[2642],{"type":65,"value":111},{"type":60,"tag":561,"props":2644,"children":2645},{"style":2488},[2646],{"type":65,"value":2647},"post",{"type":60,"tag":561,"props":2649,"children":2650},{"style":2532},[2651],{"type":65,"value":2652},"(\n",{"type":60,"tag":561,"props":2654,"children":2655},{"class":563,"line":871},[2656,2661,2666,2671,2675,2680],{"type":60,"tag":561,"props":2657,"children":2658},{"style":580},[2659],{"type":65,"value":2660},"        `",{"type":60,"tag":561,"props":2662,"children":2663},{"style":574},[2664],{"type":65,"value":2665},"https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code=",{"type":60,"tag":561,"props":2667,"children":2668},{"style":580},[2669],{"type":65,"value":2670},"${",{"type":60,"tag":561,"props":2672,"children":2673},{"style":586},[2674],{"type":65,"value":2501},{"type":60,"tag":561,"props":2676,"children":2677},{"style":580},[2678],{"type":65,"value":2679},"}`",{"type":60,"tag":561,"props":2681,"children":2682},{"style":580},[2683],{"type":65,"value":728},{"type":60,"tag":561,"props":2685,"children":2686},{"class":563,"line":1427},[2687],{"type":60,"tag":561,"props":2688,"children":2689},{"style":580},[2690],{"type":65,"value":2691},"        null,\n",{"type":60,"tag":561,"props":2693,"children":2695},{"class":563,"line":2694},9,[2696,2701,2706,2710,2715,2720,2725,2730,2734,2739,2744,2748,2753,2757,2762],{"type":60,"tag":561,"props":2697,"children":2698},{"style":580},[2699],{"type":65,"value":2700},"        {",{"type":60,"tag":561,"props":2702,"children":2703},{"style":2532},[2704],{"type":65,"value":2705}," headers",{"type":60,"tag":561,"props":2707,"children":2708},{"style":580},[2709],{"type":65,"value":709},{"type":60,"tag":561,"props":2711,"children":2712},{"style":580},[2713],{"type":65,"value":2714}," {",{"type":60,"tag":561,"props":2716,"children":2717},{"style":580},[2718],{"type":65,"value":2719}," '",{"type":60,"tag":561,"props":2721,"children":2722},{"style":2532},[2723],{"type":65,"value":2724},"Authorization",{"type":60,"tag":561,"props":2726,"children":2727},{"style":580},[2728],{"type":65,"value":2729},"'",{"type":60,"tag":561,"props":2731,"children":2732},{"style":580},[2733],{"type":65,"value":709},{"type":60,"tag":561,"props":2735,"children":2736},{"style":580},[2737],{"type":65,"value":2738}," `",{"type":60,"tag":561,"props":2740,"children":2741},{"style":574},[2742],{"type":65,"value":2743},"Basic ",{"type":60,"tag":561,"props":2745,"children":2746},{"style":580},[2747],{"type":65,"value":2670},{"type":60,"tag":561,"props":2749,"children":2750},{"style":586},[2751],{"type":65,"value":2752},"credentials",{"type":60,"tag":561,"props":2754,"children":2755},{"style":580},[2756],{"type":65,"value":2679},{"type":60,"tag":561,"props":2758,"children":2759},{"style":580},[2760],{"type":65,"value":2761}," }",{"type":60,"tag":561,"props":2763,"children":2764},{"style":580},[2765],{"type":65,"value":2766}," }\n",{"type":60,"tag":561,"props":2768,"children":2770},{"class":563,"line":2769},10,[2771,2776],{"type":60,"tag":561,"props":2772,"children":2773},{"style":2532},[2774],{"type":65,"value":2775},"      )",{"type":60,"tag":561,"props":2777,"children":2778},{"style":580},[2779],{"type":65,"value":2590},{"type":60,"tag":561,"props":2781,"children":2783},{"class":563,"line":2782},11,[2784,2789,2793,2797,2802,2807],{"type":60,"tag":561,"props":2785,"children":2786},{"style":2526},[2787],{"type":65,"value":2788},"      return",{"type":60,"tag":561,"props":2790,"children":2791},{"style":586},[2792],{"type":65,"value":2623},{"type":60,"tag":561,"props":2794,"children":2795},{"style":580},[2796],{"type":65,"value":111},{"type":60,"tag":561,"props":2798,"children":2799},{"style":586},[2800],{"type":65,"value":2801},"data",{"type":60,"tag":561,"props":2803,"children":2804},{"style":580},[2805],{"type":65,"value":2806},";",{"type":60,"tag":561,"props":2808,"children":2810},{"style":2809},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[2811],{"type":65,"value":2812}," \u002F\u002F Success - got tokens\n",{"type":60,"tag":561,"props":2814,"children":2816},{"class":563,"line":2815},12,[2817,2822,2827,2831,2836,2840],{"type":60,"tag":561,"props":2818,"children":2819},{"style":580},[2820],{"type":65,"value":2821},"    }",{"type":60,"tag":561,"props":2823,"children":2824},{"style":2526},[2825],{"type":65,"value":2826}," catch",{"type":60,"tag":561,"props":2828,"children":2829},{"style":2532},[2830],{"type":65,"value":2535},{"type":60,"tag":561,"props":2832,"children":2833},{"style":586},[2834],{"type":65,"value":2835},"error",{"type":60,"tag":561,"props":2837,"children":2838},{"style":2532},[2839],{"type":65,"value":2546},{"type":60,"tag":561,"props":2841,"children":2842},{"style":580},[2843],{"type":65,"value":685},{"type":60,"tag":561,"props":2845,"children":2847},{"class":563,"line":2846},13,[2848,2852,2857,2861,2866,2870,2874,2879,2883,2887,2891],{"type":60,"tag":561,"props":2849,"children":2850},{"style":696},[2851],{"type":65,"value":2618},{"type":60,"tag":561,"props":2853,"children":2854},{"style":586},[2855],{"type":65,"value":2856}," err",{"type":60,"tag":561,"props":2858,"children":2859},{"style":580},[2860],{"type":65,"value":2628},{"type":60,"tag":561,"props":2862,"children":2863},{"style":586},[2864],{"type":65,"value":2865}," error",{"type":60,"tag":561,"props":2867,"children":2868},{"style":580},[2869],{"type":65,"value":111},{"type":60,"tag":561,"props":2871,"children":2872},{"style":586},[2873],{"type":65,"value":665},{"type":60,"tag":561,"props":2875,"children":2876},{"style":580},[2877],{"type":65,"value":2878},"?.",{"type":60,"tag":561,"props":2880,"children":2881},{"style":586},[2882],{"type":65,"value":2801},{"type":60,"tag":561,"props":2884,"children":2885},{"style":580},[2886],{"type":65,"value":2878},{"type":60,"tag":561,"props":2888,"children":2889},{"style":586},[2890],{"type":65,"value":2835},{"type":60,"tag":561,"props":2892,"children":2893},{"style":580},[2894],{"type":65,"value":2590},{"type":60,"tag":561,"props":2896,"children":2898},{"class":563,"line":2897},14,[2899,2904,2908,2913,2918,2922,2927,2931,2935,2940],{"type":60,"tag":561,"props":2900,"children":2901},{"style":2526},[2902],{"type":65,"value":2903},"      if",{"type":60,"tag":561,"props":2905,"children":2906},{"style":2532},[2907],{"type":65,"value":2535},{"type":60,"tag":561,"props":2909,"children":2910},{"style":586},[2911],{"type":65,"value":2912},"err",{"type":60,"tag":561,"props":2914,"children":2915},{"style":580},[2916],{"type":65,"value":2917}," ===",{"type":60,"tag":561,"props":2919,"children":2920},{"style":580},[2921],{"type":65,"value":2719},{"type":60,"tag":561,"props":2923,"children":2924},{"style":574},[2925],{"type":65,"value":2926},"authorization_pending",{"type":60,"tag":561,"props":2928,"children":2929},{"style":580},[2930],{"type":65,"value":2729},{"type":60,"tag":561,"props":2932,"children":2933},{"style":2532},[2934],{"type":65,"value":2546},{"type":60,"tag":561,"props":2936,"children":2937},{"style":2526},[2938],{"type":65,"value":2939},"continue",{"type":60,"tag":561,"props":2941,"children":2942},{"style":580},[2943],{"type":65,"value":2590},{"type":60,"tag":561,"props":2945,"children":2947},{"class":563,"line":2946},15,[2948,2952,2956,2960,2964,2968,2973,2977,2981,2985,2989,2994,2999,3003,3008,3012],{"type":60,"tag":561,"props":2949,"children":2950},{"style":2526},[2951],{"type":65,"value":2903},{"type":60,"tag":561,"props":2953,"children":2954},{"style":2532},[2955],{"type":65,"value":2535},{"type":60,"tag":561,"props":2957,"children":2958},{"style":586},[2959],{"type":65,"value":2912},{"type":60,"tag":561,"props":2961,"children":2962},{"style":580},[2963],{"type":65,"value":2917},{"type":60,"tag":561,"props":2965,"children":2966},{"style":580},[2967],{"type":65,"value":2719},{"type":60,"tag":561,"props":2969,"children":2970},{"style":574},[2971],{"type":65,"value":2972},"slow_down",{"type":60,"tag":561,"props":2974,"children":2975},{"style":580},[2976],{"type":65,"value":2729},{"type":60,"tag":561,"props":2978,"children":2979},{"style":2532},[2980],{"type":65,"value":2546},{"type":60,"tag":561,"props":2982,"children":2983},{"style":580},[2984],{"type":65,"value":599},{"type":60,"tag":561,"props":2986,"children":2987},{"style":586},[2988],{"type":65,"value":2511},{"type":60,"tag":561,"props":2990,"children":2991},{"style":580},[2992],{"type":65,"value":2993}," +=",{"type":60,"tag":561,"props":2995,"children":2996},{"style":788},[2997],{"type":65,"value":2998}," 5",{"type":60,"tag":561,"props":3000,"children":3001},{"style":580},[3002],{"type":65,"value":2806},{"type":60,"tag":561,"props":3004,"children":3005},{"style":2526},[3006],{"type":65,"value":3007}," continue",{"type":60,"tag":561,"props":3009,"children":3010},{"style":580},[3011],{"type":65,"value":2806},{"type":60,"tag":561,"props":3013,"children":3014},{"style":580},[3015],{"type":65,"value":2766},{"type":60,"tag":561,"props":3017,"children":3019},{"class":563,"line":3018},16,[3020,3025,3029,3033],{"type":60,"tag":561,"props":3021,"children":3022},{"style":2526},[3023],{"type":65,"value":3024},"      throw",{"type":60,"tag":561,"props":3026,"children":3027},{"style":586},[3028],{"type":65,"value":2865},{"type":60,"tag":561,"props":3030,"children":3031},{"style":580},[3032],{"type":65,"value":2806},{"type":60,"tag":561,"props":3034,"children":3035},{"style":2809},[3036],{"type":65,"value":3037}," \u002F\u002F expired_token or access_denied\n",{"type":60,"tag":561,"props":3039,"children":3041},{"class":563,"line":3040},17,[3042],{"type":60,"tag":561,"props":3043,"children":3044},{"style":580},[3045],{"type":65,"value":3046},"    }\n",{"type":60,"tag":561,"props":3048,"children":3050},{"class":563,"line":3049},18,[3051],{"type":60,"tag":561,"props":3052,"children":3053},{"style":580},[3054],{"type":65,"value":3055},"  }\n",{"type":60,"tag":561,"props":3057,"children":3059},{"class":563,"line":3058},19,[3060],{"type":60,"tag":561,"props":3061,"children":3062},{"style":580},[3063],{"type":65,"value":662},{"type":60,"tag":388,"props":3065,"children":3067},{"id":3066},"refresh-1",[3068],{"type":65,"value":882},{"type":60,"tag":68,"props":3070,"children":3071},{},[3072],{"type":65,"value":3073},"Same as User Authorization. If refresh token expires, restart device flow from Step 1.",{"type":60,"tag":531,"props":3075,"children":3076},{},[],{"type":60,"tag":93,"props":3078,"children":3080},{"id":3079},"client-authorization-chatbot",[3081],{"type":65,"value":3082},"Client Authorization (Chatbot)",{"type":60,"tag":68,"props":3084,"children":3085},{},[3086],{"type":65,"value":3087},"For chatbot message operations only.",{"type":60,"tag":388,"props":3089,"children":3091},{"id":3090},"request-token",[3092],{"type":65,"value":3093},"Request Token",{"type":60,"tag":519,"props":3095,"children":3097},{"className":553,"code":3096,"language":555,"meta":527,"style":527},"POST https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=client_credentials\n\nHeaders:\nAuthorization: Basic {Base64(ClientID:ClientSecret)}\n",[3098],{"type":60,"tag":74,"props":3099,"children":3100},{"__ignoreMap":527},[3101,3113,3120,3127],{"type":60,"tag":561,"props":3102,"children":3103},{"class":563,"line":564},[3104,3108],{"type":60,"tag":561,"props":3105,"children":3106},{"style":568},[3107],{"type":65,"value":571},{"type":60,"tag":561,"props":3109,"children":3110},{"style":574},[3111],{"type":65,"value":3112}," https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=client_credentials\n",{"type":60,"tag":561,"props":3114,"children":3115},{"class":563,"line":607},[3116],{"type":60,"tag":561,"props":3117,"children":3118},{"emptyLinePlaceholder":611},[3119],{"type":65,"value":614},{"type":60,"tag":561,"props":3121,"children":3122},{"class":563,"line":617},[3123],{"type":60,"tag":561,"props":3124,"children":3125},{"style":568},[3126],{"type":65,"value":623},{"type":60,"tag":561,"props":3128,"children":3129},{"class":563,"line":626},[3130,3134,3138,3142,3146,3150,3154],{"type":60,"tag":561,"props":3131,"children":3132},{"style":568},[3133],{"type":65,"value":632},{"type":60,"tag":561,"props":3135,"children":3136},{"style":574},[3137],{"type":65,"value":637},{"type":60,"tag":561,"props":3139,"children":3140},{"style":574},[3141],{"type":65,"value":642},{"type":60,"tag":561,"props":3143,"children":3144},{"style":580},[3145],{"type":65,"value":647},{"type":60,"tag":561,"props":3147,"children":3148},{"style":568},[3149],{"type":65,"value":652},{"type":60,"tag":561,"props":3151,"children":3152},{"style":580},[3153],{"type":65,"value":657},{"type":60,"tag":561,"props":3155,"children":3156},{"style":574},[3157],{"type":65,"value":662},{"type":60,"tag":388,"props":3159,"children":3161},{"id":3160},"response-4",[3162],{"type":65,"value":668},{"type":60,"tag":519,"props":3164,"children":3166},{"className":671,"code":3165,"language":673,"meta":527,"style":527},"{\n  \"access_token\": \"eyJ...\",\n  \"token_type\": \"bearer\",\n  \"expires_in\": 3600,\n  \"scope\": \"imchat:bot\",\n  \"api_url\": \"https:\u002F\u002Fapi.zoom.us\"\n}\n",[3167],{"type":60,"tag":74,"props":3168,"children":3169},{"__ignoreMap":527},[3170,3177,3212,3247,3274,3310,3341],{"type":60,"tag":561,"props":3171,"children":3172},{"class":563,"line":564},[3173],{"type":60,"tag":561,"props":3174,"children":3175},{"style":580},[3176],{"type":65,"value":685},{"type":60,"tag":561,"props":3178,"children":3179},{"class":563,"line":607},[3180,3184,3188,3192,3196,3200,3204,3208],{"type":60,"tag":561,"props":3181,"children":3182},{"style":580},[3183],{"type":65,"value":693},{"type":60,"tag":561,"props":3185,"children":3186},{"style":696},[3187],{"type":65,"value":699},{"type":60,"tag":561,"props":3189,"children":3190},{"style":580},[3191],{"type":65,"value":704},{"type":60,"tag":561,"props":3193,"children":3194},{"style":580},[3195],{"type":65,"value":709},{"type":60,"tag":561,"props":3197,"children":3198},{"style":580},[3199],{"type":65,"value":714},{"type":60,"tag":561,"props":3201,"children":3202},{"style":574},[3203],{"type":65,"value":719},{"type":60,"tag":561,"props":3205,"children":3206},{"style":580},[3207],{"type":65,"value":704},{"type":60,"tag":561,"props":3209,"children":3210},{"style":580},[3211],{"type":65,"value":728},{"type":60,"tag":561,"props":3213,"children":3214},{"class":563,"line":617},[3215,3219,3223,3227,3231,3235,3239,3243],{"type":60,"tag":561,"props":3216,"children":3217},{"style":580},[3218],{"type":65,"value":693},{"type":60,"tag":561,"props":3220,"children":3221},{"style":696},[3222],{"type":65,"value":740},{"type":60,"tag":561,"props":3224,"children":3225},{"style":580},[3226],{"type":65,"value":704},{"type":60,"tag":561,"props":3228,"children":3229},{"style":580},[3230],{"type":65,"value":709},{"type":60,"tag":561,"props":3232,"children":3233},{"style":580},[3234],{"type":65,"value":714},{"type":60,"tag":561,"props":3236,"children":3237},{"style":574},[3238],{"type":65,"value":757},{"type":60,"tag":561,"props":3240,"children":3241},{"style":580},[3242],{"type":65,"value":704},{"type":60,"tag":561,"props":3244,"children":3245},{"style":580},[3246],{"type":65,"value":728},{"type":60,"tag":561,"props":3248,"children":3249},{"class":563,"line":626},[3250,3254,3258,3262,3266,3270],{"type":60,"tag":561,"props":3251,"children":3252},{"style":580},[3253],{"type":65,"value":693},{"type":60,"tag":561,"props":3255,"children":3256},{"style":696},[3257],{"type":65,"value":777},{"type":60,"tag":561,"props":3259,"children":3260},{"style":580},[3261],{"type":65,"value":704},{"type":60,"tag":561,"props":3263,"children":3264},{"style":580},[3265],{"type":65,"value":709},{"type":60,"tag":561,"props":3267,"children":3268},{"style":788},[3269],{"type":65,"value":791},{"type":60,"tag":561,"props":3271,"children":3272},{"style":580},[3273],{"type":65,"value":728},{"type":60,"tag":561,"props":3275,"children":3276},{"class":563,"line":798},[3277,3281,3285,3289,3293,3297,3302,3306],{"type":60,"tag":561,"props":3278,"children":3279},{"style":580},[3280],{"type":65,"value":693},{"type":60,"tag":561,"props":3282,"children":3283},{"style":696},[3284],{"type":65,"value":808},{"type":60,"tag":561,"props":3286,"children":3287},{"style":580},[3288],{"type":65,"value":704},{"type":60,"tag":561,"props":3290,"children":3291},{"style":580},[3292],{"type":65,"value":709},{"type":60,"tag":561,"props":3294,"children":3295},{"style":580},[3296],{"type":65,"value":714},{"type":60,"tag":561,"props":3298,"children":3299},{"style":574},[3300],{"type":65,"value":3301},"imchat:bot",{"type":60,"tag":561,"props":3303,"children":3304},{"style":580},[3305],{"type":65,"value":704},{"type":60,"tag":561,"props":3307,"children":3308},{"style":580},[3309],{"type":65,"value":728},{"type":60,"tag":561,"props":3311,"children":3312},{"class":563,"line":836},[3313,3317,3321,3325,3329,3333,3337],{"type":60,"tag":561,"props":3314,"children":3315},{"style":580},[3316],{"type":65,"value":693},{"type":60,"tag":561,"props":3318,"children":3319},{"style":696},[3320],{"type":65,"value":846},{"type":60,"tag":561,"props":3322,"children":3323},{"style":580},[3324],{"type":65,"value":704},{"type":60,"tag":561,"props":3326,"children":3327},{"style":580},[3328],{"type":65,"value":709},{"type":60,"tag":561,"props":3330,"children":3331},{"style":580},[3332],{"type":65,"value":714},{"type":60,"tag":561,"props":3334,"children":3335},{"style":574},[3336],{"type":65,"value":863},{"type":60,"tag":561,"props":3338,"children":3339},{"style":580},[3340],{"type":65,"value":868},{"type":60,"tag":561,"props":3342,"children":3343},{"class":563,"line":871},[3344],{"type":60,"tag":561,"props":3345,"children":3346},{"style":580},[3347],{"type":65,"value":662},{"type":60,"tag":388,"props":3349,"children":3351},{"id":3350},"refresh-2",[3352],{"type":65,"value":882},{"type":60,"tag":68,"props":3354,"children":3355},{},[3356,3358,3362],{"type":65,"value":3357},"Tokens expire after ",{"type":60,"tag":105,"props":3359,"children":3360},{},[3361],{"type":65,"value":892},{"type":65,"value":3363},". No refresh flow - just request a new token.",{"type":60,"tag":531,"props":3365,"children":3366},{},[],{"type":60,"tag":93,"props":3368,"children":3370},{"id":3369},"using-access-tokens",[3371],{"type":65,"value":3372},"Using Access Tokens",{"type":60,"tag":388,"props":3374,"children":3376},{"id":3375},"call-api",[3377],{"type":65,"value":3378},"Call API",{"type":60,"tag":519,"props":3380,"children":3382},{"className":553,"code":3381,"language":555,"meta":527,"style":527},"GET https:\u002F\u002Fapi.zoom.us\u002Fv2\u002Fusers\u002Fme\n\nHeaders:\nAuthorization: Bearer {ACCESS_TOKEN}\n",[3383],{"type":60,"tag":74,"props":3384,"children":3385},{"__ignoreMap":527},[3386,3399,3406,3413],{"type":60,"tag":561,"props":3387,"children":3388},{"class":563,"line":564},[3389,3394],{"type":60,"tag":561,"props":3390,"children":3391},{"style":568},[3392],{"type":65,"value":3393},"GET",{"type":60,"tag":561,"props":3395,"children":3396},{"style":574},[3397],{"type":65,"value":3398}," https:\u002F\u002Fapi.zoom.us\u002Fv2\u002Fusers\u002Fme\n",{"type":60,"tag":561,"props":3400,"children":3401},{"class":563,"line":607},[3402],{"type":60,"tag":561,"props":3403,"children":3404},{"emptyLinePlaceholder":611},[3405],{"type":65,"value":614},{"type":60,"tag":561,"props":3407,"children":3408},{"class":563,"line":617},[3409],{"type":60,"tag":561,"props":3410,"children":3411},{"style":568},[3412],{"type":65,"value":623},{"type":60,"tag":561,"props":3414,"children":3415},{"class":563,"line":626},[3416,3420,3425],{"type":60,"tag":561,"props":3417,"children":3418},{"style":568},[3419],{"type":65,"value":632},{"type":60,"tag":561,"props":3421,"children":3422},{"style":574},[3423],{"type":65,"value":3424}," Bearer",{"type":60,"tag":561,"props":3426,"children":3427},{"style":574},[3428],{"type":65,"value":3429}," {ACCESS_TOKEN}\n",{"type":60,"tag":388,"props":3431,"children":3433},{"id":3432},"me-context",[3434],{"type":65,"value":3435},"Me Context",{"type":60,"tag":68,"props":3437,"children":3438},{},[3439,3441,3447,3449,3455],{"type":65,"value":3440},"Replace ",{"type":60,"tag":74,"props":3442,"children":3444},{"className":3443},[],[3445],{"type":65,"value":3446},"userID",{"type":65,"value":3448}," with ",{"type":60,"tag":74,"props":3450,"children":3452},{"className":3451},[],[3453],{"type":65,"value":3454},"me",{"type":65,"value":3456}," to target the token's associated user:",{"type":60,"tag":232,"props":3458,"children":3459},{},[3460,3476],{"type":60,"tag":236,"props":3461,"children":3462},{},[3463],{"type":60,"tag":240,"props":3464,"children":3465},{},[3466,3471],{"type":60,"tag":244,"props":3467,"children":3468},{},[3469],{"type":65,"value":3470},"Endpoint",{"type":60,"tag":244,"props":3472,"children":3473},{},[3474],{"type":65,"value":3475},"Methods",{"type":60,"tag":265,"props":3477,"children":3478},{},[3479,3496,3512],{"type":60,"tag":240,"props":3480,"children":3481},{},[3482,3491],{"type":60,"tag":272,"props":3483,"children":3484},{},[3485],{"type":60,"tag":74,"props":3486,"children":3488},{"className":3487},[],[3489],{"type":65,"value":3490},"\u002Fv2\u002Fusers\u002Fme",{"type":60,"tag":272,"props":3492,"children":3493},{},[3494],{"type":65,"value":3495},"GET, PATCH",{"type":60,"tag":240,"props":3497,"children":3498},{},[3499,3508],{"type":60,"tag":272,"props":3500,"children":3501},{},[3502],{"type":60,"tag":74,"props":3503,"children":3505},{"className":3504},[],[3506],{"type":65,"value":3507},"\u002Fv2\u002Fusers\u002Fme\u002Ftoken",{"type":60,"tag":272,"props":3509,"children":3510},{},[3511],{"type":65,"value":3393},{"type":60,"tag":240,"props":3513,"children":3514},{},[3515,3524],{"type":60,"tag":272,"props":3516,"children":3517},{},[3518],{"type":60,"tag":74,"props":3519,"children":3521},{"className":3520},[],[3522],{"type":65,"value":3523},"\u002Fv2\u002Fusers\u002Fme\u002Fmeetings",{"type":60,"tag":272,"props":3525,"children":3526},{},[3527],{"type":65,"value":3528},"GET, POST",{"type":60,"tag":531,"props":3530,"children":3531},{},[],{"type":60,"tag":93,"props":3533,"children":3535},{"id":3534},"revoke-access-token",[3536],{"type":65,"value":3537},"Revoke Access Token",{"type":60,"tag":68,"props":3539,"children":3540},{},[3541],{"type":65,"value":3542},"Works for all authorization types.",{"type":60,"tag":519,"props":3544,"children":3546},{"className":553,"code":3545,"language":555,"meta":527,"style":527},"POST https:\u002F\u002Fzoom.us\u002Foauth\u002Frevoke?token={ACCESS_TOKEN}\n\nHeaders:\nAuthorization: Basic {Base64(ClientID:ClientSecret)}\n",[3547],{"type":60,"tag":74,"props":3548,"children":3549},{"__ignoreMap":527},[3550,3562,3569,3576],{"type":60,"tag":561,"props":3551,"children":3552},{"class":563,"line":564},[3553,3557],{"type":60,"tag":561,"props":3554,"children":3555},{"style":568},[3556],{"type":65,"value":571},{"type":60,"tag":561,"props":3558,"children":3559},{"style":574},[3560],{"type":65,"value":3561}," https:\u002F\u002Fzoom.us\u002Foauth\u002Frevoke?token={ACCESS_TOKEN}\n",{"type":60,"tag":561,"props":3563,"children":3564},{"class":563,"line":607},[3565],{"type":60,"tag":561,"props":3566,"children":3567},{"emptyLinePlaceholder":611},[3568],{"type":65,"value":614},{"type":60,"tag":561,"props":3570,"children":3571},{"class":563,"line":617},[3572],{"type":60,"tag":561,"props":3573,"children":3574},{"style":568},[3575],{"type":65,"value":623},{"type":60,"tag":561,"props":3577,"children":3578},{"class":563,"line":626},[3579,3583,3587,3591,3595,3599,3603],{"type":60,"tag":561,"props":3580,"children":3581},{"style":568},[3582],{"type":65,"value":632},{"type":60,"tag":561,"props":3584,"children":3585},{"style":574},[3586],{"type":65,"value":637},{"type":60,"tag":561,"props":3588,"children":3589},{"style":574},[3590],{"type":65,"value":642},{"type":60,"tag":561,"props":3592,"children":3593},{"style":580},[3594],{"type":65,"value":647},{"type":60,"tag":561,"props":3596,"children":3597},{"style":568},[3598],{"type":65,"value":652},{"type":60,"tag":561,"props":3600,"children":3601},{"style":580},[3602],{"type":65,"value":657},{"type":60,"tag":561,"props":3604,"children":3605},{"style":574},[3606],{"type":65,"value":662},{"type":60,"tag":388,"props":3608,"children":3610},{"id":3609},"response-5",[3611],{"type":65,"value":668},{"type":60,"tag":519,"props":3613,"children":3615},{"className":671,"code":3614,"language":673,"meta":527,"style":527},"{\n  \"status\": \"success\"\n}\n",[3616],{"type":60,"tag":74,"props":3617,"children":3618},{"__ignoreMap":527},[3619,3626,3659],{"type":60,"tag":561,"props":3620,"children":3621},{"class":563,"line":564},[3622],{"type":60,"tag":561,"props":3623,"children":3624},{"style":580},[3625],{"type":65,"value":685},{"type":60,"tag":561,"props":3627,"children":3628},{"class":563,"line":607},[3629,3633,3638,3642,3646,3650,3655],{"type":60,"tag":561,"props":3630,"children":3631},{"style":580},[3632],{"type":65,"value":693},{"type":60,"tag":561,"props":3634,"children":3635},{"style":696},[3636],{"type":65,"value":3637},"status",{"type":60,"tag":561,"props":3639,"children":3640},{"style":580},[3641],{"type":65,"value":704},{"type":60,"tag":561,"props":3643,"children":3644},{"style":580},[3645],{"type":65,"value":709},{"type":60,"tag":561,"props":3647,"children":3648},{"style":580},[3649],{"type":65,"value":714},{"type":60,"tag":561,"props":3651,"children":3652},{"style":574},[3653],{"type":65,"value":3654},"success",{"type":60,"tag":561,"props":3656,"children":3657},{"style":580},[3658],{"type":65,"value":868},{"type":60,"tag":561,"props":3660,"children":3661},{"class":563,"line":617},[3662],{"type":60,"tag":561,"props":3663,"children":3664},{"style":580},[3665],{"type":65,"value":662},{"type":60,"tag":531,"props":3667,"children":3668},{},[],{"type":60,"tag":93,"props":3670,"children":3672},{"id":3671},"pkce-proof-key-for-code-exchange",[3673],{"type":65,"value":3674},"PKCE (Proof Key for Code Exchange)",{"type":60,"tag":68,"props":3676,"children":3677},{},[3678],{"type":65,"value":3679},"For public clients that can't securely store secrets (mobile apps, SPAs, desktop apps).",{"type":60,"tag":388,"props":3681,"children":3683},{"id":3682},"when-to-use-pkce",[3684],{"type":65,"value":3685},"When to Use PKCE",{"type":60,"tag":232,"props":3687,"children":3688},{},[3689,3710],{"type":60,"tag":236,"props":3690,"children":3691},{},[3692],{"type":60,"tag":240,"props":3693,"children":3694},{},[3695,3700,3705],{"type":60,"tag":244,"props":3696,"children":3697},{},[3698],{"type":65,"value":3699},"Client Type",{"type":60,"tag":244,"props":3701,"children":3702},{},[3703],{"type":65,"value":3704},"Use PKCE?",{"type":60,"tag":244,"props":3706,"children":3707},{},[3708],{"type":65,"value":3709},"Why",{"type":60,"tag":265,"props":3711,"children":3712},{},[3713,3734,3754,3774,3794],{"type":60,"tag":240,"props":3714,"children":3715},{},[3716,3721,3729],{"type":60,"tag":272,"props":3717,"children":3718},{},[3719],{"type":65,"value":3720},"Mobile app",{"type":60,"tag":272,"props":3722,"children":3723},{},[3724],{"type":60,"tag":105,"props":3725,"children":3726},{},[3727],{"type":65,"value":3728},"Yes",{"type":60,"tag":272,"props":3730,"children":3731},{},[3732],{"type":65,"value":3733},"Can't securely store client secret",{"type":60,"tag":240,"props":3735,"children":3736},{},[3737,3742,3749],{"type":60,"tag":272,"props":3738,"children":3739},{},[3740],{"type":65,"value":3741},"Single Page App (SPA)",{"type":60,"tag":272,"props":3743,"children":3744},{},[3745],{"type":60,"tag":105,"props":3746,"children":3747},{},[3748],{"type":65,"value":3728},{"type":60,"tag":272,"props":3750,"children":3751},{},[3752],{"type":65,"value":3753},"JavaScript is visible to users",{"type":60,"tag":240,"props":3755,"children":3756},{},[3757,3762,3769],{"type":60,"tag":272,"props":3758,"children":3759},{},[3760],{"type":65,"value":3761},"Desktop app",{"type":60,"tag":272,"props":3763,"children":3764},{},[3765],{"type":60,"tag":105,"props":3766,"children":3767},{},[3768],{"type":65,"value":3728},{"type":60,"tag":272,"props":3770,"children":3771},{},[3772],{"type":65,"value":3773},"Binary can be decompiled",{"type":60,"tag":240,"props":3775,"children":3776},{},[3777,3782,3789],{"type":60,"tag":272,"props":3778,"children":3779},{},[3780],{"type":65,"value":3781},"Meeting SDK (client-side)",{"type":60,"tag":272,"props":3783,"children":3784},{},[3785],{"type":60,"tag":105,"props":3786,"children":3787},{},[3788],{"type":65,"value":3728},{"type":60,"tag":272,"props":3790,"children":3791},{},[3792],{"type":65,"value":3793},"Runs on user's device",{"type":60,"tag":240,"props":3795,"children":3796},{},[3797,3802,3807],{"type":60,"tag":272,"props":3798,"children":3799},{},[3800],{"type":65,"value":3801},"Backend server",{"type":60,"tag":272,"props":3803,"children":3804},{},[3805],{"type":65,"value":3806},"Optional",{"type":60,"tag":272,"props":3808,"children":3809},{},[3810],{"type":65,"value":3811},"Can keep secrets, but PKCE adds security",{"type":60,"tag":388,"props":3813,"children":3815},{"id":3814},"how-pkce-works",[3816],{"type":65,"value":3817},"How PKCE Works",{"type":60,"tag":519,"props":3819,"children":3822},{"className":3820,"code":3821,"language":65},[522],"┌──────────┐                              ┌──────────┐                    ┌──────────┐\n│  Client  │                              │   Zoom   │                    │   Zoom   │\n│   App    │                              │  Auth    │                    │  Token   │\n└────┬─────┘                              └────┬─────┘                    └────┬─────┘\n     │                                         │                              │\n     │ 1. Generate code_verifier (random)      │                              │\n     │ 2. Create code_challenge = SHA256(verifier)                            │\n     │                                         │                              │\n     │ ─────── \u002Fauthorize + code_challenge ──► │                              │\n     │                                         │                              │\n     │ ◄────── authorization_code ──────────── │                              │\n     │                                         │                              │\n     │ ─────────────── \u002Ftoken + code_verifier ─┼────────────────────────────► │\n     │                                         │                              │\n     │                                         │     Verify: SHA256(verifier) │\n     │                                         │            == challenge      │\n     │                                         │                              │\n     │ ◄───────────────────────────────────────┼─────── access_token ──────── │\n     │                                         │                              │\n",[3823],{"type":60,"tag":74,"props":3824,"children":3825},{"__ignoreMap":527},[3826],{"type":65,"value":3821},{"type":60,"tag":388,"props":3828,"children":3830},{"id":3829},"implementation-nodejs",[3831],{"type":65,"value":3832},"Implementation (Node.js)",{"type":60,"tag":519,"props":3834,"children":3836},{"className":2466,"code":3835,"language":2468,"meta":527,"style":527},"const crypto = require('crypto');\n\nfunction generatePKCE() {\n  const verifier = crypto.randomBytes(32).toString('base64url');\n  const challenge = crypto.createHash('sha256').update(verifier).digest('base64url');\n  return { verifier, challenge };\n}\n\nconst pkce = generatePKCE();\n\nconst authUrl = `https:\u002F\u002Fzoom.us\u002Foauth\u002Fauthorize?` +\n  `response_type=code&` +\n  `client_id=${CLIENT_ID}&` +\n  `redirect_uri=${REDIRECT_URI}&` +\n  `code_challenge=${pkce.challenge}&` +\n  `code_challenge_method=S256`;\n\n\u002F\u002F Store pkce.verifier in session for callback\n",[3837],{"type":60,"tag":74,"props":3838,"children":3839},{"__ignoreMap":527},[3840,3887,3894,3916,3994,4099,4128,4135,4142,4170,4177,4212,4233,4271,4308,4353,4373,4380],{"type":60,"tag":561,"props":3841,"children":3842},{"class":563,"line":564},[3843,3848,3853,3857,3862,3866,3870,3875,3879,3883],{"type":60,"tag":561,"props":3844,"children":3845},{"style":696},[3846],{"type":65,"value":3847},"const",{"type":60,"tag":561,"props":3849,"children":3850},{"style":586},[3851],{"type":65,"value":3852}," crypto ",{"type":60,"tag":561,"props":3854,"children":3855},{"style":580},[3856],{"type":65,"value":594},{"type":60,"tag":561,"props":3858,"children":3859},{"style":2488},[3860],{"type":65,"value":3861}," require",{"type":60,"tag":561,"props":3863,"children":3864},{"style":586},[3865],{"type":65,"value":647},{"type":60,"tag":561,"props":3867,"children":3868},{"style":580},[3869],{"type":65,"value":2729},{"type":60,"tag":561,"props":3871,"children":3872},{"style":574},[3873],{"type":65,"value":3874},"crypto",{"type":60,"tag":561,"props":3876,"children":3877},{"style":580},[3878],{"type":65,"value":2729},{"type":60,"tag":561,"props":3880,"children":3881},{"style":586},[3882],{"type":65,"value":657},{"type":60,"tag":561,"props":3884,"children":3885},{"style":580},[3886],{"type":65,"value":2590},{"type":60,"tag":561,"props":3888,"children":3889},{"class":563,"line":607},[3890],{"type":60,"tag":561,"props":3891,"children":3892},{"emptyLinePlaceholder":611},[3893],{"type":65,"value":614},{"type":60,"tag":561,"props":3895,"children":3896},{"class":563,"line":617},[3897,3902,3907,3912],{"type":60,"tag":561,"props":3898,"children":3899},{"style":696},[3900],{"type":65,"value":3901},"function",{"type":60,"tag":561,"props":3903,"children":3904},{"style":2488},[3905],{"type":65,"value":3906}," generatePKCE",{"type":60,"tag":561,"props":3908,"children":3909},{"style":580},[3910],{"type":65,"value":3911},"()",{"type":60,"tag":561,"props":3913,"children":3914},{"style":580},[3915],{"type":65,"value":2520},{"type":60,"tag":561,"props":3917,"children":3918},{"class":563,"line":626},[3919,3924,3929,3933,3938,3942,3947,3951,3956,3960,3964,3969,3973,3977,3982,3986,3990],{"type":60,"tag":561,"props":3920,"children":3921},{"style":696},[3922],{"type":65,"value":3923},"  const",{"type":60,"tag":561,"props":3925,"children":3926},{"style":586},[3927],{"type":65,"value":3928}," verifier",{"type":60,"tag":561,"props":3930,"children":3931},{"style":580},[3932],{"type":65,"value":2628},{"type":60,"tag":561,"props":3934,"children":3935},{"style":586},[3936],{"type":65,"value":3937}," crypto",{"type":60,"tag":561,"props":3939,"children":3940},{"style":580},[3941],{"type":65,"value":111},{"type":60,"tag":561,"props":3943,"children":3944},{"style":2488},[3945],{"type":65,"value":3946},"randomBytes",{"type":60,"tag":561,"props":3948,"children":3949},{"style":2532},[3950],{"type":65,"value":647},{"type":60,"tag":561,"props":3952,"children":3953},{"style":788},[3954],{"type":65,"value":3955},"32",{"type":60,"tag":561,"props":3957,"children":3958},{"style":2532},[3959],{"type":65,"value":657},{"type":60,"tag":561,"props":3961,"children":3962},{"style":580},[3963],{"type":65,"value":111},{"type":60,"tag":561,"props":3965,"children":3966},{"style":2488},[3967],{"type":65,"value":3968},"toString",{"type":60,"tag":561,"props":3970,"children":3971},{"style":2532},[3972],{"type":65,"value":647},{"type":60,"tag":561,"props":3974,"children":3975},{"style":580},[3976],{"type":65,"value":2729},{"type":60,"tag":561,"props":3978,"children":3979},{"style":574},[3980],{"type":65,"value":3981},"base64url",{"type":60,"tag":561,"props":3983,"children":3984},{"style":580},[3985],{"type":65,"value":2729},{"type":60,"tag":561,"props":3987,"children":3988},{"style":2532},[3989],{"type":65,"value":657},{"type":60,"tag":561,"props":3991,"children":3992},{"style":580},[3993],{"type":65,"value":2590},{"type":60,"tag":561,"props":3995,"children":3996},{"class":563,"line":798},[3997,4001,4006,4010,4014,4018,4023,4027,4031,4036,4040,4044,4048,4053,4057,4062,4066,4070,4075,4079,4083,4087,4091,4095],{"type":60,"tag":561,"props":3998,"children":3999},{"style":696},[4000],{"type":65,"value":3923},{"type":60,"tag":561,"props":4002,"children":4003},{"style":586},[4004],{"type":65,"value":4005}," challenge",{"type":60,"tag":561,"props":4007,"children":4008},{"style":580},[4009],{"type":65,"value":2628},{"type":60,"tag":561,"props":4011,"children":4012},{"style":586},[4013],{"type":65,"value":3937},{"type":60,"tag":561,"props":4015,"children":4016},{"style":580},[4017],{"type":65,"value":111},{"type":60,"tag":561,"props":4019,"children":4020},{"style":2488},[4021],{"type":65,"value":4022},"createHash",{"type":60,"tag":561,"props":4024,"children":4025},{"style":2532},[4026],{"type":65,"value":647},{"type":60,"tag":561,"props":4028,"children":4029},{"style":580},[4030],{"type":65,"value":2729},{"type":60,"tag":561,"props":4032,"children":4033},{"style":574},[4034],{"type":65,"value":4035},"sha256",{"type":60,"tag":561,"props":4037,"children":4038},{"style":580},[4039],{"type":65,"value":2729},{"type":60,"tag":561,"props":4041,"children":4042},{"style":2532},[4043],{"type":65,"value":657},{"type":60,"tag":561,"props":4045,"children":4046},{"style":580},[4047],{"type":65,"value":111},{"type":60,"tag":561,"props":4049,"children":4050},{"style":2488},[4051],{"type":65,"value":4052},"update",{"type":60,"tag":561,"props":4054,"children":4055},{"style":2532},[4056],{"type":65,"value":647},{"type":60,"tag":561,"props":4058,"children":4059},{"style":586},[4060],{"type":65,"value":4061},"verifier",{"type":60,"tag":561,"props":4063,"children":4064},{"style":2532},[4065],{"type":65,"value":657},{"type":60,"tag":561,"props":4067,"children":4068},{"style":580},[4069],{"type":65,"value":111},{"type":60,"tag":561,"props":4071,"children":4072},{"style":2488},[4073],{"type":65,"value":4074},"digest",{"type":60,"tag":561,"props":4076,"children":4077},{"style":2532},[4078],{"type":65,"value":647},{"type":60,"tag":561,"props":4080,"children":4081},{"style":580},[4082],{"type":65,"value":2729},{"type":60,"tag":561,"props":4084,"children":4085},{"style":574},[4086],{"type":65,"value":3981},{"type":60,"tag":561,"props":4088,"children":4089},{"style":580},[4090],{"type":65,"value":2729},{"type":60,"tag":561,"props":4092,"children":4093},{"style":2532},[4094],{"type":65,"value":657},{"type":60,"tag":561,"props":4096,"children":4097},{"style":580},[4098],{"type":65,"value":2590},{"type":60,"tag":561,"props":4100,"children":4101},{"class":563,"line":836},[4102,4107,4111,4115,4119,4123],{"type":60,"tag":561,"props":4103,"children":4104},{"style":2526},[4105],{"type":65,"value":4106},"  return",{"type":60,"tag":561,"props":4108,"children":4109},{"style":580},[4110],{"type":65,"value":2714},{"type":60,"tag":561,"props":4112,"children":4113},{"style":586},[4114],{"type":65,"value":3928},{"type":60,"tag":561,"props":4116,"children":4117},{"style":580},[4118],{"type":65,"value":2506},{"type":60,"tag":561,"props":4120,"children":4121},{"style":586},[4122],{"type":65,"value":4005},{"type":60,"tag":561,"props":4124,"children":4125},{"style":580},[4126],{"type":65,"value":4127}," };\n",{"type":60,"tag":561,"props":4129,"children":4130},{"class":563,"line":871},[4131],{"type":60,"tag":561,"props":4132,"children":4133},{"style":580},[4134],{"type":65,"value":662},{"type":60,"tag":561,"props":4136,"children":4137},{"class":563,"line":1427},[4138],{"type":60,"tag":561,"props":4139,"children":4140},{"emptyLinePlaceholder":611},[4141],{"type":65,"value":614},{"type":60,"tag":561,"props":4143,"children":4144},{"class":563,"line":2694},[4145,4149,4154,4158,4162,4166],{"type":60,"tag":561,"props":4146,"children":4147},{"style":696},[4148],{"type":65,"value":3847},{"type":60,"tag":561,"props":4150,"children":4151},{"style":586},[4152],{"type":65,"value":4153}," pkce ",{"type":60,"tag":561,"props":4155,"children":4156},{"style":580},[4157],{"type":65,"value":594},{"type":60,"tag":561,"props":4159,"children":4160},{"style":2488},[4161],{"type":65,"value":3906},{"type":60,"tag":561,"props":4163,"children":4164},{"style":586},[4165],{"type":65,"value":3911},{"type":60,"tag":561,"props":4167,"children":4168},{"style":580},[4169],{"type":65,"value":2590},{"type":60,"tag":561,"props":4171,"children":4172},{"class":563,"line":2769},[4173],{"type":60,"tag":561,"props":4174,"children":4175},{"emptyLinePlaceholder":611},[4176],{"type":65,"value":614},{"type":60,"tag":561,"props":4178,"children":4179},{"class":563,"line":2782},[4180,4184,4189,4193,4197,4202,4207],{"type":60,"tag":561,"props":4181,"children":4182},{"style":696},[4183],{"type":65,"value":3847},{"type":60,"tag":561,"props":4185,"children":4186},{"style":586},[4187],{"type":65,"value":4188}," authUrl ",{"type":60,"tag":561,"props":4190,"children":4191},{"style":580},[4192],{"type":65,"value":594},{"type":60,"tag":561,"props":4194,"children":4195},{"style":580},[4196],{"type":65,"value":2738},{"type":60,"tag":561,"props":4198,"children":4199},{"style":574},[4200],{"type":65,"value":4201},"https:\u002F\u002Fzoom.us\u002Foauth\u002Fauthorize?",{"type":60,"tag":561,"props":4203,"children":4204},{"style":580},[4205],{"type":65,"value":4206},"`",{"type":60,"tag":561,"props":4208,"children":4209},{"style":580},[4210],{"type":65,"value":4211}," +\n",{"type":60,"tag":561,"props":4213,"children":4214},{"class":563,"line":2815},[4215,4220,4225,4229],{"type":60,"tag":561,"props":4216,"children":4217},{"style":580},[4218],{"type":65,"value":4219},"  `",{"type":60,"tag":561,"props":4221,"children":4222},{"style":574},[4223],{"type":65,"value":4224},"response_type=code&",{"type":60,"tag":561,"props":4226,"children":4227},{"style":580},[4228],{"type":65,"value":4206},{"type":60,"tag":561,"props":4230,"children":4231},{"style":580},[4232],{"type":65,"value":4211},{"type":60,"tag":561,"props":4234,"children":4235},{"class":563,"line":2846},[4236,4240,4245,4249,4254,4259,4263,4267],{"type":60,"tag":561,"props":4237,"children":4238},{"style":580},[4239],{"type":65,"value":4219},{"type":60,"tag":561,"props":4241,"children":4242},{"style":574},[4243],{"type":65,"value":4244},"client_id=",{"type":60,"tag":561,"props":4246,"children":4247},{"style":580},[4248],{"type":65,"value":2670},{"type":60,"tag":561,"props":4250,"children":4251},{"style":586},[4252],{"type":65,"value":4253},"CLIENT_ID",{"type":60,"tag":561,"props":4255,"children":4256},{"style":580},[4257],{"type":65,"value":4258},"}",{"type":60,"tag":561,"props":4260,"children":4261},{"style":574},[4262],{"type":65,"value":583},{"type":60,"tag":561,"props":4264,"children":4265},{"style":580},[4266],{"type":65,"value":4206},{"type":60,"tag":561,"props":4268,"children":4269},{"style":580},[4270],{"type":65,"value":4211},{"type":60,"tag":561,"props":4272,"children":4273},{"class":563,"line":2897},[4274,4278,4283,4287,4292,4296,4300,4304],{"type":60,"tag":561,"props":4275,"children":4276},{"style":580},[4277],{"type":65,"value":4219},{"type":60,"tag":561,"props":4279,"children":4280},{"style":574},[4281],{"type":65,"value":4282},"redirect_uri=",{"type":60,"tag":561,"props":4284,"children":4285},{"style":580},[4286],{"type":65,"value":2670},{"type":60,"tag":561,"props":4288,"children":4289},{"style":586},[4290],{"type":65,"value":4291},"REDIRECT_URI",{"type":60,"tag":561,"props":4293,"children":4294},{"style":580},[4295],{"type":65,"value":4258},{"type":60,"tag":561,"props":4297,"children":4298},{"style":574},[4299],{"type":65,"value":583},{"type":60,"tag":561,"props":4301,"children":4302},{"style":580},[4303],{"type":65,"value":4206},{"type":60,"tag":561,"props":4305,"children":4306},{"style":580},[4307],{"type":65,"value":4211},{"type":60,"tag":561,"props":4309,"children":4310},{"class":563,"line":2946},[4311,4315,4320,4324,4328,4332,4337,4341,4345,4349],{"type":60,"tag":561,"props":4312,"children":4313},{"style":580},[4314],{"type":65,"value":4219},{"type":60,"tag":561,"props":4316,"children":4317},{"style":574},[4318],{"type":65,"value":4319},"code_challenge=",{"type":60,"tag":561,"props":4321,"children":4322},{"style":580},[4323],{"type":65,"value":2670},{"type":60,"tag":561,"props":4325,"children":4326},{"style":586},[4327],{"type":65,"value":50},{"type":60,"tag":561,"props":4329,"children":4330},{"style":580},[4331],{"type":65,"value":111},{"type":60,"tag":561,"props":4333,"children":4334},{"style":586},[4335],{"type":65,"value":4336},"challenge",{"type":60,"tag":561,"props":4338,"children":4339},{"style":580},[4340],{"type":65,"value":4258},{"type":60,"tag":561,"props":4342,"children":4343},{"style":574},[4344],{"type":65,"value":583},{"type":60,"tag":561,"props":4346,"children":4347},{"style":580},[4348],{"type":65,"value":4206},{"type":60,"tag":561,"props":4350,"children":4351},{"style":580},[4352],{"type":65,"value":4211},{"type":60,"tag":561,"props":4354,"children":4355},{"class":563,"line":3018},[4356,4360,4365,4369],{"type":60,"tag":561,"props":4357,"children":4358},{"style":580},[4359],{"type":65,"value":4219},{"type":60,"tag":561,"props":4361,"children":4362},{"style":574},[4363],{"type":65,"value":4364},"code_challenge_method=S256",{"type":60,"tag":561,"props":4366,"children":4367},{"style":580},[4368],{"type":65,"value":4206},{"type":60,"tag":561,"props":4370,"children":4371},{"style":580},[4372],{"type":65,"value":2590},{"type":60,"tag":561,"props":4374,"children":4375},{"class":563,"line":3040},[4376],{"type":60,"tag":561,"props":4377,"children":4378},{"emptyLinePlaceholder":611},[4379],{"type":65,"value":614},{"type":60,"tag":561,"props":4381,"children":4382},{"class":563,"line":3049},[4383],{"type":60,"tag":561,"props":4384,"children":4385},{"style":2809},[4386],{"type":65,"value":4387},"\u002F\u002F Store pkce.verifier in session for callback\n",{"type":60,"tag":388,"props":4389,"children":4391},{"id":4390},"token-exchange-with-pkce",[4392],{"type":65,"value":4393},"Token Exchange with PKCE",{"type":60,"tag":519,"props":4395,"children":4397},{"className":553,"code":4396,"language":555,"meta":527,"style":527},"POST https:\u002F\u002Fzoom.us\u002Foauth\u002Ftoken?grant_type=authorization_code&code={CODE}&redirect_uri={REDIRECT_URI}&code_verifier={VERIFIER}\n\nHeaders:\nAuthorization: Basic {Base64(ClientID:ClientSecret)}\n",[4398],{"type":60,"tag":74,"props":4399,"children":4400},{"__ignoreMap":527},[4401,4474,4481,4488],{"type":60,"tag":561,"props":4402,"children":4403},{"class":563,"line":564},[4404,4408,4412,4416,4420,4424,4428,4432,4436,4440,4444,4448,4453,4457,4461,4465,4469],{"type":60,"tag":561,"props":4405,"children":4406},{"style":568},[4407],{"type":65,"value":571},{"type":60,"tag":561,"props":4409,"children":4410},{"style":574},[4411],{"type":65,"value":1100},{"type":60,"tag":561,"props":4413,"children":4414},{"style":580},[4415],{"type":65,"value":583},{"type":60,"tag":561,"props":4417,"children":4418},{"style":586},[4419],{"type":65,"value":74},{"type":60,"tag":561,"props":4421,"children":4422},{"style":580},[4423],{"type":65,"value":594},{"type":60,"tag":561,"props":4425,"children":4426},{"style":586},[4427],{"type":65,"value":599},{"type":60,"tag":561,"props":4429,"children":4430},{"style":568},[4431],{"type":65,"value":1121},{"type":60,"tag":561,"props":4433,"children":4434},{"style":580},[4435],{"type":65,"value":583},{"type":60,"tag":561,"props":4437,"children":4438},{"style":586},[4439],{"type":65,"value":1064},{"type":60,"tag":561,"props":4441,"children":4442},{"style":580},[4443],{"type":65,"value":594},{"type":60,"tag":561,"props":4445,"children":4446},{"style":586},[4447],{"type":65,"value":599},{"type":60,"tag":561,"props":4449,"children":4450},{"style":568},[4451],{"type":65,"value":4452},"REDIRECT_URI}",{"type":60,"tag":561,"props":4454,"children":4455},{"style":580},[4456],{"type":65,"value":583},{"type":60,"tag":561,"props":4458,"children":4459},{"style":586},[4460],{"type":65,"value":1203},{"type":60,"tag":561,"props":4462,"children":4463},{"style":580},[4464],{"type":65,"value":594},{"type":60,"tag":561,"props":4466,"children":4467},{"style":586},[4468],{"type":65,"value":599},{"type":60,"tag":561,"props":4470,"children":4471},{"style":568},[4472],{"type":65,"value":4473},"VERIFIER}\n",{"type":60,"tag":561,"props":4475,"children":4476},{"class":563,"line":607},[4477],{"type":60,"tag":561,"props":4478,"children":4479},{"emptyLinePlaceholder":611},[4480],{"type":65,"value":614},{"type":60,"tag":561,"props":4482,"children":4483},{"class":563,"line":617},[4484],{"type":60,"tag":561,"props":4485,"children":4486},{"style":568},[4487],{"type":65,"value":623},{"type":60,"tag":561,"props":4489,"children":4490},{"class":563,"line":626},[4491,4495,4499,4503,4507,4511,4515],{"type":60,"tag":561,"props":4492,"children":4493},{"style":568},[4494],{"type":65,"value":632},{"type":60,"tag":561,"props":4496,"children":4497},{"style":574},[4498],{"type":65,"value":637},{"type":60,"tag":561,"props":4500,"children":4501},{"style":574},[4502],{"type":65,"value":642},{"type":60,"tag":561,"props":4504,"children":4505},{"style":580},[4506],{"type":65,"value":647},{"type":60,"tag":561,"props":4508,"children":4509},{"style":568},[4510],{"type":65,"value":652},{"type":60,"tag":561,"props":4512,"children":4513},{"style":580},[4514],{"type":65,"value":657},{"type":60,"tag":561,"props":4516,"children":4517},{"style":574},[4518],{"type":65,"value":662},{"type":60,"tag":531,"props":4520,"children":4521},{},[],{"type":60,"tag":93,"props":4523,"children":4525},{"id":4524},"deauthorization",[4526],{"type":65,"value":4527},"Deauthorization",{"type":60,"tag":68,"props":4529,"children":4530},{},[4531],{"type":65,"value":4532},"When a user removes your app, Zoom sends a webhook to your Deauthorization Notification Endpoint URL.",{"type":60,"tag":388,"props":4534,"children":4536},{"id":4535},"webhook-event",[4537],{"type":65,"value":4538},"Webhook Event",{"type":60,"tag":519,"props":4540,"children":4542},{"className":671,"code":4541,"language":673,"meta":527,"style":527},"{\n  \"event\": \"app_deauthorized\",\n  \"event_ts\": 1740439732278,\n  \"payload\": {\n    \"account_id\": \"ACCOUNT_ID\",\n    \"user_id\": \"USER_ID\",\n    \"signature\": \"SIGNATURE\",\n    \"deauthorization_time\": \"2019-06-17T13:52:28.632Z\",\n    \"client_id\": \"CLIENT_ID\"\n  }\n}\n",[4543],{"type":60,"tag":74,"props":4544,"children":4545},{"__ignoreMap":527},[4546,4553,4590,4619,4643,4680,4717,4754,4791,4823,4830],{"type":60,"tag":561,"props":4547,"children":4548},{"class":563,"line":564},[4549],{"type":60,"tag":561,"props":4550,"children":4551},{"style":580},[4552],{"type":65,"value":685},{"type":60,"tag":561,"props":4554,"children":4555},{"class":563,"line":607},[4556,4560,4565,4569,4573,4577,4582,4586],{"type":60,"tag":561,"props":4557,"children":4558},{"style":580},[4559],{"type":65,"value":693},{"type":60,"tag":561,"props":4561,"children":4562},{"style":696},[4563],{"type":65,"value":4564},"event",{"type":60,"tag":561,"props":4566,"children":4567},{"style":580},[4568],{"type":65,"value":704},{"type":60,"tag":561,"props":4570,"children":4571},{"style":580},[4572],{"type":65,"value":709},{"type":60,"tag":561,"props":4574,"children":4575},{"style":580},[4576],{"type":65,"value":714},{"type":60,"tag":561,"props":4578,"children":4579},{"style":574},[4580],{"type":65,"value":4581},"app_deauthorized",{"type":60,"tag":561,"props":4583,"children":4584},{"style":580},[4585],{"type":65,"value":704},{"type":60,"tag":561,"props":4587,"children":4588},{"style":580},[4589],{"type":65,"value":728},{"type":60,"tag":561,"props":4591,"children":4592},{"class":563,"line":617},[4593,4597,4602,4606,4610,4615],{"type":60,"tag":561,"props":4594,"children":4595},{"style":580},[4596],{"type":65,"value":693},{"type":60,"tag":561,"props":4598,"children":4599},{"style":696},[4600],{"type":65,"value":4601},"event_ts",{"type":60,"tag":561,"props":4603,"children":4604},{"style":580},[4605],{"type":65,"value":704},{"type":60,"tag":561,"props":4607,"children":4608},{"style":580},[4609],{"type":65,"value":709},{"type":60,"tag":561,"props":4611,"children":4612},{"style":788},[4613],{"type":65,"value":4614}," 1740439732278",{"type":60,"tag":561,"props":4616,"children":4617},{"style":580},[4618],{"type":65,"value":728},{"type":60,"tag":561,"props":4620,"children":4621},{"class":563,"line":626},[4622,4626,4631,4635,4639],{"type":60,"tag":561,"props":4623,"children":4624},{"style":580},[4625],{"type":65,"value":693},{"type":60,"tag":561,"props":4627,"children":4628},{"style":696},[4629],{"type":65,"value":4630},"payload",{"type":60,"tag":561,"props":4632,"children":4633},{"style":580},[4634],{"type":65,"value":704},{"type":60,"tag":561,"props":4636,"children":4637},{"style":580},[4638],{"type":65,"value":709},{"type":60,"tag":561,"props":4640,"children":4641},{"style":580},[4642],{"type":65,"value":2520},{"type":60,"tag":561,"props":4644,"children":4645},{"class":563,"line":798},[4646,4651,4655,4659,4663,4667,4672,4676],{"type":60,"tag":561,"props":4647,"children":4648},{"style":580},[4649],{"type":65,"value":4650},"    \"",{"type":60,"tag":561,"props":4652,"children":4653},{"style":568},[4654],{"type":65,"value":589},{"type":60,"tag":561,"props":4656,"children":4657},{"style":580},[4658],{"type":65,"value":704},{"type":60,"tag":561,"props":4660,"children":4661},{"style":580},[4662],{"type":65,"value":709},{"type":60,"tag":561,"props":4664,"children":4665},{"style":580},[4666],{"type":65,"value":714},{"type":60,"tag":561,"props":4668,"children":4669},{"style":574},[4670],{"type":65,"value":4671},"ACCOUNT_ID",{"type":60,"tag":561,"props":4673,"children":4674},{"style":580},[4675],{"type":65,"value":704},{"type":60,"tag":561,"props":4677,"children":4678},{"style":580},[4679],{"type":65,"value":728},{"type":60,"tag":561,"props":4681,"children":4682},{"class":563,"line":836},[4683,4687,4692,4696,4700,4704,4709,4713],{"type":60,"tag":561,"props":4684,"children":4685},{"style":580},[4686],{"type":65,"value":4650},{"type":60,"tag":561,"props":4688,"children":4689},{"style":568},[4690],{"type":65,"value":4691},"user_id",{"type":60,"tag":561,"props":4693,"children":4694},{"style":580},[4695],{"type":65,"value":704},{"type":60,"tag":561,"props":4697,"children":4698},{"style":580},[4699],{"type":65,"value":709},{"type":60,"tag":561,"props":4701,"children":4702},{"style":580},[4703],{"type":65,"value":714},{"type":60,"tag":561,"props":4705,"children":4706},{"style":574},[4707],{"type":65,"value":4708},"USER_ID",{"type":60,"tag":561,"props":4710,"children":4711},{"style":580},[4712],{"type":65,"value":704},{"type":60,"tag":561,"props":4714,"children":4715},{"style":580},[4716],{"type":65,"value":728},{"type":60,"tag":561,"props":4718,"children":4719},{"class":563,"line":871},[4720,4724,4729,4733,4737,4741,4746,4750],{"type":60,"tag":561,"props":4721,"children":4722},{"style":580},[4723],{"type":65,"value":4650},{"type":60,"tag":561,"props":4725,"children":4726},{"style":568},[4727],{"type":65,"value":4728},"signature",{"type":60,"tag":561,"props":4730,"children":4731},{"style":580},[4732],{"type":65,"value":704},{"type":60,"tag":561,"props":4734,"children":4735},{"style":580},[4736],{"type":65,"value":709},{"type":60,"tag":561,"props":4738,"children":4739},{"style":580},[4740],{"type":65,"value":714},{"type":60,"tag":561,"props":4742,"children":4743},{"style":574},[4744],{"type":65,"value":4745},"SIGNATURE",{"type":60,"tag":561,"props":4747,"children":4748},{"style":580},[4749],{"type":65,"value":704},{"type":60,"tag":561,"props":4751,"children":4752},{"style":580},[4753],{"type":65,"value":728},{"type":60,"tag":561,"props":4755,"children":4756},{"class":563,"line":1427},[4757,4761,4766,4770,4774,4778,4783,4787],{"type":60,"tag":561,"props":4758,"children":4759},{"style":580},[4760],{"type":65,"value":4650},{"type":60,"tag":561,"props":4762,"children":4763},{"style":568},[4764],{"type":65,"value":4765},"deauthorization_time",{"type":60,"tag":561,"props":4767,"children":4768},{"style":580},[4769],{"type":65,"value":704},{"type":60,"tag":561,"props":4771,"children":4772},{"style":580},[4773],{"type":65,"value":709},{"type":60,"tag":561,"props":4775,"children":4776},{"style":580},[4777],{"type":65,"value":714},{"type":60,"tag":561,"props":4779,"children":4780},{"style":574},[4781],{"type":65,"value":4782},"2019-06-17T13:52:28.632Z",{"type":60,"tag":561,"props":4784,"children":4785},{"style":580},[4786],{"type":65,"value":704},{"type":60,"tag":561,"props":4788,"children":4789},{"style":580},[4790],{"type":65,"value":728},{"type":60,"tag":561,"props":4792,"children":4793},{"class":563,"line":2694},[4794,4798,4803,4807,4811,4815,4819],{"type":60,"tag":561,"props":4795,"children":4796},{"style":580},[4797],{"type":65,"value":4650},{"type":60,"tag":561,"props":4799,"children":4800},{"style":568},[4801],{"type":65,"value":4802},"client_id",{"type":60,"tag":561,"props":4804,"children":4805},{"style":580},[4806],{"type":65,"value":704},{"type":60,"tag":561,"props":4808,"children":4809},{"style":580},[4810],{"type":65,"value":709},{"type":60,"tag":561,"props":4812,"children":4813},{"style":580},[4814],{"type":65,"value":714},{"type":60,"tag":561,"props":4816,"children":4817},{"style":574},[4818],{"type":65,"value":4253},{"type":60,"tag":561,"props":4820,"children":4821},{"style":580},[4822],{"type":65,"value":868},{"type":60,"tag":561,"props":4824,"children":4825},{"class":563,"line":2769},[4826],{"type":60,"tag":561,"props":4827,"children":4828},{"style":580},[4829],{"type":65,"value":3055},{"type":60,"tag":561,"props":4831,"children":4832},{"class":563,"line":2782},[4833],{"type":60,"tag":561,"props":4834,"children":4835},{"style":580},[4836],{"type":65,"value":662},{"type":60,"tag":388,"props":4838,"children":4840},{"id":4839},"requirements",[4841],{"type":65,"value":4842},"Requirements",{"type":60,"tag":118,"props":4844,"children":4845},{},[4846,4856,4866],{"type":60,"tag":122,"props":4847,"children":4848},{},[4849,4854],{"type":60,"tag":105,"props":4850,"children":4851},{},[4852],{"type":65,"value":4853},"Delete all associated user data",{"type":65,"value":4855}," after receiving this event",{"type":60,"tag":122,"props":4857,"children":4858},{},[4859,4864],{"type":60,"tag":105,"props":4860,"children":4861},{},[4862],{"type":65,"value":4863},"Verify webhook signature",{"type":65,"value":4865}," (use secret token, verification token deprecated Oct 2023)",{"type":60,"tag":122,"props":4867,"children":4868},{},[4869],{"type":65,"value":4870},"Only public apps receive deauthorization webhooks (not private\u002Fdev apps)",{"type":60,"tag":531,"props":4872,"children":4873},{},[],{"type":60,"tag":93,"props":4875,"children":4877},{"id":4876},"pre-approval-flow",[4878],{"type":65,"value":4879},"Pre-Approval Flow",{"type":60,"tag":68,"props":4881,"children":4882},{},[4883],{"type":65,"value":4884},"Some Zoom accounts require Marketplace admin pre-approval before users can authorize apps.",{"type":60,"tag":118,"props":4886,"children":4887},{},[4888,4893],{"type":60,"tag":122,"props":4889,"children":4890},{},[4891],{"type":65,"value":4892},"Users can request pre-approval from their admin",{"type":60,"tag":122,"props":4894,"children":4895},{},[4896],{"type":65,"value":4897},"Account-level apps (admin scopes) require appropriate role permissions",{"type":60,"tag":531,"props":4899,"children":4900},{},[],{"type":60,"tag":93,"props":4902,"children":4904},{"id":4903},"active-apps-notifier-aan",[4905],{"type":65,"value":4906},"Active Apps Notifier (AAN)",{"type":60,"tag":68,"props":4908,"children":4909},{},[4910],{"type":65,"value":4911},"In-meeting feature showing apps with real-time access to content.",{"type":60,"tag":118,"props":4913,"children":4914},{},[4915,4920],{"type":60,"tag":122,"props":4916,"children":4917},{},[4918],{"type":65,"value":4919},"Displays icon + tooltip with app info, content type being accessed, approving account",{"type":60,"tag":122,"props":4921,"children":4922},{},[4923],{"type":65,"value":4924},"Supported: Zoom client 5.6.7+, Meeting SDK 5.9.0+",{"type":60,"tag":531,"props":4926,"children":4927},{},[],{"type":60,"tag":93,"props":4929,"children":4931},{"id":4930},"oauth-scopes",[4932],{"type":65,"value":4933},"OAuth Scopes",{"type":60,"tag":388,"props":4935,"children":4937},{"id":4936},"scope-types",[4938],{"type":65,"value":4939},"Scope Types",{"type":60,"tag":232,"props":4941,"children":4942},{},[4943,4962],{"type":60,"tag":236,"props":4944,"children":4945},{},[4946],{"type":60,"tag":240,"props":4947,"children":4948},{},[4949,4953,4957],{"type":60,"tag":244,"props":4950,"children":4951},{},[4952],{"type":65,"value":1569},{"type":60,"tag":244,"props":4954,"children":4955},{},[4956],{"type":65,"value":971},{"type":60,"tag":244,"props":4958,"children":4959},{},[4960],{"type":65,"value":4961},"For",{"type":60,"tag":265,"props":4963,"children":4964},{},[4965,4986],{"type":60,"tag":240,"props":4966,"children":4967},{},[4968,4976,4981],{"type":60,"tag":272,"props":4969,"children":4970},{},[4971],{"type":60,"tag":105,"props":4972,"children":4973},{},[4974],{"type":65,"value":4975},"Classic scopes",{"type":60,"tag":272,"props":4977,"children":4978},{},[4979],{"type":65,"value":4980},"Legacy scopes (user, admin, master levels)",{"type":60,"tag":272,"props":4982,"children":4983},{},[4984],{"type":65,"value":4985},"Existing apps",{"type":60,"tag":240,"props":4987,"children":4988},{},[4989,4997,5002],{"type":60,"tag":272,"props":4990,"children":4991},{},[4992],{"type":60,"tag":105,"props":4993,"children":4994},{},[4995],{"type":65,"value":4996},"Granular scopes",{"type":60,"tag":272,"props":4998,"children":4999},{},[5000],{"type":65,"value":5001},"New fine-grained scopes with optional support",{"type":60,"tag":272,"props":5003,"children":5004},{},[5005],{"type":65,"value":5006},"New apps",{"type":60,"tag":388,"props":5008,"children":5010},{"id":5009},"classic-scopes",[5011],{"type":65,"value":5012},"Classic Scopes",{"type":60,"tag":68,"props":5014,"children":5015},{},[5016],{"type":65,"value":5017},"For previously-created apps. Three levels:",{"type":60,"tag":118,"props":5019,"children":5020},{},[5021,5030,5040],{"type":60,"tag":122,"props":5022,"children":5023},{},[5024,5028],{"type":60,"tag":105,"props":5025,"children":5026},{},[5027],{"type":65,"value":1593},{"type":65,"value":5029},": Access to individual user's data",{"type":60,"tag":122,"props":5031,"children":5032},{},[5033,5038],{"type":60,"tag":105,"props":5034,"children":5035},{},[5036],{"type":65,"value":5037},"Admin-level",{"type":65,"value":5039},": Account-wide access, requires admin role",{"type":60,"tag":122,"props":5041,"children":5042},{},[5043,5048],{"type":60,"tag":105,"props":5044,"children":5045},{},[5046],{"type":65,"value":5047},"Master-level",{"type":65,"value":5049},": For master-sub account setups, requires account owner",{"type":60,"tag":68,"props":5051,"children":5052},{},[5053,5055],{"type":65,"value":5054},"Full list: ",{"type":60,"tag":129,"props":5056,"children":5059},{"href":5057,"rel":5058},"https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Fintegrations\u002Foauth-scopes\u002F",[211],[5060],{"type":65,"value":5057},{"type":60,"tag":388,"props":5062,"children":5064},{"id":5063},"granular-scopes",[5065],{"type":65,"value":5066},"Granular Scopes",{"type":60,"tag":68,"props":5068,"children":5069},{},[5070,5072],{"type":65,"value":5071},"For new apps. Format: ",{"type":60,"tag":74,"props":5073,"children":5075},{"className":5074},[],[5076],{"type":65,"value":5077},"\u003Cservice>:\u003Caction>:\u003Cdata_claim>:\u003Caccess>",{"type":60,"tag":232,"props":5079,"children":5080},{},[5081,5097],{"type":60,"tag":236,"props":5082,"children":5083},{},[5084],{"type":60,"tag":240,"props":5085,"children":5086},{},[5087,5092],{"type":60,"tag":244,"props":5088,"children":5089},{},[5090],{"type":65,"value":5091},"Component",{"type":60,"tag":244,"props":5093,"children":5094},{},[5095],{"type":65,"value":5096},"Values",{"type":60,"tag":265,"props":5098,"children":5099},{},[5100,5144,5184,5214],{"type":60,"tag":240,"props":5101,"children":5102},{},[5103,5111],{"type":60,"tag":272,"props":5104,"children":5105},{},[5106],{"type":60,"tag":105,"props":5107,"children":5108},{},[5109],{"type":65,"value":5110},"service",{"type":60,"tag":272,"props":5112,"children":5113},{},[5114,5120,5122,5128,5129,5135,5136,5142],{"type":60,"tag":74,"props":5115,"children":5117},{"className":5116},[],[5118],{"type":65,"value":5119},"meeting",{"type":65,"value":5121},", ",{"type":60,"tag":74,"props":5123,"children":5125},{"className":5124},[],[5126],{"type":65,"value":5127},"webinar",{"type":65,"value":5121},{"type":60,"tag":74,"props":5130,"children":5132},{"className":5131},[],[5133],{"type":65,"value":5134},"user",{"type":65,"value":5121},{"type":60,"tag":74,"props":5137,"children":5139},{"className":5138},[],[5140],{"type":65,"value":5141},"recording",{"type":65,"value":5143},", etc.",{"type":60,"tag":240,"props":5145,"children":5146},{},[5147,5155],{"type":60,"tag":272,"props":5148,"children":5149},{},[5150],{"type":60,"tag":105,"props":5151,"children":5152},{},[5153],{"type":65,"value":5154},"action",{"type":60,"tag":272,"props":5156,"children":5157},{},[5158,5164,5165,5171,5172,5177,5178],{"type":60,"tag":74,"props":5159,"children":5161},{"className":5160},[],[5162],{"type":65,"value":5163},"read",{"type":65,"value":5121},{"type":60,"tag":74,"props":5166,"children":5168},{"className":5167},[],[5169],{"type":65,"value":5170},"write",{"type":65,"value":5121},{"type":60,"tag":74,"props":5173,"children":5175},{"className":5174},[],[5176],{"type":65,"value":4052},{"type":65,"value":5121},{"type":60,"tag":74,"props":5179,"children":5181},{"className":5180},[],[5182],{"type":65,"value":5183},"delete",{"type":60,"tag":240,"props":5185,"children":5186},{},[5187,5195],{"type":60,"tag":272,"props":5188,"children":5189},{},[5190],{"type":60,"tag":105,"props":5191,"children":5192},{},[5193],{"type":65,"value":5194},"data_claim",{"type":60,"tag":272,"props":5196,"children":5197},{},[5198,5200,5206,5207,5213],{"type":65,"value":5199},"Data category (e.g., ",{"type":60,"tag":74,"props":5201,"children":5203},{"className":5202},[],[5204],{"type":65,"value":5205},"participants",{"type":65,"value":5121},{"type":60,"tag":74,"props":5208,"children":5210},{"className":5209},[],[5211],{"type":65,"value":5212},"settings",{"type":65,"value":657},{"type":60,"tag":240,"props":5215,"children":5216},{},[5217,5225],{"type":60,"tag":272,"props":5218,"children":5219},{},[5220],{"type":60,"tag":105,"props":5221,"children":5222},{},[5223],{"type":65,"value":5224},"access",{"type":60,"tag":272,"props":5226,"children":5227},{},[5228,5230,5236,5237],{"type":65,"value":5229},"empty (user), ",{"type":60,"tag":74,"props":5231,"children":5233},{"className":5232},[],[5234],{"type":65,"value":5235},"admin",{"type":65,"value":5121},{"type":60,"tag":74,"props":5238,"children":5240},{"className":5239},[],[5241],{"type":65,"value":5242},"master",{"type":60,"tag":68,"props":5244,"children":5245},{},[5246,5248],{"type":65,"value":5247},"Example: ",{"type":60,"tag":74,"props":5249,"children":5251},{"className":5250},[],[5252],{"type":65,"value":5253},"meeting:read:list_meetings:admin",{"type":60,"tag":68,"props":5255,"children":5256},{},[5257,5258],{"type":65,"value":5054},{"type":60,"tag":129,"props":5259,"children":5262},{"href":5260,"rel":5261},"https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Fintegrations\u002Foauth-scopes-granular\u002F",[211],[5263],{"type":65,"value":5260},{"type":60,"tag":388,"props":5265,"children":5267},{"id":5266},"optional-scopes",[5268],{"type":65,"value":5269},"Optional Scopes",{"type":60,"tag":68,"props":5271,"children":5272},{},[5273,5275,5280],{"type":65,"value":5274},"Granular scopes can be marked as ",{"type":60,"tag":105,"props":5276,"children":5277},{},[5278],{"type":65,"value":5279},"optional",{"type":65,"value":5281}," - users choose whether to grant them.",{"type":60,"tag":68,"props":5283,"children":5284},{},[5285,5290],{"type":60,"tag":105,"props":5286,"children":5287},{},[5288],{"type":65,"value":5289},"Basic authorization",{"type":65,"value":5291}," (uses build flow defaults):",{"type":60,"tag":519,"props":5293,"children":5295},{"className":5294,"code":918,"language":65},[522],[5296],{"type":60,"tag":74,"props":5297,"children":5298},{"__ignoreMap":527},[5299],{"type":65,"value":918},{"type":60,"tag":68,"props":5301,"children":5302},{},[5303,5308],{"type":60,"tag":105,"props":5304,"children":5305},{},[5306],{"type":65,"value":5307},"Advanced authorization",{"type":65,"value":5309}," (custom scopes per request):",{"type":60,"tag":519,"props":5311,"children":5314},{"className":5312,"code":5313,"language":65},[522],"https:\u002F\u002Fzoom.us\u002Foauth\u002Fauthorize?client_id={CLIENT_ID}&response_type=code&redirect_uri={REDIRECT_URI}&scope={required_scopes}&optional_scope={optional_scopes}\n",[5315],{"type":60,"tag":74,"props":5316,"children":5317},{"__ignoreMap":527},[5318],{"type":65,"value":5313},{"type":60,"tag":68,"props":5320,"children":5321},{},[5322],{"type":60,"tag":105,"props":5323,"children":5324},{},[5325],{"type":65,"value":5326},"Include previously granted scopes:",{"type":60,"tag":519,"props":5328,"children":5331},{"className":5329,"code":5330,"language":65},[522],"https:\u002F\u002Fzoom.us\u002Foauth\u002Fauthorize?...&include_granted_scopes&scope={additional_scopes}\n",[5332],{"type":60,"tag":74,"props":5333,"children":5334},{"__ignoreMap":527},[5335],{"type":65,"value":5330},{"type":60,"tag":388,"props":5337,"children":5339},{"id":5338},"migrating-classic-to-granular",[5340],{"type":65,"value":5341},"Migrating Classic to Granular",{"type":60,"tag":5343,"props":5344,"children":5345},"ol",{},[5346,5351,5361,5366,5371],{"type":60,"tag":122,"props":5347,"children":5348},{},[5349],{"type":65,"value":5350},"Manage > select app > edit",{"type":60,"tag":122,"props":5352,"children":5353},{},[5354,5356],{"type":65,"value":5355},"Scope page > Development tab > click ",{"type":60,"tag":105,"props":5357,"children":5358},{},[5359],{"type":65,"value":5360},"Migrate",{"type":60,"tag":122,"props":5362,"children":5363},{},[5364],{"type":65,"value":5365},"Review auto-assigned granular scopes, remove unnecessary, mark optional",{"type":60,"tag":122,"props":5367,"children":5368},{},[5369],{"type":65,"value":5370},"Test",{"type":60,"tag":122,"props":5372,"children":5373},{},[5374,5376],{"type":65,"value":5375},"Production tab > click ",{"type":60,"tag":105,"props":5377,"children":5378},{},[5379],{"type":65,"value":5360},{"type":60,"tag":68,"props":5381,"children":5382},{},[5383],{"type":60,"tag":105,"props":5384,"children":5385},{},[5386],{"type":65,"value":5387},"Notes:",{"type":60,"tag":118,"props":5389,"children":5390},{},[5391,5396,5401],{"type":60,"tag":122,"props":5392,"children":5393},{},[5394],{"type":65,"value":5395},"No review needed if only migrating or reducing scopes",{"type":60,"tag":122,"props":5397,"children":5398},{},[5399],{"type":65,"value":5400},"Existing user tokens continue with classic scope values until re-authorization",{"type":60,"tag":122,"props":5402,"children":5403},{},[5404],{"type":65,"value":5405},"New users get granular scopes after migration",{"type":60,"tag":531,"props":5407,"children":5408},{},[],{"type":60,"tag":93,"props":5410,"children":5412},{"id":5411},"common-error-codes",[5413],{"type":65,"value":5414},"Common Error Codes",{"type":60,"tag":232,"props":5416,"children":5417},{},[5418,5439],{"type":60,"tag":236,"props":5419,"children":5420},{},[5421],{"type":60,"tag":240,"props":5422,"children":5423},{},[5424,5429,5434],{"type":60,"tag":244,"props":5425,"children":5426},{},[5427],{"type":65,"value":5428},"Code",{"type":60,"tag":244,"props":5430,"children":5431},{},[5432],{"type":65,"value":5433},"Message",{"type":60,"tag":244,"props":5435,"children":5436},{},[5437],{"type":65,"value":5438},"Solution",{"type":60,"tag":265,"props":5440,"children":5441},{},[5442,5460,5478,5520,5538,5556,5574,5592,5610,5628,5646],{"type":60,"tag":240,"props":5443,"children":5444},{},[5445,5450,5455],{"type":60,"tag":272,"props":5446,"children":5447},{},[5448],{"type":65,"value":5449},"4700",{"type":60,"tag":272,"props":5451,"children":5452},{},[5453],{"type":65,"value":5454},"Token cannot be empty",{"type":60,"tag":272,"props":5456,"children":5457},{},[5458],{"type":65,"value":5459},"Check Authorization header has valid token",{"type":60,"tag":240,"props":5461,"children":5462},{},[5463,5468,5473],{"type":60,"tag":272,"props":5464,"children":5465},{},[5466],{"type":65,"value":5467},"4702\u002F4704",{"type":60,"tag":272,"props":5469,"children":5470},{},[5471],{"type":65,"value":5472},"Invalid client",{"type":60,"tag":272,"props":5474,"children":5475},{},[5476],{"type":65,"value":5477},"Verify Client ID and Client Secret",{"type":60,"tag":240,"props":5479,"children":5480},{},[5481,5486,5491],{"type":60,"tag":272,"props":5482,"children":5483},{},[5484],{"type":65,"value":5485},"4705",{"type":60,"tag":272,"props":5487,"children":5488},{},[5489],{"type":65,"value":5490},"Grant type not supported",{"type":60,"tag":272,"props":5492,"children":5493},{},[5494,5496,5501,5502,5507,5508,5513,5515],{"type":65,"value":5495},"Use: ",{"type":60,"tag":74,"props":5497,"children":5499},{"className":5498},[],[5500],{"type":65,"value":293},{"type":65,"value":5121},{"type":60,"tag":74,"props":5503,"children":5505},{"className":5504},[],[5506],{"type":65,"value":323},{"type":65,"value":5121},{"type":60,"tag":74,"props":5509,"children":5511},{"className":5510},[],[5512],{"type":65,"value":352},{"type":65,"value":5514},", or ",{"type":60,"tag":74,"props":5516,"children":5518},{"className":5517},[],[5519],{"type":65,"value":381},{"type":60,"tag":240,"props":5521,"children":5522},{},[5523,5528,5533],{"type":60,"tag":272,"props":5524,"children":5525},{},[5526],{"type":65,"value":5527},"4706",{"type":60,"tag":272,"props":5529,"children":5530},{},[5531],{"type":65,"value":5532},"Client ID or secret missing",{"type":60,"tag":272,"props":5534,"children":5535},{},[5536],{"type":65,"value":5537},"Add credentials to header or request params",{"type":60,"tag":240,"props":5539,"children":5540},{},[5541,5546,5551],{"type":60,"tag":272,"props":5542,"children":5543},{},[5544],{"type":65,"value":5545},"4709",{"type":60,"tag":272,"props":5547,"children":5548},{},[5549],{"type":65,"value":5550},"Redirect URI mismatch",{"type":60,"tag":272,"props":5552,"children":5553},{},[5554],{"type":65,"value":5555},"Ensure redirect_uri matches app configuration exactly (including trailing slash)",{"type":60,"tag":240,"props":5557,"children":5558},{},[5559,5564,5569],{"type":60,"tag":272,"props":5560,"children":5561},{},[5562],{"type":65,"value":5563},"4711",{"type":60,"tag":272,"props":5565,"children":5566},{},[5567],{"type":65,"value":5568},"Refresh token invalid",{"type":60,"tag":272,"props":5570,"children":5571},{},[5572],{"type":65,"value":5573},"Token scopes don't match client scopes",{"type":60,"tag":240,"props":5575,"children":5576},{},[5577,5582,5587],{"type":60,"tag":272,"props":5578,"children":5579},{},[5580],{"type":65,"value":5581},"4717",{"type":60,"tag":272,"props":5583,"children":5584},{},[5585],{"type":65,"value":5586},"App has been disabled",{"type":60,"tag":272,"props":5588,"children":5589},{},[5590],{"type":65,"value":5591},"Contact Zoom support",{"type":60,"tag":240,"props":5593,"children":5594},{},[5595,5600,5605],{"type":60,"tag":272,"props":5596,"children":5597},{},[5598],{"type":65,"value":5599},"4733",{"type":60,"tag":272,"props":5601,"children":5602},{},[5603],{"type":65,"value":5604},"Code is expired",{"type":60,"tag":272,"props":5606,"children":5607},{},[5608],{"type":65,"value":5609},"Authorization codes expire in 5 minutes - restart flow",{"type":60,"tag":240,"props":5611,"children":5612},{},[5613,5618,5623],{"type":60,"tag":272,"props":5614,"children":5615},{},[5616],{"type":65,"value":5617},"4734",{"type":60,"tag":272,"props":5619,"children":5620},{},[5621],{"type":65,"value":5622},"Invalid authorization code",{"type":60,"tag":272,"props":5624,"children":5625},{},[5626],{"type":65,"value":5627},"Regenerate authorization code",{"type":60,"tag":240,"props":5629,"children":5630},{},[5631,5636,5641],{"type":60,"tag":272,"props":5632,"children":5633},{},[5634],{"type":65,"value":5635},"4735",{"type":60,"tag":272,"props":5637,"children":5638},{},[5639],{"type":65,"value":5640},"Owner of token does not exist",{"type":60,"tag":272,"props":5642,"children":5643},{},[5644],{"type":65,"value":5645},"User was removed from account - re-authorize",{"type":60,"tag":240,"props":5647,"children":5648},{},[5649,5654,5659],{"type":60,"tag":272,"props":5650,"children":5651},{},[5652],{"type":65,"value":5653},"4741",{"type":60,"tag":272,"props":5655,"children":5656},{},[5657],{"type":65,"value":5658},"Token has been revoked",{"type":60,"tag":272,"props":5660,"children":5661},{},[5662],{"type":65,"value":5663},"Use the most recent token from latest authorization",{"type":60,"tag":68,"props":5665,"children":5666},{},[5667,5669,5675],{"type":65,"value":5668},"See ",{"type":60,"tag":74,"props":5670,"children":5672},{"className":5671},[],[5673],{"type":65,"value":5674},"references\u002Foauth-errors.md",{"type":65,"value":5676}," for complete error list.",{"type":60,"tag":531,"props":5678,"children":5679},{},[],{"type":60,"tag":93,"props":5681,"children":5683},{"id":5682},"quick-reference",[5684],{"type":65,"value":5685},"Quick Reference",{"type":60,"tag":232,"props":5687,"children":5688},{},[5689,5713],{"type":60,"tag":236,"props":5690,"children":5691},{},[5692],{"type":60,"tag":240,"props":5693,"children":5694},{},[5695,5700,5704,5709],{"type":60,"tag":244,"props":5696,"children":5697},{},[5698],{"type":65,"value":5699},"Flow",{"type":60,"tag":244,"props":5701,"children":5702},{},[5703],{"type":65,"value":258},{"type":60,"tag":244,"props":5705,"children":5706},{},[5707],{"type":65,"value":5708},"Token Expiry",{"type":60,"tag":244,"props":5710,"children":5711},{},[5712],{"type":65,"value":882},{"type":60,"tag":265,"props":5714,"children":5715},{},[5716,5741,5766,5790],{"type":60,"tag":240,"props":5717,"children":5718},{},[5719,5724,5732,5736],{"type":60,"tag":272,"props":5720,"children":5721},{},[5722],{"type":65,"value":5723},"Account (S2S)",{"type":60,"tag":272,"props":5725,"children":5726},{},[5727],{"type":60,"tag":74,"props":5728,"children":5730},{"className":5729},[],[5731],{"type":65,"value":293},{"type":60,"tag":272,"props":5733,"children":5734},{},[5735],{"type":65,"value":892},{"type":60,"tag":272,"props":5737,"children":5738},{},[5739],{"type":65,"value":5740},"Request new token",{"type":60,"tag":240,"props":5742,"children":5743},{},[5744,5749,5757,5761],{"type":60,"tag":272,"props":5745,"children":5746},{},[5747],{"type":65,"value":5748},"User",{"type":60,"tag":272,"props":5750,"children":5751},{},[5752],{"type":60,"tag":74,"props":5753,"children":5755},{"className":5754},[],[5756],{"type":65,"value":323},{"type":60,"tag":272,"props":5758,"children":5759},{},[5760],{"type":65,"value":892},{"type":60,"tag":272,"props":5762,"children":5763},{},[5764],{"type":65,"value":5765},"Use refresh_token (90 day expiry)",{"type":60,"tag":240,"props":5767,"children":5768},{},[5769,5774,5782,5786],{"type":60,"tag":272,"props":5770,"children":5771},{},[5772],{"type":65,"value":5773},"Device",{"type":60,"tag":272,"props":5775,"children":5776},{},[5777],{"type":60,"tag":74,"props":5778,"children":5780},{"className":5779},[],[5781],{"type":65,"value":352},{"type":60,"tag":272,"props":5783,"children":5784},{},[5785],{"type":65,"value":892},{"type":60,"tag":272,"props":5787,"children":5788},{},[5789],{"type":65,"value":5765},{"type":60,"tag":240,"props":5791,"children":5792},{},[5793,5798,5806,5810],{"type":60,"tag":272,"props":5794,"children":5795},{},[5796],{"type":65,"value":5797},"Client (Chatbot)",{"type":60,"tag":272,"props":5799,"children":5800},{},[5801],{"type":60,"tag":74,"props":5802,"children":5804},{"className":5803},[],[5805],{"type":65,"value":381},{"type":60,"tag":272,"props":5807,"children":5808},{},[5809],{"type":65,"value":892},{"type":60,"tag":272,"props":5811,"children":5812},{},[5813],{"type":65,"value":5740},{"type":60,"tag":531,"props":5815,"children":5816},{},[],{"type":60,"tag":93,"props":5818,"children":5820},{"id":5819},"demo-guidance",[5821],{"type":65,"value":5822},"Demo Guidance",{"type":60,"tag":68,"props":5824,"children":5825},{},[5826,5828,5834],{"type":65,"value":5827},"If you build an OAuth demo app, document its runtime base URL in that demo project's own\nREADME or ",{"type":60,"tag":74,"props":5829,"children":5831},{"className":5830},[],[5832],{"type":65,"value":5833},".env.example",{"type":65,"value":5835},", not in this shared skill.",{"type":60,"tag":93,"props":5837,"children":5839},{"id":5838},"resources",[5840],{"type":65,"value":5841},"Resources",{"type":60,"tag":118,"props":5843,"children":5844},{},[5845,5861,5876,5891,5904],{"type":60,"tag":122,"props":5846,"children":5847},{},[5848,5853,5855],{"type":60,"tag":105,"props":5849,"children":5850},{},[5851],{"type":65,"value":5852},"OAuth docs",{"type":65,"value":5854},": ",{"type":60,"tag":129,"props":5856,"children":5859},{"href":5857,"rel":5858},"https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Fintegrations\u002Foauth\u002F",[211],[5860],{"type":65,"value":5857},{"type":60,"tag":122,"props":5862,"children":5863},{},[5864,5869,5870],{"type":60,"tag":105,"props":5865,"children":5866},{},[5867],{"type":65,"value":5868},"S2S OAuth docs",{"type":65,"value":5854},{"type":60,"tag":129,"props":5871,"children":5874},{"href":5872,"rel":5873},"https:\u002F\u002Fdevelopers.zoom.us\u002Fdocs\u002Finternal-apps\u002Fs2s-oauth\u002F",[211],[5875],{"type":65,"value":5872},{"type":60,"tag":122,"props":5877,"children":5878},{},[5879,5884,5885],{"type":60,"tag":105,"props":5880,"children":5881},{},[5882],{"type":65,"value":5883},"PKCE blog",{"type":65,"value":5854},{"type":60,"tag":129,"props":5886,"children":5889},{"href":5887,"rel":5888},"https:\u002F\u002Fdevelopers.zoom.us\u002Fblog\u002Fpcke-oauth-with-postman-rest-api\u002F",[211],[5890],{"type":65,"value":5887},{"type":60,"tag":122,"props":5892,"children":5893},{},[5894,5898,5899],{"type":60,"tag":105,"props":5895,"children":5896},{},[5897],{"type":65,"value":4975},{"type":65,"value":5854},{"type":60,"tag":129,"props":5900,"children":5902},{"href":5057,"rel":5901},[211],[5903],{"type":65,"value":5057},{"type":60,"tag":122,"props":5905,"children":5906},{},[5907,5911,5912],{"type":60,"tag":105,"props":5908,"children":5909},{},[5910],{"type":65,"value":4996},{"type":65,"value":5854},{"type":60,"tag":129,"props":5913,"children":5915},{"href":5260,"rel":5914},[211],[5916],{"type":65,"value":5260},{"type":60,"tag":531,"props":5918,"children":5919},{},[],{"type":60,"tag":93,"props":5921,"children":5923},{"id":5922},"integrated-index",[5924],{"type":65,"value":5925},"Integrated Index",{"type":60,"tag":68,"props":5927,"children":5928},{},[5929],{"type":60,"tag":5930,"props":5931,"children":5932},"em",{},[5933,5935,5941],{"type":65,"value":5934},"This section was migrated from ",{"type":60,"tag":74,"props":5936,"children":5938},{"className":5937},[],[5939],{"type":65,"value":5940},"SKILL.md",{"type":65,"value":111},{"type":60,"tag":93,"props":5943,"children":5945},{"id":5944},"quick-start-path",[5946],{"type":65,"value":5947},"Quick Start Path",{"type":60,"tag":68,"props":5949,"children":5950},{},[5951],{"type":60,"tag":105,"props":5952,"children":5953},{},[5954],{"type":65,"value":5955},"If you're new to Zoom OAuth, follow this order:",{"type":60,"tag":5343,"props":5957,"children":5958},{},[5959,5973,5999,6030,6082,6104,6131],{"type":60,"tag":122,"props":5960,"children":5961},{},[5962,5967,5969],{"type":60,"tag":105,"props":5963,"children":5964},{},[5965],{"type":65,"value":5966},"Run preflight checks first",{"type":65,"value":5968}," → ",{"type":60,"tag":129,"props":5970,"children":5971},{"href":131},[5972],{"type":65,"value":131},{"type":60,"tag":122,"props":5974,"children":5975},{},[5976,5981,5982,5986],{"type":60,"tag":105,"props":5977,"children":5978},{},[5979],{"type":65,"value":5980},"Choose your OAuth flow",{"type":65,"value":5968},{"type":60,"tag":129,"props":5983,"children":5984},{"href":145},[5985],{"type":65,"value":145},{"type":60,"tag":118,"props":5987,"children":5988},{},[5989,5994],{"type":60,"tag":122,"props":5990,"children":5991},{},[5992],{"type":65,"value":5993},"4 flows: S2S (backend), User (SaaS), Device (no browser), Chatbot",{"type":60,"tag":122,"props":5995,"children":5996},{},[5997],{"type":65,"value":5998},"Decision matrix: Which flow fits your use case?",{"type":60,"tag":122,"props":6000,"children":6001},{},[6002,6007,6008,6012],{"type":60,"tag":105,"props":6003,"children":6004},{},[6005],{"type":65,"value":6006},"Understand token lifecycle",{"type":65,"value":5968},{"type":60,"tag":129,"props":6009,"children":6010},{"href":159},[6011],{"type":65,"value":159},{"type":60,"tag":118,"props":6013,"children":6014},{},[6015,6025],{"type":60,"tag":122,"props":6016,"children":6017},{},[6018,6023],{"type":60,"tag":105,"props":6019,"children":6020},{},[6021],{"type":65,"value":6022},"CRITICAL",{"type":65,"value":6024},": How tokens expire, refresh, and revoke",{"type":60,"tag":122,"props":6026,"children":6027},{},[6028],{"type":65,"value":6029},"Common pitfalls: refresh token rotation",{"type":60,"tag":122,"props":6031,"children":6032},{},[6033,6038,6040],{"type":60,"tag":105,"props":6034,"children":6035},{},[6036],{"type":65,"value":6037},"Implement your flow",{"type":65,"value":6039}," → Jump to examples:",{"type":60,"tag":118,"props":6041,"children":6042},{},[6043,6052,6062,6072],{"type":60,"tag":122,"props":6044,"children":6045},{},[6046,6048],{"type":65,"value":6047},"Backend automation → ",{"type":60,"tag":129,"props":6049,"children":6050},{"href":173},[6051],{"type":65,"value":173},{"type":60,"tag":122,"props":6053,"children":6054},{},[6055,6057],{"type":65,"value":6056},"SaaS app → ",{"type":60,"tag":129,"props":6058,"children":6060},{"href":6059},"examples\u002Fuser-oauth-mysql.md",[6061],{"type":65,"value":6059},{"type":60,"tag":122,"props":6063,"children":6064},{},[6065,6067],{"type":65,"value":6066},"Mobile\u002FSPA → ",{"type":60,"tag":129,"props":6068,"children":6070},{"href":6069},"examples\u002Fpkce-implementation.md",[6071],{"type":65,"value":6069},{"type":60,"tag":122,"props":6073,"children":6074},{},[6075,6077],{"type":65,"value":6076},"Device (TV\u002Fkiosk) → ",{"type":60,"tag":129,"props":6078,"children":6080},{"href":6079},"examples\u002Fdevice-flow.md",[6081],{"type":65,"value":6079},{"type":60,"tag":122,"props":6083,"children":6084},{},[6085,6090,6091,6096],{"type":60,"tag":105,"props":6086,"children":6087},{},[6088],{"type":65,"value":6089},"Fix redirect URI issues",{"type":65,"value":5968},{"type":60,"tag":129,"props":6092,"children":6094},{"href":6093},"troubleshooting\u002Fredirect-uri-issues.md",[6095],{"type":65,"value":6093},{"type":60,"tag":118,"props":6097,"children":6098},{},[6099],{"type":60,"tag":122,"props":6100,"children":6101},{},[6102],{"type":65,"value":6103},"Most common OAuth error: Redirect URI mismatch",{"type":60,"tag":122,"props":6105,"children":6106},{},[6107,6112,6113,6118],{"type":60,"tag":105,"props":6108,"children":6109},{},[6110],{"type":65,"value":6111},"Implement token refresh",{"type":65,"value":5968},{"type":60,"tag":129,"props":6114,"children":6116},{"href":6115},"examples\u002Ftoken-refresh.md",[6117],{"type":65,"value":6115},{"type":60,"tag":118,"props":6119,"children":6120},{},[6121,6126],{"type":60,"tag":122,"props":6122,"children":6123},{},[6124],{"type":65,"value":6125},"Automatic middleware pattern",{"type":60,"tag":122,"props":6127,"children":6128},{},[6129],{"type":65,"value":6130},"Handle refresh token rotation",{"type":60,"tag":122,"props":6132,"children":6133},{},[6134,6139,6140,6144],{"type":60,"tag":105,"props":6135,"children":6136},{},[6137],{"type":65,"value":6138},"Troubleshoot errors",{"type":65,"value":5968},{"type":60,"tag":129,"props":6141,"children":6142},{"href":187},[6143],{"type":65,"value":187},{"type":60,"tag":118,"props":6145,"children":6146},{},[6147,6152],{"type":60,"tag":122,"props":6148,"children":6149},{},[6150],{"type":65,"value":6151},"Error code tables (4700-4741 range)",{"type":60,"tag":122,"props":6153,"children":6154},{},[6155],{"type":65,"value":6156},"Quick diagnostic workflow",{"type":60,"tag":531,"props":6158,"children":6159},{},[],{"type":60,"tag":93,"props":6161,"children":6163},{"id":6162},"documentation-structure",[6164],{"type":65,"value":6165},"Documentation Structure",{"type":60,"tag":519,"props":6167,"children":6170},{"className":6168,"code":6169,"language":65},[522],"oauth\u002F\n├── SKILL.md                           # Main skill overview\n├── SKILL.md                           # This file - navigation guide\n│\n├── concepts\u002F                          # Core OAuth concepts\n│   ├── oauth-flows.md                # 4 flows: S2S, User, Device, Chatbot\n│   ├── token-lifecycle.md            # Expiration, refresh, revocation\n│   ├── pkce.md                       # PKCE security for public clients\n│   ├── scopes-architecture.md        # Classic vs Granular scopes\n│   └── state-parameter.md            # CSRF protection with state\n│\n├── examples\u002F                          # Complete working code\n│   ├── s2s-oauth-basic.md            # S2S OAuth minimal example\n│   ├── s2s-oauth-redis.md            # S2S OAuth with Redis caching (production)\n│   ├── user-oauth-basic.md           # User OAuth minimal example\n│   ├── user-oauth-mysql.md           # User OAuth with MySQL + encryption (production)\n│   ├── device-flow.md                # Device authorization flow\n│   ├── pkce-implementation.md        # PKCE for SPAs\u002Fmobile apps\n│   └── token-refresh.md              # Auto-refresh middleware pattern\n│\n├── troubleshooting\u002F                   # Problem solving guides\n│   ├── common-errors.md              # Error codes 4700-4741\n│   ├── redirect-uri-issues.md        # Most common OAuth error\n│   ├── token-issues.md               # Expired, revoked, invalid tokens\n│   └── scope-issues.md               # Scope mismatch errors\n│\n└── references\u002F                        # Reference documentation\n    ├── oauth-errors.md                # Complete error code reference\n    ├── classic-scopes.md              # Classic scope reference\n    └── granular-scopes.md             # Granular scope reference\n",[6171],{"type":60,"tag":74,"props":6172,"children":6173},{"__ignoreMap":527},[6174],{"type":65,"value":6169},{"type":60,"tag":531,"props":6176,"children":6177},{},[],{"type":60,"tag":93,"props":6179,"children":6181},{"id":6180},"by-use-case",[6182],{"type":65,"value":6183},"By Use Case",{"type":60,"tag":388,"props":6185,"children":6187},{"id":6186},"i-want-to-automate-zoom-tasks-on-my-own-account",[6188],{"type":65,"value":6189},"I want to automate Zoom tasks on my own account",{"type":60,"tag":5343,"props":6191,"children":6192},{},[6193,6203,6213],{"type":60,"tag":122,"props":6194,"children":6195},{},[6196,6201],{"type":60,"tag":129,"props":6197,"children":6199},{"href":6198},"concepts\u002Foauth-flows.md#server-to-server-s2s-oauth",[6200],{"type":65,"value":148},{"type":65,"value":6202}," - S2S OAuth explained",{"type":60,"tag":122,"props":6204,"children":6205},{},[6206,6211],{"type":60,"tag":129,"props":6207,"children":6208},{"href":173},[6209],{"type":65,"value":6210},"S2S OAuth Redis",{"type":65,"value":6212}," - Production pattern with Redis caching",{"type":60,"tag":122,"props":6214,"children":6215},{},[6216,6220],{"type":60,"tag":129,"props":6217,"children":6218},{"href":159},[6219],{"type":65,"value":162},{"type":65,"value":6221}," - 1hr token, no refresh",{"type":60,"tag":388,"props":6223,"children":6225},{"id":6224},"i-want-to-build-a-saas-app-for-other-zoom-users",[6226],{"type":65,"value":6227},"I want to build a SaaS app for other Zoom users",{"type":60,"tag":5343,"props":6229,"children":6230},{},[6231,6241,6251,6261],{"type":60,"tag":122,"props":6232,"children":6233},{},[6234,6239],{"type":60,"tag":129,"props":6235,"children":6237},{"href":6236},"concepts\u002Foauth-flows.md#user-authorization-oauth",[6238],{"type":65,"value":148},{"type":65,"value":6240}," - User OAuth explained",{"type":60,"tag":122,"props":6242,"children":6243},{},[6244,6249],{"type":60,"tag":129,"props":6245,"children":6246},{"href":6059},[6247],{"type":65,"value":6248},"User OAuth MySQL",{"type":65,"value":6250}," - Production pattern with encryption",{"type":60,"tag":122,"props":6252,"children":6253},{},[6254,6259],{"type":60,"tag":129,"props":6255,"children":6256},{"href":6115},[6257],{"type":65,"value":6258},"Token Refresh",{"type":65,"value":6260}," - Automatic refresh middleware",{"type":60,"tag":122,"props":6262,"children":6263},{},[6264,6269],{"type":60,"tag":129,"props":6265,"children":6266},{"href":6093},[6267],{"type":65,"value":6268},"Redirect URI Issues",{"type":65,"value":6270}," - Fix most common error",{"type":60,"tag":388,"props":6272,"children":6274},{"id":6273},"i-want-to-build-a-mobile-or-spa-app",[6275],{"type":65,"value":6276},"I want to build a mobile or SPA app",{"type":60,"tag":5343,"props":6278,"children":6279},{},[6280,6290,6300],{"type":60,"tag":122,"props":6281,"children":6282},{},[6283,6288],{"type":60,"tag":129,"props":6284,"children":6286},{"href":6285},"concepts\u002Fpkce.md",[6287],{"type":65,"value":506},{"type":65,"value":6289}," - Why PKCE is required for public clients",{"type":60,"tag":122,"props":6291,"children":6292},{},[6293,6298],{"type":60,"tag":129,"props":6294,"children":6295},{"href":6069},[6296],{"type":65,"value":6297},"PKCE Implementation",{"type":65,"value":6299}," - Complete code example",{"type":60,"tag":122,"props":6301,"children":6302},{},[6303,6309],{"type":60,"tag":129,"props":6304,"children":6306},{"href":6305},"concepts\u002Fstate-parameter.md",[6307],{"type":65,"value":6308},"State Parameter",{"type":65,"value":6310}," - CSRF protection",{"type":60,"tag":388,"props":6312,"children":6314},{"id":6313},"i-want-to-build-an-app-for-devices-without-browsers-tv-kiosk",[6315],{"type":65,"value":6316},"I want to build an app for devices without browsers (TV, kiosk)",{"type":60,"tag":5343,"props":6318,"children":6319},{},[6320,6330,6340],{"type":60,"tag":122,"props":6321,"children":6322},{},[6323,6328],{"type":60,"tag":129,"props":6324,"children":6326},{"href":6325},"concepts\u002Foauth-flows.md#device-authorization-flow",[6327],{"type":65,"value":148},{"type":65,"value":6329}," - Device flow explained",{"type":60,"tag":122,"props":6331,"children":6332},{},[6333,6338],{"type":60,"tag":129,"props":6334,"children":6335},{"href":6079},[6336],{"type":65,"value":6337},"Device Flow Example",{"type":65,"value":6339}," - Complete polling implementation",{"type":60,"tag":122,"props":6341,"children":6342},{},[6343,6348],{"type":60,"tag":129,"props":6344,"children":6345},{"href":187},[6346],{"type":65,"value":6347},"Common Errors",{"type":65,"value":6349}," - Device-specific errors",{"type":60,"tag":388,"props":6351,"children":6353},{"id":6352},"im-building-a-team-chat-bot",[6354],{"type":65,"value":6355},"I'm building a Team Chat bot",{"type":60,"tag":5343,"props":6357,"children":6358},{},[6359,6369,6380],{"type":60,"tag":122,"props":6360,"children":6361},{},[6362,6367],{"type":60,"tag":129,"props":6363,"children":6365},{"href":6364},"concepts\u002Foauth-flows.md#client-authorization-chatbot",[6366],{"type":65,"value":148},{"type":65,"value":6368}," - Chatbot flow explained",{"type":60,"tag":122,"props":6370,"children":6371},{},[6372,6378],{"type":60,"tag":129,"props":6373,"children":6375},{"href":6374},"examples\u002Fs2s-oauth-basic.md",[6376],{"type":65,"value":6377},"S2S OAuth Basic",{"type":65,"value":6379}," - Similar pattern, different grant type",{"type":60,"tag":122,"props":6381,"children":6382},{},[6383,6389],{"type":60,"tag":129,"props":6384,"children":6386},{"href":6385},"concepts\u002Fscopes-architecture.md",[6387],{"type":65,"value":6388},"Scopes Architecture",{"type":65,"value":6390}," - Chatbot-specific scopes",{"type":60,"tag":388,"props":6392,"children":6394},{"id":6393},"im-getting-redirect-uri-errors-4709",[6395],{"type":65,"value":6396},"I'm getting redirect URI errors (4709)",{"type":60,"tag":5343,"props":6398,"children":6399},{},[6400,6414,6424],{"type":60,"tag":122,"props":6401,"children":6402},{},[6403,6407,6409],{"type":60,"tag":129,"props":6404,"children":6405},{"href":6093},[6406],{"type":65,"value":6268},{"type":65,"value":6408}," - ",{"type":60,"tag":105,"props":6410,"children":6411},{},[6412],{"type":65,"value":6413},"START HERE!",{"type":60,"tag":122,"props":6415,"children":6416},{},[6417,6422],{"type":60,"tag":129,"props":6418,"children":6420},{"href":6419},"troubleshooting\u002Fcommon-errors.md#4709-redirect-uri-mismatch",[6421],{"type":65,"value":6347},{"type":65,"value":6423}," - Error details",{"type":60,"tag":122,"props":6425,"children":6426},{},[6427,6433],{"type":60,"tag":129,"props":6428,"children":6430},{"href":6429},"examples\u002Fuser-oauth-basic.md",[6431],{"type":65,"value":6432},"User OAuth Basic",{"type":65,"value":6434}," - See correct pattern",{"type":60,"tag":388,"props":6436,"children":6438},{"id":6437},"im-getting-token-errors-4700-4741",[6439],{"type":65,"value":6440},"I'm getting token errors (4700-4741)",{"type":60,"tag":5343,"props":6442,"children":6443},{},[6444,6455,6464,6473],{"type":60,"tag":122,"props":6445,"children":6446},{},[6447,6453],{"type":60,"tag":129,"props":6448,"children":6450},{"href":6449},"troubleshooting\u002Ftoken-issues.md",[6451],{"type":65,"value":6452},"Token Issues",{"type":65,"value":6454}," - Diagnostic workflow",{"type":60,"tag":122,"props":6456,"children":6457},{},[6458,6462],{"type":60,"tag":129,"props":6459,"children":6460},{"href":159},[6461],{"type":65,"value":162},{"type":65,"value":6463}," - Understand expiration",{"type":60,"tag":122,"props":6465,"children":6466},{},[6467,6471],{"type":60,"tag":129,"props":6468,"children":6469},{"href":6115},[6470],{"type":65,"value":6258},{"type":65,"value":6472}," - Implement auto-refresh",{"type":60,"tag":122,"props":6474,"children":6475},{},[6476,6480],{"type":60,"tag":129,"props":6477,"children":6478},{"href":187},[6479],{"type":65,"value":6347},{"type":65,"value":6481}," - Error code tables",{"type":60,"tag":388,"props":6483,"children":6485},{"id":6484},"im-getting-scope-errors-4711",[6486],{"type":65,"value":6487},"I'm getting scope errors (4711)",{"type":60,"tag":5343,"props":6489,"children":6490},{},[6491,6502,6511,6521],{"type":60,"tag":122,"props":6492,"children":6493},{},[6494,6500],{"type":60,"tag":129,"props":6495,"children":6497},{"href":6496},"troubleshooting\u002Fscope-issues.md",[6498],{"type":65,"value":6499},"Scope Issues",{"type":65,"value":6501}," - Mismatch causes",{"type":60,"tag":122,"props":6503,"children":6504},{},[6505,6509],{"type":60,"tag":129,"props":6506,"children":6507},{"href":6385},[6508],{"type":65,"value":6388},{"type":65,"value":6510}," - Classic vs Granular",{"type":60,"tag":122,"props":6512,"children":6513},{},[6514,6519],{"type":60,"tag":129,"props":6515,"children":6517},{"href":6516},"references\u002Fclassic-scopes.md",[6518],{"type":65,"value":5012},{"type":65,"value":6520}," - Complete scope reference",{"type":60,"tag":122,"props":6522,"children":6523},{},[6524,6529],{"type":60,"tag":129,"props":6525,"children":6527},{"href":6526},"references\u002Fgranular-scopes.md",[6528],{"type":65,"value":5066},{"type":65,"value":6530}," - Granular scope reference",{"type":60,"tag":388,"props":6532,"children":6534},{"id":6533},"i-need-to-refresh-tokens",[6535],{"type":65,"value":6536},"I need to refresh tokens",{"type":60,"tag":5343,"props":6538,"children":6539},{},[6540,6550,6559],{"type":60,"tag":122,"props":6541,"children":6542},{},[6543,6548],{"type":60,"tag":129,"props":6544,"children":6546},{"href":6545},"concepts\u002Ftoken-lifecycle.md#refresh-strategy",[6547],{"type":65,"value":162},{"type":65,"value":6549}," - When to refresh",{"type":60,"tag":122,"props":6551,"children":6552},{},[6553,6557],{"type":60,"tag":129,"props":6554,"children":6555},{"href":6115},[6556],{"type":65,"value":6258},{"type":65,"value":6558}," - Middleware pattern",{"type":60,"tag":122,"props":6560,"children":6561},{},[6562,6567],{"type":60,"tag":129,"props":6563,"children":6565},{"href":6564},"troubleshooting\u002Ftoken-issues.md#refresh-token-problems",[6566],{"type":65,"value":6452},{"type":65,"value":6568}," - Common mistakes",{"type":60,"tag":388,"props":6570,"children":6572},{"id":6571},"i-want-to-understand-the-difference-between-classic-and-granular-scopes",[6573],{"type":65,"value":6574},"I want to understand the difference between Classic and Granular scopes",{"type":60,"tag":5343,"props":6576,"children":6577},{},[6578,6591,6607],{"type":60,"tag":122,"props":6579,"children":6580},{},[6581,6585,6586],{"type":60,"tag":129,"props":6582,"children":6583},{"href":6385},[6584],{"type":65,"value":6388},{"type":65,"value":6408},{"type":60,"tag":105,"props":6587,"children":6588},{},[6589],{"type":65,"value":6590},"Complete comparison",{"type":60,"tag":122,"props":6592,"children":6593},{},[6594,6598,6599,6605],{"type":60,"tag":129,"props":6595,"children":6596},{"href":6516},[6597],{"type":65,"value":5012},{"type":65,"value":6408},{"type":60,"tag":74,"props":6600,"children":6602},{"className":6601},[],[6603],{"type":65,"value":6604},"resource:level",{"type":65,"value":6606}," format",{"type":60,"tag":122,"props":6608,"children":6609},{},[6610,6614,6615,6621],{"type":60,"tag":129,"props":6611,"children":6612},{"href":6526},[6613],{"type":65,"value":5066},{"type":65,"value":6408},{"type":60,"tag":74,"props":6616,"children":6618},{"className":6617},[],[6619],{"type":65,"value":6620},"service:action:data_claim:access",{"type":65,"value":6606},{"type":60,"tag":388,"props":6623,"children":6625},{"id":6624},"i-need-to-secure-my-oauth-implementation",[6626],{"type":65,"value":6627},"I need to secure my OAuth implementation",{"type":60,"tag":5343,"props":6629,"children":6630},{},[6631,6640,6648],{"type":60,"tag":122,"props":6632,"children":6633},{},[6634,6638],{"type":60,"tag":129,"props":6635,"children":6636},{"href":6285},[6637],{"type":65,"value":506},{"type":65,"value":6639}," - Public client security",{"type":60,"tag":122,"props":6641,"children":6642},{},[6643,6647],{"type":60,"tag":129,"props":6644,"children":6645},{"href":6305},[6646],{"type":65,"value":6308},{"type":65,"value":6310},{"type":60,"tag":122,"props":6649,"children":6650},{},[6651,6656],{"type":60,"tag":129,"props":6652,"children":6654},{"href":6653},"examples\u002Fuser-oauth-mysql.md#token-encryption",[6655],{"type":65,"value":6248},{"type":65,"value":6657}," - Token encryption at rest",{"type":60,"tag":388,"props":6659,"children":6661},{"id":6660},"i-want-to-migrate-from-jwt-app-to-s2s-oauth",[6662],{"type":65,"value":6663},"I want to migrate from JWT app to S2S OAuth",{"type":60,"tag":5343,"props":6665,"children":6666},{},[6667,6676],{"type":60,"tag":122,"props":6668,"children":6669},{},[6670,6674],{"type":60,"tag":129,"props":6671,"children":6672},{"href":173},[6673],{"type":65,"value":6210},{"type":65,"value":6675}," - Modern replacement",{"type":60,"tag":122,"props":6677,"children":6678},{},[6679,6683],{"type":60,"tag":129,"props":6680,"children":6681},{"href":159},[6682],{"type":65,"value":162},{"type":65,"value":6684}," - Different token behavior",{"type":60,"tag":6686,"props":6687,"children":6688},"blockquote",{},[6689],{"type":60,"tag":68,"props":6690,"children":6691},{},[6692,6697],{"type":60,"tag":105,"props":6693,"children":6694},{},[6695],{"type":65,"value":6696},"Note",{"type":65,"value":6698},": JWT App Type was deprecated in June 2023. Migrate to S2S OAuth for server-to-server automation.",{"type":60,"tag":531,"props":6700,"children":6701},{},[],{"type":60,"tag":93,"props":6703,"children":6705},{"id":6704},"most-critical-documents",[6706],{"type":65,"value":6707},"Most Critical Documents",{"type":60,"tag":388,"props":6709,"children":6711},{"id":6710},"_1-oauth-flows-decision-document",[6712],{"type":65,"value":6713},"1. OAuth Flows (DECISION DOCUMENT)",{"type":60,"tag":68,"props":6715,"children":6716},{},[6717],{"type":60,"tag":105,"props":6718,"children":6719},{},[6720],{"type":60,"tag":129,"props":6721,"children":6722},{"href":145},[6723],{"type":65,"value":145},{"type":60,"tag":68,"props":6725,"children":6726},{},[6727],{"type":65,"value":6728},"Understand which of the 4 flows to use:",{"type":60,"tag":118,"props":6730,"children":6731},{},[6732,6742,6752,6762],{"type":60,"tag":122,"props":6733,"children":6734},{},[6735,6740],{"type":60,"tag":105,"props":6736,"children":6737},{},[6738],{"type":65,"value":6739},"S2S OAuth",{"type":65,"value":6741},": Backend automation (your account)",{"type":60,"tag":122,"props":6743,"children":6744},{},[6745,6750],{"type":60,"tag":105,"props":6746,"children":6747},{},[6748],{"type":65,"value":6749},"User OAuth",{"type":65,"value":6751},": SaaS apps (users authorize you)",{"type":60,"tag":122,"props":6753,"children":6754},{},[6755,6760],{"type":60,"tag":105,"props":6756,"children":6757},{},[6758],{"type":65,"value":6759},"Device Flow",{"type":65,"value":6761},": Devices without browsers",{"type":60,"tag":122,"props":6763,"children":6764},{},[6765,6770],{"type":60,"tag":105,"props":6766,"children":6767},{},[6768],{"type":65,"value":6769},"Chatbot",{"type":65,"value":6771},": Team Chat bots only",{"type":60,"tag":388,"props":6773,"children":6775},{"id":6774},"_2-token-lifecycle-most-common-issue",[6776],{"type":65,"value":6777},"2. Token Lifecycle (MOST COMMON ISSUE)",{"type":60,"tag":68,"props":6779,"children":6780},{},[6781],{"type":60,"tag":105,"props":6782,"children":6783},{},[6784],{"type":60,"tag":129,"props":6785,"children":6786},{"href":159},[6787],{"type":65,"value":159},{"type":60,"tag":68,"props":6789,"children":6790},{},[6791],{"type":65,"value":6792},"99% of OAuth issues stem from misunderstanding:",{"type":60,"tag":118,"props":6794,"children":6795},{},[6796,6801,6806],{"type":60,"tag":122,"props":6797,"children":6798},{},[6799],{"type":65,"value":6800},"Token expiration (1 hour for all flows)",{"type":60,"tag":122,"props":6802,"children":6803},{},[6804],{"type":65,"value":6805},"Refresh token rotation (must save new refresh token)",{"type":60,"tag":122,"props":6807,"children":6808},{},[6809],{"type":65,"value":6810},"Revocation behavior (invalidates all tokens)",{"type":60,"tag":388,"props":6812,"children":6814},{"id":6813},"_3-redirect-uri-issues-most-common-error",[6815],{"type":65,"value":6816},"3. Redirect URI Issues (MOST COMMON ERROR)",{"type":60,"tag":68,"props":6818,"children":6819},{},[6820],{"type":60,"tag":105,"props":6821,"children":6822},{},[6823],{"type":60,"tag":129,"props":6824,"children":6825},{"href":6093},[6826],{"type":65,"value":6093},{"type":60,"tag":68,"props":6828,"children":6829},{},[6830],{"type":65,"value":6831},"Error 4709 (\"Redirect URI mismatch\") is the #1 OAuth error.\nMust match EXACTLY (including trailing slash, http vs https).",{"type":60,"tag":531,"props":6833,"children":6834},{},[],{"type":60,"tag":93,"props":6836,"children":6838},{"id":6837},"key-learnings",[6839],{"type":65,"value":6840},"Key Learnings",{"type":60,"tag":388,"props":6842,"children":6844},{"id":6843},"critical-discoveries",[6845],{"type":65,"value":6846},"Critical Discoveries:",{"type":60,"tag":5343,"props":6848,"children":6849},{},[6850,6885,6920,6994,7028,7062,7091,7117,7163,7193],{"type":60,"tag":122,"props":6851,"children":6852},{},[6853,6858],{"type":60,"tag":105,"props":6854,"children":6855},{},[6856],{"type":65,"value":6857},"Refresh Token Rotation",{"type":60,"tag":118,"props":6859,"children":6860},{},[6861,6866,6871,6876],{"type":60,"tag":122,"props":6862,"children":6863},{},[6864],{"type":65,"value":6865},"Each refresh returns a NEW refresh token",{"type":60,"tag":122,"props":6867,"children":6868},{},[6869],{"type":65,"value":6870},"Old refresh token becomes invalid",{"type":60,"tag":122,"props":6872,"children":6873},{},[6874],{"type":65,"value":6875},"Failure to save new token causes 4735 errors",{"type":60,"tag":122,"props":6877,"children":6878},{},[6879,6881],{"type":65,"value":6880},"See: ",{"type":60,"tag":129,"props":6882,"children":6883},{"href":6115},[6884],{"type":65,"value":6258},{"type":60,"tag":122,"props":6886,"children":6887},{},[6888,6893],{"type":60,"tag":105,"props":6889,"children":6890},{},[6891],{"type":65,"value":6892},"S2S OAuth Uses Redis, User OAuth Uses Database",{"type":60,"tag":118,"props":6894,"children":6895},{},[6896,6901,6906],{"type":60,"tag":122,"props":6897,"children":6898},{},[6899],{"type":65,"value":6900},"S2S: Single token for entire account → Redis (ephemeral)",{"type":60,"tag":122,"props":6902,"children":6903},{},[6904],{"type":65,"value":6905},"User: Per-user tokens → Database (persistent)",{"type":60,"tag":122,"props":6907,"children":6908},{},[6909,6910,6914,6916],{"type":65,"value":6880},{"type":60,"tag":129,"props":6911,"children":6912},{"href":173},[6913],{"type":65,"value":6210},{"type":65,"value":6915}," vs ",{"type":60,"tag":129,"props":6917,"children":6918},{"href":6059},[6919],{"type":65,"value":6248},{"type":60,"tag":122,"props":6921,"children":6922},{},[6923,6928],{"type":60,"tag":105,"props":6924,"children":6925},{},[6926],{"type":65,"value":6927},"Redirect URI Must Match EXACTLY",{"type":60,"tag":118,"props":6929,"children":6930},{},[6931,6950,6968,6986],{"type":60,"tag":122,"props":6932,"children":6933},{},[6934,6936,6942,6944],{"type":65,"value":6935},"Trailing slash matters: ",{"type":60,"tag":74,"props":6937,"children":6939},{"className":6938},[],[6940],{"type":65,"value":6941},"\u002Fcallback",{"type":65,"value":6943}," ≠ ",{"type":60,"tag":74,"props":6945,"children":6947},{"className":6946},[],[6948],{"type":65,"value":6949},"\u002Fcallback\u002F",{"type":60,"tag":122,"props":6951,"children":6952},{},[6953,6955,6961,6962],{"type":65,"value":6954},"Protocol matters: ",{"type":60,"tag":74,"props":6956,"children":6958},{"className":6957},[],[6959],{"type":65,"value":6960},"http:\u002F\u002F",{"type":65,"value":6943},{"type":60,"tag":74,"props":6963,"children":6965},{"className":6964},[],[6966],{"type":65,"value":6967},"https:\u002F\u002F",{"type":60,"tag":122,"props":6969,"children":6970},{},[6971,6973,6979,6980],{"type":65,"value":6972},"Port matters: ",{"type":60,"tag":74,"props":6974,"children":6976},{"className":6975},[],[6977],{"type":65,"value":6978},":3000",{"type":65,"value":6943},{"type":60,"tag":74,"props":6981,"children":6983},{"className":6982},[],[6984],{"type":65,"value":6985},":3001",{"type":60,"tag":122,"props":6987,"children":6988},{},[6989,6990],{"type":65,"value":6880},{"type":60,"tag":129,"props":6991,"children":6992},{"href":6093},[6993],{"type":65,"value":6268},{"type":60,"tag":122,"props":6995,"children":6996},{},[6997,7002],{"type":60,"tag":105,"props":6998,"children":6999},{},[7000],{"type":65,"value":7001},"PKCE Required for Public Clients",{"type":60,"tag":118,"props":7003,"children":7004},{},[7005,7010,7015,7020],{"type":60,"tag":122,"props":7006,"children":7007},{},[7008],{"type":65,"value":7009},"Mobile apps CANNOT keep secrets",{"type":60,"tag":122,"props":7011,"children":7012},{},[7013],{"type":65,"value":7014},"SPAs CANNOT keep secrets",{"type":60,"tag":122,"props":7016,"children":7017},{},[7018],{"type":65,"value":7019},"PKCE prevents authorization code interception",{"type":60,"tag":122,"props":7021,"children":7022},{},[7023,7024],{"type":65,"value":6880},{"type":60,"tag":129,"props":7025,"children":7026},{"href":6285},[7027],{"type":65,"value":506},{"type":60,"tag":122,"props":7029,"children":7030},{},[7031,7036],{"type":60,"tag":105,"props":7032,"children":7033},{},[7034],{"type":65,"value":7035},"State Parameter Prevents CSRF",{"type":60,"tag":118,"props":7037,"children":7038},{},[7039,7044,7049,7054],{"type":60,"tag":122,"props":7040,"children":7041},{},[7042],{"type":65,"value":7043},"Generate random state before redirect",{"type":60,"tag":122,"props":7045,"children":7046},{},[7047],{"type":65,"value":7048},"Store in session",{"type":60,"tag":122,"props":7050,"children":7051},{},[7052],{"type":65,"value":7053},"Verify on callback",{"type":60,"tag":122,"props":7055,"children":7056},{},[7057,7058],{"type":65,"value":6880},{"type":60,"tag":129,"props":7059,"children":7060},{"href":6305},[7061],{"type":65,"value":6308},{"type":60,"tag":122,"props":7063,"children":7064},{},[7065,7070],{"type":60,"tag":105,"props":7066,"children":7067},{},[7068],{"type":65,"value":7069},"Token Storage Must Be Encrypted",{"type":60,"tag":118,"props":7071,"children":7072},{},[7073,7078,7083],{"type":60,"tag":122,"props":7074,"children":7075},{},[7076],{"type":65,"value":7077},"NEVER store tokens in plain text",{"type":60,"tag":122,"props":7079,"children":7080},{},[7081],{"type":65,"value":7082},"Use AES-256 minimum",{"type":60,"tag":122,"props":7084,"children":7085},{},[7086,7087],{"type":65,"value":6880},{"type":60,"tag":129,"props":7088,"children":7089},{"href":6653},[7090],{"type":65,"value":6248},{"type":60,"tag":122,"props":7092,"children":7093},{},[7094,7099],{"type":60,"tag":105,"props":7095,"children":7096},{},[7097],{"type":65,"value":7098},"JWT App Type is Deprecated (June 2023)",{"type":60,"tag":118,"props":7100,"children":7101},{},[7102,7107,7112],{"type":60,"tag":122,"props":7103,"children":7104},{},[7105],{"type":65,"value":7106},"No new JWT apps can be created",{"type":60,"tag":122,"props":7108,"children":7109},{},[7110],{"type":65,"value":7111},"Existing apps still work but will eventually be sunset",{"type":60,"tag":122,"props":7113,"children":7114},{},[7115],{"type":65,"value":7116},"Migrate to S2S OAuth or User OAuth",{"type":60,"tag":122,"props":7118,"children":7119},{},[7120,7125],{"type":60,"tag":105,"props":7121,"children":7122},{},[7123],{"type":65,"value":7124},"Scope Levels Determine Authorization Requirements",{"type":60,"tag":118,"props":7126,"children":7127},{},[7128,7133,7144,7155],{"type":60,"tag":122,"props":7129,"children":7130},{},[7131],{"type":65,"value":7132},"No suffix (user-level): Any user can authorize",{"type":60,"tag":122,"props":7134,"children":7135},{},[7136,7142],{"type":60,"tag":74,"props":7137,"children":7139},{"className":7138},[],[7140],{"type":65,"value":7141},":admin",{"type":65,"value":7143},": Requires admin role",{"type":60,"tag":122,"props":7145,"children":7146},{},[7147,7153],{"type":60,"tag":74,"props":7148,"children":7150},{"className":7149},[],[7151],{"type":65,"value":7152},":master",{"type":65,"value":7154},": Requires account owner (multi-account)",{"type":60,"tag":122,"props":7156,"children":7157},{},[7158,7159],{"type":65,"value":6880},{"type":60,"tag":129,"props":7160,"children":7161},{"href":6385},[7162],{"type":65,"value":6388},{"type":60,"tag":122,"props":7164,"children":7165},{},[7166,7171],{"type":60,"tag":105,"props":7167,"children":7168},{},[7169],{"type":65,"value":7170},"Authorization Codes Expire in 5 Minutes",{"type":60,"tag":118,"props":7172,"children":7173},{},[7174,7179,7184],{"type":60,"tag":122,"props":7175,"children":7176},{},[7177],{"type":65,"value":7178},"Exchange code for token immediately",{"type":60,"tag":122,"props":7180,"children":7181},{},[7182],{"type":65,"value":7183},"Don't cache authorization codes",{"type":60,"tag":122,"props":7185,"children":7186},{},[7187,7188],{"type":65,"value":6880},{"type":60,"tag":129,"props":7189,"children":7191},{"href":7190},"concepts\u002Ftoken-lifecycle.md#authorization-code-expiration",[7192],{"type":65,"value":162},{"type":60,"tag":122,"props":7194,"children":7195},{},[7196,7201],{"type":60,"tag":105,"props":7197,"children":7198},{},[7199],{"type":65,"value":7200},"Device Flow Requires Polling",{"type":60,"tag":118,"props":7202,"children":7203},{},[7204,7217,7240],{"type":60,"tag":122,"props":7205,"children":7206},{},[7207,7209,7215],{"type":65,"value":7208},"Poll at interval returned by ",{"type":60,"tag":74,"props":7210,"children":7212},{"className":7211},[],[7213],{"type":65,"value":7214},"\u002Fdevicecode",{"type":65,"value":7216}," (usually 5s)",{"type":60,"tag":122,"props":7218,"children":7219},{},[7220,7222,7227,7228,7233,7234],{"type":65,"value":7221},"Handle ",{"type":60,"tag":74,"props":7223,"children":7225},{"className":7224},[],[7226],{"type":65,"value":2926},{"type":65,"value":5121},{"type":60,"tag":74,"props":7229,"children":7231},{"className":7230},[],[7232],{"type":65,"value":2972},{"type":65,"value":5121},{"type":60,"tag":74,"props":7235,"children":7237},{"className":7236},[],[7238],{"type":65,"value":7239},"expired_token",{"type":60,"tag":122,"props":7241,"children":7242},{},[7243,7244],{"type":65,"value":6880},{"type":60,"tag":129,"props":7245,"children":7246},{"href":6079},[7247],{"type":65,"value":6759},{"type":60,"tag":531,"props":7249,"children":7250},{},[],{"type":60,"tag":93,"props":7252,"children":7254},{"id":7253},"quick-reference-1",[7255],{"type":65,"value":5685},{"type":60,"tag":388,"props":7257,"children":7259},{"id":7258},"which-oauth-flow-should-i-use",[7260],{"type":65,"value":7261},"\"Which OAuth flow should I use?\"",{"type":60,"tag":68,"props":7263,"children":7264},{},[7265,7267],{"type":65,"value":7266},"→ ",{"type":60,"tag":129,"props":7268,"children":7269},{"href":145},[7270],{"type":65,"value":148},{"type":60,"tag":388,"props":7272,"children":7274},{"id":7273},"redirect-uri-mismatch-error-4709",[7275],{"type":65,"value":7276},"\"Redirect URI mismatch error (4709)\"",{"type":60,"tag":68,"props":7278,"children":7279},{},[7280,7281],{"type":65,"value":7266},{"type":60,"tag":129,"props":7282,"children":7283},{"href":6093},[7284],{"type":65,"value":6268},{"type":60,"tag":388,"props":7286,"children":7288},{"id":7287},"token-expired-or-invalid",[7289],{"type":65,"value":7290},"\"Token expired or invalid\"",{"type":60,"tag":68,"props":7292,"children":7293},{},[7294,7295],{"type":65,"value":7266},{"type":60,"tag":129,"props":7296,"children":7297},{"href":6449},[7298],{"type":65,"value":6452},{"type":60,"tag":388,"props":7300,"children":7302},{"id":7301},"refresh-token-invalid-4735",[7303],{"type":65,"value":7304},"\"Refresh token invalid (4735)\"",{"type":60,"tag":68,"props":7306,"children":7307},{},[7308,7309,7313],{"type":65,"value":7266},{"type":60,"tag":129,"props":7310,"children":7311},{"href":6115},[7312],{"type":65,"value":6258},{"type":65,"value":7314}," - Must save new refresh token",{"type":60,"tag":388,"props":7316,"children":7318},{"id":7317},"scope-mismatch-error-4711",[7319],{"type":65,"value":7320},"\"Scope mismatch error (4711)\"",{"type":60,"tag":68,"props":7322,"children":7323},{},[7324,7325],{"type":65,"value":7266},{"type":60,"tag":129,"props":7326,"children":7327},{"href":6496},[7328],{"type":65,"value":6499},{"type":60,"tag":388,"props":7330,"children":7332},{"id":7331},"how-do-i-secure-my-oauth-app",[7333],{"type":65,"value":7334},"\"How do I secure my OAuth app?\"",{"type":60,"tag":68,"props":7336,"children":7337},{},[7338,7339,7343,7345],{"type":65,"value":7266},{"type":60,"tag":129,"props":7340,"children":7341},{"href":6285},[7342],{"type":65,"value":506},{"type":65,"value":7344}," + ",{"type":60,"tag":129,"props":7346,"children":7347},{"href":6305},[7348],{"type":65,"value":6308},{"type":60,"tag":388,"props":7350,"children":7352},{"id":7351},"how-do-i-implement-auto-refresh",[7353],{"type":65,"value":7354},"\"How do I implement auto-refresh?\"",{"type":60,"tag":68,"props":7356,"children":7357},{},[7358,7359],{"type":65,"value":7266},{"type":60,"tag":129,"props":7360,"children":7361},{"href":6115},[7362],{"type":65,"value":6258},{"type":60,"tag":388,"props":7364,"children":7366},{"id":7365},"whats-the-difference-between-classic-and-granular-scopes",[7367],{"type":65,"value":7368},"\"What's the difference between Classic and Granular scopes?\"",{"type":60,"tag":68,"props":7370,"children":7371},{},[7372,7373],{"type":65,"value":7266},{"type":60,"tag":129,"props":7374,"children":7375},{"href":6385},[7376],{"type":65,"value":6388},{"type":60,"tag":388,"props":7378,"children":7380},{"id":7379},"what-error-code-means-what",[7381],{"type":65,"value":7382},"\"What error code means what?\"",{"type":60,"tag":68,"props":7384,"children":7385},{},[7386,7387],{"type":65,"value":7266},{"type":60,"tag":129,"props":7388,"children":7389},{"href":187},[7390],{"type":65,"value":6347},{"type":60,"tag":531,"props":7392,"children":7393},{},[],{"type":60,"tag":93,"props":7395,"children":7397},{"id":7396},"document-version",[7398],{"type":65,"value":7399},"Document Version",{"type":60,"tag":68,"props":7401,"children":7402},{},[7403,7405,7410],{"type":65,"value":7404},"Based on ",{"type":60,"tag":105,"props":7406,"children":7407},{},[7408],{"type":65,"value":7409},"Zoom OAuth API v2",{"type":65,"value":7411}," (2024+)",{"type":60,"tag":68,"props":7413,"children":7414},{},[7415,7420],{"type":60,"tag":105,"props":7416,"children":7417},{},[7418],{"type":65,"value":7419},"Deprecated:",{"type":65,"value":7421}," JWT App Type (June 2023)",{"type":60,"tag":531,"props":7423,"children":7424},{},[],{"type":60,"tag":68,"props":7426,"children":7427},{},[7428],{"type":60,"tag":105,"props":7429,"children":7430},{},[7431],{"type":65,"value":7432},"Happy coding!",{"type":60,"tag":68,"props":7434,"children":7435},{},[7436,7438,7442],{"type":65,"value":7437},"Remember: Start with ",{"type":60,"tag":129,"props":7439,"children":7440},{"href":145},[7441],{"type":65,"value":148},{"type":65,"value":7443}," to understand which flow fits your use case!",{"type":60,"tag":93,"props":7445,"children":7447},{"id":7446},"environment-variables",[7448],{"type":65,"value":7449},"Environment Variables",{"type":60,"tag":118,"props":7451,"children":7452},{},[7453],{"type":60,"tag":122,"props":7454,"children":7455},{},[7456,7457,7462,7464,7470],{"type":65,"value":5668},{"type":60,"tag":129,"props":7458,"children":7460},{"href":7459},"references\u002Fenvironment-variables.md",[7461],{"type":65,"value":7459},{"type":65,"value":7463}," for standardized ",{"type":60,"tag":74,"props":7465,"children":7467},{"className":7466},[],[7468],{"type":65,"value":7469},".env",{"type":65,"value":7471}," keys and where to find each value.",{"type":60,"tag":7473,"props":7474,"children":7475},"style",{},[7476],{"type":65,"value":7477},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":7479,"total":7596},[7480,7496,7512,7528,7546,7565,7581],{"slug":7481,"name":7481,"fn":7482,"description":7483,"org":7484,"tags":7485,"stars":26,"repoUrl":27,"updatedAt":7495},"accessibility-review","run WCAG accessibility audits","Run a WCAG 2.1 AA accessibility audit on a design or page. Trigger with \"audit accessibility\", \"check a11y\", \"is this accessible?\", or when reviewing a design for color contrast, keyboard navigation, touch target size, or screen reader behavior before handoff.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7486,7489,7492],{"name":7487,"slug":7488,"type":16},"Accessibility","accessibility",{"name":7490,"slug":7491,"type":16},"Design","design",{"name":7493,"slug":7494,"type":16},"WCAG","wcag","2026-04-06T17:58:05.682394",{"slug":7497,"name":7497,"fn":7498,"description":7499,"org":7500,"tags":7501,"stars":26,"repoUrl":27,"updatedAt":7511},"account-research","research accounts for sales intel","Research a company or person and get actionable sales intel. Works standalone with web search, supercharged when you connect enrichment tools or your CRM. Trigger with \"research [company]\", \"look up [person]\", \"intel on [prospect]\", \"who is [name] at [company]\", or \"tell me about [company]\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7502,7505,7508],{"name":7503,"slug":7504,"type":16},"CRM","crm",{"name":7506,"slug":7507,"type":16},"Research","research",{"name":7509,"slug":7510,"type":16},"Sales","sales","2026-04-06T17:56:41.410418",{"slug":7513,"name":7513,"fn":7514,"description":7515,"org":7516,"tags":7517,"stars":26,"repoUrl":27,"updatedAt":7527},"analyze","answer data questions and run analyses","Answer data questions -- from quick lookups to full analyses. Use when looking up a single metric, investigating what's driving a trend or drop, comparing segments over time, or preparing a formal data report for stakeholders.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7518,7521,7524],{"name":7519,"slug":7520,"type":16},"Analytics","analytics",{"name":7522,"slug":7523,"type":16},"Data Analysis","data-analysis",{"name":7525,"slug":7526,"type":16},"SQL","sql","2026-04-06T17:57:21.593647",{"slug":7529,"name":7529,"fn":7530,"description":7531,"org":7532,"tags":7533,"stars":26,"repoUrl":27,"updatedAt":7545},"architecture","create and evaluate architecture decision records","Create or evaluate an architecture decision record (ADR). Use when choosing between technologies (e.g., Kafka vs SQS), documenting a design decision with trade-offs and consequences, reviewing a system design proposal, or designing a new component from requirements and constraints.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7534,7537,7539,7542],{"name":7535,"slug":7536,"type":16},"ADR","adr",{"name":7538,"slug":7529,"type":16},"Architecture",{"name":7540,"slug":7541,"type":16},"Documentation","documentation",{"name":7543,"slug":7544,"type":16},"Engineering","engineering","2026-04-06T17:57:49.26444",{"slug":7547,"name":7547,"fn":7548,"description":7549,"org":7550,"tags":7551,"stars":26,"repoUrl":27,"updatedAt":7564},"audit-support","support SOX 404 control testing","Support SOX 404 compliance with control testing methodology, sample selection, and documentation standards. Use when generating testing workpapers, selecting audit samples, classifying control deficiencies, or preparing for internal or external audits.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7552,7555,7558,7561],{"name":7553,"slug":7554,"type":16},"Audit","audit",{"name":7556,"slug":7557,"type":16},"Finance","finance",{"name":7559,"slug":7560,"type":16},"Regulatory Compliance","regulatory-compliance",{"name":7562,"slug":7563,"type":16},"SOX","sox","2026-04-06T17:57:36.714815",{"slug":7566,"name":7566,"fn":7567,"description":7568,"org":7569,"tags":7570,"stars":26,"repoUrl":27,"updatedAt":7580},"brand-review","review content against brand voice","Review content against your brand voice, style guide, and messaging pillars, flagging deviations by severity with specific before\u002Fafter fixes. Use when checking a draft before it ships, when auditing copy for voice consistency and terminology, or when screening for unsubstantiated claims, missing disclaimers, and other legal flags.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7571,7574,7577],{"name":7572,"slug":7573,"type":16},"Branding","branding",{"name":7575,"slug":7576,"type":16},"Marketing","marketing",{"name":7578,"slug":7579,"type":16},"Writing","writing","2026-04-06T17:58:19.548331",{"slug":7582,"name":7582,"fn":7583,"description":7584,"org":7585,"tags":7586,"stars":26,"repoUrl":27,"updatedAt":7595},"brand-voice-enforcement","enforce brand voice in content","This skill applies brand guidelines to content creation. It should be used when the user asks to \"write an email\", \"draft a proposal\", \"create a pitch deck\", \"write a LinkedIn post\", \"draft a presentation\", \"write a Slack message\", \"draft sales content\", or any content creation request where brand voice should be applied. Also triggers on \"on-brand\", \"brand voice\", \"enforce voice\", \"apply brand guidelines\", \"brand-aligned content\", \"write in our voice\", \"use our brand tone\", \"make this sound like us\", \"rewrite this in our tone\", or \"this doesn't sound on-brand\". Not for generating guidelines from scratch (use guideline-generation) or discovering brand materials (use discover-brand).\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7587,7588,7591,7594],{"name":7572,"slug":7573,"type":16},{"name":7589,"slug":7590,"type":16},"Communications","communications",{"name":7592,"slug":7593,"type":16},"Content Creation","content-creation",{"name":7578,"slug":7579,"type":16},"2026-04-06T18:00:23.528956",200,{"items":7598,"total":7772},[7599,7617,7629,7641,7660,7671,7692,7712,7722,7735,7743,7756],{"slug":7600,"name":7600,"fn":7601,"description":7602,"org":7603,"tags":7604,"stars":7614,"repoUrl":7615,"updatedAt":7616},"algorithmic-art","create algorithmic art with p5.js","Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7605,7608,7609,7612],{"name":7606,"slug":7607,"type":16},"Creative","creative",{"name":7490,"slug":7491,"type":16},{"name":7610,"slug":7611,"type":16},"Generative Art","generative-art",{"name":7613,"slug":2468,"type":16},"JavaScript",161831,"https:\u002F\u002Fgithub.com\u002Fanthropics\u002Fskills","2026-04-06T17:56:15.455818",{"slug":7618,"name":7618,"fn":7619,"description":7620,"org":7621,"tags":7622,"stars":7614,"repoUrl":7615,"updatedAt":7628},"brand-guidelines","apply Anthropic brand colors and typography","Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7623,7624,7625],{"name":7572,"slug":7573,"type":16},{"name":7490,"slug":7491,"type":16},{"name":7626,"slug":7627,"type":16},"Typography","typography","2026-04-06T17:56:05.042852",{"slug":7630,"name":7630,"fn":7631,"description":7632,"org":7633,"tags":7634,"stars":7614,"repoUrl":7615,"updatedAt":7640},"canvas-design","create posters and visual art as PNG or PDF","Create beautiful visual art in .png and .pdf documents using design philosophy. You should use this skill when the user asks to create a poster, piece of art, design, or other static piece. Create original visual designs, never copying existing artists' work to avoid copyright violations.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7635,7636,7637],{"name":7606,"slug":7607,"type":16},{"name":7490,"slug":7491,"type":16},{"name":7638,"slug":7639,"type":16},"PDF","pdf","2026-04-06T17:56:03.794732",{"slug":7642,"name":7642,"fn":7643,"description":7644,"org":7645,"tags":7646,"stars":7614,"repoUrl":7615,"updatedAt":7659},"claude-api","build apps with the Claude API","Reference for the Claude API \u002F Anthropic SDK — model ids, pricing, params, streaming, tool use, MCP, agents, caching, token counting, model migration.\nTRIGGER — read BEFORE opening the target file; don't skip because it \"looks like a one-liner\" — whenever: the prompt names Claude\u002FAnthropic in any form (Claude, Anthropic, Fable, Opus, Sonnet, Haiku, `anthropic`, `@anthropic-ai`, `claude-*`, `us.anthropic.*`, `[1m]`); the user asks about an LLM (pricing\u002Fmodel choice\u002Flimits\u002Fcaching) — never answer from memory; OR the task is LLM-shaped with provider unstated (agent\u002FMCP\u002Ftool-definition\u002Fmulti-agent\u002FRAG\u002FLLM-judge\u002Fcomputer-use; generate\u002Fsummarize\u002Fextract\u002Fclassify\u002Frewrite\u002Fconverse over NL; debugging refusals\u002Fcutoffs\u002Fstreaming\u002Ftool-calls\u002Ftokens).\nSKIP only when another provider is being worked on (overrides all triggers): OpenAI\u002FGPT\u002FGemini\u002FLlama\u002FMistral\u002FCohere\u002FOllama named in the query; OR `grep -rE 'openai|langchain_openai|google.generativeai|genai|mistralai|cohere|ollama'` over the project hits (run this grep FIRST if no provider named — don't Read the file).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7647,7650,7651,7654,7656],{"name":7648,"slug":7649,"type":16},"Agents","agents",{"name":9,"slug":8,"type":16},{"name":7652,"slug":7653,"type":16},"Anthropic SDK","anthropic-sdk",{"name":7655,"slug":7642,"type":16},"Claude API",{"name":7657,"slug":7658,"type":16},"LLM","llm","2026-07-28T05:36:08.213335",{"slug":7661,"name":7661,"fn":7662,"description":7663,"org":7664,"tags":7665,"stars":7614,"repoUrl":7615,"updatedAt":7670},"doc-coauthoring","co-author documentation and technical specs","Guide users through a structured workflow for co-authoring documentation. Use when user wants to write documentation, proposals, technical specs, decision docs, or similar structured content. This workflow helps users efficiently transfer context, refine content through iteration, and verify the doc works for readers. Trigger when user mentions writing docs, creating proposals, drafting specs, or similar documentation tasks.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7666,7667],{"name":7540,"slug":7541,"type":16},{"name":7668,"slug":7669,"type":16},"Technical Writing","technical-writing","2026-04-06T17:56:14.18897",{"slug":7672,"name":7672,"fn":7673,"description":7674,"org":7675,"tags":7676,"stars":7614,"repoUrl":7615,"updatedAt":7691},"docx","create and edit Word documents","Use this skill whenever the user wants to create, read, edit, or manipulate Word documents (.docx files) or Word templates (.dotx files). Triggers include: any mention of 'Word doc', 'word document', '.docx', '.dotx', or requests to produce professional documents with formatting like tables of contents, headings, page numbers, or letterheads. Also use when extracting or reorganizing content from .docx or .dotx files, inserting or replacing images in documents, performing find-and-replace in Word files, working with tracked changes or comments, or converting content into a polished Word document. If the user asks for a 'report', 'memo', 'letter', 'template', or similar deliverable as a Word or .docx file, use this skill. Do NOT use for PDFs, spreadsheets, Google Docs, or general coding tasks unrelated to document generation.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7677,7680,7682,7685,7688],{"name":7678,"slug":7679,"type":16},"Documents","documents",{"name":7681,"slug":7672,"type":16},"DOCX",{"name":7683,"slug":7684,"type":16},"Office","office",{"name":7686,"slug":7687,"type":16},"Templates","templates",{"name":7689,"slug":7690,"type":16},"Word","word","2026-07-18T05:16:23.136271",{"slug":7693,"name":7693,"fn":7694,"description":7695,"org":7696,"tags":7697,"stars":7614,"repoUrl":7615,"updatedAt":7711},"frontend-design","design production-grade frontend interfaces","Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one. Helps with aesthetic direction, typography, and making choices that don't read as templated defaults.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7698,7699,7702,7705,7708],{"name":7490,"slug":7491,"type":16},{"name":7700,"slug":7701,"type":16},"Frontend","frontend",{"name":7703,"slug":7704,"type":16},"React","react",{"name":7706,"slug":7707,"type":16},"Tailwind CSS","tailwind-css",{"name":7709,"slug":7710,"type":16},"UI Components","ui-components","2026-04-06T17:56:16.723469",{"slug":7713,"name":7713,"fn":7714,"description":7715,"org":7716,"tags":7717,"stars":7614,"repoUrl":7615,"updatedAt":7721},"internal-comms","write internal company communications","A set of resources to help me write all kinds of internal communications, using the formats that my company likes to use. Claude should use this skill whenever asked to write some sort of internal communications (status reports, leadership updates, 3P updates, company newsletters, FAQs, incident reports, project updates, etc.).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7718,7719,7720],{"name":7589,"slug":7590,"type":16},{"name":7686,"slug":7687,"type":16},{"name":7578,"slug":7579,"type":16},"2026-04-06T17:56:20.695522",{"slug":7723,"name":7723,"fn":7724,"description":7725,"org":7726,"tags":7727,"stars":7614,"repoUrl":7615,"updatedAt":7734},"mcp-builder","build MCP servers","Guide for creating high-quality MCP (Model Context Protocol) servers that enable LLMs to interact with external services through well-designed tools. Use when building MCP servers to integrate external APIs or services, whether in Python (FastMCP) or Node\u002FTypeScript (MCP SDK).",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7728,7729,7730,7731],{"name":7648,"slug":7649,"type":16},{"name":18,"slug":19,"type":16},{"name":7657,"slug":7658,"type":16},{"name":7732,"slug":7733,"type":16},"MCP","mcp","2026-04-06T17:56:10.357665",{"slug":7639,"name":7639,"fn":7736,"description":7737,"org":7738,"tags":7739,"stars":7614,"repoUrl":7615,"updatedAt":7742},"read edit and manipulate PDF files","Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text\u002Ftables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting\u002Fdecrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7740,7741],{"name":7678,"slug":7679,"type":16},{"name":7638,"slug":7639,"type":16},"2026-04-06T17:56:02.483316",{"slug":7744,"name":7744,"fn":7745,"description":7746,"org":7747,"tags":7748,"stars":7614,"repoUrl":7615,"updatedAt":7755},"pptx","create and edit PowerPoint presentations","Use this skill any time a .pptx or .potx file is involved in any way — as input, output, or both. This includes: creating slide decks, pitch decks, or presentations; reading, parsing, or extracting text from any .pptx or .potx file (even if the extracted content will be used elsewhere, like in an email or summary); editing, modifying, or updating existing presentations; combining or splitting slide files; working with templates (.potx), layouts, speaker notes, or comments. Trigger whenever the user mentions \"deck,\" \"slides,\" \"presentation,\" or references a .pptx or .potx filename, regardless of what they plan to do with the content afterward. If a .pptx or .potx file needs to be opened, created, or touched, use this skill.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7749,7752],{"name":7750,"slug":7751,"type":16},"PowerPoint","powerpoint",{"name":7753,"slug":7754,"type":16},"Presentations","presentations","2026-07-18T05:16:24.1471",{"slug":7757,"name":7757,"fn":7758,"description":7759,"org":7760,"tags":7761,"stars":7614,"repoUrl":7615,"updatedAt":7771},"skill-creator","create and optimize agent skills","Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[7762,7763,7764,7767,7770],{"name":7648,"slug":7649,"type":16},{"name":7540,"slug":7541,"type":16},{"name":7765,"slug":7766,"type":16},"Evals","evals",{"name":7768,"slug":7769,"type":16},"Performance","performance",{"name":7668,"slug":7669,"type":16},"2026-04-19T06:45:40.804",490]