Brevo
Send through the Brevo transactional email API with full field support and metadata mapped to template params.
The Brevo adapter calls the Brevo transactional email API over fetch — no extra dependency. It authenticates with Brevo's api-key header (not a Bearer token), supports every common field, and maps metadata to Brevo's params — the same values Brevo templates substitute.
@opencoredev/email-sdk/brevoConfigure
Create an API key under SMTP & API in the Brevo dashboard and verify the sender or domain you use in from.
import { createEmailClient } from "@opencoredev/email-sdk";
import { brevo } from "@opencoredev/email-sdk/brevo";
export const email = createEmailClient({
adapters: [brevo({ apiKey: process.env.BREVO_API_KEY! })],
});Prop
Type
Send
Brevo maps cc, bcc, headers, attachments, tags (values only), and metadata (as params). replyTo accepts a single address — two or more throw an EmailValidationError before any request.
const result = await email.send({
from: "Acme <hello@acme.com>",
to: [{ email: "user@example.com", name: "Ada" }],
replyTo: "support@acme.com",
subject: "You're invited to the Acme workspace",
html: "<p>Ada invited you to join the Acme workspace.</p>",
metadata: { workspaceId: "ws_123" },
tags: [{ name: "type", value: "invite" }],
});
console.log(result.id); // Brevo messageId, also exposed as result.messageIdThe response id is Brevo's messageId (falling back to id) — match it against events in Brevo's logs and webhooks.
Metadata becomes template params
metadata is sent as Brevo params, the values Brevo substitutes into templates. If you use
Brevo template syntax in your content, pick metadata keys that don't collide with template
placeholders.
Verify from the CLI
BREVO_API_KEY="xkeysib-..." npx email-sdk doctor --adapter brevoBREVO_API_KEY="xkeysib-..." npx email-sdk send \
--adapter brevo \
--from "Acme <hello@acme.com>" \
--to user@example.com \
--subject "Brevo smoke test" \
--text "It works" \
--dry-runDrop --dry-run for one real send — that is the only check that proves the key, sender verification, and recipient policy are ready.
