Vizo Digital Api
Sign in

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. amount is required.
  • BE — Balance Enquiry. amount is ignored.
  • MS — Mini Statement. amount is ignored.

Read the answer like this

  • data.status decides, not the HTTP code. A failed transaction is a normal 200 answer with data.status set to failed.
  • 200 with data.status = "success": hand over the cash.
  • 202 with data.status = "pending": the bank network has not answered yet. Do not hand over cash and do not retry with a new reference_id. Poll Transaction Status until it is success or failed.

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_status and release_due_at show 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_UNAVAILABLE and nothing is sent.

Notes

  • The agent must have completed KYC and today's Daily 2FA, or you get kyc_required or daily_2fa_required before anything is sent.
  • Capture the customer's PID block with an empty wadh.
  • reference_id can be used once per account and environment. A repeated one is refused with 409 duplicate_reference_id, so a retry cannot withdraw twice.
  • A mini statement returns its lines in data.mini_statement in this answer only. They are not stored and Transaction Status does not return them.
  • customer_balance is also shown only in this answer. It is the customer's account balance as a plain decimal, for example 3345.01.
  • amount is the amount of this transaction. It is null for 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_id that starts with FAIL- returns a failed answer.
  • A reference_id that starts with PEND- returns 202 pending; Transaction Status then returns success.

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

application/json required

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