Your Node app sends the email. The same typed client reads the events back.

You want email in a Node service without hand-rolling fetch, retries, and error parsing. Install noticeapi, authenticate with a scoped ntc_ key, and call notice.emails.send() — a typed client that throws on non-2xx responses and lets you look any send back up by id. The same client runs in Express, Fastify, workers, queues, and one-off scripts.

Shortest working path
Express route with safe retries and typed errors
import express from "express";
import { NoticeAPI, NoticeAPIError } from "noticeapi";

const app = express();
const notice = new NoticeAPI(process.env.NOTICEAPI_API_KEY!);

app.use(express.json());

app.post("/send-receipt", async (req, res) => {
  try {
    const { email, orderId } = req.body;
    const result = await notice.emails.send(
      {
        from: "Acme Billing <[email protected]>",
        to: email,
        subject: `Receipt #${orderId}`,
        html: "<p>Your receipt is ready.</p>",
      },
      { idempotencyKey: `receipt-${orderId}` },
    );
    res.json({ id: result.id });
  } catch (error) {
    if (error instanceof NoticeAPIError) {
      res.status(error.status).json({ code: error.code, message: error.message });
      return;
    }
    throw error;
  }
});

Connect it, test it, then move traffic.

  1. 1

    Install the SDK

    Run npm install noticeapi in any Node 18+ project; it pulls in no other packages.

  2. 2

    Create a scoped key

    Mint an ntc_ key with the sending preset and read it from a server-only env var, never the client bundle.

  3. 3

    Send, then catch typed errors

    Call new NoticeAPI(key) and notice.emails.send(); a non-2xx response throws NoticeAPIError with the HTTP status and a stable code.

  4. 4

    Inspect the event

    Look the returned id back up for the recipient timeline, or verify signed x-noticeapi- webhooks to update your app.

What remains visible after integration.

Zero dependencies, Node 18+

Install noticeapi from npm. It ships no dependencies and calls Node's built-in fetch, so nothing extra lands in your lockfile.

One client, any framework

The same notice client runs in Express, Fastify, background workers, queues, and CLI scripts.

One send per request, attachments on Pro

Reuse the order or job id so a repeated request returns the first send. Attach files as base64 objects on paid plans.

Look the send back up

Every send returns an id. Fetch it for the recipient timeline — delivered, bounced, or complained — from the same typed client.

Every method is one documented REST call

The SDK mirrors the HTTP API one-to-one, so anything in the REST docs is a single typed method away. Non-2xx responses throw NoticeAPIError carrying the HTTP status and a stable, documented error code.

Read the implementation.

Questions before you ship.

Which Node versions are supported?

Node 18 and newer. The SDK relies on the built-in fetch API, which arrived in Node 18.

Can I send attachments from Node?

Yes, on a paid plan. Pass attachment objects with a filename and base64 content to notice.emails.send().

Does the SDK do more than send?

Yes. One client covers send, batch, email lookup, templates, contacts, audiences, broadcasts, and suppressions.

Test it. Then send for real.

Simulator outcomes are free. Move to a verified domain when the path is ready.

Create your account Compare plans