Transactional SMS
Send order, delivery and account alerts over SMS in India using your DLT-registered templates. For login codes use OTP verification instead — it handles codes, expiry and fallback for you.
Before your first send
- Register your entity, sender id (header) and templates on your operator’s DLT portal.
- Add the sender id and templates in the QuickAuth dashboard under DLT.
- For each template, name its variables (for example
name,orderId) so you can send them by name.
Template text must match DLT exactly
{#var#} slots with your values; everything else comes from the template you registered.Send an SMS
/v1/sms/sendSends one transactional SMS using a DLT-approved template — order updates, delivery alerts, reminders. The SMS is handed to the operator before the call returns, so a 200 means the operator accepted it.
AuthServer keyX-Client-Id + X-Client-Secret
Request body
templateIdstringrequiredThe DLT template id (the long number from your DLT portal, e.g.1107168123456789012) of one of your active templates. Not the template name.tostringrequiredRecipient number. Digits are kept, everything else removed, so+91 98765-43210works. A 10-digit number is sent to India.variableValuesobjectoptionalValues by the variable names you gave the template in the dashboard, e.g.{"name": "Asha", "orderId": "A-1029"}. Names are not case-sensitive. Recommended — order does not matter and a missing value is reported by name.variablesstring[]optionalValues in the order the{#var#}slots appear in the template. Used only whenvariableValuesis empty. Extra values are ignored.senderIdstringoptionalYour 6-letter DLT header, e.g.ACMEIN. Defaults to the sender you added most recently.idempotencyKeystringoptionalUp to 128 characters. If you send the same key again within 15 minutes, you get the first result back and no second SMS is sent. Use your own order or event id. Best-effort: treat it as protection against quick retries, not a permanent guarantee.
Response · 200
messageIdstring | nullThe operator’s message id. Keep it if you want to match delivery reports later.statusstringAlwaysSENT(accepted by the operator). Failures come back as errors, never as a different status.tostringThe recipient as you sent it, digits only.
Errors
- 400INVALID_REQUEST
templateIdortomissing, ortohas fewer than 10 digits. - 400INVALID_REQUESTtemplateId is not one of your active DLT templates.
- 400INVALID_REQUESTsenderId is not registered on your account, or you have no sender id at all.
- 400INVALID_REQUESTVariables do not fit the template: too few values, an unknown or missing name, letters in a {#numeric#} slot, or a {#url#} slot that does not start with http(s)://.
- 401INVALID_CLIENT_CREDENTIALSX-Client-Id or X-Client-Secret is missing, unknown or wrong.
- 401CLIENT_INACTIVEYour account has been deactivated.
- 402INSUFFICIENT_BALANCEWallet is empty.
- 402INSUFFICIENT_SMS_BALANCENo SMS credits left.
- 500PROVIDER_ERRORThe SMS operator refused the message. Safe to retry with the same idempotencyKey.
- 500INTERNAL_ERRORUnexpected server error, including a body that is not valid JSON. Retry; if it persists, send us the requestId.
curl -X POST "https://api.quickauth.in/v1/sms/send" \
-H "X-Client-Id: YOUR_CLIENT_ID" \
-H "X-Client-Secret: YOUR_CLIENT_SECRET" \
-H "Content-Type: application/json" \
-d '{
"templateId": "1107168123456789012",
"to": "919876543210",
"variableValues": {
"name": "Asha",
"orderId": "A-1029"
},
"idempotencyKey": "order-A-1029-shipped"
}'{
"messageId": "8b1e5d2c-7f40-4c11-9a3e-0d6f2b9a1c77",
"status": "SENT",
"to": "919876543210"
}Send an SMS (URL form)
/v1/sms/sendThe same send as above, with everything in the URL. Made for systems that can only fire a URL — older ERPs, billing software, IVR and no-code tools. If you can send JSON, use Send an SMS instead.
On this endpoint only, credentials may also be passed as clientId and clientSecret query parameters. URLs end up in logs, so prefer the headers whenever your tool allows it.
AuthServer keyX-Client-Id + X-Client-Secret
Query parameters
templateIdstringrequiredDLT template id.tostringrequiredRecipient number.var1, var2, …stringoptionalTemplate values in order. Numbering must not skip: withvar1andvar3onlyvar1is read. Named values are not available in this form.senderIdstringoptionalYour DLT header. Defaults to your most recent one.idempotencyKeystringoptionalSame as the JSON form.clientIdstringoptionalInstead of the X-Client-Id header.clientSecretstringoptionalInstead of the X-Client-Secret header.
Response · 200
messageIdstring | nullThe operator’s message id. Keep it if you want to match delivery reports later.statusstringAlwaysSENT(accepted by the operator). Failures come back as errors, never as a different status.tostringThe recipient as you sent it, digits only.
Errors
- 400INVALID_REQUEST
templateIdortomissing, ortohas fewer than 10 digits. - 400INVALID_REQUESTtemplateId is not one of your active DLT templates.
- 400INVALID_REQUESTsenderId is not registered on your account, or you have no sender id at all.
- 400INVALID_REQUESTVariables do not fit the template: too few values, an unknown or missing name, letters in a {#numeric#} slot, or a {#url#} slot that does not start with http(s)://.
- 401INVALID_CLIENT_CREDENTIALSX-Client-Id or X-Client-Secret is missing, unknown or wrong.
- 401CLIENT_INACTIVEYour account has been deactivated.
- 402INSUFFICIENT_BALANCEWallet is empty.
- 402INSUFFICIENT_SMS_BALANCENo SMS credits left.
- 500PROVIDER_ERRORThe SMS operator refused the message. Safe to retry with the same idempotencyKey.
- 500INTERNAL_ERRORUnexpected server error, including a body that is not valid JSON. Retry; if it persists, send us the requestId.
curl -X GET "https://api.quickauth.in/v1/sms/send?templateId=1107168123456789012&to=919876543210&var1=Asha&var2=A-1029" \
-H "X-Client-Id: YOUR_CLIENT_ID" \
-H "X-Client-Secret: YOUR_CLIENT_SECRET"{
"messageId": "8b1e5d2c-7f40-4c11-9a3e-0d6f2b9a1c77",
"status": "SENT",
"to": "919876543210"
}