SMS endpoints
POST /v1/sms/send
Send an outbound SMS from one of your provisioned numbers.
Request body
| Field | Type | Required | Notes |
|---|---|---|---|
from | string | Yes | Your provisioned number in E.164 format (e.g. +14155552671). |
to | string | Yes | Destination number in E.164 format. |
body | string | Yes | Message 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 queuedconst 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
| Field | Description |
|---|---|
message_id | UUID of the message. |
from | Sending number (E.164). |
to | Receiving number (E.164). |
body | Message text. |
direction | outbound or inbound. |
segment_count | Number of SMS segments used. |
status | queued, dispatched, sent, delivered, failed, or received (inbound). |
failure_reason | String reason when status is failed, otherwise null. |
sent_at | Timestamp when the device confirmed send, or null. |
delivered_at | Timestamp when delivery receipt was received, or null. |
cost_usd | Overage charge in USD, or null within your plan allowance. |
created_at | Timestamp 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:11Zconst 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
| Parameter | Description |
|---|---|
number | Filter by E.164 number (matches from or to). |
direction | inbound or outbound. |
status | One of: queued, dispatched, sent, delivered, failed, received. |
from_date | Start date (YYYY-MM-DD, inclusive). |
to_date | End date (YYYY-MM-DD, inclusive). |
page | Page number, default 1. |
per_page | Results 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)));