Quickstart
Create an API key, verify a domain and send your first email in about two minutes.
Three steps to a delivered email: create a key, verify a domain, make one call. You need a Notix account. The free plan needs no card.
Want to check a send before it goes out? Add the header Notix-Dry-Run: true and nothing is sent. See Test emails.
Send your first email
Create an API key
Open API keys in the console and press Create API key. Give it a name and pick a permission. The key is shown once, when you create it, and is stored only as a salted hash. Nobody can read it back later, us included.
Keep it on your server as
NOTIX_API_KEY. Never put it in a browser or a mobile app.export NOTIX_API_KEY="notix_..."More on permissions and limits in Create an API key.
Verify a sending domain
Open Domains, press Add domain and enter a subdomain such as
mail.acme.com. Notix gives you the DNS records to publish: DKIM, SPF and DMARC. Once they are found, the domain turns Verified.If your DNS host supports one-click setup for Notix (Cloudflare and NameSilo do today), press Set up automatically and Notix adds the records for you. Otherwise, follow the guide for your DNS host in Add your DNS records. The full walk-through is in Add and verify a domain.
Make the call
One POST, one JSON body, one email id back. Attachments, scheduling, reply-to, cc, bcc, headers and templates are the same call with more fields.
curl https://app.usenotix.dev/api/v1/emails \ -H "Authorization: Bearer $NOTIX_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "from": "receipts@acme.com", "to": "maria@example.com", "subject": "Your receipt", "html": "<p>Thanks for your order.</p>" }'import { Notix } from "notix-js"; const notix = new Notix(process.env.NOTIX_API_KEY); const { data, error } = await notix.emails.send({ from: "receipts@acme.com", to: "maria@example.com", subject: "Your receipt", html: "<p>Thanks for your order.</p>", });import os from notix import Notix notix = Notix(os.environ["NOTIX_API_KEY"]) data, error = notix.emails.send({ "from": "receipts@acme.com", "to": "maria@example.com", "subject": "Your receipt", "html": "<p>Thanks for your order.</p>", })<?php use Notix\Notix; $notix = new Notix(getenv('NOTIX_API_KEY')); $email = $notix->emails->send([ 'from' => 'receipts@acme.com', 'to' => 'maria@example.com', 'subject' => 'Your receipt', 'html' => '<p>Thanks for your order.</p>', ]);The answer carries the email id. Look it up later with Get an email, or in Emails in the console.
Prefer a guide for your stack? Pick one: Node.js, Next.js, Python, PHP, Laravel, SMTP or cURL.
Retry without sending twice
Pass an Idempotency-Key header of up to 256 characters on a send or a batch. If the same request arrives again, Notix returns the first result instead of sending a second email. The same key with a different body answers 409 NOT_UNIQUE. Keys last 24 hours.
curl https://app.usenotix.dev/api/v1/emails \
-H "Authorization: Bearer $NOTIX_API_KEY" \
-H "Idempotency-Key: order-4821-receipt" \
-H "Content-Type: application/json" \
-d '{ "from": "receipts@acme.com", "to": "maria@example.com",
"subject": "Your receipt", "html": "<p>Thanks.</p>" }'
Build the key from your own record, like order-4821-receipt, not from a clock or a retry count. More in Idempotency keys.
Hear what happened with webhooks
Add an endpoint in Webhooks and Notix posts an event when an email is sent, delivered, bounced, opened or clicked, when a contact changes, and when a code is checked. Every call is signed with X-Notix-Signature. Start with the webhooks introduction, then see every event type.
Verify an address with a one-time code
Send a numeric code, then check what the person typed back. Notix keeps only a keyed hash of the code. codeLength is 6 digits by default (4 to 8), and expiresIn is 600 seconds by default (60 to 1800).
import { Notix } from "notix-js";
const notix = new Notix(process.env.NOTIX_API_KEY);
const sent = await notix.verify.send({ to: "maria@example.com", appName: "Acme" });
if (!sent.data) throw new Error(sent.error?.message ?? "The code was not sent");
const result = await notix.verify.check({ id: sent.data.id, code: "123456" });
if (result.data?.verified) {
// The code matched.
}
Codes go by SMS too. See One-time codes.
Start an automation
An automation walks each contact through its own steps: an email, a wait, another email. Enrol a contact by id or by email and Notix sends each step in turn.
const run = await notix.automations.enroll("jrn_abc123", { email: "maria@example.com" });
if (!run.data) throw new Error(run.error?.message ?? "The contact was not enrolled");
A contact holds at most one run per automation. Build automations in the console with Automations.
Check before you send
One call renders the message, runs a spam filter over it, opens up to 20 links, and returns a verdict, a score out of 100 and a fix for each finding. It costs no units. Broadcasts and automations run the same check and refuse anything it blocks.
const report = await notix.deliverability.check({
from: "news@acme.com",
subject: "Your September update",
html: "<p>Read the update.</p>",
marketing: true,
});
if (report.data?.verdict === "BLOCK") {
for (const finding of report.data.findings) console.error(finding.title + ": " + finding.fix);
}
More in Check before you send.
Paying in NGN or KES
Teams in Nigeria and Kenya pay in their own currency. Add money to your Notix wallet by card, bank transfer or mobile money, and Notix takes Pro and any usage from that balance. Prices are set in naira and shillings, so they do not move with the exchange rate. Top-ups are prepaid and not refundable. Everyone else pays in USD by card. See Billing and wallet.
Next steps
- Platform tour: every screen of the console.
- Connect your AI: give Claude, ChatGPT or Cursor a key.
- API reference: every endpoint, with requests and responses.