---
title: "Create Monthly Switch Portal"
method: POST
path: "/api/billing/monthly-switch-portal"
tags: ["billing"]
---

# Create Monthly Switch Portal

`POST /api/billing/monthly-switch-portal`

Switch an annual Team subscription to monthly.

Paid annual subscribers get Stripe's confirmation UI: the server does not
mutate the subscription; Stripe shows the exact unused-time credit and
applies the update only after the customer explicitly confirms it.

TRIALING annual subscribers (deal-link 30-day opt-out window) are switched
directly with `trial_end="now"`: monthly has no trial by policy, so the
switch ends the window and charges the first $499 immediately. The console
button states the charge; `error_if_incomplete` keeps the subscription
unchanged if the card declines.

## Request body

- MonthlySwitchPortalRequest
  - `deal_code` string, required

## Response `200`

Successful Response

- MonthlySwitchPortalResponse
  - `portal_url` string, required
  - `status` string, required

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.net/codag/apis/infra-logs-templater.md) · [All operations](https://skmtc.net/codag/apis/infra-logs-templater/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/codag/infra-logs-templater/revisions/d80008a9efc6/schema)
