{"_id":"@ararahq/sdk","_rev":"6-d19621833858def1fb769b90fbaeb302","name":"@ararahq/sdk","dist-tags":{"latest":"2.0.0"},"versions":{"1.7.0":{"name":"@ararahq/sdk","version":"1.7.0","keywords":["arara","whatsapp","sdk","messaging","api","typescript"],"author":{"name":"Arara HQ"},"license":"MIT","_id":"@ararahq/sdk@1.7.0","maintainers":[{"name":"micas-ararahq","email":"micael@ararahq.com"}],"homepage":"https://github.com/ararahq/arara-node-sdk#readme","bugs":{"url":"https://github.com/ararahq/arara-node-sdk/issues"},"dist":{"shasum":"c7d10fac00564a9afc34d6ad8e5e20133fcd2ad1","tarball":"https://registry.npmjs.org/@ararahq/sdk/-/sdk-1.7.0.tgz","fileCount":7,"integrity":"sha512-cUooBTtYhrNO2FfAY5wpArpsHivZwsSWKT4bM1WUeFaVbg3abCQdO85jLUR+oViu0E/6Oo0fKQDIGIAQ9qX1UA==","signatures":[{"sig":"MEUCIEHYoUOGbtYhvDufXYcgYOvKoL5oXqcZkENYMFgkUChUAiEAsByGqMdxayh8b6s9bQuTc7UgmVq4j2hiYocCw3ULbgY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30786},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","gitHead":"f6494e2baecd9ab930e0fd9440ec35262d45facc","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup"},"_npmUser":{"name":"micas-ararahq","email":"micael@ararahq.com"},"repository":{"url":"git+https://github.com/ararahq/arara-node-sdk.git","type":"git"},"_npmVersion":"11.7.0","description":"SDK oficial da AraraHQ para Node.js. Simples, tipado e focado no desenvolvedor.","directories":{},"_nodeVersion":"24.5.0","dependencies":{"axios":"^1.13.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","ts-jest":"^29.4.6","ts-node":"^10.9.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.0.7"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.7.0_1771012264843_0.061218180968620084","host":"s3://npm-registry-packages-npm-production"}},"1.7.1":{"name":"@ararahq/sdk","version":"1.7.1","keywords":["arara","whatsapp","sdk","messaging","api","typescript"],"author":{"name":"Arara HQ"},"license":"MIT","_id":"@ararahq/sdk@1.7.1","maintainers":[{"name":"micas-ararahq","email":"micael@ararahq.com"}],"homepage":"https://github.com/ararahq/arara-node-sdk#readme","bugs":{"url":"https://github.com/ararahq/arara-node-sdk/issues"},"dist":{"shasum":"a07ada90d5ea536863732172bf75622477181e32","tarball":"https://registry.npmjs.org/@ararahq/sdk/-/sdk-1.7.1.tgz","fileCount":7,"integrity":"sha512-QN2xAm2yUKanmEbL/jPBaitulgaeL5HvdHNDx3iyRBN6qFTuy/BdNRleJz9lg6WjJak3v+HDCYGtfrRFc7Zm7w==","signatures":[{"sig":"MEYCIQDnRcyjaY0ZcgOZRq0ykDPW20w8lwtRPSH0OpYHDNaHggIhAKKNS1U2mrtoIY8H6Qjlq5KHyxm3xoe3+EjVxABrRQYP","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":29002},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","gitHead":"387fa93e7e816279b3eab6da6346add78e160c1a","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup"},"_npmUser":{"name":"micas-ararahq","email":"micael@ararahq.com"},"repository":{"url":"git+https://github.com/ararahq/arara-node-sdk.git","type":"git"},"_npmVersion":"11.7.0","description":"SDK oficial da AraraHQ para Node.js. Simples, tipado e focado no desenvolvedor.","directories":{},"_nodeVersion":"24.5.0","dependencies":{"axios":"^1.13.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","ts-jest":"^29.4.6","ts-node":"^10.9.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.0.7"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.7.1_1771012903775_0.0042559897307097305","host":"s3://npm-registry-packages-npm-production"}},"1.8.0":{"name":"@ararahq/sdk","version":"1.8.0","keywords":["arara","whatsapp","sdk","messaging","api","typescript"],"author":{"name":"Arara HQ"},"license":"MIT","_id":"@ararahq/sdk@1.8.0","maintainers":[{"name":"micas-ararahq","email":"micael@ararahq.com"}],"homepage":"https://github.com/ararahq/arara-node-sdk#readme","bugs":{"url":"https://github.com/ararahq/arara-node-sdk/issues"},"dist":{"shasum":"1981dfaf443d91b95f70cd6bfb7d4537ff84e826","tarball":"https://registry.npmjs.org/@ararahq/sdk/-/sdk-1.8.0.tgz","fileCount":7,"integrity":"sha512-X6V5QWAFYvzJt/wnd8an/NwcHCElQyQz7ovr84d6C03CFlqIIpsPKghpyumLowV3IONig2sNMwncnnqptwm6EA==","signatures":[{"sig":"MEQCIHRF7gUQjDkZfJ/rqBq6eWyMphMgihDYkTxLitFmw6zzAiBxBkems4S/yR+BpRWvSiudUwjPetGbUPn9BLEGNVKuPQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":30290},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","gitHead":"4439568df2ea6e2c958ca2cc87bd5f23316da491","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup"},"_npmUser":{"name":"micas-ararahq","email":"micael@ararahq.com"},"repository":{"url":"git+https://github.com/ararahq/arara-node-sdk.git","type":"git"},"_npmVersion":"11.11.0","description":"SDK oficial da AraraHQ para Node.js. Simples, tipado e focado no desenvolvedor.","directories":{},"_nodeVersion":"24.5.0","dependencies":{"axios":"^1.13.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","ts-jest":"^29.4.6","ts-node":"^10.9.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.0.7"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.8.0_1773264843069_0.5945378067531977","host":"s3://npm-registry-packages-npm-production"}},"1.8.1":{"name":"@ararahq/sdk","version":"1.8.1","keywords":["arara","whatsapp","sdk","messaging","api","typescript"],"author":{"name":"Arara HQ"},"license":"MIT","_id":"@ararahq/sdk@1.8.1","maintainers":[{"name":"micas-ararahq","email":"micael@ararahq.com"}],"homepage":"https://github.com/ararahq/arara-node-sdk#readme","bugs":{"url":"https://github.com/ararahq/arara-node-sdk/issues"},"dist":{"shasum":"dc3a5eac9d36ffcae62e366f14c3d3230cdf5b31","tarball":"https://registry.npmjs.org/@ararahq/sdk/-/sdk-1.8.1.tgz","fileCount":7,"integrity":"sha512-RSCahtuEuJY6YSKgVpBkkQ7xBLAFQ+1TUTcEiL+cgDLB0wqOBlFxyduyVzx0sk0d6xWIFp88d0fkZIX+VFcZyw==","signatures":[{"sig":"MEQCIH/9sCODzmWsDZNWD5u6+NbIHz3JQu78JXi9Cx+wPV2gAiA/7hYlPoHu5MAXk6ECnYNjZ4t6VG5Xn2Jt9uVZcuzIgQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":41955},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","gitHead":"45b2575b8363a6682c147c3ccfca5e5dc67b735d","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup"},"_npmUser":{"name":"micas-ararahq","email":"micael@ararahq.com"},"repository":{"url":"git+https://github.com/ararahq/arara-node-sdk.git","type":"git"},"_npmVersion":"11.11.0","description":"SDK oficial da AraraHQ para Node.js. Simples, tipado e focado no desenvolvedor.","directories":{},"_nodeVersion":"24.5.0","dependencies":{"axios":"^1.13.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","ts-jest":"^29.4.6","ts-node":"^10.9.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.0.7"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.8.1_1784005425266_0.4438490017666925","host":"s3://npm-registry-packages-npm-production"}},"1.9.0":{"name":"@ararahq/sdk","version":"1.9.0","keywords":["arara","whatsapp","sdk","messaging","api","typescript"],"author":{"name":"Arara HQ"},"license":"MIT","_id":"@ararahq/sdk@1.9.0","maintainers":[{"name":"micas-ararahq","email":"micael@ararahq.com"}],"homepage":"https://github.com/ararahq/arara-node-sdk#readme","bugs":{"url":"https://github.com/ararahq/arara-node-sdk/issues"},"dist":{"shasum":"bd85ed8192f9805961fb0b82216c299faa636d96","tarball":"https://registry.npmjs.org/@ararahq/sdk/-/sdk-1.9.0.tgz","fileCount":7,"integrity":"sha512-Th1WCdUAxbA5ozqmkw2Ubd8v45JuMeB5fS7EcRMYgZeA7hnFmY/5c0Bc2gfK/sTzQaNl2iglc/brOc6/4qnRyw==","signatures":[{"sig":"MEUCIQCc0J9km4B2WjOOK/FGgXUSgriA8rslfC3hNnaFDPe52wIgRtu/dYno3KcoiTFYLS6pniXbYUhQzByZZctnNk5eg5I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIFaSmLrSitwsf6qyz1HKebAXuqiq6vBnWtFOvMyN/qPJAiEAtIfNcs1i4zAu7UaMmDBWim4979DNf7U3yWWTLcOoH8M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ararahq%2fsdk@1.9.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":90749},"main":"./dist/index.js","type":"commonjs","types":"./dist/index.d.ts","module":"./dist/index.mjs","gitHead":"9cf4dae50f090aaf4cdd074a435bd0d99ad981c0","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6846fbf1-79b5-46ac-ac85-b905b8dafeb9"}},"repository":{"url":"git+https://github.com/ararahq/arara-node-sdk.git","type":"git"},"_npmVersion":"11.19.0","description":"SDK oficial da AraraHQ para Node.js. Simples, tipado e focado no desenvolvedor.","directories":{},"_nodeVersion":"24.21.0","dependencies":{"axios":"^1.13.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","ts-jest":"^29.4.6","ts-node":"^10.9.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.0.7"},"_npmOperationalInternal":{"tmp":"tmp/sdk_1.9.0_1790270576706_0.943307630237618","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"_id":"@ararahq/sdk@2.0.0","bugs":{"url":"https://github.com/ararahq/arara-node-sdk/issues"},"dist":{"shasum":"bb6b00f5e613351d2c6887a5090c54b57a346401","tarball":"https://registry.npmjs.org/@ararahq/sdk/-/sdk-2.0.0.tgz","fileCount":7,"integrity":"sha512-mJHaWCrZm+Er3t3sxRaVv0QhtjsN0w/CGbf/AERwozc32LCWFBkakyK5hzwJGrUaceA3iyaW7Vn4q5IaRaRZOg==","signatures":[{"sig":"MEMCIBBGSYVUJRklmfDtwE6aMown6v6CfnvfnzBCqVBuNKoiAh84IIlHAtg261R147Rf7vQO5+H3pt/faGxmibvoc30q","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCfa7gXLNZSrfDD4KIJdGjT/7U5hBMyhV5VWpIh0SCeZQIgFefvzA2jChGpPXChrcQSCIYQn4kdPadTbI5QHg5r6u4="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ararahq%2fsdk@2.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":112577},"main":"./dist/index.js","name":"@ararahq/sdk","type":"commonjs","types":"./dist/index.d.ts","author":{"name":"Arara HQ"},"module":"./dist/index.mjs","gitHead":"ea2f7fa59e1c9be19ce85c8dfb734c19a3adf4f3","license":"MIT","scripts":{"dev":"tsup --watch","test":"jest","build":"tsup"},"version":"2.0.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6846fbf1-79b5-46ac-ac85-b905b8dafeb9"}},"homepage":"https://github.com/ararahq/arara-node-sdk#readme","keywords":["arara","whatsapp","sdk","messaging","api","typescript"],"repository":{"url":"git+https://github.com/ararahq/arara-node-sdk.git","type":"git"},"_npmVersion":"11.19.0","description":"SDK oficial da AraraHQ para Node.js. Simples, tipado e focado no desenvolvedor.","directories":{},"maintainers":[{"name":"micas-ararahq","email":"micael@ararahq.com"}],"_nodeVersion":"24.21.0","dependencies":{"axios":"^1.13.2"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^30.2.0","tsup":"^8.5.1","ts-jest":"^29.4.6","ts-node":"^10.9.2","typescript":"^5.9.3","@types/jest":"^30.0.0","@types/node":"^25.0.7"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/sdk_2.0.0_1790298478773_0.42357606850454665"}}},"time":{"created":"2026-02-13T19:51:04.723Z","modified":"2026-09-25T01:07:59.195Z","1.7.0":"2026-02-13T19:51:05.003Z","1.7.1":"2026-02-13T20:01:43.925Z","1.8.0":"2026-03-11T21:34:03.204Z","1.8.1":"2026-07-14T05:03:45.436Z","1.9.0":"2026-09-24T17:22:56.785Z","2.0.0":"2026-09-25T01:07:58.853Z"},"bugs":{"url":"https://github.com/ararahq/arara-node-sdk/issues"},"author":{"name":"Arara HQ"},"license":"MIT","homepage":"https://github.com/ararahq/arara-node-sdk#readme","keywords":["arara","whatsapp","sdk","messaging","api","typescript"],"repository":{"url":"git+https://github.com/ararahq/arara-node-sdk.git","type":"git"},"description":"SDK oficial da AraraHQ para Node.js. Simples, tipado e focado no desenvolvedor.","maintainers":[{"name":"micas-ararahq","email":"micael@ararahq.com"}],"readme":"# Arara Node SDK\n\n[![npm](https://img.shields.io/npm/v/@ararahq/sdk)](https://www.npmjs.com/package/@ararahq/sdk)\n[![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue)](https://www.typescriptlang.org/)\n[![License](https://img.shields.io/badge/License-MIT-green)](LICENSE)\n[![Docs](https://img.shields.io/badge/Docs-docs.ararahq.com-orange)](https://docs.ararahq.com)\n\nOfficial Node.js SDK for **[AraraHQ](https://ararahq.com)** — the developer-first WhatsApp API. Simple, typed, and built for scale.\n\n## Installation\n\n```bash\nnpm install @ararahq/sdk\n```\n\n## Configuration\n\n```typescript\nimport { NodeSDK } from '@ararahq/sdk';\n\nconst sdk = new NodeSDK({\n  apiKey: 'ara_live_...'\n});\n```\n\n`baseUrl` defaults to `https://api.ararahq.com`. All options:\n\n```typescript\nconst sdk = new NodeSDK({\n  apiKey: 'ara_live_...',\n  baseUrl: 'https://api.ararahq.com',\n  timeout: 10000,\n  maxRetries: 3\n});\n```\n\nThe SDK automatically retries network errors, `5xx` and `429` responses with exponential backoff, honoring the `Retry-After` header when present. Only requests that are safe to replay are retried: `GET`/`PUT`/`DELETE`, and `POST` carrying an `Idempotency-Key`. `messages.send`, `messages.sendBatch` and `campaigns.create` always send one (yours, or a UUID v4 generated per call and reused on every retry), so a retry never duplicates a send or a charge. Set `maxRetries: 0` to disable.\n\n## API key permissions\n\n`GET` on contacts, conversations, wallet, smart links, opt-outs and `auth.me()` requires an **ADMIN** key. Keys with only `READ` get `AuthenticationError` (403) on those reads. API keys, user profile and organization webhook are not manageable with an API key; use the dashboard.\n\n## Resources\n\n### 1. Current user (`sdk.auth`)\n\n```typescript\nconst me = await sdk.auth.me(); // GET /auth/me, ADMIN key\n```\n\n### 2. Messages (`sdk.messages`)\n\n`receiver` accepts `whatsapp:+5511...`, `+5511...` or digits only.\n\n```typescript\n// Template standard\nconst response = await sdk.messages.send({\n  receiver: \"whatsapp:+5511999998888\",\n  templateName: \"welcome\",\n  templateVariables: [\"John\"]\n});\n\n// Template com Mídia (Header de Imagem/PDF)\nconst mediaResponse = await sdk.messages.send({\n  receiver: \"whatsapp:+5511999998888\",\n  templateName: \"invoice_ready\",\n  templateVariables: [\"John\", \"January\"],\n  media_url: \"https://your-media.com/invoice.pdf\"\n});\n\n// Mensagem de Sessão (Texto Livre)\nconst sessionResponse = await sdk.messages.send({\n  receiver: \"whatsapp:+5511999998888\",\n  body: \"Olá! Como posso ajudar?\"\n});\n\n// Envio idempotente com sua própria chave (sem ela o SDK gera uma por chamada)\nconst idempotentResponse = await sdk.messages.send(\n  {\n    receiver: \"whatsapp:+5511999998888\",\n    templateName: \"welcome\",\n    templateVariables: [\"John\"]\n  },\n  { idempotencyKey: \"order-8231-welcome\" }\n);\n\n// Lote: um template, até 1000 destinatários\nconst batch = await sdk.messages.sendBatch({\n  templateName: \"welcome\",\n  messages: [{ receiver: \"+5511999998888\", variables: [\"John\"] }]\n});\n\n// Consulta por id\nconst message = await sdk.messages.get(response.id);\n```\n\n### 3. Templates (`sdk.templates`)\n\n`get`, `getStatus`, `delete` and `analytics` take the template **id** (UUID), not the name. To find a template by name, filter the list.\n\n```typescript\nconst { data, pagination } = await sdk.templates.list({ page: 0, size: 50 });\n\nconst [welcome] = (await sdk.templates.list({ name: 'welcome' })).data;\nconst details = await sdk.templates.get(welcome.id);\nconst status = await sdk.templates.getStatus(welcome.id);\nconst analytics = await sdk.templates.analytics(welcome.id, { period: '30d' }); // deliveryRate: \"97.5\"\nconst allAnalytics = await sdk.templates.analyticsAll({ period: '7d' });\n\nawait sdk.templates.create({\n  name: \"promo_christmas\",\n  category: \"MARKETING\",\n  language: \"pt_BR\",\n  body: \"Hi {{1}}, check our Christmas deals!\",\n  samples: { \"1\": \"John\" }\n});\n\nawait sdk.templates.delete(welcome.id);\n```\n\n### 4. Opt-outs (`sdk.optOuts`)\n\nPhones must be E.164 with the leading `+`; other formats throw `RangeError` before calling the API.\n\n```typescript\nawait sdk.optOuts.create({ phone: \"+5511999998888\", reason: \"pediu pra sair\" });\nconst { optedOut } = await sdk.optOuts.get(\"+5511999998888\");\nconst { items, total } = await sdk.optOuts.list();\nawait sdk.optOuts.delete(\"+5511999998888\");\n```\n\n### 5. Webhook Events\n\n```typescript\nimport { AraraWebhookEvent, WebhookUtils } from '@ararahq/sdk';\nimport express from 'express';\n\nconst app = express();\n\napp.post('/webhook/arara', express.json(), (req, res) => {\n    const event = req.body as AraraWebhookEvent;\n\n    if (WebhookUtils.isMessageStatusEvent(event)) {\n        const { messageId, status, receiver } = event.data;\n        console.log(`Message ${messageId} to ${receiver}: ${status}`);\n    }\n\n    if (WebhookUtils.isInboundMessageEvent(event)) {\n        const { from, body } = event.data;\n        console.log(`New message from ${from}: ${body}`);\n    }\n\n    res.sendStatus(200);\n});\n```\n\n### 6. Contacts (`sdk.contacts`)\n\n```typescript\nconst page = await sdk.contacts.list(0, 50);\nconst contact = await sdk.contacts.get('+5511999998888');\nawait sdk.contacts.update('+5511999998888', { name: \"Maria\", tags: [\"vip\"] });\nawait sdk.contacts.importBatch([{ name: \"Maria\", phone: \"+5511999998888\" }]);\nconst stats = await sdk.contacts.stats();\nconst history = await sdk.contacts.messages('+5511999998888', 30);\n```\n\n### 7. Conversations (`sdk.conversations`)\n\n```typescript\nconst conversations = await sdk.conversations.list();\nconst messages = await sdk.conversations.messages('conversation-id');\nawait sdk.conversations.reply({ conversationId: 'conversation-id', body: \"Oi, tudo certo?\" });\nconst windows = await sdk.conversations.windowStatus(['+5511999998888']);\n```\n\n### 8. Campaigns (`sdk.campaigns`)\n\n```typescript\nconst estimate = await sdk.campaigns.estimate('promo', 1200);\n\nconst campaign = await sdk.campaigns.create({\n  name: \"Black Friday\",\n  templateName: \"promo\",\n  contacts: [{ to: \"whatsapp:+5511999998888\", variables: [\"Maria\"] }]\n});\n\nconst detail = await sdk.campaigns.get(campaign.id);\nawait sdk.campaigns.cancel(campaign.id);\n```\n\n### 9. Wallet (`sdk.wallet`)\n\n```typescript\nconst transactions = await sdk.wallet.transactions(0, 20);\nconst autoRecharge = await sdk.wallet.getAutoRecharge();\nawait sdk.wallet.updateAutoRecharge({ enabled: true, threshold: 50, amount: 200 });\n```\n\n### 10. Numbers (`sdk.numbers`)\n\n```typescript\nconst { numbers, slot } = await sdk.numbers.list();\nawait sdk.numbers.update(numbers[0].id, { alias: \"Suporte\" });\nconst warming = await sdk.numbers.warming(numbers[0].id);\n```\n\n### 11. Smart Links (`sdk.smartLinks`)\n\n```typescript\nconst link = await sdk.smartLinks.create({\n  name: \"Promo\",\n  phoneNumber: \"+5511999998888\",\n  defaultText: \"Quero a oferta\"\n});\nconst stats = await sdk.smartLinks.stats(link.id);\nconst { data: links, pagination } = await sdk.smartLinks.list({ page: 0, size: 50 });\n```\n\n### 12. Raw API (`sdk.api`)\n\nEscape hatch for endpoints without a typed resource yet. Inherits auth, `baseUrl`, timeout and retries.\n\n```typescript\nconst data = await sdk.api.get('/v1/some/endpoint');\nawait sdk.api.post('/v1/some/endpoint', { foo: \"bar\" });\n```\n\n## Error Handling\n\nEvery failed request throws a typed `AraraError` with the parsed API error envelope:\n\n```typescript\nimport { AraraError } from '@ararahq/sdk';\n\ntry {\n  await sdk.messages.send({ receiver: \"whatsapp:+5511999998888\", body: \"Oi\" });\n} catch (error) {\n  if (error instanceof AraraError) {\n    console.error(error.statusCode, error.code, error.message, error.details);\n    if (error.statusCode === 429 && error.retryAfter !== undefined) {\n      console.error(`Retry after ${error.retryAfter}s`);\n    }\n  }\n}\n```\n\n| Property | Type | Description |\n| --- | --- | --- |\n| `statusCode` | `number \\| undefined` | HTTP status. `undefined` for network errors |\n| `code` | `string` | API error code (e.g. `INSUFFICIENT_FUNDS`). `NETWORK_ERROR` when the request never got a response. A 429 carries `SEND_RATE_LIMITED`, `MARKETING_FREQUENCY_EXCEEDED`, `BATCH_BUSY` or `RATE_LIMIT_EXCEEDED` |\n| `message` | `string` | Human-readable message from the API |\n| `details` | `object \\| undefined` | Extra context from the API |\n| `retryAfter` | `number \\| undefined` | Seconds to wait, from the `Retry-After` header |\n\nTwo subclasses narrow the common cases:\n\n- `PlanFeatureLockedError` (403 `PLAN_FEATURE_LOCKED`): exposes `feature`, `currentPlan` and `upgradeTo`.\n- `AuthenticationError` (401, or 403 without an error code): the key was rejected (invalid, expired, IP not allowed, missing permission). Exception: `messages.get(id)` on a message owned by another user answers an empty 403, which the SDK raises as a plain `AraraError` with code `RESOURCE_FORBIDDEN`.\n\n```typescript\nimport { PlanFeatureLockedError, AuthenticationError } from '@ararahq/sdk';\n\ntry {\n  await sdk.campaigns.create(campaign);\n} catch (error) {\n  if (error instanceof PlanFeatureLockedError) {\n    showUpgrade(error.upgradeTo);\n  } else if (error instanceof AuthenticationError) {\n    rotateKey();\n  }\n}\n```\n\n## Migrating from 1.x\n\nSee [CHANGELOG.md](CHANGELOG.md).\n\n## License\n\nMIT\n","readmeFilename":"README.md"}