Delivery Reports

SMS V3 APIs

List your messages and whether they were delivered. Filter by batch, status, period or number.

GEThttps://telcomw.com/api/v3/sms/delivery-reports

Send the filters in the URL (query parameters). Your API key goes in the X-API-Key header.

Parameters

Parameter Sent in Required Description
X-API-Key header YES Your API key, sent as a header. You can also send it as Authorization: Bearer YOUR_API_KEY.
batch_id query NO Only the messages of one send. Without it the report covers the last 7 days.
status query NO pending, delivered or failed.
from query NO The first day, like 2026-11-01.
to query NO The last day, like 2026-11-05. The period can be one year at most.
to_number query NO A phone number, or the start of one.
sender_id query NO Only the messages sent as this sender ID.
order query NO desc (newest first, the default) or asc.
page query NO The page number, starting at 1.
per_page query NO Messages in a page, 1 to 100. The default is 50.

Example request

curl --location --request GET 'https://telcomw.com/api/v3/sms/delivery-reports?batch_id=k3m9x2p7q1ab&status=delivered&page=1&per_page=50' \
  --header 'X-API-Key: YOUR_API_KEY'
curl --location --request GET "https://telcomw.com/api/v3/sms/delivery-reports?batch_id=k3m9x2p7q1ab&status=delivered&page=1&per_page=50" ^
  --header "X-API-Key: YOUR_API_KEY"
<?php

$headers = [
    'X-API-Key: YOUR_API_KEY',
];

$ch = curl_init('https://telcomw.com/api/v3/sms/delivery-reports?batch_id=k3m9x2p7q1ab&status=delivered&page=1&per_page=50');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

print_r(json_decode($response, true));
const axios = require('axios');

axios.request({
  method: 'get',
  url: 'https://telcomw.com/api/v3/sms/delivery-reports',
  params: {
    'batch_id': 'k3m9x2p7q1ab',
    'status': 'delivered',
    'page': '1',
    'per_page': '50'
  },
  headers: {
    'X-API-Key': 'YOUR_API_KEY'
  }
}).then((res) => console.log(res.data))
  .catch((err) => console.error(err.response ? err.response.data : err.message));
import requests

params = {
    'batch_id': 'k3m9x2p7q1ab',
    'status': 'delivered',
    'page': '1',
    'per_page': '50'
}
headers = {
    'X-API-Key': 'YOUR_API_KEY'
}

response = requests.request('GET', 'https://telcomw.com/api/v3/sms/delivery-reports', params=params, headers=headers)
print(response.json())

Response

The response is JSON.

Response (200)

{
  "success": true,
  "request_id": "req_5f2c9a1d0e7b4a63",
  "data": {
    "summary": {
      "total": 3,
      "pending": 1,
      "delivered": 2,
      "failed": 0
    },
    "messages": [
      {
        "message_id": "ke4wz6fydbtj",
        "batch_id": "k3m9x2p7q1ab",
        "to": "265999123456",
        "sender_id": "WGIT",
        "message": "Our sale starts today. Visit us!",
        "status": "delivered",
        "sent_at": "2026-11-02T08:15:02.000Z",
        "delivered_at": "2026-11-02T08:15:09.000Z"
      }
    ],
    "pagination": {
      "page": 1,
      "per_page": 50,
      "total": 2,
      "pages": 1
    },
    "period": null
  }
}

Fields explained

FieldDescription
data.summaryHow many messages match your filters, by status. The numbers count the filters, not only this page.
data.messages[].statuspending: not delivered yet. delivered: the phone received it. failed: it could not be delivered.
data.messages[].sent_atWhen the message was sent (UTC).
data.messages[].delivered_atWhen it was delivered (UTC), null until then.
data.paginationThe page, the page size, the total of messages and the number of pages.

Good to know

  • A message stays pending until the network reports it. Check again a little later.
  • Only your own messages are listed.