{"_id":"@catalisa/wpp-sdk","_rev":"7-92229e2f5bac993a78db84e019909608","name":"@catalisa/wpp-sdk","dist-tags":{"latest":"0.3.3"},"versions":{"0.2.0":{"name":"@catalisa/wpp-sdk","version":"0.2.0","keywords":["whatsapp","api","sdk","typescript","baileys","multi-tenant","whatsapp-api","whatsapp-sdk","messaging","chat"],"author":{"name":"Catalisa","email":"contato@catalisa.io"},"license":"MIT","_id":"@catalisa/wpp-sdk@0.2.0","maintainers":[{"name":"catalisaio","email":"npm@catalisa.io"},{"name":"marcelsud","email":"marcelsud@gmail.com"}],"dist":{"shasum":"3b48249837013a0008c72588b7beeba0d49ae7ee","tarball":"https://registry.npmjs.org/@catalisa/wpp-sdk/-/wpp-sdk-0.2.0.tgz","fileCount":82,"integrity":"sha512-VgTtgVCYlSsiIhKf4F5SeHeQEaKHViLYivm9B+esSXLtiXWUmCsrBx7TqkL3lHTN3BkwVNMPgzul43AK3HJ6Aw==","signatures":[{"sig":"MEUCIAk2PxsrNQHkoofwxYU3cU/oFRhnWp3DFybwQfG6V0WuAiEAroWBYQosfgkwG2WsVO8j0pQOerkU0Hc+7zMpZ04A3T4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":139355},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"109bec512240261bbe4635cc0604d7536bd0df72","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","test:real":"npx ts-node -r tsconfig-paths/register examples/test-real.ts","test:groups":"npx ts-node -r tsconfig-paths/register examples/test-groups.ts","test:tenant":"npx ts-node -r tsconfig-paths/register examples/test-specific-tenant.ts","test:branding":"npx ts-node -r tsconfig-paths/register examples/test-branding.ts","prepublishOnly":"npm run clean && npm run build","test:messaging":"npx ts-node -r tsconfig-paths/register examples/test-messaging.ts","test:admin-crud":"npx ts-node -r tsconfig-paths/register examples/test-admin-crud.ts","test:basic-webhooks":"npx ts-node -r tsconfig-paths/register examples/test-basic-webhooks.ts"},"_npmUser":{"name":"catalisaio","email":"npm@catalisa.io"},"_npmVersion":"9.2.0","description":"TypeScript SDK for WhatsApp Multi-tenant API - Clean, type-safe, and easy to use","directories":{},"_nodeVersion":"20.18.1","dependencies":{"axios":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.3","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/wpp-sdk_0.2.0_1763391464085_0.9086602136776343","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@catalisa/wpp-sdk","version":"0.2.1","keywords":["whatsapp","api","sdk","typescript","baileys","multi-tenant","whatsapp-api","whatsapp-sdk","messaging","chat"],"author":{"name":"Catalisa","email":"contato@catalisa.io"},"license":"MIT","_id":"@catalisa/wpp-sdk@0.2.1","maintainers":[{"name":"catalisaio","email":"npm@catalisa.io"},{"name":"marcelsud","email":"marcelsud@gmail.com"}],"dist":{"shasum":"6ad0feb8e09c94ab97b50fb49349f68457d72ce0","tarball":"https://registry.npmjs.org/@catalisa/wpp-sdk/-/wpp-sdk-0.2.1.tgz","fileCount":82,"integrity":"sha512-uqpm5VK0lKrPi4b2M1eHUJvDiha57jHHZlcncqZ9OssPCnl07WoH0pSq0166m9dXqW75wY2vejmJJ7ZEmNOpCw==","signatures":[{"sig":"MEYCIQDW6MyWSiKtuwge1gW5SRvZKUWAUbSaCsplh78/uyXifAIhAI8GxgG4/fGXCAhHYUz0HOV2g4roqmIxUbuzhiyYyLiT","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":139489},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"38cc6726bff15e12e194e5c91165f6b0802912cd","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","test:real":"npx ts-node -r tsconfig-paths/register examples/test-real.ts","test:groups":"npx ts-node -r tsconfig-paths/register examples/test-groups.ts","test:tenant":"npx ts-node -r tsconfig-paths/register examples/test-specific-tenant.ts","test:branding":"npx ts-node -r tsconfig-paths/register examples/test-branding.ts","prepublishOnly":"npm run clean && npm run build","test:messaging":"npx ts-node -r tsconfig-paths/register examples/test-messaging.ts","test:admin-crud":"npx ts-node -r tsconfig-paths/register examples/test-admin-crud.ts","test:basic-webhooks":"npx ts-node -r tsconfig-paths/register examples/test-basic-webhooks.ts"},"_npmUser":{"name":"catalisaio","email":"npm@catalisa.io"},"_npmVersion":"9.2.0","description":"TypeScript SDK for WhatsApp Multi-tenant API - Clean, type-safe, and easy to use","directories":{},"_nodeVersion":"20.18.1","dependencies":{"axios":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.3","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/wpp-sdk_0.2.1_1763498506776_0.3064071210406809","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@catalisa/wpp-sdk","version":"0.2.2","keywords":["whatsapp","api","sdk","typescript","baileys","multi-tenant","whatsapp-api","whatsapp-sdk","messaging","chat"],"author":{"name":"Catalisa","email":"contato@catalisa.io"},"license":"MIT","_id":"@catalisa/wpp-sdk@0.2.2","maintainers":[{"name":"catalisaio","email":"npm@catalisa.io"},{"name":"marcelsud","email":"marcelsud@gmail.com"}],"dist":{"shasum":"7808cf778e707d1107500f4660c6f40f999918a5","tarball":"https://registry.npmjs.org/@catalisa/wpp-sdk/-/wpp-sdk-0.2.2.tgz","fileCount":82,"integrity":"sha512-uC+MXzi5PDCrVKc7eXXcNxoR5pb6OjGvsOToNpDKcKzZ0NuIJo3bncpMe3+GWsnyXYdIs08RaWRSS9HPxpzjXQ==","signatures":[{"sig":"MEYCIQDrBN9KB9jKHzAswtDu0IpBJnM7A7f1F932yoZldEhzsAIhANC4lLz2C+Mms6BH5wENEiAKeXF+pc4pGZp2RLtq7rh8","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":139511},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"aefd5398f780700c26da19a9aef852faff57d3d5","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","test:real":"npx ts-node -r tsconfig-paths/register examples/test-real.ts","test:groups":"npx ts-node -r tsconfig-paths/register examples/test-groups.ts","test:tenant":"npx ts-node -r tsconfig-paths/register examples/test-specific-tenant.ts","test:branding":"npx ts-node -r tsconfig-paths/register examples/test-branding.ts","prepublishOnly":"npm run clean && npm run build","test:messaging":"npx ts-node -r tsconfig-paths/register examples/test-messaging.ts","test:admin-crud":"npx ts-node -r tsconfig-paths/register examples/test-admin-crud.ts","test:basic-webhooks":"npx ts-node -r tsconfig-paths/register examples/test-basic-webhooks.ts"},"_npmUser":{"name":"catalisaio","email":"npm@catalisa.io"},"_npmVersion":"9.2.0","description":"TypeScript SDK for WhatsApp Multi-tenant API - Clean, type-safe, and easy to use","directories":{},"_nodeVersion":"20.18.1","dependencies":{"axios":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.3","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/wpp-sdk_0.2.2_1763506267806_0.7374862113737903","host":"s3://npm-registry-packages-npm-production"}},"0.2.3":{"name":"@catalisa/wpp-sdk","version":"0.2.3","keywords":["whatsapp","api","sdk","typescript","baileys","multi-tenant","whatsapp-api","whatsapp-sdk","messaging","chat"],"author":{"name":"Catalisa","email":"contato@catalisa.io"},"license":"MIT","_id":"@catalisa/wpp-sdk@0.2.3","maintainers":[{"name":"catalisaio","email":"npm@catalisa.io"},{"name":"marcelsud","email":"marcelsud@gmail.com"}],"dist":{"shasum":"206ee792183401f1b61f8816cfbc202281506252","tarball":"https://registry.npmjs.org/@catalisa/wpp-sdk/-/wpp-sdk-0.2.3.tgz","fileCount":82,"integrity":"sha512-FOFZmXlYd/shodIkuTF+A4VkJdPBsEmnOdLVTF2kw0TYjoFQ72rxJrobKYE4DP478VcN7YAWNjzT6cF+8uHUUg==","signatures":[{"sig":"MEYCIQCqhUBGLVherXn46r+iQjv9CPgVHJI6C+Qu1Lnp5uApEgIhANbQBupG3yfNlO4PDmlkoAf3whdkWrxfvu4SD5Gx/EqC","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":142484},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"aa8ffcdf539bad2071934e2284f7b395fbefbf01","scripts":{"dev":"tsc --watch","build":"tsc","clean":"rm -rf dist","test:real":"npx ts-node -r tsconfig-paths/register examples/test-real.ts","test:groups":"npx ts-node -r tsconfig-paths/register examples/test-groups.ts","test:tenant":"npx ts-node -r tsconfig-paths/register examples/test-specific-tenant.ts","test:branding":"npx ts-node -r tsconfig-paths/register examples/test-branding.ts","prepublishOnly":"npm run clean && npm run build","test:messaging":"npx ts-node -r tsconfig-paths/register examples/test-messaging.ts","test:admin-crud":"npx ts-node -r tsconfig-paths/register examples/test-admin-crud.ts","test:basic-webhooks":"npx ts-node -r tsconfig-paths/register examples/test-basic-webhooks.ts"},"_npmUser":{"name":"catalisaio","email":"npm@catalisa.io"},"_npmVersion":"9.2.0","description":"TypeScript SDK for WhatsApp Multi-tenant API - Clean, type-safe, and easy to use","directories":{},"_nodeVersion":"20.18.1","dependencies":{"axios":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"typescript":"^5.6.3","@types/node":"^20.10.0"},"_npmOperationalInternal":{"tmp":"tmp/wpp-sdk_0.2.3_1763555620408_0.035264784549827066","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@catalisa/wpp-sdk","version":"0.3.0","keywords":["whatsapp","api","sdk","typescript","baileys","multi-tenant","whatsapp-api","whatsapp-sdk","messaging","chat"],"author":{"name":"Catalisa","email":"contato@catalisa.io"},"license":"MIT","_id":"@catalisa/wpp-sdk@0.3.0","maintainers":[{"name":"catalisaio","email":"npm@catalisa.io"},{"name":"marcelsud","email":"marcelsud@gmail.com"}],"dist":{"shasum":"bf8130bd4c5aef5480d3bc8008cf11af8c7a12fc","tarball":"https://registry.npmjs.org/@catalisa/wpp-sdk/-/wpp-sdk-0.3.0.tgz","fileCount":94,"integrity":"sha512-m9yBL/8ijgMpfQn7ow+TJglEtkK1gvDoKhhNhyPPN6F0zLXIxruHz13NH7Agy6zNW0JcdEYTiFMwUVrYIP/GiA==","signatures":[{"sig":"MEUCIQDofzxoa/WLGBBJsaNBzQz0yByCDphej3ccWHDuGVOU/AIgZVpwsX4sv5kW8/pnXgPm42xb9Jm9X2hjMXJWsiAwDvs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":338011},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"dc15e2146053db8aa15311bf9fec054d712427c0","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","clean":"rm -rf dist","test:real":"npx ts-node -r tsconfig-paths/register examples/test-real.ts","test:watch":"vitest","test:groups":"npx ts-node -r tsconfig-paths/register examples/test-groups.ts","test:tenant":"npx ts-node -r tsconfig-paths/register examples/test-specific-tenant.ts","test:branding":"npx ts-node -r tsconfig-paths/register examples/test-branding.ts","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build","test:cloud-api":"npx ts-node -r tsconfig-paths/register -r dotenv/config examples/test-cloud-api-integration.ts","test:messaging":"npx ts-node -r tsconfig-paths/register examples/test-messaging.ts","test:admin-crud":"npx ts-node -r tsconfig-paths/register examples/test-admin-crud.ts","test:driver-config":"npx ts-node -r tsconfig-paths/register examples/test-driver-config.ts","test:basic-webhooks":"npx ts-node -r tsconfig-paths/register examples/test-basic-webhooks.ts","test:advanced-webhooks":"npx ts-node -r tsconfig-paths/register examples/test-advanced-webhooks.ts"},"_npmUser":{"name":"catalisaio","email":"npm@catalisa.io"},"_npmVersion":"9.2.0","description":"TypeScript SDK for WhatsApp Multi-tenant API - Clean, type-safe, and easy to use","directories":{},"_nodeVersion":"20.18.1","dependencies":{"axios":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^16.3.1","vitest":"^4.0.15","ts-node":"^10.9.2","typescript":"^5.6.3","@types/node":"^20.10.0","tsconfig-paths":"^4.2.0","@vitest/coverage-v8":"^4.0.15"},"_npmOperationalInternal":{"tmp":"tmp/wpp-sdk_0.3.0_1768331773840_0.5205426431761127","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@catalisa/wpp-sdk","version":"0.3.2","keywords":["whatsapp","api","sdk","typescript","baileys","multi-tenant","whatsapp-api","whatsapp-sdk","messaging","chat"],"author":{"name":"Catalisa","email":"contato@catalisa.io"},"license":"MIT","_id":"@catalisa/wpp-sdk@0.3.2","maintainers":[{"name":"catalisaio","email":"npm@catalisa.io"},{"name":"marcelsud","email":"marcelsud@gmail.com"}],"dist":{"shasum":"7b2471dae8796cb89ac25fa850d2a36f64623ae1","tarball":"https://registry.npmjs.org/@catalisa/wpp-sdk/-/wpp-sdk-0.3.2.tgz","fileCount":102,"integrity":"sha512-pcSB8TtD5p53Tsmt7PUdpO//smFH3vxM2et6wtyyZ8V00EFKJk+8ubPBQT67Y9FQJReuqn/SjSHQsMiC92btug==","signatures":[{"sig":"MEQCIHR7AqsiphI+t2BIFTPdDpmND/ADV9n2tjkZGLlr/jMCAiANeOQE9t4BARouDveSzHjHLazbAYhMWBoBVxepRfgk4w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":370616},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=16.0.0"},"gitHead":"ddab5c68204886b805777ce49a9273a3c5cd1bc9","scripts":{"dev":"tsc --watch","test":"vitest run","build":"tsc","clean":"rm -rf dist","test:real":"npx ts-node -r tsconfig-paths/register examples/test-real.ts","test:watch":"vitest","test:groups":"npx ts-node -r tsconfig-paths/register examples/test-groups.ts","test:tenant":"npx ts-node -r tsconfig-paths/register examples/test-specific-tenant.ts","test:branding":"npx ts-node -r tsconfig-paths/register examples/test-branding.ts","test:coverage":"vitest run --coverage","prepublishOnly":"npm run clean && npm run build","test:cloud-api":"npx ts-node -r tsconfig-paths/register -r dotenv/config examples/test-cloud-api-integration.ts","test:messaging":"npx ts-node -r tsconfig-paths/register examples/test-messaging.ts","test:admin-crud":"npx ts-node -r tsconfig-paths/register examples/test-admin-crud.ts","test:driver-config":"npx ts-node -r tsconfig-paths/register examples/test-driver-config.ts","test:basic-webhooks":"npx ts-node -r tsconfig-paths/register examples/test-basic-webhooks.ts","test:advanced-webhooks":"npx ts-node -r tsconfig-paths/register examples/test-advanced-webhooks.ts"},"_npmUser":{"name":"catalisaio","email":"npm@catalisa.io"},"_npmVersion":"9.2.0","description":"TypeScript SDK for WhatsApp Multi-tenant API - Clean, type-safe, and easy to use","directories":{},"_nodeVersion":"20.18.1","dependencies":{"axios":"^1.6.0"},"_hasShrinkwrap":false,"devDependencies":{"dotenv":"^16.3.1","vitest":"^4.0.15","ts-node":"^10.9.2","typescript":"^5.6.3","@types/node":"^20.10.0","tsconfig-paths":"^4.2.0","@vitest/coverage-v8":"^4.0.15"},"_npmOperationalInternal":{"tmp":"tmp/wpp-sdk_0.3.2_1769449231524_0.06006513389255952","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@catalisa/wpp-sdk","version":"0.3.3","description":"TypeScript SDK for WhatsApp Multi-tenant API - Clean, type-safe, and easy to use","main":"dist/index.js","types":"dist/index.d.ts","scripts":{"build":"tsc","dev":"tsc --watch","clean":"rm -rf dist","prepublishOnly":"npm run clean && npm run build","test":"vitest run","test:watch":"vitest","test:coverage":"vitest run --coverage","test:admin-crud":"npx ts-node -r tsconfig-paths/register examples/test-admin-crud.ts","test:branding":"npx ts-node -r tsconfig-paths/register examples/test-branding.ts","test:basic-webhooks":"npx ts-node -r tsconfig-paths/register examples/test-basic-webhooks.ts","test:advanced-webhooks":"npx ts-node -r tsconfig-paths/register examples/test-advanced-webhooks.ts","test:messaging":"npx ts-node -r tsconfig-paths/register examples/test-messaging.ts","test:groups":"npx ts-node -r tsconfig-paths/register examples/test-groups.ts","test:real":"npx ts-node -r tsconfig-paths/register examples/test-real.ts","test:tenant":"npx ts-node -r tsconfig-paths/register examples/test-specific-tenant.ts","test:driver-config":"npx ts-node -r tsconfig-paths/register examples/test-driver-config.ts","test:cloud-api":"npx ts-node -r tsconfig-paths/register -r dotenv/config examples/test-cloud-api-integration.ts"},"keywords":["whatsapp","api","sdk","typescript","baileys","multi-tenant","whatsapp-api","whatsapp-sdk","messaging","chat"],"author":{"name":"Catalisa","email":"contato@catalisa.io"},"license":"MIT","engines":{"node":">=16.0.0"},"dependencies":{"axios":"^1.6.0"},"devDependencies":{"@types/node":"^20.10.0","@vitest/coverage-v8":"^4.0.15","dotenv":"^16.3.1","ts-node":"^10.9.2","tsconfig-paths":"^4.2.0","typescript":"^5.6.3","vitest":"^4.0.15"},"gitHead":"576ace2c5edc0d61a81edb68597849f868fe7ea9","_id":"@catalisa/wpp-sdk@0.3.3","_nodeVersion":"20.18.1","_npmVersion":"9.2.0","dist":{"integrity":"sha512-caBdQGI7ADTzTml9ageLK8VrzH60sc7S3c/qCNQ6aUP/KDPilC9VaPjSfjDc9LCHBTe+jEEz4FeH1ZqPr0vL/Q==","shasum":"828221022939c7f4a5da73ced9a6780520cfc0a8","tarball":"https://registry.npmjs.org/@catalisa/wpp-sdk/-/wpp-sdk-0.3.3.tgz","fileCount":102,"unpackedSize":370616,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIGGd6eCROi6c72ChDWRYjW/BLRPyg3AJeeLap3yZVlRiAiB37/9lNqaFJKldYt2DjFkskRCooYXQ3KJYzvozBgoJcg=="}]},"_npmUser":{"name":"catalisaio","email":"npm@catalisa.io"},"directories":{},"maintainers":[{"name":"catalisaio","email":"npm@catalisa.io"},{"name":"marcelsud","email":"marcelsud@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/wpp-sdk_0.3.3_1769527247701_0.831824207761698"},"_hasShrinkwrap":false}},"time":{"created":"2025-11-17T14:57:44.023Z","modified":"2026-01-27T15:20:48.015Z","0.2.0":"2025-11-17T14:57:44.277Z","0.2.1":"2025-11-18T20:41:47.016Z","0.2.2":"2025-11-18T22:51:08.038Z","0.2.3":"2025-11-19T12:33:40.608Z","0.3.0":"2026-01-13T19:16:14.029Z","0.3.2":"2026-01-26T17:40:31.660Z","0.3.3":"2026-01-27T15:20:47.829Z"},"author":{"name":"Catalisa","email":"contato@catalisa.io"},"license":"MIT","keywords":["whatsapp","api","sdk","typescript","baileys","multi-tenant","whatsapp-api","whatsapp-sdk","messaging","chat"],"description":"TypeScript SDK for WhatsApp Multi-tenant API - Clean, type-safe, and easy to use","maintainers":[{"name":"catalisaio","email":"npm@catalisa.io"},{"name":"marcelsud","email":"marcelsud@gmail.com"}],"readme":"# @wpp/sdk\n\nTypeScript SDK for WhatsApp Multi-tenant API - Clean, type-safe, and easy to use.\n\n## Installation\n\n```bash\nnpm install @wpp/sdk\n# or\nyarn add @wpp/sdk\n```\n\n## Quick Start\n\n### Admin Client (JWT Authentication)\n\n```typescript\nimport { WhatsAppAPIClient } from '@wpp/sdk';\n\nconst admin = new WhatsAppAPIClient({\n  baseURL: 'https://api.example.com'\n});\n\n// Login\nconst { access_token, user } = await admin.login('admin@example.com', 'password');\nconsole.log('Logged in as:', user.email);\n\n// Create tenant\nconst tenant = await admin.tenants.create({ name: 'Acme Corp' });\n\n// Create API token for tenant\nconst token = await admin.apiTokens.create(tenant.id, {\n  name: 'Production Token',\n  isTest: false\n});\nconsole.log('API Key:', token.key); // Store this securely!\n\n// Connect device for tenant\nawait admin.whatsappAdmin.connect(tenant.id);\n\n// Get QR code\nconst { qr } = await admin.whatsappAdmin.getQR(tenant.id);\nconsole.log('Scan this QR:', qr);\n```\n\n### User Client (API Token Authentication)\n\n```typescript\nimport { WhatsAppAPIClient } from '@wpp/sdk';\n\nconst client = new WhatsAppAPIClient({\n  baseURL: 'https://api.example.com',\n  auth: {\n    type: 'apiToken',\n    token: 'wpp_live_abc123_xyz789'\n  }\n});\n\n// Connect session\nconst { correlationId } = await client.whatsapp.connect({\n  callbackUrl: 'https://myapp.com/webhook'\n});\n\n// Send message\nawait client.whatsapp.sendMessage({\n  jid: '5511999999999@s.whatsapp.net',\n  text: 'Hello from SDK!'\n});\n\n// Send media\nawait client.whatsapp.sendMedia({\n  jid: '5511999999999@s.whatsapp.net',\n  type: 'image',\n  url: 'https://example.com/photo.jpg',\n  caption: 'Check this out!'\n});\n\n// List groups\nconst groups = await client.whatsapp.listGroups('tenant-id');\nconsole.log('Groups:', groups);\n```\n\n## Features\n\n### ✨ Resource-Based API\n\nClean, intuitive API organized by domain:\n\n```typescript\nclient.auth          // Authentication\nclient.users         // User management (admin)\nclient.tenants       // Tenant management (admin)\nclient.apiTokens     // API token management (admin)\nclient.whatsapp      // WhatsApp operations (API token auth)\nclient.whatsappAdmin // WhatsApp admin operations (JWT auth)\nclient.webhooks      // Webhook management\nclient.branding      // Branding customization\nclient.health        // Health check\n```\n\n### 🔒 Dual Authentication Support\n\n**JWT (Admin endpoints)**\n```typescript\nconst client = new WhatsAppAPIClient({\n  baseURL: 'https://api.example.com',\n  auth: { type: 'jwt', token: 'your-jwt-token' }\n});\n\n// Or login to get token automatically\nawait client.login('admin@example.com', 'password');\n```\n\n**API Token (WhatsApp endpoints)**\n```typescript\nconst client = new WhatsAppAPIClient({\n  baseURL: 'https://api.example.com',\n  auth: { type: 'apiToken', token: 'wpp_live_xxx' }\n});\n```\n\n### 📝 Full TypeScript Support\n\n100% typed with IntelliSense support:\n\n```typescript\nimport { SendMessageRequest, Group, AdvancedWebhook } from '@wpp/sdk';\n\nconst message: SendMessageRequest = {\n  jid: '5511999999999@s.whatsapp.net',\n  text: 'Hello!',\n  callbackUrl: 'https://myapp.com/callback'\n};\n```\n\n### ⚠️ Comprehensive Error Handling\n\n```typescript\nimport { APIError, AuthError, ValidationError, NotFoundError } from '@wpp/sdk';\n\ntry {\n  await client.whatsapp.send({ jid: 'invalid', text: 'test' });\n} catch (error) {\n  if (error instanceof ValidationError) {\n    console.error('Validation failed:', error.errors);\n  } else if (error instanceof AuthError) {\n    console.error('Auth failed, status:', error.statusCode);\n  } else if (error instanceof APIError) {\n    console.error('API error:', error.message);\n  }\n}\n```\n\n## Testing\n\nThe SDK includes comprehensive test suites demonstrating all features:\n\n```bash\n# Run all tests\nnpm run test:real          # Complete integration tests\nnpm run test:messaging     # Messaging operations only\nnpm run test:groups        # Group operations only\nnpm run test:tenant        # Specific tenant tests\nnpm run test:admin-crud    # Admin CRUD (users, tenants)\nnpm run test:branding      # Branding configuration\nnpm run test:webhooks      # Basic webhooks\n\n# Or run directly\nnpx ts-node -r tsconfig-paths/register examples/test-real.ts\nnpx ts-node -r tsconfig-paths/register examples/test-messaging.ts\nnpx ts-node -r tsconfig-paths/register examples/test-groups.ts\nnpx ts-node -r tsconfig-paths/register examples/test-admin-crud.ts\nnpx ts-node -r tsconfig-paths/register examples/test-branding.ts\nnpx ts-node -r tsconfig-paths/register examples/test-basic-webhooks.ts\n```\n\n**Test Coverage:**\n- ✅ Authentication (JWT + API Token)\n- ✅ **Admin CRUD Operations (users, tenants) - NEW!**\n- ✅ Admin Operations (API tokens)\n- ✅ Messaging (text messages)\n- ✅ Group Operations (create, update, lifecycle testing with polling)\n- ✅ Advanced Webhooks (admin CRUD, filtering, logs, stats)\n- ✅ **Basic Webhooks (CRUD) - NEW!**\n- ✅ Device Management (connect, disconnect, reset)\n- ✅ **Branding Configuration (CRUD) - NEW!**\n- ⏭️ Media Operations (deferred to next phase)\n\n**Test Results:**\n\n| Test File | Results | Coverage |\n|-----------|---------|----------|\n| `test-real.ts` | 19/20 passing (95%) | Admin ops, webhooks, device mgmt |\n| `test-messaging.ts` | 7/10 passing (70%, 3 skipped) | Text messages, callbacks |\n| `test-groups.ts` | **21/22 passing (95.5%)** | Complete group lifecycle |\n| `test-specific-tenant.ts` | 7/7 passing (100%) | Device operations |\n| **`test-admin-crud.ts`** | **17/17 passing (100%)** 🆕 | User & Tenant CRUD |\n| **`test-branding.ts`** | **6/6 passing (100%)** 🆕 | Branding config |\n| **`test-basic-webhooks.ts`** | **8/8 passing (100%)** 🆕 | Basic webhook CRUD |\n\n**Total Coverage:**\n- **Endpoints Tested: 70/108 (64.8%)** ⬆️ from 53.7%\n- **Phase 1 Complete**: +12 endpoints tested\n- **All new tests**: 100% passing 🎉\n\n**Test Highlights:**\n- ✅ Complete lifecycle testing with proper async operation polling\n- ✅ Automatic cleanup with try/finally blocks\n- ✅ Comprehensive CRUD coverage for admin resources\n- ✅ Multi-webhook testing\n- ✅ User-tenant integration testing\n\n**Improvements in test-groups.ts:**\n- Added `waitForOperation()` helper to poll async operations until completion\n- Added `checkDeviceReady()` helper to verify device status before tests\n- Refactored both user and admin tests with proper polling and group ID extraction\n- Added try/finally cleanup blocks to ensure test groups are deleted\n- Complete lifecycle testing: create → update → verify → cleanup\n\n## Examples\n\n### Send Message with Callback\n\n```typescript\nconst { correlationId } = await client.whatsapp.sendMessage({\n  jid: '5511999999999@s.whatsapp.net',\n  text: 'Hello!',\n  callbackUrl: 'https://myapp.com/callback',\n  correlationId: 'my-custom-id-123'\n});\n\n// Later, check operation status\nconst operation = await client.whatsapp.getOperation(correlationId);\nconsole.log('Status:', operation.status); // 'pending', 'completed', or 'failed'\nconsole.log('Result:', operation.result);\n```\n\n### Media Operations\n\n#### Sending Media\n\nSend images, videos, audio, and documents via URL or base64:\n\n```typescript\n// Send image from URL\nawait client.whatsapp.sendMedia({\n  jid: '5511999999999@s.whatsapp.net',\n  type: 'image',\n  url: 'https://example.com/photo.jpg',\n  caption: 'Check this out!'\n});\n\n// Send image from base64\nawait client.whatsapp.sendMedia({\n  jid: '5511999999999@s.whatsapp.net',\n  type: 'image',\n  base64: '/9j/4AAQSkZJRg...', // Base64 encoded image (without data URI prefix)\n  mimetype: 'image/jpeg',\n  caption: 'Photo uploaded from device'\n});\n\n// Send audio (voice message)\nawait client.whatsapp.sendMedia({\n  jid: '5511999999999@s.whatsapp.net',\n  type: 'audio',\n  base64: 'T2dnUwAC...', // Base64 encoded audio\n  mimetype: 'audio/ogg; codecs=opus'\n});\n\n// Send document\nawait client.whatsapp.sendMedia({\n  jid: '5511999999999@s.whatsapp.net',\n  type: 'document',\n  url: 'https://example.com/contract.pdf',\n  filename: 'contract.pdf',\n  mimetype: 'application/pdf',\n  caption: 'Please review and sign'\n});\n\n// Send video\nawait client.whatsapp.sendMedia({\n  jid: '5511999999999@s.whatsapp.net',\n  type: 'video',\n  url: 'https://example.com/video.mp4',\n  caption: 'Watch this!'\n});\n```\n\n#### Receiving Media (via Webhooks)\n\nIncoming media is automatically downloaded, decrypted, and included in webhook events:\n\n```typescript\n// Webhook payload structure for messages.upsert with media\ninterface MessageUpsertEvent {\n  event: 'messages.upsert';\n  tenantId: string;\n  type: 'notify';\n  messages: Array<{\n    key: {\n      remoteJid: string;\n      fromMe: boolean;\n      id: string;\n    };\n    message: {\n      imageMessage?: {\n        url: string;          // WhatsApp CDN URL (encrypted, temporary)\n        mimetype: string;     // e.g., 'image/jpeg'\n        caption?: string;\n        fileSha256: string;\n        fileLength: string;\n        mediaKey: string;     // Decryption key\n      };\n      audioMessage?: {\n        url: string;\n        mimetype: string;     // e.g., 'audio/ogg; codecs=opus'\n        seconds: number;      // Duration in seconds\n        ptt: boolean;         // True if voice note\n        mediaKey: string;\n      };\n      videoMessage?: { /* similar structure */ };\n      documentMessage?: {\n        url: string;\n        mimetype: string;\n        fileName: string;\n        mediaKey: string;\n      };\n    };\n    // Automatically downloaded and decrypted media (when downloadMedia=true)\n    downloadedMedia?: {\n      localPath: string;      // e.g., '/tmp/wpp-media/tenant123/1234567890_abc123.jpg'\n      base64: string;         // Base64 encoded content (ready to use)\n      mimetype: string;       // e.g., 'image/jpeg'\n      type: 'image' | 'video' | 'audio' | 'document' | 'sticker';\n    };\n  }>;\n}\n\n// Example webhook handler\napp.post('/webhook', (req, res) => {\n  const { event, messages } = req.body;\n\n  if (event === 'messages.upsert') {\n    for (const msg of messages) {\n      // Check if message has downloaded media\n      if (msg.downloadedMedia) {\n        const { type, base64, mimetype, localPath } = msg.downloadedMedia;\n\n        console.log(`Received ${type}: ${mimetype}`);\n        console.log(`Local path: ${localPath}`);\n\n        // Use base64 directly (e.g., display in frontend)\n        const dataUri = `data:${mimetype};base64,${base64}`;\n\n        // Or read from localPath (within Docker container)\n        // Note: localPath is only accessible within the worker container\n      }\n\n      // Text content (caption for media, or regular text)\n      const text = msg.message?.conversation ||\n                   msg.message?.extendedTextMessage?.text ||\n                   msg.message?.imageMessage?.caption ||\n                   msg.message?.audioMessage?.caption;\n\n      if (text) {\n        console.log('Text:', text);\n      }\n    }\n  }\n\n  res.status(200).send('OK');\n});\n```\n\n#### Media Download Configuration\n\nMedia download is enabled by default per tenant. To disable:\n\n```sql\n-- Disable automatic media download for a tenant\nUPDATE \"TenantSettings\"\nSET \"downloadMedia\" = false\nWHERE \"tenantId\" = 'your-tenant-id';\n```\n\n#### Supported Media Types\n\n| Type | Supported Formats | Max Size (recommended) |\n|------|------------------|------------------------|\n| `image` | JPEG, PNG, GIF, WebP | 5 MB |\n| `video` | MP4, 3GP | 16 MB |\n| `audio` | OGG (Opus), MP3, M4A | 16 MB |\n| `document` | PDF, DOC, XLS, etc. | 100 MB |\n| `sticker` | WebP | 100 KB |\n\n#### SendMediaRequest Type\n\n```typescript\ninterface SendMediaRequest {\n  jid: string;                                      // Recipient JID\n  type: 'image' | 'video' | 'audio' | 'document';  // Media type\n  url?: string;                                     // URL to download media from\n  base64?: string;                                  // Base64 encoded content\n  caption?: string;                                 // Caption text\n  mimetype?: string;                                // MIME type (auto-detected if URL provided)\n  filename?: string;                                // Filename (for documents)\n  callbackUrl?: string;                             // Webhook for operation result\n  correlationId?: string;                           // Custom tracking ID\n}\n```\n\n### Group Management\n\n```typescript\n// Create group\nconst { correlationId } = await client.whatsapp.createGroup({\n  subject: 'My Group',\n  participants: ['5511111111111@s.whatsapp.net', '5522222222222@s.whatsapp.net']\n});\n\nconst operation = await client.whatsapp.getOperation(correlationId);\nconst groupId = operation.result.gid;\n\n// Update group subject\nawait client.whatsapp.updateGroupSubject({\n  gid: groupId,\n  subject: 'New Group Name'\n});\n\n// Add participants\nawait client.whatsapp.addGroupParticipants({\n  gid: groupId,\n  participants: ['5533333333333@s.whatsapp.net']\n});\n\n// Promote to admin\nawait client.whatsapp.promoteGroupParticipants({\n  gid: groupId,\n  participants: ['5533333333333@s.whatsapp.net']\n});\n```\n\n### Advanced Webhooks\n\n```typescript\n// Create advanced webhook with filtering\nconst webhook = await client.webhooks.create({\n  name: 'Group Messages Only',\n  urls: ['https://api.example.com/webhook'],\n  eventTypes: ['messages.upsert'],\n  filters: {\n    remoteJid: '120363XXX@g.us', // Specific group\n    fromMe: false,                // Only incoming messages\n    textContains: 'urgent'        // Only messages containing 'urgent'\n  },\n  secret: 'my-webhook-secret',\n  retryCount: 3,\n  timeoutMs: 10000\n});\n\n// Get webhook statistics\nconst stats = await client.webhooks.getStats(webhook.id);\nconsole.log('Trigger count:', stats.triggerCount);\nconsole.log('Success rate:', stats.successRate);\nconsole.log('Avg response time:', stats.avgResponseTimeMs);\n\n// Get delivery logs\nconst logs = await client.webhooks.getLogs(webhook.id, {\n  success: false, // Only failed deliveries\n  limit: 50\n});\n```\n\n### Admin Operations\n\n```typescript\n// List all devices\nconst devices = await admin.whatsappAdmin.listDevices();\n\n// Connect device for specific tenant\nawait admin.whatsappAdmin.connect('tenant-123');\n\n// Send message as tenant\nawait admin.whatsappAdmin.sendMessage('tenant-123', {\n  jid: '5511999999999@s.whatsapp.net',\n  text: 'Admin sending message as tenant'\n});\n\n// Generate QR link for support\nconst qrLink = await admin.whatsappAdmin.generateQRLink('tenant-123', {\n  expirationHours: 24\n});\nconsole.log('Share this link:', qrLink.url);\n\n// Send QR link to user via WhatsApp\nawait admin.whatsappAdmin.sendQRLink('tenant-123', {\n  recipientTenantId: 'tenant-456',\n  recipientJid: '5511999999999@s.whatsapp.net'\n});\n```\n\n### Branding Customization\n\n```typescript\n// Update branding for tenant\nawait admin.branding.update({\n  tenantId: 'tenant-123',\n  companyName: 'Acme Corp',\n  primaryColor: '#FF5722',\n  logoUrl: 'https://example.com/logo.png',\n  headerMessage: 'Welcome to Acme Support',\n  footerMessage: 'Powered by Acme Corp'\n});\n\n// Get public branding (no auth required)\nconst branding = await client.branding.get('tenant-123');\n```\n\n### User Management\n\n```typescript\n// Create user\nconst user = await admin.users.create({\n  email: 'user@example.com',\n  password: 'securepassword',\n  role: 'user',\n  tenantId: 'tenant-123'\n});\n\n// List all users\nconst users = await admin.users.list();\n\n// Update user role\nawait admin.users.update(user.id, {\n  role: 'admin'\n});\n\n// Delete user\nawait admin.users.delete(user.id);\n```\n\n### Health Check\n\n```typescript\nconst health = await client.health.check();\nconsole.log('API Status:', health.status); // 'ok'\n```\n\n## Configuration\n\n### Advanced Configuration\n\n```typescript\nconst client = new WhatsAppAPIClient({\n  baseURL: 'https://api.example.com',\n  timeout: 60000, // 60 seconds (default: 30000)\n\n  // Interceptors\n  onRequest: async (config) => {\n    console.log('Request:', config.method, config.url);\n    return config;\n  },\n\n  onResponse: async (response) => {\n    console.log('Response:', response.status);\n    return response;\n  },\n\n  onError: (error) => {\n    console.error('API Error:', error.message);\n  }\n});\n```\n\n### Dynamic Auth Updates\n\n```typescript\nconst client = new WhatsAppAPIClient({\n  baseURL: 'https://api.example.com'\n});\n\n// Login and set JWT\nawait client.login('admin@example.com', 'password');\n\n// Switch to API token\nclient.setAuth('wpp_live_abc123', 'apiToken');\n\n// Clear auth\nclient.clearAuth();\n```\n\n## API Reference\n\n### Authentication\n- `auth.login(email, password)` - Login with credentials\n- `auth.forgotPassword(email)` - Request password reset\n- `auth.resetPassword(token, newPassword)` - Reset password\n- `auth.me()` - Get current user\n\n### Users (Admin)\n- `users.list()` - List all users\n- `users.get(id)` - Get user by ID\n- `users.create(data)` - Create user\n- `users.update(id, data)` - Update user\n- `users.delete(id)` - Delete user\n\n### Tenants (Admin)\n- `tenants.list()` - List all tenants\n- `tenants.get(id)` - Get tenant by ID\n- `tenants.create(data)` - Create tenant\n- `tenants.update(id, data)` - Update tenant\n- `tenants.delete(id)` - Delete tenant\n\n### API Tokens (Admin)\n- `apiTokens.list(tenantId)` - List tokens\n- `apiTokens.create(tenantId, data)` - Create token\n- `apiTokens.delete(tenantId, tokenId)` - Delete token\n\n### WhatsApp (User)\n- Session: `connect()`, `reconnect()`, `reset()`, `logout()`, `ping()`\n- Messaging: `sendMessage()`, `sendReaction()`\n- Media: `sendMedia({ type, url?, base64?, caption?, mimetype?, filename? })`\n- Groups: `createGroup()`, `updateGroupSubject()`, `addGroupParticipants()`, etc.\n- Queries: `listGroups()`, `listChats()`, `listContacts()`, `getOperation()`\n- Pairing: `requestPairingCode()`, `getPairingCode()`\n- Driver Config: `configureDriver()`, `getDriverConfig()`\n\n### WhatsApp Admin\n- Device: `listDevices()`, `getDevice()`, `getQR()`\n- Session: `connect()`, `reconnect()`, `disconnect()`, `reset()`, `ping()`\n- Operations: `sendMessage()`, `getOperation()`\n- Groups: `listGroups()`, `createGroup()`, `manageGroupParticipants()`, etc.\n\n### Webhooks\n- Basic: `createBasic()`, `listBasic()`, `deleteBasic()`\n- Advanced (Admin): `createAdvanced()`, `listAdvanced()`, `updateAdvanced()`, `deleteAdvanced()`\n- Advanced (User): `create()`, `list()`, `update()`, `delete()`\n- Logs & Stats: `getLogs()`, `getStats()`\n\n### Branding\n- `get(tenantId)` - Get branding (public)\n- `update(data)` - Update branding (admin)\n- `delete(tenantId)` - Delete branding (admin)\n\n### Health\n- `check()` - Health check\n\n## Error Types\n\n- `APIError` - Base API error\n- `AuthError` - Authentication/authorization errors (401, 403)\n- `ValidationError` - Validation errors (400, 422)\n- `NotFoundError` - Not found errors (404)\n- `RateLimitError` - Rate limit errors (429)\n- `NetworkError` - Network/connection errors\n\n## License\n\nMIT\n\n## Support\n\nFor issues and questions, visit the [GitHub repository](https://github.com/your-org/wpp-multitenant).\n","readmeFilename":"README.md"}