# Get member tier progress

> Returns a member’s progress toward the next loyalty tier.

Breadcrumb: API › Get member tier progress
Docs index: https://docs.cevoid.com/developers/llms.txt

`GET https://api.cevoid.com/v2/members/{profile_id}/tier-progress`

Returns a member’s progress toward the next loyalty tier.

## Authorizations

Bearer token in the Authorization header: `Authorization: Bearer <key>` (API key).

## Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `profile_id` | `string` | Yes | Cevoid profile ID. Example: `prf_abc123`. |

## Response

### 200: Successful response

`application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `data` | `object` | Yes | Requested resource. |
| `data.current_tier` | `object` | Yes | Current tier, or null. |
| `data.current_tier.id` | `string` | Yes | Cevoid tier ID. Example: `tier_gold`. |
| `data.current_tier.name` | `string` | Yes | Display name of the tier. Example: `Gold`. |
| `data.current_tier.icon_url` | `string` | No | Optional icon representing the tier. Example: `https://cdn.cevoid.com/tiers/gold.png`. |
| `data.current_tier.expires_at` | `string<date-time>` | No | When the current tier expires, if tier evaluations expire. Example: `2026-12-31T23:59:59.999Z`. |
| `data.next_tier` | `object` | Yes | Next reachable tier, or null. |
| `data.next_tier.id` | `string` | Yes | Cevoid tier ID. Example: `tier_gold`. |
| `data.next_tier.name` | `string` | Yes | Display name of the tier. Example: `Gold`. |
| `data.next_tier.icon_url` | `string` | No | Optional icon representing the tier. Example: `https://cdn.cevoid.com/tiers/gold.png`. |
| `data.next_tier.milestones` | `object[]` | Yes | Progress required for the next tier. |
| `data.next_tier.milestones[].type` | `enum<string>` | Yes | Metric used to qualify for the next tier. Allowed values: `POINTS`, `AMOUNT_SPENT`, `NUMBER_OF_PURCHASES`. Example: `POINTS`. |
| `data.next_tier.milestones[].required` | `number` | Yes | Required amount for the next tier. AMOUNT_SPENT values use major currency units. Example: `1000`. |
| `data.next_tier.milestones[].current` | `number` | Yes | Current progress. AMOUNT_SPENT values use major currency units. Example: `750`. |
| `data.next_tier.milestones[].remaining` | `number` | Yes | Remaining amount. AMOUNT_SPENT values use major currency units. Example: `250`. |
| `data.next_tier.milestones[].percent_complete` | `number` | Yes | Progress percentage, capped at 100. Example: `75`. |
| `data.next_tier.entry_rewards` | `object[]` | Yes | Rewards granted at the next tier. |
| `data.next_tier.entry_rewards[].type` | `string` | Yes | Reward type granted when the tier is reached. Example: `DISCOUNT_CODE`. |
| `data.next_tier.entry_rewards[].title` | `string` | Yes | Human-readable reward title. Example: `10% Off Reward`. |
| `data.next_tier.entry_rewards[].icon_url` | `string` | No | Optional icon representing the reward. Example: `https://cdn.cevoid.com/rewards/reward-icon.png`. |
| `data.next_tier.perks` | `object[]` | Yes | Perks associated with the next tier. |
| `data.next_tier.perks[].value` | `string` | Yes | Human-readable perk text. Example: `Exclusive early access to launches`. |

Response headers:

| Header | Type | Description |
| --- | --- | --- |
| `Cevoid-Processing-Ms` | `string` | End-to-end request processing time in milliseconds |
| `Cevoid-Request-Id` | `string` | Request identifier for support and tracing |
| `RateLimit-Limit` | `string` | Current rate limit bucket size |
| `RateLimit-Remaining` | `string` | Remaining requests in the current rate limit window |
| `RateLimit-Reset` | `integer` | Seconds until the next request token is available |

