WhatsApp, SMS, transactional email, smart routing (auto), sandbox testing, analytics, and outbound logs — all behind one API key.
Last updated: March 2026. Documentation reflects current production behavior.
https://api.notif.mlSend quick WhatsApp, email, and scheduled messages from your terminal with notifml-cli.
npm i -g notifml-cli
notif init --key ntf_live_xxx --to +22370000000
notif me "Build failed on prod"
notif "Ship done"
notif send +22370000000 "Check ASAP"
notif run -- npm run build
notif balance
notif doctor
notif me --at "in 10m" "Check deploy"Frequent recipients stay as local aliases in your terminal config, so Notif remains a lightweight notification API instead of duplicating SMSV contacts and campaigns.
notif alias set boss +22370000000
notif send boss "Besoin de ton retour"
notif boss "Besoin de ton retour"
tail -n 30 error.log | notif me --title "Prod error"Developers can inspect their local key, account, usage, and credit balance without opening the dashboard.
notif whoami
notif key
notif key --show
notif balance --transactions
notif status ntf_msg_xxx
notif logs --limit 10Send your first message with a single request:
curl -X POST https://api.notif.ml/api/send \
-H "X-API-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "+1234567890",
"channel": "whatsapp",
"message": "Your order #1234 is ready"
}'torequiredstringE.164 phone (e.g. +22370123456) for whatsapp, sms, or auto. Valid email address when channel is email.
channelrequiredstringwhatsapp — WhatsApp (media supported). sms — SMS (text only). email — transactional email via HTTP (no SMSV key required). auto — route via SMSV (e.g. WhatsApp → SMS → email by availability).
Connecting WhatsApp (SMSV) is required for whatsapp/sms/auto unless you use sandbox mode or email-only sends.
messagerequiredstringBody text. Can be omitted if you use preset with presetVariables or only mediaUrl (WhatsApp).
htmloptionalstringHTML body for email channel. When provided alongside message, the email is sent with both text (plain) and html parts. Ignored for WhatsApp/SMS/auto.
subjectoptionalstringEmail subject line when channel is email (defaults to a generic title if omitted).
sandboxoptionalbooleanWhen true (or header X-Notif-Sandbox: 1, or env NOTIF_SANDBOX=1), no real delivery: response SANDBOX, IDs prefixed sb_. Optional fake webhook events unless sandboxWebhooks: false.
sandboxWebhooksoptionalbooleanIn sandbox mode, set to false to skip simulated message.status webhooks.
presetoptionalstringRenders a built-in template: otp, order_confirmed, order_shipped, delivery_out, appointment_reminder, payment_received. Use with presetVariables.
presetVariablesoptionalobjectKey/value strings passed into the selected preset.
mediaUrloptionalstringURL of an image, video, or document to attach (WhatsApp only)
scheduledAtoptionalstring (ISO date)Schedule sending for later. Future dates return 202 SCHEDULED and can be tracked with /api/status/:messageId (example: 2026-03-05T14:30:00Z)
retryoptionalboolean | objectRetry provider delivery before marking a message failed. Use { maxAttempts: 3, delayMs: 1000 } for critical alerts.
senderIdoptionalstringSend from a specific WhatsApp number when your account has multiple senders.
captionoptionalstringCaption for media attachments
templateoptionalstringLegacy field accepted for older clients. Prefer preset for structured templates; this string is ignored on current Partner Cloud routes.
buttonsoptionalarrayLegacy interactive payload; ignored on current routes. Use WhatsApp-native flows via SMSV for rich UI.
groupIdoptionalstringWhatsApp group ID (format xxx@g.us) to send to a WhatsApp group instead of an individual contact. When provided, to is still required for internal tracking but the message is delivered to the group. Use GET /api/partner/whatsapp/groups to list available groups.
{
"to": "+1234567890",
"channel": "whatsapp",
"message": "Here's your invoice",
"mediaUrl": "https://example.com/invoice.pdf",
"caption": "Invoice #1234"
}{
"to": "+1234567890",
"channel": "whatsapp",
"message": "Voice note",
"mediaUrl": "https://example.com/audio.mp3"
}{
"to": "+1234567890",
"channel": "whatsapp",
"message": "Reminder for tomorrow",
"scheduledAt": "2026-03-05T14:30:00Z"
}The API returns 202 with status: "SCHEDULED"; the message is sent automatically when due.
{
"messages": [
{
"to": "+1234567890",
"channel": "whatsapp",
"message": "Hello #1"
},
{
"to": "+22372830996",
"channel": "whatsapp",
"message": "Hello #2",
"mediaUrl": "https://example.com/video.mp4"
}
],
"continueOnError": true
}{
"to": "customer@example.com",
"channel": "email",
"subject": "Your receipt",
"message": "Thanks for your order — details inside."
}{
"to": "+22372830996",
"groupId": "120363123456789@g.us",
"channel": "whatsapp",
"message": "Hello team! Meeting at 3pm"
}{
"to": "+1234567890",
"channel": "whatsapp",
"message": "Integration test",
"sandbox": true
}{
"to": "+1234567890",
"channel": "whatsapp",
"preset": "order_confirmed",
"presetVariables": {
"orderId": "A-1024",
"customerName": "Awa"
}
}{
"to": "+1234567890",
"channel": "whatsapp",
"message": "Your order is ready for pickup",
"template": "order_ready",
"buttons": [
{ "type": "reply", "text": "On my way" },
{ "type": "reply", "text": "Reschedule" }
]
}Legacy template / buttons are accepted for backward compatibility; prefer preset for structured copy.
Use your API key in either Authorization or X-API-Key header:
Authorization: Bearer YOUR_API_KEYX-API-Key: YOUR_API_KEYSend messages to WhatsApp groups your connected number is a member of.
/api/partner/whatsapp/groupsList all WhatsApp groups your connected number is a member of.
Example: curl -H "X-API-Key: YOUR_KEY" https://api.notif.ml/api/partner/whatsapp/groups
{
"success": true,
"groups": [
{ "id": "120363123456789@g.us", "name": "Team Dev", "participants": 12, "isAdmin": true },
{ "id": "120363987654321@g.us", "name": "Marketing", "participants": 25, "isAdmin": false }
],
"count": 2
}Use the id from this response as groupId in POST /api/send.
/api/sendSend WhatsApp, SMS, email, or auto-routed messages (same auth as below). Supports group messages via groupId.
/api/send/batchSend up to 100 messages in one request (per-item results; supports the same fields as /api/send).
/api/status/:messageIdRetrieve message status (mainly used by dashboard and advanced integrations).
/api/meRetrieve the authenticated developer profile, masked/public key metadata, current plan, daily usage, credit balance, recent messages, and webhook settings.
/api/creditsRetrieve plan quota, usage today, credit balance, channel prices, and recent credit transactions.
Same authentication as POST /api/send: X-API-Key: ntf_live_… or Bearer, or an authenticated dashboard session.
/api/notif-analyticsAggregates over recent outbound history (Convex). Optional query sample (50–500, default 200) controls sample size.
Example: curl -H "X-API-Key: YOUR_KEY" https://api.notif.ml/api/notif-analytics
/api/notif-logsPaginated-style list of recent outbound messages for your API key. Query limit (1–200, default 50).
Example: curl -H "X-API-Key: YOUR_KEY" "https://api.notif.ml/api/notif-logs?limit=50"
Use sandbox to integrate without connecting WhatsApp/SMSV: no carrier traffic, predictable SANDBOX responses and optional synthetic webhook events.
"sandbox": trueX-Notif-Sandbox: 1NOTIF_SANDBOX=1 (global)Keys prefixed ntf_test_ still return the historical TEST stub without hitting SMSV; sandbox complements that for ntf_live_ keys.
When daily quota is exceeded, POST /api/send returns 429 with messagesUsed, limit, and upgradeUrl.
If your account has a per-recipient daily cap configured, sends to the same phone/email may return 429 with recipientLimit when that cap is reached.
Plan limits and usage for the dashboard are also available on GET /api/me (session cookie).
Store a webhookUrl on your notif.ml user record. When set, notif.ml POSTs delivery and inbound events to your HTTPS endpoint. Authenticated GET /api/me returns the current URL; contact support or use your admin path to update it until self-serve settings ship in the dashboard.
message.status - sent, delivered, failed updates.message.received - inbound WhatsApp messages from your connected number.{
"event": "message.received",
"messageId": "wamid.HBg...",
"from": "+22370000000",
"to": "+22372830996",
"channel": "whatsapp",
"type": "text",
"text": "Bonjour",
"timestamp": "2026-03-04T13:37:00.000Z"
}