Skip to main content
GET
/
api
/
v1
/
metrics
/
sequences
/
{sequenceId}
Get Sequence Metrics
curl --request GET \
  --url https://api.sequenzy.com/api/v1/metrics/sequences/{sequenceId} \
  --header 'Authorization: Bearer <token>'
import requests

url = "https://api.sequenzy.com/api/v1/metrics/sequences/{sequenceId}"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.text)
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

fetch('https://api.sequenzy.com/api/v1/metrics/sequences/{sequenceId}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sequenzy.com/api/v1/metrics/sequences/{sequenceId}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"net/http"
"io"
)

func main() {

url := "https://api.sequenzy.com/api/v1/metrics/sequences/{sequenceId}"

req, _ := http.NewRequest("GET", url, nil)

req.Header.Add("Authorization", "Bearer <token>")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.get("https://api.sequenzy.com/api/v1/metrics/sequences/{sequenceId}")
.header("Authorization", "Bearer <token>")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.sequenzy.com/api/v1/metrics/sequences/{sequenceId}")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
{
  "success": true,
  "sequenceId": "seq_abc123",
  "stats": {
    "sent": 122,
    "delivered": 120,
    "bounced": 2,
    "opened": 80,
    "clicked": 5,
    "unsubscribed": 1,
    "deliveryRate": 98.36,
    "bounceRate": 1.64,
    "openRate": 66.67,
    "clickRate": 4.17,
    "unsubscribeRate": 0.83,
    "conversions": 4,
    "revenueCents": 27800
  },
  "steps": [
    {
      "step": 1,
      "nodeId": "node_001",
      "subject": "Welcome to our platform",
      "stats": { "sent": 60, "delivered": 59, "bounced": 1, "opened": 40, "clicked": 3, "unsubscribed": 0, "deliveryRate": 98.33, "bounceRate": 1.67, "openRate": 67.8, "clickRate": 5.08, "unsubscribeRate": 0 },
      "failedCount": 0,
      "failedSubscribers": []
    },
    {
      "step": 2,
      "nodeId": "node_002",
      "subject": "Quick tips to get started",
      "stats": { "sent": 44, "delivered": 43, "bounced": 1, "opened": 30, "clicked": 2, "unsubscribed": 1, "deliveryRate": 97.73, "bounceRate": 2.27, "openRate": 69.77, "clickRate": 4.65, "unsubscribeRate": 2.33 },
      "failedCount": 2,
      "failedSubscribers": [
        {
          "subscriberId": "sub_failed_001",
          "email": "failed@example.com",
          "failedAt": "2026-02-14T09:32:11.000Z",
          "failedReason": "Email template ID is required"
        },
        {
          "subscriberId": "sub_failed_002",
          "email": "unknown@example.com",
          "failedAt": "2026-02-14T09:11:42.000Z",
          "failedReason": "Node node_002 not found"
        }
      ]
    },
    {
      "step": 3,
      "nodeId": "node_003",
      "subject": "Your first week recap",
      "stats": { "sent": 18, "delivered": 18, "bounced": 0, "opened": 10, "clicked": 0, "unsubscribed": 0, "deliveryRate": 100, "bounceRate": 0, "openRate": 55.56, "clickRate": 0, "unsubscribeRate": 0 },
      "failedCount": 0,
      "failedSubscribers": []
    }
  ]
}
{
  "success": false,
  "error": "Invalid period. Must be one of: 1h, 24h, 7d, 30d, 90d"
}
{ "success": false, "error": "Unauthorized" }
{ "success": false, "error": "Sequence not found" }
{ "success": false, "error": "Internal server error" }
Returns aggregate engagement metrics for a sequence (automation) plus a per-step breakdown showing how each email in the sequence performed. Each step also includes recent failed subscribers and their failure reasons. Both aggregate and per-step metrics respect the time filter. Test sends are excluded from these performance metrics and attributed revenue by default so previews do not skew results, but they still count toward send usage and quota. Open and click metrics also exclude detected email-security scanners and tracked brand assets by default.

Path Parameters

sequenceId
string
required
The ID of the sequence.

Query Parameters

period
string
Sliding time window. One of: 1h, 24h, 7d, 30d, 90d. Ignored when start and end are provided.
start
string
Start of custom time range (ISO 8601). Must be used with end.
end
string
End of custom time range (ISO 8601). Must be used with start. Max range: 90 days.
includeMachineEngagement
boolean
default:"false"
Set to true to include detected scanner, preview, and tracked asset open/click events in engagement metrics.

Response Fields

FieldTypeDescription
sequenceIdstringThe sequence ID
statsobjectAggregate stats across all steps (same shape as below)
stepsarrayPer-step metrics, ordered by position
Stats object (used for both aggregate and per-step):
FieldTypeDescription
sentnumberEmails sent
deliverednumberEmails delivered
bouncednumberEmails that bounced
openednumberUnique opens
clickednumberUnique clicks
unsubscribednumberUnsubscribes
deliveryRatenumberDelivery rate percentage
bounceRatenumberBounce rate percentage
openRatenumberOpen rate percentage
clickRatenumberClick rate percentage
unsubscribeRatenumberUnsubscribe rate percentage
conversionsnumberGoal conversions attributed to this sequence (last-touch, 24h window)
revenueCentsnumberAttributed revenue in cents from purchase events (saas.purchase and ecommerce.order_placed)
The conversions and revenueCents fields appear on the top-level stats object only, not on per-step stats. Steps array:
FieldTypeDescription
stepnumberStep number (1-indexed)
nodeIdstringNode ID for this email step
subjectstring|nullEmail subject line
statsobjectStats for this step
failedCountnumberNumber of subscribers that failed at this step
failedSubscribersarrayUp to 20 most recent failed subscribers for this step
Failed subscriber object:
FieldTypeDescription
subscriberIdstringSubscriber ID
emailstring|nullSubscriber email captured on the token
failedAtstringWhen the token failed (ISO 8601)
failedReasonstring|nullStored failure reason for the token

Common Queries

How is our onboarding sequence performing overall?

curl "https://api.sequenzy.com/api/v1/metrics/sequences/seq_abc123" \
 -H "Authorization: Bearer YOUR_API_KEY"
Check the top-level stats for aggregate performance across all steps.

Which step has the highest drop-off?

curl "https://api.sequenzy.com/api/v1/metrics/sequences/seq_abc123" \
 -H "Authorization: Bearer YOUR_API_KEY"
Compare openRate across the steps array. A sharp drop between consecutive steps signals where subscribers lose interest.

How many people unsubscribed from the second email?

curl "https://api.sequenzy.com/api/v1/metrics/sequences/seq_abc123" \
 -H "Authorization: Bearer YOUR_API_KEY"
Look at steps[1].stats.unsubscribed (step 2, zero-indexed in the array). If the unsubscribe rate is high on a specific step, consider revising that email’s content or timing.

How has the sequence performed this month?

curl "https://api.sequenzy.com/api/v1/metrics/sequences/seq_abc123?start=2026-02-01T00:00:00Z&end=2026-02-28T00:00:00Z" \
 -H "Authorization: Bearer YOUR_API_KEY"
Both aggregate and per-step metrics will be scoped to this time range.

Who engaged with this sequence?

Use the Get Recipients endpoint with a sequenceId filter:
curl "https://api.sequenzy.com/api/v1/metrics/recipients?sequenceId=seq_abc123" \
 -H "Authorization: Bearer YOUR_API_KEY"

Responses

{
  "success": true,
  "sequenceId": "seq_abc123",
  "stats": {
    "sent": 122,
    "delivered": 120,
    "bounced": 2,
    "opened": 80,
    "clicked": 5,
    "unsubscribed": 1,
    "deliveryRate": 98.36,
    "bounceRate": 1.64,
    "openRate": 66.67,
    "clickRate": 4.17,
    "unsubscribeRate": 0.83,
    "conversions": 4,
    "revenueCents": 27800
  },
  "steps": [
    {
      "step": 1,
      "nodeId": "node_001",
      "subject": "Welcome to our platform",
      "stats": { "sent": 60, "delivered": 59, "bounced": 1, "opened": 40, "clicked": 3, "unsubscribed": 0, "deliveryRate": 98.33, "bounceRate": 1.67, "openRate": 67.8, "clickRate": 5.08, "unsubscribeRate": 0 },
      "failedCount": 0,
      "failedSubscribers": []
    },
    {
      "step": 2,
      "nodeId": "node_002",
      "subject": "Quick tips to get started",
      "stats": { "sent": 44, "delivered": 43, "bounced": 1, "opened": 30, "clicked": 2, "unsubscribed": 1, "deliveryRate": 97.73, "bounceRate": 2.27, "openRate": 69.77, "clickRate": 4.65, "unsubscribeRate": 2.33 },
      "failedCount": 2,
      "failedSubscribers": [
        {
          "subscriberId": "sub_failed_001",
          "email": "failed@example.com",
          "failedAt": "2026-02-14T09:32:11.000Z",
          "failedReason": "Email template ID is required"
        },
        {
          "subscriberId": "sub_failed_002",
          "email": "unknown@example.com",
          "failedAt": "2026-02-14T09:11:42.000Z",
          "failedReason": "Node node_002 not found"
        }
      ]
    },
    {
      "step": 3,
      "nodeId": "node_003",
      "subject": "Your first week recap",
      "stats": { "sent": 18, "delivered": 18, "bounced": 0, "opened": 10, "clicked": 0, "unsubscribed": 0, "deliveryRate": 100, "bounceRate": 0, "openRate": 55.56, "clickRate": 0, "unsubscribeRate": 0 },
      "failedCount": 0,
      "failedSubscribers": []
    }
  ]
}
{
  "success": false,
  "error": "Invalid period. Must be one of: 1h, 24h, 7d, 30d, 90d"
}
{ "success": false, "error": "Unauthorized" }
{ "success": false, "error": "Sequence not found" }
{ "success": false, "error": "Internal server error" }