コンテンツにスキップ

スマレジ・プラットフォームAPI 共通仕様

このドキュメントは、スマレジ・プラットフォームAPIの共通部分の仕様についてをまとめたものです。

スマレジ・プラットフォームAPIを利用する事で、仕様の範囲内で外部システムから、スマレジ・POSをはじめ、スマレジ・ウェイター、スマレジ・タイムカード、各プロダクトのデータにアクセスすることができます。

※各プロダクトのAPI機能詳細については、各仕様書をご参照ください。 ※各プロダクトの仕様変更に伴い、APIの仕様が変更される場合があります。

各APIにて共通している項目は以下のとおりです。

項目内容
使用プロトコルHTTP/1.1 (https)
HTTPメソッドGET、POST、PUT、PATCH、DELETE のいずれか
文字コードUTF-8

環境によりエンドポイントURLが異なります。このドキュメントではサンドボックス環境を対象に例を記載しています。

サンドボックス環境本番環境
アクセストークンAPIhttps://id.smaregi.devhttps://id.smaregi.jp
プラットフォームAPIhttps://api.smaregi.devhttps://api.smaregi.jp

アプリとしてアプリユーザーのデータにAPIアクセスするにはアプリアクセストークンを取得する必要があります。

POST https://id.smaregi.dev/app/{契約ID}/token

{契約ID} はアプリユーザーの契約IDに置き換えてください。 契約IDは利用者通知により通知します。

リクエストヘッダー

ヘッダー名値の説明
AuthorizationBasic {Base64文字列} Base64文字列には、クライアントIDとクライアントシークレットをコロン(:)で結合してBase64エンコードしたものを指定。
Content-Typeapplication/x-www-form-urlencoded

クライアントIDとクライアントシークレットは、スマレジ・デベロッパーズでアプリの「環境設定」ページから確認してください。

リクエストボディ

application/x-www-form-urlencoded の形式で、下記のパラメーターを指定してリクエストしてください。 ※ JSON形式ではありません。

キー必須値の説明
grant_typeclient_credentials
scope要求するAPIスコープ。複数の場合は半角スペースで結合して指定。

要求できるAPIスコープは、アプリのAPI設定で有効にしたスコープの中から選択できます。 有効ではないスコープを要求しても無視され、存在しないスコープを含む場合はエラーを返します。

レスポンス

成功時にアクセストークンを含む下記のレスポンスを取得できます。

キー値の説明
scopeアクセストークンで有効なスコープリスト
token_typeBearer
expires_inアクセストークンの有効期間(秒)* アクセストークン発行時の有効期間は変更になる可能性があります。
access_tokenアクセストークン

レスポンスの例

Content-Type: application/json
{
"scope": "{SCOPE_NAME} {SCOPE_NAME} {SCOPE_NAME}",
"token_type": "Bearer",
"expires_in": 3600,
"access_token": "{ACCESS_TOKEN}"
}

各プロダクトのAPIリクエストには、取得したアプリアクセストークンをAuthorizationリクエストヘッダーに含めて送信してください。 ※各プロダクトのAPIエンドポイントについては、仕様書ページより、各仕様書をご参照ください。

リクエストの例

スマレジ の店舗(ID:1)情報を取得します。

GET https://api.smaregi.dev/{契約ID}/pos/stores/1 HTTP/1.1
Authorization: Bearer {アクセストークン}

{アクセストークン}はAPIアクセストークン、{契約ID}はアプリユーザーの契約IDに置き換えてください。

APIリクエストが正常に完了した時は、処理内容に応じたHTTPステータスコードでレスポンスを返却します。

成功レスポンスの例

HTTP/1.1 200 OK
Content-Type: application/json
{
"productId": "1",
"productName": "スマレジTシャツ",
"productCode": "100002454",
"categoryId": "3",
"price": "3000",
"description": "スマレジロゴがプリントされたTシャツです。",
"displaySequence": "5",
"ProductPrices": [
{
"storeId": "1",
"priceDivision": "1",
"startDate": "2020-02-01",
"price": "2800"
}
]
}

レスポンスの詳細は各仕様書を参照してください。

エラーが発生した場合は、エラー原因に応じたHTTPステータスコードおよびメッセージを返却します。 レスポンスの内容は下記の通りです。

レスポンスヘッダー

ヘッダー名値の説明
Content-Typeapplication/problem+json

レスポンスボディ

キー値の説明
typeエラータイプを識別するURI、もしくは about:blank
titleエラーの概要

上記以外のキーを含むことがあります。

