---
title: "Get a Pro checkout link for this account"
method: POST
path: "/upgrade"
---

# Get a Pro checkout link for this account

`POST /upgrade`

## Request

- Base URL: `https://epublys.com/v1`
- URL: `https://epublys.com/v1/upgrade`
- Auth: HTTP bearer

Returns a Stripe checkout URL for the account that owns the API key, so a programmatic caller refused with `daily_limited` can resolve it rather than only report a pricing URL. The email is taken from the authenticated key and never from the body — this cannot be used to pay for another account. Creates no charge by itself, and is not counted against the free daily allowance. Mirrors the `upgrade_to_pro` MCP tool.

## Request body

- object
  - `plan` 'monthly' | 'yearly': monthly is $9/month; yearly is $72/year

## Response `200`

Checkout link, or alreadyPro when the account is already on Pro

- object
  - `success` boolean
  - `checkoutUrl` string
  - `plan` string
  - `price` string
  - `account` string
  - `alreadyPro` boolean

## Other responses

- `400`: Invalid input — human message in `error`, machine category in `code`
- `401`: Missing or invalid API key
- `409`: The Stripe billing record for this email belongs to another Epublys account (`code` customer_id_collision) — no session is created; write to hello@epublys.com
- `413`: Upload exceeds the per-request total cap
- `429`: Rate limited
- `500`: Processing failure
- `503`: Checkout unavailable on this deployment

---

[API](https://skmtc.dev/epublys/apis/epublys-api.md) · [All operations](https://skmtc.dev/epublys/apis/epublys-api/llms.txt) · [OpenAPI document](https://skmtc.dev/epublys/apis/epublys-api/revisions/b705f822c814?raw)
