Campaigns
Get Campaign Analytics
Get delivery and engagement counts plus open, click, and bounce rates for a campaign using the AutoSend API.
GET
/
campaigns
/
{campaignId}
/
analytics
curl --request GET \
--url 'https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics' \
--header 'Authorization: Bearer <token>'
import requests
url = "https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.json())
const response = await fetch(
'https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics',
{
method: 'GET',
headers: {
Authorization: 'Bearer <token>',
},
}
);
const data = await response.json();
console.log(data);
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer <token>',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics", nil)
req.Header.Set("Authorization", "Bearer <token>")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics"))
.header("Authorization", "Bearer <token>")
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
require 'net/http'
require 'uri'
require 'json'
uri = URI('https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer <token>'
response = http.request(request)
puts JSON.parse(response.body)
{
"success": true,
"data": {
"campaignId": "69d348dd0351e0c32be90342",
"name": "Spring Sale Newsletter",
"status": "sent",
"sentAt": "2026-04-06T05:54:51.190Z",
"counts": {
"totalContacts": 200,
"suppressed": 2,
"failed": 0,
"attempted": 198,
"sent": 198,
"delivered": 196,
"opened": 120,
"humanOpened": 88,
"clicked": 34,
"bounced": 2,
"unsubscribed": 1,
"spamReported": 0
},
"rates": {
"openRate": 61.22,
"clickRate": 17.35,
"bounceRate": 1.01,
"unsubscribedRate": 0.51,
"complaintRate": 0,
"successRate": 100,
"deliveryRate": 98.99,
"trueOpenRate": 44.9
},
"tracking": {
"open": true,
"click": true
},
"refreshedAt": "2026-04-06T07:26:09.190Z"
},
"message": "Campaign analytics retrieved successfully"
}
{
"success": false,
"error": {
"message": "Campaign not found",
"code": "CAMPAIGN_NOT_FOUND",
"details": "No campaign matching the provided ID was found in this project."
}
}
curl --request GET \
--url 'https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics' \
--header 'Authorization: Bearer <token>'
import requests
url = "https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.json())
const response = await fetch(
'https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics',
{
method: 'GET',
headers: {
Authorization: 'Bearer <token>',
},
}
);
const data = await response.json();
console.log(data);
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer <token>',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics", nil)
req.Header.Set("Authorization", "Bearer <token>")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics"))
.header("Authorization", "Bearer <token>")
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
require 'net/http'
require 'uri'
require 'json'
uri = URI('https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer <token>'
response = http.request(request)
puts JSON.parse(response.body)
{
"success": true,
"data": {
"campaignId": "69d348dd0351e0c32be90342",
"name": "Spring Sale Newsletter",
"status": "sent",
"sentAt": "2026-04-06T05:54:51.190Z",
"counts": {
"totalContacts": 200,
"suppressed": 2,
"failed": 0,
"attempted": 198,
"sent": 198,
"delivered": 196,
"opened": 120,
"humanOpened": 88,
"clicked": 34,
"bounced": 2,
"unsubscribed": 1,
"spamReported": 0
},
"rates": {
"openRate": 61.22,
"clickRate": 17.35,
"bounceRate": 1.01,
"unsubscribedRate": 0.51,
"complaintRate": 0,
"successRate": 100,
"deliveryRate": 98.99,
"trueOpenRate": 44.9
},
"tracking": {
"open": true,
"click": true
},
"refreshedAt": "2026-04-06T07:26:09.190Z"
},
"message": "Campaign analytics retrieved successfully"
}
{
"success": false,
"error": {
"message": "Campaign not found",
"code": "CAMPAIGN_NOT_FOUND",
"details": "No campaign matching the provided ID was found in this project."
}
}
Authorizations
string | header
required
Bearer authentication header of the form Bearer
<token>, where <token> is your auth token.Path Parameters
string
required
The id of the campaign to get analytics for. Returns
404 if the campaign does not exist, was deleted, or belongs to another project.Response
Returns delivery and engagement counts for the campaign, plus rates calculated by AutoSend.Metrics are refreshed in the background, at most every 10 minutes, while a campaign is sending and for about 20 days after it’s sent. The response returns the latest stored numbers right away.
refreshedAt shows when they were last updated.boolean
Indicates whether the request was successful.
object
The campaign analytics object.
Show data
Show data
string
Unique identifier of the campaign.
string
Display name of the campaign.
string
Current status of the campaign. One of:
draft, scheduled, sending, sending_gradual, paused, sent, failed, aborted.string | null
ISO 8601 timestamp when the campaign was sent. Null if the campaign has not been sent yet, including gradual campaigns that are still sending.
object
Raw delivery and engagement counts.
Show counts
Show counts
number
Total number of contacts the campaign targets.
number
Number of contacts skipped because they are suppressed.
number
Number of emails that failed to send.
number
Number of emails AutoSend tried to send. Equal to
totalContacts minus suppressed and failed, and never below 0. For a campaign in sending_gradual status, only contacts processed so far are counted.number
Number of emails sent.
number
Number of emails delivered.
number
Number of unique recipients who opened the email, including automated opens.
number
Number of unique recipients with at least one open from a real person. Opens that happen within a few seconds of delivery are treated as automated (for example, Apple Mail Privacy Protection, image proxies, or security scanners) and left out.
number
Number of unique recipients who clicked a link.
number
Number of emails that bounced.
number
Number of recipients who unsubscribed.
number
Number of recipients who marked the email as spam.
object
Rates as percentages from
0 to 100, rounded to 2 decimal places. A rate is 0 when its base count is 0.Show rates
Show rates
number
opened divided by delivered. Includes automated opens.number
clicked divided by delivered.number
bounced divided by sent.number
unsubscribed divided by delivered.number
spamReported divided by delivered.number
sent divided by attempted.number
delivered divided by sent.number
humanOpened divided by delivered. Gives a more accurate open rate than openRate because automated opens are left out.object
string | null
ISO 8601 timestamp when the metrics were last refreshed. Null if the campaign has never been refreshed.
string
A human-readable message describing the result.
Was this page helpful?
⌘I
curl --request GET \
--url 'https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics' \
--header 'Authorization: Bearer <token>'
import requests
url = "https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.json())
const response = await fetch(
'https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics',
{
method: 'GET',
headers: {
Authorization: 'Bearer <token>',
},
}
);
const data = await response.json();
console.log(data);
<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => 'https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer <token>',
],
]);
$response = curl_exec($curl);
curl_close($curl);
echo $response;
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics", nil)
req.Header.Set("Authorization", "Bearer <token>")
client := &http.Client{}
resp, _ := client.Do(req)
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
public class Main {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics"))
.header("Authorization", "Bearer <token>")
.GET()
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
}
}
require 'net/http'
require 'uri'
require 'json'
uri = URI('https://api.autosend.com/v1/campaigns/60d5ec49f1b2c72d9c8b4567/analytics')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
request = Net::HTTP::Get.new(uri)
request['Authorization'] = 'Bearer <token>'
response = http.request(request)
puts JSON.parse(response.body)
{
"success": true,
"data": {
"campaignId": "69d348dd0351e0c32be90342",
"name": "Spring Sale Newsletter",
"status": "sent",
"sentAt": "2026-04-06T05:54:51.190Z",
"counts": {
"totalContacts": 200,
"suppressed": 2,
"failed": 0,
"attempted": 198,
"sent": 198,
"delivered": 196,
"opened": 120,
"humanOpened": 88,
"clicked": 34,
"bounced": 2,
"unsubscribed": 1,
"spamReported": 0
},
"rates": {
"openRate": 61.22,
"clickRate": 17.35,
"bounceRate": 1.01,
"unsubscribedRate": 0.51,
"complaintRate": 0,
"successRate": 100,
"deliveryRate": 98.99,
"trueOpenRate": 44.9
},
"tracking": {
"open": true,
"click": true
},
"refreshedAt": "2026-04-06T07:26:09.190Z"
},
"message": "Campaign analytics retrieved successfully"
}
{
"success": false,
"error": {
"message": "Campaign not found",
"code": "CAMPAIGN_NOT_FOUND",
"details": "No campaign matching the provided ID was found in this project."
}
}