エラーレスポンスの例

HTTP/1.1 400 Bad Request
Content-Type: application/problem+json
{
"type": "about:blank",
"title": "Bad Request"
}

エラーレスポンスの詳細は各仕様書を参照してください。

HTTPステータスコード (共通部分)

Section titled “HTTPステータスコード (共通部分)”

共通するHTTPステータスコードは以下のとおりです。 ※詳細は各仕様書を参照してください。

HTTPステータスコード内容
400パラメータが不正です
401アクセストークンが無効です
403アクセス権限がありません
404リソースが存在しません
429一定時間内でのリクエストが多すぎます
500予期しないエラーが発生しました
503サービス利用不可サービスが一時的に過負荷やメンテナンスで使用できません

スマレジ・プラットフォームAPIへのリクエストに対して、次のレート制限を設けています。

スロットリングは一定時間内に受け付けるリクエストの回数を制限する仕組みです。 スマレジ・プラットフォームAPIならびにスマレジサービスを安定的に稼働するために、高頻度なリクエストを抑制することが目的になります。

プラットフォームアプリが契約IDへ、一定時間内にリクエストできる回数を制限します。 プラットフォームAPIのすべてのAPIへのリクエストが対象になり、これにはアクセストークンの発行リクエストや、リクエストの結果がエラーレスポンスになったものも含みます。

HTTPメソッドを基に参照系と更新系の2つのAPI種別に分類し、それぞれで制限を行います。

API種別HTTPメソッドサンドボックス環境本番環境
参照系APIGET (更新系API以外)10回 / 秒50回 / 秒
更新系APIPOST, PUT, PATCH, DELETE4回 / 秒20回 / 秒

スロットリング制限を大きく超えるリクエスト送信が長時間続き、サーバー負荷に影響がある場合はクライアントIDやIPアドレスなどを条件にしたリクエスト拒否を行う可能性があります。

※ スマレジは必要に応じて制限仕様を予告なく変更することができます。 ※ スロットリングは制限の最大までリクエストできることを保証するものではありません。

スマレジはサービスの性能低下や機能停止を防ぐため、予告なく上記以外の追加のレート制限を適用する場合があります。 また当社がスマレジの提供に相当の支障があると判断した場合は、アクセス制限や機能自体の停止等の処置を行うことがあります。

プラットフォームAPIへのリクエストがレート制限に達すると、プラットフォームAPIはHTTPステータスコード 429 Too Many Requests のエラーレスポンスを返してリクエストを拒否します。 エラーレスポンスには次のヘッダーとボディが含まれ、 Retry-After ヘッダーには次のリクエストを再試行できるまでの待機秒数が含まれます。

エラーレスポンス例:

HTTP/1.1 429 Too Many Requests
Content-Type: application/problem+json
Retry-After: 10
{
"type": "about:blank",
"title": "Too Many Requests",
"status": 429
}

レート制限エラーが発生した場合は、Retry-After ヘッダーに含まれる秒数以上を待機してからリクエストを再試行するようにしてください。 API利用の一般的なベストプラクティスとして、リクエスト再試行に指数バックオフ(Exponential Backoff)を考慮することを推奨します。

Webhookは、スマレジで発生したイベントを通知する仕組みです。 特定のイベントが発生した際に、アプリに設定されているWebhook送信先エンドポイントに通知します。 アプリはWebhookで通知を受けることで、スマレジのイベントをトリガーにして処理を行うことができます。

スマレジ・デベロッパーズでアプリの「Webhook」ページから、Webhookの利用、送信先エンドポイント、送信するイベントを設定できます。

  • 開発環境のみ、送信先エンドポイントに http:// で始まるURLを設定できますが、本番環境との差異を少なくする https:// で始まるURLを推奨します。
  • 本番環境の設定は、スマレジ・デベロッパーズで申請/公開の後に反映されます。

Webhookによる通知は、Webhook送信先エンドポイントに下記のフォーマットのHTTPS POSTリクエストが送信されます。

リクエストヘッダー

ヘッダー名値/説明
content-typeapplication/json
smaregi-contract-idイベントの発生した契約ID
smaregi-eventイベント名

Webhookで設定したカスタムヘッダーもリクエストヘッダーに含み送信します。

※ヘッダー名は大文字・小文字を区別しないようにしてください。

リクエストボディ

下記のフィールドを持つオブジェクトを、JSONエンコードしたものがリクエストボディに設定されます。

