01.APIを実行するには

当社API を実行するには、ベーシックアカウント以上の口座を開設している必要があります。
また、API 設定画面において事前に発行した

  • API キー
  • API シークレット

を使用し、HTTP リクエストヘッダーに下記情報を含めます。

パラメータ名 格納する値 設定例
X-Access-ApiKey API設定画面で発行したAPI キー 5021376afa2b29bec4308477e58c362d.g1NAYwlDA
X-Access-Signature 下記 「03.署名生成手順」 で生成したリクエスト毎の署名 d6617c0effb91e3b2d3be8bb85d41da2d89698d41890226907a5f7a6195e1056
X-Access-SignatureTime 署名生成時のタイムスタンプ 1585366496743
X-Access-SwapInfo 署名生成時に使用するリクエスト毎のスワップ情報 sha256/e5e3bf0d956185d3
sha512/4809642e85483a6a

02.サンプルコード

import requests # pip install requests
import hashlib
import urllib.parse
import hmac
import time
import math
import os

API_KEY = 'APIキー'
API_SECRET = 'APIシークレット'

req_method = 'GET' # 'POST'
req_path = '/v1/api_deal/orders'
req_param = 'symbol=BTC_JPY&order_from_date=2020/02/01 12:34:56' # ''
req_host = 'api-trade.decurret.com'
req_body = '' # '{"symbol":"BTC_JPY","order_qty":"0.001","order_type":"LIMIT","side":"BUY","price":"100000"}'

# (1-1) クエリー文字列のソート, URLエンコード
req_param_encode = ''

if '=' in req_param:
    array_param = []
    for sort_param in sorted(req_param.split('&')):
        split = sort_param.split('=')
        encode = '='.join([split[0], urllib.parse.quote(split[1], '')])
        array_param.append(encode)

    req_param_encode = '&'.join(array_param)

# (1-2) リクエストボディーハッシュ化
req_body_hash = hashlib.sha256(req_body.encode()).hexdigest()
# (1-3) 正規リクエスト生成
canonical_request = '\n'.join([req_method, req_path, req_param_encode, req_host, req_body_hash])

# (2) メタ情報の生成
timestamp = str(math.floor(time.time() * 1000)) # タイムスタンプ
swap_key = hashlib.md5(os.urandom(8)).hexdigest() # スワップキー
swap_info = 'sha256/' + swap_key # スワップ情報

# (3-1) 署名文字列生成
sign_text = '&'.join([swap_key, timestamp, canonical_request])
# (3-2) シークレットキー生成
secret = hmac.new(API_SECRET.encode(), swap_key.encode(), hashlib.sha256).hexdigest()
# (3-3) 署名生成
sign_value = hmac.new(secret.encode(), sign_text.encode(), hashlib.sha256).hexdigest()

# (4) リクエスト送信
url = 'https://' + req_host + req_path + '?' + req_param_encode
headers = {
    'X-Access-ApiKey': API_KEY, \
    'X-Access-Signature': sign_value, \
    'X-Access-SignatureTime': timestamp, \
    'X-Access-SwapInfo': swap_info, \
    'Content-Type': 'application/json'
}

response = requests.get(url, headers=headers, verify=True)
# response = requests.post(url, req_body, headers=headers, verify=True)

print(response.status_code)
print(response.content)
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigInteger;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.*;

public class Sample {

    private static final String API_KEY = "APIキー";
    private static final String API_SECRET = "APIシークレット";

