DRAP - Remittance as a Service - Whitelabel Model
LuLu Money's D9 Platform Services [DPS] provides an ecosystem to manage cross-border payments. DPS supports agency models for both white labeling and payment as service modes. Agents are provided with multiple integration channels to consume services, either through DPS' direct APIs or through reliable DLT networks. This document covers the direct API integration model.
Version History:
Version | Description | Author | Date (dd/mm/yyyy) |
1.0.0 | DRAP API Document | Ajai Antony | 07/06/2024 |
1.0.1 | Transaction Status Update API | Ajai Antony | 25/06/2024 |
1.0.2 | Service types included under - Get Codes, Create Quote & Create Txn | Ajai Antony | 04/07/2024 |
1.0.3 | Host details updated | Ajai Antony | 28/08/2024 |
1.0.4 | BRN Update API changes | Ajai Antony | 24/10/2024 |
1.0.5 | Updated Master APIs | Ajai Antony | 05/11/2024 |
1.0.6 | (1) Create Quote & Create Transaction payloads for B2B (2) Create Quote payload for NRE/Non-NRE validation for IN corridor | Ajai Antony | 20/02/2025 |
1.0.7 | (1) Updated sandbox IP details (2) Included RFI_REQUESTED substate | Ajai Antony | 14/08/2025 |
1.0.8 | Beneficiary Onboarding Status details | Ajai Antony | 14/10/2025 |
CLASSIFICATION: PUBLIC
- 1 Overview
- 1.1 Transaction Work Flow
- 1.2 eKYC Flow
- 2 Host Details
- 3 Access & Privileges
- 3.1 Access Token API
- 4 Transaction APIs
- 5 Callback APIs
- 6 Master APIs
- 6.1 Get Codes
- 6.2 Get Service Corridor
- 6.3 Get Bank Master
- 6.4 Get Bank By Id
- 6.5 Get Branch Master
- 6.6 Get Branch By Id
- 6.7 Branch Search
- 6.8 Get Agent Credit Balance
- 6.9 Get Rates
- 6.10 Account validation
- 7 Transaction States and Sub-States
- 8 General Error Codes
- 9 Business Error Codes
- 10 Policies
- 10.1 Date-Time Formats
- 10.2 Amounts
- 10.3 Bank Details
- 10.4 Request Header
- 11 API Response Time
- 11.1 Access & Privileges
- 11.2 Transaction APIs
- 11.3 Reference APIs
Overview
Transaction Work Flow
eKYC Flow
Host Details
Type | Domain Name | Environment | IP Address | Port |
Public IP -Inbound | Production | 20.74.248.66 | 443 | |
Public IP - Outbound | Production | 20.233.88.26 | 443 | |
Public IP -Inbound | Sandbox | 129.151.150.45 | 443 | |
Public IP - Outbound | Sandbox | 86.96.250.201 | 443 |
Access & Privileges
DPS API is available for access if its security gate's requirements are cleared.
Connections to be over HTTPS with minimum TLS 1.2
The connecting application and servers to be whitelisted (IP, Domain, etc)
The connecting application should get authenticated and get access tokens using the credentials provided by the payment processor for accessing any API or application
The connecting application should periodically plan and published payment processor with its traffic and quota expected
The connecting application should refrain from any unwanted or repetitive calls that are prone to get the account to go to lock state
Access Token API
Get Token API to be used to get API access tokens from DPS identity & security engine using the credential provided to the sending institute by the payment processor. An access token is a key to the gateway to access any other API. The API will return the access token if the user is successfully authenticated and have the authorization to access these services. Every access token is tagged with validity and the expiry duration is echoed in the response for the calling application to manage the state accordingly. Token if used after its validity period restrict access to any services and a new token to be generated in this case.
API | /auth/realms/cdp/protocol/openid-connect/token |
Method | POST |
Headers | Content-Type : application/x-www-form-urlencoded |
Payload | --data-urlencode 'grant_type=password' \
--data-urlencode 'client_id=<<client_id>>' \
--data-urlencode 'client_secret=<<secret>>' \
--data-urlencode 'username=<<username>>' \
--data-urlencode 'password=<<password>>'
|
Response | {
"access_token": "<<access_token_value>>",
"expires_in": 900,
"refresh_expires_in": 1800,
"refresh_token": "<<refresh_token_value>>",
"token_type": "Bearer",
"not-before-policy": 0,
"session_state": "-----",
"scope": "-----"
} |
Header
Name | Data Type | Max Length | Mandatory | Description |
|---|---|---|---|---|
Content-Type | String | 36 | Yes | application/x-www-form-urlencoded |
Payload
Name | Data Type | Max Length | Mandatory | Description |
|---|---|---|---|---|
grant_type | String | 10 | Yes | Grant type. Will up provided |
scope | String | 60 | Yes | Scope name. Will be provided |
client_id | String | 60 | Yes | Client Id. Will be provided |
client_secret | String | 60 | Yes | Client secret. Will be provided |
username | String | 60 | Yes | Admin user name |
password | String | 60 | Yes | Admin password |
Response
Name | Data Type | Max Length | Mandatory | Description |
|---|---|---|---|---|
access_token | String | 600 | Yes | Access token to access the APIs |
expires_in | Integer | - | Yes | access_token expiry time in seconds |
refresh_expires_in | Integer | - | No | refresh_token expiry time in seconds |
refresh_token | String | 600 | No | Refresh Token |
token_type | String | - | Yes | Token type |
not-before-policy | Integer | - | - | - |
session_state | String | - | - | - |
scope | String | - | Yes | Scope details |
Transaction APIs
A simple three-step transaction processing model where the APIs are invoked in an order of creating quote as the first step, then creating a payment order & authorizing a payment order for the last mile processing.
Create Quote API is to create and lock the exchange rate and fee for a payment transaction. This API expects details of the payment order like send-to-receive currency pair & its countries, amount wished to send or amount wished to be received by the beneficiary, and the mode of receipt of the payment. This API responds with the exchange rate for the currency pair, fee for processing the transaction, tax (if applicable) with the send or receive amounts calculated. The response also contains an identifier for the Quote received “Quote ID“ which can be used for subsequent API calls to instruct the system to refer to previously reserved quotes. Every quote comes with an expiry timestamp which is invalid if used after this period. The price guarantee identifier denotes if the quote is just indicative or reserved.
Create Transaction API is to create a payment order. This API expects sender details, sender source of the fund, receiver/beneficiary details, receiving mode & purpose, receiving institute, and reference to Quote (Quote ID from the previous message). On the receipt of details in this API, the data is validated against the payload structure & datatype definition, quote validity, agent fund availability, corridor & delivery mode wise mandates, and is also screened through the world-check’s watchlist data in the designated system. If there is no immediate rejection or failure on the above checks & balances, a transfer reference number is generated and stored.
If the sending institute agreed to the agency model (white-labelled model), customer registration is a pre-requisite and the create transaction API message can just carry the customer registration number within the sender block.
If the sending institute agreed to the payment services model, the customer registration is not mandated and for the create transaction API, it should carry the detailed sender information.
If the agent is agreed with a quote outside this model, then the quote object is also expected with this message.
This API returns failure if any validation or balance check fails.
Confirm Transaction API is the payment order authorization API from the sending institute to the processing institute. When the sending institute invokes this API, the payment processor passes this message through the AML screening & monitoring checks in the designated systems. On the successful AML checks, the payment order is then taken by the payment processor to the correspondent partners and subsequently, the value of the transaction is deducted against the balance of the agent held in the system.
Enquiry API can be used by the sending institute to pool the transaction status for any progress on its status on a periodic interval.
Reference code API to be referred for the properties where the flags and codes are defined by the system is expected by the transaction API. Reference codes to be stored and mapped at sending institution’s systems and to be used while passing the message.
Create Quote
API to get the exchange rate and fee details between the sending country and receiving country and the currency pair.
API | /amr/ras/api/v1_0/ras/quote |
Authorization | Bearer Token |
Method | Post |
Headers | Content-Type:application/json sender : <<sender_name>> company: <<company_code>> branch: <<branch_code>>
|
Payload (Bank Transfer) | {
"sending_country_code": "AE",
"sending_currency_code": "AED",
"receiving_country_code": "PK",
"receiving_currency_code": "PKR",
"sending_amount": 100,
"receiving_mode": "BANK",
"type": "SEND",
"instrument": "REMITTANCE"
} |
Payload (Bank Transfer with Bank details For Pakistan) | {
"sending_country_code": "AE",
"sending_currency_code": "AED",
"receiving_country_code": "PK",
"receiving_currency_code": "PKR",
"sending_amount": 100,
"receiving_mode": "BANK",
"iso_code": "ALFHPKKA068",
"type": "SEND",
"instrument": "REMITTANCE"
} |
Payload (Bank Transfer with Bank details For India) | {
"sending_country_code": "AE",
"sending_currency_code": "AED",
"receiving_country_code": "PK",
"receiving_currency_code": "PKR",
"sending_amount": 100,
"receiving_mode": "BANK",
"routing_code": "FDRL0001883",
"iso_code": "ALFHPKKA068",
"type": "SEND",
"instrument": "REMITTANCE"
} |
Payload (Cash Pick up) | {
"sending_country_code": "OM",
"sending_currency_code": "OMR",
"receiving_country_code": "IN",
"receiving_currency_code": "INR",
"sending_amount": 101,
"receiving_mode": "CASHPICKUP",
"type": "SEND",
"instrument": "REMITTANCE",
"correspondent": "RR",
"bank_id": "INOPCP",
"branch_id": "OP"
}
|
Payload (MTO Mobile Cash) | {
"sending_country_code": "AE",
"sending_currency_code": "AED",
"receiving_country_code": "IN",
"receiving_currency_code": "INR",
"sending_amount": 101,
"receiving_mode": "MOBILECASH",
"type": "SEND",
"instrument": "REMITTANCE",
"correspondent": "RR",
"correspondent_id": "INOPCP",
"correspondent_location_id": "OP"
} |
Payload (Mobile Wallet) | {
"sending_country_code": "AE",
"sending_currency_code": "AED",
"receiving_country_code": "EG",
"receiving_currency_code": "EGP",
"sending_amount": 101,
"receiving_mode": "MOBILEWALLET",
"type": "SEND",
"instrument": "REMITTANCE",
"correspondent": "LR",
} |
Payload (Counter party provide rate and Ccy) | { |
Payload ( Payload for account_category INVALIDATE for account validation) | { |
Response | {
"status": "success",
"status_code": 200,
"data": {
"quote_id": "1279123122023835",
"created_at": "2023-08-08T09:23:31.152+04:00",
"created_at_gmt": "2023-08-08T05:23:31.152Z",
"expires_at": "2023-08-08T09:53:31.152+04:00",
"expires_at_gmt": "2023-08-08T05:53:31.152Z",
"receiving_country_code": "PK",
"receiving_currency_code": "PKR",
"sending_country_code": "AE",
"sending_currency_code": "AED",
"sending_amount": 100,
"receiving_amount": 7576.39,
"total_payin_amount": 107.35,
"fx_rates": [
{
"rate": 75.76388942,
"base_currency_code": "AED",
"counter_currency_code": "PKR",
"type": "SELL"
},
{
"rate": 0.0131989,
"base_currency_code": "PKR",
"counter_currency_code": "AED",
"type": "SELL"
},
{
"rate": 3.673,
"base_currency_code": "USD",
"counter_currency_code": "AED",
"type": "SELL"
},
{
"rate": 282.83,
"base_currency_code": "USD",
"counter_currency_code": "PKR",
"type": "SELL"
}
],
"fee_details": [
{
"type": "COMMISSION",
"model": "OUR",
"currency_code": "AED",
"amount": 7,
"description": "Commission"
},
{
"type": "TAX",
"model": "OUR",
"currency_code": "AED",
"amount": 0.35,
"description": "Tax"
}
],
"settlement_details": [
{
"charge_type": "COMMISSION",
"value": 2.8,
"currency_code": "AED"
},
{
"charge_type": "TREASURYMARGIN",
"value": 0.008,
"currency_code": "AED"
},
{
"charge_type": "INPUTTAX",
"value": 0.14,
"currency_code": "AED"
}
],
"correspondent_rules": [
{
"field": "purpose_of_txn",
"rule": "it is mandatory"
},
{
"field": "receive_amount",
"rule": "cannot be null"
},
{
"field": "receiving_currency_code",
"rule": "it is mandatory"
},
{
"field": "receiver.bank_details.account_number",
"rule": "it is mandatory"
},
{
"field": "receiver.first_name",
"rule": "it is mandatory and should consists of alphabets and not exceed 60 characters"
},
{
"field": "receiver.last_name",
"rule": "it is mandatory and should consists of alphabets and not exceed 60 characters"
},
{
"field": "receiver.mobile_number",
"rule": "it is mandatory and should start with +20 followed by 10 digits"
},
{
"field": "sender.first_name",
"rule": "it is mandatory and should consists of alphabets and not exceed 60 characters"
},
{
"field": "sender.last_name",
"rule": "it is mandatory and should consists of alphabets and not exceed 60 characters"
},
{
"field": "sender.sender_id.id",
"rule": "it is mandatory and should not exceed 50 characters"
},
{
"field": "transaction.quote_id",
"rule": "it is mandatory"
},
{
"field": "receiving_mode",
"rule": "cannot be null"
}
],
"price_guarantee": "FIRM"
}
} |
Response (for Counter party provide rate and Ccy) | { |