SMSAPI
— SMS quickstart

Send your first SMS

One authenticated POST puts an SMS on its way to an Indian number. Here's the whole round trip — send, response, delivery receipt — in three languages.

1. Authenticate

Pass your API key as a bearer token on every request, against the base URL https://api.smsapi.in/v1. Keep the key server-side; never ship it in a client.

2. Send a message

POST to /sms with your sender header, the route, one or more E.164 numbers, the body, and the two DLT identifiers India requires. Switch route to promotional for marketing traffic.

curl https://api.smsapi.in/v1/sms \
  -H "Authorization: Bearer $SMSAPI_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "sender": "SMSAPI",
    "route": "transactional",
    "numbers": ["+919876543210"],
    "message": "Your OTP is 481920. Valid for 10 minutes.",
    "dlt_template_id": "1707170000000000000",
    "dlt_entity_id": "1101400000000000000"
  }'

3. Read the response and the receipt

The response returns a request ID and a per-number message ID. When the operator confirms the final state, we POST a delivery receipt to your webhook with that message ID — match on it to reconcile. Errors come back as a non-2xx status with a stable error code.

{
  "request_id": "req_3f9a2b",
  "messages": [
    { "message_id": "sms_9c81a0", "to": "+919876543210", "status": "submitted" }
  ]
}

// Later, on your webhook:
{ "event": "sms.dlr", "message_id": "sms_9c81a0", "status": "delivered",
  "at": "2026-06-09T09:14:31+05:30" }

Request shapes are representative pending the white-label telco API spec (FLAGS_AND_ASSUMPTIONS.md).

Next steps