Use the message activity list to retrieve the ten activity metrics for your messages, one row per message, filtered by message, folder, recipient list, type, and date.
Endpoints
Method | URL | Description |
GET |
| Return activity metrics per message. |
Authentication is via HTTP Basic Auth using your API ID and API Key.
List Message Activity
GET https://e1.envoke.com/v2/reports/messages
Returns a JSON array of rows, one per message, most recently sent first. Each row describes the message and gives its ten metrics as integers. When nothing matches, the response is [].
The list has no rates and no breakdowns; for those, request the message's single report.
Which messages are included
By default the list includes:
sent email campaigns (Message API status
Sent), andautomated messages (status
Nurture).
type=campaign or type=automated narrows the list to one of the two. include_in_progress=1 also includes campaigns that have started sending but are not finished (status AB test in progress, Queuing, or Sending). Their numbers change from one request to the next until the send completes, and an A/B test still in its test phase shows only the contacts sent so far.
Drafts, scheduled messages that have not started, messages of the Transactional status, and deleted or hidden messages (a message hidden or deleted in the app, stored with visible = 0) are never included. An automated message whose sequence is transactional has the Nurture status and is included like any automated message.
A message is listed when it matches every filter, whether or not it has any activity: a message sent to nobody, or one with nothing recorded inside the activity window, appears with every count 0. When an activity window is given, messages launched after activity_to are left out, since nothing can have happened to them yet.
A/B tests. An A/B test is one message with one row. has_variants is true, subject is null for a subject-line test (each version's subject is in the single report), and the counts are those of all its versions together, including the contacts sent the winning version after the test. The versions are never listed as rows; their own counts are in the variants of the single-message report.
Query Parameters
Parameter | Type | Default | Description |
| integer or array | — | One message ID ( |
| integer or array | — | One message folder ID or several. Messages filed in the folder or in any of its subfolders, at any depth, are included, as in the folder report in Envoke. |
| integer | — | Only messages sent to this tag. One value. |
| integer | — | Only messages sent to this segment. One value. |
| integer | — | Only messages sent to this subscription. One value. The account's mandatory subscription is not returned by the Subscription API, so messages sent to it are selected by |
| string | (both) |
|
| integer |
|
|
| string | — | Only messages whose |
| string | — | Only messages whose |
| string | — | Count only activity on or after this date or time. |
| string | — | Count only activity on or before this date or time. |
| integer |
| Maximum number of rows; values above |
| integer |
| Number of rows to skip. |
The filters combine with AND. Any other parameter returns HTTP 400 (Parameter 'segment' is not valid); see Unknown parameters.
Recipient list filters
tag_id, segment_id, and subscription_id select messages by the list recorded on the message when it was sent, not by the contacts who are on that list today. They match the same values the Message API returns in recipient_tag, recipient_segment, and recipient_subscription for the message:
Filter | Matches a message whose |
|
|
|
|
|
|
A message sent to several tags at once is recorded against an internal segment that no API returns, so it matches neither tag_id for one of those tags nor any segment_id. Automated messages are usually not sent to a list and match none of the three.
Names in the rows, IDs in the filters. recipient_subscription, recipient_tag, and recipient_segment in the rows are the names of the lists recorded on the message, while the filters tag_id, subscription_id, and segment_id take IDs. The IDs and current names of tags and subscriptions come from GET https://e1.envoke.com/v2/tags (Tag API) and GET https://e1.envoke.com/v2/subscriptions (Subscription API); segment IDs come from the segments in the Envoke app. A message whose list was deleted since it was sent can still show the list's name, but the deleted list is no longer returned by those APIs, so there is no ID to filter it by.
Date window
sent_from and sent_to choose which messages are listed, by sent_time. activity_from and activity_to choose which activity is counted. They can be combined:
Request | Result |
no date parameter | Every message, lifetime counts. |
| Messages launched in April, lifetime counts. |
| Every matching message launched by the end of May, counting only May's activity. A message launched in April appears with |
| Messages launched in April, counting only their May activity. |
For an automated message sent_time is the date it was set up or last activated, so sent_from and sent_to select automated messages by that date, not by when contacts received them. To report on what an automated message sent in a period, use message_id with activity_from and activity_to.
Inside an activity window delivered counts the contacts sent the message inside the window who have no bounce for it, so it is never negative and is not the window's sends − bounces; see delivered.
Ordering and pagination
Rows are ordered by sent_time, newest first, and then by id, highest first, so messages launched in the same second always come back in the same order and pages never overlap. Messages with no sent_time come last. The order cannot be changed, and the order of message_id[] values in the request is not kept.
The response does not say how many rows exist in all. To read every row, request pages with skip until one returns fewer than limit rows.
Response fields
Field | Type | Description |
| string | Message ID; the Message API |
| string | Internal name. |
| string or null | Stored subject line; |
| string |
|
| string or null | Launch time, |
| string | The name of the subscription the message was sent to, or |
| string | The name of the tag the message was sent to, or |
| string | The name of the segment the message was sent to, or |
| boolean |
|
| integer | The ten metrics, in glossary order. |
See Messages in the fields reference for subject, type, and sent_time in detail.
Response
[ { "id": "2004", "name": "Pirates Opening Night", "subject": null, "type": "campaign", "sent_time": "2026-05-14 09:30:00", "recipient_subscription": "Season News", "recipient_tag": "", "recipient_segment": "", "has_variants": true, "sends": 386, "delivered": 379, "bounces": 7, "hard_bounces": 4, "soft_bounces": 3, "opens": 201, "clicks": 64, "unsubscribes": 2, "spam_complaints": 0, "skips": 3 }, { "id": "2001", "name": "Spring Season Announcement", "subject": "Our spring season is here, {fname}", "type": "campaign", "sent_time": "2026-04-15 10:00:00", "recipient_subscription": "Season News", "recipient_tag": "", "recipient_segment": "", "has_variants": false, "sends": 412, "delivered": 403, "bounces": 9, "hard_bounces": 5, "soft_bounces": 4, "opens": 188, "clicks": 57, "unsubscribes": 4, "spam_complaints": 1, "skips": 6 }, { "id": "2002", "name": "Auditions Open", "subject": "Auditions for The Pirates of Penzance", "type": "campaign", "sent_time": "2026-03-10 18:00:00", "recipient_subscription": "", "recipient_tag": "Cast Call", "recipient_segment": "", "has_variants": false, "sends": 64, "delivered": 62, "bounces": 2, "hard_bounces": 1, "soft_bounces": 1, "opens": 47, "clicks": 21, "unsubscribes": 0, "spam_complaints": 0, "skips": 1 } ]Errors
Invalid parameters return HTTP 400 with the validation envelope (see Error Responses). Besides the shared date, limit, skip, and unknown-parameter errors, the list returns:
Error | Cause |
| A |
| A single-value parameter sent as an array ( |
|
|
|
|
A filter value that is a whole number but matches nothing (an unknown folder, a tag in another account) is not an error: the response is [].
Examples
The ten most recent messages
curl -X GET -gs -u "$API_ID:$API_KEY" \ "https://e1.envoke.com/v2/reports/messages"
Second page of 25
curl -X GET -gs -u "$API_ID:$API_KEY" \ "https://e1.envoke.com/v2/reports/messages?limit=25&skip=25"
Lifetime counts for two messages
curl -X GET -gs -u "$API_ID:$API_KEY" \ "https://e1.envoke.com/v2/reports/messages?message_id%5B%5D=2001&message_id%5B%5D=2004"
The rows come back newest first, not in the order the IDs were given.
Messages launched in April
curl -X GET -gs -u "$API_ID:$API_KEY" \ "https://e1.envoke.com/v2/reports/messages?sent_from=2026-04-01&sent_to=2026-04-30&limit=100"
May activity for one message
curl -X GET -gs -u "$API_ID:$API_KEY" \ "https://e1.envoke.com/v2/reports/messages?message_id=2001&activity_from=2026-05-01&activity_to=2026-05-31"
Response (2001 was sent in April; only its May activity is counted, so sends is 0 and so is delivered, which counts only contacts sent the message in May):
[ { "id": "2001", "name": "Spring Season Announcement", "subject": "Our spring season is here, {fname}", "type": "campaign", "sent_time": "2026-04-15 10:00:00", "recipient_subscription": "Season News", "recipient_tag": "", "recipient_segment": "", "has_variants": false, "sends": 0, "delivered": 0, "bounces": 0, "hard_bounces": 0, "soft_bounces": 0, "opens": 12, "clicks": 3, "unsubscribes": 1, "spam_complaints": 0, "skips": 0 } ]Automated messages only
curl -X GET -gs -u "$API_ID:$API_KEY" \ "https://e1.envoke.com/v2/reports/messages?type=automated"
Response:
[ { "id": "2006", "name": "Welcome to Maple Ridge", "subject": "Welcome to Maple Ridge Community Theatre, {fname}", "type": "automated", "sent_time": "2025-09-02 08:00:00", "recipient_subscription": "", "recipient_tag": "", "recipient_segment": "", "has_variants": false, "sends": 1284, "delivered": 1261, "bounces": 23, "hard_bounces": 15, "soft_bounces": 8, "opens": 702, "clicks": 233, "unsubscribes": 11, "spam_complaints": 2, "skips": 40 } ]Messages in one folder
curl -X GET -gs -u "$API_ID:$API_KEY" \ "https://e1.envoke.com/v2/reports/messages?group_id=31"
The rows include the messages filed in the folder's subfolders.
Messages sent to one tag
curl -X GET -gs -u "$API_ID:$API_KEY" \ "https://e1.envoke.com/v2/reports/messages?tag_id=512"
Messages launched in December 2021
curl -X GET -gs -u "$API_ID:$API_KEY" \ "https://e1.envoke.com/v2/reports/messages?sent_from=2021-12-01&sent_to=2021-12-31"
Response (every metric is available whatever the message's age; only the single report's email_clients is null for messages sent before June 2022):
[ { "id": "2003", "name": "Holiday Gala Invitation", "subject": "You're invited to the Holiday Gala", "type": "campaign", "sent_time": "2021-12-01 10:00:00", "recipient_subscription": "Season News", "recipient_tag": "", "recipient_segment": "", "has_variants": false, "sends": 355, "delivered": 349, "bounces": 6, "hard_bounces": 4, "soft_bounces": 2, "opens": 171, "clicks": 38, "unsubscribes": 3, "spam_complaints": 0, "skips": 12 } ]Including campaigns still sending
curl -X GET -gs -u "$API_ID:$API_KEY" \ "https://e1.envoke.com/v2/reports/messages?type=campaign&include_in_progress=1"
Note: The curl examples above are formatted for readability. All requests must use properly encoded URLs.
For code examples and interactive testing, visit api.envoke.com.
