Download OpenAPI specification:Download
Multipay API is a RESTful Web Service that acts as a communication bridge between you and Multipay's payment channels. It helps you to easily accept payments, disburse funds, manage subscriptions and much more in automated manner. You can choose to integrate with a wide variety of payment options provided by Multipay. Our highly generic API is structured for all the payment methods. You just need to change the payment method and add the payment specific parameters to integrate with different payment methods.
You can test the payment integration using Multipay Sandbox Environment. After testing this integration, you can start real time transaction by Switching to Production Environment. You can use the Sandbox Environment to test your integrations, before going for real-time transactions. After you are satisfied with the results, you can switch to Production Environment.
The sandbox environment is perfect for prototyping and integration testing. The APIs on sandbox respond accordingly to your requests but without connecting to the live Multipay backend. The sandbox APIs perfectly match those in production, so you can write code against the sandbox environment and eventually just switch to the production endpoints.
When using the Mutlipay Payments API on the sandbox environment, please avoid using real payment method details (such as real card numbers). Even though your payment method will not be charged on the sandbox environment, it is a best practice to use fake details instead.
Please note below the specific hosts you should use when accessing the APIs on sandbox and production environments.
Sandbox : https://dev-payment-gateway.mdd.co.id
Production : https://api-multipay.multidaya.id
To ensure secure client server communication, every API call must be authorized. Of the various Authorization methods available, Multipay uses the Bearer Token. Bearer tokens allow requests to authenticate using an access key, such as a JSON Web Token (JWT). The token expiry time is 1 day
and must be renewed at the end of day. The token is a text string, included in the request header. To get tokens you can go to the register page on the multipay dashboard at https://dash-multipay.multidaya.id/register
.
On Production Environment, you can use api_key as email and secret_key as password to avoid Multipay Password Policy which applied in every 90 days, since the email and password can be used for Multipay dashboard panel (https://dash-multipay.multidaya.id
) . This new credential can be requested by email to marketing@multidaya.id once you have passed and complied the SIT/UAT process.
email / api_key | string Please enter your email / api_key (production) |
password / secret_key | string Please enter your password / secret_key (production) |
{- "email": "test@email.com",
- "password": "test123"
}
{- "response": {
- "code": 200,
- "message": "Access granted",
- "ip": "10.20.30.229",
- "host_timestamp": "2022-07-19 11:38:02",
- "latency": 0.5239009857177734
}, - "data": {
- "name": "Test Business",
- "username": "test",
- "auth_type": "MERCHANT_GROUP",
- "gid": "07f36807be234877b8ba085651ae07b2",
- "mid": "07f36807be234877b8ba085651ae07b2",
- "access_token": "DOkA9wCIjoTcRI8VInghCM7z4k7ipcUvcAGWWAUUi6yxQnFyoy3Oua4Mzzvt24VUoVtr1G1yt8dYoxMmghqkyo93U96M+zYyZ5m/AEjGGZ0jWg4j9hws7ZwDG/JQAVkB.ooxhtwUmF5YA37rMQysuotz9R26fEFo+VxxYD+yVHXMqTTfp8wLWLvPofz5bPXbx1oaubAirF54nyVzn8E/48yq5Dd58OMrXMkXSofmEgq6LSZsgt8NccwoBy+HvVt+0VGa8gjLoh+n8498ZioKT/elavEQtVi2EWLSfuTbGdkg/mhAjk4DY+SvsvFdoM4Jhze37lzGwaCPETh7PwFXq14IXsTDvm8bfjVHjMOtW18rucWwivb/gTKzN91ZrFB1VE7c0TCey5C1bXQbUBXkz6MYjm0zXlC69SSlO+UtBIHwsr0OiuGyiGeCbBrx8TL5p6owG5XukLveps67DrDLKaoPSW+1b/n2cjdwu76wa2Klkh4ef0Jzg2upJGFtBTrC43KUg+iWcS8T/RlgzAhTHurvxfD0bnJ22zK3iAOPJMVlwtavCfpEaPXwuJ+N1l2KQ.lKGZjbrMcBkJa_9TP-VsglHk3kVbRNDfOPK8ZWJ1M00",
- "token_type": "bearer",
- "expires_in": 86400,
- "roles": {
- "is_admin": 1,
- "is_staff": 0,
- "is_finance": 0,
- "is_dev": 0,
- "is_service": 0,
- "use_sandbox": 0
}, - "actions": {
- "ignore_balance": 0,
- "access_config": 1,
- "access_payment_activation": 1
}
}
}
Merchant can create Payment Link using the API. Payment Link is a web-based link (URL) which can be shared to Customer to receive payments from them like an invoice. The link will redirect them to Multipay hosted payment web page.
Please make sure you have set the callback url.
Desktop :
Mobile :
When using the Payment Link, Merchant can also override the selected payment channel for user seamless purpose. This will disable the payment channel option for the user, so user just can continue to proceed the payment.
Below example how to override the payment channel using query string selected_provider on the url, while provider can refer the same provider table list (ex : ovo, gopay, card-not-present, linkaja-qris, etc).
https://payment-link.multidaya.id/pay-v2/?ses=173270e64d00b240&selected_provider=ovo
Desktop :
Mobile :
Authorization | string Example: Bearer {access_token} |
Content-Type | string Example: application/json |
Accept | string Example: */* |
tid | string Please enter your terminal/device/user id |
reff_no | string Please enter your unique reference number |
Array of objects The list item you selected |
{- "tid": "20220107",
- "reff_no": "728a7f38-1294a-4f2b-a036-ae1c54test68",
- "items": [
- {
- "name": "Bakso",
- "unit_price": "5000",
- "qty": "2"
}, - {
- "name": "Mie Ayam",
- "unit_price": "6000",
- "qty": "1"
}
]
}
{- "response": {
- "code": 200,
- "message": "Success create order",
- "ip": "10.20.30.229",
- "host_timestamp": "2022-07-19 11:40:04",
- "latency": 0.7190721035003662
}, - "data": {
- "trx_id": "273RMV1EIKG00OW0",
- "reff_no": "728a7f38-1294a-4f2b-a036-ae1c54test68",
- "mid": "07f36807be234877b8ba085651ae07b2",
- "tid": "20220107",
- "items": [
- {
- "name": "Bakso",
- "unit_price": "5000",
- "qty": "2"
}, - {
- "name": "Mie Ayam",
- "unit_price": "6000",
- "qty": "1"
}
], - "init_amount": 11000,
- "fee": 0,
- "amount": 11000,
- "status": "PENDING",
- "trx_date": "2022-07-19 11:40:04",
- "expired_at": "2022-07-20 11:40:04",
}
}
Payment API is intended for performing transactions and deduct funds from the customer, depending on the payment method selected.
Please make sure you have set the callback url.
Merchant can opt to edit or add custom notification URLs on every transaction. It can be achieved by attaching optional custom_callback parameter on this request.
Authorization | string Example: Bearer {access_token} |
Content-Type | string Example: application/json |
Accept | string Example: */* |
tid | string Please enter your terminal/device/user id |
reff_no | string Please enter your unique reference number |
method | string Please enter the available payment method |
provider | string Please enter the available payment provider |
amount | integer Please enter the total amount of your transaction |
Array of objects (Optional) The list item you selected | |
custom_callback | string (Optional) Custom Override Callback URL (Dashboard Callback URL will be ignored) |
{- "tid": "20220107",
- "reff_no": "728a7f38-1294a-4f2b-a036-ae1c54test68",
- "method": "e-wallet",
- "provider": "dana-qris",
- "amount": 15000
}
{- "response": {
- "code": 200,
- "message": "Success create order",
- "ip": "10.20.30.229",
- "host_timestamp": "2022-07-19 11:51:58",
- "latency": 2.454998016357422
}, - "data": {
- "trx_id": "273RMV1EIKG00OW0",
- "reff_no": "728a7f38-1294a-4f2b-a036-ae1c54test68",
- "mid": "07f36807be234877b8ba085651ae07b2",
- "tid": "20220107",
- "items": [
- {
- "name": "GENERATED ITEM",
- "unit_price": "15000",
- "qty": "1"
}
], - "init_amount": 15000,
- "fee": 160,
- "amount": 15160,
- "status": "PENDING",
- "trx_date": "2022-07-19 11:40:04",
- "expired_at": "2022-07-20 11:40:04",
- "method": "e-wallet",
- "provider": "dana-qris",
- "how_to_pay": [
- {
- "channel": "Dana atau Aplikasi Fintech/Perbankan lainnya",
- "language": "id",
- "step": [
- "Buka aplikasi dan buka fitur Scan atau Pindai",
- "Pindai kode QR diatas",
- "Masukkan PIN anda",
- "Selanjutnya tekan tombol <strong>Cek Status Pembayaran</strong> di halaman ini"
]
}
]
}
}
To get the status of a transaction, you can send a request to Multipay API. It will then send back the transaction status. This method requires the transaction reff_no
(or trx_id
) as an identifier.
Please make sure you have set the callback url.
Authorization | string Example: Bearer {access_token} |
Content-Type | string Example: application/json |
Accept | string Example: */* |
reff_no | string Please enter your unique reference number |
{- "reff_no": "728a7f38-1294a-4f2b-a036-ae1c54test68"
}
{- "response": {
- "code": 200,
- "message": "Success status order",
- "ip": "10.20.30.229",
- "host_timestamp": "2022-07-19 11:40:52",
- "latency": 0.8553318977355957
}, - "data": {
- "trx_id": "273RMV1EIKG00OW0",
- "reff_no": "728a7f38-1294a-4f2b-a036-ae1c54test68",
- "status": "PENDING",
- "expired_at": "2022-07-20 11:40:04",
- "method": "e-wallet",
- "provider": "dana-qris",
- "fee": 160,
- "init_amount": 16000,
- "amount": 16160
}
}
The void API is used to void a paid order before the payment is captured or the order confirmed by a merchant or payer and then return money to the payer.
For void payments, here is a list of available acquirers :
What you should know :
Authorization | string Example: Bearer {access_token} |
Content-Type | string Example: application/json |
Accept | string Example: */* |
trx_id | string Please enter your unique transaction id |
{- "trx_id": "AEYGYDTIEC8CO044"
}
{- "response": {
- "code": 200,
- "message": "Success void order",
- "ip": "10.20.30.229",
- "host_timestamp": "2022-07-19 11:40:52",
- "latency": 0.8553318977355957
}, - "data": {
- "trx_id": "AEYGYDTIEC8CO044",
- "mid": "338d0c70c2484247b24f5be94328991c",
- "tid": "20220107",
- "reff_no": "test811102222",
- "trx_date": "2022-10-11 18:06:59",
- "fee": 20,
- "init_amount": 1000,
- "amount": 1020,
- "method": "e-wallet",
- "provider": "ovo",
- "how_to_pay": [
- {
- "channel": "Aplikasi OVO",
- "language": "id",
- "step": [
- "Klik bayar dengan OVO.",
- "Anda akan diarahkan di aplikasi OVO. (Seems not right)",
- "Cek detail transaksi anda dan klik Bayar.",
- "Masukkan PIN Anda.",
- "Transaksi selesai, anda tidak perlu melakukan konfirmasi pembayaran."
]
}
], - "items": [
- {
- "name": "token listrik",
- "unit_price": "1000",
- "qty": "1"
}
], - "status": "VOID",
- "paid_at": "2022-10-11 18:07:59",
- "expired_at": "2022-10-12 18:06:59",
- "voided_at": "2022-10-11 18:08:02"
}
}
The fee API provides a way to retrieve a list of fees associated with a specific service, product, or transaction. Fees are charges imposed by a business or organization for various purposes, such as processing payments, providing services, or covering administrative costs. This API is particularly useful for businesses, financial institutions, and e-commerce platforms to provide transparency to their customers regarding the fees associated with their services
Authorization | string Example: Bearer {access_token} |
Content-Type | string Example: application/json |
Accept | string Example: */* |
method | string Please enter the available payment method |
provider | string Please enter the available payment provider |
amount | string Please enter the total amount of your transaction |
{- "method": "e-wallet",
- "provider": "gopay-qris",
- "amount": "13000"
}
{- "response": {
- "code": 200,
- "message": "Success inquiry fee",
- "ip": "192.168.8.4",
- "host_timestamp": "2023-09-15 17:44:55",
- "latency": 2.4571709632873535
}, - "data": {
- "init_amount": 12909,
- "fee": 91,
- "amount": 13000
}
}
This section introduces the events that may occur subsequent to payment creation. Each of the events lists the additional fields in a typical notification payload.
This notification is responsible for sending a notification to a specified API endpoint, and performs retries in case of failures. It then computes an idempotency key using the SHA-256 algorithm and applies it to the notification. The notification waits for a certain amount of time before retrying the notification to the specified URL.
This key parameter should be added in your request header, it must be composed from SHA-256 your epoch time + your encoded payload in base64 format.
Epoch : String unix epoch, must be same with X-Api-Timestamp
Payload : String encoded body payload, without this parameter, the service will not able to be accessed
Sample in PHP :
$signature = base64_encode(hash_hmac('sha256', <Your X-Api-Timestamp> . <Your Encoded Body Payload>, <Your Secret Key>, true));
Sample in JS (Obsolete) :
var signature = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA256(<Your X-Api-Timestamp> + <Your Encoded Body Payload>, <Your Secret Key>, true));
Sample in JS (New) :
var signature = CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(CryptoJS.HmacSHA256(<Your X-Api-Timestamp> + <Your Encoded Body Payload>, <Your Secret Key>).toString(CryptoJS.enc.Hex)));
Success means that Multipay accepts the payment.
{
"trx_id": "...",
"mid": "...",
"tid": "...",
"reff_no": "...",
"trx_date": "...",
"fee": "...",
"init_amount": "...",
"amount": "...",
"method": "...",
"provider": "...",
"status": "SUCCESS",
"paid_at": "..."
}
The transaction was rejected by the payment provider.
{
"trx_id": "...",
"mid": "...",
"tid": "...",
"reff_no": "...",
"trx_date": "...",
"fee": "...",
"init_amount": "...",
"amount": "...",
"method": "...",
"provider": "...",
"status": "FAILED",
"expired_at": "..."
}
Transaction is not available for processing, because the payment was delayed.
{
"trx_id": "...",
"mid": "...",
"tid": "...",
"reff_no": "...",
"trx_date": "...",
"fee": "...",
"init_amount": "...",
"amount": "...",
"method": "...",
"provider": "...",
"status": "EXPIRED",
"expired_at": "..."
}
The transaction is canceled. It can be triggered by merchant.
{
"trx_id": "...",
"mid": "...",
"tid": "...",
"reff_no": "...",
"trx_date": "...",
"fee": "...",
"init_amount": "...",
"amount": "...",
"method": "...",
"provider": "...",
"status": "CANCEL",
"canceled_at": "..."
}
Multipay will perform below action based on client host http_header status code as follow :
Body response is no longer required. But we will log any response value for audit purpose if given.The amount of time to wait before retrying is equal to 5 * incrementing minutes.
QRIS is a QR payment standard in Indonesia, developed by Bank Indonesia (BI). Users can scan and pay the QR from any payment providers registered.
For QRIS, we are currently integrated with the acquirers given below.
The steps to integrate with QRIS are given below.
Send a Payment API request with the details of the transaction such as tid
, reff_no
, method
, provider
and amount
. Successful request returns a QR code image URL.
The attributes to be sent to Payment API QRIS are given below.
{
"tid": "...",
"reff_no": "...",
"method": "e-wallet",
"provider": "{provider}",
"amount": "..."
}
{
"response": {
"code": 200,
"message": "Success create order",
"ip": "10.20.30.229",
"host_timestamp": "2022-07-19 11:51:58",
"latency": 2.454998016357422
},
"data": {
"trx_id": "...",
"reff_no": "...",
"mid": "...",
"tid": "...",
"items": [
{
"name": "...",
"unit_price": "...",
"qty": "..."
}
],
"init_amount": 0,
"fee": 0,
"amount": 0,
"status": "...",
"trx_date": "...",
"expired_at": "...",
"payment_link": "...",
"method": "e-wallet",
"provider": "{provider}",
"how_to_pay": [
{
"channel": "...",
"language": "...",
"step": [
"...",
"...",
"...",
"..."
]
}
]
}
}
Virtual accounts are unique account numbers assigned within traditional, physical bank accounts, which are also known as settlement accounts. They can be used to send and receive money on behalf of the settlement account, where the funds are ultimately held.
For Virtual Account, we are currently integrated with the acquirers given below.
The steps to integrate with Virtual Account are given below.
Send a Payment API request with the details of the transaction such as tid
, reff_no
, method
, provider
and amount
. Successful request returns a VA number.
The attributes to be sent to Payment API Virtual Account are given below.
{
"tid": "...",
"reff_no": "...",
"method": "virtual-account",
"provider": "{provider}",
"amount": "..."
}
{
"response": {
"code": 200,
"message": "Success create order",
"ip": "10.20.30.229",
"host_timestamp": "2022-07-19 11:51:58",
"latency": 2.454998016357422
},
"data": {
"trx_id": "...",
"reff_no": "...",
"mid": "...",
"tid": "...",
"items": [
{
"name": "...",
"unit_price": "...",
"qty": "..."
}
],
"init_amount": 0,
"fee": 0,
"amount": 0,
"status": "...",
"trx_date": "...",
"expired_at": "...",
"payment_link": "...",
"method": "virtual-account",
"provider": "{provider}",
"display_name": "...",
"account_number": "...",
"how_to_pay": [
{
"channel": "...",
"language": "...",
"step": [
"...",
"...",
"...",
"..."
]
}
]
}
}
E-Wallet is a secure money management app or online platform that allows you to make purchases with retailers on-site, transfer or send money and track rewards programs. You can link the e-wallet to your bank account or pay as you go with a prepay option.
For E-Wallet, we are currently integrated with the acquirers given below.
The steps to integrate with E-Wallet are given below.
Send a Payment API request with the details of the transaction such as tid
, reff_no
, method
, provider
and amount
. For ovo and linkaja-token providers must add msisdn
. Successful request returns a redirect link to acquirer app.
The attributes to be sent to Payment API E-Wallet are given below.
{
"tid": "...",
"reff_no": "...",
"method": "e-wallet",
"provider": "{provider}",
"amount": "...",
"msisdn": "..."
}
{
"response": {
"code": 200,
"message": "Success create order",
"ip": "10.20.30.229",
"host_timestamp": "2022-07-19 11:51:58",
"latency": 2.454998016357422
},
"data": {
"trx_id": "...",
"reff_no": "...",
"mid": "...",
"tid": "...",
"items": [
{
"name": "...",
"unit_price": "...",
"qty": "..."
}
],
"init_amount": 0,
"fee": 0,
"amount": 0,
"status": "...",
"trx_date": "...",
"expired_at": "...",
"payment_link": "...",
"method": "virtual-account",
"provider": "{provider}",
"link": "...",
"how_to_pay": [
{
"channel": "...",
"language": "...",
"step": [
"...",
"...",
"...",
"..."
]
}
]
}
}
Retail is the sale of goods and services to consumers, in contrast to wholesaling, which is sale to business or institutional customer.
For Retail, we are currently integrated with the acquirers given below.
The steps to integrate with Retail are given below.
Send a Payment API request with the details of the transaction such as tid
, reff_no
, method
, provider
and amount
. Successful request returns a payment code.
The attributes to be sent to Payment API Retail are given below.
{
"tid": "...",
"reff_no": "...",
"method": "retail-outlet",
"provider": "{provider}",
"amount": "..."
}
{
"response": {
"code": 200,
"message": "Success create order",
"ip": "10.20.30.229",
"host_timestamp": "2022-07-19 11:51:58",
"latency": 2.454998016357422
},
"data": {
"trx_id": "...",
"reff_no": "...",
"mid": "...",
"tid": "...",
"items": [
{
"name": "...",
"unit_price": "...",
"qty": "..."
}
],
"init_amount": 0,
"fee": 0,
"amount": 0,
"status": "...",
"trx_date": "...",
"expired_at": "...",
"payment_link": "...",
"method": "virtual-account",
"provider": "{provider}",
"display_name": "...",
"account_number": "...",
"how_to_pay": [
{
"channel": "...",
"language": "...",
"step": [
"...",
"...",
"...",
"..."
]
}
]
}
}
By using the Card payment method, customers can make payments using any credit card or debit card that can transact online within the Visa, MasterCard and JCB. Multipay sends real-time notifications when a customer completes a payment.
For Card Payment, we are currently integrated with the acquirers given below.
The steps to integrate with Card Payment are given below.
Send a Payment API request with the details of the transaction such as tid
, reff_no
, method
, provider
and amount
. Successful request returns a authentication page url.
The attributes to be sent to Payment API Card Payment are given below.
{
"tid": "...",
"reff_no": "...",
"method": "debit-credit",
"provider": "{provider}",
"amount": "..."
}
{
"response": {
"code": 200,
"message": "Success create order",
"ip": "10.20.30.229",
"host_timestamp": "2022-07-19 11:51:58",
"latency": 2.454998016357422
},
"data": {
"trx_id": "...",
"reff_no": "...",
"mid": "...",
"tid": "...",
"items": [
{
"name": "...",
"unit_price": "...",
"qty": "..."
}
],
"init_amount": 0,
"fee": 0,
"amount": 0,
"status": "...",
"trx_date": "...",
"expired_at": "...",
"payment_link": "...",
"method": "debit-credit",
"provider": "{provider}",
"link": "...",
"how_to_pay": [
{
"channel": "...",
"language": "...",
"step": [
"...",
"...",
"...",
"..."
]
}
]
}
}