フィールド名タイプ値/説明
contractIdstringイベントの発生した契約ID
eventstringイベント名
actionstringイベントのアクション名

他にイベントのデータが含まれます。各API仕様書のWebhookを参照してください。

WebhookのHTTPSリクエストには、ステータスコード 200 でレスポンスボディが空のレスポンスを 3秒以内 に応答してください。 応答にそれ以上の時間がかかる場合は、タイムアウトとして接続を終了し、Webhook送信に失敗したと判断します。

  • レスポンスタイム「3秒以内」という基準は変更される可能性があります。
  • Webhookの受信と受信後の処理を分離して、レスポンスを素早く返しつつ受信後の処理を非同期にすることを推奨します。
  • レスポンスサイズが大きいと、タイムアウトにつながったり、サイズ上限を超えたとしてエラーになることがあります。

Webhook送信に失敗しても、現在のところ再送・リトライをおこなっておりません。

  • ネットワーク通信の影響などにより、同じWebhookが重複して送信されることがあります。
  • 重複する内容のWebhookも考慮したWebhook受信処理を推奨します。
  • 通信エラー時の再送処理を検討中です。

Webhookはアプリ利用中の間に発生したイベントを通知します。 アプリ利用者都合などでアプリが利用停止中の間はWebhookは送信されず、利用停止中に発生したイベントをアプリ利用の再開後に送信することもありません。

Webhookを受信する際のベストプラクティスを以下に記載します。

最小限のイベントのみ送信されるよう設定する

アプリ利用者のスマレジ利用規模やイベントによっては、大量のWebhookが送信される可能性があります。 Webhookの設定で、最小限に必要なイベントのみ送信されるよう選択してください。

Webhook受信後の処理を非同期的に処理する

Webhookの受信時にメッセージキューを利用した非同期処理を検討してください。 受信したWebhookをすぐに処理する必要がなくなり、大量のWebhookが発生した際にもシステムの安定性を保つことができます。 メッセージキューに格納後にレスポンスを応答することでレスポンスタイムの短縮にもつながります。

Webhook受信毎にプラットフォームAPI呼び出しをしない

プラットフォームAPIにはレート制限があるため、Webhookを受信する度にプラットフォームAPIを呼び出すと、大量のWebhookが発生した際にレート制限にかかる可能性があります。 プラットフォームAPIを呼び出す際は、Webhookの受信回数に影響を受けない処理を検討してください。

イベントの通知が前後することを想定する

基本的にイベントが発生した時点でWebhookを送信しますが、並列に送信を行うこともあり一定の順序で送信されるわけではありません。 イベントの通知が前後することを想定した処理を検討してください。

同じイベントの通知が重複することを想定する

さまざまな要因により、同じイベントのWebhookが重複して送信されることがあります。 重複して受信したWebhookを処理しないようにする、もしくは複数回処理しても結果が同じになるよう処理する、などを検討してください。

遅延もしくは届かないことを想定する

ネットワーク遅延、大量Webhookの発生による遅延、Webhook送信システムのメンテナンスや障害などにより、Webhookによるイベントの通知が遅延する、もしくは届かないことが起こりえます。 Webhookの受信のみを前提にせず、能動的にプラットフォームAPIを利用してデータ取得するなどの予備手段を検討してください。

スマレジ・プラットフォームから送信されたリクエストであることを確認する

カスタムヘッダーに独自のシークレット文字列を設定し、受信したWebhookのリクエストヘッダーに同じシークレット文字列が含まれることを確認することで、 送信元がスマレジ・プラットフォームであることを確認する方法があります。 シークレット文字列にはエントロピーの高いランダムな文字列を利用してください。

アプリ利用者に関する下記のイベントを利用者契約通知先URLに通知します。

  • 利用を開始したとき
  • 利用を停止したとき
  • プランを変更したとき
  • オプションを契約したとき
  • オプションを変更したとき
  • オプションを解約したとき
  • 利用中アプリの強制停止が行われたとき
  • 利用中アプリの強制停止が解除されたとき

※これらのイベントは、アプリのお試し利用時も同様に通知します。

Header

ヘッダー名値/説明
content-typeapplication/json
smaregi-contract-idイベントの発生した契約ID
smaregi-eventAppSubscription

利用者通知ではWebhookで設定したカスタムヘッダーは送信されません。

※ヘッダー名は大文字・小文字を区別しないようにしてください。

Body

