NAV
php java

Introduction

Welcome to the Artha Remit API V1. Our API services are accepts json-encoded POST request bodies and returns JSON-encoded responses.

Request And Response

API can be requested through HTTPS Request to Artha Remit API Base URL endpoint. The HTTPS Header has to be used to allow proper authentication, additionally HTTPS Request should only be made from IP Address which has been registered in Artha Remit.

Endpoint Url

Production : https://api.artharemit.co.id

Sanbox : Coomingsoon

Request Common Parameters

Parameter Type Description
mchNo string provide by us.
appId string provide by us.
reqTime int request time in minute.
signType string Use MD5 or RSA2
version string Use 1.0 only
sign string authenticate a partner request, see how to compute sign here

Sign

To sign, use this code:

function getSign($params, $appSecret) {
    $arrayToSort = [];
    foreach($params as $key => $value) {
        if ($key == 'sign') {
            continue;
        }
        if ($value == null || $value == '') {
            continue;
        }
        $arrayToSort[] = "$key=$value&";
    }
    sort($arrayToSort);
    return md5(implode('', $arrayToSort) . 'key=' . $appSecret);
}
public class SignKit {
    private static String encodingCharset = "UTF-8";
    public static String getSign(Map<String,Object> map, String appSecret){
        ArrayList<String> list = new ArrayList<String>();
        for(Map.Entry<String,Object> entry:map.entrySet()){
            if(null != entry.getValue() && !"".equals(entry.getValue())){
                list.add(entry.getKey() + "=" + entry.getValue() + "&");
            }
        }
        int size = list.size();
        String [] arrayToSort = list.toArray(new String[size]);
        Arrays.sort(arrayToSort, String.CASE_INSENSITIVE_ORDER);
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i < size; i ++) {
            sb.append(arrayToSort[i]);
        }
        String result = sb.toString();
        result += "key=" + appSecret;
        result = md5(result, encodingCharset).toUpperCase();
        return result;
    }

    public static String md5(String value, String charset) {
        MessageDigest md = null;
        try {
            byte[] data = value.getBytes(charset);
            md = MessageDigest.getInstance("MD5");
            byte[] digestData = md.digest(data);
            return toHex(digestData);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
    }
}

sort the all key of parameters and generate string array to use template "{key}={value}", then get variable string source by combining string array into a string with separator "&" and splice "&key={appSecret}", finally get sign use md5(source). eg:

{
    "name": "xxx",
    "gender": 1,
    "address": "bbb"
}

appSecret=df8xnjfsd0dsf

source is "address=bbb&gender=1&name=xxx&key=df8xnjfsd0dsf"

sign = md5(source)

Response error

when happend error, response has properties code and msg

{
  "code": 100,
  "msg": "Parameter value error[reqTime error]"
}
Parameter Type Description
code int error code, when error, it is not zero. see error code detail
msg string error message.

Response success

when happend success, response has properties code, msg, data and sign

{
  "code": 0,
  "data": {
  },
  "msg": "SUCCESS",
  "sign": "8402789DFFF08AEF95A4187FAFB02A9E"
}
Parameter Type Description
code int 0, fixed
msg string "SUCCESS" fixed.
sign string sign for data.
data object the result data

Virtual Account

Use this API to create new VA number

path="/api/pay/virtual_account"

to create new VA number, use this code

<?php
$mchNo = 'mch000000001';
$appId = 'app0000000001';
$appSecret = 'fd8sjx9saoka';

$signType = 'MD5';
$version = '1.0';

$phone = "0811223344";
$userName = "jony"
$amount = 10000;
$mchOrderNo = "TX00001210200";
$subject = "shopping";
$wayCode = "BNI";
$displayName = "app name";
$expiredTime = 60; // 60 minutes
$notifyUrl = "https://yourcallback.com/notify";

$req_data = [
    'mchNo' => $mchNo,
    'appId' => $appId,
    'signType' => $signType,
    'version' => $version,
    'phone' => $phone,
    'userName' => $userName,
    'amount' => $amount,
    'mchOrderNo' => $mchOrderNo,
    'subject' => $subject,
    'wayCode' => $wayCode,
    'displayName' => $displayName,
    'expiredTime' => $expiredTime,
    'notifyUrl ' => $notifyUrl,
];
$req_data['sign'] = getSign($req_data, $appSecret);

