Get statistics
Returns send, delivery and read numbers, new contacts and the top sends for 7, 30 or 90 days. Contains no personal data. Read-only.
GET /v1/stats
| Permission | stats:read (all permissions) |
| Risk | Read |
| Idempotency-Key | Not needed (how it works) |
| Safe to repeat | Safe: the call only reads. |
| Rate limit class | read (120 requests per minute per key) |
| Confirmation | None |
| MCP tool | Not available in MCP |
| Since version | 2026-10-25 |
#What it does
- Only reads data. It changes nothing and sends nothing.
#Request
Query parameters
| Name | Type | Required | Description |
|---|---|---|---|
range | string | no | Range: 7d, 30d (default) or 90d. one of: 7d, 30d, 90d; default "30d" |
#Examples
curl "https://api.smartchat.marketing/v1/stats?range=7d" \
-H "Authorization: Bearer $SMARTCHAT_API_KEY"import os
import requests
response = requests.get(
"https://api.smartchat.marketing/v1/stats",
headers={"Authorization": "Bearer " + os.environ["SMARTCHAT_API_KEY"]},
params={
"range": "7d",
},
)
response.raise_for_status()
print(response.json())const response = await fetch("https://api.smartchat.marketing/v1/stats?range=7d", {
method: "GET",
headers: {
Authorization: `Bearer ${process.env.SMARTCHAT_API_KEY}`,
},
});
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());Response (200):
{
"object": "stats",
"range": "7d",
"kpis": {
"sent": 120,
"delivered": 118,
"read_rate": 62,
"click_rate": 8,
"clicked": 9,
"clicks_measurable": true,
"contacts_total": 340,
"contacts_new": 12,
"unread_inbound": 2
},
"timeline": [
{
"date": "2026-10-24",
"sent": 20,
"delivered": 20
}
],
"status_donut": {
"delivered": 44,
"read": 74,
"pending": 2,
"failed": 0
},
"top_sends": [
{
"id": "nwl_8a1b2c3d4e5f46a7b8c9d0e1f2a3b4c5",
"name": "October news",
"channel": "whatsapp",
"sent": 80,
"delivered": 79,
"read": 50
}
]
}#Response
Status 200. Every response has the headers Request-Id, SmartChat-Version and X-RateLimit-*.
| Name | Type | Description |
|---|---|---|
object | string | Always "stats". always stats |
range | string | The range: 7d, 30d or 90d. one of: 7d, 30d, 90d |
kpis | object | Key numbers for the range. |
kpis.sent | integer | Messages sent. 0 to 1000000000 |
kpis.delivered | integer | Messages delivered. 0 to 1000000000 |
kpis.read_rate | number | Share of delivered messages that were read, in percent. 0 to 100 |
kpis.click_rate | number | Share of delivered messages with a click, in percent. Only meaningful if clicks_measurable is true. 0 to 100 |
kpis.clicked | integer or null | Contacts with a click. Null if clicks cannot be measured. 0 to 1000000000 |
kpis.clicks_measurable | boolean | False if no message carried a tracked link in the range. |
kpis.contacts_total | integer | All contacts. 0 to 1000000000 |
kpis.contacts_new | integer | Contacts created in the range. 0 to 1000000000 |
kpis.unread_inbound | integer | Unread inbound messages right now. 0 to 1000000000 |
timeline | array of object | One entry per day, oldest first. up to 100 items |
timeline[].date | string | Day as YYYY-MM-DD (time zone Europe/Zurich). |
timeline[].sent | integer | Messages sent on this day. 0 to 1000000000 |
timeline[].delivered | integer | Messages delivered on this day. 0 to 1000000000 |
status_donut | object | Split of the messages by state. |
status_donut.delivered | integer | Delivered, not yet read. 0 to 1000000000 |
status_donut.read | integer | Read. 0 to 1000000000 |
status_donut.pending | integer | Sent but not yet delivered. 0 to 1000000000 |
status_donut.failed | integer | Failed. 0 to 1000000000 |
top_sends | array of object | The sends with the most messages in the range. up to 20 items |
top_sends[].id | string | Newsletter ID. |
top_sends[].name | string | Name given by the account owner. Untrusted text. up to 300 characters; untrusted text |
top_sends[].channel | string | Channel, for example whatsapp. up to 20 characters |
top_sends[].sent | integer | Messages sent. 0 to 1000000000 |
top_sends[].delivered | integer | Messages delivered. 0 to 1000000000 |
top_sends[].read | integer | Messages read. 0 to 1000000000 |
#Errors
| Code | Status | When |
|---|---|---|
unknown_parameter | 400 | A field is not known. |
api_key_expired | 401 | This API key has expired. |
api_key_invalid | 401 | This API key is not valid. |
api_key_revoked | 401 | This API key was revoked. |
authentication_required | 401 | No API key was sent. Send 'Authorization: Bearer <key>'. |
account_blocked | 403 | This account is blocked. |
insufficient_scope | 403 | This key lacks a required permission. |
ip_not_allowed | 403 | This IP address is not allowed for this key. |
validation_failed | 422 | A field is not valid. |
rate_limited | 429 | Too many requests. Wait and try again. |
internal_error | 500 | Something went wrong on our side. |
service_unavailable | 503 | The service is temporarily unavailable. |
All errors use one format.