> ## Documentation Index
> Fetch the complete documentation index at: https://docs.anivahealth.com/llms.txt
> Use this file to discover all available pages before exploring further.

# List Panels

> Browse the panel catalog

Returns the catalog of panels your API key can attach to appointments via [Add Panels](/api/appointments/add-panels). Panels are filtered by the panel groups your key has access to.

Each panel includes the IDs of its biomarkers — cross-reference against [List Biomarkers](/api/biomarkers/list-biomarkers) for biomarker details (name, unit, category, etc.).

<Note>
  Custom container panels return an empty `biomarker_ids` list. Their biomarker membership lives
  per-appointment — use [Add Individual Biomarkers](/api/appointments/add-individual-biomarkers) to
  attach individual biomarkers rather than panels.
</Note>

## Request

### Query parameters

<ParamField query="test_location_id" type="string">
  Supply to populate per-panel `pricing` for this location.
</ParamField>

<ParamField query="rate_card" type="string">
  Override which rate card the `yours` price uses: `retail`, `subscription`, or a billing-account
  slug your key may use. Defaults to the card on your API key's billing account, else retail. Only
  affects pricing (which requires `test_location_id`).
</ParamField>

## Response

Returns an array of panels.

<ResponseField name="id" type="string">
  Stable panel identifier (UUID) — pass this to [Add Panels](/api/appointments/add-panels).
</ResponseField>

<ResponseField name="name" type="string">
  Display name.
</ResponseField>

<ResponseField name="biomarker_ids" type="number[]">
  IDs of biomarkers belonging to this panel. Empty for custom container panels. Cross-reference
  against [List Biomarkers](/api/biomarkers/list-biomarkers).
</ResponseField>

<ResponseField name="pricing" type="object | null">
  Per-panel pricing — `null` unless `test_location_id` was supplied **and** your key has the
  `prices_view` scope, or for panels without a fixed catalog price (e.g. the custom container).
  Carries `retail` and `yours`, each a [price
  breakdown](/api/biomarkers/list-biomarkers#price-objects) (a single group, no `goa_lines`) or
  `null`.
</ResponseField>

## Error responses

| Status | Description                                               |
| ------ | --------------------------------------------------------- |
| `400`  | Validation error — e.g. unknown/unauthorised `rate_card`. |
| `403`  | Forbidden — missing `panels_access` scope.                |
| `404`  | `test_location_id` not found.                             |
| `500`  | Internal server error.                                    |

<RequestExample>
  ```bash cURL theme={null}
  curl --url 'https://anivahealth.com/api/v1/panels?test_location_id=0d242e5a-5e00-48d5-935e-a35f71a7a757' \
    --header 'x-api-key: YOUR_API_KEY'
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  [
    {
      "id": "f1c2d4a3-7b8e-4f2a-9c1d-2e3f4a5b6c7d",
      "name": "Hormones (Female)",
      "biomarker_ids": [42, 43, 44, 51, 52],
      "pricing": {
        "retail": {
          "total_cents": 14900,
          "groups": [{ "price_cents": 14900, "biomarker_ids": [] }]
        },
        "yours": {
          "total_cents": 11900,
          "groups": [{ "price_cents": 11900, "biomarker_ids": [] }]
        }
      }
    },
    {
      "id": "9c1d2e3f-4a5b-4c7d-8e9f-0a1b2c3d4e5f",
      "name": "Custom",
      "biomarker_ids": [],
      "pricing": null
    }
  ]
  ```
</ResponseExample>
