Documentation menu
Reference

Error format and the full list of error codes.

View raw

Errors

Errors always use this shape:

json
1{ "error": "invalid_amount", "message": "amount must be a positive number." }

Some errors include extra fields (for example reference and ussd_code on otp_required, or transaction_id on provider errors).

HTTP status codes

StatusMeaningAction
200OK / final result / idempotent replayRead status
201Resource created (payment link)—
202Accepted, pendingWait for webhook
400Invalid requestFix the request
401Missing/invalid/revoked keyCheck your key
403Not allowed (activation, KYC, suspended)See error
404Not foundCheck the id
409Reference conflictUse a unique reference
429Rate limitBack off and retry
5xxProvider or server problemCheck the status before retrying

Error codes

errorHTTPDescription
unauthorized401Bad key
key_not_activated403Key awaiting admin activation
kyc_required403Live access needs approved KYC
account_suspended403Account suspended
sandbox_only403Endpoint requires a sandbox key
method_disabled403Method disabled by an administrator
invalid_json400Body is not valid JSON
invalid_amount / amount_too_low / amount_too_high400Amount rules
invalid_currency400Currency doesn't match the country
invalid_country / country_not_supported400Unknown or disabled country
invalid_operator / operator_not_supported400Unknown or disabled operator
invalid_phone400Phone number invalid
invalid_customer400Crypto customer fields missing
asset_not_supported400Crypto asset inactive
invalid_title / invalid_url400Payment link validation
otp_required400OTP flow — see Payment flows
invalid_otp / invalid_reference400Wrong OTP or unknown session reference
reference_conflict409Reference reused with different data
not_found404Unknown resource or endpoint
rate_limited429Too many requests
maintenance503Live API in maintenance
provider_unavailable / provider_error502Payment provider issue
upstream_timeout504Provider timeout — verify before retrying
internal_error500Unexpected error

Retrying safely

Do not blindly retry payment creation after a timeout. Save your reference, then call GET /transaction/{reference}. Retrying POST /collect with the same reference is safe: you get the original payment back.