Fund Accounts
In this section we will understand how fund flow works for Pre Paid Instrument (PPI) accounts.
- The fintech transfers funds from its current account to the Fintech’s current account of the sponsor IFI (eg RBL, IDFC)
- Zeta Ops verifies the fund transfer and increases the limit of the Fintech Funding A/c
- Account holder adds money to his PPI account
- Fintech Triggers an A2A transfer API to debit the VBO Funding account and credit the account holder’s account
Depending upon the sponsor bank for the PPI program, the fund flow may have variations.
APIs for RAH funding
Fusion provides the following set of APIs to perform different operations of Real Account Holder (RAH) funding.
-
Fund Account Holder Account
-
Retrieve the Account balance
-
Retrieve the Account transaction
-
Reverse Account Transaction
Fund Account Holder Account
Fusion supports IMPS and NEFT fund transfer modes. Each mode is defined by a unique identifier, transferCode
, which must be passed in the request body of the /transfers endpoint. Contact
Zeta to know the supported transfer codes.
Support for UPI fund transfer is coming soon.
To fund the account, use the /transfers endpoint and provide the values for the following keys in the request body, as shown below:
-
transferCode
: Required. Code to specify the mode of fund transfer like IMPS and NEFT. -
debitAccountID
: Required. ID of the fintech’s account from where the funds will be transferred. A fintech account is provisioned during the onboarding. -
creditAccountID
: Required. ID of the Account Holder’s account to which the funds will be transferred.
Endpoint URI
Input parameters
-
ifiID
: Required. Unique identifier of the IFI. -
Request id
: Required.This identifier is used to identify a unique request -
amount
: Required. User needs to specify the amount that needs to be transferred. (In Paisa). -
currency
: Required. It shows the currency in which the money is transferred. (Length 16 characters). -
transferCode
: Required. Code to specify the mode of fund transfer like IMPS and NEFT. -
debitAccountID
: Required. Unique identifier of the fintech’s account from where the funds will be transferred. A fintech account is provisioned during the on-boarding. -
creditAccountID
: Required. Unique identifier of the Account Holder’s account to which the funds will be transferred. -
transferTime
: Optional. Time required to transfer funds. -
remarks
: Optional. Remark of the fund transfer.
Response parameters
-
Request id
: This identifier is used to identify a unique request. -
Transfer id
: Unique identifier for the transaction. This will be used in case of reversals. -
status
: Status of the transfer. Value of this field can be Success/Failure
curl -X POST \
https://fusion.preprod.zeta.in/api/v1/ifi/140827/transfers \
-H 'Content-Type: application/json' \
-H 'X-Zeta-AuthToken: {{AUTH_TOKEN}}' \
-d '{
"requestID": "8439e4b6-1b63-4a28-afa1-34206a44425a",
"amount": {
"currency": "INR",
"amount": 21
},
"transferCode": "ATLAS_P2M_AUTH",
"debitAccountID": "422782d2-adcd-49a6-bde1-eb0461a582ba",
"creditAccountID": "608332f5-2d31-4377-bf91-5492dda0f694",
"transferTime": 1574741608000,
"remarks": "Fund Account Holders account",
"attributes": {}
}
{
"requestID": "8439e4b6-1b63-4a28-afa1-34206a44425a",
"transferID": "20191126041456390_3712_8439e4b6-1b63-4a28-afa1-34206a44425a",
"status": "SUCCESS"
}
Retrieve the Account balance
You can retrieve the balance of an account by passing accountID
as a path parameter in the balance endpoint, as shown below:
Endpoint URI
Input parameters
-
ifiID
: Required. Unique identifier of the IFI. -
accountID
: Required. Unique identifier of the Account whose balance is to be retrieved.
Samples
curl -X GET \
'https://fusion.preprod.zeta.in/api/v1/ifi/140827/accounts/608332f5-2d31-4377-bf91-5492dda0f694/balance' \
-H 'X-Zeta-AuthToken: {{AUTH_TOKEN}}'
{
"balance": 21,
"currency": "INR",
"lastTransactionID": "20191126041456390_3712_8439e4b6-1b63-4a28-afa1-34206a44425a",
"accountingType": "LIABILITY",
"headers": {}
}
Retrieve the Account transaction
In Fusion, a Transaction refers to any fund transfer from one account to another. To view transactions, pass accountID
as a path parameter in the /transactions endpoint, as shown below. To get a paginated view, use pageSize
and pageNumber
query parameters.
Endpoint URI
Input parameters
-
ifiID
: Required. Unique identifier of the IFI. -
accountID
: Required. Unique identifier of the Account whose balance is to be retrieved.
Samples
curl -X GET \
'https://fusion.preprod.zeta.in/api/v1/ifi/140827/accounts/608332f5-2d31-4377-bf91-5492dda0f694/transactions?pageSize=2&pageNumber=3' \
-H 'X-Zeta-AuthToken: {{AUTH_TOKEN}}'
{
"accountTransactionList": [
{
"accountID": "97417dc9-a636-4cd1-b5b8-4951103403dc",
"transactionID": "20200113130528523_2615_FUSION-140827-9c1bae42-0610-4253-96c3-62af594d1bde-1578920727914",
"reversalTransactionIDs": [],
"previousBalance": 500,
"newBalance": 700,
"timestamp": 1578920728550,
"amount": 200,
"currency": "INR",
"recordType": "DEBIT",
"remarks": "TEST123",
"attributes": {
"account.pd-id": "8892149590596675137",
"zeta.card-program-id": "",
"debitAuthSignatory": "[\"[email protected]/1\"]",
"aura.coa-id": "3071036307140878880",
"account.pf-id": "558731570586644109",
"bundle.name": "Customer bundle (minKYC without PAN)",
"policies": "{}",
"account.account-holder-id": "b9988179-9a74-41f5-aba4-0b85e501fd68",
"journal.voucherCode": "ATLAS_P2M_AUTH",
"journal.self": "false",
"zeta.card-program-ids": "",
"aura.parent-node-id": "1159171505324535297",
"isForced": "false",
"payment.captured": "true",
"account.account_holder.account_holder_provider_id": "862bb162-b5ad-4112-9d73-bb2306546a36",
"zeta.ifi": "140827",
"zeta.ppi-type": "OPEN",
"zeta.product-type": "Generic",
"zeta.ifi-product-type": "GPR_MIN_KYC_WITHOUT_PAN",
"athena.account-provider-id": "a36ac47b-c2a2-406c-b6a0-f8857fc5f735",
"zeta.business-id": "140827"
},
"headers": {}
},
{
"accountID": "97417dc9-a636-4cd1-b5b8-4951103403dc",
"transactionID": "20200113130414238_1671_FUSION-140827-9c1bae42-0610-4253-96c3-62af594d1bde-1578920654203",
"reversalTransactionIDs": [],
"previousBalance": 891,
"newBalance": 711,
"timestamp": 1578920654269,
"amount": 180,
"currency": "INR",
"recordType": "DEBIT",
"remarks": "TEST123",
"attributes": {
"account.pd-id": "8892149590596675137",
"zeta.card-program-id": "",
"debitAuthSignatory": "[\"[email protected]/1\"]",
"aura.coa-id": "3071036307140878880",
"account.pf-id": "558731570586644109",
"bundle.name": "Customer bundle (minKYC without PAN)",
"policies": "{}",
"account.account-holder-id": "b9988179-9a74-41f5-aba4-0b85e501fd68",
"journal.voucherCode": "ATLAS_P2M_AUTH",
"journal.self": "false",
"zeta.card-program-ids": "",
"aura.parent-node-id": "1159171505324535297",
"isForced": "false",
"payment.captured": "true",
"account.account_holder.account_holder_provider_id": "862bb162-b5ad-4112-9d73-bb2306546a36",
"zeta.ifi": "140827",
"zeta.ppi-type": "OPEN",
"zeta.product-type": "Generic",
"zeta.ifi-product-type": "GPR_MIN_KYC_WITHOUT_PAN",
"athena.account-provider-id": "a36ac47b-c2a2-406c-b6a0-f8857fc5f735",
"zeta.business-id": "140827"
},
"headers": {}
}
],
"totalRecord": 6,
"headers": {}
}
Reverse Account Transactions
In case of any disputes, pass transactionID
as a path parameter to reverse fund transfer. For partial transaction reversals, set doPartialReversal
to True.
Endpoint URI
Input parameters
-
ifiID
: Required. Unique identifier of the IFI. -
transactionID
: Required. Unique identifier of the transaction for which the reversal is being triggered. -
requestID
: Required. Unique identifier of the A2A Reversal. -
currency
: Required. Currency for which reversal is required. For example, INR, USD, and more. -
amount
: Required. Amount that needs to be reversed. -
doPartialReversal
: Optional. Pass this as true for partial reversal or false for full reversal of transaction. -
transferCode
: Required. Code to specify the mode of fund transfer like IMPS and NEFT. -
remarks
: Optional. Remark of the fund reversal.
Samples
curl --location --request POST 'https://fusion.preprod.zeta.in/api/v1/ifi/{ifiID}/transactions/{transactionID}/reversal' \
--header 'Authorization: Bearer <token> ' \
--data-raw '{
"requestID": "reversal_fampay_test-1",
"currency": "INR",
"amount" : "100",
"doPartialReversal" : true,
"transferCode": "ATLAS_P2M_AUTH-REVERSAL",
"remarks": "reversal_for_fampay"
}
{
"amount": 1,
"currency": "INR",
"paymentType": "REVERSAL",
"remark": "Reversal of vbo1",
"requestID": "93480e72-b883-46fa-8f3f-abe326ab9df7",
"revertTransactionID": "20200429121612790_14_revert_375231000459_reversal_dfdsrdkedddsdd",
"status": "SUCCESS/FAILED",
"statusDetails": {
"asBigDecimal": 0,
"asBigInteger": 0,
"asBoolean": true,
"asByte": 0,
"asCharacter": "string",
"asDouble": 0,
"asFloat": 0,
"asInt": 0,
"asJsonPrimitive": {
"asBigDecimal": 0,
"asBigInteger": 0,
"asBoolean": true,
"asByte": 0,
"asCharacter": "string",
"asDouble": 0,
"asFloat": 0,
"asInt": 0,
"asLong": 0,
"asNumber": {},
"asShort": 0,
"asString": "string",
"boolean": true,
"jsonArray": true,
"jsonNull": true,
"jsonObject": true,
"jsonPrimitive": true,
"number": true,
"string": true
},
"asLong": 0,
"asNumber": {},
"asShort": 0,
"asString": "string",
"jsonArray": true,
"jsonNull": true,
"jsonObject": true,
"jsonPrimitive": true
},
"transactionID": "20181206084927090_687_375231000459",
"transferCode": "ATLAS_P2M_AUTH-REVERSAL"
}
Withdrawal of funds from RAH account
Let us consider a scenario of fund transfer from one Real Account Holder (RAH) to another Legal Account Holder (LAH). In a card transaction, an individual swipes using the payment card at the merchant. The money travels from an individual’s account to the bank’s account.
Endpoint URI
Input parameters
-
ifiID
: Required. Unique identifier of the IFI. -
requestID
: Required. This is generated by the requester. Should be globally unique. Zeta will reject a duplicate token generation request ID. -
amount
: Required. Amount that needs to be transferred. Possible value supported for currency are INR, USD, and more. -
transferCode
: Required. Code to specify the mode of fund transfer like IMPS and NEFT. -
debitAccountID
: Required. Unique identifier of the Real Account Holder’s account from where the funds will be transferred. A fintech * account is provisioned during the on-boarding. -
creditAccountID
: Required. Unique identifier of the Legal Account Holder’s account to which the funds will be transferred. -
transferTime
: Optional. Time required to transfer funds. remarks: Optional. Remark of the fund transfer.
Samples
curl -X POST \
https://fusion.preprod.zeta.in/api/v1/ifi/140827/transfers \
-H 'Content-Type: application/json' \
-H 'X-Zeta-AuthToken: {{AUTH_TOKEN}}' \
-d '{
"requestID": "8439e4b6-1b63-4a28-afa1-34206a44425a",
"amount": {
"currency": "INR",
"amount": 21
},
"transferCode": "ATLAS_A2A_AUTH",
"debitAccountID": "422782d2-adcd-49a6-bde1-eb0461a582ba",
"creditAccountID": "608332f5-2d31-4377-bf91-5492dda0f694",
"transferTime": 1574741608000,
"remarks": "Transfer Funds between Account Holders",
"attributes": {}
}'
{
"requestID": "8439e4b6-1b63-4a28-afa1-34206a44425a",
"transferID": "20191126041456390_3712_8439e4b6-1b63-4a28-afa1-34206a44425a",
"status": "SUCCESS"
}
Related articles
Fusion Events
List of webhooks to subscribe to & receive event notification
Account API Error Codes
List of error codes specific to Account APIs
Generic Error Codes
List of general error codes across fusion
Account APIs
Create Accounts, manage Bundles, view transactions
Account Lifecycle
Key concepts related to the account and account types