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

# JavaScript / TypeScript SDK

> @robase/node — for Node 18+, Deno, and Cloudflare Workers.

## Install

```bash npm theme={null}
npm install @robase/node
```

```bash pnpm theme={null}
pnpm add @robase/node
```

```bash bun theme={null}
bun add @robase/node
```

## Initialize

```typescript theme={null}
import { Robase } from '@robase/node';

const pm = new Robase(process.env.ROBASE_API_KEY!);
```

Or with explicit options:

```typescript theme={null}
const pm = new Robase({
  apiKey: process.env.ROBASE_API_KEY!,
  baseUrl: 'https://api.robase.dev/v1', // default
  fetch: globalThis.fetch,               // override for testing
});
```

## Surface

```typescript theme={null}
pm.emails.send(...)
pm.emails.batch(...)
pm.emails.get(id)
pm.emails.list({ limit, cursor })
pm.emails.cancel(id)

pm.sms.send(...)
pm.sms.batch(...)
pm.sms.get(id)
pm.sms.list({ limit, cursor })
pm.sms.analytics(days)

pm.smsTemplates.create({ name, body })
pm.smsTemplates.list()
pm.smsTemplates.get(id)
pm.smsTemplates.update(id, { body })
pm.smsTemplates.remove(id)
pm.smsTemplates.render(id, variables)

pm.senderIds.create({ sender_id, ... })
pm.senderIds.list()
pm.senderIds.update(id, { ... })

pm.domains.create({ name })
pm.domains.list()
pm.domains.get(id)
pm.domains.verify(id)

pm.webhooks.create({ url, events })
pm.webhooks.list()
pm.webhooks.update(id, { ... })
pm.webhooks.remove(id)
pm.webhooks.test(id)

pm.suppressions.add({ email, reason })
pm.suppressions.list()
pm.suppressions.remove(email)
```

## Errors

```typescript theme={null}
import { RobaseError } from '@robase/node';

try {
  await pm.sms.send({ to, from, body });
} catch (e) {
  if (e instanceof RobaseError) {
    console.log(e.status, e.type, e.message);
    if (e.type === 'phone_invalid') { /* ... */ }
  }
}
```

## Verifying webhooks

```typescript theme={null}
import { verifyWebhook } from '@robase/node';

const ok = await verifyWebhook(rawBody, req.headers['robase-signature'], secret);
```

See [webhook security](/guides/webhook-security) for the full pattern.

## TypeScript types

Every method returns fully-typed responses — imports don't need a separate types package. If you use `tsc --strict`, the SDK respects it.

## Edge / serverless runtimes

The SDK uses the platform `fetch` when available — so it works on:

* **Cloudflare Workers** — drop in, no config.
* **Vercel Edge Functions** — drop in.
* **Deno / Bun** — drop in.
* **Browser** — technically works, but **never use a live key in a browser**. Route through your server.
