Email recipients and status

Overview

Get each email recipient with their status.

Use this to see who opened or clicked.

You'll need the campaign's id.

Returns one row per email 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/email

Authentication

Account token

  • The campaign must belong to the caller's own company. Any other id, including a campaign of another account, 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, opened, clicked, unsubscribed, failed. pending and failed match the status; the others match rows that reached that step.
search_fieldquerystringNoField to search: email, status, message_id, customer_name. Leave it out to search all four.
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 email request's id.
data[].statusstringThe request's status, e.g. pending, sent or failed.
data[].sent_atstring or nullWhen it was sent.
data[].delivered_atstring or nullWhen it was delivered.
data[].opened_atstring or nullWhen it was opened.
data[].clicked_atstring or nullWhen a link in it was clicked.
data[].unsubscribed_atstring or nullWhen the recipient unsubscribed.
data[].failed_atstring or nullWhen it failed.
data[].unsubscribe_reasonstring or nullThe reason given for unsubscribing.
data[].failure_reasonstring or nullWhy it failed.
data[].metadataobject or nullExtra sending details, e.g. {"sent_via": "mandrill"}.
data[].created_atstringWhen the request was created.
data[].emailstringThe recipient's email address.
data[].message_idstring or nullThe email provider's message id, once sent.
data[].campaign_audience_data_idinteger or nullThe id of the audience row (see audience_data).
data[].next_follow_up_atstring or nullWhen the next follow-up is due.
data[].follow_up_countintegerFollow-ups sent so far.
data[].parent_idinteger or nullFor a follow-up, the id of the original request.
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": 24,
      "status": "sent",
      "sent_at": "2026-10-01T08:02:39.000000Z",
      "delivered_at": "2026-10-01T08:03:29.000000Z",
      "opened_at": "2026-10-01T08:03:29.000000Z",
      "clicked_at": null,
      "unsubscribed_at": null,
      "failed_at": null,
      "unsubscribe_reason": null,
      "failure_reason": null,
      "metadata": {
        "sent_via": "mandrill"
      },
      "created_at": "2026-10-01T08:02:35.000000Z",
      "email": "[email protected]",
      "message_id": "7b0172e7a6fe4b45a98332fd5b65dec4",
      "campaign_audience_data_id": 25,
      "next_follow_up_at": null,
      "follow_up_count": 0,
      "parent_id": null,
      "unique_code": "4xwu8",
      "audience_data": {
        "id": 25,
        "customer_name": "Jane Smith",
        "email": "[email protected]",
        "phone": null,
        "is_email_valid": "valid",
        "is_phone_valid": "N/A",
        "validation_status": "valid"
      }
    }
  ],
  "first_page_url": "https://production-api.shoutaboutus.com/api/v1/campaign/4823/recipients/email?page=1",
  "from": 1,
  "last_page": 1,
  "last_page_url": "https://production-api.shoutaboutus.com/api/v1/campaign/4823/recipients/email?page=1",
  "links": [
    {
      "url": null,
      "label": "« Previous",
      "page": null,
      "active": false
    },
    {
      "url": "https://production-api.shoutaboutus.com/api/v1/campaign/4823/recipients/email?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/email",
  "per_page": 10,
  "prev_page_url": null,
  "to": 1,
  "total": 1
}

Examples

Success payload

See Response payload.

Error payload

404 Campaign not found

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

422 Invalid filter

{
  "message": "The selected filter is invalid.",
  "errors": {
    "filter": [
      "The selected filter is invalid."
    ]
  }
}

422 limit above 100

{
  "message": "The limit field must not be greater than 100.",
  "errors": {
    "limit": [
      "The limit field must not be greater than 100."
    ]
  }
}

429 Too many requests

{
  "message": "Too Many Attempts."
}
StatusMeaning
200One page of recipients.
401The token is missing, expired or invalid.
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/email?limit=10&page=1" \
  --header 'Authorization: Bearer <bearer-token>' \
  --header 'Accept: application/json'

Did this page help you?