call.started
The first event of a call, POSTed to the number's events_url when the call starts ringing.
The first event of a call, POSTed to the number's events_url when the call starts ringing.
call.started is the first event of a call, sent when the call starts ringing. Its callSessionState is Ringing (or Dialing when Sautikit is dialling out).
Call events are POSTed to the events_url on the number's routing, which you set with PUT /v1/numbers/{id}/routing. They are not workspace webhooks: you cannot subscribe to them with POST /v1/webhooks.
The body is flat JSON.
{
"callSessionState": "Ringing",
"direction": "Inbound",
"sessionId": "HD_24d73b4518bc",
"callerNumber": "+254720000000",
"clientDialedNumber": "+254720000001",
"destinationNumber": "+254720000001",
"callStartTime": "2026-06-27+10:00:00",
"isActive": "1"
}| Field | Type | Description |
|---|---|---|
callSessionState | string | Ringing or Dialing for this event. |
direction | string | Inbound or Outbound. |
sessionId | string | The call's id, starting HD_. The same on every event of the call. GET /v1/calls/{id} accepts it. |
callerNumber | string | Who is calling. On an inbound call, the caller's number. |
clientDialedNumber | string | The number that was dialled. On an outbound call, the person you called. |
destinationNumber | string | Your Sautikit number, on inbound and outbound calls. |
callStartTime | string | When the call started. |
isActive | string | "1" while the call is live, "0" once it has ended. |
Other fields may be present.
events_url one time and is not retried. Respond within 5 seconds; the response body is ignored.X-Sautikit-* headers and no signature. Use an events_url with a path that is hard to guess, and confirm anything that matters with GET /v1/calls/{id}, passing the sessionId.callSessionState says which one it is.import express from "express";
const app = express();
app.use(express.json());
app.post("/sautikit/events", (req, res) => {
res.sendStatus(200); // answer first, then do the work
const event = req.body;
if (event.callSessionState === "Ringing") {
console.log(`Call ${event.sessionId} started: ${event.direction} from ${event.callerNumber}`);
// create the call in your own records
}
});events_url with PUT /v1/numbers/{id}/routing.GET /v1/calls/{id}.