---
title: "Edit a promotion"
method: PUT
path: "/promotions/{promotionUuid}"
---

# Edit a promotion

`PUT /promotions/{promotionUuid}`

Edit a promotion by replacing it, exactly like editing from the dashboard: the referenced promotion is stopped, a new promotion is created with the provided values, and eligible fans are notified of the updated offer.

The response contains the replacement promotion, whose `uuid` differs from the one in the path and whose `usedCount` starts at zero. Fans who redeemed the original promotion keep their discounted price or trial. If the new values target a different audience group, any existing promotion for that audience is also replaced.

## Path parameters

- `promotionUuid` string, uuid, required — Promotion UUID

## Headers

- `X-Fanvue-API-Version` string, required

## Request body

- object
  - `discountPercent` integer — First-month discount as a percentage of the subscription price. Mutually exclusive with a free trial.
  - `freeTrial` boolean — Set to true to offer a free trial. Combine with freeTrialDays for a fixed length, or omit freeTrialDays for an unlimited (free-forever) trial. Mutually exclusive with discountPercent. Passing freeTrialDays alone also implies a free trial.
  - `freeTrialDays` integer — Length of the free trial in days (1-30). Omit while freeTrial is true for an unlimited (free-forever) trial. Mutually exclusive with discountPercent.
  - `availableToGroup` 'new_subscribers' | 'expired_subscribers' | 'all' | 'followers', required — Which fans can redeem the promotion: new_subscribers (never subscribed), expired_subscribers, followers, or all
  - `maxUsages` integer — Maximum number of redemptions. Unlimited when omitted.
  - `endsAt` string, date-time — When the promotion stops being redeemable. Never expires when omitted.
  - `message` string — Optional message shown to fans with the promotion

## Response `200`

Promotion updated successfully

- object
  - `uuid` string, uuid, required — Promotion UUID
  - `type` 'discount' | 'free_trial', required — Whether the promotion is a first-month discount or a free trial
  - `discountPercent` integer, nullable, required — Discount percentage (null for free-trial promotions)
  - `freeTrialDays` integer, nullable, required — Free trial length in days (null for discount promotions)
  - `availableToGroup` 'new_subscribers' | 'expired_subscribers' | 'all' | 'followers', required — Which fans can redeem the promotion: new_subscribers (never subscribed), expired_subscribers, followers, or all
  - `endsAt` string, date-time, nullable, required — When the promotion expires (null if it never expires)
  - `maxUsages` integer, nullable, required — Maximum number of redemptions (null if unlimited)
  - `usedCount` integer, required — Number of times the promotion has been redeemed
  - `message` string, nullable, required — Message shown to fans with the promotion
  - `createdAt` string, date-time, required — When the promotion was created

## Other responses

- `400` — Bad Request - API version not supported OR validation failed OR invalid UUID
- `401` — Unauthorized Response
- `403` — Unauthorized Response
- `404` — Not Found Response
- `410` — API version no longer supported (sunset)
- `429` — Too many requests - rate limit exceeded

---

[API](https://skmtc.net/fanvue/apis/fanvue-api.md) · [All operations](https://skmtc.net/fanvue/apis/fanvue-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/fanvue/fanvue-api/revisions/c5ddcd5c7e72/schema)
