Send message
POST /v1/messages/send — queue one SMS to be sent by one of your paired phones.
Request body
| Field | Type | Notes |
|---|---|---|
from_number | E.164 | Required. The number of one of your paired phones. |
to_number | E.164 | Required. The recipient. |
content | string | Required. Up to 10 SMS segments (1,530 GSM-7 characters, or 670 for text with emoji / non-Latin characters). |
request_id | string | Optional idempotency key. Sending again with the same value returns 409 duplicate_request and the original message id. |
scheduled_for | ISO 8601 | Optional. The message is held until this time. |
device_id | UUID | Optional. Pin a specific phone instead of routing by from_number. |
Example
curl -X POST https://api.99billingsolutions.com/v1/messages/send \
-H "x-api-key: $SMS_BRIDGE_KEY" \
-H "Content-Type: application/json" \
-d '{
"from_number": "+15550100001",
"to_number": "+15550100002",
"content": "Hello from SMS Bridge!"
}'Response — 202 Accepted
{
"status": "success",
"message": "Request handled successfully",
"data": {
"id": "0b6f0c7e-8f1d-4a57-9d3a-2f6c1e9b1a42",
"status": "queued",
"from_number": "+15550100001",
"to_number": "+15550100002",
"segments": 1,
"encoding": "GSM-7",
"expires_at": "2026-09-26T11:00:00+00:00"
}
}Checking status
Subscribe to webhooks for message.sent, message.delivered and message.failed, or poll:
# one message, with its event timeline
curl https://api.99billingsolutions.com/v1/messages/{id} -H "x-api-key: $SMS_BRIDGE_KEY"
# up to 100 at once
curl -X POST https://api.99billingsolutions.com/v1/messages/batch-status \
-H "x-api-key: $SMS_BRIDGE_KEY" -H "Content-Type: application/json" \
-d '{ "message_ids": ["<id-1>", "<id-2>"] }'Routing
The message goes to an online phone paired with from_number. If none is online the call fails with 503 no_device_available — nothing is queued. In test mode no phone is needed: delivery is simulated.
Safety checks
- Premium-rate destinations are refused with
403 premium_rate_blocked. - New workspaces can send 50 messages in their first 24 hours (
429 new_account_limit). - Each phone sends at most 6 messages a minute and 25 per 30 minutes by default, to stay under Android's own sending limit. Extra messages wait in the queue — they are not rejected.
Errors
{
"status": "error",
"message": "to_number is not valid E.164",
"error_code": "invalid_phone_number",
"data": { "field": "to_number" }
}Full list: Errors.