AEPS · Transactions
Transaction
Cash withdrawal, balance enquiry or mini statement with customer biometric.
POST request
URL: https://uat-api.vizodigital.com/api/v1/aeps/transactions
Body
{
"agent_code": "AC12345678",
"reference_id": "TXN2026100300001",
"tran_type": "CW",
"amount": 2000,
"bank_iin": "607094",
"customer_mobile": "9876543210",
"customer_aadhaar": "123456789012",
"otp_reference": "",
"channel": "APP",
"device_id": "8f2d7c9a12bc45ef",
"ip_address": "49.47.133.99",
"user_agent": "Mozilla/5.0 Android",
"latitude": "25.5899",
"longitude": "85.1606",
"bio_type": "0",
"pid_data": "BASE64_ENCODED_PID_XML"
}
Include a valid Bearer token with every request
Code sample
curl -X POST "https://uat-api.vizodigital.com/api/v1/aeps/transactions" \
-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 '{
"agent_code": "AC12345678",
"reference_id": "TXN2026100300001",
"tran_type": "CW",
"amount": 2000,
"bank_iin": "607094",
"customer_mobile": "9876543210",
"customer_aadhaar": "123456789012",
"otp_reference": "",
"channel": "APP",
"device_id": "8f2d7c9a12bc45ef",
"ip_address": "49.47.133.99",
"user_agent": "Mozilla/5.0 Android",
"latitude": "25.5899",
"longitude": "85.1606",
"bio_type": "0",
"pid_data": "BASE64_ENCODED_PID_XML"
}'
Success Response
{
"status": "success",
"message": "Transaction successful.",
"data": {
"reference_id": "TXN2026100300001",
"tran_type": "CW",
"status": "success",
"amount": "2000.00",
"rrn": "627610123456",
"bank_name": "State Bank of India",
"customer_aadhaar": "XXXXXXXX9012",
"customer_balance": "9220.00",
"commission": "4.0000",
"settlement_status": "awaiting",
"release_due_at": "2026-10-03T15:00:00+05:30",
"mini_statement": null
}
}
Failure response
{
"status": "success",
"message": "Transaction limit exhausted.",
"data": {
"reference_id": "TXN2026100300002",
"tran_type": "CW",
"status": "failed",
"amount": "2000.00",
"rrn": null,
"bank_name": "State Bank of India",
"customer_aadhaar": "XXXXXXXX9012",
"customer_balance": null,
"commission": "0.0000",
"settlement_status": "none",
"release_due_at": null,
"mini_statement": null
}
}
Overview
Runs an AEPS transaction for a customer.
Transaction types
CW— Cash Withdrawal.amountis required.BE— Balance Enquiry.amountis ignored.MS— Mini Statement.amountis ignored.
Read the answer like this
data.statusdecides, not the HTTP code. A failed transaction is a normal200answer withdata.statusset tofailed.200withdata.status = "success": hand over the cash.202withdata.status = "pending": the bank network has not answered yet. Do not hand over cash and do not retry with a newreference_id. Poll Transaction Status until it issuccessorfailed.
Money
- Your commission is added to your payout wallet at once, when the transaction succeeds.
- The withdrawn amount is added to your payout wallet after the next settlement cycle (11:00, 15:00 or 20:00 IST).
settlement_statusandrelease_due_atshow where it is. - Balance enquiry is free. Mini statement pays a small fixed commission.
- For an account under a partner, the partner's float pays for the transaction. If it is too low you get
503 SERVICE_UNAVAILABLEand nothing is sent.
Notes
- The agent must have completed KYC and today's Daily 2FA, or you get
kyc_requiredordaily_2fa_requiredbefore anything is sent. - Capture the customer's PID block with an empty
wadh. reference_idcan be used once per account and environment. A repeated one is refused with409 duplicate_reference_id, so a retry cannot withdraw twice.- A mini statement returns its lines in
data.mini_statementin this answer only. They are not stored and Transaction Status does not return them. customer_balanceis also shown only in this answer. It is the customer's account balance as a plain decimal, for example3345.01.amountis the amount of this transaction. It isnullfor a balance enquiry and a mini statement, so it is never read as a zero balance.
Testing in UAT
- Sandbox keys never reach the bank network and never move money.
- A
reference_idthat starts withFAIL-returns a failed answer. - A
reference_idthat starts withPEND-returns202 pending; Transaction Status then returnssuccess.
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
Transaction request body
Schema
{
"type": "object",
"required": [
"agent_code",
"reference_id",
"tran_type",
"bank_iin",
"customer_mobile",
"customer_aadhaar",
"channel",
"device_id",
"ip_address",
"user_agent",
"latitude",
"longitude",
"bio_type",
"pid_data"
],
"properties": {
"agent_code": {
"type": "string",
"description": "The `agent_code` you sent when onboarding the agent."
},
"reference_id": {
"type": "string",
"description": "Your unique ID for this transaction. Letters, digits, `-` and `_`, max 40."
},
"tran_type": {
"type": "string",
"enum": [
"CW",
"BE",
"MS"
]
},
"amount": {
"type": "integer",
"description": "Amount in whole rupees. Required for `CW`; ignored for `BE` and `MS`."
},
"bank_iin": {
"type": "string",
"description": "Bank IIN from List Banks."
},
"customer_mobile": {
"type": "string",
"description": "10-digit customer mobile number."
},
"customer_aadhaar": {
"type": "string",
"description": "12-digit customer Aadhaar number. It is passed to the bank network and never stored in full."
},
"otp_reference": {
"type": "string",
"description": "From Generate OTP when `otp_required` was `true`. Leave out otherwise."
},
"channel": {
"type": "string",
"enum": [
"APP",
"WEB"
],
"description": "Where the request comes from."
},
"device_id": {
"type": "string",
"description": "Android ID of the agent device (16 hex characters) when `channel` is `APP`. Send `Browser` when `channel` is `WEB`. Max 40 characters."
},
"ip_address": {
"type": "string",
"description": "Public IPv4 address of the agent device."
},
"user_agent": {
"type": "string",
"description": "App or browser user-agent string. Max 50 characters."
},
"latitude": {
"type": "string",
"description": "Live latitude of the agent, exactly 4 decimal places. Must not be hardcoded."
},
"longitude": {
"type": "string",
"description": "Live longitude of the agent, exactly 4 decimal places. Must not be hardcoded."
},
"bio_type": {
"type": "string",
"enum": [
"0",
"1",
"2"
],
"description": "`0` = fingerprint, `1` = face, `2` = iris."
},
"pid_data": {
"type": "string",
"description": "Base64-encoded PID XML captured from a registered RD service device."
}
}
}
Example
{
"agent_code": "AC12345678",
"reference_id": "TXN2026100300001",
"tran_type": "CW",
"amount": 2000,
"bank_iin": "607094",
"customer_mobile": "9876543210",
"customer_aadhaar": "123456789012",
"otp_reference": "",
"channel": "APP",
"device_id": "8f2d7c9a12bc45ef",
"ip_address": "49.47.133.99",
"user_agent": "Mozilla/5.0 Android",
"latitude": "25.5899",
"longitude": "85.1606",
"bio_type": "0",
"pid_data": "BASE64_ENCODED_PID_XML"
}
Responses
-
200 · application/json default
Success
Example
{ "status": "success", "message": "Transaction successful.", "data": { "reference_id": "TXN2026100300001", "tran_type": "CW", "status": "success", "amount": "2000.00", "rrn": "627610123456", "bank_name": "State Bank of India", "customer_aadhaar": "XXXXXXXX9012", "customer_balance": "9220.00", "commission": "4.0000", "settlement_status": "awaiting", "release_due_at": "2026-10-03T15:00:00+05:30", "mini_statement": null } } -
200 · application/json
Failed or rejected
Example
{ "status": "success", "message": "Transaction limit exhausted.", "data": { "reference_id": "TXN2026100300002", "tran_type": "CW", "status": "failed", "amount": "2000.00", "rrn": null, "bank_name": "State Bank of India", "customer_aadhaar": "XXXXXXXX9012", "customer_balance": null, "commission": "0.0000", "settlement_status": "none", "release_due_at": null, "mini_statement": null } } -
202 · application/json
Pending: no final answer yet
Example
{ "status": "success", "message": "The provider has not answered yet. Check the status endpoint; do not retry with a new reference_id.", "data": { "reference_id": "TXN2026100300003", "tran_type": "CW", "status": "pending", "amount": "2000.00", "rrn": null, "bank_name": "State Bank of India", "customer_aadhaar": "XXXXXXXX9012", "commission": "0.0000", "settlement_status": "none", "release_due_at": null } }
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." } -
service_not_enabled · HTTP 403
AEPS is not enabled for your account. Contact your account manager to activate it.
{ "status": "error", "code": "service_not_enabled", "message": "AEPS is not enabled for your account. Contact your account manager to activate it." } -
RATE_LIMITED · HTTP 429
Rate limit exceeded.
{ "message": "Rate limit exceeded." } -
agent_not_found · HTTP 404
Agent not found.
{ "status": "error", "code": "agent_not_found", "message": "Agent not found." } -
agent_blocked · HTTP 403
This agent is blocked. Contact support.
{ "status": "error", "code": "agent_blocked", "message": "This agent is blocked. Contact support." } -
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." } -
kyc_required · HTTP 409
Complete KYC for this agent before sending transactions.
{ "status": "error", "code": "kyc_required", "message": "Complete KYC for this agent before sending transactions." } -
daily_2fa_required · HTTP 409
This agent has not done Daily 2FA today.
{ "status": "error", "code": "daily_2fa_required", "message": "This agent has not done Daily 2FA today." } -
amount_out_of_range · HTTP 422
Amount must be between Rs 100 and Rs 10000.
{ "status": "error", "code": "amount_out_of_range", "message": "Amount must be between Rs 100 and Rs 10000." } -
bank_not_supported · HTTP 422
This bank is not available for AEPS. Use the bank list endpoint.
{ "status": "error", "code": "bank_not_supported", "message": "This bank is not available for AEPS. Use the bank list endpoint." } -
SERVICE_UNAVAILABLE · HTTP 503
Service temporarily unavailable. Please try again later.
{ "status": "error", "code": "SERVICE_UNAVAILABLE", "message": "Service temporarily unavailable. Please try again later." } -
noble_credentials_unavailable · HTTP 503
Provider credentials are not available. Contact your partner.
{ "status": "error", "code": "noble_credentials_unavailable", "message": "Provider credentials are not available. Contact your partner." }
Rate Limits
100/min