Email SDK
Adapters

Resend

Send through the Resend API with attachments, tags, and native idempotency keys.

The Resend adapter calls the Resend Email API over fetch — no extra dependency. It is the default first adapter in these docs: short setup, broad field support, and it is the only adapter that forwards idempotency keys to the provider natively.

Resend logo
Resend
@opencoredev/email-sdk/resend
OfficialNot API testedRequest tested
Open website

Configure

Grab an API key from the Resend dashboard and verify the domain you plan to send from.

lib/email.ts
import { createEmailClient } from "@opencoredev/email-sdk";
import { resend } from "@opencoredev/email-sdk/resend";

export const email = createEmailClient({
  adapters: [resend({ apiKey: process.env.RESEND_API_KEY! })],
});

Prop

Type

Send

Resend maps every common transactional field: cc, bcc, replyTo, headers, attachments, and tags.

const result = await email.send(
  {
    from: "Acme <hello@acme.com>",
    to: [{ email: "user@example.com", name: "Ada" }],
    replyTo: "support@example.com",
    subject: "Welcome to Acme",
    html: "<p>Your workspace is ready.</p>",
    tags: [{ name: "type", value: "welcome" }],
    attachments: [
      { filename: "welcome.txt", content: "Welcome to Acme.", contentType: "text/plain" },
    ],
  },
  { idempotencyKey: "welcome:user_123" },
);

console.log(result.id); // Resend email id, also exposed as result.messageId

The idempotencyKey is sent as Resend's Idempotency-Key header, so retried requests cannot double-send.

No metadata field

Resend has no metadata concept, so metadata on a message throws an EmailValidationError before any request is made. Use tags instead, or pick a metadata-capable adapter.

Verify from the CLI

RESEND_API_KEY="re_..." npx email-sdk doctor --adapter resend
RESEND_API_KEY="re_..." npx email-sdk send \
  --adapter resend \
  --from "Acme <hello@acme.com>" \
  --to user@example.com \
  --subject "Resend smoke test" \
  --text "It works" \
  --dry-run

Drop --dry-run to perform one real send from the environment that will send production email — that is the only check that proves the account, sender domain, and recipient policy are ready.

On this page