$data_payload = json_encode($req_data);

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://api.artharemit.co.id/api/pay/virtual_account',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => $data_payload,
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
public class Example {
    public static void sendRequest() throws Exception {
        String mchNo = "mch000000001";
        String appId = "app0000000001";
        String appSecret = "fd8sjx9saoka";
        String signType = "MD5";
        String version = "1.0";
        String phone = "0811223344";
        String userName = "jony";
        int amount = 10000;
        String mchOrderNo = "TX00001210200";
        String subject = "shopping";
        String wayCode = "BNI";
        String displayName = "app name";
        int expiredTime = 60;
        String notifyUrl = "https://yourcallback.com/notify";

        Map<String, Object> reqData = new TreeMap<>();
        reqData.put("mchNo", mchNo);
        reqData.put("appId", appId);
        reqData.put("signType", signType);
        reqData.put("version", version);
        reqData.put("phone", phone);
        reqData.put("userName", userName);
        reqData.put("amount", amount);
        reqData.put("mchOrderNo", mchOrderNo);
        reqData.put("subject", subject);
        reqData.put("wayCode", wayCode);
        reqData.put("displayName", displayName);
        reqData.put("expiredTime", expiredTime);
        reqData.put("notifyUrl ", notifyUrl);
        reqData.put("sign", SignKit.getSign(reqData, appSecret));

        String dataPayload = new Gson().toJson(reqData);

        URL url = new URL("https://api.artharemit.co.id/api/pay/virtual_account");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setDoOutput(true);

        conn.getOutputStream().write(dataPayload.getBytes());

        String response = new String(conn.getInputStream().readAllBytes());

        System.out.println(response);

        conn.disconnect();
    }
}

Request

Parameter Required Type Description
userName true string user's name
phone true string Customer mobile number, prefix 08 e.g (0811223344)
amount true long Amount your user must paid to complete the transaction
mchOrderNo true string merchant trx id must be unique
subject true string product description
wayCode true string code product, see wayCode here
displayName true string Customizable VA display name that will be seen by user
expiredTime true int Transaction expiration time in minutes, e.g If Transaction want to be expired after 5 minutes, you just have to set expired_on to 5.
notifyUrl true string url that will receive payment success/fail notification. see callback
commonParameter - - see Request Common Parameters

Response

Parameter Required Type Description
data.accountNumber true string Generated VA number
data.mchFeeAmount true long the fee we provide
data.mchOrderNo true string trx id from merchant
data.payOrderId true string id transaction from us
data.state true int VA state, see state detail

Payment Code Virtual Account

VA wayCode
BRI
BNI
BCA
PERMATA
DANAMON
CIMB
MANDIRI

Disburstment

Use this API to start disbursing money to a specific beneficiary account.

path="/api/transfer/bank_card"

to disburstment, use this code

<?php
$mchNo = 'mch000000001';
$appId = 'app0000000001';
$appSecret = 'fd8sjx9saoka';

$signType = 'MD5';
$version = '1.0';

$phone = "0811223344";
$accountName = "jony"
$amount = 10000;
$mchOrderNo = "TX00001210200";
$remark = "Refund";
$entryType = "BANK_CARD";
$bankCode = "BCA";
$accountNo = '0000000000001';
$notifyUrl = "https://yourcallback.com/notify";

$req_data = [
    'mchNo' => $mchNo,
    'appId' => $appId,
    'signType' => $signType,
    'version' => $version,
    'phone' => $phone,
    'accountName' => $accountName,
    'amount' => $amount,
    'mchOrderNo' => $mchOrderNo,
    'remark' => $remark,
    'entryType' => $entryType,
    'bankCode' => $bankCode,
    'accountNo' => $accountNo,
    'notifyUrl ' => $notifyUrl,
];
$req_data['sign'] = getSign($req_data, $appSecret);

$data_payload = json_encode($req_data);

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://api.artharemit.co.id/api/transfer/bank_card',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => $data_payload,
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
public class Example {
    public static void sendRequest() throws Exception {
        String mchNo = "mch000000001";
        String appId = "app0000000001";
        String appSecret = "fd8sjx9saoka";

        String signType = "MD5";
        String version = "1.0";

        String phone = "0811223344";
        String accountName = "jony";
        int amount = 10000;
        String mchOrderNo = "TX00001210200";
        String remark = "Refund";
        String entryType = "BANK_CARD";
        String bankCode = "BCA";
        String accountNo = "0000000000001";
        String notifyUrl = "https://yourcallback.com/notify";

        Map<String, Object> reqData = new HashMap<String, Object>();
        reqData.put("mchNo", mchNo);
        reqData.put("appId", appId);
        reqData.put("signType", signType);
        reqData.put("version", version);
        reqData.put("phone", phone);
        reqData.put("accountName", accountName);
        reqData.put("amount", amount);
        reqData.put("mchOrderNo", mchOrderNo);
        reqData.put("remark", remark);
        reqData.put("entryType", entryType);
        reqData.put("bankCode", bankCode);
        reqData.put("accountNo", accountNo);
        reqData.put("notifyUrl", notifyUrl);
        reqData.put("sign", SignKit.getSign(reqData, appSecret));

        String dataPayload = new Gson().toJson(reqData);

        URL url = new URL("https://api.artharemit.co.id/api/transfer/bank_card");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setDoOutput(true);

        conn.getOutputStream().write(dataPayload.getBytes());

        String response = new String(conn.getInputStream().readAllBytes());

        System.out.println(response);

        conn.disconnect();
  }
}

