SMS Alert
MESSAGING · MESSAGING
SMS and one-time passwords sent to contacts and groups from that account.
Acts as the person, not as itself
Each user connects their own account. Every call carries both identities — the agent and the person it is acting for — so the agent can never reach past what that individual can already do.
Credentials never touch the agent
Tokens live in the vault and attach server-side at call time. The agent holds a session, not a secret, and revoking access does not mean rotating a key.
Every call on the record
Who asked, which agent acted, which action ran, and the verdict that let it through — one audit trail across every integration, not one per vendor.
What an agent can do
Each action is granted on its own. An agent allowed to read is not thereby allowed to write, and the scope beside each row is what the acting user must have connected for it to run at all.
smsalert_post_cancelschedule_jsonWRITECancel a scheduled batch by `batchid` before it goes out; the credits it reserved are refunded ("campaign stopped successfully and credits are refunded."). A batch that cannot be stopped -- already sent, already cancelled -- answers 409 "campaign can not be stopped".
smsalert_post_contactlist_jsonREADList the contacts in one group -- `id`, `name`, `number` (stored with the country code), `creationdate` -- paged by `limit` and `page`, ordered by `order`. `group_id` is REQUIRED (there is no all-contacts listing; enumerate groups first). An empty group is an EMPTY list (`description: []`, vendor sentence in `desc`), not an error; an unknown group answers 404 "invalid group". The contact `id` is what `update_contact` and `delete_contact` take.
smsalert_post_createcontact_jsonWRITEAdd one contact (`name`, `number`) to the group NAMED by `grpname` (the group's name, not its id). The number is stored with the country code prepended when given without one. A number already in that group is refused with 409 "Number already exists in this group"; an unknown group with 404 "group does not exist". The response confirms creation but does not return the contact id; `list_contacts` on the group does.
smsalert_post_creategroup_jsonWRITECreate a contact group. `name` may contain letters, digits, hyphens and underscores only -- a space is refused (400 "Only Alphabets, numbers, hyphen, underscore allowed. Space not allowed"), and a name already in use is refused with 409 "Group already exists". The response confirms creation but does NOT return the new id; call `list_groups` (with `q` set to the name) to fetch it.
smsalert_post_createshorturl_jsonWRITEShorten a long `url` on SMS Alert's load.bz domain, for use inside SMS text. Returns `description.data.Link` (`long_url`, `alias`, `short_url`, `clicks`, `created`) and `description.id`, the link id `delete_short_url` takes. A malformed URL answers 400 "Please enter a valid URL address.".
smsalert_post_createtemplate_jsonWRITESave an SMS template with a `name` and its `text`. Duplicate names are ACCEPTED (measured 2026-09-19: two templates named the same were both created), so check `list_templates` first if uniqueness matters. The response confirms creation but does not return the id; `list_templates` does.
smsalert_post_creditstatus_jsonREADReturn the SMS credit balance of the account, per route (for example `transactional`, `nondnd`, `promotional`, or `demo` on a trial account), as `description.routes[]` with `route`, `display_name` and `credits`, plus a one-line `desc` summary. Takes no arguments and spends nothing. Call it before a large send: every recipient costs one credit per message part.
smsalert_post_deletecontact_jsonWRITEDelete a contact by contact `id` (from `list_contacts`). DESTRUCTIVE.
smsalert_post_deletegroup_jsonWRITEDelete a contact group by `id`. DESTRUCTIVE: the group and its membership are removed. An unknown id answers 404 "invalid group".
smsalert_post_deleteshorturl_jsonWRITEDelete a short URL by its link `id` (the `description.id` returned by `create_short_url`). DESTRUCTIVE: the short link stops resolving. An unknown id answers 404 "invalid short url id".
smsalert_post_deletetemplate_jsonWRITEDelete a template by template `id`. DESTRUCTIVE. A second delete of the same id answers 404 "invalid template".
smsalert_post_grouplist_jsonREADList the account's contact groups -- `id`, `name`, `creationdate`, `members` (a count) -- paged by `limit` (default 10) and `page` (default 1), filtered by `q` (matched against the name), ordered by `order` (`asc`/`desc`). The group `id` is what the contact tools and `send_sms_to_groups` take. An account with no groups, or a `q` that matches nothing, is an EMPTY list (`description: []`, vendor sentence in `desc`), not an error.
smsalert_post_grouppush_jsonWRITESend one SMS `text` to every contact in one or more groups (`id`: a group id, or several comma-separated) from a sender ID, optionally on a named `route` and optionally at a future time (`schedule`, YYYY-MM-DD HH:MM:SS in the account's time zone, IST). SPENDS ONE CREDIT PER RECIPIENT per message part and reaches real phones. Returns `description.batchid` plus a per-number `batch_dtl[]` with each `msgid` and status (AWAITED-DLR, pending for a scheduled batch, BLACKLST for a blocked number). A scheduled batch can be moved with `reschedule_sms` or cancelled with `cancel_scheduled_sms`, which refunds its credits. An unknown group answers 404 "invalid group name or group id".
smsalert_post_modifyschedule_jsonWRITEMove a scheduled batch (`batchid`, from the send tool's response or `list_sent_sms` with schedule=1) to a new `schedule` time, YYYY-MM-DD HH:MM:SS in the account's time zone (IST). Only a batch that has not gone out yet can be moved. An unknown batch answers 404 "campaign does not exist".
smsalert_post_mverify_jsonWRITEGenerate a one-time password and SEND it by SMS to `mobileno` (spends one credit). `template` is the message text and must contain the `[otp]` tag, which accepts attributes: `[otp length="6" retry="2" validity="10"]` (length 3-8, default 4; retry = how many sends per window, default 5; validity in minutes, default 15). Omit `template` to use the account's default OTP text, and `sender` to use the account's default sender ID. Returns a batch id like the send tools. Check the code the user types with `validate_otp`. Too long an OTP is a 400 "OTP length should be between 3 and 8"; too many sends in the window a 429 "Max OTP limit reached, please try after 15 minutes".
smsalert_post_mverify_json_validateWRITECheck the `code` a user typed against the OTP last sent to `mobileno` by `send_otp`. Sends nothing and spends nothing. READ THE RESULT, NOT THE STATUS: SMS Alert answers `status: success` in BOTH outcomes, with `description.desc` "Code Matched successfully." when it matches and "Code does not match." when it does not. A code past its validity window does not match.
smsalert_post_pull_jsonREADReturn the per-recipient delivery report for one `batchid`: each `mobileno`, `sender`, `text`, `msgid`, `status` (DELIVRD, AWAITED-DLR, pending, BLACKLST, FAILED, ...), `schedule` and `lastupdated`. Optional filters `schedule`, `sender` and `text` narrow the report. An unknown batch answers success with an empty `report` and desc "no search results found". The vendor keeps reports for the last three days (API Kit §17).
smsalert_post_push_jsonWRITESend one SMS `text` to one or more numbers (`mobileno`: a number, or several comma-separated, with or without the country code) from a sender ID. Optional: `route` (a route name from `get_credit_balance`), `schedule` (YYYY-MM-DD HH:MM:SS in the account's time zone, IST -- omit to send now), and a delivery-report callback (`dlrurl` together with `reference`, one reference per number; SMS Alert will GET the URL with ?msgid=<reference>&status=<status>). SPENDS ONE CREDIT PER RECIPIENT per message part and reaches real phones. Send `text` as plain text -- do NOT URL-encode it. Returns `description.batchid` and a per-number `batch_dtl[]` with each `msgid` and status (AWAITED-DLR when sent, pending when scheduled). Read delivery with `get_delivery_report`; move or cancel a scheduled batch with `reschedule_sms` / `cancel_scheduled_sms` (cancelling refunds the credits). Missing `sender`, `mobileno` or `text` is a 400 "insufficient parameters".
smsalert_post_senderlist_jsonREADList the sender IDs registered on the account with their approval state (`sender`, `approved`, `open`, `datetime`). Indian transactional and promotional routes require a registered, DLT-approved sender ID; the sender you pass to the send tools should come from this list. An account with none answers an EMPTY list, which this tool returns as `description: []` with the vendor's own sentence in `desc` ("no senderid available for your account").
smsalert_post_smscampaignlog_jsonREADList the account's SMS batches (the vendor calls them campaigns), newest first: `id` (the batch id), `senderid`, `text`, `route`, `smscount`, `creditscharged`, `creditsrefunded`, `schedule` (boolean), `scheduletime`, `datetime`. Paged by `limit` and `page`, filtered by `q`; `schedule=1` lists only batches that are scheduled and still pending. Use the `id` with `get_delivery_report` for per-recipient status.
smsalert_post_templatelist_jsonREADList the account's SMS templates -- `id`, `title`, `template` (the text), `creationdate`, `active` -- paged by `limit` and `page`, ordered by `order`. An account with none is an EMPTY list (`description: []`, vendor sentence in `desc`), not an error. Templates here are the account's saved texts; for Indian routes the DLT template registration is a separate, regulatory registration done in the dashboard.
smsalert_post_updatecontact_jsonWRITEUpdate a contact's `name` and `number` by contact `id`. NOT partial: all three are required -- `name` alone is refused with 400 "insufficient parameters" (measured 2026-09-19) -- so read the contact back with `list_contacts` and resend the value you are not changing. An unknown id answers 404 "invalid contact".
smsalert_post_updategroup_jsonWRITERename a contact group by `id`. Both `id` and the new `name` are required; the same naming rule as `create_group` applies. An unknown id answers 404 "invalid group".
smsalert_post_updateprofile_jsonWRITEUpdate the account's first name, last name, mobile number, email address or FCM push id. PARTIAL: send only what should change -- `firstname` alone updates the first name and leaves the rest untouched (measured 2026-09-19). A malformed value is refused with the field named, e.g. {"emailid": ["Email is not valid."]}.
smsalert_post_updatetemplate_jsonWRITEUpdate a template's `name` and `text` by template `id`. All three are required. An unknown id answers 404 "invalid template".
smsalert_post_user_jsonREADReturn the profile of the SMS Alert account this connection's API key belongs to: id, username, first and last name, mobile number, email, allowed country prefixes, creation and expiry dates, and the mobile-verified, KYC, Android-push and two-factor flags. Takes no arguments. A quick way to confirm which account a connection is bound to.
Often connected alongside
Put SMS Alert behind one governed endpoint.
Same permissions, same audit trail, whatever else you connect next.