Advanced Commerce API の返金は iOS 開発者が返金を始められる唯一の手段。それでも最終判断は Apple にある
ほとんどの iOS 開発者は顧客に返金できません。Apple の Advanced Commerce API を使うアプリは、返金の要求、サブスクリプションの取り消し、任意の金額の返金ができます。各エンドポイントの仕組み、Apple がなお拒否できること、お金の扱いでつまずきやすい点を解説します。

要点
- 2026 年 6 月、ある Apple のエンジニアは、通常の App Store 購入について開発者が直接返金することはできないと述べました。開発者が関与できるのは、CONSUMPTION_REQUEST への応答として送る消費データと refundPreference だけです。
- Apple の Advanced Commerce API の利用を承認されたアプリは、単発の課金やサブスクリプションの取引について App Store に返金を求める Request Transaction Refund エンドポイントを使えます。ほかに Revoke Subscription と Cancel a Subscription エンドポイントもあります。
- Advanced Commerce API の返金、取り消し、解約の各エンドポイントを呼び出すには、開発者の Account Holder が Advanced Commerce API Addendum(追加契約)に署名する必要があります。最新版に同意していない場合、呼び出しはエラーを返すと Apple は説明しています。
- Request Transaction Refund エンドポイントの refundType は FULL、PRORATED、CUSTOM のいずれかです。通貨の 1000 分の 1 単位で指定する refundAmount は CUSTOM のときだけ使えます。Apple によれば、カナダと米国を除くすべての地域で金額は税込みでなければなりません。
- Apple の refundRiskingPreference フィールドのデフォルトは true です。このため App Store は、開発者自身の返金リクエストについて CONSUMPTION_REQUEST を送ることができます。Apple は 12 時間以内の応答を求めています。
- Advanced Commerce API の返金、取り消し、解約の各エンドポイントは、本番環境でアプリごとに毎秒 5 リクエストまでに制限されており、サンドボックスはその 10% です。
- Revoke Subscription の呼び出しが成功すると、Apple は REFUND 通知を送ります。そして、通知が届く前ではなく、その revocationDate の時点でサービスを終了するよう開発者に求めています。
通常の iOS 開発者は顧客に返金できません。2026 年 6 月、ある App Store Commerce Engineer は開発者フォーラムの質問に一文で答えました。現時点では、開発者が直接返金することはできない、と。例外はひとつだけで、それは Advanced Commerce API の中にあります。Apple が承認したアプリは、Advanced Commerce API の返金リクエストを送る、返金付きでサブスクリプションを取り消す、任意の金額を求める、といったことができます。それでも、お金が動くかどうかを決めるのは Apple です。
Advanced Commerce API とは何か、誰が使えるのか
Apple は 2025 年 1 月 23 日に Advanced Commerce API をリリースしました。カスタムの単発購入、サブスクリプション、オプションのアドオン付きサブスクリプションからなる、非常に大規模なカタログの App 内課金を扱うための API です。すべての商品を App Store Connect で作成する必要はありません。SKU を自社サーバで定義し、購入時に Apple へ送ります。
利用はアプリ単位で認められます。申請フォームに記入する必要があり、Apple の適格性ページは、アプリの中核でなければならない 3 つのビジネスモデルを挙げています。
- オーディオブック、クラス、講座、ミニアプリなど、非常に大規模な単発購入のカタログ。
- クリエイターごとの提供内容がそれぞれ独立したサブスクリプションになっている、非常に大規模なサブスクリプションコンテンツのカタログ。
- プレミアムチャンネルやスポーツなど、オプションのアドオンが 1 つの購入としてまとめて更新されるサブスクリプション。
別のプログラムがこの API を必要とする場合も、Apple はアプリの申請を認めています。ホストされたミニアプリにおける対象の App 内課金売上の 85% をメンバーに支払う Mini Apps Partner Program は、この API の利用を条件としています。
返金エンドポイントは後から追加され、署名が必要
2025 年 3 月 24 日付のバージョン 1.1 で、Request Transaction Refund と Revoke Subscription が追加されました。Apple のプログラムページによれば、サブスクリプションコンテンツを提供するアプリは、解約の処理、購入後のコンテンツ検証、カタログ管理のために Cancel、Revoke、Refund の API を使える場合もあります。各エンドポイントのページには同じ条件があります。Account Holder が Advanced Commerce API Addendum に署名しなければならず、最新版に同意していなければ呼び出しはエラーを返します。各エンドポイントの想定用途を定めているのはドキュメントではなく Addendum です。
3 つのエンドポイントを並べて比較
| Cancel a Subscription | Revoke Subscription | Request Transaction Refund | |
|---|---|---|---|
| パス | advancedCommerce/v1/subscription/cancel/{transactionId} | advancedCommerce/v1/subscription/revoke/{transactionId} | advancedCommerce/v1/transaction/requestRefund/{transactionId} |
| 対象 | 自動更新サブスクリプション | サブスクリプションとそのすべてのアイテム | 単発の課金とサブスクリプションの取引 |
| 返金 | なし | FULL または PRORATED | SKU ごとに FULL、PRORATED、CUSTOM |
| アクセス | 期間終了まで継続 | revocationDate で終了 | revoke フラグでアイテムごとに設定 |
| 本番環境のレート制限 | 毎秒 5 件 | 毎秒 5 件 | 毎秒 5 件 |
Cancel a Subscription は次回の課金を止める
Cancel は自動更新をオフにします。Apple によれば、顧客は現在の期間が終わるまでアクセスを維持します。返金は一切ありません。顧客が解約を望み、支払った期間をすでに使い切っている場合に適した呼び出しです。
Revoke Subscription はすべてを即座に終わらせる
Revoke は自動更新を false にし、全額または日割りの返金とともにサブスクリプションを取り消します。リクエスト本文には refundReason、refundRiskingPreference、refundType、requestInfo を含めます。その後 Apple は、App Store Server Notifications V2 のエンドポイントに REFUND 通知を送ります。Apple の指示は具体的です。通知に含まれる revocationDate の時点でサービスを停止し、通知が届く前には停止しないこと。
Request Transaction Refund はアイテム単位で動く
これが精密な道具です。アイテムのリストを送り、それぞれに SKU、refundReason、refundType、revoke フラグを指定します。CUSTOM の場合は通貨の 1000 分の 1 単位で refundAmount も送ります。つまり 4990 は 4.99 を意味します。FULL や PRORATED で金額を送ると、Apple はエラー 4000155 で拒否します。レスポンスには署名付きの取引情報が含まれ、サブスクリプションの場合は署名付きの更新情報も含まれます。
Apple が受け付ける refundReason の値は UNINTENDED_PURCHASE、FULFILLMENT_ISSUE、UNSATISFIED_WITH_PURCHASE、LEGAL、OTHER、MODIFY_ITEMS_REFUND です。7 つ目の SIMULATE_REFUND_DECLINE はサンドボックスと TestFlight でのテスト専用です。この値があるのは、App Store が断ることがあるからです。
自分の返金リクエストでも Apple は拒否できる
このエンドポイントの名前は正直です。これはあくまで「リクエスト」です。決定権が本当はどこにあるかは、2 つのフィールドを見るとわかります。
refundRiskingPreference は消費データの確認を招く
Apple は refundRiskingPreference を、返金判断の参考として App Store が開発者に消費データを求めるかどうかを示すもの、と説明しています。デフォルトは true です。true の場合、自分の返金リクエストについて CONSUMPTION_REQUEST を受け取り、Send Consumption Information で応答します。Apple は、CONSUMPTION_REQUEST の受信から 12 時間以内に応答するよう開発者に求めています。false にすれば、この通知は届きません。
「ノー」を告げるエラー
| エラー | コード | Apple の説明 |
|---|---|---|
| AlreadyRefundedError | 4030021 | この取引はすでに返金済み |
| PendingRefundError | 4000181 | この取引には保留中の返金がある |
| TransactionNotRefundableError | 4030024 | この取引は返金できない |
| TransactionCannotBeRefundedContactSupportError | 4030025 | 顧客は Apple サポートに問い合わせできる |
| RefundAmountWithoutCustomError | 4000155 | CUSTOM 以外で金額が送られた |
備えておくべきは PendingRefundError です。よくある原因は、サポートチームが対応する前に、顧客がすでに Report a Problem から Apple に申し出ているケースです。Apple の適格性ルールでは、これらのアプリはいずれにせよアプリ内に返金への導線を用意する必要があります。Report a Problem へのリンクか beginRefundRequest API のどちらかです。そのため、2 つの扉が同時に開いた状態になります。

