---
title: "Execute Upgrade Offer"
method: POST
path: "/iap/upgrade-offer/execute"
tags: ["Upgrade Offers"]
---

# Execute Upgrade Offer

`POST /iap/upgrade-offer/execute`

Executes a subscription upgrade, creating a new payment intent or checkout session for the target product. The old subscription is cancelled with proration when the new payment succeeds.

## Request body

- object
  - `user_id` string, required — The user's external ID.
  - `current_product_id` string, required — The reference ID of the user's current subscription product.
  - `target_product_id` string, required — The reference ID of the product to upgrade to.

## Response `200`

Upgrade initiated

- UpgradeExecuteResponse — Response from executing an upgrade.
  - `type` 'web_to_web' | 'storekit_to_web' — The type of upgrade being performed.
  - `client_secret` string — Stripe PaymentIntent client secret for confirming the upgrade payment.
  - `checkout_url` string — Fallback checkout URL.
  - `transaction_id` string — ZeroSettle transaction ID for the upgrade.

## Other responses

- `400` — Invalid request -- missing or malformed parameters.
- `401` — Invalid or missing API key.
- `404` — Resource not found.

---

[API](https://skmtc.net/zerosettle/apis/zerosettle-iap-api.md) · [All operations](https://skmtc.net/zerosettle/apis/zerosettle-iap-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/zerosettle/zerosettle-iap-api/versions/1a7aa12f3d5e/schema)
