Errors
Every Kirisan API response is JSON. Successful calls include "status": true. Failures include "status": false and a human-readable "reason" when the whole request failed before channel delivery.
HTTP status codes
| Status | When it happens |
|---|---|
200 | Request parsed — check "status" in the body (send may return 200 with "status": false and channel details) |
400 | Invalid JSON, missing fields, or validation error |
401 | Missing or invalid Bearer token |
403 | Bearer token valid but a channel key does not belong to your account |
503 | Service temporarily unavailable |
POST /v1/send usually returns HTTP 200 even when delivery fails — read "status" and "channels".
Top-level reason
These appear on the response root when the request never reached delivery, or when every channel failed in a blocking way:
| Reason (examples) | Meaning |
|---|---|
missing api token / invalid api token | Fix Authorization: Bearer … — see Authentication |
invalid JSON | Body is not valid JSON |
No channels configured | keys is empty — include at least one channel token |
content required | No content object with at least one channel |
no sendable channels: content requires a matching key | You set content.whatsapp but omitted keys.whatsapp, or similar |
Invalid schedule: the time is in the past. | context.timing.schedule must be a future Unix timestamp |
whatsapp key does not belong to this account | Channel token belongs to another user (403) |
Validation errors from message bodies are also returned as top-level "reason" before send — for example email inline messages are not supported on /v1/send or waba message type must be text, interactive, image, video, or document.
Per-channel errors (channels)
On POST /v1/send, each channel you attempted has its own object under "channels":
{
"status": false,
"channels": {
"whatsapp": {
"status": false,
"reason": "template is not approved for sending",
"processing_time": "142ms"
},
"email": {
"status": true,
"processing_time": "891ms"
}
}
} | Field | Meaning |
|---|---|
status | true if that channel delivered (or was scheduled) |
reason | Present when status is false — quota, missing target, template inactive, provider error, etc. For email, SMTP and transport errors are summarized into short readable sentences (for example Recipient address does not exist). Raw provider text is kept in internal logs only. Unrecognized email failures return Email could not be delivered. Quota messages such as insufficient quota and paid plan expired are returned unchanged. |
detail | Extra provider payload on some channels (WhatsApp, Telegram, WABA) |
processing_time | How long the provider call took |
scheduled | true when the message was queued for context.timing.schedule |
fallback | true when this channel sent as part of a fallback tier |
When one channel fails and another succeeds (for example WhatsApp fails, email fallback succeeds), top-level "status" may still be true if any channel delivered.
Template errors on send
When content.<channel>.template points to a dashboard template that cannot send:
| Reason | Meaning |
|---|---|
template is not approved for sending | Template is still pending review or was rejected |
template is inactive | Template exists but is turned off in the dashboard |
WhatsApp template not found | Wrong ID, wrong channel, or template belongs to another account |
Create templates under Channel → channel → Templates and confirm they are Approved and Active before referencing their ID on send.
Related
- Authentication — tokens and channel keys
- Send API — request shape and fallback behavior
- Send messages — same fallback tiers in the dashboard