---
title: "Settle a premium offer and apply the product"
method: POST
path: "/v1/premium/redeem"
tags: ["Premium and prices"]
---

# Settle a premium offer and apply the product

`POST /v1/premium/redeem`

## Request

- Base URL: `https://api.memestack.ai`
- URL: `https://api.memestack.ai/v1/premium/redeem`
- Auth: HTTP bearer

Checks the offer's invoice for settlement (LUD-21 verify at the provider) and applies the product effect EXACTLY ONCE — a replayed redeem answers `applied: "already"` with the account's current premium state, never a second effect. Non-refundable; time products extend from max(now, current expiry) so a second purchase stacks, and the credits product adds credits. Poll this at ~2.5 s after paying until it stops answering 202. The claim is bound to the paying account: another account's macaroon is refused, and an expired macaroon still resumes an already-paid claim. NOT gated by PREMIUM_ENABLED (a paid claim must always resolve); PAYMENTS_ENABLED off answers 503 so the poll stays alive. Rate limited 60/min/user. Every answer is private, no-store.

## Request body

- object
  - `product` 'supporter_30d' | 'ad_free_30d' | 'credits_10' | 'credits_100' | 'api_builder_30d' | 'api_growth_30d' | 'api_scale_30d' | 'api_calls_10k', required
  - `macaroon` string, required: The macaroon from the /v1/premium/purchase offer.

## Response `200`

Invoice settled. `applied: true` = this call applied the effect; `applied: "already"` = a replay, the snapshot is the account's current state.

- object
  - `applied` union
    - true
    - 'already'
  - `product` 'supporter_30d' | 'ad_free_30d' | 'credits_10' | 'credits_100' | 'api_builder_30d' | 'api_growth_30d' | 'api_scale_30d' | 'api_calls_10k'
  - `ad_free_until` string, date-time, nullable
  - `supporter_until` string, date-time, nullable
  - `generation_credits` integer

## Other responses

- `202`: Invoice not paid yet (AWAITING_PAYMENT) — keep polling. `expired: true` means the macaroon has expired but the claim is still open for this account.
- `400`: Unknown product (INVALID_PRODUCT), or the macaroon was minted for a different price (PRICE_MISMATCH).
- `401`: Authentication required.
- `402`: Macaroon missing, malformed, invalid, expired-and-unpaid, bound to another product, or from a previous payment provider (PAYMENT_INVALID) — request a new offer.
- `404`: The payment belongs to another account's claim (NOT_FOUND), or the account no longer exists.
- `429`: Rate limit exceeded (60/min/user).
- `503`: PAYMENT_UNAVAILABLE — payments paused, or the settlement check at the provider failed; the paid invoice is recorded, retry with the same macaroon.

---

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