Authentication & API Keys
How is the API signature generated?
How is the API signature generated?
api_secret and the message is constructed as follows:- For client-level operations (e.g., create a user):
client_id + timestamp - For user-specific operations (e.g., create a transaction):
client_id + timestamp + user_id
X-Signature header. The X-Signature is not your raw API secret — it is the computed HMAC value.I'm getting 'Invalid X-Api-Key or X-Client-Id' even though my credentials are active. What's wrong?
I'm getting 'Invalid X-Api-Key or X-Client-Id' even though my credentials are active. What's wrong?
api_secret as the HMAC key, and that the output is Base64-encoded and uppercased.User Operations, KYC and Bank Account
What is kyc_country and when should I set it?
What is kyc_country and when should I set it?
kyc_country determines which KYC flow (and downstream transaction capabilities) applies to a user. It should be set during user creation or via the Update User API. It is distinct from phone_country. If not set correctly, users may be routed to the wrong KYC flow (e.g., an Indian KYC widget for a UK-based user).Can I add a bank account before KYC is complete?
Can I add a bank account before KYC is complete?
KYC is stuck loading or returning a 500 error. What should I do?
KYC is stuck loading or returning a 500 error. What should I do?
KYC shows 'Unverified' even after the user completed the process. Why?
KYC shows 'Unverified' even after the user completed the process. Why?
Can I embed the Indian KYC widget (Digilocker) in an iframe?
Can I embed the Indian KYC widget (Digilocker) in an iframe?
Content-Security-Policy: frame-ancestors restriction that blocks iframe embedding. The recommended approach is to:- Listen for the
DIGILOCKER_URLevent from the Saber KYC widget. - Open the Digilocker URL in a new browser tab.
- Configure a redirect URL to bring the user back to your application after completion.
The user completed KYC successfully but did not receive any confirmation. What happened?
The user completed KYC successfully but did not receive any confirmation. What happened?
redirect_url is not properly configured in your integration, the user will see a blank or generic Saber page after KYC completes. Ensure your redirect URL is registered and your application is listening for the KYC success event.A user is being asked for Indian KYC despite having a non-Indian phone number. Is this a bug?
A user is being asked for Indian KYC despite having a non-Indian phone number. Is this a bug?
kyc_country is not explicitly set and the system falls back to phone_country for routing. Always set kyc_country explicitly during user creation to avoid this.Can I reset a user's KYC if it was completed incorrectly?
Can I reset a user's KYC if it was completed incorrectly?
We're reusing the same recipient across multiple remitters. Why is the PAN being rejected as 'already exists'?
We're reusing the same recipient across multiple remitters. Why is the PAN being rejected as 'already exists'?
What does 'You cannot consume this service' mean when calling the KYC Documents API?
What does 'You cannot consume this service' mean when calling the KYC Documents API?
Are webhooks available for KYC and bank account status updates?
Are webhooks available for KYC and bank account status updates?
Why is a bank account being rejected with 'Bank account already exists in name rejected state'?
Why is a bank account being rejected with 'Bank account already exists in name rejected state'?
What is the name_match_score in the bank account response, and what threshold triggers rejection?
What is the name_match_score in the bank account response, and what threshold triggers rejection?
NAME_REJECTED status. If the name on the bank account is an abbreviated or variant form of the legal name, this can cause mismatches — ensure the account holder name matches the legal name submitted during KYC as closely as possible.How do I flag a bank account as NRE?
How do I flag a bank account as NRE?
is_nre field is set at the bank account level when adding the account via the Add Bank Account API. It is not a user-level property.Onramp
After completing open banking payment, the transaction status is still 'processing.' Is this normal?
After completing open banking payment, the transaction status is still 'processing.' Is this normal?
The payment in the user's bank statement shows a company name other than the recipient's name. Why?
The payment in the user's bank statement shows a company name other than the recipient's name. Why?
How can I configure the redirect URL after payment completion?
How can I configure the redirect URL after payment completion?
ref_id and order_id as query parameters.Can I simulate a successful onramp in sandbox to test webhooks?
Can I simulate a successful onramp in sandbox to test webhooks?
Offramp
What is the overall offramp architecture? Does Saber hold custody of funds?
What is the overall offramp architecture? Does Saber hold custody of funds?
How does the Pool Sell flow work? What is source_id?
How does the Pool Sell flow work? What is source_id?
- Create a pool user and mark it as a pool account (requires Saber-side enablement).
- Get the pool wallet’s deposit address.
- For each payout, call the Pool Sell API with
source_idset to the bank account UUID of the recipient user — not the wallet address.
Quote IDs are returning as all zeros (00000000-0000-...). Is this correct?
Quote IDs are returning as all zeros (00000000-0000-...). Is this correct?
The Pool Sell API accepts crypto_amount. Can I pass a fixed fiat_amount instead to guarantee a specific INR payout?
The Pool Sell API accepts crypto_amount. Can I pass a fixed fiat_amount instead to guarantee a specific INR payout?
crypto_amount. Passing a fixed target fiat_amount is a requested feature on the roadmap. In the interim, use the Sell Quote API to derive the crypto_amount closest to your desired fiat value, noting that the final payout may vary slightly due to rate movement between quote and settlement.I'm getting error 901011: service configuration missing on the quote or sell API.
I'm getting error 901011: service configuration missing on the quote or sell API.
I'm getting error 3002: invalid bank account UUID on pool sell.
I'm getting error 3002: invalid bank account UUID on pool sell.
I'm getting error 304017: bank account verification pending on pool sell.
I'm getting error 304017: bank account verification pending on pool sell.
A transaction is stuck in 'created' status with funds already debited from the user. What should I do?
A transaction is stuck in 'created' status with funds already debited from the user. What should I do?
When does TDS apply to INR payouts?
When does TDS apply to INR payouts?
I'm seeing TDS deducted unexpectedly on what should be a 1st party transfer. Why?
I'm seeing TDS deducted unexpectedly on what should be a 1st party transfer. Why?
pre_fee_to_amount from a sell quote as the from_amount without correctly identifying the transfer as 1st party. Ensure the transaction is configured correctly and that the user’s relationship (sender = recipient) is reflected in your API call. Contact the Saber team if the deduction appears incorrect after verification.Others
How can we export transaction history for reconciliation?
How can we export transaction history for reconciliation?
What are the typical SLAs for INR payout processing?
What are the typical SLAs for INR payout processing?
- p50 TAT: ~1.6 minutes
- p95 TAT: ~2–3 minutes
- Success rate: 95–97%
Is there a refund API?
Is there a refund API?
Can I withdraw crypto (e.g., USDC) from the Saber wallet back to an external address?
Can I withdraw crypto (e.g., USDC) from the Saber wallet back to an external address?