POSTAePS Cash Withdrawal
Withdraw cash from any Aadhaar-linked bank account using biometric fingerprint authentication — no card or PIN required.
Lets a customer withdraw cash from any Aadhaar-linked bank account using a live fingerprint scan — no card or PIN. The agent's biometric device produces a PID XML blob that is forwarded verbatim, and the customer's Aadhaar number is RSA-encrypted before transmission.
Prerequisites
The agent must have completed, in order:
- AePS Fingpay activation
- One-time eKYC (Send OTP → Verify OTP → Biometric eKYC)
- Daily KYC for the current day
Due to NPCI compliance, the agent's Daily KYC must succeed for the current calendar day before any cash-withdrawal is attempted.
Aadhaar encryption
Encrypt the Aadhaar number before sending it (the same scheme used by all AePS transaction APIs):
- Base64-decode the public key.
- RSA-encrypt the Aadhaar number with the decoded key.
- Base64-encode the result and send that as the
aadharparameter.
Production public key:
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCaFyrzeDhMaFLx+LZUNOOO14Pj9aPfr+1WOanDgDHxo9NekENYcWUftM9Y17ul2pXr3bqw0GCh4uxNoTQ5cTH4buI42LI8ibMaf7Kppq9MzdzI9/7pOffgdSn+P8J64CJAk3VrVswVgfy8lABt7fL8R6XReI9x8ewwKHhCRTwBgQIDAQAB
Biometric (PID) capture
New to RDService? The
Aadhaar Biometric Authentication guide
covers the full capture flow — driver discovery, PidOptions, error codes —
for Web and Android, and includes an in-browser device tester.
The PidData XML from the RD-service device must use:
Data type="X"(XML), base64-encoded- a
DeviceInfomcvalue carrying the device public-key certificate signed by the Device Provider Key - fingerprint quality of at least 35
nmPoints
Per NPCI's FIR-FMR single-PID-block guidance, capture fingerprints with
fType = 2 (not 0). A subset of banks that have not yet completed
FMR+FIR compliance still require fType = 0 — check the current bank list
before going live.
- AePS (Fingpay) — Cash Withdrawal — Aadhaar-enabled cash withdrawal: one-time agent activation and eKYC, daily KYC, then the biometric withdrawal.
Request
Path parameters
| Field | Type | Required | Description |
|---|---|---|---|
customer_id | string | required | Customer's registered mobile number.e.g. 9000000000 |
customer_idstringRequiredCustomer's registered mobile number.
example: 9000000000
Body parameters
| Field | Type | Required | Description |
|---|---|---|---|
initiator_id | string | required | Registered mobile number of the API user (see Platform Credentials).e.g. 9962981729 |
client_ref_id | string | optional | Unique reference ID per API call, generated by your system (max 20 characters).e.g. 2026010100123456789 |
user_code | string | required | Unique code of your user/agent/retailer the service is run for. Use `Onboard Agent` API to register your userse.g. 10000001 |
bank_code | string | required | Short bank code identifying the customer's Aadhaar-linked bank (e.g. `HDFC`, `SBIN`). Obtain from the bank list API.e.g. HDFC |
aadhar | string | required | RSA-encrypted, Base64-encoded Aadhaar number. Encrypt the 12-digit Aadhaar with the Eko RSA public key using PKCS#1 v1.5 padding (Java's default `Cipher.getInstance("RSA")`), then Base64-encode the ciphertext.e.g. BASE64_ENCRYPTED_AADHAAR |
latlong | string | required | GPS coordinates of the transaction origin in 'latitude,longitude' format.e.g. 28.6139,77.2090 |
piddata | string | required | PID data captured from the UIDAI-certified biometric device, as a raw XML string. Must use Data type='X' (XML, not Protobuf). DeviceInfo must include the 'mc' (device certificate) parameter. fType must be 2.e.g. <?xml version='1.0'?><PidData><Data type='X'>...</Data><DeviceInfo mc='...' /></PidData> |
amount | number | required | Withdrawal amount in Indian Rupees (integer). Must be greater than 0 for cash withdrawal.e.g. 1000 |
initiator_idstringRequiredRegistered mobile number of the API user (see Platform Credentials).
example: 9962981729
client_ref_idstringoptionalUnique reference ID per API call, generated by your system (max 20 characters).
example: 2026010100123456789
user_codestringRequiredUnique code of your user/agent/retailer the service is run for. Use `Onboard Agent` API to register your users
example: 10000001
bank_codestringRequiredShort bank code identifying the customer's Aadhaar-linked bank (e.g. `HDFC`, `SBIN`). Obtain from the bank list API.
example: HDFC
aadharstringRequiredRSA-encrypted, Base64-encoded Aadhaar number. Encrypt the 12-digit Aadhaar with the Eko RSA public key using PKCS#1 v1.5 padding (Java's default `Cipher.getInstance("RSA")`), then Base64-encode the ciphertext.
example: BASE64_ENCRYPTED_AADHAAR
latlongstringRequiredGPS coordinates of the transaction origin in 'latitude,longitude' format.
example: 28.6139,77.2090
piddatastringRequiredPID data captured from the UIDAI-certified biometric device, as a raw XML string. Must use Data type='X' (XML, not Protobuf). DeviceInfo must include the 'mc' (device certificate) parameter. fType must be 2.
example: <?xml version='1.0'?><PidData><Data type='X'>...</Data><DeviceInfo mc='...' /></PidData>
amountnumberRequiredWithdrawal amount in Indian Rupees (integer). Must be greater than 0 for cash withdrawal.
example: 1000
These headers authenticate and sign every request. See How Auth Works for details.
| Field | Type | Required | Description |
|---|---|---|---|
developer_key | string | required | Static API key issued to your account after KYC. |
secret-key | string | required | Dynamic per-request signature: base64(HMAC-SHA256(timestamp, base64(access_key))). |
secret-key-timestamp | string | required | Current time in milliseconds since UNIX epoch, used to compute secret-key. Must match server time. |
content-type | string | required | application/jsone.g. application/json |
developer_keystringRequiredStatic API key issued to your account after KYC.
secret-keystringRequiredDynamic per-request signature: base64(HMAC-SHA256(timestamp, base64(access_key))).
secret-key-timestampstringRequiredCurrent time in milliseconds since UNIX epoch, used to compute secret-key. Must match server time.
content-typestringRequiredapplication/json
example: application/json
Response types
| response_type_id | Meaning | Next step |
|---|---|---|
1463 | Transaction Successful | — |
1464 | Transaction Fail | — |
1465 | Transaction Pending — check final status later | Transaction Inquiry |
Responses
1463Transaction Successful
statusnumberPrimary success indicator (0 = success).
messagestringHuman-readable response / error message.
response_status_idnumberGranular status id; see the shared error-codes table.
response_type_idnumberA unique id for every possible response shape (success or error) — useful for client logic branching and analytics.
tx_statusstringTransaction state: 0=Success, 1=Fail, 2=Awaited, 3=Refund Pending, 4=Refunded, 5=On Hold.
txstatus_descstringHuman-readable transaction status.
dataobjectAPI-specific response payload.
tidstringEko's internal transaction ID. Use for reconciliation and support queries.
amountstringWithdrawal amount processed in the transaction (INR).
bankstringName of the customer's bank where the debit occurred.
bank_ref_numstringBank/NPCI reference number (RRN) for the transaction. Empty on failure.
balancestringRemaining balance in the customer's bank account after withdrawal, if returned by the bank.
customer_balancestringCustomer's account balance as reported by the bank. Empty when not returned.
tdsstringTax deducted at source on the agent's commission (INR).
commissionstringCommission earned by the agent on this transaction (INR).
feestringFee charged for the transaction (INR). May be empty.
service_taxstringService tax component on the fee (INR). May be empty.
totalfeestringTotal fee including taxes (INR). May be empty.
shopstringAgent's shop/merchant name.
shop_address_line1stringAgent's shop address. May be empty.
sender_namestringName of the agent/sender initiating the transaction.
merchantnamestringRegistered merchant name of the agent.
merchant_codestringMerchant code of the agent. May be empty.
user_codestringEcho of the agent's user_code from the request.
aadharstringMasked Aadhaar number of the customer.
auth_codestringBank authorization code. May be empty.
stanstringSystem Trace Audit Number assigned by the switch. May be empty.
terminal_idstringTerminal identifier. May be empty.
tx_statusstringTransaction state within the data block: 0=Success, 1=Fail, 2=Pending.
transaction_datestringTransaction date (DD-MM-YY HH:MM:SS).
transaction_timestringTransaction timestamp (DD-MM-YY HH:MM:SS).
reasonstringFailure reason, when the transaction did not complete. Empty on success.
commentstringHuman-readable transaction remark from the provider (e.g. 'Request Completed').
Next steps
NextPOSTAePS Balance EnquiryCheck a customer's bank account balance using Aadhaar number and biometric fingerprint — no card or PIN required.Related
- AePS Cashout — details & pricingFeatures, plans and pricing for this product.
- Integrate using AIBuild agent-native integrations with MCP, SDKs and packs.
- Integrate using an SDKBrowse guides and the full developer documentation.
- Aadhaar Biometric Authentication (RDService) guideHow to capture the PID block from a fingerprint scanner on Web or Android.