# Adapters (/docs/v/0.5.0/adapters)



Email SDK ships with 18 adapters. Import only the adapter you use; the package does not ask you
to configure providers that are not on your send path.

Every adapter follows the same contract: map the fields it supports and throw a validation error for
fields the provider API cannot represent. Use the <a href="/docs/v/0.5.0/adapters/field-support">SDK field support guide</a>
before choosing fallback routes.

<ProviderGrid />

## Which adapter should I start with? [#which-adapter-should-i-start-with]

| If you want...                         | Start with                                               |
| -------------------------------------- | -------------------------------------------------------- |
| The fastest first send                 | Resend                                                   |
| Mature transactional delivery controls | Postmark, SendGrid, AWS SES, Mailgun, Unosend, or Brevo  |
| A backup route for production delivery | A primary API adapter plus Postmark or SMTP              |
| Product-triggered emails               | Loops or Plunk                                           |
| A cheap or self-managed transport      | SMTP                                                     |
| Heavy attachment support               | Resend, Postmark, SendGrid, Mailgun, Unosend, MailerSend |

## Want to build a community adapter? [#want-to-build-a-community-adapter]

Do not add third-party provider experiments to the official package by default. Publish a separate community package, export an adapter plugin, and list it in the community registry if you want discoverability.

<Cards>
  <Card title="Create an adapter" href="/docs/v/0.5.0/guides/authoring/create-adapter" description="Implement the provider mapping and wrap it as an adapter plugin." />

  <Card title="Publish a community adapter" href="/docs/v/0.5.0/guides/authoring/publish-community-adapter" description="Build and publish a third-party provider package without making it official." />
</Cards>

## What the status labels mean [#what-the-status-labels-mean]

Provider cards use three labels:

* `Official` means the adapter ships in `@opencoredev/email-sdk`.
* `Payload-tested` means repository tests cover request mapping, responses, and fail-fast validation with injected fetch calls.
* `Built-in transport` means the adapter sends through Email SDK's own transport implementation instead of a provider API.
* `Live account required` means final delivery still depends on provider setup: verified domains, sender identities, API scopes, sandbox settings, regions, rate limits, and provider policy.
* `SMTP server required` means final delivery depends on the SMTP host, credentials, and TLS settings you provide.

Email SDK can catch unsupported fields before a request. It cannot make a provider account ready to send from an unverified domain.

## Import pattern [#import-pattern]

```ts
import { createEmailClient } from "@opencoredev/email-sdk";
import { resend } from "@opencoredev/email-sdk/resend";
import { smtp } from "@opencoredev/email-sdk/smtp";

const email = createEmailClient({
  adapters: [
    resend({ apiKey: process.env.RESEND_API_KEY! }),
    smtp({
      host: process.env.SMTP_HOST!,
      auth: {
        user: process.env.SMTP_USER!,
        pass: process.env.SMTP_PASS!,
      },
    }),
  ],
  fallback: ["smtp"],
});
```

## Adapter groups [#adapter-groups]

| Group          | Adapters                                                                                 |
| -------------- | ---------------------------------------------------------------------------------------- |
| Popular APIs   | Resend, Postmark, SendGrid, Mailgun, Unosend, MailerSend, Brevo, Mailchimp Transactional |
| Infrastructure | Cloudflare Email Sending, SparkPost, Mailtrap, Scaleway, ZeptoMail, MailPace             |
| Product-led    | Loops, Plunk                                                                             |
| Transport      | Built-in SMTP                                                                            |
