---
title: "Get a user's plan, access, and subscription history"
method: GET
path: "/v1/user/{userId}/subscriptions/"
tags: ["/v1/user"]
---

# Get a user's plan, access, and subscription history

`GET /v1/user/{userId}/subscriptions/`

## Request

- Base URL: `https://api.counselhealth.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.counselhealth.com/v1/user/{userId}/subscriptions/`
- Auth: HTTP bearer

Returns the user's current plan, whether they can use the product right now, and their subscription history.

  **plan**: the current plan. `billing_type` is `subscription`, `fee_for_service`, or `complimentary`, and is omitted when none applies.

  **access**: can the user use the product right now?
  - `has_access`: true when `expires_at` is `null` (open-ended) or in the future.
  - `status`: `active`, or `pending_cancellation` when a cancellation is scheduled but access continues until then. Once access has ended: `disabled` (you called POST /disable; stays until POST /enable), `payment_failed` (a renewal charge failed), or `expired` (anything else ran out: the trial, the subscription, or an `access_expires_at` you set).

  **trial**: only present for organizations with trial access. `null` if the user never had a trial. Otherwise `ends_at` and `status`: `active`, `expired`, or `converted` (the user paid; this never reverts).

  **subscriptions**: Stripe subscription rows, most recent first. Empty without a recurring billing relationship. `is_trial` means a Stripe trial on that row, not the trial above. `cancel_at` is set when a cancellation is scheduled. `renews_at` is the end of the current billing period and may stay set in that case, so check `cancel_at` before showing it as a renewal date.

  This endpoint is not reachable for draft users; the trial starts when onboarding completes. Clients must tolerate unknown `status` values.

## Path parameters

- `userId` string, required

## Headers

- `Idempotency-Key` string

## Response `200`

Default Response

- object
  - `plan` object, required
    - `id` string, uuid, required
    - `slug` string, required
    - `display_name` string, required
    - `billing_type` 'subscription' | 'fee_for_service' | 'complimentary'
  - `access` object, required
    - `has_access` boolean, required
    - `expires_at` string, date-time, nullable, required: datetime in ISO 8601 format
    - `status` 'active' | 'pending_cancellation' | 'expired' | 'payment_failed' | 'disabled', required
  - `trial` object, nullable
    - `ends_at` string, date-time, required: datetime in ISO 8601 format
    - `status` 'active' | 'converted' | 'expired', required
  - `subscriptions` object[], required
    - `status` 'active' | 'canceled' | 'incomplete' | 'incomplete_expired' | 'past_due' | 'paused' | 'trialing' | 'unpaid', required
    - `plan_id` string, uuid, nullable, required
    - `is_trial` boolean, required
    - `cancel_at` string, date-time, nullable, required: datetime in ISO 8601 format
    - `ended_at` string, date-time, nullable, required: datetime in ISO 8601 format
    - `renews_at` string, date-time, nullable, required: datetime in ISO 8601 format
    - `created_at` string, date-time, required: datetime in ISO 8601 format

## Other responses

- `400`: 400 error with a machine-readable `code` for client branching.
- `401`: Standard error body returned for non-2xx responses.
- `403`: Standard error body returned for non-2xx responses.
- `404`: Standard error body returned for non-2xx responses.
- `409`: Standard error body returned for non-2xx responses.
- `413`: Standard error body returned for non-2xx responses.
- `429`: Standard error body returned for non-2xx responses.
- `500`: Standard error body returned for non-2xx responses.
- `502`: Default Response
- `503`: Default Response
- `504`: Default Response

---

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