curl -X POST https://api.notvis.com/v1/sms/messages \
-H "Authorization: Bearer nc_live_your_api_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"to": "+919876543210",
"from": "NOTVIS",
"dlt_template_id": "1107161234567890",
"dlt_entity_id": "1101234567890",
"variables": {
"1": "123456",
"2": "10 minutes"
},
"callback_url": "https://example.com/webhooks/sms",
"tags": ["otp"],
"metadata": { "user_id": "usr_123" }
}'
curl -X POST https://api.notvis.com/v1/sms/messages \
-H "Authorization: Bearer nc_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"to": ["+919876543210", "+919876543211", "+14155552671"],
"dlt_template_id": "1107161234567890",
"variables": { "1": "Summer Sale", "2": "20%" },
"tags": ["promo"]
}'
curl -X POST https://api.notvis.com/v1/sms/messages \
-H "Authorization: Bearer nc_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"to": "+919876543210",
"dlt_template_id": "1107161234567890",
"variables": { "1": "tomorrow" },
"schedule_at": "2026-07-15T10:00:00Z"
}'
const response = await fetch('https://api.notvis.com/v1/sms/messages', {
method: 'POST',
headers: {
'Authorization': 'Bearer nc_live_your_api_key',
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
to: '+919876543210',
from: 'NOTVIS',
dlt_template_id: '1107161234567890',
dlt_entity_id: '1101234567890',
variables: { '1': '123456', '2': '10 minutes' },
callback_url: 'https://example.com/webhooks/sms',
}),
});
const data = await response.json();
console.log(data.message_id);
import requests
import uuid
response = requests.post(
'https://api.notvis.com/v1/sms/messages',
headers={
'Authorization': 'Bearer nc_live_your_api_key',
'Idempotency-Key': str(uuid.uuid4()),
},
json={
'to': '+919876543210',
'from': 'NOTVIS',
'dlt_template_id': '1107161234567890',
'dlt_entity_id': '1101234567890',
'variables': {'1': '123456', '2': '10 minutes'},
},
)
print(response.json()['message_id'])
package main
import (
"bytes"
"encoding/json"
"net/http"
"github.com/google/uuid"
)
func main() {
payload := map[string]interface{}{
"to": "+919876543210",
"from": "NOTVIS",
"dlt_template_id": "1107161234567890",
"dlt_entity_id": "1101234567890",
"variables": map[string]string{"1": "123456", "2": "10 minutes"},
}
body, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.notvis.com/v1/sms/messages", bytes.NewBuffer(body))
req.Header.Set("Authorization", "Bearer nc_live_your_api_key")
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Idempotency-Key", uuid.NewString())
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}
{
"message_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "queued",
"to": "+919876543210",
"created_at": "2026-07-12T10:00:00Z"
}
{
"messages": [
{
"message_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "queued",
"to": "+919876543210",
"created_at": "2026-07-12T10:00:00Z"
},
{
"message_id": "8d0f7780-8536-51e5-b827-f18gd2g01bf8",
"status": "queued",
"to": "+919876543211",
"created_at": "2026-07-12T10:00:00Z"
}
]
}
{
"message_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "scheduled",
"to": "+919876543210",
"created_at": "2026-07-12T10:00:00Z"
}
{
"code": 400,
"message": "validation failed",
"details": {
"to": "invalid phone number: 12345 (expected E.164 format like +919876543210)"
}
}
SMS
Send SMS
Send an SMS message to one or more phone numbers.
POST
/
v1
/
sms
/
messages
curl -X POST https://api.notvis.com/v1/sms/messages \
-H "Authorization: Bearer nc_live_your_api_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"to": "+919876543210",
"from": "NOTVIS",
"dlt_template_id": "1107161234567890",
"dlt_entity_id": "1101234567890",
"variables": {
"1": "123456",
"2": "10 minutes"
},
"callback_url": "https://example.com/webhooks/sms",
"tags": ["otp"],
"metadata": { "user_id": "usr_123" }
}'
curl -X POST https://api.notvis.com/v1/sms/messages \
-H "Authorization: Bearer nc_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"to": ["+919876543210", "+919876543211", "+14155552671"],
"dlt_template_id": "1107161234567890",
"variables": { "1": "Summer Sale", "2": "20%" },
"tags": ["promo"]
}'
curl -X POST https://api.notvis.com/v1/sms/messages \
-H "Authorization: Bearer nc_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"to": "+919876543210",
"dlt_template_id": "1107161234567890",
"variables": { "1": "tomorrow" },
"schedule_at": "2026-07-15T10:00:00Z"
}'
const response = await fetch('https://api.notvis.com/v1/sms/messages', {
method: 'POST',
headers: {
'Authorization': 'Bearer nc_live_your_api_key',
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
to: '+919876543210',
from: 'NOTVIS',
dlt_template_id: '1107161234567890',
dlt_entity_id: '1101234567890',
variables: { '1': '123456', '2': '10 minutes' },
callback_url: 'https://example.com/webhooks/sms',
}),
});
const data = await response.json();
console.log(data.message_id);
import requests
import uuid
response = requests.post(
'https://api.notvis.com/v1/sms/messages',
headers={
'Authorization': 'Bearer nc_live_your_api_key',
'Idempotency-Key': str(uuid.uuid4()),
},
json={
'to': '+919876543210',
'from': 'NOTVIS',
'dlt_template_id': '1107161234567890',
'dlt_entity_id': '1101234567890',
'variables': {'1': '123456', '2': '10 minutes'},
},
)
print(response.json()['message_id'])
package main
import (
"bytes"
"encoding/json"
"net/http"
"github.com/google/uuid"
)
func main() {
payload := map[string]interface{}{
"to": "+919876543210",
"from": "NOTVIS",
"dlt_template_id": "1107161234567890",
"dlt_entity_id": "1101234567890",
"variables": map[string]string{"1": "123456", "2": "10 minutes"},
}
body, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.notvis.com/v1/sms/messages", bytes.NewBuffer(body))
req.Header.Set("Authorization", "Bearer nc_live_your_api_key")
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Idempotency-Key", uuid.NewString())
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}
{
"message_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "queued",
"to": "+919876543210",
"created_at": "2026-07-12T10:00:00Z"
}
{
"messages": [
{
"message_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "queued",
"to": "+919876543210",
"created_at": "2026-07-12T10:00:00Z"
},
{
"message_id": "8d0f7780-8536-51e5-b827-f18gd2g01bf8",
"status": "queued",
"to": "+919876543211",
"created_at": "2026-07-12T10:00:00Z"
}
]
}
{
"message_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "scheduled",
"to": "+919876543210",
"created_at": "2026-07-12T10:00:00Z"
}
{
"code": 400,
"message": "validation failed",
"details": {
"to": "invalid phone number: 12345 (expected E.164 format like +919876543210)"
}
}
Also available at
POST /v1/sms/send for backward compatibility.Request Headers
string
required
Bearer token. Format:
Bearer nc_live_your_api_keystring
Unique key to prevent duplicate sends. Responses are cached for 24 hours. See Idempotency.
Request Body
string | string[]
required
Recipient phone number(s) in E.164 format (e.g.,
+919876543210, +14155552671). Accepts a single string or an array of up to 1,000 numbers for batch sending. Indian numbers without country code are automatically normalized to +91.string
Sender ID or header (e.g.,
"NOTVIS"). Must be pre-registered with your SMS provider and DLT portal.string
UUID of a pre-configured SMS template in your Notvis account. Either
template_id or dlt_template_id is required.string
DLT registered template ID. Required for regulatory compliance when sending to Indian numbers. Either
template_id or dlt_template_id is required.string
DLT entity ID. Required alongside
dlt_template_id for India DLT compliance.object
Template variable replacements. Keys should be numeric strings (
"1", "2", etc.) mapping to replacement values. Maximum 20 variables.string
HTTPS URL to receive delivery status webhooks for this message. Must start with
https://.string
ISO 8601 timestamp to schedule the message for future delivery (e.g.,
"2026-07-15T10:00:00Z"). Must be in the future, maximum 7 days ahead.integer
Message time-to-live in the queue. If the message cannot be delivered within this window, it expires. Range: 5–86400 seconds (24 hours).
string[]
Tags for categorization and filtering. Maximum 10 tags.
object
Custom key-value pairs. Passed through to delivery webhooks for your tracking purposes.
DLT Compliance (India): All commercial SMS to Indian numbers requires DLT registration. Register your entity, sender ID, and message templates on a DLT portal (Jio, Airtel, Vodafone) before sending.
Response
Single recipient
string
Unique identifier for the queued message.
string
"queued" for immediate sends, "scheduled" for future sends.string
Normalized E.164 phone number.
string
ISO 8601 timestamp of when the message was created.
Batch (multiple recipients)
Whento is an array, the response wraps individual messages:
array
Array of message objects, one per recipient. Each contains
message_id, status, to, and created_at.curl -X POST https://api.notvis.com/v1/sms/messages \
-H "Authorization: Bearer nc_live_your_api_key" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{
"to": "+919876543210",
"from": "NOTVIS",
"dlt_template_id": "1107161234567890",
"dlt_entity_id": "1101234567890",
"variables": {
"1": "123456",
"2": "10 minutes"
},
"callback_url": "https://example.com/webhooks/sms",
"tags": ["otp"],
"metadata": { "user_id": "usr_123" }
}'
curl -X POST https://api.notvis.com/v1/sms/messages \
-H "Authorization: Bearer nc_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"to": ["+919876543210", "+919876543211", "+14155552671"],
"dlt_template_id": "1107161234567890",
"variables": { "1": "Summer Sale", "2": "20%" },
"tags": ["promo"]
}'
curl -X POST https://api.notvis.com/v1/sms/messages \
-H "Authorization: Bearer nc_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"to": "+919876543210",
"dlt_template_id": "1107161234567890",
"variables": { "1": "tomorrow" },
"schedule_at": "2026-07-15T10:00:00Z"
}'
const response = await fetch('https://api.notvis.com/v1/sms/messages', {
method: 'POST',
headers: {
'Authorization': 'Bearer nc_live_your_api_key',
'Content-Type': 'application/json',
'Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
to: '+919876543210',
from: 'NOTVIS',
dlt_template_id: '1107161234567890',
dlt_entity_id: '1101234567890',
variables: { '1': '123456', '2': '10 minutes' },
callback_url: 'https://example.com/webhooks/sms',
}),
});
const data = await response.json();
console.log(data.message_id);
import requests
import uuid
response = requests.post(
'https://api.notvis.com/v1/sms/messages',
headers={
'Authorization': 'Bearer nc_live_your_api_key',
'Idempotency-Key': str(uuid.uuid4()),
},
json={
'to': '+919876543210',
'from': 'NOTVIS',
'dlt_template_id': '1107161234567890',
'dlt_entity_id': '1101234567890',
'variables': {'1': '123456', '2': '10 minutes'},
},
)
print(response.json()['message_id'])
package main
import (
"bytes"
"encoding/json"
"net/http"
"github.com/google/uuid"
)
func main() {
payload := map[string]interface{}{
"to": "+919876543210",
"from": "NOTVIS",
"dlt_template_id": "1107161234567890",
"dlt_entity_id": "1101234567890",
"variables": map[string]string{"1": "123456", "2": "10 minutes"},
}
body, _ := json.Marshal(payload)
req, _ := http.NewRequest("POST", "https://api.notvis.com/v1/sms/messages", bytes.NewBuffer(body))
req.Header.Set("Authorization", "Bearer nc_live_your_api_key")
req.Header.Set("Content-Type", "application/json")
req.Header.Set("Idempotency-Key", uuid.NewString())
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
}
{
"message_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "queued",
"to": "+919876543210",
"created_at": "2026-07-12T10:00:00Z"
}
{
"messages": [
{
"message_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "queued",
"to": "+919876543210",
"created_at": "2026-07-12T10:00:00Z"
},
{
"message_id": "8d0f7780-8536-51e5-b827-f18gd2g01bf8",
"status": "queued",
"to": "+919876543211",
"created_at": "2026-07-12T10:00:00Z"
}
]
}
{
"message_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7",
"status": "scheduled",
"to": "+919876543210",
"created_at": "2026-07-12T10:00:00Z"
}
{
"code": 400,
"message": "validation failed",
"details": {
"to": "invalid phone number: 12345 (expected E.164 format like +919876543210)"
}
}