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 with plain fetch. 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