Get your token
Open API token. Confirm your password and copy the token when it appears.
Bring SMS into your product with a straightforward REST API. Send a message, follow its delivery and keep your customers in the loop.
POST /api/v1/messages
{
"recipientPhone": "+447700900123",
"senderName": "YOUR_SENDER",
"body": "Your order is ready.",
"requestKey": "YOUR_MESSAGE_UUID"
}201 Created Message queued. You’re connected.
All examples use your real account. You need a paid package, confirmed email and phone, an available sender and sufficient credits before sending.
Open API token. Confirm your password and copy the token when it appears.
Call GET /senders and use a returned value as senderName. Replace all example placeholders.
Send your first SMS, keep the returned message ID and check its delivery status.
https://www.sendsmsnow.com/api/v1Send your token in the Authorization header on every request. Send Accept: application/json and, for POST requests, Content-Type: application/json. Browser cookies and tokens in URLs are not supported.
Authorization: Bearer YOUR_API_TOKEN
Accept: application/jsonStore it as SENDSMSNOW_API_TOKEN in an environment variable or secret manager. Never put it in public frontend code, mobile apps, URLs or source control.
Tokens last 90 days and are shown only when created. Replacing or revoking a token immediately disables the old one. Password changes revoke it too. API access is blocked if your account is suspended, no longer has a paid package, or loses email or phone verification. A token grants messaging and read access, without access to administration, billing changes or account settings.
Choose an operation and your language. These are ordinary HTTP requests, with no SendSMSnow SDK required. Examples are for server-side applications.
# Generate this once per message; keep it for retries.
REQUEST_KEY="$(uuidgen)"
curl --fail-with-body --max-time 30 'https://www.sendsmsnow.com/api/v1/messages' \
--header "Authorization: Bearer $SENDSMSNOW_API_TOKEN" \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data "{\"recipientPhone\":\"+447700900123\",\"senderName\":\"YOUR_SENDER\",\"body\":\"Your order is ready.\",\"requestKey\":\"$REQUEST_KEY\"}"Replace YOUR_SENDER and the sample recipient before sending. Phone numbers shown here are illustrative. Requests are not executed from this page.
/accountRead the current plan, billing status and available message credits for the account that owns your token.
{
"account": {
"planCode": "growth",
"status": "active",
"creditsBalance": 1000,
"currency": "USD"
}
}/sendersList the sender values currently available to your account. Use one of these values exactly as senderName. An empty list means number setup must be completed in Plans & billing.
{
"senders": [
{
"value": "+447700900000",
"type": "phone"
}
]
}/messagesSend one message to one international number, immediately or at a future time. Limit: 10 send requests per rolling second per account. If you receive 429, wait for Retry-After and retry with the same requestKey. Credits are reserved before the message is queued. A successful response confirms queueing, not delivery.
recipientPhonestring · requiredInternational number in E.164 format, including + and the country code. For example, +447700900123.
senderNamestring · requiredA value returned by GET /senders. Maximum 20 characters.
bodystring · requiredYour message, 1–1,600 characters after trimming. Long or Unicode messages can use multiple SMS segments.
requestKeyUUID · requiredGenerate a new UUID for each new message. Reuse it only when retrying that same message.
recipientNamestring · optionalA display name, up to 80 characters.
scheduledForISO 8601 · optionalA future timestamp with timezone, for example 2027-01-15T10:00:00Z. Omit for immediate sending.
Save the UUID before sending. A retry with the same key returns the original message with HTTP 200 and idempotentReplay: true, without another credit reservation. Do not reuse a key for different content. A new message gets HTTP 201. There is no bulk-send operation in this API version.
{
"message": {
"id": 12345,
"recipientPhone": "+447700900123",
"senderName": "+447700900000",
"body": "Your order is ready.",
"status": "queued",
"segments": 1,
"errorCode": null,
"deliveredAt": null
},
"state": "queued",
"stored": true,
"queued": true,
"creditsReserved": 1
}/messages/{id}Replace 12345 with the message.id returned when you send. Read the latest provider status, errorCode and deliveredAt. Only messages belonging to your account are accessible.
{
"message": {
"id": 12345,
"recipientPhone": "+447700900123",
"status": "delivered",
"segments": 1,
"errorCode": null,
"submittedAt": "2026-09-11T09:00:00.000Z",
"deliveredAt": "2026-09-11T09:00:03.000Z"
}
}/messagesBrowse your message history, newest first. page starts at 1; perPage defaults to 25 and accepts 1–100. Content may be removed according to your history settings. Status and operational records remain available.
{
"messages": [
{
"id": 12345,
"recipientPhone": "+447700900123",
"status": "delivered",
"segments": 1
}
],
"pagination": {
"currentPage": 1,
"lastPage": 1,
"perPage": 25,
"total": 1
}
}Provider acceptance and sent do not confirm delivery to the handset. Check status, deliveredAt and errorCode on the message. Updates depend on the provider and destination; delivery reports are not guaranteed for every route.
Poll selectively and back off as time passes. This version supports status polling; customer-configurable delivery webhooks are not included.
One segment reserves one credit. Message length and encoding affect the segment count. Read segments and creditsReserved from the response. Recipient opt-outs, blocked numbers, sender restrictions and platform sending controls also apply to API messages.
Handle errors by HTTP status. The description is in message or error; validation responses may also include a field-keyed errors object.
401Missing, invalid, expired or revoked token. Create a new token if needed.
403Access blocked: package, account, verification or token permissions need attention.
404The message does not exist or does not belong to your account.
422Invalid fields, unavailable sender or provider, recipient restrictions, or insufficient credits. Review the response before retrying.
429Rate limit reached. Wait for the Retry-After interval before trying again.
503Sending is temporarily paused or the service is unavailable. Retry later with the same requestKey.
Read requests per account.
SMS send requests per account, across all tokens.
POST /messages allows 10 send requests in any rolling one-second window per account. Each request sends to one recipient; invalid requests and retries also count. Excess requests receive HTTP 429 before any SMS is queued or credits are reserved. Wait at least the Retry-After interval (1 second for the send limit), then retry with the same requestKey. Read requests have a separate 120/minute allowance. A shared network is limited to 1,200 total requests per minute per IP. Observe X-RateLimit-Limit, X-RateLimit-Remaining and Retry-After when returned. On connection errors or server errors, retry with backoff and the same message UUID.