SOLD OUT 2 API
本文書はSOLD OUT 2にて提供しているAPIについて記述したものです。
API利用条件
- SOLD OUT 2の利用規約に同意していること
- 各APIへのアクセス頻度を1時間に1回以内とすること
- APIに別途アクセス頻度の指定がある場合はそちらを優先すること
- 過去のデータを取得したい場合は初回に限り連続取得してもよい
- SOLD OUT 2を楽しむ為にのみ利用すること
- ローカル環境へ保存・蓄積して利用すること
注意事項
- 事前の予告等なく本文書は随時更新されます
- 事前の予告等なくAPIの仕様は随時更新されます
- 事前の予告等なくAPIの提供を終了する場合があります
- APIの利用方法等のサポートは行えません
- 仕様に関するお問い合わせは 交流BBS ↗ までお願いします
- ゲーム内の情報が反映されるまでにタイムラグがあります
改定履歴
- 2017/10/18 アドレスのドメインが変更されました
- 旧 so2.mutoys.com
- 新 so2-api.mutoys.com
- 2017/10/18 利用条件および注意事項が追加されました(最後尾1件ずつ)
- 2017/10/18 ランキング、販売品、注文品、お店、住民情報のAPIが公開されました
- 2017/10/18 過去のデータの存在期間について記載されました
- 2017/10/18 注意事項へ仕様についてのお問い合わせ先が記載されました
- 2017/11/28 商品定義にセット上限数が追加されました
- 2017/12/14 利用条件に「過去データ取得例外」「ローカルへ保存」が追加されました
- 2018/03/18 レシピ商品定義が追加されました
- 2018/04/17 注文レポートと街情報が追加されました
- 2018/09/16 ランキング共通部門名リストへ「食堂」「魔王」が追加されました
- 2021/01/07 全お店リストに図鑑登録数と称号業種/職種のIDとレベル、街定義にアピール商品IDが追加されました(同日補足コメント追加)
- 2021/05/16 住民情報に流行(trend)が追加、同APIへのアクセス頻度制限が10分へ緩和されました
- 2021/07/12 商品定義とレシピ商品定義に「業種/職種」が追加されました
全API共通
- フォーマット JSON
- 文字コード UTF-8
- ”…” 同様の構造の繰り返しあり
商品定義
https://so2-api.mutoys.com/master/item.json
{
商品ID(string): {
"category": カテゴリー名(string),
"class": 業種/職種名(string), // 複数の場合は '/' で連結された文字列
"item_id": 商品ID(number),
"limit": セット上限数(number)
"name": 商品名(string),
"scale": 数量単位(string),
"sort": 並び順(number),
},
...
}
レシピ商品定義
https://so2-api.mutoys.com/json/master/recipe_item.json
レシピ商品はレポート・販売品・注文品APIにおいて通常の商品と同等に扱われます。レシピ商品定義の商品 ID と商品定義のそれは重複しません。
{
商品ID(string): {
"category": カテゴリー名(string),
"class": 業種/職種名(string),
"item_id": 商品ID(number),
"limit": セット上限数(number)
"name": 商品名(string),
"scale": 数量単位(string),
"sort": 並び順(number),
},
...
}
街定義
https://so2-api.mutoys.com/master/area.json
{
街ID(string): {
"area_id": 街ID(number),
"desc": [
街アピールコメント(string),
...
],
"height": マップ縦マス数(number),
"icon": アピール商品ID(number), // アピール商品が無い場合は0
"name": 街名(string),
"pos_x": マップX位置(number),
"pos_y": マップY位置(number),
"width": マップ横マス数(number),
},
...
}
レポート
https://so2-api.mutoys.com/json/report/buy{YYYY}{MM}{DD}.json
- YYYY 対象日の西暦4桁
- MM 対象日の月2桁
- DD 対象日の日2桁
- 2017/5/7 以降のデータが存在します
{
"system": { // 全街住民の購入レポート
"item": {
商品ID(string): {
"count": 総取引件数(number),
"unit": 総取引数量(number),
"money": 総取引額(number),
"price": 取引単価(number)
},
...
}
},
"user": { // 全街業者(店頭)の購入レポート
"item": {
商品ID(string): {
"count": 総取引件数(number),
"unit": 総取引数量(number),
"money": 総取引額(number),
"price": 取引単価(number)
},
...
}
},
"request": { // 全街業者(注文)の購入レポート
"item": {
商品ID(string): {
"count": 総取引件数(number),
"unit": 総取引数量(number),
"money": 総取引額(number),
"price": 取引単価(number)
},
...
}
},
"area": {
街ID(string): { // 街別レポート
"system": { // 街別住民の購入レポート
"item": {
商品ID(string): {
"count": 総取引件数(number),
"unit": 総取引数量(number),
"money": 総取引額(number),
"price": 取引単価(number)
},
...
}
},
"user": { // 街別業者(店頭)の購入レポート
"item": {
商品ID(string): {
"count": 総取引件数(number),
"unit": 総取引数量(number),
"money": 総取引額(number),
"price": 取引単価(number)
},
...
}
},
"request": { // 街別業者(注文)の購入レポート
"item": {
商品ID(string): {
"count": 総取引件数(number),
"unit": 総取引数量(number),
"money": 総取引額(number),
"price": 取引単価(number)
},
...
}
},
},
...
}
}
ランキング
- 古いランキングデータには user_id や shop_id が含まれていない場合があります
- ランキング入賞者数が少ない場合は array も少なくなります
- 2017/5/7 以降のデータが存在します
ランキング共通部門名リスト
- ”point_total” 総合
- ”sale_total” 売上高
- ”exp_stock” 倉庫妖精
- ”exp_sale” 販売妖精
- ”exp_job” 作業妖精
- ”exp_trans” 輸送妖精
- ”exp_1” 薬屋
- ”exp_2” 道具屋
- ”exp_3” 武器屋
- ”exp_4” 防具屋
- ”exp_5” 本屋
- ”exp_6” 八百屋
- ”exp_7” 肉屋
- ”exp_8” 魚屋
- ”exp_9” パン屋
- ”exp_10” 商店
- ”exp_11” 資材屋
- ”exp_12” 食堂
- ”exp_51” 錬金術師
- ”exp_52” 狩人
- ”exp_53” 鉱夫
- ”exp_54” 作家
- ”exp_55” 漁師
- ”exp_56” 酪農家
- ”exp_57” 畜産家
- ”exp_58” 農家
- ”exp_59” 行商人
- ”exp_60” 鍛冶職人
- ”exp_61” 革細工師
- ”exp_62” 裁縫師
- ”exp_63” 勇者
- ”exp_64” 木工師
- ”exp_65” 細工師
- ”exp_66” 調理師
- ”exp_67” 石工師
- ”exp_68” 鋳物師
- ”exp_69” 木こり
- ”exp_70” 魔王
月間全部門トップ 3
https://so2-api.mutoys.com/json/ranking/{YYYY}-{MM}/summary.json
- YYYY 対象日の西暦4桁
- MM 対象日の月2桁
{
部門名(string): [ // 1~3位
{
"top_10": デイリーランキングトップ10入賞回数(array), // デイリー1~10位獲得回数(number)
"top1_total": トップ1獲得回数(number),
"sort": メダル数(number),
"user_id": オーナー番号(number),
"shop_id": ショップ番号(number),
"shop_name": ショップ名(string),
"area_id": 街ID(number),
"comment": キャッチコピー(string)
},
...
],
...
}
月間部門別トップ 1000
https://so2-api.mutoys.com/json/ranking/{YYYY}-{MM}/{部門名}.json
- YYYY 対象日の西暦4桁
- MM 対象日の月2桁
[ // 1~1000位
{
"top_10": デイリーランキングトップ10入賞回数(array), // デイリー1~10位獲得回数(number)
"top1_total": トップ1獲得回数(number),
"sort": メダル数(number),
"user_id": オーナー番号(number),
"shop_id": ショップ番号(number),
"shop_name": ショップ名(string),
"area_id": 街ID(number),
"comment": キャッチコピー(string)
},
...
]
デイリートップ 1000
https://so2-api.mutoys.com/json/ranking/{YYYY}-{MM}-{DD}/{部門名}.json
- YYYY 対象日の西暦4桁
- MM 対象日の月2桁
- DD 対象日の日2桁
[ // 1~1000位
{
"user_id": オーナー番号(number),
"shop_name": ショップ名(string),
"comment": キャッチコピー(string),
"shop_id": ショップ番号(number),
"area_id": 街ID(number),
"pos_x": X座標(number),
"pos_y": Y座標(number),
"point": ポイントもしくは売上高メダル数(number)
},
...
]
販売品
https://so2-api.mutoys.com/json/sale/all.json
- 約10分間隔にて更新されます
- アクセス頻度は10分に1回以内としてください
[
{
"sale_serial": 販売通し番号(number),
"area_id": 街ID(number),
"pos_x": X座標(number),
"pos_y": Y座標(number),
"user_id": オーナー番号(number),
"shop_id": ショップ番号(number),
"shop_name": ショップ名(string),
"item_id": 商品ID(number),
"price": 販売単価(number),
"unit": 販売在庫数(number),
"bundle_sale": まとめ売り(number) // 0:ばら売り 1:まとめ売り
},
...
]
注文品
https://so2-api.mutoys.com/json/request/all.json
- 約10分間隔にて更新されます
- アクセス頻度は10分に1回以内としてください
[
{
"trans_serial": 注文通し番号(number),
"area_id": 街ID(number), //注文者の街
"user_id": オーナー番号(number),
"shop_id": ショップ番号(number),
"shop_name": ショップ名(string),
"item_id": 商品ID(number),
"unit": 買い取り済み数量(number),
"buy_unit": 買い付け希望数(number),
"price": 注文単価(number),
"request_area_id": 街ID(number) // 0:全域対象注文 1~:範囲対象街のID
},
...
]
お店件数
https://so2-api.mutoys.com/json/shop/summary.json
[
"total": 全店舗数(number),
"areas": [ // 街別店舗数
{
"area_id": 街ID(string),
"name": 街名(string),
"count": 店舗数(number)
},
...
]
]
全お店リスト
https://so2-api.mutoys.com/json/shop/all.json
業種 ID
- 1 薬屋
- 2 道具屋
- 3 武器屋
- 4 防具屋
- 5 本屋
- 6 八百屋
- 7 肉屋
- 8 魚屋
- 9 パン屋
- 10 商店
- 11 資材屋
- 12 食堂
職種 ID
- 51 錬金術師
- 52 狩人
- 53 鉱夫
- 54 作家
- 55 漁師
- 56 酪農家
- 57 畜産家
- 58 農家
- 59 行商人
- 60 鍛冶職人
- 61 革細工師
- 62 裁縫師
- 63 勇者
- 64 木工師
- 65 細工師
- 66 調理師
- 67 石工師
- 68 鋳物師
- 69 木こり
- 70 魔王
[
{
"user_id": オーナー番号(number),
"shop_id": ショップ番号(number),
"shop_name": ショップ名(string),
"comment": キャッチコピー(string),
"area_id": 街ID(number),
"pos_x": X座標(number),
"pos_y": Y座標(number),
"shop_type": お店種類(string),
"money": 資金(number),
"title": 称号(string),
"point": ポイント(number),
"foundation_days": 創業日数(number),
"so1_foundation_days": 元祖創業日数(number), //SO1データ引き継ぎをしていない場合は値自体が存在しません
"item_book": 商品図鑑登録数(number),
"high_class": [ 称号業種ID(number), 称号業種レベル(number) ], //該当データが無い場合は[0,0]
"high_job": [ 称号職種ID(number), 称号職種レベル(number) ], //該当データが無い場合は[0,0]
},
...
]
住民
https://so2-api.mutoys.com/json/people/all.json
- 約10分間隔にて更新されます
- アクセス頻度は10分に1回以内としてください
[ // 全街人口リスト
{
"area_id": 街ID(number),
"unit": 街人口(number),
"persons": { // 住民別人口
住民ID(string): {
"unit": 人口(number),
"name": 住民名(string)
},
...
},
"trend": [ // 流行情報(流行情報が無い時はnull)
{
"area_id": 街ID(number),
"isPositive": ムード(boolean), // trueは上げムード、falseは下げムード
"status": 状態(string), // 流行の状態
"message": コメント(string), // 流行の内容
},
...
]
},
...
]
注文レポート
全注文
https://so2-api.mutoys.com/json/request/{YYYY}/{MM}/{DD}/all/{HH}.json
-
YYYY 対象日の西暦4桁
-
MM 対象日の月2桁
-
DD 対象日の日2桁
-
HH 対象時間帯の時2桁
-
特殊フォーマットです。先頭に ”[” を追加し、最後尾の ”,” を削除し、最後尾に ”]” を付けてご利用ください。
[
売却側ショップ番号(number),
売却側ショップ名(string),
注文側ショップ番号(number),
注文側ショップ名(string),
商品ID(number),
商品数量(number),
注文単価(number),
取引時刻(UNIX時間),
],
...
ショップ別注文
https://so2-api.mutoys.com/json/request/{YYYY}/{MM}/{DD}/shop/{ショップ番号}.json
-
YYYY 対象日の西暦4桁
-
MM 対象日の月2桁
-
DD 対象日の日2桁
-
ショップ番号 注文側のショップ番号
-
特殊フォーマットです。先頭に ”[” を追加し、最後尾の ”,” を削除し、最後尾に ”]” を付けてご利用ください。
[
売却側ショップ番号(number),
売却側ショップ名(string),
注文側ショップ番号(number),
注文側ショップ名(string),
商品ID(number),
商品数量(number),
注文単価(number),
取引時刻(UNIX時間),
],
...
街情報
https://so2-api.mutoys.com/json/area/summary.json
[
{
"area_id": 街ID(number),
"point": 活気ポイント(number)
},
...
]
特殊フォーマット parse 例
function get_parsed_json(api_response_text) {
if (api_response_text == "" || api_response_text == null) {
api_response_text = null;
} else if (api_response_text.substr(-1, 1) == ",") {
api_response_text =
"[" + api_response_text.substr(0, api_response_text.length - 1) + "]";
}
return JSON.parse(api_response_text);
}