Text recipients and status

Overview

Get each text recipient with their status.

Use this to see who clicked.

You'll need an account token and the campaign's id.

Returns one row per text request, newest first, 10 per page unless you set limit. Test sends are included.

Prerequisites

Base URL

EnvironmentURL
Productionhttps://production-api.shoutaboutus.com
Developmenthttps://development-api.shoutaboutus.com

Endpoint

GET /api/v1/campaign/{campaignId}/recipients/sms

Authentication

Account token

  • Only account users can call it: the company behind the token must be an account. Partner and location users get 403.
  • The campaign must belong to the caller's own company. Any other id returns 404 Campaign not found.

Rate limit

60 requests per minute, counted per user (the token’s user). See Rate limits.

Request parameters

ParameterInTypeRequiredDescription
campaignIdpathintegerYesThe campaign's id (digits only). It must belong to your own company.
filterquerystringNoOnly rows at this stage: processed, pending, sent, delivered, clicked, failed. pending and failed match the status; the others match rows that reached that step (clicked: the link was clicked).
search_fieldquerystringNoField to search: phone_number, status, message_id. Leave it out to search all three.
search_valuequerystringNoText to search for (contains), up to 255 characters.
sort_fieldquerystringNoColumn to sort by. Default created_at.
sort_byquerystringNoSort direction: asc or desc (either case). Default desc.
limitqueryintegerNoRows per page, 10 to 100. Values below 10 are raised to 10; above 100 returns 422. Default 10.
pagequeryintegerNoPage number, from 1. Default 1.

Request body

None.

Request payload

None.

Response body

This endpoint returns a standard page object at the top level, not wrapped in the usual data object: the rows are in data, next to the paging fields. There is no meta object.

FieldTypeDescription
current_pageintegerThis page's number.
data[]array of objectsThe recipients on this page.
data[].idintegerThe text request's id.
data[].statusstringThe request's status, e.g. pending, delivered or failed.
data[].sent_atstring or nullWhen it was sent.
data[].delivered_atstring or nullWhen it was delivered.
data[].link_clicked_atstring or nullWhen the link in it was clicked.
data[].failed_atstring or nullWhen it failed.
data[].failure_reasonstring or nullWhy it failed.
data[].metadataobject or nullExtra sending details.
data[].created_atstringWhen the request was created.
data[].dialing_codestring or nullThe country dialing code, e.g. +1.
data[].phone_numberstringThe recipient's phone number, without the dialing code.
data[].message_idstring or nullThe SMS provider's message id, once sent.
data[].campaign_audience_data_idinteger or nullThe id of the audience row (see audience_data).
data[].unique_codestringShort code for this request, derived from its id.
data[].audience_dataobject or nullThe audience row (the uploaded customer) this request was sent to.
data[].audience_data.idintegerThe audience row's id.
data[].audience_data.customer_namestring or nullThe customer's name.
data[].audience_data.emailstring or nullThe customer's email address.
data[].audience_data.phonestring or nullThe customer's phone number.
data[].audience_data.is_email_validstringWhether the email address passed validation, e.g. valid, or N/A when there's none.
data[].audience_data.is_phone_validstringWhether the phone number passed validation, e.g. valid, or N/A when there's none.
data[].audience_data.validation_statusstringThe row's overall validation status, e.g. valid.
first_page_urlstringURL of the first page.
frominteger or nullPosition of the first row on this page; null when the page is empty.
last_pageintegerNumber of the last page.
last_page_urlstringURL of the last page.
links[]array of objectsPager links: previous, each page number, next.
links[].urlstring or nullURL of that page; null when there is no such page.
links[].labelstringLink text: a page number, « Previous or Next ».
links[].pageinteger or nullPage number the link goes to; null when there is no such page.
links[].activebooleantrue for the current page.
next_page_urlstring or nullURL of the next page; null on the last page.
pathstringURL of this endpoint, without query string.
per_pageintegerRows per page (limit).
prev_page_urlstring or nullURL of the previous page; null on the first page.
tointeger or nullPosition of the last row on this page; null when the page is empty.
totalintegerRows across all pages.

Response payload

{
  "current_page": 1,
  "data": [
    {
      "id": 456,
      "status": "delivered",
      "sent_at": "2026-06-15T10:30:00.000000Z",
      "delivered_at": "2026-06-15T10:31:00.000000Z",
      "link_clicked_at": null,
      "failed_at": null,
      "failure_reason": null,
      "metadata": null,
      "created_at": "2026-06-15T10:29:00.000000Z",
      "dialing_code": "+1",
      "phone_number": "5555550100",
      "message_id": "SM123abc",
      "campaign_audience_data_id": 99,
      "unique_code": "x8k2p",
      "audience_data": {
        "id": 99,
        "customer_name": "Jane Smith",
        "email": "[email protected]",
        "phone": "5555550100",
        "is_email_valid": "valid",
        "is_phone_valid": "valid",
        "validation_status": "valid"
      }
    }
  ],
  "first_page_url": "https://production-api.shoutaboutus.com/api/v1/campaign/4823/recipients/sms?page=1",
  "from": 1,
  "last_page": 1,
  "last_page_url": "https://production-api.shoutaboutus.com/api/v1/campaign/4823/recipients/sms?page=1",
  "links": [
    {
      "url": null,
      "label": "« Previous",
      "page": null,
      "active": false
    },
    {
      "url": "https://production-api.shoutaboutus.com/api/v1/campaign/4823/recipients/sms?page=1",
      "label": "1",
      "page": 1,
      "active": true
    },
    {
      "url": null,
      "label": "Next »",
      "page": null,
      "active": false
    }
  ],
  "next_page_url": null,
  "path": "https://production-api.shoutaboutus.com/api/v1/campaign/4823/recipients/sms",
  "per_page": 10,
  "prev_page_url": null,
  "to": 1,
  "total": 1
}

Examples

Success payload

See Response payload.

Error payload

403 Not an account user

{
  "message": "This action is unauthorized."
}

404 Campaign not found

{
  "message": "Campaign not found",
  "status": "error",
  "errors": []
}

422 Unknown sort_field

{
  "message": "The selected sort field is invalid.",
  "errors": {
    "sort_field": [
      "The selected sort field is invalid."
    ]
  }
}

429 Too many requests

{
  "message": "Too Many Attempts."
}
StatusMeaning
200One page of recipients.
401The token is missing, expired or invalid.
403The company behind the token isn't an account.
404No campaign with that id in your company (Campaign not found).
422A query value is not allowed: for example an unknown filter, sort_field or search_field, or limit above 100.
429More than 60 requests in a minute from this user.
500Unexpected server error.

Example request

curl --request GET \
  --url "https://production-api.shoutaboutus.com/api/v1/campaign/4823/recipients/sms?limit=10&page=1" \
  --header 'Authorization: Bearer <bearer-token>' \
  --header 'Accept: application/json'

Did this page help you?