---
title: "Cohort Customers"
method: GET
path: "/api/v1/cohorts/{cohort_id}/customers"
tags: ["cohorts"]
---

# Cohort Customers

`GET /api/v1/cohorts/{cohort_id}/customers`

## Request

- Base URL: `https://api.minro.com` (the document declares no server; this is the origin it was published from)
- URL: `https://api.minro.com/api/v1/cohorts/{cohort_id}/customers`
- Auth: none declared

## Path parameters

- `cohort_id` string, uuid, required

## Query parameters

- `page` integer: Page number
- `per_page` integer: Items per page

## Headers

- `authorization` string, nullable: Bearer <token>

## Response `200`

Successful Response

- PaginatedEnvelopeCustomerListResponse
  - `data` CustomerListResponse[], required
    - `id` string, uuid, required
    - `name` string, nullable, required
    - `email` string, required
    - `avatar_url` string, nullable
    - `plan_tier` string, nullable
    - `plan_name` string, nullable
    - `mrr_cents` integer, nullable
    - `revenue_30d_cents` integer, nullable
    - `signup_date` string, date, nullable
    - `last_seen_at` string, date-time, nullable
    - `health` string, nullable, required
    - `churn_risk` number, nullable, required
    - `churn_risk_computed_at` string, date-time, nullable
    - `lifecycle_stage` string, nullable, required
    - `source` string, nullable
    - `primary_channel` string, nullable
    - `actions_30d` integer, nullable
    - `activity_14d` integer[], nullable
    - `last_activity_event` string, nullable
    - `last_activity_at` string, date-time, nullable
    - `signal` string, nullable
    - `bug_report_count` integer
    - `enrichment_data` object, nullable
    - `enriched_at` string, date-time, nullable
    - `posthog_properties` object, nullable
    - `operational_traits` object, nullable
    - `operational_source_id` string, nullable
    - `activity_coverage` object, nullable
    - `posthog_location` string, nullable
    - `resolved_timezone` ResolvedTimezone: Whose clock a customer's timestamps should be read in, and how sure we are. The single source of truth is ``app/services/customer_timezone.py``. It is exposed here because the profile page used to run its own precedence (``timezone`` then ``$geoip_time_zone``), which for our only live workspace resolves to the TENANT'S SERVER location rather than the person: measured 2026-08-31, geoip disagrees with the device clock 86.9% of the time on the population where both exist. So the UI showed one zone while the scheduler sent on another. Shipping the resolution rather than the raw properties is what stops those two from drifting apart again. ``source`` is carried so the UI can be honest instead of confident: ``device`` and ``workspace_property`` are worth calling "their local time", ``geoip`` and ``workspace_default`` are a guess and must be hedged. That is exactly the ``confident`` flag.
      - `zone` string, required
      - `source` string, required
      - `confident` boolean, required
    - `stripe_data` object, nullable
    - `revenuecat_data` object, nullable
  - `meta` PaginationMeta, required
    - `total` integer, required
    - `page` integer, required
    - `per_page` integer, required
    - `pages` integer, required
    - `next_cursor` string, nullable
    - `has_more` boolean
    - `safe_count` integer, nullable
    - `all_count` integer, nullable
    - `opened_count` integer, nullable
    - `returned_count` integer, nullable
    - `request_id` string
    - `timestamp` string, date-time

## Other responses

- `422`: Validation Error

## Changes

- **2026-09-20** `299da1f7604a`: 8 breaking, 6 info
  - response property `data/items/actions_30d` list-of-types was widened by adding types `null` to media type `application/json` of response `200`
  - response property `data/items/activity_14d/anyOf[subschema #1]/items/` list-of-types was widened by adding types `null` to media type `application/json` of response `200`
  - response property `data/items/churn_risk` list-of-types was widened by adding types `null` to media type `application/json` of response `200`
  - response property `data/items/health` list-of-types was widened by adding types `null` to media type `application/json` of response `200`
  - …10 more
- **2026-09-17** `2eae594b5490`: 1 info
  - the `timestamp` response's property default value `2026-09-16T23:27:36.860126` was removed for the status `200`
- **2026-09-17** `8131eed4a6f3`: 1 info
  - the `timestamp` response's property default value changed from `2026-09-15T22:32:06.599246` to `2026-09-16T23:27:36.860126` for the status `200`
- **2026-09-16** `ae15f6a99d1d`: 1 info
  - the `timestamp` response's property default value changed from `2026-09-11T07:11:59.156707` to `2026-09-15T22:32:06.599246` for the status `200`
- **2026-09-12** `c04e0dbaf3c4`: 1 info
  - the `timestamp` response's property default value changed from `2026-09-11T07:11:58.441310` to `2026-09-11T07:11:59.156707` for the status `200`

[Operation history](https://skmtc.dev/minro/apis/minro-cs-platform/changes/api/v1/cohorts/:cohort_id/customers/get.md)

---

[API](https://skmtc.dev/minro/apis/minro-cs-platform.md) - [All operations](https://skmtc.dev/minro/apis/minro-cs-platform/llms.txt) - [OpenAPI document](https://skmtc.dev/minro/apis/minro-cs-platform/revisions/89cf17ffbb6a?raw)