    public static void main(String[] args) throws Exception {

        String reqMethod = "GET"; // "POST";
        String reqPath = "/v1/api_deal/orders";

        Map<String, String> reqParam = new HashMap<>();
        reqParam.put("symbol", "BTC_JPY"); // POSTの場合はコメントアウト
        reqParam.put("order_from_date", "2020/02/01 12:34:56"); // POSTの場合はコメントアウト

	String reqHost = "api-trade.decurret.com";
        String reqBody = ""; // "{\"symbol\":\"BTC_JPY\",\"order_qty\":\"0.001\",\"order_type\":\"LIMIT\",\"side\":\"BUY\",\"price\":\"100000\"}";

        // (1-1) クエリー文字列のソート, URLエンコード
        List<String> reqParamList = new ArrayList<>();
        for (Map.Entry<String, String> e : reqParam.entrySet()) {
            String param = e.getKey() + "=" + URLEncoder.encode(e.getValue(), "UTF-8").replace("+", "%20");
            reqParamList.add(param);
        }
        Collections.sort(reqParamList);
        String reqParamEncode = String.join("&", reqParamList);

        // (1-2) リクエストボディーハッシュ化
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        byte[] digest = md.digest(reqBody.getBytes());
        String reqBodyHash = String.format("%064x", new BigInteger(1, digest));

        // (1-3) 正規リクエスト生成
        String canonicalRequest = String.join("\n", reqMethod, reqPath, reqParamEncode, reqHost, reqBodyHash);

        // (2) メタ情報の生成
        String timestamp = String.valueOf(System.currentTimeMillis()); // タイムスタンプ
        String swapKey = String.format("%016x", new Random().nextLong()); // スワップキー
        String swapInfo = "sha256/" + swapKey; // スワップ情報

        // (3-1) 署名文字列生成
        String signText = String.join("&", swapKey, timestamp, canonicalRequest);

	// (3-2) シークレットキー生成
        String algo = "HMacSHA256";
        Mac mac = Mac.getInstance(algo);

        mac.init(new SecretKeySpec(API_SECRET.getBytes(), algo));
        byte[] secretBytes = mac.doFinal(swapKey.getBytes());
        String secret = String.format("%064x", new BigInteger(1,secretBytes));

        // (3-3) 署名生成
        mac.init(new SecretKeySpec(secret.getBytes(), algo));
        byte[] signBytes = mac.doFinal(signText.getBytes());
        String signValue = String.format("%064x", new BigInteger(1,signBytes));

        // (4) リクエスト送信
        URL url = new URL("https://" + reqHost + reqPath + "?" + reqParamEncode);

        HttpURLConnection uc = null;
        try {
            uc = (HttpURLConnection) url.openConnection();
            uc.setRequestMethod(reqMethod);
            uc.setUseCaches(false);

            uc.setRequestProperty("X-Access-ApiKey", API_KEY);
            uc.setRequestProperty("X-Access-Signature", signValue);
            uc.setRequestProperty("X-Access-SignatureTime", timestamp);
            uc.setRequestProperty("X-Access-SwapInfo", swapInfo);
            uc.setRequestProperty("Content-Type", "application/json");

            if (!reqBody.isEmpty()) {
                uc.setDoOutput(true);
                try (OutputStream out = uc.getOutputStream()) {
                    out.write(reqBody.getBytes("UTF-8"));
                }
            }

            int responseCode = uc.getResponseCode();

            String result;
            try (InputStream in = responseCode < 400 ? uc.getInputStream() : uc.getErrorStream();
                 ByteArrayOutputStream bout = new ByteArrayOutputStream()) {
                byte[] buffer = new byte[in.available() + 1];
                while (true) {
                    int length = in.read(buffer);
                    if (length < 0) {
                        break;
                    }
                    bout.write(buffer, 0, length);
                }
                result = bout.toString("UTF-8");
            }

            System.out.println(responseCode);
            System.out.println(result);

        } finally {
            if (uc != null) {
                uc.disconnect();
            }
        }
    }
}
require 'httpclient' # gem install httpclient
require 'uri'
require 'digest'
require 'securerandom'
require 'openssl'
require 'erb'
include ERB::Util

API_KEY = 'APIキー'
API_SECRET = 'APIシークレット'

req_method = 'GET' # 'POST'
req_path = '/v1/api_deal/orders'
req_param = 'symbol=BTC_JPY&order_from_date=2020/02/01 12:34:56' # ''
req_host = 'api-trade.decurret.com'
req_body = '' # '{"symbol":"BTC_JPY","order_qty":"0.001","order_type":"LIMIT","side":"BUY","price":"100000"}'

# (1-1) クエリー文字列のソート, URLエンコード
req_param_encode = ''

if req_param.include?('=') then
  array_param = []
  req_param.split('&').sort.each do |sort_param|
    split = sort_param.split('=')
    encode = [split[0], url_encode(split[1])].join('=')
    array_param.push(encode)
  end

  req_param_encode = array_param.join('&')
end

