Skip to main content

Error codes

Errors use the standard envelope:

{
"success": false,
"error": {
"code": "VALIDATION_ERROR",
"message": "Amount must be an integer in kobo",
"field": "amount"
}
}
CodeHTTP statusMeaning
VALIDATION_ERROR400Request input failed validation
INVALID_REFERENCE400Payment reference format is invalid
GATEWAY_NOT_FOUND400Requested gateway is unknown or unavailable
GATEWAY_DISABLED400Gateway is disabled for this account
INVALID_WEBHOOK_SIGNATURE400Incoming processor signature verification failed
UNAUTHORIZED401Authentication is missing or invalid
INVALID_API_KEY401API key is malformed, unknown, or revoked
KYC_REQUIRED403A Live operation requires approved KYC
BUSINESS_RESTRICTED403Business status blocks this operation
FORBIDDEN403Authenticated principal lacks permission
PAYMENT_NOT_FOUND404Payment is absent from this business and environment
NOT_FOUND404Requested resource does not exist
PAYMENT_ALREADY_PROCESSED409Transaction is already in a terminal state
DUPLICATE_PAYMENT409Idempotency key cannot be reused for this request
KEY_LIMIT_REACHED409Five active keys already exist in the environment
PAYMENT_EXPIRED410Hosted payment link has expired
WEBHOOK_TEST_RATE_LIMITED429Endpoint exceeded the test-event limit
NO_GATEWAY_AVAILABLE503No eligible payment processor is currently available

Use error.code for branching and error.message for a safe human-readable explanation. Do not write logic that depends on exact message wording.

Retry network errors and selected 5xx responses with bounded exponential backoff. Do not automatically retry validation, authentication, or authorization failures without correcting the request.