Skip to content

docs / errors

Errors

The Payve API uses conventional HTTP status codes. The response body always includes a machine-readable code alongside a human-readable message.

json
{
  "error": {
    "code": "wallet_insufficient_funds",
    "message": "Your NGN wallet balance is too low for this payout.",
    "status": 402
  }
}

HTTP status codes

CodeMeaning
200Success
201Created
202Accepted (async operation started)
204No content
400Bad request — malformed JSON or missing required headers
401Unauthorized — invalid or missing API key
402Payment required — insufficient balance
403Forbidden — IP not allowlisted or insufficient permissions
404Not found
409Conflict — idempotency key reused with different parameters
422Unprocessable — validation failed
429Too many requests — rate limit exceeded
500Internal server error — contact support if this persists
502Channel error — downstream payment provider unavailable

Error codes

Validation

CodeDescription
validation_missing_fieldA required field was not provided
validation_invalid_amountAmount must be a positive integer in minor units
validation_invalid_currencyCurrency code is not supported
validation_invalid_beneficiaryBeneficiary details are incomplete or invalid
validation_idempotency_key_requiredIdempotency-Key header is required for this endpoint

Wallet

CodeDescription
wallet_insufficient_fundsBalance too low for the requested operation
wallet_not_foundNo wallet exists for this currency — fund your account first
wallet_frozenWallet is temporarily frozen pending compliance review
wallet_currency_not_enabledThis currency is not enabled for your account

Channel

CodeDescription
channel_unavailableThe payment channel is temporarily down
channel_timeoutThe channel did not respond within the timeout window
channel_auth_failedAuthentication with the channel failed
channel_insufficient_balanceChannel liquidity is insufficient — retry later
channel_beneficiary_bank_downBeneficiary bank is unavailable
channel_unknown_errorUnclassified channel error — check message for details
no_eligible_channelNo channel available for this currency/method combination

Resources

CodeDescription
resource_not_foundThe requested object does not exist
resource_conflictObject already exists (e.g. duplicate beneficiary)
resource_invalid_stateThe object is not in a state that allows this operation
idempotency_replaySame Idempotency-Key returned the cached response
idempotency_conflictSame Idempotency-Key used with different parameters

Compliance

CodeDescription
merchant_suspendedYour account has been suspended — contact support
kyc_tier_insufficientYour KYC tier does not allow this transaction size
merchant_limit_exceededDaily or monthly transaction limit reached
fraud_blockedTransaction flagged by fraud rules
sanctions_blockedRecipient appears on a sanctions list
compliance_holdTransaction held for manual compliance review

Retrying errors

Retry?Codes
Yes, with backoffchannel_unavailable, channel_timeout, channel_beneficiary_bank_down, 502
Yes, after resolvingwallet_insufficient_funds (after topping up), kyc_tier_insufficient (after upgrade)
NoAll validation_*, unauthorized, forbidden, idempotency_conflict, fraud_blocked, sanctions_blocked

💡
Always use idempotency keys for POST requests so retries are safe. See Idempotency for details.

💡