Email SDK
Adapters

Loops

Trigger a published Loops transactional email for one recipient, with metadata delivered as dataVariables.

The Loops adapter calls the Loops transactional API over fetch — no extra dependency. It triggers a published transactional email by transactionalId for exactly one recipient and hands your message to the template as dataVariables.

Loops logo
Loops
@opencoredev/email-sdk/loops
OfficialNot API testedRequest tested
Open website

Configure

Create an API key in Loops with permission to send transactional email, then publish the transactional email and copy its transactionalId.

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

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

Prop

Type

Send

The Loops template renders the email. The adapter merges subject, html, text, from, and every metadata key into dataVariables — your template decides which of them appear. Exactly one to recipient is allowed per send.

const result = await email.send({
  from: "Acme <hello@acme.com>",
  to: "user@example.com",
  subject: "Reset your password",
  html: "<p>Use the button below to reset your password.</p>",
  metadata: {
    firstName: "Ada",
    resetUrl: "https://acme.com/reset/abc123",
  },
});

console.log(result.id); // Loops id (or transactionalId) from the response

Attachments are supported and sent as { filename, contentType, data } with base64-encoded content.

Attachments need account enablement

Loops only accepts transactional attachments on accounts where the capability has been enabled — without it, sends with attachments fail at the API. Also note cc, bcc, replyTo, headers, and tags throw an EmailValidationError before any request; see field support.

Verify from the CLI

LOOPS_API_KEY="..." LOOPS_TRANSACTIONAL_ID="cm..." npx email-sdk doctor --adapter loops
LOOPS_API_KEY="..." LOOPS_TRANSACTIONAL_ID="cm..." npx email-sdk send \
  --adapter loops \
  --from "Acme <hello@acme.com>" \
  --to user@example.com \
  --subject "Loops smoke test" \
  --text "It works" \
  --dry-run

Drop --dry-run to trigger one real template send and confirm the API key and published transactional email are live.

On this page