Errors
Every error from the Email API has a stable error code + a
human-readable message. Build retry / error-handling logic against
the code, not the message.
Response shape
json
{
"success": false,
"error": "INSUFFICIENT_BALANCE",
"message": "Wallet balance ₹0.00. Recharge to continue sending."
}success: false is always present. error is the stable code.
message is for display + may change for clarity over time.
400 Bad Request
401 Unauthorized
402 Payment Required
403 Forbidden
404 Not Found
409 Conflict
429 Too Many Requests
500 Internal Server Error
502 Bad Gateway
503 Service Unavailable
SMTP errors (in webhook payloads)
When a Bounce event fires, the bounce.bouncedRecipients[].diagnosticCode
field carries the SMTP diagnostic from the recipient's MX. Common ones:
Retry strategy
Rule of thumb:
- 400-class errors: don't retry. Fix the request.
- 402: don't retry. Recharge first.
- 403 + 404: don't retry. Fix configuration first.
- 429: retry with exponential backoff (start 1s, double up to 60s).
- 500 / 502 / 503: retry up to 3 times with exponential backoff.
Idempotency: /send is NOT idempotent on retry — duplicate calls
with the same body will produce duplicate email sends. Implement
your own dedup against your business identifier (charge_id, etc.)
before calling /send.
When to contact support
- 500-class errors persist > 5 minutes
- 402 even though wallet balance shows positive
- 403 SENDING_PAUSED with no clear cause in
/reputation
Email [email protected] or open a ticket in Splashify Pro Email.