---
title: "Update a prize offer"
method: PATCH
path: "/api/rewards/admin/offers/{id}"
tags: ["Rewards (admin)"]
---

# Update a prize offer

`PATCH /api/rewards/admin/offers/{id}`

## Request

- Base URL: `https://api.rewritelifestyle.ai` (the document declares no server; this is the origin it was published from)
- URL: `https://api.rewritelifestyle.ai/api/rewards/admin/offers/{id}`
- Auth: HTTP bearer

## Path parameters

- `id` number, required

## Request body

- UpsertRewardOfferDto
  - `catalogue_id` number, required: reward_catalogue.id
  - `trigger_type` 'level_up' | 'goal_completion' | 'streak_milestone' | 'manual', required
  - `trigger_level` object: For trigger_type "level_up": the level this fires on. Null = any level.
  - `trigger_days` object: For trigger_type "streak_milestone": the consecutive-day count this fires on (e.g. 100, 365) — a choice offer, not auto-resolved like level_up.
  - `starts_at` string
  - `ends_at` object
  - `quantity_available` object: Hard cap on grants. Always set this for anything with a real cost — a free coach slot is not unlimited.
  - `eligibility` RewardOfferEligibilityDto
    - `user_types` string[]: Any of these user types. Omit for "everyone".
    - `min_days_since_signup` number: Only users whose program started at least this many days ago.
    - `requires_active_subscription` boolean: Only users with an active paid subscription.
    - `requires_never_subscribed` boolean: Only users who have never had a subscription of any status — the "never paid us anything" gate for the free-days prize (client Q1).
    - `requires_no_prior_coach_call` boolean: Only users who have never received a real 1:1 coach call prize before — the "lifetime call access" split in the Level 3 waterfall (client priority #2).
    - `audiences` RewardOfferAudienceDto[]: Who this offer is for: matches when any entry matches the user's billing (free / premium / lifetime) and relationship (user / member / client), resolved at claim. Omit for "everyone". Clients never get a coach_time prize unless an entry names relationship "client" explicitly.
      - `billing` 'free' | 'premium' | 'lifetime': "premium" also matches lifetime.
      - `relationship` 'user' | 'member' | 'client'
  - `priority` number
  - `claim_window_days` number
  - `is_active` boolean

## Response `200`

## Changes

- **2026-10-27** `5231b7914987`: 1 info
  - added the new optional request property `eligibility/audiences`
- **2026-10-09** `e734a4721d8d`: 1 breaking, 5 info
  - request property `eligibility/user_types/items/` was restricted to a list of enum values
  - added the new `client` enum value to the request property `eligibility/user_types/items/`
  - added the new `coach` enum value to the request property `eligibility/user_types/items/`
  - added the new `lead` enum value to the request property `eligibility/user_types/items/`
  - …2 more
- **2026-09-12** `0d5ef02a4fbe`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/rewritelifestyle/apis/rewrite-lifestyle-api/changes/api/rewards/admin/offers/:id/patch.md)

---

[API](https://skmtc.dev/rewritelifestyle/apis/rewrite-lifestyle-api.md) - [All operations](https://skmtc.dev/rewritelifestyle/apis/rewrite-lifestyle-api/llms.txt) - [OpenAPI document](https://skmtc.dev/rewritelifestyle/apis/rewrite-lifestyle-api/revisions/28695827f27a?raw)
