Payouts · Payout Requests
Request Payout
Ask for money from your payout wallet to be sent to your bank account.
POST request
URL: https://uat-api.vizodigital.com/api/v1/payouts
Body
{
"reference_id": "PO2026101400001",
"bank_account_id": 12,
"amount": 1000
}
Include a valid Bearer token with every request
Code sample
curl -X POST "https://uat-api.vizodigital.com/api/v1/payouts" \
-H "X-API-Key: YOUR_API_KEY_OR_TOKEN" \
-H "X-Timestamp: $(TZ=Asia/Kolkata date '+%Y-%m-%d %H:%M:%S')" \
-H "Content-Type: application/json" \
-d '{
"reference_id": "PO2026101400001",
"bank_account_id": 12,
"amount": 1000
}'
Success Response
{
"status": "success",
"message": "Payout requested. The amount is held until it is paid, rejected or cancelled.",
"data": {
"reference_id": "PO2026101400001",
"amount": "1000.00",
"fee": "10.00",
"net_amount": "990.00",
"status": "pending",
"bank_account": {
"id": 12,
"account_last4": "0000"
},
"utr": null,
"reject_reason": null,
"created_at": "2026-10-14T11:20:00+05:30",
"processed_at": null
}
}
Failure response
{
"status": "error",
"code": "insufficient_payout_balance",
"message": "Your payout wallet balance is too low for this amount."
}
Overview
Takes the amount from your payout wallet now and opens a payout with status: pending. We then send the money by bank transfer.
What happens next
paid: the money was sent.utris the bank reference.rejected: we could not pay.reject_reasonsays why, and the amount is back in your payout wallet.cancelled: you cancelled it, and the amount is back in your payout wallet.
Notes
- The bank account must be
approved. - The amount must be at least the
minimum, more than thefee, and at most yourpayout_balance. At most 2 decimals. See Payout Balance. net_amountisamountminusfee. It is what reaches your bank.- You may have more than one pending payout.
- Send a new
reference_idfor every payout. A repeated one is refused with409 duplicate_reference_idand no money is taken, so it is safe to retry after a timeout with the samereference_id.
Testing in UAT
With a UAT key no money moves. The sample payout balance is 25,000.00: an amount above it is refused with 402 insufficient_payout_balance. A reference_id starting with PAID- comes back paid with a sample UTR. One starting with FAIL- comes back rejected with a sample reject_reason. Any other reference_id stays pending until you cancel it.
Headers
-
X-API-Key · string required
Your credential: either your `rr_live_` API key, or the Bearer token from `POST /api/v1/auth/client-credentials` (the same token every other API uses). The token may instead be sent as `Authorization: Bearer <token>`. A token follows the same IP whitelist as your keys, and all your tokens share one requests-per-minute allowance.
Example: rr_live_xxxxxxxxxxxxx
-
X-Timestamp · string required
Current time in IST as `YYYY-MM-DD HH:MM:SS` (or `YYYY-MM-DDTHH:MM:SS`). Do not add a timezone suffix such as `+05:30`. Must be within 15 seconds of our server time.
Example: 2026-10-03 10:30:45
-
Content-Type · string required
Request content type.
Example: application/json
Body
Request Payout request body
Schema
{
"type": "object",
"required": [
"reference_id",
"bank_account_id",
"amount"
],
"properties": {
"reference_id": {
"type": "string",
"description": "Your own unique id for this payout. Letters, digits, `_` and `-`. Max 40 characters. Not `balance`, `transfers` or `bank-accounts`."
},
"bank_account_id": {
"type": "integer",
"description": "The `id` of an approved bank account."
},
"amount": {
"type": "number",
"description": "Rupees to pay out, at most 2 decimals."
}
}
}
Example
{
"reference_id": "PO2026101400001",
"bank_account_id": 12,
"amount": 1000
}
Responses
-
201 · application/json default
Success
Example
{ "status": "success", "message": "Payout requested. The amount is held until it is paid, rejected or cancelled.", "data": { "reference_id": "PO2026101400001", "amount": "1000.00", "fee": "10.00", "net_amount": "990.00", "status": "pending", "bank_account": { "id": 12, "account_last4": "0000" }, "utr": null, "reject_reason": null, "created_at": "2026-10-14T11:20:00+05:30", "processed_at": null } } -
402 · application/json
Failed or rejected
Example
{ "status": "error", "code": "insufficient_payout_balance", "message": "Your payout wallet balance is too low for this amount." }
Errors
-
INVALID_API_KEY · HTTP 401
Invalid or revoked API key.
{ "message": "Invalid or revoked API key." } -
TIMESTAMP_OUT_OF_RANGE · HTTP 400
Request timestamp is outside the ±15 second window.
{ "message": "Request timestamp is outside the ±15 second window." } -
RATE_LIMITED · HTTP 429
Rate limit exceeded.
{ "message": "Rate limit exceeded." } -
insufficient_payout_balance · HTTP 402
Your payout wallet balance is too low for this amount.
{ "status": "error", "code": "insufficient_payout_balance", "message": "Your payout wallet balance is too low for this amount." } -
bank_account_not_found · HTTP 404
Bank account not found.
{ "status": "error", "code": "bank_account_not_found", "message": "Bank account not found." } -
duplicate_reference_id · HTTP 409
This reference_id was already used. Send a new one.
{ "status": "error", "code": "duplicate_reference_id", "message": "This reference_id was already used. Send a new one." } -
bank_account_not_approved · HTTP 422
This bank account is not approved yet, or was removed.
{ "status": "error", "code": "bank_account_not_approved", "message": "This bank account is not approved yet, or was removed." } -
amount_below_minimum · HTTP 422
The smallest payout is Rs 100.00.
{ "status": "error", "code": "amount_below_minimum", "message": "The smallest payout is Rs 100.00." } -
amount_not_above_fee · HTTP 422
The amount must be more than the payout fee of Rs 10.00.
{ "status": "error", "code": "amount_not_above_fee", "message": "The amount must be more than the payout fee of Rs 10.00." }
Rate Limits
100/min