Online Transaction API
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 |
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.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
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 |
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 |
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 |
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 |
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 |
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 |
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> |
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"
}
]
}
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>"
}
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"
}
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>"
}
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"
}
}