Request

Parameter Required Type Description
accountName true string name of account
phone true string Customer mobile number, prefix 08 e.g (0811223344)
amount true long Amount of disbursement (Number Only), min amount 10000
mchOrderNo true string merchant trx id must be unique
entryType true string only "BANK_CARD"
remark true string remark
bankCode true string Bank Code of the Beneficiary account, see Disbursement Bank Codes
accountNo true string Beneficiary account number, numeric only
notifyUrl true string For notification transaction disburst status success or fail. see callback
commonParameter - - see Request Common Parameters

Response

Parameter Required Type Description
data.amount true long Amount of disbursement
data.mchFeeAmount true long the fee we provide
data.mchOrderNo true string trx id from merchant
data.transferId true string id transaction from us
data.state true int transfer state, see state detail

List Bank Supported (bankShort)

bankShort Bank Name Digital Code
BCA Bank Central Asia 014
MANDIRI Bank Mandiri 008
BNI Bank Negara Indonesia 009
PERMATA Bank Permata 013
BRI Bank Rakyat Indonesia 002
CIMB_NIAGA CIMB Niaga Bank 022
DANAMON Bank Danamon 011
PANIN Bank Panin 019
BII Bank Maybank 016
ANGLOMAS Anglomas International Bank 531
BANGKOK Bangkok Bank 040
IBK Bank IBK Indonesia 945
SINARMAS Sinarmas 153
BRI_AGRO Bank BRI Agro 494
ANDARA Bank Andara 466
ANTAR_DAERAH Bank CCB Indonesia 088
ANZ Bank ANZ Indonesia 061
ARTHA Bank Artha Graha International 037
ARTOS Bank Artos Indonesia 542
BISNIS Bank Bisnis Internasional 459
BJB Bank BJB 110
BNP Bank BNP Paribas 057
BUKOPIN Bank Bukopin 441
BUMI_ARTA Bank Bumi Arta 076
CAPITAL Bank Capital Indonesia 054
BCA_SYR Bank Central Asia (BCA) Syariah 536
CHINATRUST Bank Chinatrust Indonesia 069
CIMB_UUS Bank CIMB Niaga UUS 022
COMMONWEALTH Bank Commonwealth 950
DBS Bank DBS Indonesia 046
DINAR_INDONESIA Bank Dinar Indonesia 526
OKE Bank OKE 466
DKI Bank DKI 111
FAMA Bank Fama International 562
GANESHA Bank Ganesha 161
HANA Bank Hana 484
HARDA_INTERNASIONAL Bank Harda Internasional 567
WOORI_SAUDARA Bank Woori Saudara 212
ICBC Bank ICBC Indonesia 164
INA_PERDANA Bank Ina Perdana 513
INDEX_SELINDO Bank Index Selindo 555
JASA_JAKARTA Bank Jasa Jakarta 472
KESEJAHTERAAN_EKONOMI Bank Kesejahteraan Ekonomi 535
MASPION Bank Maspion Indonesia 157
MAYAPADA Bank Mayapada International 097
MAYBANK_SYR Bank Maybank Syariah Indonesia 947
MAYORA Bank Mayora 553
MEGA Bank Mega 426
MESTIKA_DHARMA Bank Mestika Dharma 151
SHINHAN Bank Shinhan Indonesia 152
MIZUHO Bank Mizuho Indonesia 48
MNC_INTERNASIONAL Bank MNC Internasional 485
MUAMALAT Bank Muamalat Indonesia 147
MULTI_ARTA_SENTOSA Bank Multi Arta Sentosa 548
J_TRUST Bank J Trust Indonesia 095
NATIONALNOBU Bank Nationalnobu 503
NUSANTARA_PARAHYANGAN Bank Nusantara Parahyangan 145
OCBC Bank OCBC NISP 028
BOC Bank of China (BOC) 069
INDIA Bank of India Indonesia 146
PANIN_SYR Bank Panin Syariah 517
QNB Bank QNB Indonesia 167
RABOBANK Bank Rabobank International Indonesia 060
RESONA Bank Resona Perdania 047
ROYAL Bank Royal Indonesia 501
BTPN_SYR Bank BTPN Syariah 547
SAHABAT_SAMPOERNA Bank Sahabat Sampoerna 523
SBI_INDONESIA Bank SBI Indonesia 498
MANDIRI_TASPEN Bank Mandiri Taspen 564
MITSUI Bank Sumitomo Mitsui Indonesia 045
BRI_SYR Bank Syariah BRI 422
BUKOPIN_SYR Bank Syariah Bukopin 521
MANDIRI_SYR Bank Syariah Mandiri 451
MEGA_SYR Bank Syariah Mega 506
BTN Bank Tabungan Negara (BTN) 200
UOB Bank UOB Indonesia 023
VICTORIA_INTERNASIONAL Bank Victoria Internasional 566
VICTORIA_SYR Bank Victoria Syariah 405
CCB Bank CCB Indonesia 036
YUDHA_BHAKTI Bank Yudha Bhakti 490
ACEH BPD Aceh 116
BANTEN BPD Banten 137
BALI BPD Bali 129
BENGKULU BPD Bengkulu 133
BPD_DIY Bank Pembangunan Daerah (BPD DIY) 112
JAMBI BPD Jambi 115
JAWA_TENGAH BPD Jawa Tengah 113
JAWA_TIMUR BPD Jawa Timur 114
KALIMANTAN_BARAT BPD Kalimantan Barat 123
KALIMANTAN_SELATAN BPD Kalimantan Selatan 122
KALIMANTAN_TENGAH BPD Kalimantan Tengah 123
KALIMANTAN_TIMUR BPD Kalimantan Timur 124
LAMPUNG BPD Lampung 121
MALUKU BPD Maluku 131
PAPUA BPD Papua 132
RIAU_DAN_KEPRI BPD Riau Dan Kepri 119
SULAWESI BPD Sulawesi Tengah 134
SULSELBAR BPD Sulselbar 126
SULUTGO Bank Sulutgo 127
SUMSEL_DAN_BABEL BPD Sumsel Dan Babel 120
SUMUT BPD Sumut 117
CENTRATAMA Centratama Nasional Bank 559
CITIBANK Citibank 031
HSBC Hongkong and Shanghai Bank Corporation (HSBC) 087
JPMORGAN JP Morgan Chase Bank 032
PRIMA_MASTER Prima Master Bank 520
STANDARD_CHARTERED Standard Charted Bank 050
MITRA_NIAGA Bank Mitra Niaga 491
EKSPOR_INDONESIA Bank Ekspor Indonesia 003
ARTA_NIAGA_KENCANA Bank Arta Niaga Kencana 020
BJB_SYR Bank BJB Syariah 425
BNI_SYR Bank BNI Syariah 427
BPR_KS BPR Karyajatnika Sadaya 688
METRO_EXPRESS Bank Metro Express 152
SINAR_HARAPAN_BALI Bank Sinar Harapan Bali 564
WINDU Bank Windu Kentjana Int 162
PUNDI_INDONESIA Bank Eksekutif Internasional 558
ABN_AMRO Bank ABN Amro 052
KEBD Korea Exchange Bank Danamon 059
OCBC_INDONESIA Bank OCBC - Indonesia 028
JENIUS Bank Jenius (BTPN) 213
topup_ovo OVO ovo
topup_linkaja LinkAja linkaja
topup_dana DANA dana
topup_gopay Gopay gopay
topup_shopeepay ShopeePay shopeepay

