売上実績API(Sales API)の使い方
このガイドの目的
レシートローラーの売上実績API(Sales API)を使って、ビジネスアカウント全体/特定店舗/特定POS端末の売上を取得する方法をまとめます。モバイルアプリやサーバー連携で「売上ダッシュボード」を作るときの入り口になるガイドです。
前提
- OAuth 2.0 認可コードフローでアクセストークンを取得済みであること
- アプリのスコープに
sales.readを含めていること - 事前にビジネスアカウントと店舗のIDを取得していること(ビジネスアカウント・店舗・POS端末の一覧を取得する)
- ベースURL:
https://receiptroller.io
エンドポイント一覧
| エンドポイント | 用途 | 主なフィルタ |
|---|---|---|
GET /api/v1/sales/kpis | 当月のKPI(売上・取引数・平均客単価)と前月比 | organizationId, storeId?, terminalId? |
GET /api/v1/sales/trend | 月次トレンド(既定12ヶ月、最大60ヶ月) | organizationId, storeId?, months, terminalId? |
GET /api/v1/sales/products | 商品別売上+ABC分析+粗利率 | organizationId, storeId, since, until, category, search, sortBy, terminalId? |
GET /api/v1/sales/visitors | 来店分析(時間帯・曜日・コンバージョン・新規/リピーター) | organizationId, storeId, since, until, terminalId? |
GET /api/v1/sales/multi-trend | 複数店舗の月次トレンドをオーバーレイ(最大10店舗) | organizationId, storeIds(カンマ区切り), months |
GET /api/v1/sales/advice | AIアドバイス(Intelligenceパネルのカード) | organizationId, storeId?, severity?, category? |
GET /api/v1/sales/forecast | 月末着地予測 | organizationId, storeId? |
GET /api/v1/sales/churn | 顧客の離反スコア(RFM-lite) | organizationId, storeId, lookbackDays |
GET /api/v1/sales/recommendations | 個別顧客への商品レコメンド | organizationId, storeId, customerId, topN, lookbackDays |
ビジネスアカウント全体の売上(KPI)
選択中のビジネスアカウントの「今月の数字」を取りたいときは、storeId を付けずに kpis を呼びます。
GET /api/v1/sales/kpis?organizationId={organizationId}
Authorization: Bearer {access_token}
レスポンス構造
すべての数値フィールドは KpiValue という共通の入れ子型で返ります。クライアント側で前月比や増減率を再計算する必要はありません。
{
"organizationId": "0aa2...e7b1",
"currentMonth": "2026-06",
"previousMonth": "2026-05",
"totalStores": { "current": 12, "previous": 12, "changePercent": 0.0 },
"totalStaff": { "current": 87, "previous": 84, "changePercent": 3.6 },
"totalProducts": { "current": 1450, "previous": 1410, "changePercent": 2.8 },
"totalCustomers": { "current": 8920, "previous": 8650, "changePercent": 3.1 },
"totalRevenue": { "current": 3850000, "previous": 3520000, "changePercent": 9.4 },
"totalTransactions": { "current": 1240, "previous": 1180, "changePercent": 5.1 },
"averageTicket": { "current": 3104.84, "previous": 2983.05, "changePercent": 4.1 },
"avgGoogleRating": { "current": 4.3, "previous": 4.2, "changePercent": 2.4 },
"totalReservations": { "current": 210, "previous": 195, "changePercent": 7.7 }
}
KpiValue の中身
current— 当月の値previous— 前月の値(前月のスナップショットが無いときはnull)changePercent— 前月比の変化率(%)。previousが null または 0 のときはnull
averageTicket について
- サーバー側で
totalRevenue / totalTransactionsを計算済みで返ります。クライアントで再計算する必要はありません - 取引数が 0 のときは
current: 0を返します(NaN にはなりません) - 店舗単位・POS端末単位でも同じ
averageTicketフィールドが返ります
特定店舗の売上
同じエンドポイントに storeId を付けると、その店舗だけのKPIを返します。レスポンスは StoreDashboardKpis 形式(フィールド名は revenue, transactionCount, averageTicket など店舗向けの命名)です。
GET /api/v1/sales/kpis?organizationId={organizationId}&storeId={storeId}
Authorization: Bearer {access_token}
{
"storeId": "store-001",
"storeName": "渋谷本店",
"currentMonth": "2026-06",
"staffCount": { "current": 12, "previous": 11, "changePercent": 9.1 },
"revenue": { "current": 850000, "previous": 780000, "changePercent": 8.9 },
"transactionCount": { "current": 340, "previous": 310, "changePercent": 9.6 },
"averageTicket": { "current": 2500.0, "previous": 2516.13, "changePercent": -0.6 },
"reservationCount": { "current": 45, "previous": 38, "changePercent": 18.4 },
"googleRating": { "current": 4.4, "previous": 4.3, "changePercent": 2.3 },
"productCount": { "current": 320, "previous": 318, "changePercent": 0.6 },
"customerCount": { "current": 1820, "previous": 1750, "changePercent": 4.0 }
}
時系列トレンド
過去 N ヶ月の月次推移を取得します。グラフ描画に使います。
GET /api/v1/sales/trend?organizationId={organizationId}&storeId={storeId}&months=12
Authorization: Bearer {access_token}
ポイント
monthsは最大 60。storeIdを省略するとビジネスアカウント合算- 現在は月次のみ。日次・週次のグラフが必要な場合は近日リリース予定です(
?granularity=day|monthの追加を計画中、追跡: t-e9a2f468)
商品別売上(期間指定)
「先月の売れ筋トップ50」など、自由な期間で商品別の売上を集計します。
GET /api/v1/sales/products
?organizationId={organizationId}
&storeId={storeId}
&since=2026-05-01
&until=2026-05-31
&sortBy=revenue
&category=ドリンク
&search=ラテ
&terminalId={terminalId} # (任意)特定POS端末だけの集計
Authorization: Bearer {access_token}
ポイント
since/untilは日付(含み始め、終わりはuntilの翌日 0:00 まで)- レスポンスにはABCグループ(A:累積売上70%以下/B:90%以下/C:それ以降)、粗利・粗利率、合計粗利KPIが含まれます
sortBy:revenue(既定)/quantity/marginterminalIdを付けるとその端末1台分の集計に絞れます(後述の「POS端末で絞り込む」を参照)
複数店舗を比較したい場合
ビジネスアカウントの複数店舗を1枚のグラフに重ねるときは multi-trend を使います。
GET /api/v1/sales/multi-trend
?organizationId={organizationId}
&storeIds=store-001,store-002,store-003
&months=12
Authorization: Bearer {access_token}
最大10店舗まで。6店舗を超えると線が読みづらくなるので、ユーザーが選択した店舗を対象にしぼると良いです。
来店分析(曜日・時間帯)
「平日朝7-9時に強い」「土曜午後に客足が増える」といった行動パターンを把握するためのエンドポイントです。
GET /api/v1/sales/visitors
?organizationId={organizationId}
&storeId={storeId}
&since=2026-05-01
&until=2026-05-31
&terminalId={terminalId} # (任意)特定POS端末だけの集計
Authorization: Bearer {access_token}
レスポンスには時間帯別分布、曜日別分布、時間帯×曜日のヒートマップ、コンバージョン率(CRM紐付け率)、過去12ヶ月の新規/リピーター内訳が含まれます。
AIアドバイス(Intelligenceパネル)
売上の異常検知・予測・改善提案などのカードを取得します。
GET /api/v1/sales/advice
?organizationId={organizationId}
&storeId={storeId}
&severity=Action
&category=Anomaly
Authorization: Bearer {access_token}
ポイント
severity:Action/Warning/Opportunity/Infocategory:Trend/AverageTicket/MixShift/Anomaly/Forecast/Comparison- カードは1日1回バッチで生成されます(リアルタイムではありません)
POS端末で絞り込む(terminalId)
「レジ1台だけの売上」「決まったキャスト・スタッフが入っていた端末の売上」のような POS端末(terminalId)レベルの絞り込みは、4つのエンドポイント(kpis、trend、products、visitors)でサポートしています。
# KPI(端末1台分の今月の数字 + MoM比較、averageTicket込み)
GET /api/v1/sales/kpis?organizationId={orgId}&storeId={storeId}&terminalId={terminalId}
# 月次トレンド(端末1台分の過去Nヶ月)
GET /api/v1/sales/trend?organizationId={orgId}&storeId={storeId}&terminalId={terminalId}&months=12
# 商品別売上(端末1台分の期間集計)
GET /api/v1/sales/products?organizationId={orgId}&storeId={storeId}&terminalId={terminalId}&since=...&until=...
# 来店分析(端末1台分の時間帯・曜日)
GET /api/v1/sales/visitors?organizationId={orgId}&storeId={storeId}&terminalId={terminalId}&since=...&until=...
ポイント
terminalIdを使う場合はstoreIdも必須ですterminalIdが指定したstoreIdに属さない場合は 404 が返ります(クロスストア参照防止)- 端末IDは
GET /api/v1/me/organizations/{orgId}/stores/{storeId}/pos-terminalsで取得できます
端末単位での集計について
/kpisと/trendは端末粒度のリクエスト時にライブ集計するため、応答に含まれるのは Revenue(売上)・TransactionCount(取引数)・AverageTicket(平均客単価)のみです。スタッフ数・商品数・Google評価などは端末単位の概念ではないため0が入ります/productsと/visitorsは元々ライブ集計のため、すべてのフィールドが端末粒度で正しく返ります
典型的なフロー(モバイルアプリ)
GET /api/v1/me/organizationsでビジネスアカウントを取得- ユーザーが選んだら
GET /api/v1/me/organizations/{orgId}/storesで店舗一覧 - ダッシュボード画面で
GET /api/v1/sales/kpisとGET /api/v1/sales/trendを並行リクエスト - ユーザーが店舗を切り替えたら同じエンドポイントを
storeId付きで再取得 - 「POS端末別」タブを開いたら
GET /api/v1/me/organizations/{orgId}/stores/{storeId}/pos-terminalsで端末一覧を取得し、選ばれた端末で各 sales エンドポイントをterminalId付きで再取得 - 「商品別」タブを開いたら
GET /api/v1/sales/productsを呼ぶ - 「アドバイス」タブを開いたら
GET /api/v1/sales/adviceを呼ぶ
権限とトークン
- 必要スコープ:
sales.read - マルチビジネスアカウント対応のアプリは、ユーザースコープのアクセストークンで
?organizationId=を毎回明示 - 1ビジネスアカウントに固定するアプリは、認可時にビジネスアカウントを紐付けたトークンを使えば
organizationId省略可 - アクセストークン有効期限: 8時間。一日の業務シフトに合わせて長めに設定しています。ビジネスアカウントや店舗を切り替えても、同じトークンを使い回せます
- リフレッシュトークン有効期限: 30日。期限切れ時は
POST /api/v1/auth/refreshで新しいアクセストークンを取得してください
エラーレスポンス
| ステータス | 意味 | 対処 |
|---|---|---|
| 401 Unauthorized | アクセストークンが無効/期限切れ | リフレッシュトークンで再取得 |
| 403 Forbidden | スコープに sales.read が含まれていない/ユーザーがビジネスアカウントのメンバーでない | アプリの登録スコープと選択ビジネスアカウントを確認 |
| 400 Bad Request | 必須パラメータ不足(例: products での storeId/terminalId 指定時に storeId なし) | クエリパラメータを見直し |
| 404 Not Found | terminalId が指定 storeId に属さない | 店舗・端末選択UIを再取得 |
関連情報
-
リクエストとレスポンスの基本(JSON)レシートローラーAPIのリクエスト形式、必須ヘッダー、レスポンス構造、ページネーション、フィルタリング、日時形式の規則を解説します。
-
ネイティブモバイルアプリ向けガイド: 複数ビジネスアカウントアクセスと OAuth フローAndroid / iOS のネイティブアプリ向け実装ガイド。アプリ登録時に「認可時に1つのビジネスアカウントへトークンを紐付ける」をオフにすると、user-scoped OAuth トークンが発行されます。/api/v1/me/organizations + ?organizationId= パターンで複数ビジネスアカウントを横断アクセスできます。
-
取引一覧API(Transactions API:POS+OMS統合フィード)の使い方レシートローラーのTransactions APIは、レジ売上(PosTransactions)と販売管理注文(OmsOrders)を1つのフィードに統合した読み取り専用APIです。Android/iOSアプリで「ビジネスアカウント全体の取引」を一覧表示する際の入り口になります。
-
PosTransactionDto 仕様 — 取引データのフィールドリファレンスレシートローラーが扱う取引データの正規モデル PosTransactionDto の全フィールドを解説します。識別子・日時・金額・明細・支払い・スタッフ・ステータス・CRM 連携の各カテゴリーごとに、フィールド名・型・意味・各 POS ベンダーからの埋め方をまとめた、開発者および外部システム連携担当者向けのリファレンスです。スマレジ・Square 双方のマッピング記事からも参照されます。
-
店舗内メディアディスプレイAPI(Display API)の使い方レシートローラーの店舗内 Android ディスプレイ向け API(/api/v1/displays/*)の概要とペアリング・ハートビート・プレイリスト取得の手順をまとめます。Android キオスクや店舗サイネージ端末でメディアループを再生するアプリを実装するための入門ガイドです。