ChatKomodo Docs Home Sign in

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

POST/v1/events-ticket

A 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
    • ticketstringrequired
    • urlstringrequired
    • expires_atintegerrequired
  • 401Unauthorized
Request
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));
Response 200
{
  "ticket": "string",
  "url": "https://example.com/file.jpg",
  "expires_at": 1767225600000
}

Open the event stream (SSE)

GET/v1/eventsTicket or token in the URL

Server-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
Request
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));
Response 200 (text/event-stream)
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"}}