How do you send transactional email with Postmark in 2026?
Quick Answer: As of April 2026, sending transactional email with Postmark requires creating a Server (per-app isolation), generating an API token, verifying a sender domain with DKIM and Return-Path, and posting to the `/email` or `/email/withTemplate` endpoint via the Postmark REST API or one of the official SDKs (Node, Ruby, Python, .NET, PHP, Go).
Sending Transactional Email With Postmark
Postmark separates transactional and broadcast streams to protect deliverability. As of April 2026, a typical setup takes under an hour.
Step 1 — Create a Server
A Server is Postmark's per-app isolation boundary. In the Postmark dashboard, click "Create Server", name it (e.g., "production-api"), and copy the Server API Token from Settings.
Step 2 — Verify a Sender Signature or Domain
For production, verify a domain rather than a single email address:
- Add the domain in Postmark → Sender Signatures → Add Domain
- Add the DKIM TXT record provided by Postmark
- Add the Return-Path CNAME for SPF alignment
- Wait for DNS propagation; status flips to "Verified"
Step 3 — Send via API or SDK
Direct REST call:
curl -X POST https://api.postmarkapp.com/email \
-H "X-Postmark-Server-Token: $TOKEN" \
-d '{"From":"[email protected]","To":"[email protected]","Subject":"Hi","TextBody":"Welcome"}'
Or use the Node SDK:
const postmark = require("postmark");
const client = new postmark.ServerClient(process.env.POSTMARK_TOKEN);
await client.sendEmail({ From: "[email protected]", To: "[email protected]", Subject: "Hi", TextBody: "Welcome" });
Step 4 — Add Templates and Streams
For repeated emails, create Templates with handlebars-style variables and call sendEmailWithTemplate. Use the default "outbound" stream for transactional and create separate "broadcast" streams for marketing — Postmark enforces this separation to maintain deliverability.