株式会社スマレジの開発部でスマレジのサーバサイドを作っています

プラットフォームAPI(POS)で取引情報を大量に取得する際の注意点

こんにちは!株式会社スマレジ 、開発部のmasaです。 投稿間隔が空いてしまいすいません🙇‍♂️ 風邪をひいてしまい、ダウンしておりました。 季節の変わり目なので、皆様も体調管理にはお気をつけください。

さて、今回はよくプラットフォームAPI周りでいただく質問の一つを掘り下げようと思います。

取引情報の同期をしたいが、コール数が足りない!

現在スマレジ プラットフォームAPIには、下記のリンクから確認できるように、プラン価格毎のコール数の制限を将来的に実施することを掲示しています。

developers.smaregi.dev

ディベロッパー管理画面の中にある説明なので、ログインしてご確認ください)

コール数関連の質問について、このブログでお答えできることはないのですが、他社APIと同じく弊社APIについても無計画な大量アクセスを許容してしまうとAPIサーバーやデータベースへのアクセスが不安定になり、サービス品質を落としてしまうことになります。

特にPOSのAPIのように、取引履歴情報を大量に抱えるデータベースへのアクセスがある場合、この安定性の問題がより大事になってきます。 しかし、「なんとか全ての取引情報を取ってきたい!」「取引同期が行えないと作りたいアプリが作れない!」というケースもあるかと思うので、今回は現段階で実装できる取引の同期方法についてご紹介します。

取引情報の構成

スマレジ の取引は大きく3つの情報から成り立っています。 例えば、「渋谷店でAさんが税込み800円のコップを3つと一つ1000円の皿を2枚、現金3000円とPayPay1400円で購入した。」という取引があったとすると、下記のように分類されます。

  1. 取引ヘッダ
    • 「どの店」で「どの会員」が購入したか、といった1つのレシートに対して、一つ情報が存在するもの
    • 上記の例だと「渋谷店で会員Aさんが現金3000円とPayPay1400円で購入」が該当
    • 決済情報もこっちに含まれる。
    • 取置き販売や取置きの引き取り状況、その他決済情報などもこっちに含まれる
    • 取引一覧取得APIで大量に取得可能
  2. 取引明細
    • 「どの商品を」「いくつ」「一つあたりいくらで」購入したのか、といった購入したものに関連する情報
    • 上記の例だと「税込み800円のコップを3つと一つ1000円の皿を2枚購入」が該当
    • 部門販売などもこっちに含まれる
    • 取引明細CSV作成APIで大量取得可能
      • 非同期処理で、一度リクエストを返した後、検索結果のCSVのURLが送られてくる仕組み。webhook通知なのでエンドポイントの用意が必要になります。

一度のコールで大量の取引ヘッダと取引明細を取ってくることは現状不可能

上述のように、取引ヘッダ・取引明細をそれぞれで大量取得することは可能ですが、1度にまとめてセットで取ってくることは現状できません。下記の取引取得APIではセットで取得することはできますが、これは取引IDを指定して取得するため、大量取得処理には不向きです。

www1.smaregi.dev

取引情報については、一度連携側のマスタに差分更新で取り込んでから処理する

上述のように、現状まとめて取引を取ってくる手段がなく、また大量の取引情報をずっとメモリ上に持っておくことも非効率的なことがほとんどなので、取得した取引情報はそのままテーブルに登録することをお勧めします。 また上記で紹介した、取引一覧取得APIと取引明細CSV作成APIは「取引日時」や「更新日時」をリクエストに指定することができますので、「直近30分ごとに新たに生成/更新された取引を取得」という処理を30分間隔で実施するようにすれば、コール数を節約して、大量のデータを取得することができます。