---
title: "POST /experimental/promo-codes/redeem"
method: POST
path: "/experimental/promo-codes/redeem"
tags: ["Credits"]
---

# POST /experimental/promo-codes/redeem

`POST /experimental/promo-codes/redeem`

## Request

- Base URL: `https://api.tessl.io`
- URL: `https://api.tessl.io/experimental/promo-codes/redeem`
- Auth: none declared

Redeems a promo code for the signed-in user into their default org, or the org they joined first when they have no default; the user does not choose. The response's `org` names the org that got the code's credits, which expire the code's validity days after now. Each code is redeemed once, and only before its redeem-by time; a user can redeem many codes, and an org can receive many. Matching ignores case, and spaces and hyphens are the same. Lookups and redemptions share a per-user rate limit (429). Returns 404 for an unknown code, 409 for a code already redeemed, 410 for a code past its redeem-by time, 422 when the user belongs to no org, 403 for an API key, and 502 when the code was claimed but the grant failed; the grant is retried within the hour.

## Headers

- `Authorization` string

## Request body

- object
  - `code` string, required

## Response `200`

Default Response

- object
  - `links` object, required
    - `self` string, uri, required
  - `data` object, required
    - `id` string, required: The normalized code.
    - `type` 'promo-code', required
    - `attributes` object, required
      - `name` string, required: The name shown on the grant.
      - `credits` integer, required: Credits the code grants.
      - `validityDays` integer, required: Days the credits last after redemption.
      - `redeemBy` string, date-time, required: The code cannot be redeemed after this time.
      - `redeemable` boolean, required: Whether the code can still be redeemed: not yet redeemed, and before its redeem-by time.
      - `org` object, nullable, required: The org the signed-in user's redemption grants to (on a redemption, the org that got the credits): their default org, or the org they joined first. Null when they belong to no org.
        - `id` string, uuid, required
        - `name` string, required

## Other responses

- `401`: Unauthorized
- `403`: Default Response
- `404`: Not Found
- `409`: Conflict
- `410`: Gone
- `422`: Unprocessable Entity
- `429`: Too Many Requests
- `500`: Internal Server Error
- `502`: Bad Gateway

## Changes

- **2026-10-29** `63e7af58b427`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/tessl/apis/tessl-api/changes/experimental/promo-codes/redeem/post.md)

---

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