SDK's

Node.js / TypeScript

Gebruik de officiële @nljerry/wesender-node SDK voor de best mogelijke TypeScript-ervaring met volledige type-definities. Werkt met Node.js 18+, Bun en Deno.

github.com/nljerry/wesender-node

Installatie

npm
npm install @nljerry/wesender-node
bun
bun add @nljerry/wesender-node
pnpm
pnpm add @nljerry/wesender-node

Initialisatie

lib/wesender.ts
import { Wesender } from "@nljerry/wesender-node"

export const ws = new Wesender(process.env.WS_API_KEY!)

E-mail versturen

E-mail versturen
const { id, status } = await ws.emails.send({
  from:    "noreply@joudomein.nl",
  to:      "klant@voorbeeld.nl",
  subject: "Welkom!",
  html:    "<p>Bedankt voor je registratie.</p>",
})

console.log(id, status) // em_01hw... queued

Meerdere ontvangers & CC

CC en BCC
await ws.emails.send({
  from:    "noreply@joudomein.nl",
  to:      ["a@voorbeeld.nl", "b@voorbeeld.nl"],
  cc:      ["manager@bedrijf.nl"],
  bcc:     ["audit@bedrijf.nl"],
  subject: "Maandelijks rapport",
  html:    "<p>Zie bijlage.</p>",
})

Bijlagen

PDF meesturen
import { readFileSync } from "fs"

const pdf = readFileSync("./factuur.pdf").toString("base64")

await ws.emails.send({
  from:    "facturen@joudomein.nl",
  to:      "klant@voorbeeld.nl",
  subject: "Factuur 2026-0142",
  html:    "<p>Bijgevoegd vind je jouw factuur.</p>",
  attachments: [{
    filename:     "factuur-2026-0142.pdf",
    content:      pdf,
    content_type: "application/pdf",
  }],
})

Batch versturen

Batch
const results = await ws.emails.sendBatch([
  { from: "nl@bedrijf.nl", to: "a@voorbeeld.nl", subject: "Hoi A", html: "<p>A</p>" },
  { from: "nl@bedrijf.nl", to: "b@voorbeeld.nl", subject: "Hoi B", html: "<p>B</p>" },
])

results.forEach(r => console.log(r.id, r.status))

Domeinen beheren

Domeinen
// Alle domeinen
const domeinen = await ws.domains.list()

// Domein toevoegen
const domein = await ws.domains.create("joudomein.nl")
console.log(domein.dnsRecords) // SPF, DKIM en DMARC-records

// DNS verifiëren
const geverifieerd = await ws.domains.verify(domein.id)
console.log(geverifieerd.spfOk, geverifieerd.dkimOk)

API-sleutels beheren

API-sleutels
// Alle sleutels ophalen
const sleutels = await ws.apiKeys.list()

// Nieuwe sleutel aanmaken
const { id, token } = await ws.apiKeys.create("Productie-server")
console.log(token) // ws_live_... (sla dit op!)

// Sleutel verwijderen
await ws.apiKeys.delete(id)

Webhooks

Webhook registreren
const webhook = await ws.webhooks.create(
  "https://joudomein.nl/webhooks/email",
  ["email.delivered", "email.bounced", "email.opened"],
)

console.log(webhook.secret) // gebruik dit om handtekening te valideren

Foutafhandeling

WesenderError
import { Wesender, WesenderError } from "@nljerry/wesender-node"

try {
  await ws.emails.send({ from: "...", to: "...", subject: "...", html: "..." })
} catch (err) {
  if (err instanceof WesenderError) {
    console.error(err.message, err.status, err.code)
    // bijv. "Domain not verified", 422, "domain_not_verified"
  }
  throw err
}

Next.js Server Action

app/actions/email.ts
"use server"
import { ws } from "@/lib/wesender"

export async function sendWelcomeEmail(to: string, name: string) {
  return ws.emails.send({
    from:    "noreply@joudomein.nl",
    to,
    subject: `Welkom, ${name}!`,
    html:    `<h1>Hoi ${name}!</h1><p>Bedankt voor je aanmelding.</p>`,
  })
}

Zonder SDK (fetch)

Wil je liever geen dependency toevoegen? De REST API werkt ook direct met fetch.

Directe fetch
const res = await fetch("https://api.wesender.nl/emails", {
  method: "POST",
  headers: {
    Authorization:  `Bearer ${process.env.WS_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    from: "noreply@joudomein.nl", to: "klant@voorbeeld.nl",
    subject: "Hallo!", html: "<p>Via fetch.</p>",
  }),
})
const { id } = await res.json()