Launch offer Get 50% off every monthly plan for a limited time. View plans →

SMS endpoints

POST /v1/sms/send

Send an outbound SMS from one of your provisioned numbers.

Request body

FieldTypeRequiredNotes
fromstringYesYour provisioned number in E.164 format (e.g. +14155552671).
tostringYesDestination number in E.164 format.
bodystringYesMessage text. Max 1 600 characters. Long messages are split into segments automatically.

Response (202 Accepted)

{
  "success": true,
  "data": {
    "message_id": "2a583efc-0c41-47b5-a1fe-885fc7ec2720",
    "from": "+14155552671",
    "to": "+14155553000",
    "body": "Your verification code is 482910",
    "status": "dispatched",
    "created_at": "2026-06-08T13:30:06Z"
  }
}

status is dispatched when the device is online and the command has been queued on the device, or queued when the device is temporarily offline (delivered when it reconnects).

import requests

r = requests.post(
    "https://api.reachcell.com/v1/sms/send",
    headers={
        "Authorization": "Bearer ak_your_api_key",
        "Content-Type":  "application/json",
    },
    json={
        "from": "+14155552671",
        "to":   "+14155553000",
        "body": "Your verification code is 482910",
    },
)
msg = r.json()["data"]
print(msg["message_id"], msg["status"])
<?php
$ch = curl_init('https://api.reachcell.com/v1/sms/send');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ak_your_api_key',
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'from' => '+14155552671',
        'to'   => '+14155553000',
        'body' => 'Your verification code is 482910',
    ]),
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);

$messageId = $body['data']['message_id'];
$status    = $body['data']['status'];  // dispatched or queued
const res = await fetch('https://api.reachcell.com/v1/sms/send', {
  method: 'POST',
  headers: {
    Authorization:  'Bearer ak_your_api_key',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    from: '+14155552671',
    to:   '+14155553000',
    body: 'Your verification code is 482910',
  }),
});
const { data } = await res.json();
console.log(data.message_id, data.status);

GET /v1/sms/{message_id}

Retrieve a message by its UUID.

Response fields

FieldDescription
message_idUUID of the message.
fromSending number (E.164).
toReceiving number (E.164).
bodyMessage text.
directionoutbound or inbound.
segment_countNumber of SMS segments used.
statusqueued, dispatched, sent, delivered, failed, or received (inbound).
failure_reasonString reason when status is failed, otherwise null.
sent_atTimestamp when the device confirmed send, or null.
delivered_atTimestamp when delivery receipt was received, or null.
cost_usdOverage charge in USD, or null within your plan allowance.
created_atTimestamp the record was created.
import requests

message_id = "2a583efc-0c41-47b5-a1fe-885fc7ec2720"
r = requests.get(
    f"https://api.reachcell.com/v1/sms/{message_id}",
    headers={"Authorization": "Bearer ak_your_api_key"},
)
msg = r.json()["data"]
print(msg["status"], msg["delivered_at"])
<?php
$messageId = '2a583efc-0c41-47b5-a1fe-885fc7ec2720';

$ch = curl_init("https://api.reachcell.com/v1/sms/{$messageId}");
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ak_your_api_key'],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);

echo $body['data']['status'];       // delivered
echo $body['data']['delivered_at']; // 2026-06-08T14:02:11Z
const messageId = '2a583efc-0c41-47b5-a1fe-885fc7ec2720';

const res = await fetch(
  `https://api.reachcell.com/v1/sms/${messageId}`,
  { headers: { Authorization: 'Bearer ak_your_api_key' } },
);
const { data } = await res.json();
console.log(data.status, data.delivered_at);

GET /v1/sms

List all messages for your account, newest first. Paginated.

Query parameters

ParameterDescription
numberFilter by E.164 number (matches from or to).
directioninbound or outbound.
statusOne of: queued, dispatched, sent, delivered, failed, received.
from_dateStart date (YYYY-MM-DD, inclusive).
to_dateEnd date (YYYY-MM-DD, inclusive).
pagePage number, default 1.
per_pageResults per page, default 20.
import requests

r = requests.get(
    "https://api.reachcell.com/v1/sms",
    headers={"Authorization": "Bearer ak_your_api_key"},
    params={"direction": "inbound", "per_page": 50},
)
result   = r.json()
messages = result["data"]
meta     = result["meta"]
print(f"{meta['total']} total, page {meta['page']}/{meta['total_pages']}")
for msg in messages:
    print(msg["from"], "→", msg["body"][:60])
<?php
$ch = curl_init(
    'https://api.reachcell.com/v1/sms?direction=inbound&per_page=50'
);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ak_your_api_key'],
]);
$body = json_decode(curl_exec($ch), true);
curl_close($ch);

foreach ($body['data'] as $msg) {
    echo $msg['from'] . ': ' . substr($msg['body'], 0, 60) . "\n";
}
echo "Total: " . $body['meta']['total'];
const params = new URLSearchParams({ direction: 'inbound', per_page: 50 });
const res = await fetch(
  `https://api.reachcell.com/v1/sms?${params}`,
  { headers: { Authorization: 'Bearer ak_your_api_key' } },
);
const { data, meta } = await res.json();
console.log(`${meta.total} total, page ${meta.page}/${meta.total_pages}`);
data.forEach(msg => console.log(msg.from, '→', msg.body.slice(0, 60)));
© 2026 ReachCell · Terms · Privacy · AUP · API v1 · support@reachcell.com