---
title: "List Circles"
method: GET
path: "/api/v1/circles"
tags: ["Circles"]
---

# List Circles

`GET /api/v1/circles`

## Request

- Base URL: `https://api.proof.holdings`
- URL: `https://api.proof.holdings/api/v1/circles`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `auth_token`

List the caller's Circles (archived excluded by default; pass ?status=archived to surface them).

## Query parameters

- `page` integer
- `limit` integer
- `status` 'active' | 'archived': Lifecycle state of a Circle (archived = soft-retired)
- `environment` 'production' | 'test'
- `profile_id` string: MongoDB ObjectId

## Response `200`

List of Circles

- CircleListResponse: Paginated list of Circles
  - `data` Circle[], required
    - `id` string, required: MongoDB ObjectId
    - `user_id` string, required: MongoDB ObjectId
    - `name` string, nullable, required
    - `owner_name` string, nullable, required: How this Circle's members know its owner; null when unset
    - `profile_id` string, required: MongoDB ObjectId
    - `environment` 'production' | 'test', required
    - `proof_me_enabled` boolean, required
    - `status` 'active' | 'archived', required: Lifecycle state of a Circle (archived = soft-retired)
    - `member_count` integer, required
    - `members` CircleMember[], required
      - `id` string, required: MongoDB ObjectId
      - `name` string, required
      - `status` 'pending' | 'active', required
      - `has_telegram` boolean, required: Whether the member has a Telegram channel (declared or verified)
      - `has_whatsapp` boolean, required: Whether the member has a WhatsApp channel (declared or verified)
      - `mesh_opted_in` boolean, required
      - `mesh_opt_out` boolean, required: The member sent /opt_out: they receive no drills, reminders or checks they did not start themselves
      - `enrolled_phone_hint` string, nullable, required: Masked form of the phone the contact proved when they enrolled (the Telegram shared contact or the WhatsApp sender) — country prefix and last four digits only, never the full number. Lets the owner see who actually joined. Null until the member enrolls, and for members enrolled before it was recorded.
      - `enrolled_at` string, date-time, nullable, required
      - `last_verified_at` string, date-time, nullable, required: When this member last CONFIRMED an identity check asked of them — i.e. last proved it was them. Null until they have.
    - `created_at` string, date-time, required
    - `updated_at` string, date-time, required
  - `pagination` object, required
    - `page` integer, required
    - `limit` integer, required
    - `total` integer, required
    - `total_pages` integer, required

## Other responses

- `401`: Unauthorized
- `403`: `profile_mismatch` — a project-bound API key named another sub-account; it acts for its own sub-account only.

---

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