Skip to content

Send message

POST /v1/messages/send — queue one SMS to be sent by one of your paired phones.

Request body

FieldTypeNotes
from_numberE.164Required. The number of one of your paired phones.
to_numberE.164Required. The recipient.
contentstringRequired. Up to 10 SMS segments (1,530 GSM-7 characters, or 670 for text with emoji / non-Latin characters).
request_idstringOptional idempotency key. Sending again with the same value returns 409 duplicate_request and the original message id.
scheduled_forISO 8601Optional. The message is held until this time.
device_idUUIDOptional. 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.