Advanced Commerce API の返金で失うお金
自分から返金するほうが、争うより安く感じられます。それでもお金は出ていきますし、この API では、ある種のミスを大規模に繰り返しやすくなります。
カスタム金額に含まれる税
Apple によれば、リクエストする refundAmount は、カナダと米国を除くすべての地域で税込みでなければなりません。税抜きの SKU 価格から CUSTOM の返金額を計算するチームは、それ以外のすべてのストアフロントで返金額が不足し、1 件ずつ修正するためにサポートの工数を払うことになります。
戻ってこないコスト
- 支払い済みの分配金:クリエイターカタログやミニアプリのホストでは、クリエイターの取り分が販売時に支払われていることがよくあります。顧客への返金でそれは回収できません。
- コンテンツのライセンス料:オーディオブックや講座について権利者に支払うタイトルごとの料金は、契約によってはアクセスの時点で発生し、返金しても元に戻りません。
- 計算資源:その購入のために行ったストリーミング、トランスコード、あらゆるサーバ処理は、すでに請求額に含まれています。
- API 呼び出し:音声からモデル推論まで、リクエスト単位で課金される外部サービスは、返金後も請求されたままです。
1 アイテムのつもりが全額返金
Revoke Subscription は、アドオンを含むサブスクリプション全体を返金し、終了させます。顧客が異議を唱えているのが 1 つのアドオンだけなら、Request Transaction Refund でその SKU だけを返金し、そのアイテムにだけ revoke を設定できます。1 アイテムへの苦情に Revoke Subscription を使うと、基本プランの売上まで返すことになります。
有効にする前の実装チェックリスト
- Account Holder が現行の Advanced Commerce API Addendum に同意していることを確認し、失効時に返ってくるエラーにアラートを設定する。
- リクエストごとに新しい requestReferenceId の UUID を生成し、同じ値を再利用するのはタイムアウトした呼び出しの再試行時だけにする。
- 返金の呼び出しはキューに入れる。上限はアプリごとに毎秒 5 件で、429 には UNIX ミリ秒で表した Retry-After ヘッダが付く。
- サンドボックスで SIMULATE_REFUND_DECLINE を使って拒否をテストし、サンドボックスの上限が本番の 10% であることを忘れない。
- refundRiskingPreference はケースごとに決め、true のままにする場合は 12 時間の期限に備えて消費データの応答処理を用意しておく。
- アクセスを終了するのは REFUND 通知が届いてからにし、その revocationDate を基準にする。
- すべてのリクエストについて理由、金額、SKU を記録し、Apple より先に自社の返金率を把握できるようにする。
よくある質問
- iOS 開発者は顧客に直接返金できますか?
- 通常の App Store 購入ではできません。2026 年 6 月、ある Apple のエンジニアは、開発者が直接返金することはできないと述べました。Advanced Commerce API の承認を受け、Addendum に署名したアプリは、Request Transaction Refund エンドポイントで返金を要求できますが、判断するのは引き続き Apple です。
- Advanced Commerce API の Cancel と Revoke の違いは何ですか?
- Cancel は自動更新をオフにし、顧客は期間終了までアクセスを維持します。返金はありません。Revoke はサブスクリプションとそのすべてのアイテムを即座に終了させ、全額または日割りの金額を返金します。Revoke の後、Apple は REFUND 通知を送ります。
- Advanced Commerce API で任意の金額を返金できますか?
- できます。refundType を CUSTOM にし、通貨の 1000 分の 1 単位で refundAmount を渡します。Apple によれば、金額はカナダと米国を除くすべての地域で税込みでなければならず、FULL や PRORATED で金額を送るとエラー 4000155 が返ります。
- 自分で要求した返金について CONSUMPTION_REQUEST が届くことはありますか?
- あります。refundRiskingPreference のデフォルトは true で、App Store は CONSUMPTION_REQUEST を通じて消費データを求めることができます。Apple は 12 時間以内の応答を求めています。false にすれば、その通知は送られないと Apple は説明しています。
- Advanced Commerce API の返金リクエストが失敗したのはなぜですか?
- エラーコードを確認してください。4030021 は取引がすでに返金済み、4000181 は返金がすでに保留中、4030024 は返金不可、4030025 は顧客が Apple サポートに問い合わせるべきことを意味します。Addendum が未署名または古い版の場合もエラーが返ります。
出典と参考資料
- Apple Developer: Advanced Commerce API eligibility and requirements
- Advanced Commerce API: Request Transaction Refund
- Advanced Commerce API: RequestRefundItem
- Advanced Commerce API: refundRiskingPreference
- Advanced Commerce API: Revoke Subscription
- Advanced Commerce API: Rate limits
- Advanced Commerce API changelog
- App Store Server API: Send Consumption Information
- Apple Developer Forums: Refund option in App Store Server API
- Apple Developer: Mini Apps Partner Program
RefundHalt
App Store と Google Play の返金を自動処理
続きを読む
過剰な返金リクエストは返金額以上の損失を招く。両ストアがそれを品質シグナルとして扱うからだ
Apple のガイドライン 5.6.4 は、過剰な返金リクエストをアプリが品質基準を満たしていない兆候として挙げています。Google のデベロッパー販売契約も、返金率を根拠に新規デベロッパーのアプリを削除できると定めています。各ストアの規定、削除の実際のコスト、そしてリスクを避ける方法を解説します。
返金に対応する前に App Store サーバー通知を検証する。webhook URL には誰でも POST できるからです
返金通知は、署名を確認するまではただの HTTPS リクエストにすぎません。App Store サーバー通知と Google Play の RTDN メッセージを検証する方法、各ストアが何に署名しているか、そして偽造された返金や誤って拒否された返金がどれだけの損失になるかを解説します。