curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/emails/stats \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/emails/stats"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.base44.com/api/apps/{app_id}/emails/stats', 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://app.base44.com/api/apps/{app_id}/emails/stats",
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://app.base44.com/api/apps/{app_id}/emails/stats"
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://app.base44.com/api/apps/{app_id}/emails/stats")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/emails/stats")
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{
"days": 30,
"templates": [
{
"daily": [
{
"bounced": 1,
"clicked": 5,
"day": "2026-09-14",
"delivered": 41,
"opened": 18,
"sent": 42,
"spam": 0,
"unsubscribed": 0
}
],
"template_key": "Welcome",
"totals": {
"bounce_rate": 0.025,
"bounced": 31,
"clicked": 143,
"delivered": 1198,
"delivered_rate": 0.966,
"opened": 512,
"sent": 1240,
"spam": 2,
"unsubscribed": 4
},
"tracked": true
}
],
"totals": {
"sent": 1240,
"delivered": 1198,
"opened": 512,
"clicked": 143,
"bounced": 31,
"spam": 2,
"unsubscribed": 4,
"delivered_rate": 0.966,
"bounce_rate": 0.025
},
"previous_totals": {
"sent": 1240,
"delivered": 1198,
"opened": 512,
"clicked": 143,
"bounced": 31,
"spam": 2,
"unsubscribed": 4,
"delivered_rate": 0.966,
"bounce_rate": 0.025
},
"daily": [
{
"bounced": 1,
"clicked": 5,
"day": "2026-09-14",
"delivered": 41,
"opened": 18,
"sent": 42,
"spam": 0,
"unsubscribed": 0
}
],
"next_cursor": "eyJuIjoiYXBwX2VtYWlsX3N0YXRzIiwicCI6eyJhZnRlciI6IldlbGNvbWUifX0"
}Get email stats
Returns delivery and engagement counts for the emails the app sent, for each template and in total, over the last days days. Each count has a daily breakdown and the totals for the same number of days before, so you can compare periods.
Days are UTC. A send counts on the day it was sent, and a delivery, open or click on the day it happened, so a rate can include outcomes of emails sent before the period. Opens and clicks are counted only for emails sent with tracking on. Emails the app sends from its own email domain aren’t counted yet, so an app that sends from its own domain gets zeros for those.
templates is paginated. Pass next_cursor back as cursor, with the same days and limit, to get the next page. Every page carries the same app-wide totals, previous_totals and daily.
Email stats need a paid workspace plan.
This is limited to 60 requests per minute per app for each workspace’s personal API keys, so every key in a workspace shares one allowance. Some workspaces have a different limit. List email templates shares it.
curl --request GET \
--url https://app.base44.com/api/apps/{app_id}/emails/stats \
--header 'Authorization: Bearer <token>'import requests
url = "https://app.base44.com/api/apps/{app_id}/emails/stats"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://app.base44.com/api/apps/{app_id}/emails/stats', 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://app.base44.com/api/apps/{app_id}/emails/stats",
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://app.base44.com/api/apps/{app_id}/emails/stats"
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://app.base44.com/api/apps/{app_id}/emails/stats")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://app.base44.com/api/apps/{app_id}/emails/stats")
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{
"days": 30,
"templates": [
{
"daily": [
{
"bounced": 1,
"clicked": 5,
"day": "2026-09-14",
"delivered": 41,
"opened": 18,
"sent": 42,
"spam": 0,
"unsubscribed": 0
}
],
"template_key": "Welcome",
"totals": {
"bounce_rate": 0.025,
"bounced": 31,
"clicked": 143,
"delivered": 1198,
"delivered_rate": 0.966,
"opened": 512,
"sent": 1240,
"spam": 2,
"unsubscribed": 4
},
"tracked": true
}
],
"totals": {
"sent": 1240,
"delivered": 1198,
"opened": 512,
"clicked": 143,
"bounced": 31,
"spam": 2,
"unsubscribed": 4,
"delivered_rate": 0.966,
"bounce_rate": 0.025
},
"previous_totals": {
"sent": 1240,
"delivered": 1198,
"opened": 512,
"clicked": 143,
"bounced": 31,
"spam": 2,
"unsubscribed": 4,
"delivered_rate": 0.966,
"bounce_rate": 0.025
},
"daily": [
{
"bounced": 1,
"clicked": 5,
"day": "2026-09-14",
"delivered": 41,
"opened": 18,
"sent": 42,
"spam": 0,
"unsubscribed": 0
}
],
"next_cursor": "eyJuIjoiYXBwX2VtYWlsX3N0YXRzIiwicCI6eyJhZnRlciI6IldlbGNvbWUifX0"
}Authorizations
Personal access token, sent as Authorization: Bearer <token>.
Path Parameters
ID of the app the emails belong to.
Query Parameters
Number of days to count, from 1 to 90, ending today in UTC. Defaults to 30. The previous totals cover the same number of days just before.
1 <= x <= 90Maximum number of entries in templates per page, from 1 to 200. Defaults to 50.
1 <= x <= 200next_cursor from the previous page. Send the same days and limit with it. A cursor expires after 24 hours.
Response
The app's email stats.
Delivery and engagement counts for the app's sent emails.
Number of days counted, as requested.
30
Counts for each template that sent email in either period, ordered by template_key.
Show child attributes
Show child attributes
[
{
"daily": [
{
"bounced": 1,
"clicked": 5,
"day": "2026-09-14",
"delivered": 41,
"opened": 18,
"sent": 42,
"spam": 0,
"unsubscribed": 0
}
],
"template_key": "Welcome",
"totals": {
"bounce_rate": 0.025,
"bounced": 31,
"clicked": 143,
"delivered": 1198,
"delivered_rate": 0.966,
"opened": 512,
"sent": 1240,
"spam": 2,
"unsubscribed": 4
},
"tracked": true
}
]
Totals for the period across every template and emails sent without one, on every page.
Show child attributes
Show child attributes
Totals for the same number of days just before the period, or null when nothing was sent then.
Show child attributes
Show child attributes
One entry per day of the period, oldest first, with zeros on days with no activity. Covers every template, on every page.
Show child attributes
Show child attributes
[
{
"bounced": 1,
"clicked": 5,
"day": "2026-09-14",
"delivered": 41,
"opened": 18,
"sent": 42,
"spam": 0,
"unsubscribed": 0
}
]
Pass it as cursor to get the next page of templates, or null on the last page.
"eyJuIjoiYXBwX2VtYWlsX3N0YXRzIiwicCI6eyJhZnRlciI6IldlbGNvbWUifX0"
Was this page helpful?