フィールド名タイプ値/説明
eventstringAppSubscription
actionstringstart : アプリ利用開始時 end : アプリ利用停止時 change-plan : プラン変更時 change-options : オプションのみ変更時 force-stop : アプリ強制停止時 cancel-force-stop : アプリ強制停止解除時
datestringアクション発生日(yyyy-mm-dd)
contractIdstringイベントの発生した契約ID(HeaderのSmaregi-Contract-Idと同じ値)
clientIdstring認証認可情報のクライアントID
planobject{"trial_days": "お試し日数(integer)", "price": "プラン合計価格(integer)", "unit_price": "プラン単価(integer)", "quantity": "数量(integer)", "name": "プラン名"}
optionsarray[{"price": "オプション合計価格(integer)", "unit_price": "オプション単価(integer)", "quantity": "数量(integer)", "name": "オプション名"}]

actionchange-optionsオプションのみ契約/変更/解約した場合に通知されます。 以下のようなケースではそれぞれ該当のactionが通知されますのでご注意ください。

  • プランとオプションを同時に利用開始:start
  • プランとオプションを同時に変更:change-plan
  • アプリ自体を解約/強制停止:end / force-stop

Content-Type: application/json
{
"event": "AppSubscription",
"action": "start",
"date": "2020-01-01",
"contractId": "user_contract",
"clientId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"plan": {
"trial_days": 15,
"price": 3000,
"unit_price": 1000,
"quantity": 3,
"name": "スタンダードプラン"
},
"options": [
{
"price": 3000,
"unit_price": 1000,
"quantity": 3,
"name": "オプション1"
}
]
}

※「Webhook - レスポンス」をご確認ください。

  • Webhook受信後、アプリアクセストークンを発行するとプラットフォームAPIを利用できるようになります。

OAuth 2.0 Authorization Code Grant と OpenID Connect に基づいて、スマレジアカウントでのログインを利用できます。

ユーザーにログインと認可を要求するには、認可エンドポイントURLにクエリーパラメータを含めてユーザーをリダイレクトしてください。

認可エンドポイントURL

https://id.smaregi.dev/authorize

クエリーパラメーター

パラメーター必須値の説明
response_typecode
client_idアプリのクライアントID
scopeユーザーに認可を要求するスコープ。複数の場合は半角スペースで結合して指定。
state※推奨CSRF対策に設定するランダムな文字列。動的にランダムな文字列を生成して利用することを推奨。
redirect_uriユーザー認可後のリダイレクト先URL。スマレジ・デベロッパーズでアプリに登録したリダイレクトURIと一致する必要あり。
code_challengePKCE。動的に生成した code_verifier 値のSHA256ハッシュ値をBase64 URLエンコードした値。 publicクライアントは必須、confidentialクライアントは推奨。
code_challenge_methodPKCE。S256 を指定。

scope の指定

OpenID Connect で指定するスコープと、プラットフォームAPIアクセスで必要なスコープを指定してください。

スコープ説明
openidログインユーザーの識別子の取得、UserInfoエンドポイントへのアクセス。
emailログインユーザーのアカウントのメールアドレスを参照。 openid の指定が必須。
profileログインユーザーのプロフィール情報(現在は name のみ)を参照。 openid の指定が必須。
offline_accessリフレッシュトークンの取得。

ユーザーアクセストークンでのプラットフォームAPIへのアクセスは、各サービスAPIの対応状況が異なりますので各API仕様書をご確認ください。 対応していないスコープが含まれる場合、エラーをリダイレクトURIへリダイレクトします。

PKCE code_verifier, code_challenge の生成

code_verifier の値は、[A-Z] / [a-z] / [0-9] / ”-” / ”.” / ”_” / ”~” からなる、43文字~128文字のランダムな文字列を生成してください。 ユーザーアクセストークンの取得時に使用します。

code_challenge の値は、code_challenge_method で指定のメソッドで code_verfifier を計算した結果を使用します。 S256 では code_verifier 値のSHA256ハッシュ値をURLセーフなBase64エンコードした値になります。

confidentialクライアントについてはPKCEの利用を推奨としていますが、将来的に必須とする予定です。

ユーザーが認可するとリダイレクトURIにリダイレクトされ、下記のクエリーパラメーターを含みます。

クエリーパラメーター

パラメーター値の説明
codeユーザーアクセストークン取得に使用する認可コード。有効期限は5分で、1回のみ利用できます。
stateCSRF対策に設定したランダムな文字列。ユーザー認可の要求時に指定した state 値と一致することを検証してください。

認可コードの有効期限は変更される可能性があります。

エラーレスポンス

ユーザーが認可しなかった場合は下記のクエリーパラメーターを含む結果がリダイレクトされます。

