# Continue to checkout from the waitlist

> The checkout.hosted.resume_waitlist operation: POST /api/v1/public/checkout_sessions/{sessionId}/waitlist/checkout in the REST API and the checkout_hosted_resume_waitlist tool in the MCP server.

Once the brand can sell in a waitlist customer's country, the email it sends them links here: a fresh checkout
session for what they wanted to buy (the lines, URLs and settings of the session they joined from, with their
email), made when they click, so the link doesn't expire with a session. While that session is open, the same
link returns it. The token is the proof: no session key is needed. Send the customer to `url`.

Public: the hosted page calls it when the customer clicks “Continue to checkout”.

## At a glance

- **REST:** `POST /api/v1/public/checkout_sessions/{sessionId}/waitlist/checkout`
- **MCP tool:** `checkout_hosted_resume_waitlist`
- **Operation ID:** `checkout.hosted.resume_waitlist`
- **Scope:** Brand
- **Permission:** `checkout:write`
- **Risk tier:** `write`
- **Dry run:** Not supported
- **Idempotency:** `Idempotency-Key` required
- **Modes:** Test and live
- **Authentication:** None (a public endpoint, rate-limited per IP address)
- **Since:** M7

## Request

### Path parameters

| Field       | Type      | Description                         |
| ----------- | --------- | ----------------------------------- |
| `sessionId` | `cs_…` ID | The checkout session's ID (`cs_…`). |

### Body

A JSON object (`Content-Type: application/json`):

| Field   | Type      | Required | Description                                |
| ------- | --------- | -------- | ------------------------------------------ |
| `entry` | `wl_…` ID | Yes      | The waitlist entry (`wl_…`) from the link. |
| `token` | string    | Yes      | The token from the link.                   |

## Response

`200 OK` with a JSON object:

| Field       | Type                  | Description                                                     |
| ----------- | --------------------- | --------------------------------------------------------------- |
| `object`    | `"waitlist_checkout"` |                                                                 |
| `sessionId` | `cs_…` ID             | The fresh checkout session (`cs_…`).                            |
| `url`       | string                | Its hosted page, with the session key: send the customer there. |
| `expiresAt` | date-time             |                                                                 |

## Examples

### From the “opened” email

```http
POST /api/v1/public/checkout_sessions/cs_01m4tx5nj8emwbyf7y9vcf48aa/waitlist/checkout
Idempotency-Key: 3f1c9a52-7d0e-4b8f-9a61-0c2d5e8b7f14
Content-Type: application/json

{
  "entry": "wl_01m4tx5nj8emwbyf7y9vcf48ah",
  "token": "Qm9vdF9sZWF2ZV90b2tlbl9leGFtcGxlXzAwMDAwMDA"
}
```

Response (`200`):

```json
{
  "object": "waitlist_checkout",
  "sessionId": "cs_01m6c9r2wq4h8xg3a7k5d1n0ve",
  "url": "https://ownrecord.io/c/genno/cs_01m6c9r2wq4h8xg3a7k5d1n0ve?key=Hk2pq7Vb4xR9mN3sT6wL1yG8cJ0eE5aD-uF_dK2oZ8q",
  "expiresAt": "2026-10-20T09:30:00.000Z"
}
```

## Errors

| Code                                                                                                       | HTTP status | When                                                                                      | What to do                                                                                                                          |
| ---------------------------------------------------------------------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
| [`resource_not_found`](https://ownrecord.io/docs/reference/errors.md#resource_not_found)                   | 404         | No such checkout session, or a price of the original session is gone.                     | Check the ID and that your credentials are scoped to the right organization, entity, brand and mode.                                |
| [`waitlist_link_invalid`](https://ownrecord.io/docs/reference/errors.md#waitlist_link_invalid)             | 400         | The link's entry or token is wrong, or the entry hasn't been told the brand can sell yet. | Use the link exactly as it is in the email. The checkout link works only after the email saying the brand can sell in your country. |
| [`price_archived`](https://ownrecord.io/docs/reference/errors.md#price_archived)                           | 409         | A price the customer wanted is archived: the brand no longer sells it.                    | Reactivate the price first (`active: true`), or use an active price.                                                                |
| [`checkout_price_not_sellable`](https://ownrecord.io/docs/reference/errors.md#checkout_price_not_sellable) | 400         | A price the customer wanted can't be sold in this kind of session any more.               | Sell one-time prices and credit packs in `payment` mode and recurring prices in `subscription` mode. `param` names the line item.   |
| [`customer_deleted`](https://ownrecord.io/docs/reference/errors.md#customer_deleted)                       | 400         | The original session's customer was deleted.                                              | Create a new customer for this buyer. Deleted customers stay readable for the records they belong to, but can't be changed.         |

It can also return these [common errors](https://ownrecord.io/docs/reference.md#common-errors): [`validation_failed`](https://ownrecord.io/docs/reference/errors.md#validation_failed), [`api_version_unsupported`](https://ownrecord.io/docs/reference/errors.md#api_version_unsupported), [`invalid_json`](https://ownrecord.io/docs/reference/errors.md#invalid_json), [`unsupported_media_type`](https://ownrecord.io/docs/reference/errors.md#unsupported_media_type), [`scope_required`](https://ownrecord.io/docs/reference/errors.md#scope_required), [`idempotency_key_required`](https://ownrecord.io/docs/reference/errors.md#idempotency_key_required), [`idempotency_key_reused`](https://ownrecord.io/docs/reference/errors.md#idempotency_key_reused), [`idempotency_in_progress`](https://ownrecord.io/docs/reference/errors.md#idempotency_in_progress), [`dry_run_not_supported`](https://ownrecord.io/docs/reference/errors.md#dry_run_not_supported), [`rate_limited`](https://ownrecord.io/docs/reference/errors.md#rate_limited), [`internal_error`](https://ownrecord.io/docs/reference/errors.md#internal_error).
