billing

POST /v1/subscriptions/{subscriptionId}/plan

Move a subscription onto a bigger or smaller plan.

すべての billing エンドポイント

すべての開発者向けドキュメント

認証

ベアラー トークンとして API キーを送信します。キーには billing.payment.manage 権限が付与されている必要があります。権限のないキーは 404 ではなく 403 で拒否されます。

このエンドポイントは組織IDを受け付けません。お使いのキーによって所属する組織がすでに特定されており、レスポンスはその組織にスコープされます。

試してみる

アングルブラケット内のすべてをご自身の値に置き換え、キーのプレースホルダーをご利用中のダッシュボードのキーに置き換えてください。

curl -X POST https://api.zinndigital.com/v1/subscriptions/{subscriptionId}/plan \
  -H "Authorization: Bearer zdk_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "plan_version_id": <Uuid> }'

ログインしていますか?ダッシュボード内のAPIコンソールでは、実際の組織IDやお客様ご自身のキーが自動入力され、ライブAPIに対してリクエストが実行されるため、実際のレスポンスを確認することができます。 API コンソールでこのエンドポイントを開く

詳細

Charges the prorated difference for the remainder of the current period, moves every site the subscription entitles, and supersedes the subscription onto the new plan version — keeping the existing period window, so the customer's renewal date does not move and they are not handed a free extra period. ⛔ A plan change SUPERSEDES rather than mutates, because a subscription pins the exact version it was sold so that a later catalogue edit cannot rewrite what a live subscriber pays. subscription_id in the response is therefore a new id and a client holding the old one must replace it. ⭐⭐ slots_before and slots_after are read back from the subscription rows, not derived from the plan that was asked for. A plan change that answers 200 and silently does not take effect is the worst outcome on this path, and a status code cannot tell that apart from one that worked. Mid-period money. A larger plan is charged the difference now — the customer asked for more room today, and applying it at the next renewal is the buy-flow dead end in another costume. A smaller plan returns the unused difference as account credit, not a card refund: it is instant, it cannot be unavailable, it is idempotent, and it is spendable on their next order. ⛔ Account credit carries no VAT credit note; a proration credit spans the current period's invoice rather than reversing it. ⛔ expected_total_minor is a money guard, not a convenience. It is the figure the customer was actually shown, and the change is refused 422 when the freshly-computed quote differs. Every other refusal is 422 as well, with nothing charged and nothing changed: a plan on another product line, the plan they are already on, a plan that has been re-priced since the page loaded, account usage above what a smaller plan allows, a card decline. ⛔ The downgrade guard is account-wide and there is no override. The same check_downgrade the site endpoint and the staff tariff endpoint call: sites, mailboxes, mailbox storage and disk across the org's subtree. Staff have an audited override because they sometimes genuinely need to move an over-limit account; a customer overriding their own quota check is not an override, it is no check. Repeating an identical request is the recovery and it is safe. Every step is idempotent on a key anchored to the subscription being left, so an attempt that died part-way is finished rather than duplicated: one order, one charge, one credit, one supersede. 404 for a subscription in another tenant as well as for one that does not exist. 503 when the driver behind an entitled site cannot move a package between types at all — our gap, not theirs. Requires billing.payment.manage — it charges a card, so the key that gates paying is the key that gates committing to a payment.

パラメータ

名前タイプ必須これがその内容です
subscriptionId (path)UuidはいThe subscription whose plan is being read or changed.

リクエスト本文

名前タイプ必須これがその内容です
plan_version_idUuidはいThe priced plan version to move onto, exactly as getSitePlanChoices reported it.
expected_total_minorintegerいいえA money guard, not a convenience. The figure the customer was actually shown, in minor units. The engine refuses 422 when its freshly-computed quote differs, so a price…
gatewayobjectいいえThe payment rail the customer picked, from getPaymentOptions. Omit it (or send null) for "no preference", which follows the payment method the organization would be charged on…

返信

名前タイプ必須これがその内容です
plan_codestringはいThe plan this subscription is now on.
plan_namestringはいIts catalogue name, so a receipt can name it without a second lookup.
plan_version_idstringはいThe priced version the new subscription carries.
subscription_idstringはいThe new subscription. A plan change supersedes rather than mutates, because a subscription pins the exact version it was sold — so this id differs from the one in the request…
order_idstringはいThe order the charge was raised against, or "" when the change resulted in a credit and no order was minted.
charged_minorintegerはいWhat was actually taken, in minor units.
credited_minorintegerはいWhat was actually returned as account balance, in minor units.
package_typestringはいThe vendor package type, read back after the move. "" on our own fleet and "" when the subscription entitles no site — there is no package to move.
slots_beforeintegerはいThe site allowance the subscription held before the change.
slots_afterintegerはいThe site allowance it holds now.
slots_before_unlimitedbooleanはいThe old plan sold unlimited sites, so slots_before is null by design.
slots_after_unlimitedbooleanはいThe new plan sells unlimited sites, so slots_after is null by design.
quoteSitePlanQuoteはいThe quote the change was performed against.

このエンドポイントが返すエラー

401 · 403 · 404 · 422 · 429 · 503