. Create an API key under API keys.API reference · Account
Analytics & usage
Today's counters
/v1/statsCounters for the dashboard home: devices, messages since midnight (server time), running blasts and active auto-reply rules. Scoped to the tenant.
Responses
- 200Counters
Response fields
sessions_totalintegerrequiredDevices of the tenantsessions_connectedintegerrequiredDevices currently connectedmessages_sent_todayintegerrequiredOutbound messages with statussent,deliveredorreadmessages_received_todayintegerrequiredmessages_failed_todayintegerrequiredblasts_runningintegerrequiredauto_reply_activeintegerrequiredActive auto-reply rules
- 401Missing, invalid or expired credentials
curl "https://api.chatkomodo.com/v1/stats" \
-H "Authorization: Bearer $CHATKOMODO_API_KEY"const res = await fetch('https://api.chatkomodo.com/v1/stats', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.CHATKOMODO_API_KEY}`,
},
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.code}: ${data.error}`);
console.log(data);import os
import requests
res = requests.get(
"https://api.chatkomodo.com/v1/stats",
headers={
"Authorization": f"Bearer {os.environ['CHATKOMODO_API_KEY']}",
},
timeout=30,
)
res.raise_for_status()
print(res.json())<?php
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client();
$res = $client->request('GET', 'https://api.chatkomodo.com/v1/stats', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('CHATKOMODO_API_KEY'),
],
]);
print_r(json_decode((string) $res->getBody(), true));{
"sessions_total": 12,
"sessions_connected": 1,
"messages_sent_today": 12,
"messages_received_today": 1,
"messages_failed_today": 1,
"blasts_running": 1,
"auto_reply_active": 1
}Plan usage this month
/v1/usageMessages sent and devices used against the plan limits for the current month (UTC), plus what the month would cost in the tenant's billing currency (minor units): plan price and overage beyond the quota.
Responses
- 200Usage
Response fields
periodstringrequiredYYYY-MM(UTC)planstring | nullrequiredPlan name, or null when the tenant has no plansessionsintegerrequiredDevices of the tenantmax_sessionsinteger | nullrequiredDevice limit of the planmessages_usedintegerrequiredMessages sent this monthmessages_quotaintegerrequiredMonthly message quota; 0 = unlimitedmessages_remaininginteger | nullrequiredQuota minus used (never negative); null when unlimitedsend_per_minuteintegerrequiredRequests per minute the plan allows onPOST …messages…, per API keybillingobject | nullrequirednull when the tenant has no plan or the plan has no pricebilling.currencystringrequiredISO 4217 codebilling.plan_minorintegerrequiredPlan price in minor units ofcurrencybilling.overage_messagesintegerrequiredMessages beyond the quotabilling.overage_minorintegerrequiredOverage charge in minor unitsbilling.amount_due_minorintegerrequiredplan_minor+overage_minor
- 401Missing, invalid or expired credentials
curl "https://api.chatkomodo.com/v1/usage" \
-H "Authorization: Bearer $CHATKOMODO_API_KEY"const res = await fetch('https://api.chatkomodo.com/v1/usage', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.CHATKOMODO_API_KEY}`,
},
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.code}: ${data.error}`);
console.log(data);import os
import requests
res = requests.get(
"https://api.chatkomodo.com/v1/usage",
headers={
"Authorization": f"Bearer {os.environ['CHATKOMODO_API_KEY']}",
},
timeout=30,
)
res.raise_for_status()
print(res.json())<?php
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client();
$res = $client->request('GET', 'https://api.chatkomodo.com/v1/usage', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('CHATKOMODO_API_KEY'),
],
]);
print_r(json_decode((string) $res->getBody(), true));{
"period": "string",
"plan": "string",
"sessions": 1,
"max_sessions": 1,
"messages_used": 12,
"messages_quota": 1,
"messages_remaining": 1,
"send_per_minute": 1,
"billing": {
"currency": "IDR",
"plan_minor": 1,
"overage_messages": 1,
"overage_minor": 1,
"amount_due_minor": 150000
}
}Message analytics for 7, 30 or 90 days
/v1/analyticsMessage counts for the last N days (including today), a per-day series, an inbound heatmap (weekday x hour), the 10 busiest chats and the average time to reply in 1:1 chats. Day boundaries follow the tenant's business timezone. The result is computed at most once a minute per tenant and window (later calls within the minute get the same answer).
Query parameters
daysstringWindow length in days
Responses
- 200Analytics
Response fields
daysintegerrequiredtotalsobjectrequiredtotals.sentintegerrequiredOutbound messages with statussent,deliveredorreadtotals.receivedintegerrequiredtotals.failedintegerrequiredtotals.deliveredintegerrequiredOutbound messages delivered or readtotals.readintegerrequiredOutbound messages readdailyarray of objectrequiredOne entry per day, oldest firstdaily[].datestringrequiredYYYY-MM-DDin the business timezonedaily[].sentintegerrequireddaily[].receivedintegerrequireddaily[].failedintegerrequiredheatmaparray of array of integerrequiredInbound messages: 7 rows (weekday, 0 = Sunday) of 24 columns (hour of day, business timezone)top_chatsarray of objectrequiredUp to 10 chats by message counttop_chats[].chat_idstringrequiredtop_chats[].countintegerrequiredavg_response_msinteger | nullrequiredAverage time from a customer's message to the next reply in 1:1 chats, or null when there is no data
- 400
daysis not 7, 30 or 90 (VALIDATION_FAILED) - 401Missing, invalid or expired credentials
curl "https://api.chatkomodo.com/v1/analytics" \
-H "Authorization: Bearer $CHATKOMODO_API_KEY"const res = await fetch('https://api.chatkomodo.com/v1/analytics', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.CHATKOMODO_API_KEY}`,
},
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.code}: ${data.error}`);
console.log(data);import os
import requests
res = requests.get(
"https://api.chatkomodo.com/v1/analytics",
headers={
"Authorization": f"Bearer {os.environ['CHATKOMODO_API_KEY']}",
},
timeout=30,
)
res.raise_for_status()
print(res.json())<?php
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client();
$res = $client->request('GET', 'https://api.chatkomodo.com/v1/analytics', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('CHATKOMODO_API_KEY'),
],
]);
print_r(json_decode((string) $res->getBody(), true));{
"days": 1,
"totals": {
"sent": 12,
"received": 1,
"failed": 1,
"delivered": 1,
"read": 1
},
"daily": [
{
"date": "string",
"sent": 12,
"received": 1,
"failed": 1
}
],
"heatmap": [
[
1
]
],
"top_chats": [
{
"chat_id": "+447700900123",
"count": 12
}
],
"avg_response_ms": 1767225600000
}Customer-satisfaction results
/v1/csat/resultsRatings (1-5) collected by the satisfaction survey over the last N days: count, average, distribution and the 50 most recent ratings.
Query parameters
daysintegerWindow in days; values outside 1-365 are clamped
Responses
- 200Results
Response fields
countintegerrequiredRatings receivedavgnumberrequiredAverage rating, rounded to 2 decimals; 0 when there are nonedistributionobjectrequiredRatings per score: keys1to5recentarray of objectrequiredrecent[].session_idstringrequiredrecent[].chat_idstringrequiredrecent[].ratingintegerrequiredrecent[].created_atintegerrequiredWhen the customer answered
- 401Missing, invalid or expired credentials
curl "https://api.chatkomodo.com/v1/csat/results" \
-H "Authorization: Bearer $CHATKOMODO_API_KEY"const res = await fetch('https://api.chatkomodo.com/v1/csat/results', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.CHATKOMODO_API_KEY}`,
},
});
const data = await res.json();
if (!res.ok) throw new Error(`${data.code}: ${data.error}`);
console.log(data);import os
import requests
res = requests.get(
"https://api.chatkomodo.com/v1/csat/results",
headers={
"Authorization": f"Bearer {os.environ['CHATKOMODO_API_KEY']}",
},
timeout=30,
)
res.raise_for_status()
print(res.json())<?php
require 'vendor/autoload.php';
$client = new GuzzleHttp\Client();
$res = $client->request('GET', 'https://api.chatkomodo.com/v1/csat/results', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('CHATKOMODO_API_KEY'),
],
]);
print_r(json_decode((string) $res->getBody(), true));{
"count": 12,
"avg": 0.5,
"distribution": {},
"recent": [
{
"session_id": "YOUR_DEVICE_ID",
"chat_id": "+447700900123",
"rating": 1,
"created_at": 1767225600000
}
]
}