Bank Account Inquiry

Use this API to get beneficiary account details.

path="/api/other/account_inquiry"

to inquiry, use this code

<?php
$mchNo = 'mch000000001';
$appId = 'app0000000001';
$appSecret = 'fd8sjx9saoka';

$signType = 'MD5';
$version = '1.0';

$mchOrderNo = "TX00001210200";
$accountNo = "900000000000";
$accountName = "jony"
$bankCode = 'MANDIRI';

$req_data = [
    'mchNo' => $mchNo,
    'appId' => $appId,
    'signType' => $signType,
    'version' => $version,
    'mchOrderNo' => $mchOrderNo,
    'accountNo' => $accountNo,
    'bankCode' => $bankCode,
    'accountNo' => $accountNo,
];
$req_data['sign'] = getSign($req_data, $appSecret);

$data_payload = json_encode($req_data);

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://api.artharemit.co.id/api/other/account_inquiry',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => $data_payload,
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
public class Example {
    public static void sendRequest() throws Exception {
        String mchNo = 'mch000000001';
        String appId = 'app0000000001';
        String appSecret = 'fd8sjx9saoka';
        String signType = 'MD5';
        String version = '1.0';
        String mchOrderNo = "TX00001210200";
        String accountNo = "900000000000";
        String accountName = "jony";
        String bankCode = 'MANDIRI';

        Map<String, Object> reqData = new HashMap<String, Object>();
        reqData.put("mchNo", mchNo);
        reqData.put("appId", appId);
        reqData.put("signType", signType);
        reqData.put("version", version);
        reqData.put("mchOrderNo", mchOrderNo);
        reqData.put("accountNo", accountNo);
        reqData.put("accountName", accountName);
        reqData.put("bankCode", bankCode);

        String sign = SignKit.getSign(reqData, appSecret);
        reqData.put("sign", sign);

        String dataPayload = new Gson().toJson(reqData);

        URL url = new URL("https://api.artharemit.co.id/api/other/account_inquiry");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setDoOutput(true);

        conn.getOutputStream().write(dataPayload.getBytes());

        String response = new String(conn.getInputStream().readAllBytes());

        System.out.println(response);

        conn.disconnect();
    }
}

