---
title: "Start a card subscription for a Pro or Enterprise key (no auth required)"
method: POST
path: "/v1/keys/checkout"
tags: ["Keys & Billing"]
---

# Start a card subscription for a Pro or Enterprise key (no auth required)

`POST /v1/keys/checkout`

## Request

- Base URL: `https://api.insumermodel.com`
- URL: `https://api.insumermodel.com/v1/keys/checkout`
- Auth: none required

Creates a Stripe Checkout session for a monthly subscription — Pro $29/mo (10,000 requests/day, 1,000 credits/mo) or Enterprise $99/mo (100,000 requests/day, 5,000 credits/mo). Returns a hosted checkout URL; after payment the key is retrieved once via GET /v1/keys/retrieve. Pass `keyHash` (from POST /v1/keys/lookup) to upgrade an existing key in place — email and app name are then optional and carried over. **Response envelope note**: standalone endpoint — flat `{success, url}`.

## Request body

- object
  - `tier` 'pro' | 'enterprise', required
  - `email` string, email: Required unless upgrading via keyHash.
  - `appName` string: Required unless upgrading via keyHash.
  - `keyHash` string: 64-hex identifier of an existing key to upgrade (returned by /v1/keys/lookup).

## Response `200`

Hosted checkout session created

- object
  - `success` boolean
  - `url` string: Stripe Checkout URL to complete the subscription.

## Other responses

- `400`: Invalid tier, email, appName, or keyHash
- `404`: keyHash provided but no active key found
- `405`: Method not allowed (only POST supported)
- `500`: Unexpected server error. Safe to retry; no credits are charged on a 500. Router endpoints return the standard error envelope; standalone endpoints (the ones whose 200 is a flat object) return a flat {"error": "..."} object.

---

[API](https://skmtc.dev/insumermodel/apis/insumerapi.md) · [All operations](https://skmtc.dev/insumermodel/apis/insumerapi/llms.txt) · [OpenAPI document](https://skmtc.dev/insumermodel/apis/insumerapi/revisions/91f56fe9e3d8?raw)
