Errors
HTTP status codes, top-level reasons, and per-channel failures on POST /v1/send.
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. |
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