---
title: "Complete a self-serve upgrade"
method: POST
path: "/v1/billing/upgrade/complete"
tags: ["Billing"]
---

# Complete a self-serve upgrade

`POST /v1/billing/upgrade/complete`

## Request

- Base URL: `https://api.prod.keyban.io`
- URL: `https://api.prod.keyban.io/v1/billing/upgrade/complete`
- Auth: `bearer` (a scheme the document does not define)

Reconciles the subscription change after the Chargebee hosted page redirects back, and returns the plan now active. Idempotent — calling it twice for the same hosted page yields the same result.

## Request body

- UpgradeCompleteRequestDto
  - `hostedPageId` string, required: Chargebee hosted page ID the upgrade checkout redirected back with, used to reconcile the completed plan change.

## Response `200`

Upgrade applied, plan now active on the subscription

- UpgradeCompleteResponseDto
  - `planId` string, required: Chargebee item ID of the plan now active on the subscription (e.g. "agent-wallet-growth-plan-v2").
  - `itemPriceId` string, required: Chargebee item-price ID now active on the subscription (e.g. "agent-wallet-growth-plan-v2-eur-monthly").

## Other responses

- `400`: Checkout not completed, or no Chargebee customer linked
- `403`: Hosted page does not belong to this organization's customer

---

[API](https://skmtc.dev/keyban/apis/keyban-rest-apis.md) · [All operations](https://skmtc.dev/keyban/apis/keyban-rest-apis/llms.txt) · [OpenAPI document](https://skmtc.dev/keyban/apis/keyban-rest-apis/revisions/0bb79a1da961?raw)
