---
title: "List Workspaces"
method: GET
path: "/api/v1/internal/workspaces/"
tags: ["internal", "workspaces"]
---

# List Workspaces

`GET /api/v1/internal/workspaces/`

List all workspaces with member counts and credit info.

## Response `200`

Successful Response

- AdminWorkspaceListResponse — Response schema for workspace list endpoint.
  - `items` AdminWorkspaceListItem[], required
    - `id` string, uuid, required
    - `name` string, required
    - `budget_authority` 'credits' | 'paid_balance', required — Which budget a metered run draws down. Two members, because there are two budgets. Free usage and paid usage are the same balance on the same account, spent at the same prices and refused by the same check; what a workspace paid for that balance decides what its refusal offers next, not how the run is admitted. A third member for the free tier is what let the two drift — different prices, different exemptions, different per-run sizing — while both claimed to meter usage.
    - `member_count` integer, required
    - `project_count` integer, required
    - `available_enrichment_credits` integer, required
    - `used_enrichment_credits` integer, required
    - `remaining_credits` integer, required
    - `is_suspended` boolean, required
    - `is_internal` boolean, required
    - `origin` 'staff' | 'self_serve_discovery' | 'direct_paid', required — Which door a workspace was acquired through. An acquisition fact, written once at creation and never rewritten. Orthogonal to `WorkspaceType`, which is the billing cohort, and to `CountyDataResidency`, which is topology: a direct-paid workspace opens as a discovery-type workspace on the joining grant and converts in place, so the type says nothing about the door. Keeping it separate is what makes an abandoned direct signup countable — it holds a free workspace whose type is indistinguishable from a Discovery one. `STAFF` is every workspace a person at MAIA provisioned, and is what a row written before this column reports.
    - `icp_category_id` string, uuid, nullable, required
    - `created_at` string, date-time, nullable, required
    - `last_active_at` string, date-time, nullable, required
  - `total` integer, required

## Changes

- **2026-09-19** `924eeadc29ad` — 1 info
  - added the required property `items/items/origin` to the response with the `200` status
- **2026-09-12** `604ea84d0ff7` — 1 warning, 1 info
  - added the new `paid_balance` enum value to the `items/items/budget_authority` response property for the response status `200`
  - removed the `discovery_allowance` enum value from the `items/items/budget_authority` response property for the response status `200`
- **2026-08-26** `b8fec14143f2` — 1 info
  - added the required property `items/items/budget_authority` to the response with the `200` status
- **2026-08-05** `bd2347b6f591` — 1 info
  - added the required property `items/items/icp_category_id` to the response with the `200` status

[Change history](https://skmtc.dev/maia-analytics/apis/maia-api/changes/api/v1/internal/workspaces/get.md)

---

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