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

url = "https://api.sequenzy.com/api/v1/metrics/campaigns/{campaignId}"

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/campaigns/{campaignId}', 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/campaigns/{campaignId}",
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/campaigns/{campaignId}"

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/campaigns/{campaignId}")
.header("Authorization", "Bearer <token>")
.asString();
require 'uri'
require 'net/http'

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

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,
  "campaignId": "camp_abc123",
  "stats": {
    "sent": 1200,
    "delivered": 1190,
    "bounced": 10,
    "opened": 420,
    "clicked": 85,
    "unsubscribed": 2,
    "deliveryRate": 99.17,
    "bounceRate": 0.83,
    "openRate": 35.29,
    "clickRate": 7.14,
    "unsubscribeRate": 0.17,
    "conversions": 12,
    "revenueCents": 84500
  }
}
{
  "success": false,
  "error": "Invalid period. Must be one of: 1h, 24h, 7d, 30d, 90d"
}
{ "success": false, "error": "Unauthorized" }
{ "success": false, "error": "Campaign not found" }
{ "success": false, "error": "Internal server error" }
Returns engagement metrics (sends, deliveries, bounces, opens, clicks, unsubscribes) plus attributed conversions and revenue for a single campaign. Optionally filter by time period. 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. GET /api/v1/campaigns/{campaignId}/stats is kept as a backward-compatible alias for this endpoint.

Path Parameters

campaignId
string
required
The ID of the campaign.

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
sentnumberEmails sent in the period
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 campaign (last-touch, 24h window)
revenueCentsnumberAttributed revenue in cents from purchase events (saas.purchase and ecommerce.order_placed)

Common Queries

How did our February newsletter perform?

curl "https://api.sequenzy.com/api/v1/metrics/campaigns/camp_abc123" \
 -H "Authorization: Bearer YOUR_API_KEY"
Without time filters, you get lifetime metrics for the campaign.

How many opens in the first 24 hours after send?

curl "https://api.sequenzy.com/api/v1/metrics/campaigns/camp_abc123?period=24h" \
 -H "Authorization: Bearer YOUR_API_KEY"
Useful to gauge initial engagement before the campaign matures.

Compare campaign performance over a specific week

curl "https://api.sequenzy.com/api/v1/metrics/campaigns/camp_abc123?start=2026-02-01T00:00:00Z&end=2026-02-08T00:00:00Z" \
 -H "Authorization: Bearer YOUR_API_KEY"

Who opened or clicked in this campaign?

Use the Get Recipients endpoint with a campaignId filter to see individual recipient engagement:
curl "https://api.sequenzy.com/api/v1/metrics/recipients?campaignId=camp_abc123" \
 -H "Authorization: Bearer YOUR_API_KEY"

Responses

{
  "success": true,
  "campaignId": "camp_abc123",
  "stats": {
    "sent": 1200,
    "delivered": 1190,
    "bounced": 10,
    "opened": 420,
    "clicked": 85,
    "unsubscribed": 2,
    "deliveryRate": 99.17,
    "bounceRate": 0.83,
    "openRate": 35.29,
    "clickRate": 7.14,
    "unsubscribeRate": 0.17,
    "conversions": 12,
    "revenueCents": 84500
  }
}
{
  "success": false,
  "error": "Invalid period. Must be one of: 1h, 24h, 7d, 30d, 90d"
}
{ "success": false, "error": "Unauthorized" }
{ "success": false, "error": "Campaign not found" }
{ "success": false, "error": "Internal server error" }