パラメーター値の説明
errorエラーコード
error_descriptionエラー内容
stateCSRF対策に設定したランダムな文字列。ユーザー認可の要求時に指定した state 値と一致することを検証してください。

ユーザーアクセストークンの取得

Section titled “ユーザーアクセストークンの取得”

認可コードを使ってユーザーアクセストークンを取得できます。

POST https://id.smaregi.dev/authorize/token

リクエストヘッダー

ヘッダー名値の説明
AuthorizationBasic {Base64文字列} Base64文字列には、クライアントIDとクライアントシークレットをコロン(:)で結合してBase64エンコードしたものを指定。
Content-Typeapplication/x-www-form-urlencoded

クライアントIDとクライアントシークレットは、スマレジ・デベロッパーズでアプリの「環境設定」ページから確認してください。

クライアントシークレットがない場合は空文字をクライアントシークレットとして扱ってください。

リクエストボディ

application/x-www-form-urlencoded の形式で、下記のパラメーターを指定してリクエストしてください。 ※ JSON形式ではありません。

キー必須値の説明
grant_typeauthorization_code
code取得した認可コード
redirect_uriユーザー認可の要求時に指定したリダイレクトURIと同じ値を指定。
code_verifierPKCE。[A-Z] / [a-z] / [0-9] / ”-” / ”.” / ”_” / ”~” からなる、43文字〜128文字の動的に生成したランダムな文字列。認可エンドポイントでPKCEを指定した場合、必須。

レスポンス

成功時にアクセストークンを含む下記のレスポンスを取得できます。

キー値の説明
token_typeBearer
expires_inアクセストークンの有効期間(秒)* アクセストークン発行時の有効期間は変更になる可能性があります。
access_tokenアクセストークン
scopeアクセストークンに付与されたAPIスコープ。
id_tokenユーザー認可の要求時にスコープに openid を指定したときのみ含まれる。
refresh_tokenリフレッシュトークン。スコープに offline_access を指定したときのみ含まれる。有効期限 30日間。
  • アクセストークン・リフレッシュトークン発行時の有効期間は変更になる可能性があります。
  • 要求したスコープがアクセストークンに付与されないことがあります。必要なスコープを含むか確認してください。

レスポンスの例

Content-Type: application/json
{
"token_type": "Bearer",
"expires_in": 3600,
"access_token": "{ACCESS_TOKEN}",
"scope": "{SCOPE}"
}

UserInfoエンドポイントからログインユーザー情報を取得できます。ユーザーアクセストークンに openid スコープが必要です。

POST https://id.smaregi.dev/userinfo
ヘッダー名値の説明
AuthorizationBearer {ACCESS_TOKEN} 取得したアクセストークンを指定。

レスポンス

キー必要スコープ値の説明
subopenid契約またはユーザーの識別子
contractopenid契約情報
- id契約ID
- user_id契約ID内においてのユーザー識別子
- is_ownerユーザーが契約のオーナーであるか
nameprofileログインユーザーのアカウントに登録されている表示用フルネーム
emailemailログインユーザーのアカウントに登録されているメールアドレス
email_verifiedemailメールアドレスが検証済みか

レスポンスの例

Content-Type: application/json
{
"sub": "smaregi:abc123",
"contract": {
"id": "smaregi",
"is_owner": true
}
}

ユーザーアクセストークンの更新

Section titled “ユーザーアクセストークンの更新”

ユーザーアクセストークンの取得時に offline_access スコープを含めていればリフレッシュトークンを取得でき、リフレッシュトークンを使ってユーザーアクセストークンを更新することができます。

POST https://id.smaregi.dev/authorize/token

リクエストヘッダー

ヘッダー名値の説明
AuthorizationBasic {Base64文字列} Base64文字列には、クライアントIDとクライアントシークレットをコロン(:)で結合してBase64エンコードしたものを指定。
Content-Typeapplication/x-www-form-urlencoded

クライアントシークレットがない場合は空文字をクライアントシークレットとして扱ってください。

リクエストボディ

application/x-www-form-urlencoded の形式で、下記のパラメーターを指定してリクエストしてください。 ※ JSON形式ではありません。

キー必須値の説明
grant_typerefresh_token
refresh_tokenユーザーアクセストークン取得時に含まれるリフレッシュトークン。

レスポンス

ユーザーアクセストークンの取得時と同じ項目になります。 レスポンスに含まれる新しいアクセストークン・リフレッシュトークンを使用してください。