---
title: "Set participant tier"
method: PUT
path: "/v1/participants/{participant_id}/state/tiers/{tier_key}"
tags: ["Tiers"]
---

# Set participant tier

`PUT /v1/participants/{participant_id}/state/tiers/{tier_key}`

## Request

- Base URL: `https://api.scrip.dev`
- URL: `https://api.scrip.dev/v1/participants/{participant_id}/state/tiers/{tier_key}`
- Auth: HTTP bearer

Directly set a participant's tier to a specific level, optionally with an expiration.

## Path parameters

- `participant_id` string, required
- `tier_key` string, required

## Query parameters

- `program_id` string, uuid, required

## Request body

- SetParticipantTierRequest: Assigns a tier level to a participant, optionally until a date.
  - `expires_at` string, date-time: When this tier assignment expires (RFC 3339, null for no expiration)
  - `level` string, required: Key of the level to assign (e.g., `gold`)

## Response `200`

Updated tier state

- TierState: A participant's or group's standing in one tier: the level, its rank, and when they earned it and when it ends.
  - `acquired_at` string, date-time: When this tier level was earned
  - `benefits` object: Benefits granted by this tier level
  - `expires_at` string, date-time: When this tier level expires
  - `level` string: Current tier level name
  - `rank` integer: Numeric rank within the tier (higher = better)

## Other responses

- `400`: Validation failed (code: validation_error | invalid_json)
- `401`: The API key is missing or not valid. See [Authentication](https://docs.scrip.dev/authentication).
- `403`: The caller is not allowed to do this.
- `404`: Participant, program, tier, or level not found (code: participant_not_found | program_not_found | tier_not_found | tier_level_not_found)
- `409`: Participant or program is not active, or the tier is archived (code: participant_inactive | program_inactive | tier_archived)
- `422`: Participant not enrolled in the program (code: participant_not_enrolled)
- `429`: Too many requests. Wait the number of seconds in the `Retry-After` header, then retry. See [Limits and durations](https://docs.scrip.dev/limits#rate-limits).
- `500`: Something failed on Scrip's side. Retry the request, and quote `request_id` if it keeps failing. [Errors](https://docs.scrip.dev/errors) lists every code, and the [API introduction](https://docs.scrip.dev/api-reference/introduction) describes the error format.

---

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