# Loops (/docs/adapters/loops)



<ProviderBadge adapter="loops" />

Loops transactional sends normally use a `transactionalId`.

```ts
import { createEmailClient } from "email-sdk";
import { loops } from "email-sdk/loops";

const email = createEmailClient({
  adapters: [
    loops({
      apiKey: process.env.LOOPS_API_KEY!,
      transactionalId: process.env.LOOPS_TRANSACTIONAL_ID!,
    }),
  ],
});
```

## Options [#options]

| Option            | Type           | Required | Notes                                |
| ----------------- | -------------- | -------- | ------------------------------------ |
| `apiKey`          | `string`       | Yes      | Loops API key.                       |
| `transactionalId` | `string`       | Usually  | Transactional email ID.              |
| `baseUrl`         | `string`       | No       | Defaults to `https://app.loops.so`.  |
| `fetch`           | `typeof fetch` | No       | Useful for tests or custom runtimes. |

Loops transactional sends support one recipient and metadata through `dataVariables`. Unsupported fields throw before the API call.
