{"lexicon":1,"id":"money.atmosphere.app.upsertFeeTier","defs":{"main":{"type":"procedure","description":"Atomically create or replace one automatic app-fee tier by subscriptionGroupKey while preserving every unrelated tier. Requires app service-auth.","input":{"encoding":"application/json","schema":{"type":"object","required":["environment","feeTier"],"properties":{"environment":{"type":"string","knownValues":["test","live"],"maxLength":8},"feeTier":{"type":"ref","ref":"money.atmosphere.app.getConfig#feeTier"}}}},"output":{"encoding":"application/json","schema":{"type":"ref","ref":"money.atmosphere.app.getConfig#config"}},"errors":[{"name":"AppEnvironmentNotConfigured","description":"This app environment is not configured in ATM."},{"name":"FeeShareAboveBase","description":"The fee tier's feeShareBps exceeds the app's configured fee. Tiers only lower fees."},{"name":"FeeTierLimitReached","description":"The app already has the maximum number of automatic fee tiers."},{"name":"ReversibleFeeWaiversUnavailable","description":"The app requested reversible-waiver while ATM's deployment readiness fence is off."},{"name":"ReversibleFeeTierInUse","description":"The requested tier change would break economics already promised to a paid relationship."},{"name":"UpstreamFailure","description":"The configuration was saved, but fee-tier reconciliation could not be queued. Retrying the same request is safe."}]}}}