Request

Parameter Required Type Description
mchOrderNo true string merchant trx id must be unique
accountName true string name of account
bankCode true string Bank Code of the Beneficiary account, see Disbursement Bank Codes
accountNo true string Beneficiary account number, numeric only
commonParameter - - see Request Common Parameters

Response

Parameter Required Type Description
data.accountName true string the name you provide
data.targetAccountName true string the name that is inquiry from banking institution
data.similarity true double similarity of the above two names
data.mchFeeAmount true long the fee we provide
data.mchOrderNo true string trx id from merchant
data.transactionId true string id transaction from us

Response Error Code Inquiry

code Description
900 Inquiry process is complete but the account number is invalid or maybe a virtual account number
901 Bank account have been suspected on doing fraud. You still can do a disbursement to this account
902 Bank account have been confirmed on doing a fraud and therefore is blacklisted. You can’t do a disbursment to this account.
903 The inquiry process is complete and the account is valid, but it is closed/inactive so that it cannot receive money. You cannot do a disbursement to this account.
1002 Submit fail, inquiry fail

Credit Card Link

Use this API to request Credit Card Link for payment.

path="/api/pay/credit_card"

to request Credit Card Link, use this code

<?php
$mchNo = 'mch000000001';
$appId = 'app0000000001';
$appSecret = 'fd8sjx9saoka';

$signType = 'MD5';
$version = '1.0';

$phone = "0811223344";
$userName = "jony"
$amount = 10000;
$mchOrderNo = "TX00001210200";
$subject = "shopping";
$displayName = "app name";
$expiredTime = 60; // 60 minutes
$notifyUrl = "https://yourcallback.com/notify";
$redirectUrl = "https://yourcallback.com/success";

$req_data = [
    'mchNo' => $mchNo,
    'appId' => $appId,
    'signType' => $signType,
    'version' => $version,
    'phone' => $phone,
    'userName' => $userName,
    'amount' => $amount,
    'mchOrderNo' => $mchOrderNo,
    'subject' => $subject,
    'displayName' => $displayName,
    'expiredTime' => $expiredTime,
    'notifyUrl ' => $notifyUrl,
    'redirectUrl' => $redirectUrl,
];
$req_data['sign'] = getSign($req_data, $appSecret);

$data_payload = json_encode($req_data);

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://api.artharemit.co.id/api/pay/credit_card',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => $data_payload,
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
public class Example {
    public static void sendRequest() throws Exception {
        String mchNo = "mch000000001";
        String appId = "app0000000001";
        String appSecret = "fd8sjx9saoka";

        String signType = "MD5";
        String version = "1.0";

        String phone = "0811223344";
        String userName = "jony";
        int amount = 10000;
        String mchOrderNo = "TX00001210200";
        String subject = "shopping";
        String displayName = "app name";
        int expiredTime = 60; // 60 minutes
        String notifyUrl = "https://yourcallback.com/notify";
        String redirectUrl = "https://yourcallback.com/success";

        Map<String, Object> reqData = new HashMap<String, Object>();
        reqData.put("mchNo", mchNo);
        reqData.put("appId", appId);
        reqData.put("signType", signType);
        reqData.put("version", version);
        reqData.put("phone", phone);
        reqData.put("userName", userName);
        reqData.put("amount", amount);
        reqData.put("mchOrderNo", mchOrderNo);
        reqData.put("subject", subject);
        reqData.put("displayName", displayName);
        reqData.put("expiredTime", expiredTime);
        reqData.put("notifyUrl", notifyUrl);
        reqData.put("redirectUrl", redirectUrl);

        String sign = SignKit.getSign(reqData, appSecret);
        reqData.put("sign", sign);

        String dataPayload = new Gson().toJson(reqData);

        URL url = new URL("https://api.artharemit.co.id/api/pay/credit_card");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setDoOutput(true);

        conn.getOutputStream().write(dataPayload.getBytes());

        String response = new String(conn.getInputStream().readAllBytes());

        System.out.println(response);

        conn.disconnect();
    }
}

