| HTTP | Meaning | Notes |
|---|
200 | OK | Successful request. |
400 | Bad request | Invalid input the DTO didn't catch (e.g. bad phone number, unauthorized sender_id, invalid from/to date). |
401 | Unauthenticated | Missing/invalid API key, disabled org. |
402 | Payment required | Insufficient wallet balance (see below). |
404 | Not found | Unknown route, or a referenced resource (e.g. template) doesn't exist. |
422 | Validation failed | Request body failed validation; errors is a field→messages map. |
429 | Too many requests | Rate limit exceeded. |
502 | Bad gateway | The upstream SMS provider rejected/failed the request — retryable; you were not charged. |
500 | Server error | Unexpected; safe to retry later. |
Validation error (422) — errors maps each invalid field to its messages, and message echoes the first:{
"success": false,
"message": "SMS body is required",
"errors": {
"body": ["SMS body is required"],
"recipient": ["Recipient cannot exceed 20 characters"]
}
}
Unknown/extra fields in a request body are rejected (not silently ignored).Insufficient balance (402) carries a machine-readable code so you can branch on "top up":{
"success": false,
"message": "Insufficient wallet balance. Required: ₦8.00, Available: ₦2.00",
"errors": { "code": "insufficient_funds", "required": 8.00, "available": 2.00 }
}
Malformed JSON returns 400 with message: "Invalid request body: malformed JSON".Modified at 2026-06-23 08:45:10