---
title: "List tenants"
description: "Trillet OEM API: Lists tenants, newest first."
openapi: /public/openapi/trillet-oem.yaml GET /partner/v1/tenants
lastUpdated: "2026-10-28"
---

> **For AI agents:** the complete documentation index is at [llms.txt](https://docs.trillet.ai/llms.txt). Append `.md` to any page URL for its markdown version.

`GET https://api.trillet.ai/partner/v1/tenants`

Lists tenants, newest first. Deleted tenants are not listed. Needs `tenants:read`.

## Authentication

- `partnerKey` — http bearer (tpk_live_...)

## Query parameters

- `limit` (integer)
- `starting_after` (string) — The `id` of the last tenant on the previous page. A value that is not a tenant ID returns `400` `invalid_cursor`.
- `status` (string)
- `externalId` (string)

## Response 200

A page of tenants.
  - response (object)
    - `object` (string, required)
    - `data` (array, required)
      - `items` (object)
        - `object` (string, required)
        - `id` (string, required) — Use it in paths and as `x-workspace-id` on standard endpoints.
        - `externalId` (string, required) — Your ID for this customer.
        - `name` (string, required)
        - `status` (string, required, one of: active, suspended, deleted, provisioning_failed)
        - `region` (string, required, one of: us, au)
        - `metadata` (object, required)
        - `limits` (object, required)
          - `monthlySpendCap` (number | null) — Monthly spend cap in USD. `null` means no cap. `0` blocks all paid work.
        - `suspendedAt` (string | null, date-time)
        - `suspendedReason` (string | null)
        - `deletedAt` (string | null, date-time)
        - `createdAt` (string, date-time, required)
    - `hasMore` (boolean, required)

## Response 400

The request is malformed or a field is invalid. `error.param` names the field when there is one.
  - response (object)
    - `error` (object, required)
      - `type` (string, required, one of: invalid_request_error, authentication_error, permission_error, conflict_error, rate_limit_error, api_error, idempotency_error)
      - `code` (string, required) — A stable code. Handle errors by `code`, not by `message`.
      - `message` (string, required)
      - `param` (string) — The request field the error is about, when there is one.
      - `requestId` (string | null) — Include it when you contact support. Not present on idempotency errors.

## Response 401

The partner key is missing, malformed, unknown or revoked (`partner_key_required`, `invalid_api_key`, `partner_not_enabled`).
  - response (object)
    - `error` (object, required)
      - `type` (string, required, one of: invalid_request_error, authentication_error, permission_error, conflict_error, rate_limit_error, api_error, idempotency_error)
      - `code` (string, required) — A stable code. Handle errors by `code`, not by `message`.
      - `message` (string, required)
      - `param` (string) — The request field the error is about, when there is one.
      - `requestId` (string | null) — Include it when you contact support. Not present on idempotency errors.

## Response 403

`missing_scope`, or `key_restricted` on webhook endpoint routes.
  - response (object)
    - `error` (object, required)
      - `type` (string, required, one of: invalid_request_error, authentication_error, permission_error, conflict_error, rate_limit_error, api_error, idempotency_error)
      - `code` (string, required) — A stable code. Handle errors by `code`, not by `message`.
      - `message` (string, required)
      - `param` (string) — The request field the error is about, when there is one.
      - `requestId` (string | null) — Include it when you contact support. Not present on idempotency errors.


---

📦 **OpenAPI specs:** Every OpenAPI specification referenced by this documentation is available as a single download — https://docs.trillet.ai/api-specs.zip