Request

Parameter Required Type Description
userName true string user's name
phone true string Customer mobile number, prefix 08 e.g (0811223344)
amount true long Amount your user must paid to complete the transaction
mchOrderNo true string merchant trx id must be unique
subject true string product description
displayName true string Customizable display name that will be seen by user
expiredTime true int Transaction expiration time in minutes, e.g If Transaction want to be expired after 5 minutes, you just have to set expired_on to 5.
notifyUrl true string url that will receive payment success/fail notification. see callback
redirectUrl true string Indicates the URL of your environment (to redirect the customers back once payment has been completed in Credit Card Link issuers.)
commonParameter - - see Request Common Parameters

Response

Parameter Required Type Description
data.returnUrl true int Payment link which used for payment
data.mchFeeAmount true long the fee we provide
data.mchOrderNo true string trx id from merchant
data.payOrderId true string id transaction from us
data.state true int transfer state, see state detail

E-Wallet

E-Wallet Aggregator API allows partners / mitra to seamlessly charge and receive payments directly from top e-wallet issuers. With one integration, they are able to get access to all of Artha Remit ID available e-wallets ((OVO, ShopeePay, LinkAja, and DANA) and upcoming e-wallet integrations.

path="/api/pay/e_wallet"

Example Request E-Wallet

<?php

<?php
$mchNo = 'mch000000001';
$appId = 'app0000000001';
$appSecret = 'fd8sjx9saoka';

$signType = 'MD5';
$version = '1.0';

$phone = "0811223344";
$userName = "jony"
$amount = 10000;
$mchOrderNo = "TX00001210200";
$subject = "shopping";
$wayCode = "OVO";
$displayName = "app name";
$expiredTime = 60; // 60 minutes
$notifyUrl = "https://yourcallback.com/notify";
$redirectUrl = "https://yourcallback.com/success";

$req_data = [
    'mchNo' => $mchNo,
    'appId' => $appId,
    'signType' => $signType,
    'version' => $version,
    'phone' => $phone,
    'userName' => $userName,
    'amount' => $amount,
    'mchOrderNo' => $mchOrderNo,
    'subject' => $subject,
    'wayCode' => $wayCode,
    'displayName' => $displayName,
    'expiredTime' => $expiredTime,
    'notifyUrl ' => $notifyUrl,
    'redirectUrl ' => $redirectUrl
];
$req_data['sign'] = getSign($req_data, $appSecret);

$data_payload = json_encode($req_data);

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://api.artharemit.co.id/api/pay/e_wallet',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => $data_payload,
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
public class Example {
    public static void sendRequest() throws Exception {
        String mchNo = "mch000000001";
        String appId = "app0000000001";
        String appSecret = "fd8sjx9saoka";

        String signType = "MD5";
        String version = "1.0";

        String phone = "0811223344";
        String userName = "jony";
        int amount = 10000;
        String mchOrderNo = "TX00001210200";
        String subject = "shopping";
        String wayCode = "OVO";
        String displayName = "app name";
        int expiredTime = 60; // 60 minutes
        String notifyUrl = "https://yourcallback.com/notify";
        String redirectUrl = "https://yourcallback.com/success";

        Map<String, Object> reqData = new HashMap<String, Object>();
        reqData.put("mchNo", mchNo);
        reqData.put("appId", appId);
        reqData.put("signType", signType);
        reqData.put("version", version);
        reqData.put("phone", phone);
        reqData.put("userName", userName);
        reqData.put("amount", amount);
        reqData.put("mchOrderNo", mchOrderNo);
        reqData.put("subject", subject);
        reqData.put("wayCode", wayCode);
        reqData.put("displayName", displayName);
        reqData.put("expiredTime", expiredTime);
        reqData.put("notifyUrl", notifyUrl);
        reqData.put("redirectUrl", redirectUrl);

        String sign = SignKit.getSign(reqData, appSecret);
        reqData.put("sign", sign);

        String dataPayload = new Gson().toJson(reqData);

        URL url = new URL("https://api.artharemit.co.id/api/pay/e_wallet");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setDoOutput(true);

        conn.getOutputStream().write(dataPayload.getBytes());

        String response = new String(conn.getInputStream().readAllBytes());

        System.out.println(response);

        conn.disconnect();
    }
}

Example Response

{
    "code": 0,
    "data": {
        "checkoutUrl": "https://checkout.negapay.com/success",
        "imageUrl": "",`
        "mchFeeAmount": 200,
        "mchOrderNo": "TX00001210200",
        "mobileNumber": "0811223344",
        "payOrderId": "P1632984294158790658",
        "qrCode": "",
        "state": 1,
        "viewName": "jony"
    },
    "msg": "SUCCESS",
    "sign": "8651697B00D66D83898CB5814EAEB39E"
}

Request

Parameter Required Type Description
userName true string user's name
phone true string Customer mobile number, prefix 08 e.g (0811223344)
amount true long Amount your user must paid to complete the transaction
mchOrderNo true string merchant trx id must be unique
subject true string product description
wayCode true string code product, see wayCode here
displayName true string Customizable VA display name that will be seen by user
expiredTime true int Transaction expiration time in minutes, e.g If Transaction want to be expired after 5 minutes, you just have to set expired_on to 5.
notifyUrl true string url that will receive payment success/fail notification. see callback
redirectUrl true string Indicates the URL of your environment (to redirect the customers back once payment has been completed in e-wallet issuers.)
commonParameter - - see Request Common Parameters

Response

Parameter Required Type Description
data.mchFeeAmount true long the fee we provide
data.mchOrderNo true string trx id from merchant
data.payOrderId true string id transaction from us
data.mobileNumber true string number phone enduser
data.checkoutUrl true string Checkout URL passed from the e-wallet issuers to be used for payment purposes(OVO does not return, and the user will be notified directly in the OVO wallet APP)
data.imageUrl true string Url Image QR National Dynamic Data
data.qrCode true string QR National Dynamic Data
data.viewName true string Customizable display name that will be seen by user
data.state true int E-Wallet state, see state detail

Payment Code E-wallet

E-Wallet Providers E_WALLET_CODE Minimum (IDR) Maximum (IDR)
DANA dana 10.000 10.000.000
OVO ovo 10.000 10.000.000
SHOPEEPAY shopeepay 10.000 10.000.000

Dynamic QRIS

This API will be used by partner to request Dynamic QRIS for payment.

path="/api/pay/qris"

Example Request Dynamic QRIS

<?php

<?php
$mchNo = 'mch000000001';
$appId = 'app0000000001';
$appSecret = 'fd8sjx9saoka';

$signType = 'MD5';
$version = '1.0';

$phone = "0811223344";
$userName = "jony"
$amount = 10000;
$mchOrderNo = "TX00001210200";
$subject = "shopping";
$wayCode = "QRIS";
$displayName = "app name";
$expiredTime = 60; // 60 minutes
$notifyUrl = "https://yourcallback.com/notify";
$redirectUrl = "https://yourcallback.com/success";

$req_data = [
    'mchNo' => $mchNo,
    'appId' => $appId,
    'signType' => $signType,
    'version' => $version,
    'phone' => $phone,
    'userName' => $userName,
    'amount' => $amount,
    'mchOrderNo' => $mchOrderNo,
    'subject' => $subject,
    'wayCode' => $wayCode,
    'displayName' => $displayName,
    'expiredTime' => $expiredTime,
    'notifyUrl ' => $notifyUrl,
    'redirectUrl ' => $redirectUrl
];
$req_data['sign'] = getSign($req_data, $appSecret);

$data_payload = json_encode($req_data);

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://api.artharemit.co.id/api/pay/e_wallet',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS => $data_payload,
));

$response = curl_exec($curl);

curl_close($curl);
echo $response;
public class Example {
    public static void sendRequest() throws Exception {
        String mchNo = "mch000000001";
        String appId = "app0000000001";
        String appSecret = "fd8sjx9saoka";

        String signType = "MD5";
        String version = "1.0";

        String phone = "0811223344";
        String userName = "jony";
        int amount = 10000;
        String mchOrderNo = "TX00001210200";
        String subject = "shopping";
        String wayCode = "QRIS";
        String displayName = "app name";
        int expiredTime = 60; // 60 minutes
        String notifyUrl = "https://yourcallback.com/notify";
        String redirectUrl = "https://yourcallback.com/success";

        Map<String, Object> reqData = new HashMap<String, Object>();
        reqData.put("mchNo", mchNo);
        reqData.put("appId", appId);
        reqData.put("signType", signType);
        reqData.put("version", version);
        reqData.put("phone", phone);
        reqData.put("userName", userName);
        reqData.put("amount", amount);
        reqData.put("mchOrderNo", mchOrderNo);
        reqData.put("subject", subject);
        reqData.put("wayCode", wayCode);
        reqData.put("displayName", displayName);
        reqData.put("expiredTime", expiredTime);
        reqData.put("notifyUrl", notifyUrl);
        reqData.put("redirectUrl", redirectUrl);

        String sign = SignKit.getSign(reqData, appSecret);
        reqData.put("sign", sign);

        String dataPayload = new Gson().toJson(reqData);

        URL url = new URL("https://api.artharemit.co.id/api/pay/qris");
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/json");
        conn.setDoOutput(true);

        conn.getOutputStream().write(dataPayload.getBytes());

        String response = new String(conn.getInputStream().readAllBytes());

        System.out.println(response);

        conn.disconnect();
    }
}

Example Response

{
    "code": 0,
    "data": {
        "imageUrl": "https://negapay.com/image-qris/MDAwMjAxMDEwMjEyMjY2NzAwMTZDT00uTk9CVUJBTksuV1dXMDExO",
        "mchFeeAmount": 200,
        "mchOrderNo": "TX00001210200",
        "mobileNumber": "0811223344",
        "payOrderId": "P1632994407934148609",
        "qrCode": "00020101021226680016COM.NOBUBANK.WWW011993600503000000309000214082200000002450303UBE51440014ID.CO.QRISWWW0215ID20190822000010303UBE520454995303360540450005502015802ID5925GAJAHPAY ID, JAKARTA610515811625301140822000022963305031230617201908221840560010703A0163042904",
        "state": 1,
        "viewName": "jony"
    },
    "msg": "SUCCESS",
    "sign": "25EA605C497808F282D228F11C4D4BDF"
}

Request

Parameter Required Type Description
userName true string user's name
phone true string Customer mobile number, prefix 08 e.g (0811223344)
amount true long Amount your user must paid to complete the transaction
mchOrderNo true string merchant trx id must be unique
subject true string product description
wayCode true string Artha Remit Code product, for qris use qris
displayName true string Customizable VA display name that will be seen by user
expiredTime true int Transaction expiration time in minutes, e.g If Transaction want to be expired after 5 minutes, you just have to set expired_on to 5.
notifyUrl true string url that will receive payment success/fail notification. see callback
redirectUrl true string for qris this feature disable
commonParameter - - see Request Common Parameters

Response

Parameter Required Type Description
data.mchFeeAmount true long the fee we provide
data.mchOrderNo true string trx id from merchant
data.payOrderId true string id transaction from us
data.mobileNumber true string number phone enduser
data.checkoutUrl true string Checkout URL passed from the e-wallet issuers to be used for payment purposes
data.imageUrl true string Url Image QR National Dynamic Data
data.qrCode true string QR National Dynamic Data
data.viewName true string Customizable display name that will be seen by user
data.state true int QRIS state, see state detail

Callback

Once the request is opened, our system will generate a request callback status to open the system to your system and will send it according to the notifyUrl

the callback use json-encoded POST request

Payorder callback

the callback contains Virtual Account, Credit Card Link

Parameter Required Type Description
mchNo true string mchNo
appId true string appId
payOrderId true string id transaction from us
amount true long Amount your user must paid to complete the transaction
mchOrderNo true string merchant trx id must be unique
wayCode true string wayCode
reqTime true long (s)the time of push callback into notify task
createdAt true long (ms) create time of order
state true int payment state, see state detail
sign true sign for notify data. see how to compute sign here

Transfer callback

Parameter Required Type Description
mchNo true string mchNo
appId true string appId
transferId true string id transaction from us
amount true long Amount your user must paid to complete the transaction
mchOrderNo true string merchant trx id must be unique
entryType true string entryType
reqTime true long (s)the time of push callback into notify task
createdAt true long (ms)create time of order
successTime true long (ms)transaction success time
state true int payment state, see state detail
sign true sign for notify data. see how to compute sign here

Status Transaction

Status State Description
0 NON-FINAL Transaction is pending (Processed / Unpaid)
1 FINAL Transaction is completed (Success / Paid)
2 FINAL Transaction is failed
6 FINAL Transaction is expired

Error Response Code

code Description
0 SUCCESS
10 System error
11 Parameter error
12 Server error
100 Paramter value error
101 App error
102 Sign error
900 Inquiry process is complete but the account number is invalid or maybe a virtual account number
901 Bank account have been suspected on doing fraud. You still can do a disbursement to this account
902 Bank account have been confirmed on doing a fraud and therefore is blacklisted. You can’t do a disbursment to this account.
903 The inquiry process is complete and the account is valid, but it is closed/inactive so that it cannot receive money. You cannot do a disbursement to this account.
1001 Available balance is insufficient
1002 Submit fail, Explicitly indicate failure
1003 Logic error
others others error

Change Log