Skip to Content

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

{ "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

CodeCauseFix
INVALID_REQUESTMalformed JSON or missing required fieldRead message
INVALID_AMOUNTNon-positive amount on a wallet rechargePass amount > 0
INVALID_PARAMPath / query param doesn’t parseCheck the URL
MISSING_PARAMRequired param missingRead message
FROM_NOT_VERIFIEDfrom address not on a verified identityVerify domain via POST /identities
BILLING_INCOMPLETEPartner profile missing required fieldsFill PUT /partner/self/billing
BILLING_NOT_SET_UPZoho customer not yet createdSave billing once via PUT /partner/self/billing
INVALID_SIGNATUREHMAC check on payment-verify failedDon’t tamper with payment widget output
BAD_RECIPIENTRecipient address malformedValidate before send
TOO_MANY_RECIPIENTSPer-message recipient cap exceeded (50)Split into multiple sends

401 Unauthorized

CodeCauseFix
MISSING_AUTHNo Authorization headerAdd Authorization: Bearer pk_live_...
INVALID_KEY_FORMATKey doesn’t match pk_live_...Regenerate from partner panel
KEY_NOT_FOUNDKey was revoked or never existedRegenerate
KEY_INACTIVEAccount suspendedContact support

402 Payment Required

CodeCauseFix
INSUFFICIENT_BALANCEWallet balance < send priceRecharge wallet

403 Forbidden

CodeCauseFix
IP_BLOCKEDYour IP isn’t on your account’s IP allowlistAdd to allowlist or call from an allowed IP
SENDING_PAUSEDAccount paused (admin OR reputation auto-pause)Contact support / clean lists
SANDBOX_QUOTA_REACHEDDaily 200/day sandbox cap hitRequest production access
FEATURE_LOCKEDPlan doesn’t include this featureUpgrade plan

404 Not Found

CodeCauseFix
PARTNER_NOT_FOUNDPartner ID doesn’t existCheck the ID
IDENTITY_NOT_FOUNDIdentity hasn’t been createdCreate via POST /identities
CONFIG_SET_NOT_FOUNDConfiguration set name unknownCheck name spelling
TEMPLATE_NOT_FOUNDTemplate name not registeredCreate via POST /templates
MESSAGE_NOT_FOUNDmessage_id doesn’t match any sendCheck the ID + day_bucket

409 Conflict

CodeCauseFix
EMAIL_ALREADY_REGISTEREDSignup with already-used emailUse forgot-password to recover
IDENTITY_EXISTSAlready verified — duplicate POSTIdempotent — existing row returned
CONFIG_SET_NAME_TAKENAnother set with that name existsPick a unique name

429 Too Many Requests

CodeCauseFix
RATE_LIMITEDPer-second send rate exceededBackoff and retry
OTP_RATE_LIMITEDOTP resend before cooldownWait 60 seconds

500 Internal Server Error

CodeCauseFix
DB_ERRORDatabase query failedRetry with backoff — usually transient
INTERNAL_ERRORCatch-allRetry once; if persistent, contact support
PAYMENT_GATEWAY_ERRORZoho upstream returned 5xxRetry — usually transient

502 Bad Gateway

CodeCauseFix
PAYMENT_GATEWAY_ERRORZoho returned an error responseWait + retry; check Zoho status

503 Service Unavailable

CodeCauseFix
DB_UNAVAILABLEDatabase connection issueRetry — should clear within seconds

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:

CodeMeaning
550 5.1.1 user unknownRecipient doesn’t exist (hard bounce)
550 5.1.10 No such userSame — different MX wording
550 5.7.1 spam policyReceiver classified as spam (treat as complaint)
552 5.2.2 mailbox fullSoft bounce — retry
421 4.7.0 try again laterGreylisting / load — retry
554 5.7.1 sender rejectedSender domain blocked by recipient — list cleaning needed

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 support@splashifypro.in or open a ticket from the partner panel.