{"_id":"@cakemail-org/cakemail-sdk","_rev":"10-225516a8857f5b9e7837695ee33b7f35","name":"@cakemail-org/cakemail-sdk","dist-tags":{"latest":"2.2.0"},"versions":{"2.0.0":{"name":"@cakemail-org/cakemail-sdk","version":"2.0.0","keywords":["cakemail","api","sdk","email","marketing","typescript","transactional-email","campaigns","contacts","webhooks"],"author":{"name":"Cakemail","email":"support@cakemail.com"},"license":"MIT","_id":"@cakemail-org/cakemail-sdk@2.0.0","maintainers":[{"name":"joemingna","email":"jonathan@cakemail.com"},{"name":"labib-cakemail","email":"labib@cakemail.com"},{"name":"hdgatcake","email":"hdg@cakemail.com"},{"name":"zoyth","email":"f@cakemail.com"},{"name":"salar-cakemail","email":"salar@cakemail.com"}],"homepage":"https://github.com/cakemail/cakemail-sdk#readme","bugs":{"url":"https://github.com/cakemail/cakemail-sdk/issues"},"dist":{"shasum":"0e5c4a566c6c3e80f2ed7f7b5fd8abbc5886b756","tarball":"https://registry.npmjs.org/@cakemail-org/cakemail-sdk/-/cakemail-sdk-2.0.0.tgz","fileCount":1099,"integrity":"sha512-opxuRK4gYlQAqIyjeP4l1uv9gVsp00atWvzMl3SrO7FeFCIsxSsylVojzZLaqPCVHKeGoImTSSsA3FI3w9TQaw==","signatures":[{"sig":"MEUCIQDQBPxVsOiSeHM2AzdKiztA5RETojNobvZAU9cMgEtsSgIgOi/o/9OskSD2bqtKsx0al63iZCoL1QRgTeeJ+LNcVZA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":641447},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"b0156d75ebfef7249964abfc95fdb2fe9f3feea6","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","generate":"npx openapi-typescript-codegen --input ./openapi.json --output ./src/generated --client axios --useOptions --useUnionTypes","test:watch":"jest --watch","test:coverage":"jest --coverage","generate:types":"npx openapi-typescript https://api.cakemail.dev/openapi.json --output ./src/types/generated.ts","prepublishOnly":"npm run clean && npm run build && npm test"},"_npmUser":{"name":"zoyth","email":"f@cakemail.com"},"repository":{"url":"git+https://github.com/cakemail/cakemail-sdk.git","type":"git"},"_npmVersion":"11.6.0","description":"TypeScript SDK for Cakemail API with 100% coverage (232 operations)","directories":{},"_nodeVersion":"24.10.0","dependencies":{"axios":"^1.6.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.54.0","ts-jest":"^29.1.1","ts-node":"^10.9.2","typescript":"^5.3.2","@types/jest":"^29.5.10","@types/node":"^20.10.0","axios-mock-adapter":"^1.22.0","@typescript-eslint/parser":"^6.13.0","openapi-typescript-codegen":"^0.29.0","@typescript-eslint/eslint-plugin":"^6.13.0"},"_npmOperationalInternal":{"tmp":"tmp/cakemail-sdk_2.0.0_1760108322066_0.6361357128522305","host":"s3://npm-registry-packages-npm-production"}},"2.0.1":{"name":"@cakemail-org/cakemail-sdk","version":"2.0.1","keywords":["cakemail","api","sdk","email","marketing","typescript","transactional-email","campaigns","contacts","webhooks"],"author":{"name":"Cakemail","email":"support@cakemail.com"},"license":"MIT","_id":"@cakemail-org/cakemail-sdk@2.0.1","maintainers":[{"name":"joemingna","email":"jonathan@cakemail.com"},{"name":"labib-cakemail","email":"labib@cakemail.com"},{"name":"hdgatcake","email":"hdg@cakemail.com"},{"name":"zoyth","email":"f@cakemail.com"},{"name":"salar-cakemail","email":"salar@cakemail.com"}],"homepage":"https://github.com/cakemail/cakemail-sdk#readme","bugs":{"url":"https://github.com/cakemail/cakemail-sdk/issues"},"dist":{"shasum":"0848a7d9146d2f61163f4c54145a57931135499a","tarball":"https://registry.npmjs.org/@cakemail-org/cakemail-sdk/-/cakemail-sdk-2.0.1.tgz","fileCount":1099,"integrity":"sha512-//3tOF0NirurhkYVJNQw07EvFJAHqmmpZexeviJDMUh9dBWQkuPAMqKa+IWcXnfyH4sQz0DbKBK/aCyPl6o5rA==","signatures":[{"sig":"MEQCICr3qg7wbYCdoQ/Gp6laqYDDyBtXLwvBLmBN2leLAubzAiB1dT3qjGL+jbIqUqnGJavAdjaC50cAzTlVFjAPlOC64Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":642589},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"9ee2963987ec83e1f45d34c2d4f77750c7d6241c","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","generate":"npx openapi-typescript-codegen --input ./openapi.json --output ./src/generated --client axios --useOptions --useUnionTypes","test:watch":"jest --watch","test:coverage":"jest --coverage","generate:types":"npx openapi-typescript https://api.cakemail.dev/openapi.json --output ./src/types/generated.ts","prepublishOnly":"npm run clean && npm run build && npm test"},"_npmUser":{"name":"zoyth","email":"f@cakemail.com"},"repository":{"url":"git+https://github.com/cakemail/cakemail-sdk.git","type":"git"},"_npmVersion":"11.6.0","description":"TypeScript SDK for Cakemail API with 100% coverage (232 operations)","directories":{},"_nodeVersion":"24.10.0","dependencies":{"axios":"^1.6.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.54.0","ts-jest":"^29.1.1","ts-node":"^10.9.2","typescript":"^5.3.2","@types/jest":"^29.5.10","@types/node":"^20.10.0","axios-mock-adapter":"^1.22.0","@typescript-eslint/parser":"^6.13.0","openapi-typescript-codegen":"^0.29.0","@typescript-eslint/eslint-plugin":"^6.13.0"},"_npmOperationalInternal":{"tmp":"tmp/cakemail-sdk_2.0.1_1760237203203_0.45468342296912634","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@cakemail-org/cakemail-sdk","version":"2.1.0","keywords":["cakemail","api","sdk","email","marketing","typescript","transactional-email","campaigns","contacts","webhooks"],"author":{"name":"Cakemail","email":"support@cakemail.com"},"license":"MIT","_id":"@cakemail-org/cakemail-sdk@2.1.0","maintainers":[{"name":"joemingna","email":"jonathan@cakemail.com"},{"name":"labib-cakemail","email":"labib@cakemail.com"},{"name":"hdgatcake","email":"hdg@cakemail.com"},{"name":"zoyth","email":"f@cakemail.com"},{"name":"salar-cakemail","email":"salar@cakemail.com"}],"homepage":"https://github.com/cakemail/cakemail-sdk#readme","bugs":{"url":"https://github.com/cakemail/cakemail-sdk/issues"},"dist":{"shasum":"eef846a092848015ab199481551044e183dcddeb","tarball":"https://registry.npmjs.org/@cakemail-org/cakemail-sdk/-/cakemail-sdk-2.1.0.tgz","fileCount":1099,"integrity":"sha512-iMFNcy2w+IyhemQ+sMaPM2q3CYO59lNJOlt1kwljWINP7lg8sqtuM1pkGO2+7L2vL/JpxuAbPCpk398JzIfsxA==","signatures":[{"sig":"MEUCIQC9ob8V5oeIdvbMa/zPOdkcOl28yElLCFmV616UbQMq6gIgH1nx5odVRQO/4lujazCEbGH2lI5H5r59TBEYta+gNrI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":647820},"main":"dist/index.js","types":"dist/index.d.ts","engines":{"node":">=18.0.0"},"gitHead":"ce3a3af39b1645e0d52bef327867cea15b6d5d0b","scripts":{"lint":"eslint src --ext .ts","test":"jest","build":"tsc","clean":"rm -rf dist","generate":"npx openapi-typescript-codegen --input ./openapi.json --output ./src/generated --client axios --useOptions --useUnionTypes","test:watch":"jest --watch","test:coverage":"jest --coverage","generate:types":"npx openapi-typescript https://api.cakemail.dev/openapi.json --output ./src/types/generated.ts","prepublishOnly":"npm run clean && npm run build && npm test"},"_npmUser":{"name":"zoyth","email":"f@cakemail.com"},"repository":{"url":"git+https://github.com/cakemail/cakemail-sdk.git","type":"git"},"_npmVersion":"11.6.0","description":"TypeScript SDK for Cakemail API with 100% coverage (232 operations)","directories":{},"_nodeVersion":"24.10.0","dependencies":{"axios":"^1.6.2"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","eslint":"^8.54.0","ts-jest":"^29.1.1","ts-node":"^10.9.2","typescript":"^5.3.2","@types/jest":"^29.5.10","@types/node":"^20.10.0","axios-mock-adapter":"^1.22.0","@typescript-eslint/parser":"^6.13.0","openapi-typescript-codegen":"^0.29.0","@typescript-eslint/eslint-plugin":"^6.13.0"},"_npmOperationalInternal":{"tmp":"tmp/cakemail-sdk_2.1.0_1760559533699_0.8367480071781048","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@cakemail-org/cakemail-sdk","version":"2.2.0","_id":"@cakemail-org/cakemail-sdk@2.2.0","maintainers":[{"name":"sebgregoire","email":"greg@cakemail.com"},{"name":"joemingna","email":"jonathan@cakemail.com"},{"name":"labib-cakemail","email":"labib@cakemail.com"},{"name":"hdgatcake","email":"hdg@cakemail.com"},{"name":"zoyth","email":"f@cakemail.com"},{"name":"salar-cakemail","email":"salar@cakemail.com"}],"dist":{"shasum":"6259decd8e530600907a5b8ea16ae4522492c0dc","tarball":"https://registry.npmjs.org/@cakemail-org/cakemail-sdk/-/cakemail-sdk-2.2.0.tgz","fileCount":1736,"integrity":"sha512-agUwJBIbDsS7jaOpO4PcYKcGzGfXqyjVYDWNmi+CXde4OPxykSXK/LbPsdpBzndb4GZR+hBXGpST+9/4pfNEuQ==","signatures":[{"sig":"MEUCIHfGDMHpi7mkcFklh/1qzQtDaj5TCnkvySK0deMSxhIWAiEAlCRBzCcz2N3WuuFo+FawqssewYGd4tyRz3qEHp32j6Y=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1469657},"main":"dist/index.js","type":"module","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"ec07d92d9bd9fb3b06409f4731229b36c7d9e18f","scripts":{"build":"tsc","generate":"bash scripts/generate.sh","prepublishOnly":"npm run build"},"_npmUser":{"name":"zoyth","email":"f@cakemail.com"},"_npmVersion":"11.6.0","description":"SDK for the Cakemail API","directories":{},"_nodeVersion":"24.10.0","_hasShrinkwrap":false,"devDependencies":{"axios":"^1.15.0","fern-api":"^4.67.1","typescript":"^5.8.3","@types/jest":"^30.0.0","@types/node":"^22.15.21","axios-mock-adapter":"^2.1.0","openapi-typescript-codegen":"^0.29.0"},"_npmOperationalInternal":{"tmp":"tmp/cakemail-sdk_2.2.0_1775918995622_0.7669981182422434","host":"s3://npm-registry-packages-npm-production"}}},"time":{"created":"2025-10-10T14:58:41.972Z","modified":"2026-09-28T20:08:18.372Z","2.0.0":"2025-10-10T14:58:42.277Z","2.0.1":"2025-10-12T02:46:43.436Z","2.1.0":"2025-10-15T20:18:53.886Z","2.2.0":"2026-04-11T14:49:55.788Z"},"description":"SDK for the Cakemail API","maintainers":[{"email":"greg@cakemail.com","name":"sebgregoire"},{"email":"hdg@cakemail.com","name":"hdgatcake"},{"email":"f@cakemail.com","name":"zoyth"}],"readme":"# Cakemail SDK\n\nTypeScript SDK for the Cakemail API.\n\n## Installation\n\n```bash\nnpm install @cakemail-org/cakemail-sdk\n```\n\n## Quick Start\n\n```typescript\nimport { CakemailClient } from '@cakemail-org/cakemail-sdk';\n\n// Initialize the client\nconst client = new CakemailClient({\n  email: 'your-email@example.com',\n  password: 'your-password',\n});\n\n// Get current account\nconst account = await client.accounts.getSelf();\nconsole.log('Account:', account);\n\n// List contacts\nconst contacts = await client.contacts.list({\n  page: 1,\n  per_page: 20,\n  status: 'active',\n});\nconsole.log('Contacts:', contacts.data);\n```\n\n## Features\n\n- 🔒 **Automatic Authentication** - OAuth 2.0 with automatic token refresh\n- 🔄 **Retry Logic** - Exponential backoff for failed requests\n- 📊 **Multi-Tenant Support** - Manage child accounts seamlessly\n- 💪 **Type-Safe** - Full TypeScript support with comprehensive types\n- 🎯 **User-Friendly Errors** - Clear, actionable error messages\n- ✅ **Well Tested** - Comprehensive unit test coverage\n\n## Configuration\n\n### Email/Password Authentication\n\n```typescript\nconst client = new CakemailClient({\n  email: 'your-email@example.com',\n  password: 'your-password',\n});\n```\n\n### Access Token Authentication\n\nIf you already have an access token from an external OAuth flow, you can use it directly:\n\n```typescript\nconst client = new CakemailClient({\n  accessToken: 'your-access-token',\n  refreshToken: 'your-refresh-token', // Optional but recommended\n  expiresIn: 3600, // Optional: Token expiration in seconds (default: 3600)\n  scope: 'read write', // Optional: Token scope (default: 'read write')\n});\n```\n\n**Use cases for access token authentication:**\n- Web applications with browser-based OAuth flows\n- Service accounts with pre-generated tokens\n- Integration with external authentication systems\n- Token-based authentication without storing passwords\n\n**Note:** If a `refreshToken` is provided, the SDK will automatically refresh expired access tokens. Without a refresh token, you'll need to provide a new access token when the current one expires.\n\n### Advanced Configuration\n\n```typescript\nconst client = new CakemailClient({\n  email: 'your-email@example.com',\n  password: 'your-password',\n  baseURL: 'https://api.cakemail.dev', // Optional: Custom API URL\n  timeout: 30000, // Optional: Request timeout in ms (default: 30000)\n  maxRetries: 3, // Optional: Max retry attempts (default: 3)\n});\n```\n\n## Resources\n\n### Accounts\n\n```typescript\n// Get current account\nconst account = await client.accounts.getSelf();\n\n// Get account by ID\nconst account = await client.accounts.get(123);\n\n// List accounts\nconst accounts = await client.accounts.list({\n  page: 1,\n  per_page: 20,\n  status: 'active',\n});\n\n// Create account\nconst newAccount = await client.accounts.create({\n  name: 'New Account',\n  primary_email: 'new@example.com',\n});\n\n// Update account\nconst updated = await client.accounts.update(123, {\n  name: 'Updated Name',\n});\n\n// Delete account\nawait client.accounts.delete(123);\n\n// Get child accounts\nconst children = await client.accounts.getChildren(123);\n```\n\n### Contacts\n\n```typescript\n// Get contact by ID\nconst contact = await client.contacts.get(456);\n\n// Get contact by email\nconst contact = await client.contacts.getByEmail('user@example.com');\n\n// List contacts\nconst contacts = await client.contacts.list({\n  page: 1,\n  per_page: 20,\n  status: 'active',\n  list_id: 789,\n});\n\n// Create contact\nconst newContact = await client.contacts.create({\n  email: 'new@example.com',\n  first_name: 'John',\n  last_name: 'Doe',\n  custom_attributes: {\n    company: 'Acme Corp',\n  },\n});\n\n// Update contact\nconst updated = await client.contacts.update(456, {\n  first_name: 'Jane',\n});\n\n// Delete contact\nawait client.contacts.delete(456);\n\n// Subscribe to list\nawait client.contacts.subscribe(456, 789);\n\n// Unsubscribe from list\nawait client.contacts.unsubscribe(456, 789);\n\n// Add tags\nawait client.contacts.addTags(456, ['vip', 'newsletter']);\n\n// Remove tags\nawait client.contacts.removeTags(456, ['newsletter']);\n\n// Bulk operations\nconst result = await client.contacts.bulkOperation({\n  contact_ids: [1, 2, 3],\n  operation: 'subscribe',\n  parameters: { list_id: 789 },\n});\n```\n\n### Lists\n\n```typescript\n// Get list by ID\nconst list = await client.lists.get(789);\n\n// List all lists\nconst lists = await client.lists.list({\n  page: 1,\n  per_page: 20,\n  status: 'active',\n});\n\n// Create list\nconst newList = await client.lists.create({\n  name: 'Newsletter Subscribers',\n  sender_name: 'Acme Corp',\n  sender_email: 'newsletter@acme.com',\n});\n\n// Update list\nconst updated = await client.lists.update(789, {\n  name: 'Updated List Name',\n});\n\n// Delete list\nawait client.lists.delete(789);\n\n// Get list statistics\nconst stats = await client.lists.getStatistics(789);\n```\n\n### Campaigns\n\n```typescript\n// Get campaign by ID\nconst campaign = await client.campaigns.get(101);\n\n// List campaigns\nconst campaigns = await client.campaigns.list({\n  page: 1,\n  per_page: 20,\n  status: 'sent',\n});\n\n// Create campaign\nconst newCampaign = await client.campaigns.create({\n  name: 'Monthly Newsletter',\n  subject: 'Your Monthly Update',\n  sender_name: 'Acme Corp',\n  sender_email: 'newsletter@acme.com',\n  list_ids: [789],\n  content: {\n    html: '<h1>Hello!</h1><p>Welcome to our newsletter.</p>',\n    text: 'Hello! Welcome to our newsletter.',\n  },\n});\n\n// Update campaign\nconst updated = await client.campaigns.update(101, {\n  subject: 'Updated Subject Line',\n});\n\n// Schedule campaign\nawait client.campaigns.schedule(101, {\n  scheduled_at: '2024-12-31T10:00:00Z',\n});\n\n// Send campaign immediately\nawait client.campaigns.send(101);\n\n// Pause campaign\nawait client.campaigns.pause(101);\n\n// Resume campaign\nawait client.campaigns.resume(101);\n\n// Cancel campaign\nawait client.campaigns.cancel(101);\n\n// Get campaign statistics\nconst stats = await client.campaigns.getStatistics(101);\n\n// Send test email\nawait client.campaigns.sendTest(101, ['test@example.com']);\n```\n\n## Multi-Tenant Operations\n\nFor parent accounts managing child accounts, you can specify an `accountId` option:\n\n```typescript\n// Access child account data\nconst childContacts = await client.contacts.list(\n  { status: 'active' },\n  { accountId: 456 } // Child account ID\n);\n\n// Create resource in child account\nconst newContact = await client.contacts.create(\n  {\n    email: 'new@example.com',\n    first_name: 'John',\n  },\n  { accountId: 456 }\n);\n```\n\n## Error Handling\n\nThe SDK provides detailed error types for better error handling:\n\n```typescript\nimport {\n  CakemailError,\n  CakemailAPIError,\n  CakemailAuthError,\n  CakemailNetworkError,\n  CakemailValidationError,\n} from '@cakemail-org/cakemail-sdk';\n\ntry {\n  const contact = await client.contacts.get(999);\n} catch (error) {\n  if (error instanceof CakemailAPIError) {\n    console.error('API Error:', error.getUserFriendlyMessage());\n    console.error('Status Code:', error.statusCode);\n    console.error('Response:', error.responseBody);\n  } else if (error instanceof CakemailAuthError) {\n    console.error('Authentication failed:', error.message);\n  } else if (error instanceof CakemailNetworkError) {\n    console.error('Network error:', error.message);\n  } else if (error instanceof CakemailValidationError) {\n    console.error('Validation error:', error.message);\n  }\n}\n```\n\n### User-Friendly Error Messages\n\nAPI errors include user-friendly messages via `getUserFriendlyMessage()`:\n\n```typescript\ntry {\n  await client.contacts.create({ email: 'invalid-email' });\n} catch (error) {\n  if (error instanceof CakemailAPIError) {\n    // Shows: \"Invalid request: Invalid email format. Please check your parameters.\"\n    console.error(error.getUserFriendlyMessage());\n  }\n}\n```\n\n## Authentication\n\n### Automatic Token Management\n\nThe SDK automatically handles OAuth 2.0 token lifecycle:\n\n- Authenticates on first API request\n- Caches access tokens\n- Refreshes tokens before expiration (5-minute buffer)\n- Retries failed requests after token refresh\n\n### Manual Authentication\n\n```typescript\n// Explicitly authenticate (optional)\nawait client.authenticate();\n\n// Get token information\nconst tokenInfo = client.getTokenInfo();\nconsole.log('Token valid:', tokenInfo.isValid);\nconsole.log('Expires at:', new Date(tokenInfo.expiresAt!));\n\n// Clear cached token (forces re-authentication)\nclient.clearAuthCache();\n```\n\n## Retry Logic\n\nThe SDK automatically retries failed requests with exponential backoff:\n\n- Network errors: Retries automatically\n- 5xx server errors: Retries automatically\n- 401 errors: Refreshes token and retries once\n- Max retries: 3 attempts (configurable)\n- Backoff: 1s, 2s, 4s, 8s (max 10s)\n\n## TypeScript Support\n\nThe SDK is written in TypeScript and includes comprehensive type definitions:\n\n```typescript\nimport {\n  Account,\n  Contact,\n  List,\n  Campaign,\n  CreateContactRequest,\n  UpdateContactRequest,\n  ContactStatus,\n  CampaignStatus,\n} from '@cakemail-org/cakemail-sdk';\n\nconst contact: Contact = await client.contacts.get(123);\n\nconst createRequest: CreateContactRequest = {\n  email: 'new@example.com',\n  first_name: 'John',\n  status: ContactStatus.Active,\n};\n```\n\n## Command-Line Interface\n\nFor quick testing, automation scripts, and terminal access, the [Cakemail CLI](https://github.com/cakemail/cakemail-cli) is also available:\n\n**Installation:**\n```bash\n# via Homebrew (macOS/Linux)\nbrew tap cakemail/cakemail\nbrew install cakemail-cli\n\n# via npm\nnpm install -g @cakemail-org/cakemail-cli\n\n# via npx (no installation)\nnpx @cakemail-org/cakemail-cli --help\n```\n\n**Example usage:**\n```bash\ncakemail campaigns list\ncakemail contacts create --email user@example.com --first-name John\ncakemail campaigns send --id 123\n```\n\nThe CLI uses this SDK internally and is ideal for:\n- Quick testing and debugging\n- DevOps automation and CI/CD pipelines\n- Non-developer users (marketers, operations teams)\n- Scripting and batch operations\n\nSee the [CLI documentation](https://github.com/cakemail/cakemail-cli) for complete details.\n\n## Development\n\n```bash\n# Install dependencies\nnpm install\n\n# Build\nnpm run build\n\n# Run tests\nnpm test\n\n# Run tests in watch mode\nnpm run test:watch\n\n# Generate coverage report\nnpm run test:coverage\n\n# Lint code\nnpm run lint\n```\n\n## License\n\nMIT\n\n## Related Projects\n\n- [Cakemail CLI](https://github.com/cakemail/cakemail-cli) - Command-line interface for Cakemail\n- [Cakemail n8n Node](https://github.com/cakemail/cakemail-n8n-nodes) - n8n workflow automation integration\n\n## Support\n\nFor issues and questions:\n- GitHub Issues: https://github.com/cakemail/cakemail-sdk/issues\n- Documentation: https://docs.cakemail.com\n","readmeFilename":"README.md"}