> ## Documentation Index
> Fetch the complete documentation index at: https://docs.usesendly.app/llms.txt
> Use this file to discover all available pages before exploring further.

# SDK Integration

> Sendly JavaScript/TypeScript SDK

## Installation

<CodeGroup>
  ```bash npm theme={null}
  npm install @sendlyapp/sdk
  ```

  ```bash yarn theme={null}
  yarn add @sendlyapp/sdk
  ```

  ```bash pnpm theme={null}
  pnpm add @sendlyapp/sdk
  ```
</CodeGroup>

## Setup

### Import and Initialize

```typescript theme={null}
import { Sendly } from '@sendlyapp/sdk'

// Initialize with API key
const client = new Sendly('se_your_api_key')

// Or use environment variable
const client = new Sendly()
```

### Environment Variables

Create a `.env` file:

```bash theme={null}
SENDLY_API_KEY=se_your_api_key
```

## Basic Usage

### Send an Email

```typescript theme={null}
const response = await client.emails.send({
  from: 'noreply@yourdomain.com',
  to: 'user@example.com',
  subject: 'Welcome!',
  html: '<h1>Hello!</h1><p>Thanks for signing up.</p>'
})

console.log('Email sent:', response.id)
```

### List Emails

```typescript theme={null}
const response = await client.emails.list({
  limit: 20,
  sortOrder: 'desc'
})

response.data.forEach(email => {
  console.log(`${email.to} - ${email.status}`)
})
```

### Get Email Details

```typescript theme={null}
const email = await client.emails.get('email_123')
console.log(`Status: ${email.status}`)
console.log(`Opened: ${email.opened_at ? 'Yes' : 'No'}`)
```

## Error Handling

```typescript theme={null}
import { SendlyError } from '@sendlyapp/sdk'

try {
  await client.emails.send({
    from: 'noreply@yourdomain.com',
    to: 'user@example.com',
    subject: 'Test',
    html: '<p>Content</p>'
  })
} catch (error) {
  if (error instanceof SendlyError) {
    console.error(`Error ${error.status}: ${error.message}`)
  }
}
```

## Advanced Examples

### With Tracking

```typescript theme={null}
const response = await client.emails.send({
  from: 'noreply@yourdomain.com',
  to: 'user@example.com',
  subject: 'Newsletter',
  html: '<h1>Newsletter</h1><p>Content...</p>',
  tracking: {
    open: true,
    click: true
  }
})
```

### With Attachments

```typescript theme={null}
import fs from 'fs'

const pdfContent = fs.readFileSync('document.pdf')
const base64 = pdfContent.toString('base64')

await client.emails.send({
  from: 'noreply@yourdomain.com',
  to: 'user@example.com',
  subject: 'Your Document',
  html: '<p>See attached document</p>',
  attachments: [
    {
      filename: 'document.pdf',
      content: base64,
      content_type: 'application/pdf'
    }
  ]
})
```

### Bulk Send with Retry

```typescript theme={null}
async function sendBulkWithRetry(recipients, template) {
  for (const recipient of recipients) {
    try {
      await client.emails.send({
        from: template.from,
        to: recipient.email,
        subject: template.subject,
        html: template.html,
        idempotencyKey: `${recipient.id}-${Date.now()}`
      })
    } catch (error) {
      console.error(`Failed to send to ${recipient.email}:`, error)
    }
  }
}
```

## Resources

* [Full SDK Documentation](/quickstart)
* [Error Codes](/errors)
* [Best Practices](/best-practices)

***

Need help? Contact [support@usesendly.app](mailto:support@usesendly.app)
