Ship&Coの料金APIをつかって、海外発送で最も安いサービスを自動的に取得する

この記事では、[Ship&CoのAPI](https://developer.shipandco.com)を使って、DHL、UPS、FedEX、日本郵便EMSなどを使って海外発送する際に、各運送会社のどのサービスを使えば一番安く配送できるか判別する方法を説明します。

海外発送は配送料が高くなりがちですが、同じ運送会社でも指定するサービスによってその料金が異なります。Ship&CoのAPIには、[料金](https://developer.shipandco.com/#t-rate)というAPIがあり、[出荷](https://developer.shipandco.com/#t-ship)のAPIから`service`を抜いたパラメータを渡すことで、パラメータに応じた各`service`の料金を一覧で取得することができます。[出荷](https://developer.shipandco.com/#t-ship)のAPIを呼ぶ前に[料金](https://developer.shipandco.com/#t-rate)のAPIを呼ぶことで、常に最安のサービスを使って送り状の印字をすることが自動的にできるようになります。

このフローについては、[Ship&CoのAPI](https://developer.shipandco.com)の概要図にも表現されていますので、ぜひご参照ください。


# 1. rates APIを呼び出す準備をする

[こちらの記事](https://qiita.com/shipandco/items/bdbd802e7a7d66df8fa6)を基にまずは利用する配送会社の送り状印字のパラメータを作ります。そして、そこから`service`の項目を削除して、`https://app.shipandco.com/api/v1/rates`に`POST`するリクエストJSONを作成します。

```
{
    "to_address": {
      "full_name": "John Doe",
      "company": "",
      "email": "",
      "phone": "0901231234",
      "country": "FR",
      "zip": "75002",
      "province": "",
      "city": "Paris",
      "address1": "12 Rue du 4 Septembre",
      "address2": ""
    },
    "from_address": {
      "full_name": "Yamada Taro",
      "company": "World Company",
      "email": "ytaro@worldcompany.com",
      "phone": "08012341234",
      "country": "JP",
      "zip": "6050012",
      "province": "KYOTO",
      "city": "KYOTO SHI",
      "address1": "HIGASHIYAMA KU",
      "address2": "SAIKAISHICHO"
    },
    "products": [
      {
        "name": "T-Shirt",
        "quantity": 2,
        "price": 2980,
        "hs_code": "1234.12",
        "origin_country": "JP"
      }
    ],
    "parcels": [
      {
        "weight": 2000,
        "amount": 1,
        "width": 10,
        "height": 10,
        "depth": 10
      }
    ],
    "customs": {
      "duty_paid": false,
      "content_type": "MERCHANDISE"
    },
    "setup": {
      "carrier": "dhl",
      "currency": "JPY",  /* --- ※１ --- */
      "insurance": 0,
      "ref_number": "123-REF-3456",
      "delivery_note": "Leave the box at the door",
      "discount": 0,
      "signature": false,
      "test": true,
      "return_label": false
    }
}
```

**※１：この`currency`は、[出荷](https://developer.shipandco.com/#t-ship)のAPIと同様に、発送する製品の価格（`products`の`price`）に対する通貨です。このAPIで返される料金の通貨ではありませんのでご注意ください。**

# 2. APIを実行して、サービスごとの料金を比較する

上記で作成したリクエストをもとに、APIを実行します。成功すると、下記のようなレスポンスが返されるので、各サービスの料金（※２）を比較します。

```
[
    {
        "carrier": "custom",
        "service": "custom_standard",
        "currency": "",
        "surcharges": {}
    },
    {
        "carrier": "dhl",
        "service": "dhl_express_0900",
        "currency": "JPY",
        "price": 6106,
        "surcharges": [
            {
                "type": "9:00 PREMIUM",
                "price": 3500
            },
            {
                "type": "EMERGENCY SITUATION",
                "price": 40
            }
        ]
    },
    {
        "carrier": "dhl",
        "service": "dhl_express_1200",
        "currency": "JPY",
        "price": 2851,
        "surcharges": [
            {
                "type": "12:00 PREMIUM",
                "price": 600
            },
            {
                "type": "EMERGENCY SITUATION",
                "price": 40
            }
        ]
    },
    {
        "carrier": "dhl",
        "service": "dhl_express_worldwide",
        "currency": "JPY",
        "price": 2178,
        "surcharges": [
            {
                "type": "EMERGENCY SITUATION",
                "price": 40
            }
        ]
    },
    {
        "carrier": "dhl",
        "service": "dhl_express_jumbo",
        "currency": "JPY",
        "price": 34349,
        "surcharges": []
    },
    {
        "carrier": "fedex",
        "service": "fedex_international_first",
        "currency": "JPY",
        "price": 34452,
        "surcharges": [
            {
                "type": "Peak Surcharge",
                "price": 110
            }
        ]
    },
    {
        "carrier": "fedex",
        "service": "fedex_international_priority",
        "currency": "JPY",
        "price": 2235,
        "surcharges": [
            {
                "type": "Peak Surcharge",
                "price": 110
            }
        ]
    },
    {
        "carrier": "fedex",
        "service": "fedex_international_economy",
        "currency": "JPY",
        "price": 2093,
        "surcharges": [
            {
                "type": "Peak Surcharge",
                "price": 110
            }
        ]
    },
    {
        "carrier": "japanpost",
        "service": "japanpost_ems",
        "currency": "JPY",
        "price": 5000,
        "surcharges": []
    },
    {
        "carrier": "japanpost",
        "service": "japanpost_epacket",
        "currency": "JPY",
        "price": 3065,
        "surcharges": []
    },
    {
        "carrier": "japanpost",
        "service": "japanpost_air_parcel",
        "currency": "JPY",
        "price": 5050,
        "surcharges": []
    },
    {
        "carrier": "japanpost",
        "service": "japanpost_sea_parcel",
        "currency": "JPY",
        "price": 2350,
        "surcharges": []
    },
    {
        "carrier": "japanpost",
        "service": "airmail",
        "currency": "JPY",
        "price": 2760,
        "surcharges": []
    },
    {
        "carrier": "ups",
        "service": "ups_saver",
        "currency": "JPY",
        "price": 3471,
        "surcharges": [
            {
                "type": "Ship To Address Classification is changed from Residential to Commercial"
            }
        ]
    },
    {
        "carrier": "ups",
        "service": "ups_worldwide_express_plus",
        "currency": "JPY",
        "price": 7476,
        "surcharges": [
            {
                "type": "Ship To Address Classification is changed from Residential to Commercial"
            }
        ]
    },
    {
        "carrier": "ups",
        "service": "ups_worldwide_express",
        "currency": "JPY",
        "price": 3676,
        "surcharges": [
            {
                "type": "Ship To Address Classification is changed from Residential to Commercial"
            }
        ]
    },
    {
        "carrier": "ups",
        "service": "ups_worldwide_expedited",
        "currency": "JPY",
        "price": 15558,
        "surcharges": [
            {
                "type": "Ship To Address Classification is changed from Residential to Commercial"
            }
        ]
    }
]
```

**※２：料金は、日本郵便海外以外は、Ship&Coに登録されているアカウントの各運送会社との契約に基づき算出されます。料金の通貨も契約により決定されます（基本的には日本円です）。**

# 3. 最安のサービスを使って発送処理をする

上記のレスポンスで最も安いサービスを選んで、[出荷](https://developer.shipandco.com/#t-ship)のAPIにその`service`のパラメータを渡すことで、最安で発送をすることができます。

# その他の注意点

- **料金APIは出荷APIを利用する前提で無料で提供されています。料金APIのみ利用しているとみなされた場合は該当アカウントのアクセストークンが無効になりますので、ご注意ください。**
- この記事を執筆時点では料金APIは海外発送のサービス（[運送会社とサービス](https://developer.shipandco.com/#t-common_car) で「海外」と表記されているもの）のみ対応されています。国内発送についての対応は今しばらくお待ちください。
- 海外発送については、[こちらの記事](https://qiita.com/shipandco/items/bdbd802e7a7d66df8fa6)もご参照ください。