Use API to monitor IDCF data transfer usage

IDCF is a large enterprise which provides VPS service at an affordable price in Japan. It provides 3TB data transfer for free each month, Extra transfer fee should be paid after exceed the free plan. So it’s a wise choice to balance the data transfer from the different zone.

Firstly, let’s clarify this free plan: When you set up a VPS, there are three different regions available for selection(east JP1, east JP2, and west JP), each region has several zones which named by physical units, like Pascal, Henry, or Joule (all of them in the east JP1 region), all zone list here. After you choose the region you want. Each zone has 3,240GB (almost 3TB) data transfer (transfer in AND transfer out) per month. So we need to calculate all VPS from the same region, add inbound transfer and outbound transfer altogether.

You can enable a new zone in zone management panel. You can select zone by yourself when you launch a new Virtual Machine. One IDCF account can launch up to 20 VMs.

Fortunately, IDCF provides enormous API with a detailed doc. Although it is written in Japanese but contains a large number of English words, So docs can be read without translation. There’s two API about the Internet Data Transfer: listUsageRecords and list_billing_detail. I used the later one in my project.

Firstly, you need to get your own API in the user panel, refer the official example to make a request.

My code(written in Python3):

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018.05.12 09:50
# @Author  : LXFY
# @Site    :
# @File    :
# @Software: VS code
# @Descriptiion: get IDCF data transfer usage

import base64
import hashlib
import hmac
import json
import time

import requests

def getTransferUsage():
    RequestMethod = "GET"
    Endpoint = ""
    RequestPath = "/api/v1/billings/" + time.strftime("%Y-%m", time.localtime()) #current month
    apiKey = ""
    apiSecret = ""
    QueryString = "format=json"

    # Expire time, default: 60 seconds
    Expiration = str(int(time.time()) + 60)

    message = RequestMethod + "\n" + RequestPath + "\n" + \
        apiKey + "\n" + Expiration + "\n" + QueryString
    signature =, 'ascii'), bytes(
        message, 'ascii'), hashlib.sha256).digest()
    sign = base64.b64encode(signature)

    reqhead = {'X-IDCF-APIKEY': apiKey,
            'X-IDCF-Expires': Expiration,
            'X-IDCF-Signature': str(sign, 'utf-8')
    uri = Endpoint + RequestPath + "?" + QueryString
    res = requests.get(uri, headers=reqhead)
    resultdata = res.json()
    # print(json.dumps(resultdata,sort_keys=True,indent=4,separators=(',', ': ')))
    return resultdata

Collect data from json result, and use it in your own project. In addition, IDCF also provide CLI and cloudstack-api. You also can get data via those tools.