List messages
Copy page
Paginated list of sent messages with filtering.
GET
/api/v1/sms/messages
· Permission: sms.read
Request
Section titled “Request”curl "https://restlink23telecom.com/api/v1/sms/messages?status=delivered&limit=10" \ -H "X-API-Key: $API_KEY"const res = await fetch('https://restlink23telecom.com/api/v1/sms/messages?status=delivered&limit=10', { method: 'GET', headers: { 'X-API-Key': process.env.API_KEY },});
if (!res.ok) { const err = await res.json(); throw new Error(`${err.error_code}: ${err.description}`);}const data = await res.json();console.log(data);import osimport requests
res = requests.get( "https://restlink23telecom.com/api/v1/sms/messages", headers={"X-API-Key": os.environ["API_KEY"]}, params={ "status": "delivered", "limit": 10 },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://restlink23telecom.com/api/v1/sms/messages?status=delivered&limit=10');curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['X-API-Key: ' . getenv('API_KEY')],]);
$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);curl_close($ch);
if ($status !== 200) { throw new Exception("HTTP $status: $response");}$data = json_decode($response, true);print_r($data);require "net/http"require "json"
uri = URI("https://restlink23telecom.com/api/v1/sms/messages?status=delivered&limit=10")req = Net::HTTP::Get.new(uri)req["X-API-Key"] = ENV.fetch("API_KEY")
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }raise "HTTP #{res.code}: #{res.body}" unless res.is_a?(Net::HTTPSuccess)
puts JSON.parse(res.body)import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://restlink23telecom.com/api/v1/sms/messages?status=delivered&limit=10")) .header("X-API-Key", System.getenv("API_KEY")) .GET() .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println(response.body());package main
import ( "fmt" "io" "net/http" "os")
func main() { req, err := http.NewRequest("GET", "https://restlink23telecom.com/api/v1/sms/messages?status=delivered&limit=10", nil) if err != nil { panic(err) } req.Header.Set("X-API-Key", os.Getenv("API_KEY"))
res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close()
data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();client.DefaultRequestHeaders.Add("X-API-Key", Environment.GetEnvironmentVariable("API_KEY"));
var response = await client.GetAsync("https://restlink23telecom.com/api/v1/sms/messages?status=delivered&limit=10");
response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());| Parameter | Default | Description |
|---|---|---|
page | 1 | Page number |
limit | 25 | Results per page (max 100) |
status | — | delivered, undelivered, expired, pending, sent, failed, unknown |
phone | — | Search by phone number (substring) |
country | — | ISO code: US, GB, … |
sender | — | Filter by sender ID |
period | 7d | today, yesterday, 7d, 30d, this_month, last_month |
from / to | — | Custom range YYYY-MM-DD (omit period; the to day is included) |
Response
Section titled “Response”{ "messages": [ { "id": 1847, "client_message_id": "api_42_1743667200123456789_a3f8b2c1d9e45f67", "recipient": "+14155551234", "sender_id": "MyApp", "message": "Your verification code is 847291", "status": "DELIVRD", "status_code": "000", "segments": 1, "cost": 0.0085, "created_at": "2026-02-13T10:30:00Z", "delivered_at": "2026-02-13T10:30:04Z" } ], "total": 1250, "page": 1, "limit": 10, "total_pages": 125}Status filter mapping
Section titled “Status filter mapping”| Filter | Matches statuses |
|---|---|
delivered | DELIVRD |
undelivered | UNDELIV, REJECTD, DELETED |
expired | EXPIRED |
pending | pending, sent, ENROUTE, ACCEPTD |
sent | Same as pending (alias) |
failed | Same as undelivered (alias) |
unknown | UNKNOWN |
Unified messages
Section titled “Unified messages” GET
/api/v1/sms/messages/unified
· Permission: sms.read
Combines API traffic and broadcast campaigns in one view. Accepts the same
parameters as /sms/messages plus:
| Parameter | Default | Description |
|---|---|---|
source | all | api, broadcasts, all |
curl "https://restlink23telecom.com/api/v1/sms/messages/unified?source=all&limit=20" \ -H "X-API-Key: $API_KEY"const res = await fetch('https://restlink23telecom.com/api/v1/sms/messages/unified?source=all&limit=20', { method: 'GET', headers: { 'X-API-Key': process.env.API_KEY },});
if (!res.ok) { const err = await res.json(); throw new Error(`${err.error_code}: ${err.description}`);}const data = await res.json();console.log(data);import osimport requests
res = requests.get( "https://restlink23telecom.com/api/v1/sms/messages/unified", headers={"X-API-Key": os.environ["API_KEY"]}, params={ "source": "all", "limit": 20 },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://restlink23telecom.com/api/v1/sms/messages/unified?source=all&limit=20');curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['X-API-Key: ' . getenv('API_KEY')],]);
$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);curl_close($ch);
if ($status !== 200) { throw new Exception("HTTP $status: $response");}$data = json_decode($response, true);print_r($data);require "net/http"require "json"
uri = URI("https://restlink23telecom.com/api/v1/sms/messages/unified?source=all&limit=20")req = Net::HTTP::Get.new(uri)req["X-API-Key"] = ENV.fetch("API_KEY")
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }raise "HTTP #{res.code}: #{res.body}" unless res.is_a?(Net::HTTPSuccess)
puts JSON.parse(res.body)import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://restlink23telecom.com/api/v1/sms/messages/unified?source=all&limit=20")) .header("X-API-Key", System.getenv("API_KEY")) .GET() .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println(response.body());package main
import ( "fmt" "io" "net/http" "os")
func main() { req, err := http.NewRequest("GET", "https://restlink23telecom.com/api/v1/sms/messages/unified?source=all&limit=20", nil) if err != nil { panic(err) } req.Header.Set("X-API-Key", os.Getenv("API_KEY"))
res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close()
data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();client.DefaultRequestHeaders.Add("X-API-Key", Environment.GetEnvironmentVariable("API_KEY"));
var response = await client.GetAsync("https://restlink23telecom.com/api/v1/sms/messages/unified?source=all&limit=20");
response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());{ "messages": [ { "id": "3201", "source": "campaign", "recipient": "+447911123456", "sender_id": "Promo", "message": "50% off today!", "status": "DELIVRD", "status_code": "000", "cost": 0.042, "sent_at": "2026-02-13T09:00:00Z", "delivered_at": "2026-02-13T09:00:03Z", "clicked": true, "clicked_at": "2026-02-13T09:05:12Z", "action_type": "registration", "action_at": "2026-02-13T10:00:00Z", "message_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890", "client_message_id": null, "segments": 1, "broadcast_id": 42, "broadcast_name": "February Promo" } ], "total": 5420, "page": 1, "limit": 20, "total_pages": 271}CSV export
Section titled “CSV export” GET
/api/v1/sms/messages/unified/export
· Permission: sms.read
Streaming CSV export with the same filters as the unified list:
curl "https://restlink23telecom.com/api/v1/sms/messages/unified/export?period=30d" \ -H "X-API-Key: $API_KEY"const res = await fetch('https://restlink23telecom.com/api/v1/sms/messages/unified/export?period=30d', { method: 'GET', headers: { 'X-API-Key': process.env.API_KEY },});
if (!res.ok) { const err = await res.json(); throw new Error(`${err.error_code}: ${err.description}`);}const data = await res.json();console.log(data);import osimport requests
res = requests.get( "https://restlink23telecom.com/api/v1/sms/messages/unified/export", headers={"X-API-Key": os.environ["API_KEY"]}, params={ "period": "30d" },)res.raise_for_status()print(res.json())<?php$ch = curl_init('https://restlink23telecom.com/api/v1/sms/messages/unified/export?period=30d');curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['X-API-Key: ' . getenv('API_KEY')],]);
$response = curl_exec($ch);$status = curl_getinfo($ch, CURLINFO_HTTP_CODE);curl_close($ch);
if ($status !== 200) { throw new Exception("HTTP $status: $response");}$data = json_decode($response, true);print_r($data);require "net/http"require "json"
uri = URI("https://restlink23telecom.com/api/v1/sms/messages/unified/export?period=30d")req = Net::HTTP::Get.new(uri)req["X-API-Key"] = ENV.fetch("API_KEY")
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |http| http.request(req) }raise "HTTP #{res.code}: #{res.body}" unless res.is_a?(Net::HTTPSuccess)
puts JSON.parse(res.body)import java.net.URI;import java.net.http.HttpClient;import java.net.http.HttpRequest;import java.net.http.HttpResponse;
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder() .uri(URI.create("https://restlink23telecom.com/api/v1/sms/messages/unified/export?period=30d")) .header("X-API-Key", System.getenv("API_KEY")) .GET() .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());System.out.println(response.body());package main
import ( "fmt" "io" "net/http" "os")
func main() { req, err := http.NewRequest("GET", "https://restlink23telecom.com/api/v1/sms/messages/unified/export?period=30d", nil) if err != nil { panic(err) } req.Header.Set("X-API-Key", os.Getenv("API_KEY"))
res, err := http.DefaultClient.Do(req) if err != nil { panic(err) } defer res.Body.Close()
data, _ := io.ReadAll(res.Body) fmt.Println(string(data))}using System.Text;
using var client = new HttpClient();client.DefaultRequestHeaders.Add("X-API-Key", Environment.GetEnvironmentVariable("API_KEY"));
var response = await client.GetAsync("https://restlink23telecom.com/api/v1/sms/messages/unified/export?period=30d");
response.EnsureSuccessStatusCode();Console.WriteLine(await response.Content.ReadAsStringAsync());What to expect:
- Excel-compatible — the body starts with a UTF-8 BOM.
- Row cap — default 1,000,000 rows; the active cap is advertised in the
X-Export-Limitresponse header. Larger result sets are truncated silently, so narrow the date window to drill down. Content-Disposition: attachment; filename="messages_export_<timestamp>.csv".