# (1-2) リクエストボディーハッシュ化
req_body_hash = Digest::SHA256.hexdigest(req_body)
# (1-3) 正規リクエスト生成
canonical_request = [req_method, req_path, req_param_encode, req_host, req_body_hash].join("\n")

# (2) メタ情報の生成
timestamp = Time.now.strftime('%s%L') # タイムスタンプ
swap_key = SecureRandom.hex(8) # スワップキー
swap_info = 'sha256/' + swap_key # スワップ情報

# (3-1) 署名文字列生成
sign_text = [swap_key, timestamp, canonical_request].join('&')
# (3-2) シークレットキー生成
secret = OpenSSL::HMAC::hexdigest(OpenSSL::Digest::SHA256.new, API_SECRET, swap_key)
# (3-3) 署名生成
sign_value = OpenSSL::HMAC::hexdigest(OpenSSL::Digest::SHA256.new, secret, sign_text)

# (4) リクエスト送信
uri = 'https://' + req_host + req_path + '?' + req_param_encode
headers = {
  'X-Access-ApiKey' => API_KEY,
  'X-Access-Signature' => sign_value,
  'X-Access-SignatureTime' => timestamp,
  'X-Access-SwapInfo' => swap_info,
  'Content-Type' => 'application/json',
}

client = HTTPClient.new
response = client.get(uri, nil, headers)
# response = client.post(uri, req_body, headers)

puts response.code
puts response.body
const request = require('request') // npm install request
const crypto = require('crypto')

const API_KEY = 'APIキー'
const API_SECRET = 'APIシークレット'

const reqMethod = 'GET' // 'POST'
const reqPath = '/v1/api_deal/orders'
const reqParam = {'symbol':'BTC_JPY','order_from_date':'2020/02/01 12:34:56'} // {}
const reqHost = 'api-trade.decurret.com'
const reqBody = '{}' // '{"symbol":"BTC_JPY","order_qty":"0.001","order_type":"LIMIT","side":"BUY","price":"100000"}'

// (1-1) クエリー文字列のソート, URLエンコード
const arrayParam = []
for (const param of Object.entries(reqParam)) {
  const encode = param[0] + "=" + encodeURIComponent(param[1])
  arrayParam.push(encode)
}
const reqParamEncode = arrayParam.sort().join('&')

// (1-2) リクエストボディーハッシュ化
const reqBodyHash = crypto.createHash('sha256').update(reqBody).digest('hex')
// (1-3) 正規リクエスト生成
const canonical_request = [reqMethod, reqPath, reqParamEncode, reqHost, reqBodyHash].join('\n')

// (2) メタ情報生成
const timestamp = Date.now() // タイムスタンプ
const swapKey = crypto.randomBytes(8).toString('hex') // スワップキー
const swapInfo = 'sha256/' + swapKey // スワップ情報

// (3-1) 署名文字列生成
const signText = [swapKey, timestamp, canonical_request].join('&')
// (3-2) シークレットキー生成
const secret = crypto.createHmac('sha256', API_SECRET).update(swapKey).digest('hex')
// (3-3) 署名生成
const signValue = crypto.createHmac('sha256', secret).update(signText).digest('hex')

// (4) リクエスト送信
const options = {
  url: 'https://' + reqHost + reqPath + '?' + reqParamEncode,
  method: reqMethod,
  body: reqBody,
  headers: {
    'X-Access-ApiKey': API_KEY,
    'X-Access-Signature': signValue,
    'X-Access-SignatureTime': timestamp,
    'X-Access-SwapInfo': swapInfo,
    'Content-Type': 'application/json'
  }
}

request(options, function(error, response, body) {
  console.log(response.statusCode)
  console.log(body)
})

03.署名生成手順

署名を生成するには下記手順を実施します。

  • (1) 正規リクエストの生成
  • (2) メタ情報の生成
  • (3) 署名の生成

(1) 正規リクエストの生成

(1-1) クエリー文字列のソート, URLエンコード
# (1-1) クエリー文字列のソート, URLエンコード
req_param_encode = ''

