Online Transaction API
HTTP Response Code
All the APIs here are based on the HTTP request. The following are the response codes of an HTTP request that the Indodana Paylater API may response.
HTTP Response Code
Remarks
200
Everything work as expected
400
Bad request
401
Unauthorized
422
Validation Error
404
Not found
409
Conflict
429
Too many requests
50X
Server errors
API Method References
In this section, {base_url} will correspond to https://sandbox01-api.indodanafinance.co.id/chermes/merchant for sandbox environment. Subsequently, the {base_url} will correspond to https://api.indodanafinance.co.id/chermes/merchant for production environment.
Get Payment Calculation
POST https://{base_url}/v2/payment_calculation
This endpoint is used when you want to display the list of eligible payment types on your page to calculate and display the installment breakdown on your checkout page. It is recommended to show this calculation in your website to provide a better experience to the Customer.
* means the parameter is required
Headers
Authorization*
string
The generated Authentication signature with format Bearer {api_key}:{nonce}:{signature}
Request Body
amount*
string
Total amount of the transaction. Should be equal to the sum of all the <Item>s' costs below.
items*
array
Array of <Item>. Details of the shopping items in the transaction.
{
"status": "OK",
"payments": [
{
"amount": 2022000,
"installmentAmount": 2754000,
"monthlyInstallment": 229500,
"tenure": 12,
"tenureTimeUnit": "MONTH",
"totalInterest": 732000,
"provision": 22000,
"paymentType": "Bayar dalam 12 bulan",
"rate": 3,
"id": "12_months",
"merchantDiscountRate": 40000,
"totalTransactionAmount": 2000000
},
{
"amount": 2022000,
"installmentAmount": 2388000,
"monthlyInstallment": 398000,
"tenure": 6,
"tenureTimeUnit": "MONTH",
"totalInterest": 366000,
"provision": 22000,
"paymentType": "Bayar dalam 6 bulan",
"rate": 3,
"id": "6_months",
"merchantDiscountRate": 40000,
"totalTransactionAmount": 2000000
},
{
"amount": 2020500,
"installmentAmount": 2203500,
"monthlyInstallment": 734500,
"tenure": 3,
"tenureTimeUnit": "MONTH",
"totalInterest": 183000,
"provision": 20500,
"paymentType": "Bayar dalam 3 bulan",
"rate": 3,
"id": "3_months",
"merchantDiscountRate": 40000,
"totalTransactionAmount": 2000000
},
{
"amount": 2020000,
"installmentAmount": 2020000,
"monthlyInstallment": 2020000,
"tenure": 1,
"tenureTimeUnit": "MONTH",
"totalInterest": 0,
"provision": 20000,
"paymentType": "Bayar dalam 30 hari",
"rate": 0,
"id": "1_months",
"merchantDiscountRate": 40000,
"totalTransactionAmount": 2000000
}
]
}{
"status": "ERROR",
"error": {
"kind": "Unauthorized"
"message": "<String>"
}
}{
"status": "ERROR",
"error": {
"kind": "NotFoundError"
"message": "<String>"
}
}{
"status": "ERROR",
"error": {
"kind": "GenericValidationError"
"message": "<Object>"
}
}{
"status": "ERROR",
"error": {
"kind": "InternalServerError"
"message": "InternalServerError"
}
}Purchase Transaction Checkout
POST https://{base_url}/v2/checkout_url
This endpoint is used once the customer has confirmed their installment option and you want to initiate checkout through Paylater by Indodana as the payment method.
* means the parameter is required
Headers
Authorization*
string
The generated Authentication signature with format Bearer {api_key}:{nonce}:{signature}
Request Body
transactionDetails*
object
<Transaction> - Detail of the transaction.
customerDetails*
object
<Customer> - Detail of the customer.
sellers*
object
Array of <Seller> - Detail of the sellers involved in the transaction. May contain more than 1 seller.
billingAddress*
object
<Address> - Billing address of the customer for the transaction.
shippingAddress*
string
(Required only for goods, for service / digital product is not required) <Address> - Shipping address of the customer for the transaction.
paymentType
string
Installment options / payment terms chosen by the customer. Possible values: 30_days, 3_months, 6_months, 12_months, 15_months, 18_months
approvedNotificationUrl*
string
The URL that will be called by Indodana when the transaction is approved and successful.
cancellationRedirectUrl
string
backToStoreUrl
string
expirationAt
string
metadata
object
Key-value pair contains additional information about the transaction.
// Checkout successful
{
"redirectUrl": "https://sandbox01.indodanafinance.co.id/product-installment/payment?purchaseTransactionId=<generated-purchase-transaction-id>&tenure=3",
"transactionId": "<INDODANA-TRANSACTION-ID>"
}{
"status": "ERROR",
"error": {
"kind": "GenericValidationError"
"message": "<Object>"
}
}Check Transaction Status
GET https://{base_url}/v1/transactions/check_status
You can use this endpoint to check the transaction status on Indodana.
* means the parameter is required
Query Parameters
merchantOrderId*
string
The transaction order ID that is sent by merchant on the checkout
Headers
Authorization*
string
The generated Authentication signature with format Bearer {api_key}:{nonce}:{signature}
{
"status": "OK",
"fraudStatus": "ACCEPT",
"legalName": "<INDODANA-CUSTOMER-NAME>",
"amount": 4500000,
"indodanaUserId": "<INDODANA-USER-ID>",
"paymentType": "3_months",
"transactionStatus": "INITIATED",
"merchantOrderId": "<MERCHANT-ORDER-ID>",
"transactionTime": "2019-09-26T06:24:26+0000",
"transactionId": "<INDODANA-TRANSACTION-ID>"
}{
"status": "ERROR",
"error": {
"kind": "NotFound"
"message": "<String>"
}
}QRIS Check Transaction Status
GET https://{base_url}/v1/transactions/qris/check_status
You can use this endpoint to check the transaction status on Indodana.
* means the parameter is required
Query Parameters
merchantOrderId*
string
The transaction order ID that is sent by merchant on the checkout
Headers
Authorization*
string
The generated Authentication signature with format Bearer {api_key}:{nonce}:{signature}
{
"status": "OK",
"fraudStatus": "ACCEPT",
"legalName": "<INDODANA-CUSTOMER-NAME>",
"amount": 4500000,
"indodanaUserId": "<INDODANA-USER-ID>",
"paymentType": "3_months",
"transactionStatus": "INITIATED",
"merchantOrderId": "<MERCHANT-ORDER-ID>",
"transactionTime": "2019-09-26T06:24:26+0000",
"transactionId": "<INDODANA-TRANSACTION-ID>"
}{
"status": "ERROR",
"error": {
"kind": "NotFound"
"message": "<String>"
}
}QRIS Transaction Metadata Callback
POST https://{base_url}/v1/transactions/qris/metadata
Headers
Authorization*
string
The generated authentication signature with format
Bearer {api_key}:{nonce}:{signature}
Request Body
merchantOrderId*
string
The same merchant order id given by Merchant Partner when generating Quickpay URL.
paidAt*
string
Timestamp of the successful transaction on Merchant Partner side. ISO-8601 date format.
customerPan*
string
QRIS customer PAN.
acquirer*
string
Name of QRIS acquirer.
referenceNumber*
string
QRIS transaction reference number from switcher.
{
"merchantOrderId": "<MERCHANT-ORDER-ID>",
"paidAt": "2024-01-01T13:00:00.000+07:00",
"acquirer": "Indodana",
"customerPan": "123456789",
"referenceNumber": "REF-123456789"
}{
"status": "OK"
}Transaction Cancellation / Refund
POST https://{base_url}/v3/order_cancellation
* means the parameter is required
Headers
Authorization*
string
The generated Authentication signature with format Bearer {api_key}:{nonce}:{signature}
Request Body
merchantOrderId*
string
Merchant Order Id from Purchase Transactions
refundId*
string
Refund Id for each unique Refund Request
cancellationAmount*
number
If cancellation amount > transaction amount, OR cancellation amount <= 0, will return ERROR
cancelationReason*
string
Reason why cancellation happens
cancelledBy*
string
Who requested the cancellation
cancellationDate*
string
Timestamp of cancellation. Please follow ISO 8601 (ex: 2020-05-15) for timestamp format.
{
"status": "OK",
"fraudStatus": "ACCEPT",
"merchantOrderId": "ns-01-10-20-02",
"originalTransactionAmount": 30000,
"transactionAmountWithMDR": 30518.82,
"cancellationAmount": 10000,
"afterCancellationTransactionAmount": 20000,
"afterCancellationTransactionAmountWithMDR": 20518.82,
"transactionStatus": "PROCESSED",
"transactionTime": "2020-10-01T15:28:01+0700",
"paymentType": "30_days",
"refundId": "refund-1",
"refundRequestId": "95e99289-2a43-11eb-8d0f-d7fd2743d6f4",
"refundTime": "2020-10-01T15:30:03.325085+07:00"
}{
"status": "ERROR",
"error": {
"kind": "DuplicateRefundError",
"message": "Duplicate refund detected with refund id refund-1",
"body": {
"fraudStatus": "ACCEPT",
"merchantOrderId": "ns-01-10-20-02",
"originalTransactionAmount": 30000,
"transactionAmountWithMDR": 30518.82,
"cancellationAmount": 10000,
"afterCancellationTransactionAmount": 20000,
"afterCancellationTransactionAmountWithMDR": 20518.82,
"transactionStatus": "PROCESSED",
"transactionTime": "2020-10-01T15:28:01+0700",
"paymentType": "30_days",
"refundId": "refund-1",
"refundTime": "2020-10-01T15:30:03.325085+07:00"
}
}
}Object Type References
Payment
Name
Type
Length
Remarks
id
string
64
Payment type / installment option identifier. Possible values : 30_days, 3_months, 6_months, 12_months
tenure
integer
4
Installment option tenure
rate
decimal
16, 2
Interest rate
transitionTermRate
decimal
16, 2
Special case interest rate
amount
decimal
16, 2
Total amount for the transaction
monthlyInstallment
decimal
16, 2
Amount of monthly installment need to be paid
discountedMonthlyInstallment
decimal
16, 2
Amount of monthly installment after taking into account the discounts
installmentAmount
decimal
16, 2
Total installment amount
downPayment
decimal
16, 2
Total down payment amount
Transaction
Name
Type
Length
Remarks
merchantOrderId
string
32
Required. The ID of the transaction that should be generated by merchant.
Allowed characters: a-z, A-Z, 0-9, =, ., -, _, +, @, :, &, ^, %, !, $
amount
decimal
16, 2
Required. Total amount of transaction
items
Array<Item>
Required. Detail of items in the transaction
Item
Name
Type
Length
Remarks
id
string
64
Required. Can be product SKU. For item fee such as: shipping fee, admin fee etc you have to use one of these: shippingfee, adminfee, taxfee, discount, additionalfee, insurancefee.
name
string
128
Required. Product name
price
decimal
16, 2
Required. Price for the product
url
string
256
URL of the product in the merchant site / platform
imageUrl
string
256
URL of the image of the product in the merchant site / platform
category
enum
256
Required. Category of the product, one of these:
airlines arts-crafts-and-collectibles automotive baby beauty-and-fragrances biller books-and-magazines business-to-business-including-mlm charity-and-non-profit clothing community digital-content electronics-and-telecom entertainment-and-media financial-services-and-products financial-services-and-technology food-and-beverage food-retail-and-service games-voucher gifts-and-flowers government health-and-personal-care home-and-garden hotel-and-travel insurance marketplace nonprofit offline-store others over-the-air overseas overseas pets-and-animals property public-services religion-and-spirituality retail services sports-and-outdoors telco ticketing toys-and-hobbies transportation travel vehicle-sales vehicles-service-and-accessories
quantity
integer
8
Required. Quantity of the product / item bought
parentType
string
16
Required. Possible values: SELLER
parentId
string
32
Required. It will correspond to the SELLER ID if the parentType is SELLER
Customer
Name
Type
Length
Remarks
firstName
string
16
Required. First name of the customer
lastName
string
16
Last name of the customer
string
64
Required. Email of the customer that is registered in the merchant site / platform
phone
string
16
Required. Phone number of the customer that is registered in the merchant site / platform
Seller
Name
Type
Length
Remarks
id
string
16
Required. Seller's ID
name
string
16
Required. Seller's name
url
string
256
Required. Seller's shop URL
sellerIdNumber
string
32
Seller's identifier number (KTP / SIM / etc)
string
64
Required. Seller's email
address
Address
Seller's shop address
officialSeller
boolean
Whether Seller is if official or not. Non Mandatory
Address
Name
Type
Length
Remarks
firstName
string
16
Required. First name of customer
lastName
string
16
Last name of customer
address
string
256
Required. Address for billing or shipping activity
city
string
32
Required. City description for the address
postalCode
string
8
Required. Postal code for the address
phone
string
16
Required. Phone number for billing or shipping activity
Metadata
Name
Type
Length
Remarks
ipAddress
String
45
Ipv4 of user
userAgent
String
256
Browser user agent of user
deviceId
String
256
User device id
imsi
String
15
User international mobile subscriber identity
location
Location
256
Required for QRIS transaction from Merchant Partners. Information about the location of the transaction in Latitude and Longitude.
qrisContent
String
512
Required for QRIS transaction from Merchant Partners. QRIS specific. String of QRIS content
scanQrisLocation
Location
256
Required for QRIS transaction from Merchant Partners. QRIS specific. Information about the location of scan QRIS location in Latitude and Longitude.
transactionPurpose
String
128
The purpose of transactions. Value must be: BUSINESS_DEVELOPMENT / PRODUCTIVE / CONSUMPTIVE / OTHERS
tipAmount
Decimal
16, 2
QRIS specific. Fill if QRIS have tip.
Location
lat
decimal
3, 10
Latitude
lng
decimal
3, 10
Longitude
Sample API Request & Response
Get Installment Options
{
"amount": 2000000,
"items": [
{
"id": "<MERCHANT-ITEM-ID>",
"name": "iPhone 6S",
"category": "<ITEM-CATEGORY>",
"price": 2000000,
"url": "http://merchant.com/phone/iphone-6s",
"imageUrl": "http://merchant.com/phone/iphone-6s/cover.jpg",
"type": "Mobile Phone",
"quantity": 1,
"parentType": "SELLER",
"parentId": "<MERCHANT-SELLER-ID>"
}
]
}{
"status": "OK",
"payments": [
{
"downPayment": 0,
"paymentType": "Bayar dalam 3 bulan",
"amount": 9450000,
"installmentAmount": 10584000,
"rate": 4,
"monthlyInstallment": 3528000,
"discountedMonthlyInstallment": 0,
"tenure": 3,
"id": "3_months"
},
{
"downPayment": 0,
"paymentType": "Bayar dalam 6 bulan",
"amount": 9450000,
"installmentAmount": 11718000,
"rate": 4,
"monthlyInstallment": 1953000,
"discountedMonthlyInstallment": 0,
"tenure": 6,
"id": "6_months"
},
{
"downPayment": 0,
"paymentType": "Bayar dalam 12 bulan",
"amount": 9450000,
"installmentAmount": 13986000,
"rate": 4,
"monthlyInstallment": 1165500,
"discountedMonthlyInstallment": 0,
"tenure": 12,
"id": "12_months"
}
]
}Purchase Transaction Checkout
{
"transactionDetails": {
"merchantOrderId": "<MERCHANT-ORDER-ID>",
"amount": 4500000,
"items": [
{
"id": "<MERCHANT-ITEM-ID>",
"name": "iPhone 6S",
"category": "<ITEM-CATEGORY>",
"price": 4500000,
"url": "http://merchant.com/phone/iphone-6s",
"imageUrl": "http://merchant.com/phone/iphone-6s/cover.jpg",
"type": "Mobile Phone",
"quantity": 1,
"parentType": "SELLER",
"parentId": "<MERCHANT-SELLER-ID>"
}
]
},
"customerDetails": {
"firstName": "First",
"lastName": "Last",
"email": "[email protected]",
"phone": "081212345678"
},
"sellers": [
{
"id": "<MERCHANT-SELLER-ID>",
"name": "Penjual iPhone",
"url": "https://merchant.com/shop",
"sellerIdNumber": "<MERCHANT-SELLER-ID-NUMBER>",
"email": "[email protected]",
"officialSeller": false,
"address": {
"firstName": "Merchant",
"lastName": "Seller",
"address": "Kelapa Gading",
"city": "Jakarta Utara",
"postalCode": "11240",
"phone": "081812345678",
"countryCode": "IDN"
}
}
],
"billingAddress": {
"firstName": "First",
"lastName": "Last",
"address": "Tomang",
"city": "Jakarta Barat",
"postalCode": "11430",
"phone": "081987654321",
"countryCode": "IDN"
},
"shippingAddress": {
"firstName": "First",
"lastName": "Last",
"address": "Tomang",
"city": "Jakarta Barat",
"postalCode": "11430",
"phone": "081987654321",
"countryCode": "IDN"
},
"paymentType": "3_months",
"approvedNotificationUrl": "https://payment-notification.merchant.com/transaction-approval-handler",
"cancellationRedirectUrl": "http://merchant.com/phone/iphone-6s",
"backToStoreUrl": "http://merchant.com/phone/iphone-6s",
"expirationAt": "2019-12-31T18:00:00+07:00"
}{
"status": "OK",
"redirectUrl": "https://sandbox01.indodana.com/product-installment/payment?purchaseTransactionId=<generated-purchase-transaction-id>&tenure=3",
"transactionId": "<INDODANA-TRANSACTION-ID>"
}Handling Transaction Confirmation Notification
{
"amount": 1876000.00,
"paymentType": "30_days",
"transactionStatus": "PAID",
"merchantOrderId": "<MERCHANT-ORDER-ID>",
"transactionTime": "2018-12-21T18:18:18+07:00",
"transactionId": "<INDODANA-TRANSACTION-ID>"
} {
"status":"OK",
"message":"Message from merchant if any"
}{
"status":"REJECT",
"message":"Message from merchant if any"
}Check Transaction Status
{
"status": "OK",
"fraudStatus": "ACCEPT",
"legalName": "<INDODANA-CUSTOMER-NAME>",
"amount": 4500000,
"indodanaUserId": "<INDODANA-USER-ID>",
"paymentType": "3_months",
"transactionStatus": "<INDODANA-TRANSACTION-STATUS>",
"merchantOrderId": "<MERCHANT-ORDER-ID>",
"transactionTime": "2019-09-26T06:24:26+0000",
"transactionId": "<INDODANA-TRANSACTION-ID>"
}Purchase Transaction Cancellation / Refund
{
"refundId":"<REFUND-ID>",
"merchantOrderId":"<MERCHANT-ORDER-ID>",
"cancellationAmount" : 4500000,
"cancellationReason":"Out of stock",
"cancelledBy":"<SELLER/CUSTOMER>",
"cancellationDate": "2019-09-12T18:18:18+07:00"
}{
"status": "OK",
"fraudStatus": "ACCEPT",
"merchantOrderId": "<MERCHANT-ORDER-ID>",
"originalTransactionAmount": 4500000,
"cancellationAmount": 4500000,
"afterCancellationTransactionAmount": 0,
"transactionStatus": "CANCELLED",
"transactionTime": "2019-09-26T09:01:57+0000",
"paymentType": "3_months"
}{
"status": "ERROR",
"error": {
"kind": "BadRequest",
"message": "Refund with purchase transaction id: <INDODANA-TRANSACTION-ID> is failed because refund amount: 9990000 is larger than purchase transaction total amount: 4450000.00"
}
}Last updated