Home/Email API/TypeScript

Send email with TypeScript

The same one call as Node, fully typed: the compiler catches a missing from before your users do. Request and response types included in the SDK.

Verified By George Hartley, Co-founder · Updated July 20, 2026

Types catch the bug before the bounce

Untyped email code fails at runtime, in production, on the send that mattered. A typed client moves those failures to the compiler: a missing from, a misnamed field, an html body passed as a number, all caught before deploy.

One POST, and the send is handled

TypeScriptPOST /v1/my/messages
import { Nitrosend } from "@nitrosend/sdk"
const ns = new Nitrosend(process.env.NITROSEND_API_KEY!)

const { id } = await ns.messages.send({
  from: "[email protected]",
  to: "[email protected]",
  subject: "Welcome",
  html: "<p>You're in.</p>",
})

The response is typed too: destructure the message ID and hand it to your logs or your tests. First sends land in a sandbox, so you can wire the whole flow before a real address ever sees mail.

Types are half the tooling story. The other half: there's a design.md file structured specifically for AI agents. Drop it into Claude, Cursor, or ChatGPT and it designs better emails based on what the best brands are doing. I use it myself, and the quality difference is obvious.

And if you care about what a platform is made of: our MCP server, our CLI, and our AI SDK are all TypeScript. The agent surface of the product is written in the language you're reading this page for.

That AI SDK is @nitrosend/ai-sdk on npm, a TypeScript package built for Vercel AI SDK agents specifically. And the typed thinking runs through the API itself: upload an oversized CSV and you get a 422 with a validation_errors array you can act on, not an opaque 413 from some edge proxy. Errors are part of the type contract too.

Full parameters, responses, and error codes live in the REST API docs and the API reference.

Python Node.js PHP Go Rust +5
send.py requests ยท stdlib-adjacent
import requests

requests.post(
  "https://api.nitrosend.com/v1/messages",
  headers={"Authorization": f"Bearer {KEY}"},
  json={"to": to, "subject": subj,
        "html": body})
202 ACCEPTED
{ "id": "msg_9f2c",
  "status": "accepted" }

And the part no library gives you

The same account exposes an MCP server, so the agent writing your code can also run your email. Point Claude, Cursor, or Codex at api.nitrosend.com/mcp and it composes, previews, and stages sends, with a human approving every one. The API is for your code. The MCP is for your agent. One platform either way.

Every send comes back with a message ID, and delivery events follow on your webhook: delivered, opened, bounced. No dashboard required to know what happened.

Go deeper

First send in thirty seconds.

Simple pricing. Unlimited contacts.

Every plan includes full stack emailing: Flows, Newsletter Campaigns and Transactional Email, plus our NitroWheel LLM and all agent integrations (Claude, ChatGPT, Codex, Cursor and others). Pay for what you send, not who you store.

Free
$0
forever
  • Emails 8,000then 500/mo
  • Email types Transactional & Marketing
  • AI actions 20/mo
  • Contacts Free & Unlimited
  • Brands 1
  • Seats 1
Start free
Ultra
$100
per month
  • Emails 125,000/month
  • AI actions 5,000/mo
  • Brands 5
  • Seats 10 · Domains 3
  • Frontier AI Included
  • Dedicated IP Available
Get started
Enterprise
$300
per month
  • AI actions Unlimited
  • Unlimited brands & domains Included
  • SSO / SAML Included
  • 99.9% SLA Included
Get started

Free forever. No credit card required. See full comparison →