if '=' in req_param:
    array_param = []
    for sort_param in sorted(req_param.split('&')):
        split = sort_param.split('=')
        encode = '='.join([split[0], urllib.parse.quote(split[1], '')])
        array_param.append(encode)

    req_param_encode = '&'.join(array_param)
        // (1-1) クエリー文字列のソート, URLエンコード
        List<String> reqParamList = new ArrayList<>();
        for (Map.Entry<String, String> e : reqParam.entrySet()) {
            String param = e.getKey() + "=" + URLEncoder.encode(e.getValue(), "UTF-8").replace("+", "%20");
            reqParamList.add(param);
        }
        Collections.sort(reqParamList);
        String reqParamEncode = String.join("&", reqParamList);
# (1-1) クエリー文字列のソート, URLエンコード
req_param_encode = ''

if req_param.include?('=') then
  array_param = []
  req_param.split('&').sort.each do |sort_param|
    split = sort_param.split('=')
    encode = [split[0], url_encode(split[1])].join('=')
    array_param.push(encode)
  end

  req_param_encode = array_param.join('&')
end
// (1-1) クエリー文字列のソート, URLエンコード
const arrayParam = []
for (const param of Object.entries(reqParam)) {
  const encode = param[0] + "=" + encodeURIComponent(param[1])
  arrayParam.push(encode)
}
const reqParamEncode = arrayParam.sort().join('&')
  • クエリー文字列をパラメータ名で昇順(文字コード順)にソートし、パラメータ値をURLエンコードします。
  • 先頭に'?'を含めないでください。
  • クエリ文字列がない場合は空の文字列を設定します。
  • 例:order_from_date=2020%2F01%2F01%2012%3A34%3A56&symbol=BTC_JPY

(1-2) リクエストボディーハッシュ化
# (1-2) リクエストボディーハッシュ化
req_body_hash = hashlib.sha256(req_body.encode()).hexdigest()
        // (1-2) リクエストボディーハッシュ化
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        byte[] digest = md.digest(reqBody.getBytes());
        String reqBodyHash = String.format("%064x", new BigInteger(1, digest));
# (1-2) リクエストボディーハッシュ化
req_body_hash = Digest::SHA256.hexdigest(req_body)
// (1-2) リクエストボディーハッシュ化
const reqBodyHash = crypto.createHash('sha256').update(reqBody).digest('hex')

リクエストボディーで送信する文字列のハッシュ値を設定します。
リクエストボディーがない場合は空文字のハッシュ値となります。
例:6b9d4414ba5003c73b21469856b6fcd0d3cf2b46346f73896e711c6f754227c2

ハッシュ関数と後述のHMAC署名のアルゴリズムは一致させる必要があります。

(1-3) 正規リクエスト生成
# (1-3) 正規リクエスト生成
canonical_request = '\n'.join([req_method, req_path, req_param_encode, req_host, req_body_hash])
        // (1-3) 正規リクエスト生成
        String canonicalRequest = String.join("\n", reqMethod, reqPath, reqParamEncode, reqHost, reqBodyHash);
# (1-3) 正規リクエスト生成
canonical_request = [req_method, req_path, req_param_encode, req_host, req_body_hash].join("\n")
// (1-3) 正規リクエスト生成
const canonical_request = [reqMethod, reqPath, reqParamEncode, reqHost, reqBodyHash].join('\n')

署名文字列を生成するための正規リクエスト文字列を生成します。
下記表の値を項番順に '\n' (改行) で結合した文字列となります。

項番 格納する値 設定例
1 HTTP リクエストメソッドを指定します。 GET
POST
DELETE
2 APIのパスを指定します。
パスにはクエリー文字列を含めないでください。
/v1/api_deal/orders
3 (1-1)で変換したクエリー文字列となります。 order_from_date=2020%2F01%2F01%2012%3A34%3A56&symbol=BTC_JPY
4 リクエストを送信するホスト名を指定します。 api-trade.decurret.com
5 (1-2)で変換したリクエストボディーのハッシュ値となります。 6b9d4414ba5003c73b21469856b6fcd0d3cf2b46346f73896e711c6f754227c2

(例1)