```json
{
  "data": {
    "current_tier": {
      "id": "tier_silver",
      "name": "Silver",
      "icon_url": "https://cdn.cevoid.com/tiers/silver.png",
      "expires_at": "2026-12-31T23:59:59.999Z"
    },
    "next_tier": {
      "id": "tier_gold",
      "name": "Gold",
      "icon_url": "https://cdn.cevoid.com/tiers/gold.png",
      "milestones": [
        {
          "type": "POINTS",
          "required": 1000,
          "current": 750,
          "remaining": 250,
          "percent_complete": 75
        }
      ],
      "entry_rewards": [
        {
          "type": "DISCOUNT_CODE",
          "title": "10% Off Reward"
        }
      ],
      "perks": [
        {
          "value": "Exclusive early access to launches"
        }
      ]
    }
  }
}
```

### 401: Unauthorized

`application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `additional_data` | `object` | No | Optional machine-readable error details. |
| `additional_data.{key}` | `any` | No |  |
| `status` | `number` | Yes | HTTP status code for the error response. Example: `404`. |
| `code` | `string` | Yes | Stable machine-readable error code. Example: `not_found`. |
| `message` | `string` | Yes | Human-readable description of the error. Example: `Route not found`. |
| `request_id` | `string` | No | Request identifier for support and tracing. Example: `req_abc123`. |

Response headers: the same as 200.

```json
{
  "status": 401,
  "code": "unauthorized",
  "message": "Unauthorized",
  "request_id": "req_abc123"
}
```

### 403: Forbidden

`application/json`

Same fields as 401.

Response headers: the same as 200.

```json
{
  "status": 403,
  "code": "forbidden",
  "message": "Forbidden",
  "request_id": "req_abc123"
}
```

### 404: Not found

`application/json`

Same fields as 401.

Response headers: the same as 200.

```json
{
  "additional_data": {
    "errors": [
      {
        "field": "query.market",
        "message": "Invalid input: expected string, received array"
      }
    ]
  },
  "status": 404,
  "code": "not_found",
  "message": "Route not found",
  "request_id": "req_abc123"
}
```

### 422: Validation error

`application/json`

Same fields as 401.

Response headers: the same as 200.

```json
{
  "additional_data": {
    "errors": [
      {
        "field": "query.market",
        "message": "Invalid input: expected string, received array"
      }
    ]
  },
  "status": 422,
  "code": "validation_error",
  "message": "Validation error",
  "request_id": "req_abc123"
}
```

### 429: Too many requests

`application/json`

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `additional_data` | `object` | Yes | Machine-readable rate-limit details. |
| `additional_data.retry_after_seconds` | `integer` | Yes | Range: `0 <= x`. |
| `additional_data.{key}` | `any` | No |  |
| `status` | `integer` | Yes | HTTP status code. Example: `404`. |
| `code` | `string` | Yes | Stable machine-readable error code. Example: `not_found`. |
| `message` | `string` | Yes | Human-readable error description. Example: `Resource not found`. |
| `request_id` | `string` | No | Request identifier for support and tracing. Example: `req_abc123`. |

Response headers:

| Header | Type | Description |
| --- | --- | --- |
| `Cevoid-Processing-Ms` | `string` | End-to-end request processing time in milliseconds |
| `Cevoid-Request-Id` | `string` | Request identifier for support and tracing |
| `RateLimit-Limit` | `string` | Current rate limit bucket size |
| `RateLimit-Remaining` | `string` | Remaining requests in the current rate limit window |
| `RateLimit-Reset` | `integer` | Seconds until the next request token is available |
| `Retry-After` | `integer` | Seconds to wait before retrying the request |

```json
{
  "status": 429,
  "code": "rate_limit_exceeded",
  "message": "Rate limit exceeded",
  "request_id": "req_abc123",
  "additional_data": {
    "retry_after_seconds": 1
  }
}
```

### 500: Internal server error

`application/json`

Same fields as 401.

Response headers: the same as 200.

```json
{
  "status": 500,
  "code": "internal_server_error",
  "message": "Internal server error",
  "request_id": "req_abc123"
}
```

## Request example

```bash
curl 'https://api.cevoid.com/v2/members/prf_abc123/tier-progress' \
  -H "Authorization: Bearer ${CEVOID_API_KEY}"
```

---

Canonical: https://docs.cevoid.com/developers/api/members/get-member-tier-progress
