List an SMS campaign's recipients

List an SMS campaign's recipients

GET/api/v1/sms/campaigns/{id}/recipients

GET /sms/campaigns/{id}/recipients
curl -X GET 'https://www.unitpost.com/api/v1/sms/campaigns/cmp_123/recipients' \
  -H 'Authorization: Bearer YOUR_API_KEY' \
  -H 'User-Agent: my-app/1.0'
Response · 200
{
  "object": "list",
  "has_more": false,
  "data": [
    {
      "object": "sms_campaign_recipient",
      "id": "id_123",
      "contact_id": "contact_123",
      "to": "customer@example.com",
      "name": "Example",
      "status": "delivered",
      "reason": "string",
      "reason_code": "string",
      "message_id": "message_123",
      "segments": 0,
      "created_at": "2026-01-01T00:00:00.000Z"
    }
  ],
  "skipped_by_reason": [
    {
      "reason": "string",
      "count": 1
    }
  ]
}

How each recipient of an SMS campaign fared: the carrier's answer for a text that went out (delivered, sent, failed, …), or why none was sent (skipped, with reason_code: opted_out, no_marketing_consent, …). Newest first, cursor-paginated on id; q matches digits of the number. skipped_by_reason counts skipped recipients over the whole campaign, on the first page (null on the others). A bad limit or q, or any other query key, is a 422. Requires the campaigns:read capability.

Parameters5 fields
FieldTypeDescription
idrequiredstring · path—
limitinteger · queryMax rows to return (default 20, max 100).
afterstring · queryReturn rows after this id (forward paging).
beforestring · queryReturn rows before this id (backward paging).
qstring · queryDigits of the recipient's number.
Response · 200 fields11 fields
FieldTypeDescription
objectrequiredstring—
idrequiredstringThis recipient row (`rcpt_…`); pass the last one as `after` for the next page.
contact_idrequiredstring | null—
torequiredstring | nullThe number in E.164.
namerequiredstring | null—
statusrequiredenumdelivered | sent | failed | suppressed | canceled | deferred | pending | skippedThe carrier's answer when a text exists, else why none was sent (`skipped`).
reasonrequiredstring | nullWhy it failed or was skipped, in plain words.
reason_coderequiredstring | nullThe SMS skip reason (`opted_out`, `no_marketing_consent`, …) when there is one.
message_idrequiredstring | nullThe text (`sms_…`); read it with `GET /sms/{id}`.
segmentsrequiredinteger | nullSegments billed.
created_atrequiredstring—
200401403404422503

Search docs and guides

Search the docs and product guides.