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.indodana.com/chermes/merchant for sandbox environment. Subsequently, the {base_url} will correspond to https://api.indodana.com/chermes/merchant for production environment.
You can find our IP list here.
post
https://{base_url}
/v2/payment_calculation
Get Payment Calculation
post
https://{base_url}
/v2/checkout_url
Purchase Transaction Checkout
get
https://{base_url}
/v1/transactions/check_status
Check Transaction Status
post
https://{base_url}
/v3/order_cancellation
Transaction Cancellation / Refund

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
email
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)
email
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
countryCode
string
16
Required. ISO 3166-1 alpha-3 (ex: IDN for Indonesia)

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
String
256
Information about the location of the transaction in Latitude and Longitude. The format will be <latitude>;<longitude>

Sample API Request & Response

Get Installment Options

API Request
API Response
{
"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>"
}
]
}
{
"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

API Request
API Response
{
"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": "ID"
}
}
],
"billingAddress": {
"firstName": "First",
"lastName": "Last",
"address": "Tomang",
"city": "Jakarta Barat",
"postalCode": "11430",
"phone": "081987654321",
"countryCode": "ID"
},
"shippingAddress": {
"firstName": "First",
"lastName": "Last",
"address": "Tomang",
"city": "Jakarta Barat",
"postalCode": "11430",
"phone": "081987654321",
"countryCode": "ID"
},
"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

Note that for this section, the API Request would be the payload that the merchant receives in their endpoint, and the API Response would be the payload that the merchant expected to send to Indodana as acknowledgement.
API Request
API Response [OK]
API Response [REJECT]
{
"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

API Response
{
"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

API Request
API Response
(Failed) API Response
{
"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"
}
}