DRAP - Payments as a Service - For FIs

DRAP - Payments as a Service - For FIs

 

LuLu Money's D9 Platform Services [DPS] provides an ecosystem to manage cross-border payments. DPS’s Remittance as a Service stack supports FIs and Fintechs to host cross-border services to its customer directly from their apps. 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

06/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

1.0.9

Cancellation/Rejection Reason codes included under the Cancel Transaction

Ajai Antony

11/02/2026

1.0.10

Updated Public IP - Inbound for production

Ajai Antony

19/02/2026

CLASSIFICATION: PUBLIC

Overview

DPS Remittance as a Service stack provides cross-border payments APIs for delivering payments to bank accounts, mobile wallets, and cash pickups to 100+ corridors. This platform supports various models for managing rates and fees for the Financial Institutes or Fintech can choose.

  1. Wholesale Model - The platform publishes wholesale Fees & Rates to the connecting FI enabling the FI to add its markup on FX and Fees and decide the fee & cross-rate for its customer. This model provides freedom for connecting FIs to tailor their customer offering & experience by managing their revenue and promotions with markups on the FX rate & Fees by upraising or subsidizing its customers.

  2. Revenue Share - The platform manages the end Fee and exchange cross-rate offered to the FI’s Customer through its APIs. This model provides freedom for connecting FI to focus more on the consumer offering and experience by utilizing the platform capability to its fullest by using its treasury services. FI publishes its target margin on the Fee and FX to the platform and agrees to a revenue share.

Transaction Work Flow


Host Details

Type

Domain Name

Environment

IP Address

Port

Public IP -Inbound

https://drap.digitnine.com

Production

129.151.135.142

443

Public IP - Outbound

https://drap.digitnine.com

Production

20.233.88.26

443

Public IP -Inbound

https://drap-sandbox.digitnine.com

Sandbox

129.151.150.45

443

Public IP - Outbound

https://drap-sandbox.digitnine.com

Sandbox

86.96.250.201
213.42.166.201

443

Access & Privileges

DPS API is available for access if its security gate's requirements are cleared.

  1. Connections to be over HTTPS with minimum TLS 1.2

  2. The connecting application and servers are to be whitelisted (IP, Domain, etc)

  3. The connecting application should get authenticated and get access tokens using the credentials provided by the payment processor for accessing any API or application

  4. The connecting application should periodically plan and published payment processor with its traffic and quota expected

  5. 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

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

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

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 a 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, the amount wished to send or the 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, and 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 checks 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-labeled 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, 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 are to be stored and mapped in 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/paas/api/v1_0/paas/quote

Authorization

 Bearer Token

Method

Post

Headers

Content-Type:application/json

sender : <<sender_name>>
channel: <<channel_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", "type": "SEND", "instrument": "REMITTANCE" }

Payload (Cash Pickup)

{ "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)

{
    "sending_country_code": "SA",
    "sending_currency_code": "USD",
    "receiving_country_code": "IN",
    "receiving_currency_code": "INR",
    "receiving_mode": "BANK",
    "type": "SEND",
    "instrument": "REMITTANCE",
    "counterparty_currency_code": "SAR",
    "counterparty_currency_rate": 3.75,
    "counterparty_amount": 10000,
    "counterparty_payout_markup": 0.0005
}

Payload( Payload for account_category INVALIDATE for account validation)

{
"sending_country_code": "AE",
"sending_currency_code": "AED",
"receiving_country_code": "IN",
"receiving_currency_code": "INR",
"receiving_amount": 600000,
"receiving_mode": "BANK",
"type": "SEND",
"instrument": "REMITTANCE",
"payment_mode": "LE"
"account_number":"123122345678909",
"account_category":"INVALIDATE",
"receiver_first_name":"FNAME",
"receiver_middle_name":"MNAME",
"receiver_last_name":"LNAME",
"routing_code":"HDFC0007871",
"correspondent_id":"10011",
"correspondent_location_id":"68004224"
}

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)

{
    "status": "success",
    "status_code": 200,
    "data": {
        "quote_id": "7028124112739092",
        "created_at": "2024-05-06T18:46:06.456+08:00",
        "created_at_gmt": "2024-05-06T10:46:06.456Z",
        "expires_at": "2024-05-06T19:16:06.456+08:00",
        "expires_at_gmt": "2024-05-06T11:16:06.456Z",
        "receiving_country_code": "IN",
        "receiving_currency_code": "INR",
        "sending_country_code": "SA",
        "sending_currency_code": "USD",
        "sending_amount": 2637.4,
        "receiving_amount": 219530.148,
        "total_payin_amount": 2637.4,
        "counterparty_currency_code": "SAR",
        "fx_rates": [
            {
                "rate": 83.23747151,
                "base_currency_code": "USD",
                "counter_currency_code": "INR",
                "type": "SELL"
            },
            {
                "rate": 0.01201382,
                "base_currency_code": "INR",
                "counter_currency_code": "USD",
                "type": "SELL"
            }
        ],
        "fee_details": [
            {
                "type": "COMMISSION",
                "model": "OUR",
                "currency_code": "USD",
                "amount": 0,
                "description": "Commission"
            },
            {
                "type": "TAX",
                "model": "OUR",
                "currency_code": "USD",
                "amount": 0,
                "description": "Tax"
            }
        ],
        "settlement_details": [
            {
                "charge_type": "COMMISSION",
                "value": 0.4,
                "currency_code": "USD"
            },
            {
                "charge_type": "TREASURYMARGIN",
                "value": 0.4,
                "currency_code": "USD"
            },
            {
                "charge_type": "INPUTTAX",
                "value": 0.02,
                "currency_code": "USD"
            }
        ],
        "counterparty_details": [
            {
                "type": "AMOUNT",
                "value": 10000.0,
                "currency_code": "SAR"
            },
            {
                "type": "TOTALAMOUNT",
                "value": 10004.0,
                "currency_code": "SAR"
            },
            {                "type": "RATE",                "value": 0.04555183,                "currency_code": "INR"            },            {                "type": "SETTLEMENTRATE",                "value": 0.04505183,                "currency_code": "SAR"            },            {                "type": "SETTLEMENT",                "value": 9890.23,                "currency_code": "SAR"            },            {                "type": "MARGIN",                "value": 109.77,                "currency_code": "SAR"            }        ],        "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 and should consists of alphabets and not exceed 3 characters"            },            {                "field": "receiver.bank_details.account_number",                "rule": "it is mandatory and should not exceed 20 characters"            },            {                "field": "receiver.bank_details.routing_code",                "rule": "it is mandatory and should be alphanumeric and not exceed 11 characters"            },            {                "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": "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_address.address_line",                "rule": "it is mandatory and should be alphanumeric and not exceed 35 characters"            },            {                "field": "transaction.agent_transaction_ref_number",                "rule": "it is mandatory and should not exceed 25 characters"            },            {                "field": "transaction.quote_id",                "rule": "it is mandatory and should not exceed 25 characters for serviceProviderCode - DIGITSG"            },            {                "field": "receiving_mode",                "rule": "cannot be null"            }        ],        "price_guarantee": "FIRM"    }}