. Create an API key under API keys.API reference · Integrations
Live events (SSE)
A Server-Sent Events stream of the same events, for dashboards and live tools.
Get a ticket for the event stream
/v1/events-ticketA single-use ticket for opening the event stream without putting the bearer token in a URL. Call it with your usual Authorization header, then open GET /v1/events?ticket=… (the returned url) with EventSource within 60 seconds.
Responses
- 200Ticket issued
Response fields
ticketstringrequiredurlstringrequiredexpires_atintegerrequired
- 401Unauthorized
curl -X POST "https://api.chatkomodo.com/v1/events-ticket" \
-H "Authorization: Bearer $CHATKOMODO_API_KEY"const res = await fetch('https://api.chatkomodo.com/v1/events-ticket', {
method: 'POST',
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.post(
"https://api.chatkomodo.com/v1/events-ticket",
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('POST', 'https://api.chatkomodo.com/v1/events-ticket', [
'headers' => [
'Authorization' => 'Bearer ' . getenv('CHATKOMODO_API_KEY'),
],
]);
print_r(json_decode((string) $res->getBody(), true));{
"ticket": "string",
"url": "https://example.com/file.jpg",
"expires_at": 1767225600000
}Open the event stream (SSE)
/v1/eventsTicket or token in the URLServer-Sent Events (text/event-stream) for the calling business: each event has a name and a JSON data line. Names: the webhook events (message.received, message.sent, message.failed, session.connected, session.disconnected, session.alert, qr.generated, with the same envelope as webhooks) plus blast.progress, blast.waiting, blast.paused, blast.completed, scheduled.sent and recurring.executed. Authenticate with ?ticket= from POST /v1/events-ticket (preferred) or ?token=<API key or dashboard token>. Reconnect when the connection drops; events sent while disconnected are not replayed (use webhooks for guaranteed delivery).
Responses
- 200SSE stream (text/event-stream)
- 401Ticket/token invalid
curl "https://api.chatkomodo.com/v1/events"const res = await fetch('https://api.chatkomodo.com/v1/events', {
method: 'GET',
});
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/events",
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/events', [
]);
print_r(json_decode((string) $res->getBody(), true));event: message.received
data: {"id":"evt_01JA5W9Q2R3S4T5V6W7X8Y9Z0A","type":"message.received","session_id":"01JA5V6Q8M2H7G4K9P3T0R1S2X","occurred_at":1767225600000,"data":{"chat_id":"[email protected]","message_type":"text","body":"Hello"}}