curl "https://tawked.com/v1/partner/events?since=2026-09-26T00:00:00Z&limit=50" \
-H "Authorization: Bearer tk_partner_xxxxxxxxxxxxxxxxxxxx"const res = await fetch("https://tawked.com/v1/partner/events?since=2026-09-26T00:00:00Z&limit=50", {
headers: {
Authorization: "Bearer tk_partner_xxxxxxxxxxxxxxxxxxxx",
},
});
const data = await res.json();<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://tawked.com/v1/partner/events",
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/partner/events?since=2026-09-26T00:00:00Z&limit=50",
headers={"Authorization": "Bearer tk_partner_xxxxxxxxxxxxxxxxxxxx"},
)
data = res.json(){
"data": [
{
"id": "3b9e1c2a-7d4f-4e8b-9a1c-2f3e4d5c6b7a",
"event": "service.approved",
"external_id": "store_88",
"data": {
"service_id": "c2a10f3e-8b7a-4d2e-9c1a-1a2b3c4d5e6f",
"application_id": "c2a10f3e-8b7a-4d2e-9c1a-1a2b3c4d5e6f",
"external_id": "store_88",
"status": "active"
},
"created_at": "2026-09-26T09:00:00.000Z",
"delivery": {
"id": "6d2b4b8a-9c3e-4a5b-8f2a-0f4c9c0e7a1d",
"status": "delivered",
"attempts": 1,
"delivered_at": "2026-09-26T09:00:01.250Z"
}
},
{
"id": "4c0f2d3b-8e5a-4f9c-8b2d-3a4f5e6d7c8b",
"event": "balance.low",
"external_id": null,
"data": {
"balance_halalas": 4200,
"threshold_halalas": 10000
},
"created_at": "2026-09-26T09:05:00.000Z",
"delivery": null
}
],
"next_cursor": "eyJzZXEiOjQyfQ",
"has_more": false
}{
"error": "invalid_request",
"fields": [
"cursor"
]
}{
"error": "unauthorized"
}{
"error": "ip_not_allowed"
}{
"error": "too_many_requests"
}{
"error": "internal_error"
}Get the event feed
Your event log as a feed, oldest first: every lifecycle and balance event whether or not a webhook delivered it, plus the verification events you subscribed to. Poll it instead of running a webhook, or catch up after an outage: keep next_cursor and pass it back as cursor; it points after the last row you received whether or not more rows exist now, and has_more says whether a page is waiting. Rows younger than two seconds are held back so a saved cursor never skips one. At least once: dedupe by id.
curl "https://tawked.com/v1/partner/events?since=2026-09-26T00:00:00Z&limit=50" \
-H "Authorization: Bearer tk_partner_xxxxxxxxxxxxxxxxxxxx"const res = await fetch("https://tawked.com/v1/partner/events?since=2026-09-26T00:00:00Z&limit=50", {
headers: {
Authorization: "Bearer tk_partner_xxxxxxxxxxxxxxxxxxxx",
},
});
const data = await res.json();<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://tawked.com/v1/partner/events",
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/partner/events?since=2026-09-26T00:00:00Z&limit=50",
headers={"Authorization": "Bearer tk_partner_xxxxxxxxxxxxxxxxxxxx"},
)
data = res.json(){
"data": [
{
"id": "3b9e1c2a-7d4f-4e8b-9a1c-2f3e4d5c6b7a",
"event": "service.approved",
"external_id": "store_88",
"data": {
"service_id": "c2a10f3e-8b7a-4d2e-9c1a-1a2b3c4d5e6f",
"application_id": "c2a10f3e-8b7a-4d2e-9c1a-1a2b3c4d5e6f",
"external_id": "store_88",
"status": "active"
},
"created_at": "2026-09-26T09:00:00.000Z",
"delivery": {
"id": "6d2b4b8a-9c3e-4a5b-8f2a-0f4c9c0e7a1d",
"status": "delivered",
"attempts": 1,
"delivered_at": "2026-09-26T09:00:01.250Z"
}
},
{
"id": "4c0f2d3b-8e5a-4f9c-8b2d-3a4f5e6d7c8b",
"event": "balance.low",
"external_id": null,
"data": {
"balance_halalas": 4200,
"threshold_halalas": 10000
},
"created_at": "2026-09-26T09:05:00.000Z",
"delivery": null
}
],
"next_cursor": "eyJzZXEiOjQyfQ",
"has_more": false
}{
"error": "invalid_request",
"fields": [
"cursor"
]
}{
"error": "unauthorized"
}{
"error": "ip_not_allowed"
}{
"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
An ISO 8601 date or datetime: only events from then on. For the first call, when you have no cursor yet.
The next_cursor of the previous page: only events after it.
One event name, for example service.approved.
Your external_id: only the events of that application.
Page size, 1 to 100; 50 when omitted.