---
title: "Get a checkout link"
method: POST
path: "/api/v1/setup/checkout"
tags: ["API Reference"]
---

# Get a checkout link

`POST /api/v1/setup/checkout`

## Request

- Base URL: `https://revnu.com`
- URL: `https://revnu.com/api/v1/setup/checkout`
- Auth: HTTP bearer

A Stripe Checkout link that starts the customer's subscription, with a free trial when their account has one. The customer finishes it on Stripe's page, where any card is entered.

**Response.** ```json
{ "url": "https://checkout.stripe.com/c/pay/cs_live_…" }
```

Give the link to the customer. They open it and finish on Stripe's page themselves. Stripe's webhook, not this call, starts the subscription; poll [setup status](/docs/setup-status) until the stage is `start`. Stripe Checkout links last 24 hours.

Before you hand it over, read `payment` from setup status and tell the customer what they are agreeing to: the price, the free period if any, and whether the page asks for a card. Each call makes a new Checkout session, and a new one stops the earlier link working, so ask for a new link only when the customer has lost theirs. The CLI's `revnu setup checkout` reuses the link it handed out.

| Code | Meaning |
|---|---|
| 200 | `{ "url": "…" }` |
| 409 | `rejected` with a `message`: the review isn't confirmed yet, or the account has a YC deal and adds its card in the dashboard. |

## Response `200`

{ "url": "…" }

- object
  - `url` string, required

## Other responses

- `401`: Missing, malformed, unknown or revoked token.
- `409`: rejected with a message: the review isn't confirmed yet, or the account has a YC deal and adds its card in the dashboard.
- `429`: Rate limited.
- `503`: Temporarily unavailable; retry the same call.

---

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