SparkPost
Send through the SparkPost Transmissions API with metadata, substitution data from tags, and a provider-side sandbox mode.
The SparkPost adapter calls the SparkPost Transmissions API over fetch — no extra dependency. Two things set it apart: a sandbox option that routes sends through SparkPost's shared sandbox domain for testing, and tags become SparkPost substitution_data as name: value pairs instead of a flat list.
@opencoredev/email-sdk/sparkpostConfigure
Create an API key with Transmissions permission in the SparkPost dashboard. SparkPost expects the raw key in the Authorization header — the adapter sends it without a Bearer prefix.
import { createEmailClient } from "@opencoredev/email-sdk";
import { sparkpost } from "@opencoredev/email-sdk/sparkpost";
export const email = createEmailClient({
adapters: [sparkpost({ apiKey: process.env.SPARKPOST_API_KEY! })],
});Prop
Type
Send
SparkPost maps replyTo, headers, attachments, metadata, and tags (each tag becomes a substitution_data entry keyed by its name).
const result = await email.send({
from: { email: "alerts@acme.com", name: "Acme Alerts" },
to: "user@example.com",
replyTo: "support@acme.com",
subject: "Usage alert: 90% of plan limit",
html: "<p>Your workspace is at 90% of its monthly quota.</p>",
metadata: { workspaceId: "ws_123" },
tags: [{ name: "type", value: "usage-alert" }],
});
console.log(result.id); // SparkPost transmission idThe response id is the transmission id from results.id (or results.transmission_id) — use it to query SparkPost's events API for delivery status.
No cc or bcc
This adapter sends one flat recipient list, so cc or bcc on a message throws an
EmailValidationError before any request is made. Add extra recipients to to, or pick a
cc/bcc-capable adapter.
Verify from the CLI
SPARKPOST_API_KEY="..." npx email-sdk doctor --adapter sparkpostSPARKPOST_API_KEY="..." npx email-sdk send \
--adapter sparkpost \
--from "Acme <hello@acme.com>" \
--to user@example.com \
--subject "SparkPost smoke test" \
--text "It works" \
--dry-runDrop --dry-run for one real send — that is the only check that proves the key, sending domain, and recipient policy are ready.
