curl "https://tawked.com/v1/email/metrics?from=2026-10-01&to=2026-10-20&granularity=day" \
-H "Authorization: Bearer tk_live_xxxxxxxxxxxxxxxxxxxx"const res = await fetch("https://tawked.com/v1/email/metrics?from=2026-10-01&to=2026-10-20&granularity=day", {
headers: {
Authorization: "Bearer tk_live_xxxxxxxxxxxxxxxxxxxx",
},
});
const data = await res.json();<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://tawked.com/v1/email/metrics",
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;
}import requests
res = requests.get(
"https://tawked.com/v1/email/metrics?from=2026-10-01&to=2026-10-20&granularity=day",
headers={"Authorization": "Bearer tk_live_xxxxxxxxxxxxxxxxxxxx"},
)
data = res.json(){
"from": "2026-10-01",
"to": "2026-10-20",
"timezone": "Asia/Riyadh",
"granularity": "day",
"domain": null,
"totals": {
"sent": 1200,
"delivered": 1180,
"delivery_delayed": 3,
"bounced": 12,
"bounced_permanent": 9,
"bounced_transient": 3,
"complained": 1,
"failed": 2,
"suppressed": 4,
"opened": 800,
"unique_opened": 510,
"clicked": 120,
"unique_clicked": 90,
"open_tracked_targets": 1100,
"click_tracked_targets": 1100
},
"rates": {
"delivery_rate": 0.9833,
"bounce_rate": 0.01,
"complaint_rate": 0.0008,
"open_rate": 0.4636,
"click_rate": 0.0818
},
"data": [
{
"period": "2026-10-01",
"sent": 60,
"delivered": 59,
"delivery_delayed": 0,
"bounced": 1,
"bounced_permanent": 1,
"bounced_transient": 0,
"complained": 0,
"failed": 0,
"suppressed": 0,
"opened": 40,
"unique_opened": 26,
"clicked": 6,
"unique_clicked": 5,
"open_tracked_targets": 55,
"click_tracked_targets": 55
}
]
}{
"error": "invalid_request",
"message": "The range is at most 366 days",
"field": "from"
}{
"error": "unauthorized"
}{
"error": "live_key_required"
}{
"error": "not_found"
}{
"error": "email_access_required"
}{
"error": "too_many_requests"
}{
"error": "internal_error"
}Get email metrics
The application’s e-mail figures by Riyadh day, Sunday week or month, from the daily rollup Tawked keeps for good: sent, delivered, delayed, bounced (permanent and transient), complained, failed, suppressed, opened and clicked, with the rates. Counts are e-mails (recipients). Opens and clicks are counted in targets: a message sent to several people in one call counts as one target, since one pixel serves them all. Every period of the range is present, zeros included; the day in progress too, refreshed every five minutes. Test messages never count. A live key of the application with email:read (or email:send, or email:manage).
curl "https://tawked.com/v1/email/metrics?from=2026-10-01&to=2026-10-20&granularity=day" \
-H "Authorization: Bearer tk_live_xxxxxxxxxxxxxxxxxxxx"const res = await fetch("https://tawked.com/v1/email/metrics?from=2026-10-01&to=2026-10-20&granularity=day", {
headers: {
Authorization: "Bearer tk_live_xxxxxxxxxxxxxxxxxxxx",
},
});
const data = await res.json();<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://tawked.com/v1/email/metrics",
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;
}import requests
res = requests.get(
"https://tawked.com/v1/email/metrics?from=2026-10-01&to=2026-10-20&granularity=day",
headers={"Authorization": "Bearer tk_live_xxxxxxxxxxxxxxxxxxxx"},
)
data = res.json(){
"from": "2026-10-01",
"to": "2026-10-20",
"timezone": "Asia/Riyadh",
"granularity": "day",
"domain": null,
"totals": {
"sent": 1200,
"delivered": 1180,
"delivery_delayed": 3,
"bounced": 12,
"bounced_permanent": 9,
"bounced_transient": 3,
"complained": 1,
"failed": 2,
"suppressed": 4,
"opened": 800,
"unique_opened": 510,
"clicked": 120,
"unique_clicked": 90,
"open_tracked_targets": 1100,
"click_tracked_targets": 1100
},
"rates": {
"delivery_rate": 0.9833,
"bounce_rate": 0.01,
"complaint_rate": 0.0008,
"open_rate": 0.4636,
"click_rate": 0.0818
},
"data": [
{
"period": "2026-10-01",
"sent": 60,
"delivered": 59,
"delivery_delayed": 0,
"bounced": 1,
"bounced_permanent": 1,
"bounced_transient": 0,
"complained": 0,
"failed": 0,
"suppressed": 0,
"opened": 40,
"unique_opened": 26,
"clicked": 6,
"unique_clicked": 5,
"open_tracked_targets": 55,
"click_tracked_targets": 55
}
]
}{
"error": "invalid_request",
"message": "The range is at most 366 days",
"field": "from"
}{
"error": "unauthorized"
}{
"error": "live_key_required"
}{
"error": "not_found"
}{
"error": "email_access_required"
}{
"error": "too_many_requests"
}{
"error": "internal_error"
}Authorizations
Authorization: Bearer . An application key (tk_live_, tk_test_) has full access, which covers every product and any product added later, or custom access, chosen when the key is created: one or more of the scopes verify:check, verify:send (includes verify:check), notifications:read, notifications:send (includes notifications:read), email:read, email:send (includes email:read), email:manage (includes email:send), webhooks:manage, email:inbound, notifications:templates (includes notifications:read), chat:menus, chat:attendant. No key made on the API keys page holds notifications:templates, full access included: the three template writes answer such a key 403 insufficient_scope. A connected app's key holds it. Nor chat:menus: the five conversation menu operations answer such a key 403 insufficient_scope, and a connected app's key holds it once the client approved it. Nor chat:attendant: the five auto-attendant operations answer such a key 403 insufficient_scope too, and a connected app's key holds it once the client approved it. email:manage and webhooks:manage are held only by a key someone chose them for: a full-access key, old or new, never holds them. email:inbound, which reads, deletes and forwards received e-mail, is opt-in on every key, full access included: a key holds it only when it was turned on when the key was created. A call outside the key's access answers 403 insufficient_scope and names the scope it needs in the WWW-Authenticate response header. A partner key (tk_partner_) always has full access. Whatever its access, a key is a server-side secret.
Query Parameters
The first Riyadh day, YYYY-MM-DD; 30 days before to by default.
The last Riyadh day, YYYY-MM-DD; today by default. At most 366 days after from.
day (the default), week (weeks start on Sunday) or month.
One domain of the application, by id or name (removed ones included).
Only Asia/Riyadh: metrics are counted on Riyadh days.