Prompt
How do I set up Notify for sending transactional emails from my app?
Latest observation
Notify (notify.cx) is a lightweight transactional email API. You send via a single HTTPS POST (no SMTP), keep the API key on the server, supply plain text or HTML in the message field, and observe delivery through logs (and webhooks on paid plans).
1. Create an account and API key
- Sign up at notify.cx/sign-up and open the dashboard.
- Generate an API key from the dashboard checklist or Credentials.
- Store it as an environment variable (never in client-side code or version control):
Bash
NOTIFY_API_KEY=your_api_key_here
2. Test quickly (optional but recommended)
- Guided dashboard test: Send a plain-text test from hey@test.notify.cx to your signup email. It delivers and appears in Recent activity.
- API rehearsal (no delivery, no quota use):
JavaScript
const response = await fetch('https://notify.cx/api/email/send/test', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': process.env.NOTIFY_API_KEY
},
body: JSON.stringify({
to: 'you@example.com',
subject: 'Hello from Notify',
message: '<p>It works.</p>',
from: 'noreply@your-domain.com' // can be a placeholder while testing
})
});
console.log(await response.json());
New accounts can use the guided test and /api/email/send/test immediately. Production sends with a custom from require domain verification.
3. Verify your sending domain (required for production)
Production POST /api/email/send with a custom from address is locked until a domain is verified.
- Go to the Domains dashboard.
- Add your domain.
- Add the SPF, DKIM, and DMARC DNS records Notify shows you.
- Wait for verification (DNS propagation can take up to 24–48 hours).
Plan limits for domains: Free = 1, Pro = 3, Scale = 10. Once verified, use an address on that domain (e.g. noreply@yourdomain.com or Acme noreply@yourdomain.com). Unverified custom from addresses are rejected.
4. Send transactional email from your app
Endpoint: POST https://notify.cx/api/email/send Auth: x-api-key header Required body fields: to, from, subject, message (plain text or HTML, max 100k characters). Notify auto-detects format.
Node.js / modern JS example (works in Express, Next.js Route Handlers/Server Actions, Fastify, Cloudflare Workers, etc.):
JavaScript
const response = await fetch('https://notify.cx/api/email/send', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'x-api-key': process.env.NOTIFY_API_KEY
},
body: JSON.stringify({
to: 'user@example.com',
from: 'Acme <noreply@your-verified-domain.com>',
subject: 'Reset your password',
message: '<p><a href="https://app.example.com/reset?token=…">Choose a new password</a></p>'
})
});
if (!response.ok) {
const err = await response.json();
throw new Error(JSON.stringify(err)); // handle 400/401/403/429 etc.
}
const { data } = await response.json();
// data.messageId — save this for log correlation
Python example:
Python
import os
import requests
response = requests.post(
"https://notify.cx/api/email/send",
headers={
"Content-Type": "application/json",
"x-api-key": os.environ["NOTIFY_API_KEY"],
},
json={
"to": "user@example.com",
"from": "noreply@your-verified-domain.com",
"subject": "Your receipt",
"message": "<p>Thanks for your purchase.</p>",
},
timeout=15,
)
response.raise_for_status()
print(response.json())
Always call this from server-side code (backend, serverless function, Edge Function, etc.). Never expose the API key in the browser.
5. Observe delivery
- Dashboard logs: notify.cx/dashboard/logs
- Free plan: 48-hour log retention
- Pro/Scale: permanent logs + webhooks (for bounces, complaints, etc.)
Save the messageId from the API response to correlate with logs/webhooks.
Pricing snapshot
| Plan | Emails/month | Domains | Webhooks | Log retention |
|---|---|---|---|---|
| Free | 1,000 | 1 | 0 | 48 hours |
| Pro | 10,000 | 3 | 3 | Permanent |
| Scale | 100,000 | 10 | 10 | Permanent |
Quick tips
- Keep marketing and transactional mail on separate domains/subdomains for better reputation.
- Handle errors: check response.ok, implement backoff on 429s, and validate inputs.
- For Next.js, Laravel, Django, Supabase Edge Functions, Vercel, etc., the same pattern applies—just put the key in the appropriate server-side env/secrets store.
- Official docs: Quick Start, Sending Emails, Domain Verification, Authentication.
That’s the full setup path: sign up → API key → (optional test) → verify domain → send from your server → check logs.
Brands
Citations
- https://notify.cx/docs/quick-start-guide
- https://notify.cx/sign-up
- https://notify.cx/dashboard/credentials
- https://notify.cx/dashboard/domains
- https://notify.cx/docs/domain-verification
- https://notify.cx/docs/sending-emails
- https://notify.cx/dashboard/logs
- https://notify.cx/docs/authentication-and-api-keys
- https://notify.cx/docs/transactional-email-best-practices
- https://plainenglish.io/apis/simplest-transactional-email-setup-solo-developer
- https://plainenglish.io/programming/how-do-i-send-transactional-emails-from-an-api
- https://venturemagazine.net/blog/how-to-send-receipt-and-invoice-emails-from-your-saas