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
- A bearer token. See Authentication.
- The campaign's id (
campaignId), from List campaigns.
Base URL
| Environment | URL |
|---|---|
| Production | https://production-api.shoutaboutus.com |
| Development | https://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
404Campaign not found.
Rate limit
60 requests per minute, counted per user (the token’s user). See Rate limits.
Request parameters
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
campaignId | path | integer | Yes | The campaign's id (digits only). It must belong to your own company. |
filter | query | string | No | Only 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_field | query | string | No | Field to search: phone_number, status, message_id. Leave it out to search all three. |
search_value | query | string | No | Text to search for (contains), up to 255 characters. |
sort_field | query | string | No | Column to sort by. Default created_at. |
sort_by | query | string | No | Sort direction: asc or desc (either case). Default desc. |
limit | query | integer | No | Rows per page, 10 to 100. Values below 10 are raised to 10; above 100 returns 422. Default 10. |
page | query | integer | No | Page 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.
| Field | Type | Description |
|---|---|---|
current_page | integer | This page's number. |
data[] | array of objects | The recipients on this page. |
data[].id | integer | The text request's id. |
data[].status | string | The request's status, e.g. pending, delivered or failed. |
data[].sent_at | string or null | When it was sent. |
data[].delivered_at | string or null | When it was delivered. |
data[].link_clicked_at | string or null | When the link in it was clicked. |
data[].failed_at | string or null | When it failed. |
data[].failure_reason | string or null | Why it failed. |
data[].metadata | object or null | Extra sending details. |
data[].created_at | string | When the request was created. |
data[].dialing_code | string or null | The country dialing code, e.g. +1. |
data[].phone_number | string | The recipient's phone number, without the dialing code. |
data[].message_id | string or null | The SMS provider's message id, once sent. |
data[].campaign_audience_data_id | integer or null | The id of the audience row (see audience_data). |
data[].unique_code | string | Short code for this request, derived from its id. |
data[].audience_data | object or null | The audience row (the uploaded customer) this request was sent to. |
data[].audience_data.id | integer | The audience row's id. |
data[].audience_data.customer_name | string or null | The customer's name. |
data[].audience_data.email | string or null | The customer's email address. |
data[].audience_data.phone | string or null | The customer's phone number. |
data[].audience_data.is_email_valid | string | Whether the email address passed validation, e.g. valid, or N/A when there's none. |
data[].audience_data.is_phone_valid | string | Whether the phone number passed validation, e.g. valid, or N/A when there's none. |
data[].audience_data.validation_status | string | The row's overall validation status, e.g. valid. |
first_page_url | string | URL of the first page. |
from | integer or null | Position of the first row on this page; null when the page is empty. |
last_page | integer | Number of the last page. |
last_page_url | string | URL of the last page. |
links[] | array of objects | Pager links: previous, each page number, next. |
links[].url | string or null | URL of that page; null when there is no such page. |
links[].label | string | Link text: a page number, « Previous or Next ». |
links[].page | integer or null | Page number the link goes to; null when there is no such page. |
links[].active | boolean | true for the current page. |
next_page_url | string or null | URL of the next page; null on the last page. |
path | string | URL of this endpoint, without query string. |
per_page | integer | Rows per page (limit). |
prev_page_url | string or null | URL of the previous page; null on the first page. |
to | integer or null | Position of the last row on this page; null when the page is empty. |
total | integer | Rows 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."
}| Status | Meaning |
|---|---|
200 | One page of recipients. |
401 | The token is missing, expired or invalid. |
403 | The company behind the token isn't an account. |
404 | No campaign with that id in your company (Campaign not found). |
422 | A query value is not allowed: for example an unknown filter, sort_field or search_field, or limit above 100. |
429 | More than 60 requests in a minute from this user. |
500 | Unexpected 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'Updated 17 days ago
Did this page help you?
