Campaign analytics
Returns detailed campaign analytics including:
- Overall campaign stats (sent, opened, clicked, bounced, replied, unsubscribed)
- Main-sequence step analytics and frontend-compatible A/B variant breakdowns
- Lead status breakdown (active, completed, bounced, etc.)
- Total replied and positive replied counts
Without from/to, returns all-time data. Supply one or both to filter by date range.
Date filters on sent/opened/clicked/bounced step totals are scoped to email send date; replies are scoped to reply date.
curl -X GET "https://api.sendkit.ai/v1/campaigns/example_string/analytics?from=2024-05-01&to=2024-05-31" \
-H "Content-Type: application/json" \
-H "X-Api-Key: YOUR_API_KEY"
import requests
import json
url = "https://api.sendkit.ai/v1/campaigns/example_string/analytics?from=2024-05-01&to=2024-05-31"
headers = {
"Content-Type": "application/json",
"X-Api-Key": "YOUR_API_KEY"
}
response = requests.get(url, headers=headers)
print(response.json())
const response = await fetch("https://api.sendkit.ai/v1/campaigns/example_string/analytics?from=2024-05-01&to=2024-05-31", {
method: "GET",
headers: {
"Content-Type": "application/json",
"X-Api-Key": "YOUR_API_KEY"
}
});
const data = await response.json();
console.log(data);
package main
import (
"fmt"
"net/http"
)
func main() {
req, err := http.NewRequest("GET", "https://api.sendkit.ai/v1/campaigns/example_string/analytics?from=2024-05-01&to=2024-05-31", nil)
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
req.Header.Set("X-Api-Key", "YOUR_API_KEY")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println("Response Status:", resp.Status)
}
require 'net/http'
require 'json'
uri = URI('https://api.sendkit.ai/v1/campaigns/example_string/analytics?from=2024-05-01&to=2024-05-31')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
request['Content-Type'] = 'application/json'
request['X-Api-Key'] = 'YOUR_API_KEY'
response = http.request(request)
puts response.body
{
"success": true,
"data": {
"campaign": {
"id": "665a1b2c3d4e5f6a7b8c9d0e",
"name": "Q1 Outreach Campaign",
"status": "active",
"startedAt": "2025-06-15T09:00:00.000Z"
},
"stats": {
"sent": 150,
"delivered": 145,
"opened": 72,
"clicked": 18,
"replied": 12,
"bounced": 5,
"failed": 0,
"unsubscribed": 2
},
"bySequence": {
"main": {
"sent": 130,
"opened": 60,
"clicked": 14,
"bounced": 4
},
"subsequence": {
"sent": 20,
"opened": 12,
"clicked": 4,
"bounced": 1
}
},
"stepAnalytics": [
{
"_id": {
"sequenceStep": 0,
"displayStep": 1,
"variant": "A"
},
"sent": 70,
"opened": 32,
"clicked": 8,
"bounced": 2,
"failed": 0,
"replied": 4,
"positiveReplied": 2,
"totalOpens": 50,
"totalClicks": 10
},
{
"_id": {
"sequenceStep": 0,
"displayStep": 1,
"variant": "B"
},
"sent": 60,
"opened": 28,
"clicked": 6,
"bounced": 2,
"failed": 0,
"replied": 3,
"positiveReplied": 1,
"totalOpens": 43,
"totalClicks": 7
}
],
"steps": [
{
"stepNumber": 0,
"displayStepNumber": 1,
"stepName": "Initial email",
"subject": "Quick question",
"isInThreadReply": false,
"sent": 130,
"opened": 60,
"openRate": "46.15",
"clicked": 14,
"clickRate": "10.77",
"replied": 7,
"replyRate": "5.56",
"positiveReplied": 3,
"positiveReplyRate": "42.86",
"bounced": 4,
"bounceRate": "3.08",
"failed": 0,
"failureRate": "0.00",
"totalOpens": 93,
"totalClicks": 17,
"avgOpensPerEmail": "0.72",
"avgClicksPerEmail": "0.13",
"variants": [
{
"label": "A",
"subject": "Quick question",
"sent": 70,
"opened": 32,
"openRate": "45.71",
"clicked": 8,
"clickRate": "11.43",
"replied": 4,
"replyRate": "5.88",
"positiveReplied": 2,
"positiveReplyRate": "50.00",
"bounced": 2,
"bounceRate": "2.86",
"failed": 0,
"failureRate": "0.00",
"totalOpens": 50,
"totalClicks": 10
},
{
"label": "B",
"subject": "Quick question - alternate",
"sent": 60,
"opened": 28,
"openRate": "46.67",
"clicked": 6,
"clickRate": "10.00",
"replied": 3,
"replyRate": "5.17",
"positiveReplied": 1,
"positiveReplyRate": "33.33",
"bounced": 2,
"bounceRate": "3.33",
"failed": 0,
"failureRate": "0.00",
"totalOpens": 43,
"totalClicks": 7
}
]
}
],
"subsequences": [
{
"id": "665c1b2c3d4e5f6a7b8c9d20",
"name": "Interested follow-up",
"trigger": {
"type": "ai_tag",
"value": "interested"
},
"enabled": true,
"archived": false,
"addedCount": 18,
"currentlyEnrolled": 9,
"stats": {
"sent": 20,
"opened": 12,
"clicked": 4,
"bounced": 1,
"replied": 5
},
"stepStats": [
{
"_id": 0,
"sent": 14,
"opened": 9,
"clicked": 3,
"bounced": 1
},
{
"_id": 1,
"sent": 6,
"opened": 3,
"clicked": 1,
"bounced": 0
}
]
}
],
"statusBreakdown": {
"active": 350,
"completed": 100,
"bounced": 5,
"unsubscribed": 2,
"replied": 12,
"removed": 31
},
"totalReplied": 12,
"totalPositiveReplied": 4
}
}
{
"success": false,
"error": {
"code": "NOT_FOUND",
"message": "Campaign not found"
}
}
/v1/campaigns/{campaignId}/analyticsTarget server for requests. Edit to use your own host.
Platform API key (sk_user_...) or Workspace API key (sk_...)
Campaign ID
Start date (ISO 8601 or date string). Omit for no lower bound.
End date (ISO 8601 or date string). Omit for no upper bound.
Request Preview
Response
Response will appear here after sending the request
Authentication
API Key for authentication. Platform API key (sk_user_...) or Workspace API key (sk_...)
Path Parameters
Campaign ID