---
title: "Claim an unlock after paying (public)"
method: POST
path: "/public/playground/entitlements/{slug}/claim"
tags: ["app-data"]
---

# Claim an unlock after paying (public)

`POST /public/playground/entitlements/{slug}/claim`

## Request

- Base URL: `https://api.onplana.com/api`
- URL: `https://api.onplana.com/api/public/playground/entitlements/{slug}/claim`
- Auth: none required

Two shapes. `{ sessionId }` is the instant post-checkout claim: the Payment Link redirect carries `{CHECKOUT_SESSION_ID}`, and a paid session returns `{ status: "granted", key }` , store that key. `{ status: "pending" }` means a slow payment method is still clearing; `{ status: "expired" }` means the session is older than the 24h claim window, so use the email path instead. `{ email }` is the restore path: it ALWAYS answers `{ sent: true }`, whether or not that address bought anything, so never surface "no purchase found". A 429 means try again shortly , it is NOT "not purchased".

## Path parameters

- `slug` string, required

## Request body

- object
  - `sessionId` string: Stripe Checkout Session id from the post-payment redirect.
  - `email` string: The email used at checkout. Triggers a magic-link restore.

## Response `200`

`{ ok, status?, key?, sent? }`. Absent status = nothing to claim.

## Other responses

- `429`: Rate limited. Retry shortly; do NOT treat as unpaid.

---

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