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
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
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
429RATE_LIMITEDPer-minute quota exceeded for this key
429BILLER_BUSYBiller concurrency limit — retry after a few seconds
429PAYMENT_IN_PROGRESSPrevious payment still in flight — retry with the same key
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 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.