Payonclick Developer Docs
v1

Error Codes

Every error code the platform returns, and the fix for each.


HTTPcodeMeaning & fix
401MISSING_KEYAuthorization header absent or malformed
401EXPIRED_TIMESTAMPClock more than 5 minutes off — sync your server to NTP
401INVALID_SIGNATURECheck the full path and that you signed the exact bytes sent
403INVALID_KEYKey not found or revoked
403IP_BLOCKEDCalling IP is not on the key's whitelist
403FORBIDDENKey lacks the required permission for this product
403SANDBOX_KEYA sandbox key cannot move money — use a production key
400MISSING_PARAMA required field is absent — the message names it
400INSUFFICIENT_BALANCEWallet too low for this amount
400INVALID_TPINWrong TPIN — locks after 5 consecutive failures
400INVALID_NUMBERRecharge: not a valid mobile number or DTH subscriber ID
400INVALID_AMOUNTAmount outside the product’s range, or not whole rupees for a recharge
404OPERATOR_NOT_FOUNDRecharge: unknown or inactive operator_id — read GET /ext/v1/recharge/operators
409BILLER_PARAMS_CHANGEDBBPS biller changed its fields; re-read /biller/{id}
410INVALID_BILL_TOKENbill_token expired (15 min) or already spent — fetch again
422BANK_NOT_SUPPORTEDFree DMT is not enabled for that bank — read GET /ext/v1/dmt/banks
422AGT_UNSUPPORTEDBiller not enabled for the agent channel
422BILL_FETCH_FAILEDMandatory-fetch biller returned no bill
422OPERATOR_UNAVAILABLERecharge: the operator cannot be recharged right now — nothing was debited; retry later
400INVALID_PIDAEPS: the biometric capture is missing, malformed or reports an RD error — capture again and send the PidData XML unchanged
400OTP_REQUIREDAEPS: CW / AP above ₹5,000 needs otp_reference from POST /ext/v1/aeps/otp
400AUTH_MODE_NOT_ALLOWEDAEPS: face is accepted for daily authentication only
404MERCHANT_NOT_FOUNDAEPS: no outlet with that merchant_ref — onboard it first
409DAILY_AUTH_REQUIREDAEPS: the outlet has not done today’s daily authentication (AEPS or AP)
409EKYC_REQUIRED / BANK_EKYC_REQUIREDAEPS: finish the outlet’s eKYC / Bank eKYC first
409REONBOARD_REQUIREDAEPS: the outlet’s bank account could not be verified — re-submit POST /merchants with the same merchant_ref
422ONBOARDING_FAILED / EKYC_FAILED / DAILY_AUTH_FAILEDAEPS: the step was not accepted; message says why
429TRANSACTION_IN_PROGRESSAEPS: one transaction per outlet at a time — retry when it completes
422QR_NOT_CREATEDUPI Cash: the bank network refused the QR — failure_code says why (e.g. OUTLET_NOT_ENABLED)
409SERVICE_CLOSEDUPI Cash: closed daily from 11:30 PM to 5:00 AM IST
429TOO_MANY_OPEN_QRSUPI Cash: the outlet already has 3 unpaid QRs — wait for them to settle
429RATE_LIMITEDPer-minute quota exceeded for this key
429BILLER_BUSYBiller concurrency limit — retry after a few seconds
429PAYMENT_IN_PROGRESSBBPS: this bill is already being paid — read the status by client_reference before retrying
503SERVICE_DISABLEDCategory or service temporarily disabled by the operator
⚠️
Retrying a timeout

A request that times out may still have succeeded. Retry it with the same client_reference — every money endpoint (Free DMT /transfer, BBPS /bill/pay, Recharge /recharge, every AEPS transaction, UPI Cash /qr and each verification) returns the original transaction with duplicate: true rather than charging twice. Sending a new reference for the same intent is what double-charges, so keep one reference per business action and reuse it for every attempt.