GET↓
/v1/api_deal/orders↓
order_from_date=2020%2F01%2F01%2012%3A34%3A56&symbol=BTC_JPY↓
api-trade.decurret.com↓
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
GET↓
/v1/api_deal/orders↓
order_from_date=2020%2F01%2F01%2012%3A34%3A56&symbol=BTC_JPY↓
api-trade.decurret.com↓
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
GET↓
/v1/api_deal/orders↓
order_from_date=2020%2F01%2F01%2012%3A34%3A56&symbol=BTC_JPY↓
api-trade.decurret.com↓
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
GET↓
/v1/api_deal/orders↓
order_from_date=2020%2F01%2F01%2012%3A34%3A56&symbol=BTC_JPY↓
api-trade.decurret.com↓
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

(例2)

POST↓
/v1/api_deal/orders↓
↓
api-trade.decurret.com↓
6b9d4414ba5003c73b21469856b6fcd0d3cf2b46346f73896e711c6f754227c2
POST↓
/v1/api_deal/orders↓
↓
api-trade.decurret.com↓
6b9d4414ba5003c73b21469856b6fcd0d3cf2b46346f73896e711c6f754227c2
POST↓
/v1/api_deal/orders↓
↓
api-trade.decurret.com↓
6b9d4414ba5003c73b21469856b6fcd0d3cf2b46346f73896e711c6f754227c2
POST↓
/v1/api_deal/orders↓
↓
api-trade.decurret.com↓
6b9d4414ba5003c73b21469856b6fcd0d3cf2b46346f73896e711c6f754227c2

「↓」は改行があることを示します。また、クエリー文字列がない場合は空行を含めます。

(2) メタ情報の生成

# (2) メタ情報の生成
timestamp = str(math.floor(time.time() * 1000)) # タイムスタンプ
swap_key = hashlib.md5(os.urandom(8)).hexdigest() # スワップキー
swap_info = 'sha256/' + swap_key # スワップ情報
        // (2) メタ情報の生成
        String timestamp = String.valueOf(System.currentTimeMillis()); // タイムスタンプ
        String swapKey = String.format("%016x", new Random().nextLong()); // スワップキー
        String swapInfo = "sha256/" + swapKey; // スワップ情報
# (2) メタ情報の生成
timestamp = Time.now.strftime('%s%L') # タイムスタンプ
swap_key = SecureRandom.hex(8) # スワップキー
swap_info = 'sha256/' + swap_key # スワップ情報
// (2) メタ情報生成
const timestamp = Date.now() // タイムスタンプ
const swapKey = crypto.randomBytes(8).toString('hex') // スワップキー
const swapInfo = 'sha256/' + swapKey // スワップ情報

メタ情報は下記の内容を指します。

項目 説明 設定例
タイムスタンプ エンドユーザアプリと認証サービス側で時間のずれがないことを確認します。(UNIXエポック形式) 1585366496526
スワップキー 半角英字(小文字)、半角数字から構成される1桁以上32桁以下の文字列で構成します。 e5e3bf0d956185d3
スワップ情報 署名で使用するハッシュアルゴリズムの文字列とスワップキーを '/' で組み合わせたものです。 sha256/e5e3bf0d956185d3
sha512/4809642e85483a6a

(3) 署名の生成

(3-1) 署名文字列生成
# (3-1) 署名文字列生成
sign_text = '&'.join([swap_key, timestamp, canonical_request])
        // (3-1) 署名文字列生成
        String signText = String.join("&", swapKey, timestamp, canonicalRequest);
# (3-1) 署名文字列生成
sign_text = [swap_key, timestamp, canonical_request].join('&')
// (3-1) 署名文字列生成
const signText = [swapKey, timestamp, canonical_request].join('&')

署名文字列とは、署名の元情報となる文字列を指します。
メタ情報の「スワップキー」・「タイムスタンプ」・「正規リクエスト」を '&'(アンパーサンド)で結合した文字列です。

(3-2) シークレットキー生成
# (3-2) シークレットキー生成
secret = hmac.new(API_SECRET.encode(), swap_key.encode(), hashlib.sha256).hexdigest()
        // (3-2) シークレットキー生成
        String algo = "HMacSHA256";
        Mac mac = Mac.getInstance(algo);

        mac.init(new SecretKeySpec(API_SECRET.getBytes(), algo));
        byte[] secretBytes = mac.doFinal(swapKey.getBytes());
        String secret = String.format("%064x", new BigInteger(1,secretBytes));
