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.indodanafinance.co.id/chermes/merchant for production environment.

You can find our IP list here.

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

NameTypeDescription

Authorization*

string

The generated Authentication signature with format Bearer {api_key}:{nonce}:{signature}

Request Body

NameTypeDescription

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
        }
    ]
}

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

NameTypeDescription

Authorization*

string

The generated Authentication signature with format Bearer {api_key}:{nonce}:{signature}

Request Body

NameTypeDescription

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.indodana.com/product-installment/payment?purchaseTransactionId=<generated-purchase-transaction-id>&tenure=3",
  "transactionId": "<INDODANA-TRANSACTION-ID>"
}

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

NameTypeDescription

merchantOrderId*

string

The transaction order ID that is sent by merchant on the checkout

Headers

NameTypeDescription

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>"
}

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

NameTypeDescription

merchantOrderId*

string

The transaction order ID that is sent by merchant on the checkout

Headers

NameTypeDescription

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>"
}

QRIS Transaction Metadata Callback

POST https://{base_url}/v1/transactions/qris/metadata

Headers

NameTypeDescription

Authorization*

string

The generated authentication signature with format Bearer {api_key}:{nonce}:{signature}

Request Body

NameTypeDescription

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"
}

Transaction Cancellation / Refund

POST https://{base_url}/v3/order_cancellation

* means the parameter is required

Headers

NameTypeDescription

Authorization*

string

The generated Authentication signature with format Bearer {api_key}:{nonce}:{signature}

Request Body

NameTypeDescription

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"
}

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

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

NameTypeLengthRemarks

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>"
    }
  ]
}

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": "first.last@gmail.com",
      "phone": "081212345678"
    },
    "sellers": [
      {
        "id": "<MERCHANT-SELLER-ID>",
        "name": "Penjual iPhone",
        "url": "https://merchant.com/shop",
        "sellerIdNumber": "<MERCHANT-SELLER-ID-NUMBER>",
        "email": "seller@merchant.com",
        "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"
}

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.

{
    "amount": 1876000.00,    
    "paymentType": "30_days",
    "transactionStatus": "PAID",
    "merchantOrderId": "<MERCHANT-ORDER-ID>",
    "transactionTime": "2018-12-21T18:18:18+07:00",
    "transactionId": "<INDODANA-TRANSACTION-ID>"
}    

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"
}

Last updated