Skip to content

Send status

2 min read

The send_status event notifies your server when a POST /v1/send with context.behaviour.mode: "async" finishes — success or failure. It is an account-wide webhook (channel API in the dashboard): not tied to a device, and it covers any channel mix in that one request (email only, Telegram only, WABA + email, and so on).

Set up in the dashboard

  1. Open Webhooks → WebhookAdd webhook.
  2. Choose channel API.
  3. Check the Send Status event.
  4. Save your HTTPS URL, then run a test on Webhooks → Test until status is Active.

This webhook is optional. mode: async works without it — Kirisan still records the result in your account logs. Use send_status only if your own server needs a completion notification. See the Send API.

When Kirisan POSTs

After an async send finishes (channel cascade completes), Kirisan sends one POST to each of your active send_status endpoints. The X-Kirisan-Event header is send_status. The X-Kirisan-Device header may be empty because this event is not device-bound.

Example payload

{
  "event": "send_status",
  "id": 98765,
  "request_id": 12345,
  "status": "sent",
  "channels": {
    "email": {
      "status": true,
      "id": 98766,
      "processing_time": "891ms"
    },
    "whatsapp": {
      "status": false,
      "id": 98765,
      "reason": "Device disconnected",
      "processing_time": "89ms"
    }
  },
  "timestamp": 1735689600,
  "production": true
}
FieldMeaning
eventAlways send_status
idPrimary send.id (integer — first sent channel, else first row)
request_idsend_log.id returned when the send was queued
statussent if at least one channel succeeded; failed if all failed or the request was blocked
channelsPer-channel result map — same shape as a sync POST /v1/send response (includes per-channel id = send.id)
timestampUnix seconds
productionfalse on Webhooks → Test; true for live traffic

Match request_id to your queued response to correlate the result with the original request.