# (3-2) シークレットキー生成
secret = OpenSSL::HMAC::hexdigest(OpenSSL::Digest::SHA256.new, API_SECRET, swap_key)
// (3-2) シークレットキー生成
const secret = crypto.createHmac('sha256', API_SECRET).update(swapKey).digest('hex')

シークレットキーは、「スワップキー」を「APIシークレット」で署名し、Base16エンコードした文字列です。

(3-3) 署名生成
# (3-3) 署名生成
sign_value = hmac.new(secret.encode(), sign_text.encode(), hashlib.sha256).hexdigest()
        // (3-3) 署名生成
        mac.init(new SecretKeySpec(secret.getBytes(), algo));
        byte[] signBytes = mac.doFinal(signText.getBytes());
        String signValue = String.format("%064x", new BigInteger(1,signBytes));
# (3-3) 署名生成
sign_value = OpenSSL::HMAC::hexdigest(OpenSSL::Digest::SHA256.new, secret, sign_text)
// (3-3) 署名生成
const signValue = crypto.createHmac('sha256', secret).update(signText).digest('hex')

署名は、「署名文字列」を「シークレットキー」で署名し、Base16エンコードした文字列です。

(4) リクエスト送信

# (4) リクエスト送信
url = 'https://' + req_host + req_path + '?' + req_param_encode
headers = {
    'X-Access-ApiKey': API_KEY, \
    'X-Access-Signature': sign_value, \
    'X-Access-SignatureTime': timestamp, \
    'X-Access-SwapInfo': swap_info, \
    'Content-Type': 'application/json'
}

response = requests.get(url, headers=headers, verify=True)
# response = requests.post(url, req_body, headers=headers, verify=True)

print(response.status_code)
print(response.content)
        // (4) リクエスト送信
        URL url = new URL("https://" + reqHost + reqPath + "?" + reqParamEncode);

        HttpURLConnection uc = null;
        try {
            uc = (HttpURLConnection) url.openConnection();
            uc.setRequestMethod(reqMethod);
            uc.setUseCaches(false);

            uc.setRequestProperty("X-Access-ApiKey", API_KEY);
            uc.setRequestProperty("X-Access-Signature", signValue);
            uc.setRequestProperty("X-Access-SignatureTime", timestamp);
            uc.setRequestProperty("X-Access-SwapInfo", swapInfo);
            uc.setRequestProperty("Content-Type", "application/json");

            if (!reqBody.isEmpty()) {
                uc.setDoOutput(true);
                try (OutputStream out = uc.getOutputStream()) {
                    out.write(reqBody.getBytes("UTF-8"));
                }
            }

            int responseCode = uc.getResponseCode();

            String result;
            try (InputStream in = responseCode < 400 ? uc.getInputStream() : uc.getErrorStream();
                 ByteArrayOutputStream bout = new ByteArrayOutputStream()) {
                byte[] buffer = new byte[in.available() + 1];
                while (true) {
                    int length = in.read(buffer);
                    if (length < 0) {
                        break;
                    }
                    bout.write(buffer, 0, length);
                }
                result = bout.toString("UTF-8");
            }

            System.out.println(responseCode);
            System.out.println(result);

        } finally {
            if (uc != null) {
                uc.disconnect();
            }
        }
# (4) リクエスト送信
uri = 'https://' + req_host + req_path + '?' + req_param_encode
headers = {
  'X-Access-ApiKey' => API_KEY,
  'X-Access-Signature' => sign_value,
  'X-Access-SignatureTime' => timestamp,
  'X-Access-SwapInfo' => swap_info,
  'Content-Type' => 'application/json',
}

client = HTTPClient.new
response = client.get(uri, nil, headers)
# response = client.post(uri, req_body, headers)

puts response.code
puts response.body
// (4) リクエスト送信
const options = {
  url: 'https://' + reqHost + reqPath + '?' + reqParamEncode,
  method: reqMethod,
  body: reqBody,
  headers: {
    'X-Access-ApiKey': API_KEY,
    'X-Access-Signature': signValue,
    'X-Access-SignatureTime': timestamp,
    'X-Access-SwapInfo': swapInfo,
    'Content-Type': 'application/json'
  }
}

request(options, function(error, response, body) {
  console.log(response.statusCode)
  console.log(body)
})

リクエストヘッダーに各値を設定し、リクエストを送信します。