error for programmatic handling and message for logging.
HTTP Error Codes
| HTTP Status | Error Code | Description | Action |
|---|---|---|---|
400 | invalid_request | Missing or invalid request parameters | Check required fields in request |
400 | unsupported_currency | Currency or network not enabled for your integration | Contact Proof team to enable |
401 | unauthorized | Missing or invalid client_token | Check your token; rotate if compromised |
403 | forbidden_origin | Request origin not whitelisted | Check your registered domain; contact Proof team |
403 | offramp_disabled | Off-ramp not enabled for your integration | Request off-ramp access from Proof team |
404 | transaction_not_found | Transaction ID does not exist | Verify the merchant_transaction_id |
409 | session_already_used | init_token has already been used | Request a new session |
422 | kyc_required | User must complete KYC before transacting | Embed widget — it will handle KYC automatically |
429 | rate_limit_exceeded | Too many requests | Slow down; implement exponential backoff |
500 | internal_error | Proof internal error | Retry once; contact support if persistent |
Common Scenarios
kyc_required (422)
session_already_used (409)
The init_token is single-use and expires after first use or 1 hour. If you see this error, request a new session.
rate_limit_exceeded (429)
Implement exponential backoff for polling:
forbidden_origin (403)
If you see this error, the Origin header of the request does not match your registered domain or bundle ID.
- Verify the domain you provided during onboarding matches the actual request origin.
- If testing from a new domain or localhost, contact the Proof team to update your whitelist.
Widget-Level Errors
TheonStatusChange callback also fires on payment failures: