openapi: 3.1.0
info:
  title: Adapty サーバーサイド API
  version: 1.0.0
servers:
  - url: https://api.adapty.io
    description: 本番サーバー
paths:
  /api/v2/server-side-api/profile/:
    post:
      summary: プロファイルを作成する
      description: Adapty にアプリのエンドユーザーを新規作成します。
      operationId: createProfile
      tags:
        - Profile
      security:
        - apikeyAuth: []
      parameters:
        - name: adapty-customer-user-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおける顧客の一意の ID です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
        - name: adapty-profile-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおけるプロファイルの一意の ID です。匿名プロファイルを扱う場合に最適です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
        - name: adapty-platform
          in: header
          required: false
          schema:
            type: string
          description: ユーザーがアプリをインストールしているデバイスのプラットフォーム
      responses:
        '200':
          description: プロファイルが正常に作成されました
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProfileResponse'
              example:
                data:
                  app_id: "14c3d623-2f3a-455a-aa86-ef83dff6913b"
                  profile_id: "3286abd3-48b0-4e9c-a5f6-ac0a006804a6"
                  customer_user_id: "jane.doe@example.com"
                  total_revenue_usd: 0.0
                  segment_hash: "8f45947bad31ab0c"
                  timestamp: 1736425645861
                  custom_attributes:
                    - key: "favourite_sport"
                      value: "yoga"
                  access_levels: []
                  subscriptions: []
                  non_subscriptions: []
        '401':
          description: 認証エラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors:
                  - source: "non_field_errors"
                    errors: ["Authentication credentials were not provided."]
                error_code: "not_authenticated"
                status_code: 401
        '500':
          description: 内部サーバーエラー
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProfileRequest'
            example:
              first_name: "Jane"
              last_name: "Doe"
              gender: "f"
              email: "jane.doe@example.com"
              phone_number: "+1234567890"
              birthday: "2000-12-31"
              ip_country: "FR"
              store_country: "US"
              store: "app_store"
              analytics_disabled: true
              custom_attributes:
                - key: "favourite_sport"
                  value: "yoga"
              installation_meta:
                device_id: "3fa85f64-5717-4562-b3fc-2c963f66afa6"
                device: "string"
                locale: "en"
                os: "string"
                platform: "iOS"
                timezone: "Europe/Rome"
                user_agent: "Mozilla/5.0 (iPhone; CPU iPhone OS 17_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1"
                idfa: "EA7583CD-A667-48BC-B806-42ECB2B48333"
                idfv: "E9D48DA5-3930-4B41-8521-D953AECD2F33"
                advertising_id: ""
                android_id: ""
                android_app_set_id: ""
    get:
      summary: プロファイルを取得する
      description: アプリの既存エンドユーザーの詳細を取得します。
      operationId: getProfile
      tags:
        - Profile
      security:
        - apikeyAuth: []
      parameters:
        - name: adapty-customer-user-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおける顧客の一意の ID です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
        - name: adapty-profile-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおけるプロファイルの一意の ID です。匿名プロファイルを扱う場合に最適です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
      responses:
        '200':
          description: プロファイルが正常に取得されました
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProfileResponse'
              example:
                data:
                  app_id: "14c3d333-2f3a-455a-aa86-ef83dff6913b"
                  profile_id: "d8533a10-bcce-4e33-8c9d-88b05ac56559"
                  customer_user_id: "77B14FB4-FD2A-4D38-AA3A-4C433F79863C"
                  total_revenue_usd: 9.99
                  segment_hash: "fdaeef7f8aaa33c9"
                  timestamp: 1733324566777
                  custom_attributes:
                    - key: "favourite_sport"
                      value: "yoga"
                  access_levels:
                    - access_level_id: "premium"
                      store: "app_store"
                      store_product_id: "unlimited.9999"
                      store_base_plan_id: null
                      store_transaction_id: "2000000335013007"
                      store_original_transaction_id: "2000000335013007"
                      offer: null
                      starts_at: null
                      purchased_at: "2024-12-24T10:50:23+00:00"
                      originally_purchased_at: "2024-12-24T10:50:23+00:00"
                      expires_at: null
                      renewal_cancelled_at: "2025-01-05T13:27:47.461425+00:00"
                      billing_issue_detected_at: null
                      is_in_grace_period: false
                      cancellation_reason: null
                  subscriptions:
                    - store: "app_store"
                      store_product_id: "unlimited.9999"
                      store_base_plan_id: null
                      store_transaction_id: "2000000815013007"
                      store_original_transaction_id: "2000000815013007"
                      offer: null
                      environment: "Sandbox"
                      purchased_at: "2024-12-24T10:50:23+00:00"
                      originally_purchased_at: "2024-12-24T10:50:23+00:00"
                      expires_at: null
                      renewal_cancelled_at: null
                      billing_issue_detected_at: null
                      is_in_grace_period: false
                      cancellation_reason: null
                  non_subscriptions:
                    - purchase_id: "7a5f9a7d-e236-33e6-96d8-53a3c59c5562"
                      store: "app_store"
                      store_product_id: "1year.premium"
                      store_base_plan_id: null
                      store_transaction_id: "30002109551456"
                      store_original_transaction_id: "30002109551456"
                      purchased_at: "2022-10-12T09:42:50+00:00"
                      environment: "Production"
                      is_refund: false
                      is_consumable: false
        '401':
          description: 認証エラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors:
                  - source: "non_field_errors"
                    errors: ["Authentication credentials were not provided."]
                error_code: "not_authenticated"
                status_code: 401
        '404':
          description: プロファイルが見つかりません
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors:
                  - source: null
                    errors: ["Profile not found"]
                error_code: "profile_does_not_exist"
                status_code: 404
        '500':
          description: 内部サーバーエラー
    patch:
      summary: プロファイルを更新する
      description: ユーザープロファイル情報を更新します
      operationId: updateProfile
      tags:
        - Profile
      security:
        - apikeyAuth: []
      parameters:
        - name: adapty-customer-user-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおける顧客の一意の ID です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
        - name: adapty-profile-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおけるプロファイルの一意の ID です。匿名プロファイルを扱う場合に最適です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
      responses:
        '200':
          description: プロファイルが正常に更新されました
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProfileResponse'
        '400':
          description: リクエストが不正です
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: 認証エラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: プロファイルが見つかりません
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: 内部サーバーエラー
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ProfileRequest'
    delete:
      summary: プロファイルを削除する
      description: ユーザープロファイルを削除します
      operationId: deleteProfile
      tags:
        - Profile
      security:
        - apikeyAuth: []
      parameters:
        - name: adapty-customer-user-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおける顧客の一意の ID です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
        - name: adapty-profile-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおけるプロファイルの一意の ID です。匿名プロファイルを扱う場合に最適です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
      responses:
        '204':
          description: プロファイルが正常に削除されました
        '401':
          description: 認証エラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: プロファイルが見つかりません
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: 内部サーバーエラー

  /api/v2/server-side-api/purchase/set/transaction/:
    post:
      summary: トランザクションを設定する
      description: |
        Adapty にアプリのエンドユーザーの新しいトランザクションを作成し、アクセスレベルを付与します。このメソッドで作成されたトランザクションはアナリティクスおよびイベントフィードに表示され、すべてのインテグレーションに送信されます。

        **既存のサブスクリプションの更新:** 新しい `subscription_renewed` イベントを発生させずに `billing_issue_detected_at` または `renew_status_changed_at` を更新するには、既存の `store_transaction_id` を同じ `store_original_transaction_id` の下で再利用してください。新しい `store_transaction_id` を送信すると新しいトランザクションとして扱われ、`subscription_renewed` イベントが発火します。
      operationId: setTransaction
      tags:
        - Purchase
      security:
        - apikeyAuth: []
      parameters:
        - name: adapty-customer-user-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおける顧客の一意の ID です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
        - name: adapty-profile-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおけるプロファイルの一意の ID です。匿名プロファイルを扱う場合に最適です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
      responses:
        '200':
          description: トランザクションが正常に記録されました
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProfileResponse'
        '400':
          description: リクエストが不正です
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: 認証エラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: プロファイルが見つかりません
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: 内部サーバーエラー
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TransactionDTORequest'
            examples:
              one_time_purchase:
                summary: 買い切り購入の例
                value:
                  purchase_type: "one_time_purchase"
                  store: "app_store"
                  environment: "Production"
                  store_product_id: "premium_lifetime"
                  store_transaction_id: "1000000123456789"
                  store_original_transaction_id: "1000000123456789"
                  is_family_shared: false
                  price:
                    country: "US"
                    currency: "USD"
                    value: 9.99
                  purchased_at: "2024-01-15T10:30:00Z"
                  variation_id: "variation_123"
                  offer: null
                  refunded_at: null
                  cancellation_reason: null
              subscription:
                summary: サブスクリプションの例
                value:
                  purchase_type: "subscription"
                  store: "app_store"
                  environment: "Production"
                  store_product_id: "premium_monthly"
                  store_transaction_id: "1000000123456789"
                  store_original_transaction_id: "1000000123456789"
                  is_family_shared: false
                  price:
                    country: "US"
                    currency: "USD"
                    value: 4.99
                  purchased_at: "2024-01-15T10:30:00Z"
                  originally_purchased_at: "2024-01-15T10:30:00Z"
                  expires_at: "2024-02-15T10:30:00Z"
                  renew_status: true
                  renew_status_changed_at: null
                  billing_issue_detected_at: null
                  grace_period_expires_at: null
                  variation_id: "variation_123"
                  offer:
                    category: "introductory"
                    type: "free_trial"
                    id: "trial_offer_123"
                  refunded_at: null
                  cancellation_reason: null

  /api/v2/server-side-api/purchase/profile/grant/access-level/:
    post:
      summary: アクセスレベルを付与する
      description: トランザクション情報を提供せずにエンドユーザーにアクセスレベルを付与します。紹介報酬やその他のプロダクト関連イベントに便利です。このメソッドで付与されたアクセスレベルはアナリティクスには反映されません。Webhook インテグレーションにのみ送信され、その場合のみイベントフィードに表示されます。
      operationId: grantAccessLevel
      tags:
        - Purchase
      security:
        - apikeyAuth: []
      parameters:
        - name: adapty-customer-user-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおける顧客の一意の ID です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
        - name: adapty-profile-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおけるプロファイルの一意の ID です。匿名プロファイルを扱う場合に最適です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
      responses:
        '200':
          description: アクセスレベルが正常に付与されました
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProfileResponse'
        '400':
          description: リクエストが不正です
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: 認証エラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: プロファイルが見つかりません
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: 内部サーバーエラー
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/GrantAccessRequest'
            examples:
              immediate_grant:
                summary: 即座にアクセスを付与する
                value:
                  access_level_id: "premium"
              scheduled_grant:
                summary: 開始日時と終了日時を指定してアクセスを付与する
                value:
                  access_level_id: "premium"
                  starts_at: "2024-01-01T00:00:00Z"
                  expires_at: "2024-12-31T23:59:59Z"
              lifetime_grant:
                summary: 永続アクセスを付与する
                value:
                  access_level_id: "premium"
                  starts_at: "2024-01-01T00:00:00Z"

  /api/v2/server-side-api/purchase/profile/revoke/access-level/:
    post:
      summary: アクセスレベルを失効させる
      description: Adapty のアプリのエンドユーザーからアクセスレベルを削除します。
      operationId: revokeAccessLevel
      tags:
        - Purchase
      security:
        - apikeyAuth: []
      parameters:
        - name: adapty-customer-user-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおける顧客の一意の ID です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
        - name: adapty-profile-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおけるプロファイルの一意の ID です。匿名プロファイルを扱う場合に最適です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
      responses:
        '200':
          description: アクセスレベルが正常に失効されました
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProfileResponse'
        '400':
          description: リクエストが不正です
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '401':
          description: 認証エラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '404':
          description: プロファイルが見つかりません
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: 内部サーバーエラー
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RevokeAccessRequest'
            examples:
              immediate_revoke:
                summary: 即座にアクセスを失効させる
                value:
                  access_level_id: "premium"
              scheduled_revoke:
                summary: アクセス失効をスケジュールする
                value:
                  access_level_id: "premium"
                  revoke_at: "2024-12-31T23:59:59Z"

  /api/v2/server-side-api/purchase/profile/refund-saver/settings/:
    get:
      summary: Refund Saver の設定を取得する
      description: このユーザーの Refund Saver 設定（Adapty がユーザーの返金リクエストを拒否または承認するよう求めるかどうか）を取得します。また、ユーザーが Apple とのデータ共有に同意しているかどうかのデータ共有設定も取得します。
      operationId: getRefundSaverSettings
      tags:
        - Refund Saver
      security:
        - apikeyAuth: []
      parameters:
        - name: adapty-customer-user-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおける顧客の一意の ID です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
        - name: adapty-profile-id
          in: header
          required: false
          schema:
            type: string
            format: uuid
          description: お客様のシステムにおけるプロファイルの一意の ID です。匿名プロファイルを扱う場合に最適です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
      responses:
        '200':
          description: 設定が正常に取得されました
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefundSaverSettingsResponse'
              example:
                profile_id: "e5aab402-b1bd-4039-b632-57a91ebc0779"
                settings:
                  consent: true
                  custom_preference: "no_preference"
        '400':
          description: リクエストが不正です
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                profile_does_not_exist:
                  summary: プロファイルが存在しません
                  value:
                    errors: ["Profile does not exist"]
                    error_code: "profile_does_not_exist"
                    status_code: 400
        '401':
          description: 認証エラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors: ["Invalid API key"]
                error_code: "unauthorized"
                status_code: 401
        '500':
          description: 内部サーバーエラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
    post:
      summary: Refund Saver の設定を行う
      description: ユーザーごとに返金設定を個別に設定し、ユーザーがデータ共有に同意したかどうかを記録します。デフォルトでは、Refund Saver は常に Apple にユーザーの返金リクエストを拒否するよう求めます。Adapty ダッシュボードですべてのユーザーに対してこのデフォルト動作を変更するか、ダッシュボード・Adapty SDK・またはサーバーサイド API を使用して特定のユーザー向けに調整できます。
      operationId: setRefundSaverSettings
      tags:
        - Refund Saver
      security:
        - apikeyAuth: []
      parameters:
        - name: adapty-customer-user-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおける顧客の一意の ID です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
        - name: adapty-profile-id
          in: header
          required: false
          schema:
            type: string
            format: uuid
          description: お客様のシステムにおけるプロファイルの一意の ID です。匿名プロファイルを扱う場合に最適です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RefundSaverSettingsRequest'
            example:
              custom_preference: "grant"
              consent: true
      responses:
        '200':
          description: 設定が正常に更新されました
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RefundSaverSettingsResponse'
              example:
                profile_id: "e5aab402-b1bd-4039-b632-57a91ebc0779"
                settings:
                  consent: true
                  custom_preference: "grant"
        '400':
          description: リクエストが不正です
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                profile_does_not_exist:
                  summary: プロファイルが存在しません
                  value:
                    errors: ["Profile does not exist"]
                    error_code: "profile_does_not_exist"
                    status_code: 400
                validation_error:
                  summary: バリデーションエラー
                  value:
                    errors: ["Profile refund saver settings must have either consent or custom_preference or both"]
                    error_code: "validation_error"
                    status_code: 400
        '401':
          description: 認証エラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors: ["Invalid API key"]
                error_code: "unauthorized"
                status_code: 401
        '500':
          description: 内部サーバーエラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

  /api/v1/sdk/purchase/stripe/token/validate/:
    post:
      summary: Stripe の購入を検証する
      description: |
        Adapty ダッシュボードのアプリ設定に登録された Stripe の認証情報を使用して、指定された Stripe トークンで購入を検証します。
        購入が有効な場合、Stripe からトランザクション履歴が、指定された customer_user_id を持つ Adapty のプロファイルにインポートされます。
        この customer_user_id を持つプロファイルが存在しない場合は、新たに作成されます。

        プロファイルイベントはその過程で生成され、インポートされたトランザクションは MTR に計上されます。
      operationId: validateStripePurchase
      tags:
        - Stripe
      security:
        - apikeyAuth: []
      requestBody:
        required: true
        content:
          application/vnd.api+json:
            schema:
              $ref: '#/components/schemas/StripeValidationRequest'
            example:
              data:
                type: "stripe_receipt_validation_result"
                attributes:
                  customer_user_id: "<YOUR_CUSTOMER_USER_ID>"
                  stripe_token: "<YOUR_STRIPE_TOKEN>"
      responses:
        '200':
          description: 購入が正常に検証されました
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/StripeValidationResponse'
              example:
                data: null
        '400':
          description: リクエストが不正です
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/StripeErrorResponse'
              example:
                errors:
                  - detail: "none is not an allowed value"
                    source:
                      pointer: "/data/attributes/stripe_token"
                    status: "400"
        '401':
          description: 認証エラー
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
        '500':
          description: 内部サーバーエラー
          content:
            application/vnd.api+json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

  /api/v2/server-side-api/purchase/paddle/token/validate/:
    post:
      summary: Paddle の購入を検証する
      description: |
        Adapty ダッシュボードのアプリ設定に登録された Paddle の認証情報を使用して、指定された Paddle トークンで購入を検証します。
        購入が有効な場合、Paddle からトランザクション履歴が、指定された customer_user_id を持つ Adapty のプロファイルにインポートされます。
        この customer_user_id を持つプロファイルが存在しない場合は、新たに作成されます。
      operationId: validatePaddlePurchase
      tags:
        - Paddle
      security:
        - apikeyAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PaddleValidationRequest'
            example:
              customer_user_id: "<YOUR_CUSTOMER_USER_ID>"
              paddle_token: "live_7d279f61a3339fed520f7cd8c08"
      responses:
        '200':
          description: 購入が正常に検証されました
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ProfileResponse'
              example:
                data:
                  app_id: "14c3d623-2f3a-455a-aa86-ef83dff6913b"
                  profile_id: "3286abd3-48b0-4e9c-a5f6-ac0a006804a6"
                  customer_user_id: "Jane.doe@example.com"
                  total_revenue_usd: 0.0
                  segment_hash: "8f45947bad31ab0c"
                  timestamp: 1736436751469
                  custom_attributes:
                    - key: "favourite_sport"
                      value: "yoga"
                  access_levels: []
                  subscriptions:
                    - purchase_id: "5a7ab471-2299-45f7-ad69-1d395c1256e3"
                      store: "app_store"
                      store_product_id: "1year.premium"
                      store_base_plan_id: null
                      store_transaction_id: "30002109551456"
                      store_original_transaction_id: "30002109551456"
                      purchased_at: "2022-10-12T09:42:50+00:00"
                      environment: "Production"
                      is_refund: false
                      is_consumable: false
                  non_subscriptions: []
        '400':
          description: リクエストが不正です
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              examples:
                no_products_found:
                  summary: プロダクトが見つかりません
                  value:
                    errors: ["No products found"]
                    error_code: "no_products_found"
                    status_code: 400
                paddle_api_key_not_found:
                  summary: Paddle API キーが見つかりません
                  value:
                    errors: ["Paddle API key not found"]
                    error_code: "paddle_api_key_not_found"
                    status_code: 400
                invalid_paddle_credentials_or_purchase_not_found:
                  summary: Paddle の認証情報が無効または購入が見つかりません
                  value:
                    errors: ["Invalid Paddle credentials or purchase not found"]
                    error_code: "invalid_paddle_credentials_or_purchase_not_found"
                    status_code: 400
        '401':
          description: 認証エラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors: ["Invalid API key"]
                error_code: "unauthorized"
                status_code: 401
        '500':
          description: 内部サーバーエラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

  /api/v2/server-side-api/integration/profile/set/integration-identifiers/:
    get:
      summary: インテグレーション識別子を取得する
      description: プロファイルのインテグレーション識別子を取得します。
      operationId: getIntegrationIdentifiers
      tags:
        - Integration
      security:
        - apikeyAuth: []
      parameters:
        - name: adapty-customer-user-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおける顧客の一意の ID です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
        - name: adapty-profile-id
          in: header
          required: false
          schema:
            type: string
            format: uuid
          description: お客様のシステムにおけるプロファイルの一意の ID です。匿名プロファイルを扱う場合に最適です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
      responses:
        '200':
          description: インテグレーション識別子が正常に取得されました
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/IntegrationIdentifiersResponse'
              example:
                facebook_anonymous_id: "XZ7EF7D15E-8FA1-49D8-B180-918EB333E42A"
                amplitude_user_id: null
                amplitude_device_id: null
                mixpanel_user_id: "33w6yv5DPqVlyMVbjW31xvzJLtJ3"
                appmetrica_profile_id: null
                appmetrica_device_id: null
                one_signal_player_id: null
                one_signal_subscription_id: "333ed338-757d-466a-a672-ab92db196a1f"
                pushwoosh_hwid: null
                firebase_app_instance_id: "C333B35DF1DB418E99F7B815E9F5C549"
                airbridge_device_id: null
                appsflyer_id: "1741933337626-3179568"
                branch_id: null
                adjust_device_id: null
                tenjin_analytics_installation_id: null
                posthog_distinct_user_id: null
        '401':
          description: 認証エラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors: ["Invalid API key"]
                error_code: "unauthorized"
                status_code: 401
        '404':
          description: プロファイルが見つかりません
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors: ["Profile not found"]
                error_code: "profile_not_found"
                status_code: 404
        '500':
          description: 内部サーバーエラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
    post:
      summary: インテグレーション識別子を設定する
      description: プロファイルにインテグレーション識別子を追加します。
      operationId: setIntegrationIdentifiers
      tags:
        - Integration
      security:
        - apikeyAuth: []
      parameters:
        - name: adapty-customer-user-id
          in: header
          required: false
          schema:
            type: string
          description: お客様のシステムにおける顧客の一意の ID です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
        - name: adapty-profile-id
          in: header
          required: false
          schema:
            type: string
            format: uuid
          description: お客様のシステムにおけるプロファイルの一意の ID です。匿名プロファイルを扱う場合に最適です。`adapty-customer-user-id` または `adapty-profile-id` のいずれかが必須です。
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/IntegrationIdentifiersRequest'
            example:
              pushwoosh_hwid: "example_pushwoosh_hwid"
              mixpanel_user_id: "example_mixpanel_user_id"
              facebook_anonymous_id: "example_facebook_anonymous_id"
              firebase_app_instance_id: "example_firebase_app_instance_id"
              amplitude_user_id: "example_amplitude_user_id"
              amplitude_device_id: "example_amplitude_device_id"
              appmetrica_device_id: "example_appmetrica_device_id"
              appmetrica_profile_id: "example_appmetrica_profile_id"
              one_signal_subscription_id: "example_one_signal_subscription_id"
              one_signal_player_id: "example_one_signal_player_id"
              branch_id: "example_branch_id"
              appsflyer_id: "example_appsflyer_id"
              adjust_device_id: "example_adjust_device_id"
              airbridge_device_id: "example_airbridge_device_id"
              tenjin_analytics_installation_id: "example_tenjin_analytics_installation_id"
              posthog_distinct_user_id: "example_posthog_distinct_user_id"
      responses:
        '200':
          description: インテグレーション識別子が正常に設定されました。レスポンスボディは空です。
        '400':
          description: リクエストが不正です
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors: ["At least one integration identifier must be provided."]
                error_code: "validation_error"
                status_code: 400
        '401':
          description: 認証エラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors: ["Invalid API key"]
                error_code: "unauthorized"
                status_code: 401
        '404':
          description: プロファイルが見つかりません
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors: ["Profile not found"]
                error_code: "profile_not_found"
                status_code: 404
        '500':
          description: 内部サーバーエラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

  /api/v2/server-side-api/paywalls/:
    get:
      summary: ペイウォール一覧を取得する
      description: アプリのペイウォール一覧を取得します。
      operationId: listPaywalls
      tags:
        - Paywalls
      security:
        - apikeyAuth: []
      parameters:
        - name: page[number]
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            default: 1
          description: ページネーションのページ番号
        - name: page[size]
          in: query
          required: false
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 20
          description: 1ページあたりのアイテム数
      responses:
        '200':
          description: ペイウォールが正常に取得されました
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaywallListResponse'
              example:
                data:
                  - title: "LlkTlizT"
                    paywall_id: "fd891d4f-5906-45b9-97c1-13cc3dc665df"
                    use_paywall_builder: false
                    use_paywall_builder_legacy: false
                    updated_at: "2025-07-08T07:27:06.754527+00:00"
                    created_at: "2025-07-08T07:27:06.754541+00:00"
                    state: "live"
                    is_deleted: false
                    web_purchase_url: null
                    products:
                      - product_id: "b95e9e51-a056-4eb6-9cf7-b75d139e7c3c"
                        title: "mFUQPcJQ"
                        product_set: "uncategorised"
                        offer: null
                  - title: "Premium Subscription"
                    paywall_id: "a1cf7850-1bb8-4151-8336-a4e588730c55"
                    use_paywall_builder: true
                    use_paywall_builder_legacy: false
                    updated_at: "2025-07-28T08:15:13.722680+00:00"
                    created_at: "2025-07-25T13:40:01.789853+00:00"
                    state: "live"
                    is_deleted: false
                    web_purchase_url: "https://example.com/purchase"
                    products:
                      - product_id: "b136422f-8153-402a-afbb-986929c68f6a"
                        title: "Premium Monthly"
                        product_set: "uncategorised"
                        offer:
                          product_offer_id: "e31a4296-f250-4faf-ac80-3cc93c2da8f5"
                          title: "Free Trial"
                meta:
                  pagination:
                    count: 365
                    page: 1
                    pages: 183
        '400':
          description: リクエストが不正です
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors:
                  - source: "page_size"
                    errors: ["Invalid page_size parameter. Must be between 1 and 100."]
                error_code: "validation_error"
                status_code: 400
        '401':
          description: 認証エラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors: ["Invalid API key"]
                error_code: "unauthorized"
                status_code: 401
        '500':
          description: 内部サーバーエラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'

  /api/v2/server-side-api/paywalls/{paywall_id}/:
    get:
      summary: ペイウォールを取得する
      description: アプリの特定のペイウォールを取得します。
      operationId: getPaywall
      tags:
        - Paywalls
      security:
        - apikeyAuth: []
      parameters:
        - name: paywall_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: 取得するペイウォールの一意の識別子
      responses:
        '200':
          description: ペイウォールが正常に取得されました
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaywallResponse'
              example:
                title: "Premium Subscription"
                paywall_id: "fd891d4f-5906-45b9-97c1-13cc3dc665df"
                use_paywall_builder: true
                use_paywall_builder_legacy: false
                updated_at: "2025-07-30T11:13:58.798Z"
                created_at: "2025-07-30T11:13:58.798Z"
                state: "live"
                is_deleted: false
                web_purchase_url: "https://example.com/purchase"
                products:
                  - product_id: "b95e9e51-a056-4eb6-9cf7-b75d139e7c3c"
                    title: "Premium Monthly"
                    product_set: "uncategorised"
                    offer:
                      product_offer_id: "e31a4296-f250-4faf-ac80-3cc93c2da8f5"
                      title: "Free Trial"
                remote_configs:
                  - locale: "en"
                    data: "{\"title\":\"Premium Features\",\"subtitle\":\"Unlock all premium content\"}"
                main_screenshot:
                  image_id: 123456
                  url: "https://public-media.adapty.io/public/screenshot.jpg"
        '401':
          description: 認証エラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors: ["Invalid API key"]
                error_code: "unauthorized"
                status_code: 401
        '404':
          description: ペイウォールが見つかりません
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors:
                  - source: null
                    errors: ["Paywall not found"]
                error_code: "paywall_does_not_exist"
                status_code: 404
        '500':
          description: 内部サーバーエラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
    put:
      summary: ペイウォールを更新する
      description: |
        特定のペイウォールのリモートコンフィグを更新します。このエンドポイントを使用して、ペイウォールの外観と動作をカスタマイズするためのリモートコンフィグ値を変更できます。

        **重要:** リモートコンフィグを更新すると、既存のすべてのリモートコンフィグが上書きされます。既存のリモートコンフィグを保持する必要がある場合は、まずペイウォールを取得し、そこから remote_configs をコピーして、更新リクエストで必要なオブジェクトのみを変更してください。
      operationId: updatePaywall
      tags:
        - Paywalls
      security:
        - apikeyAuth: []
      parameters:
        - name: paywall_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
          description: 更新するペイウォールの一意の識別子
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PaywallUpdateRequest'
            example:
              remote_configs:
                - locale: "en"
                  data: "{\"title\":\"Premium Features\",\"subtitle\":\"Unlock all premium content\"}"
      responses:
        '200':
          description: ペイウォールが正常に更新されました
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PaywallResponse'
              example:
                title: "Premium Subscription"
                paywall_id: "fd891d4f-5906-45b9-97c1-13cc3dc665df"
                use_paywall_builder: true
                use_paywall_builder_legacy: false
                updated_at: "2025-07-30T11:13:58.798Z"
                created_at: "2025-07-30T11:13:58.798Z"
                state: "live"
                is_deleted: false
                web_purchase_url: "https://example.com/purchase"
                products:
                  - product_id: "b95e9e51-a056-4eb6-9cf7-b75d139e7c3c"
                    title: "Premium Monthly"
                    product_set: "uncategorised"
                    offer:
                      product_offer_id: "e31a4296-f250-4faf-ac80-3cc93c2da8f5"
                      title: "Free Trial"
                remote_configs:
                  - locale: "en"
                    data: "{\"title\":\"Premium Features\",\"subtitle\":\"Unlock all premium content\"}"
                main_screenshot:
                  image_id: 123456
                  url: "https://public-media.adapty.io/public/screenshot.jpg"
        '400':
          description: リクエストが不正です
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors:
                  - source: "remote_configs"
                    errors: ["At least one field must be provided"]
                error_code: "validation_error"
                status_code: 400
        '401':
          description: 認証エラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors: ["Invalid API key"]
                error_code: "unauthorized"
                status_code: 401
        '404':
          description: ペイウォールが見つかりません
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
              example:
                errors:
                  - source: null
                    errors: ["Paywall not found"]
                error_code: "paywall_does_not_exist"
                status_code: 404
        '500':
          description: 内部サーバーエラー
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
components:
  securitySchemes:
    apikeyAuth:
      type: apiKey
      name: Authorization
      in: header
      default: Api-Key {Your secret API key}
      description: |
        API リクエストは、**Authorization** ヘッダーにシークレット API キーを `Api-Key {your_secret_api_key}` の形式（例: `Api-Key secret_live_...`）で指定して認証する必要があります。このキーは Adapty ダッシュボード → **App Settings** → **General** タブ → **API keys** セクションで確認できます。
  requestBodies:
    DefaultJson:
      required: true
      content:
        application/json:
          schema:
            type: object
  schemas:
    ProfileRequest:
      type: object
      properties:
        first_name:
          type: string
          nullable: true
          description: エンドユーザーの名
        last_name:
          type: string
          nullable: true
          description: エンドユーザーの姓
        gender:
          type: string
          nullable: true
          enum: [f, m, o]
          description: エンドユーザーの性別
        email:
          type: string
          nullable: true
          format: email
          description: エンドユーザーのメールアドレス
        phone_number:
          type: string
          nullable: true
          description: エンドユーザーの電話番号
        birthday:
          type: string
          format: date
          nullable: true
          description: エンドユーザーの誕生日
        ip_country:
          type: string
          nullable: true
          description: ISO 3166-2 形式のエンドユーザーの国
        ip_v4_address:
          type: string
          nullable: true
          description: エンドユーザーの IPv4 アドレス
        store_country:
          type: string
          nullable: true
          description: エンドユーザーのアプリストアの国
        store:
          type: string
          nullable: true
          enum: [app_store, play_store, stripe, adapty, paddle]
          description: ユーザーがアプリ内で購入に使用するプラットフォーム
        store_account_token:
          type: string
          format: uuid
          nullable: true
          description: ストアアカウントトークン
        att_status:
          type: integer
          nullable: true
          enum: [0, 1, 2, 3]
          description: Apple App Tracking Transparency ステータス（0=未確定、1=制限あり、2=拒否、3=許可）
        analytics_disabled:
          type: boolean
          nullable: true
          description: 外部アナリティクスをオプトアウトするオプション
        custom_attributes:
          type: array
          items:
            $ref: '#/components/schemas/CustomAttribute'
          description: プロファイルに最大 30 個のカスタム属性を設定できます
        installation_meta:
          $ref: '#/components/schemas/InstallationMeta'
      required:
        - installation_meta
      example:
        first_name: "Jane"
        last_name: "Doe"
        gender: "f"
        email: "jane.doe@example.com"
        phone_number: "+1234567890"
        birthday: "2000-12-31"
        ip_country: "FR"
        ip_v4_address: "192.168.1.1"
        store_country: "US"
        store: "app_store"
        store_account_token: "3fa85f64-5717-4562-b3fc-2c963f66afa6"
        att_status: 3
        analytics_disabled: true
        custom_attributes:
          - key: "favourite_sport"
            value: "yoga"
        installation_meta:
          device_id: "3fa85f64-5717-4562-b3fc-2c963f66afa6"
          device: "iPhone 15 Pro"
          locale: "en"
          os: "iOS 17.1"
          platform: "iOS"
          timezone: "Europe/Rome"
          user_agent: "Mozilla/5.0 (iPhone; CPU iPhone OS 17_1_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Mobile/15E148 Safari/604.1"
          app_build: "1.0.0"
          app_version: "1.0.0"
          adapty_sdk_version: "2.0.0"
          idfa: "EA7583CD-A667-48BC-B806-42ECB2B48333"
          idfv: "E9D48DA5-3930-4B41-8521-D953AECD2F33"
          advertising_id: ""
          android_id: ""
          android_app_set_id: ""

    ProfileResponse:
      type: object
      properties:
        data:
          $ref: '#/components/schemas/Profile'
      required:
        - data

    Profile:
      type: object
      properties:
        app_id:
          type: string
          format: uuid
          description: アプリの内部 ID
        profile_id:
          type: string
          format: uuid
          description: Adapty プロファイル ID
        customer_user_id:
          type: string
          nullable: true
          description: お客様のシステムにおけるユーザーの ID
        total_revenue_usd:
          type: number
          format: float
          description: プロファイルで獲得した USD 換算の総収益を表す浮動小数点値
        segment_hash:
          type: string
          description: 内部パラメータ
        timestamp:
          type: integer
          format: int64
          description: レスポンス時刻（ミリ秒）。競合状態の解決に使用します
        custom_attributes:
          type: array
          items:
            $ref: '#/components/schemas/CustomAttribute'
          description: プロファイルに設定できるカスタム属性は最大 30 個です
        access_levels:
          type: array
          items:
            $ref: '#/components/schemas/AccessLevel'
          description: アクセスレベルオブジェクトの配列。顧客がアクセスレベルを持たない場合は空配列
        subscriptions:
          type: array
          items:
            $ref: '#/components/schemas/Subscription'
          description: サブスクリプションオブジェクトの配列。顧客がサブスクリプションを持たない場合は空配列
        non_subscriptions:
          type: array
          items:
            $ref: '#/components/schemas/NonSubscription'
          description: 非サブスクリプションオブジェクトの配列。顧客が購入履歴を持たない場合は空配列
      required:
        - app_id
        - profile_id
        - customer_user_id
        - total_revenue_usd
        - segment_hash
        - timestamp
        - custom_attributes
        - access_levels
        - subscriptions
        - non_subscriptions

    CustomAttribute:
      type: object
      properties:
        key:
          type: string
          maxLength: 30
          description: キーは 30 文字以下の文字列である必要があります。英字、数字、ダッシュ、ピリオド、アンダースコアのみ使用できます
        value:
          oneOf:
            - type: string
            - type: number
          description: 属性値は 50 文字以下である必要があります。文字列と浮動小数点数のみ使用できます
      required:
        - key
        - value

    InstallationMeta:
      type: object
      properties:
        device_id:
          type: string
          format: uuid
          description: デバイスの一意の識別子
        device:
          type: string
          nullable: true
          description: デバイス情報
        locale:
          type: string
          nullable: true
          description: デバイスのロケール
        os:
          type: string
          nullable: true
          description: オペレーティングシステム情報
        platform:
          type: string
          nullable: true
          enum: [iOS, macOS, iPadOS, Android, visionOS, web]
          description: プラットフォーム（iOS、Android など）
        timezone:
          type: string
          nullable: true
          description: デバイスのタイムゾーン
        user_agent:
          type: string
          nullable: true
          description: ユーザーエージェント文字列
        app_build:
          type: string
          nullable: true
          description: アプリのビルドバージョン
        app_version:
          type: string
          nullable: true
          description: アプリのバージョン
        adapty_sdk_version:
          type: string
          nullable: true
          description: Adapty SDK のバージョン
        idfa:
          type: string
          nullable: true
          description: iOS 広告識別子（IDFA）
        idfv:
          type: string
          nullable: true
          description: iOS ベンダー識別子（IDFV）
        advertising_id:
          type: string
          nullable: true
          description: Android 広告 ID
        android_id:
          type: string
          nullable: true
          description: Android デバイス ID
        android_app_set_id:
          type: string
          nullable: true
          description: Android アプリセット ID
      required:
        - device_id

    AccessLevel:
      type: object
      properties:
        access_level_id:
          type: string
          description: アクセスレベルの識別子
        store:
          type: string
          description: アクセスレベルが購入されたストア
        store_product_id:
          type: string
          description: ストアにおけるプロダクト ID
        store_base_plan_id:
          type: string
          nullable: true
          description: ストアにおけるベースプラン ID
        store_transaction_id:
          type: string
          description: ストアにおけるトランザクション ID
        store_original_transaction_id:
          type: string
          description: ストアにおける元のトランザクション ID
        offer:
          allOf:
            - $ref: '#/components/schemas/OfferDTO'
          nullable: true
          description: プロモーションオファーまたは初回オファーが適用された場合のオファー詳細
        starts_at:
          type: string
          format: date-time
          nullable: true
          description: アクセスレベルの開始日時
        purchased_at:
          type: string
          format: date-time
          description: アクセスレベルが購入された日時
        originally_purchased_at:
          type: string
          format: date-time
          description: アクセスレベルが最初に購入された日時
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: アクセスレベルの有効期限
        renewal_cancelled_at:
          type: string
          format: date-time
          nullable: true
          description: 更新がキャンセルされた日時
        billing_issue_detected_at:
          type: string
          format: date-time
          nullable: true
          description: 請求問題が検出された日時
        is_in_grace_period:
          type: boolean
          description: アクセスレベルがグレース期間中かどうか
        cancellation_reason:
          type: string
          nullable: true
          description: キャンセルの理由

    Subscription:
      type: object
      properties:
        store:
          type: string
          description: サブスクリプションが購入されたストア
        store_product_id:
          type: string
          description: ストアにおけるプロダクト ID
        store_base_plan_id:
          type: string
          nullable: true
          description: ストアにおけるベースプラン ID
        store_transaction_id:
          type: string
          description: ストアにおけるトランザクション ID
        store_original_transaction_id:
          type: string
          description: ストアにおける元のトランザクション ID
        offer:
          allOf:
            - $ref: '#/components/schemas/OfferDTO'
          nullable: true
          description: プロモーションオファーまたは初回オファーが適用された場合のオファー詳細
        environment:
          type: string
          description: 環境（サンドボックス、本番）
        purchased_at:
          type: string
          format: date-time
          description: サブスクリプションが購入された日時
        originally_purchased_at:
          type: string
          format: date-time
          description: サブスクリプションが最初に購入された日時
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: サブスクリプションの有効期限
        renewal_cancelled_at:
          type: string
          format: date-time
          nullable: true
          description: 更新がキャンセルされた日時
        billing_issue_detected_at:
          type: string
          format: date-time
          nullable: true
          description: 請求問題が検出された日時
        is_in_grace_period:
          type: boolean
          description: サブスクリプションがグレース期間中かどうか
        cancellation_reason:
          type: string
          nullable: true
          description: キャンセルの理由

    NonSubscription:
      type: object
      properties:
        purchase_id:
          type: string
          format: uuid
          description: 購入の一意の識別子
        store:
          type: string
          description: 購入が行われたストア
        store_product_id:
          type: string
          description: ストアにおけるプロダクト ID
        store_base_plan_id:
          type: string
          nullable: true
          description: ストアにおけるベースプラン ID
        store_transaction_id:
          type: string
          description: ストアにおけるトランザクション ID
        store_original_transaction_id:
          type: string
          description: ストアにおける元のトランザクション ID
        purchased_at:
          type: string
          format: date-time
          description: 購入が行われた日時
        environment:
          type: string
          description: 環境（サンドボックス、本番）
        is_refund:
          type: boolean
          description: 返金かどうか
        is_consumable:
          type: boolean
          description: 消耗型アイテムの購入かどうか

    ErrorResponse:
      type: object
      properties:
        errors:
          type: array
          items:
            type: object
            properties:
              source:
                type: string
                nullable: true
                description: エラーの発生源
              errors:
                type: array
                items:
                  type: string
                description: エラーメッセージの配列
        error_code:
          type: string
          description: エラーの短縮名
        status_code:
          type: integer
          description: HTTP ステータスコード
      required:
        - errors
        - error_code
        - status_code

    TransactionDTORequest:
      oneOf:
        - $ref: '#/components/schemas/OneTimePurchaseDTO'
        - $ref: '#/components/schemas/SubscriptionDTO'
      discriminator:
        propertyName: purchase_type

    OneTimePurchaseDTO:
      type: object
      title: One-time Purchase
      description: 買い切り購入のトランザクションデータ
      properties:
        purchase_type:
          type: string
          enum: [one_time_purchase]
          description: 購入の種別
        store:
          type: string
          description: 購入が行われたストア。一般的な値には `app_store`、`play_store`、`stripe`、`paddle`、またはカスタムストア識別子が含まれます
        environment:
          type: string
          enum: [Production, Sandbox]
          default: Production
          description: 購入が行われた環境
        store_product_id:
          type: string
          description: ストアにおけるプロダクト ID
        store_transaction_id:
          type: string
          maxLength: 50
          description: ストアにおけるトランザクション ID。最大 50 文字。PayPal および一部のカスタムストアのトランザクション ID はこれを超える場合があります。その場合は送信前に値をトリミングまたはハッシュ化してください。そうしないとリクエストが失敗します。
        store_original_transaction_id:
          type: string
          description: ストアにおける元のトランザクション ID
        is_family_shared:
          type: boolean
          default: false
          description: ファミリー共有の購入かどうか
        price:
          $ref: '#/components/schemas/PriceDTO'
        purchased_at:
          type: string
          format: date-time
          description: 購入が行われた日時
        variation_id:
          type: string
          nullable: true
          description: A/B テスト用のバリエーション ID
        offer:
          $ref: '#/components/schemas/OfferDTO'
          nullable: true
        refunded_at:
          type: string
          format: date-time
          nullable: true
          description: 購入が返金された日時
        cancellation_reason:
          type: string
          enum: [billing_error, cancelled_by_developer, new_subscription_replace, price_increase, product_was_not_available, refund, unknown, upgraded, voluntarily_cancelled, adapty_revoked]
          nullable: true
          description: キャンセルの理由
      required:
        - purchase_type
        - store
        - store_product_id
        - store_transaction_id
        - store_original_transaction_id
        - price
        - purchased_at

    SubscriptionDTO:
      type: object
      title: Subscription
      description: サブスクリプション購入のトランザクションデータ
      properties:
        purchase_type:
          type: string
          enum: [subscription]
          description: 購入の種別
        store:
          type: string
          description: 購入が行われたストア。一般的な値には `app_store`、`play_store`、`stripe`、`paddle`、またはカスタムストア識別子が含まれます
        environment:
          type: string
          enum: [Production, Sandbox]
          default: Production
          description: 購入が行われた環境
        store_product_id:
          type: string
          description: ストアにおけるプロダクト ID
        store_transaction_id:
          type: string
          maxLength: 50
          description: ストアにおけるトランザクション ID。最大 50 文字。PayPal および一部のカスタムストアのトランザクション ID はこれを超える場合があります。その場合は送信前に値をトリミングまたはハッシュ化してください。そうしないとリクエストが失敗します。
        store_original_transaction_id:
          type: string
          description: ストアにおける元のトランザクション ID
        is_family_shared:
          type: boolean
          default: false
          description: ファミリー共有の購入かどうか
        price:
          $ref: '#/components/schemas/PriceDTO'
        purchased_at:
          type: string
          format: date-time
          description: 購入が行われた日時
        variation_id:
          type: string
          nullable: true
          description: A/B テスト用のバリエーション ID
        offer:
          $ref: '#/components/schemas/OfferDTO'
          nullable: true
        refunded_at:
          type: string
          format: date-time
          nullable: true
          description: 購入が返金された日時
        cancellation_reason:
          type: string
          enum: [billing_error, cancelled_by_developer, new_subscription_replace, price_increase, product_was_not_available, refund, unknown, upgraded, voluntarily_cancelled, adapty_revoked]
          nullable: true
          description: キャンセルの理由
        originally_purchased_at:
          type: string
          format: date-time
          description: サブスクリプションが最初に購入された日時
        expires_at:
          type: string
          format: date-time
          description: サブスクリプションの有効期限
        renew_status:
          type: boolean
          description: サブスクリプションが自動更新されるかどうか
        renew_status_changed_at:
          type: string
          format: date-time
          nullable: true
          description: 更新ステータスが変更された日時
        billing_issue_detected_at:
          type: string
          format: date-time
          nullable: true
          description: 請求問題が検出された日時
        grace_period_expires_at:
          type: string
          format: date-time
          nullable: true
          description: グレース期間の終了日時
      required:
        - purchase_type
        - store
        - store_product_id
        - store_transaction_id
        - store_original_transaction_id
        - price
        - purchased_at
        - originally_purchased_at
        - expires_at
        - renew_status

    PriceDTO:
      type: object
      properties:
        country:
          type: string
          description: 国コード
        currency:
          type: string
          description: 通貨コード
        value:
          type: number
          format: float
          description: 価格の値
      required:
        - country
        - currency
        - value

    OfferDTO:
      type: object
      properties:
        category:
          type: string
          enum: [introductory, promotional, offer_code, win_back]
          description: オファーのカテゴリ
        type:
          type: string
          enum: [free_trial, pay_as_you_go, pay_up_front]
          description: オファーの種別
        id:
          type: string
          nullable: true
          description: オファー ID
      required:
        - category
        - type

    GrantAccessRequest:
      type: object
      properties:
        access_level_id:
          type: string
          description: アクセスレベルページで設定された有料アクセスレベル ID
        starts_at:
          type: string
          format: date-time
          nullable: true
          description: アクセスレベルが有効になる日時。将来の日時も指定できます。デフォルト値は null です。
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: アクセスレベルが失効する日時。過去の日時も指定でき、永続アクセスの場合は null を指定できます。デフォルト値は null です。
      required:
        - access_level_id

    RevokeAccessRequest:
      type: object
      properties:
        access_level_id:
          type: string
          description: アクセスレベルページで設定された有料アクセスレベル ID
        revoke_at:
          type: string
          format: date-time
          nullable: true
          description: アクセスレベルが失効する日時を指定します。即座にアクセスを失効させるには、このフィールドを省略するか null に設定してください。デフォルト値は null です。
      required:
        - access_level_id

    RefundSaverSettingsRequest:
      type: object
      properties:
        custom_preference:
          type: string
          enum: [grant, no_preference, decline]
          nullable: true
          description: |
            ユーザーごとに返金設定を個別に指定します。
            - `grant`: 各返金リクエストを承認する
            - `no_preference`: 推奨を提供しない
            - `decline`: 各返金リクエストを拒否する
        consent:
          type: boolean
          nullable: true
          description: |
            ユーザーがデータ共有に同意したかどうかを記録します。
            - `true` は、アプリ内返金リクエストを受け取った場合に Apple にユーザー情報を提供できることを意味します
      example:
        custom_preference: "grant"
        consent: true

    RefundSaverSettingsResponse:
      type: object
      properties:
        profile_id:
          type: string
          format: uuid
          description: 顧客プロファイル ID
        settings:
          type: object
          properties:
            consent:
              type: boolean
              description: ユーザーがデータ共有に同意したかどうかを示します
            custom_preference:
              type: string
              enum: [grant, no_preference, decline]
              description: 返金設定
          description: ユーザーの Refund Saver 設定
      required:
        - profile_id
        - settings

    StripeValidationRequest:
      type: object
      properties:
        data:
          type: object
          properties:
            type:
              type: string
              enum: [stripe_receipt_validation_result]
              description: リソースの種別
            attributes:
              type: object
              properties:
                customer_user_id:
                  type: string
                  description: お客様のシステムにおけるユーザーの ID
                stripe_token:
                  type: string
                  description: |
                    一意の購入を表す Stripe オブジェクトのトークン。
                    Stripe のサブスクリプション（sub_XXX）または支払いインテント（pi_XXX）のトークンが使用できます
              required:
                - customer_user_id
                - stripe_token
          required:
            - type
            - attributes
      required:
        - data

    StripeValidationResponse:
      type: object
      properties:
        data:
          type: object
          nullable: true
          description: レスポンスデータ（検証成功時は null）
      required:
        - data

    StripeErrorResponse:
      type: object
      properties:
        errors:
          type: array
          items:
            type: object
            properties:
              detail:
                type: string
                description: エラーの詳細情報
              source:
                type: object
                properties:
                  pointer:
                    type: string
                    description: 問題の原因となったリクエストドキュメント内の正確な場所への参照
                required:
                  - pointer
              status:
                type: string
                description: HTTP ステータスコード
            required:
              - detail
              - source
              - status
      required:
        - errors

    PaddleValidationRequest:
      type: object
      properties:
        customer_user_id:
          type: string
          description: お客様のシステムにおけるユーザーの ID
        paddle_token:
          type: string
          description: |
            一意の購入を表す Paddle オブジェクトのトークン。
            トランザクション ID（txn_...）またはサブスクリプション ID（sub_...）のいずれかを使用できます
      required:
        - customer_user_id
        - paddle_token

    IntegrationIdentifiersRequest:
      type: object
      properties:
        adjust_device_id:
          type: string
          nullable: true
          description: Adjust インテグレーションにおけるネットワークユーザーの ID
        airbridge_device_id:
          type: string
          nullable: true
          description: Airbridge インテグレーションにおけるユーザーデバイスの ID
        amplitude_device_id:
          type: string
          nullable: true
          description: Amplitude インテグレーションにおけるユーザーデバイスの ID
        amplitude_user_id:
          type: string
          nullable: true
          description: Amplitude インテグレーションにおけるユーザーの ID
        appmetrica_device_id:
          type: string
          nullable: true
          description: AppMetrica インテグレーションにおけるユーザーデバイスの ID
        appmetrica_profile_id:
          type: string
          nullable: true
          description: AppMetrica インテグレーションにおけるユーザーの ID
        appsflyer_id:
          type: string
          nullable: true
          description: AppsFlyer インテグレーションにおけるネットワークユーザーの ID
        branch_id:
          type: string
          nullable: true
          description: Branch インテグレーションにおけるユーザーアプリの Branch キー
        facebook_anonymous_id:
          type: string
          nullable: true
          description: Facebook Ads インテグレーションにおけるユーザーの ID
        firebase_app_instance_id:
          type: string
          nullable: true
          description: Firebase インテグレーションにおけるユーザーの ID
        mixpanel_user_id:
          type: string
          nullable: true
          description: Mixpanel インテグレーションにおけるユーザーの ID
        one_signal_player_id:
          type: string
          nullable: true
          description: OneSignal インテグレーションにおけるユーザーの ID（レガシー識別子）
        one_signal_subscription_id:
          type: string
          nullable: true
          description: OneSignal インテグレーションにおけるユーザーの ID（推奨識別子）
        posthog_distinct_user_id:
          type: string
          nullable: true
          description: PostHog インテグレーションにおけるユーザーの ID
        pushwoosh_hwid:
          type: string
          nullable: true
          description: Pushwoosh インテグレーションにおけるユーザーデバイスの ID
        tenjin_analytics_installation_id:
          type: string
          nullable: true
          description: Tenjin インテグレーションにおけるユーザーデバイスの ID
      description: 少なくとも 1 つのインテグレーション識別子を指定する必要があります

    IntegrationIdentifiersResponse:
      type: object
      properties:
        adjust_device_id:
          type: string
          nullable: true
          description: Adjust インテグレーションにおけるネットワークユーザーの ID
        airbridge_device_id:
          type: string
          nullable: true
          description: Airbridge インテグレーションにおけるユーザーデバイスの ID
        amplitude_device_id:
          type: string
          nullable: true
          description: Amplitude インテグレーションにおけるユーザーデバイスの ID
        amplitude_user_id:
          type: string
          nullable: true
          description: Amplitude インテグレーションにおけるユーザーの ID
        appmetrica_device_id:
          type: string
          nullable: true
          description: AppMetrica インテグレーションにおけるユーザーデバイスの ID
        appmetrica_profile_id:
          type: string
          nullable: true
          description: AppMetrica インテグレーションにおけるユーザーの ID
        appsflyer_id:
          type: string
          nullable: true
          description: AppsFlyer インテグレーションにおけるネットワークユーザーの ID
        branch_id:
          type: string
          nullable: true
          description: Branch インテグレーションにおけるユーザーアプリの Branch キー
        facebook_anonymous_id:
          type: string
          nullable: true
          description: Facebook Ads インテグレーションにおけるユーザーの ID
        firebase_app_instance_id:
          type: string
          nullable: true
          description: Firebase インテグレーションにおけるユーザーの ID
        mixpanel_user_id:
          type: string
          nullable: true
          description: Mixpanel インテグレーションにおけるユーザーの ID
        one_signal_player_id:
          type: string
          nullable: true
          description: OneSignal インテグレーションにおけるユーザーの ID（レガシー識別子）
        one_signal_subscription_id:
          type: string
          nullable: true
          description: OneSignal インテグレーションにおけるユーザーの ID（推奨識別子）
        posthog_distinct_user_id:
          type: string
          nullable: true
          description: PostHog インテグレーションにおけるユーザーの ID
        pushwoosh_hwid:
          type: string
          nullable: true
          description: Pushwoosh インテグレーションにおけるユーザーデバイスの ID
        tenjin_analytics_installation_id:
          type: string
          nullable: true
          description: Tenjin インテグレーションにおけるユーザーデバイスの ID

    PaywallUpdateRequest:
      type: object
      properties:
        remote_configs:
          type: array
          items:
            type: object
            properties:
              locale:
                type: string
                description: リモートコンフィグのロケール（例："en"、"es"、"fr"）
              data:
                type: string
                description: リモートコンフィグデータを含む JSON 文字列
            required:
              - locale
              - data
          description: 更新する RemoteConfig オブジェクトの配列
      required:
        - remote_configs
      description: 少なくとも 1 つのフィールドを指定する必要があります

    PaywallResponse:
      type: object
      properties:
        title:
          type: string
          description: Adapty ダッシュボードで定義されたペイウォールの名前
        paywall_id:
          type: string
          format: uuid
          description: ペイウォールの一意の識別子
        use_paywall_builder:
          type: boolean
          description: ペイウォールビルダーを使用しているかどうか
        use_paywall_builder_legacy:
          type: boolean
          description: レガシーペイウォールビルダーを使用しているかどうか
        updated_at:
          type: string
          format: date-time
          description: ペイウォールが最後に更新されたタイムスタンプ
        created_at:
          type: string
          format: date-time
          description: ペイウォールが作成されたタイムスタンプ
        state:
          type: string
          enum: [draft, live, inactive, archived]
          description: ペイウォールの現在の状態
        is_deleted:
          type: boolean
          description: ペイウォールが削除済みとしてマークされているかどうか
        web_purchase_url:
          type: string
          format: uri
          nullable: true
          description: ウェブ購入用の URL（該当する場合）
        products:
          type: array
          items:
            type: object
            properties:
              product_id:
                type: string
                format: uuid
                description: プロダクトの一意の識別子
              title:
                type: string
                description: プロダクトのタイトル
              product_set:
                type: string
                enum: [weekly, monthly, trimonthly, semiannual, annual, lifetime, uncategorised, nonsubscriptions, two_months, consumable]
                description: プロダクトセットのカテゴリ
              offer:
                type: object
                nullable: true
                properties:
                  product_offer_id:
                    type: string
                    format: uuid
                    description: プロダクトオファーの一意の識別子
                  title:
                    type: string
                    description: オファーのタイトル
                required:
                  - product_offer_id
                  - title
            required:
              - product_id
              - title
              - product_set
              - offer
          description: プロダクト情報を含む Product オブジェクトの配列
        remote_configs:
          type: array
          items:
            type: object
            properties:
              locale:
                type: string
                description: リモートコンフィグのロケール
              data:
                type: string
                description: リモートコンフィグデータを含む JSON 文字列
            required:
              - locale
              - data
          description: ロケールとデータを含む RemoteConfig オブジェクトの配列
        main_screenshot:
          type: object
          nullable: true
          properties:
            image_id:
              type: integer
              description: 画像の一意の識別子
            url:
              type: string
              format: uri
              description: 画像の URL
          required:
            - image_id
            - url
          description: image_id と url を含むメインスクリーンショットオブジェクト
      required:
        - title
        - paywall_id
        - use_paywall_builder
        - use_paywall_builder_legacy
        - updated_at
        - created_at
        - state
        - is_deleted
        - products

    PaywallListResponse:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/PaywallListItem'
          description: ペイウォールオブジェクトの配列
        meta:
          type: object
          properties:
            pagination:
              type: object
              properties:
                count:
                  type: integer
                  description: ペイウォールの総数
                page:
                  type: integer
                  description: 現在のページ番号
                pages:
                  type: integer
                  description: 総ページ数
              required:
                - count
                - page
                - pages
          required:
            - pagination
      required:
        - data
        - meta

    PaywallListItem:
      type: object
      properties:
        title:
          type: string
          description: Adapty ダッシュボードで定義されたペイウォールの名前
        paywall_id:
          type: string
          format: uuid
          description: ペイウォールの一意の識別子
        use_paywall_builder:
          type: boolean
          description: ペイウォールビルダーを使用しているかどうか
        use_paywall_builder_legacy:
          type: boolean
          description: レガシーペイウォールビルダーを使用しているかどうか
        updated_at:
          type: string
          format: date-time
          description: ペイウォールが最後に更新されたタイムスタンプ
        created_at:
          type: string
          format: date-time
          description: ペイウォールが作成されたタイムスタンプ
        state:
          type: string
          enum: [draft, live, inactive, archived]
          description: ペイウォールの現在の状態
        is_deleted:
          type: boolean
          description: ペイウォールが削除済みとしてマークされているかどうか
        web_purchase_url:
          type: string
          format: uri
          nullable: true
          description: ウェブ購入用の URL（該当する場合）
        products:
          type: array
          items:
            type: object
            properties:
              product_id:
                type: string
                format: uuid
                description: プロダクトの一意の識別子
              title:
                type: string
                description: プロダクトのタイトル
              product_set:
                type: string
                enum: [weekly, monthly, trimonthly, semiannual, annual, lifetime, uncategorised, nonsubscriptions, two_months, consumable]
                description: プロダクトセットのカテゴリ
              offer:
                type: object
                nullable: true
                properties:
                  product_offer_id:
                    type: string
                    format: uuid
                    description: プロダクトオファーの一意の識別子
                  title:
                    type: string
                    description: オファーのタイトル
                required:
                  - product_offer_id
                  - title
            required:
              - product_id
              - title
              - product_set
              - offer
          description: ペイウォールのプロダクト情報を含む Product オブジェクトの配列
      required:
        - title
        - paywall_id
        - use_paywall_builder
        - use_paywall_builder_legacy
        - updated_at
        - created_at
        - state
        - is_deleted
        - products

    ProfileObject:
      type: object
      description: |
        プロファイルはアプリのエンドユーザーを表します。ユーザーのサブスクリプションデータ、購入履歴、カスタム属性をすべて含みます。プロファイルは customer_user_id（お客様の内部ユーザー ID）または profile_id（Adapty の内部 ID）で識別されます。
      properties:
        app_id:
          type: string
          format: uuid
          description: Adapty におけるアプリの一意の識別子
        profile_id:
          type: string
          format: uuid
          description: Adapty におけるプロファイルの一意の識別子
        customer_user_id:
          type: string
          nullable: true
          description: お客様のシステムにおけるユーザーの ID
        total_revenue_usd:
          type: number
          format: float
          description: このユーザーが生み出した USD 換算の総収益
        segment_hash:
          type: string
          description: アナリティクス用のユーザーセグメントのハッシュ
        timestamp:
          type: integer
          format: int64
          description: 最終プロファイル更新の Unix タイムスタンプ
        custom_attributes:
          type: array
          items:
            type: object
            properties:
              key:
                type: string
                description: 属性のキー
              value:
                type: string
                description: 属性の値
            required: [key, value]
          description: ユーザーのカスタム属性の配列
        access_levels:
          type: array
          items:
            $ref: '#/components/schemas/AccessLevelObject'
          description: ユーザーが保有するアクセスレベルの配列
        subscriptions:
          type: array
          items:
            $ref: '#/components/schemas/SubscriptionObject'
          description: 有効なサブスクリプションの配列
        non_subscriptions:
          type: array
          items:
            $ref: '#/components/schemas/NonSubscriptionObject'
          description: 買い切り購入の配列
      required:
        - app_id
        - profile_id
        - customer_user_id
        - total_revenue_usd
        - segment_hash
        - timestamp
        - custom_attributes
        - access_levels
        - subscriptions
        - non_subscriptions

    AccessLevelObject:
      type: object
      description: |
        アクセスレベルはアプリの有料機能またはコンテンツ階層を表します。ユーザーは複数のアクセスレベルを持つことができ、各レベルには異なる有効期限を設定できます。
      properties:
        id:
          type: string
          description: アクセスレベルの一意の識別子
        is_active:
          type: boolean
          description: アクセスレベルが現在有効かどうか
        vendor_product_id:
          type: string
          description: |
            アプリストアにおけるプロダクト ID。実際のストアトランザクションなしでアクセスが付与された場合、`vendor_product_id` は以下のいずれかになります：
            - `adapty_server_side_product` — サーバーサイド API（grantAccessLevel）経由で付与された場合。
            - `adapty_dashboard_product` — Adapty ダッシュボードで手動付与された場合。
            - `adapty_promotion` — レガシー。
        store:
          type: string
          description: アクセスレベルが購入されたストア。一般的な値には app_store、play_store、stripe、paddle、またはカスタムストア識別子が含まれます
        activated_at:
          type: string
          format: date-time
          description: アクセスレベルが有効化された日時
        renewed_at:
          type: string
          format: date-time
          nullable: true
          description: アクセスレベルが最後に更新された日時
        expires_at:
          type: string
          format: date-time
          nullable: true
          description: アクセスレベルの有効期限（永続アクセスの場合は null）
        is_lifetime:
          type: boolean
          description: 永続アクセスレベルかどうか
        active_introductory_offer_type:
          type: string
          nullable: true
          description: 有効な初回オファーの種別
        active_promotional_offer_type:
          type: string
          nullable: true
          description: 有効なプロモーションオファーの種別
        will_renew:
          type: boolean
          description: アクセスレベルが自動更新されるかどうか
        is_in_grace_period:
          type: boolean
          description: アクセスレベルがグレース期間中かどうか
        unsubscribed_at:
          type: string
          format: date-time
          nullable: true
          description: ユーザーがサブスクリプションを解除した日時
        billing_issue_detected_at:
          type: string
          format: date-time
          nullable: true
          description: 請求問題が検出された日時
      required:
        - id
        - is_active
        - vendor_product_id
        - store
        - activated_at
        - renewed_at
        - expires_at
        - is_lifetime
        - active_introductory_offer_type
        - active_promotional_offer_type
        - will_renew
        - is_in_grace_period
        - unsubscribed_at
        - billing_issue_detected_at

    SubscriptionObject:
      type: object
      description: |
        サブスクリプションは有効なサブスクリプション購入を表します。サブスクリプションプロダクト、購入詳細、および更新ステータスに関する情報を含みます。
      properties:
        purchase_id:
          type: string
          format: uuid
          description: 購入の一意の識別子
        store:
          type: string
          description: サブスクリプションが購入されたストア。一般的な値には app_store、play_store、stripe、paddle、またはカスタムストア識別子が含まれます
        store_product_id:
          type: string
          description: ストアにおけるプロダクト ID
        store_base_plan_id:
          type: string
          nullable: true
          description: ストアにおけるベースプラン ID
        store_transaction_id:
          type: string
          description: ストアにおけるトランザクション ID
        store_original_transaction_id:
          type: string
          description: ストアにおける元のトランザクション ID
        purchased_at:
          type: string
          format: date-time
          description: サブスクリプションが購入された日時
        environment:
          type: string
          enum: [Production, Sandbox]
          description: 購入が行われた環境
        is_refund:
          type: boolean
          description: 返金済み購入かどうか
        is_consumable:
          type: boolean
          description: 消耗型アイテムの購入かどうか
      required:
        - purchase_id
        - store
        - store_product_id
        - store_base_plan_id
        - store_transaction_id
        - store_original_transaction_id
        - purchased_at
        - environment
        - is_refund
        - is_consumable

    NonSubscriptionObject:
      type: object
      description: |
        非サブスクリプションは買い切り購入を表します。プロダクトと購入詳細に関する情報を含みます。
      properties:
        purchase_id:
          type: string
          format: uuid
          description: 購入の一意の識別子
        store:
          type: string
          description: 購入が行われたストア。一般的な値には app_store、play_store、stripe、paddle、またはカスタムストア識別子が含まれます
        store_product_id:
          type: string
          description: ストアにおけるプロダクト ID
        store_transaction_id:
          type: string
          description: ストアにおけるトランザクション ID
        purchased_at:
          type: string
          format: date-time
          description: 購入が行われた日時
        environment:
          type: string
          enum: [Production, Sandbox]
          description: 購入が行われた環境
        is_refund:
          type: boolean
          description: 返金済み購入かどうか
        is_consumable:
          type: boolean
          description: 消耗型アイテムの購入かどうか
      required:
        - purchase_id
        - store
        - store_product_id
        - store_transaction_id
        - purchased_at
        - environment
        - is_refund
        - is_consumable

    PaywallObject:
      type: object
      description: |
        ペイウォールはアプリの収益化画面を表します。ペイウォールの設定、プロダクト、リモートコンフィグに関する情報を含みます。
      properties:
        title:
          type: string
          description: Adapty ダッシュボードで定義されたペイウォールの名前
        paywall_id:
          type: string
          format: uuid
          description: ペイウォールの一意の識別子
        use_paywall_builder:
          type: boolean
          description: ペイウォールビルダーを使用しているかどうか
        use_paywall_builder_legacy:
          type: boolean
          description: レガシーペイウォールビルダーを使用しているかどうか
        updated_at:
          type: string
          format: date-time
          description: ペイウォールが最後に更新されたタイムスタンプ
        created_at:
          type: string
          format: date-time
          description: ペイウォールが作成されたタイムスタンプ
        state:
          type: string
          enum: [draft, live, inactive, archived]
          description: ペイウォールの現在の状態
        is_deleted:
          type: boolean
          description: ペイウォールが削除済みとしてマークされているかどうか
        web_purchase_url:
          type: string
          format: uri
          nullable: true
          description: ウェブ購入用の URL（該当する場合）
        products:
          type: array
          items:
            $ref: '#/components/schemas/ProductObject'
          description: このペイウォールで利用可能なプロダクトの配列
        remote_configs:
          type: array
          items:
            $ref: '#/components/schemas/RemoteConfigObject'
          description: 各ロケール向けのリモートコンフィグの配列
        main_screenshot:
          type: object
          nullable: true
          properties:
            image_id:
              type: integer
              description: 画像の一意の識別子
            url:
              type: string
              format: uri
              description: 画像の URL
          required: [image_id, url]
          description: image_id と url を含むメインスクリーンショットオブジェクト
      required:
        - title
        - paywall_id
        - use_paywall_builder
        - use_paywall_builder_legacy
        - updated_at
        - created_at
        - state
        - is_deleted
        - products

    ProductObject:
      type: object
      description: |
        プロダクトはアプリで購入可能なアイテムを表します。サブスクリプションまたは買い切り購入プロダクトが該当します。
      properties:
        product_id:
          type: string
          format: uuid
          description: プロダクトの一意の識別子
        title:
          type: string
          description: プロダクトのタイトル
        product_set:
          type: string
          description: プロダクトセットのカテゴリ
        offer:
          type: object
          nullable: true
          properties:
            product_offer_id:
              type: string
              format: uuid
              description: プロダクトオファーの一意の識別子
            title:
              type: string
              description: オファーのタイトル
          required: [product_offer_id, title]
          description: プロダクトオファー情報
      required:
        - product_id
        - title
        - product_set
        - offer

    RemoteConfigObject:
      type: object
      description: |
        リモートコンフィグはペイウォールのロケール固有の設定データを含みます。これにより、異なる言語向けにペイウォールの外観と動作をカスタマイズできます。
      properties:
        locale:
          type: string
          description: リモートコンフィグのロケール（例："en"、"es"、"fr"）
        data:
          type: string
          description: リモートコンフィグデータを含む JSON 文字列
      required:
        - locale
        - data

    IntegrationIdentifiersObject:
      type: object
      description: |
        インテグレーション識別子にはさまざまなサードパーティサービスのユーザー ID が含まれます。これらは異なるアナリティクスおよびマーケティングプラットフォーム間でユーザーデータを同期するために使用されます。
      properties:
        adjust_device_id:
          type: string
          nullable: true
          description: Adjust インテグレーションにおけるネットワークユーザーの ID
        airbridge_device_id:
          type: string
          nullable: true
          description: Airbridge インテグレーションにおけるユーザーデバイスの ID
        amplitude_device_id:
          type: string
          nullable: true
          description: Amplitude インテグレーションにおけるユーザーデバイスの ID
        amplitude_user_id:
          type: string
          nullable: true
          description: Amplitude インテグレーションにおけるユーザーの ID
        appmetrica_device_id:
          type: string
          nullable: true
          description: AppMetrica インテグレーションにおけるユーザーデバイスの ID
        appmetrica_profile_id:
          type: string
          nullable: true
          description: AppMetrica インテグレーションにおけるユーザーの ID
        appsflyer_id:
          type: string
          nullable: true
          description: AppsFlyer インテグレーションにおけるネットワークユーザーの ID
        branch_id:
          type: string
          nullable: true
          description: Branch インテグレーションにおけるユーザーアプリの Branch キー
        facebook_anonymous_id:
          type: string
          nullable: true
          description: Facebook Ads インテグレーションにおけるユーザーの ID
        firebase_app_instance_id:
          type: string
          nullable: true
          description: Firebase インテグレーションにおけるユーザーの ID
        mixpanel_user_id:
          type: string
          nullable: true
          description: Mixpanel インテグレーションにおけるユーザーの ID
        one_signal_player_id:
          type: string
          nullable: true
          description: OneSignal インテグレーションにおけるユーザーの ID（レガシー識別子）
        one_signal_subscription_id:
          type: string
          nullable: true
          description: OneSignal インテグレーションにおけるユーザーの ID（推奨識別子）
        posthog_distinct_user_id:
          type: string
          nullable: true
          description: PostHog インテグレーションにおけるユーザーの ID
        pushwoosh_hwid:
          type: string
          nullable: true
          description: Pushwoosh インテグレーションにおけるユーザーデバイスの ID
        tenjin_analytics_installation_id:
          type: string
          nullable: true
          description: Tenjin インテグレーションにおけるユーザーデバイスの ID

    RefundSaverSettingsObject:
      type: object
      description: |
        Refund Saver 設定には返金リクエストを処理するためのユーザー設定が含まれます。データ共有の同意とカスタム返金設定が含まれます。
      properties:
        consent:
          type: boolean
          description: ユーザーがデータ共有に同意したかどうかを示します
        custom_preference:
          type: string
          enum: [grant, no_preference, decline]
          description: 返金設定
      required:
        - consent
        - custom_preference

    ErrorObject:
      type: object
      description: |
        エラーは API のエラーレスポンスを表します。何が問題であったか、およびその修正方法に関する情報を含みます。
      properties:
        errors:
          type: array
          items:
            type: object
            properties:
              source:
                type: string
                nullable: true
                description: エラーを引き起こしたフィールドまたはパラメータ
              errors:
                type: array
                items:
                  type: string
                description: エラーメッセージの配列
            required: [errors]
          description: エラー詳細の配列
        error_code:
          type: string
          description: 機械可読なエラーコード
        status_code:
          type: integer
          description: HTTP ステータスコード
      required:
        - errors
        - error_code
        - status_code

    PaginationObject:
      type: object
      description: |
        一覧エンドポイントのページネーションメタデータ。現在のページと総件数に関する情報を含みます。
      properties:
        count:
          type: integer
          description: アイテムの総数
        page:
          type: integer
          description: 現在のページ番号
        pages:
          type: integer
          description: 総ページ数
      required:
        - count
        - page
        - pages