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

# List Models

> List available Confidential AI models, modalities, context windows, and pricing metadata.

## Endpoints

```bash theme={"system"}
GET https://inference.phala.com/v1/models
```

Use the live model catalog before hardcoding model IDs. The catalog returns model IDs, context windows, pricing, serving metadata, modalities, supported parameters, and whether a model can be served confidentially.

## Query Parameters

<ParamField query="zdr" type="string">
  Set to `true` to return only models that can be served under zero data retention, meaning the upstream serving route does not retain prompt or completion content.

  A model is included when at least one route that can serve it operates under zero data retention. Listing a model here means a request for it with `provider: {"zdr": true}` can be routed. See [Zero Data Retention](/phala-cloud/confidential-ai/confidential-model/zero-data-retention).

  `true` is the only accepted value. Any other value, including `false`, returns `400`. Omit the parameter to list the full catalog.
</ParamField>

```bash theme={"system"}
curl "https://inference.phala.com/v1/models?zdr=true" \
  -H "Authorization: Bearer <API_KEY>"
```

<ParamField query="tee" type="string">
  Set to `true` to return only models that are offered confidentially, meaning the model object carries `is_tee: true`.

  This filter reports a model's own capability. It does not promise that a given request will reach an attested provider, which depends on the deployment serving it. To require attestation for a request, send `provider: {"aci_verified": true}`. See [Attested Routing](/phala-cloud/confidential-ai/confidential-model/attested-routing).

  `true` is the only accepted value. Any other value, including `false`, returns `400`. Omit the parameter to list the full catalog.
</ParamField>

```bash theme={"system"}
curl "https://inference.phala.com/v1/models?tee=true" \
  -H "Authorization: Bearer <API_KEY>"
```

Both filters compose. Combining them returns models that satisfy each constraint.

Response entries have the same shape as the unfiltered catalog. There is no `zdr` field on a model object: the filter is the way to read this property.

An invalid value returns `400`:

```json theme={"system"}
{
  "error": {
    "message": "Invalid 'zdr' query parameter. The only accepted value is 'true'; omit it for unfiltered results.",
    "type": "invalid_request_error"
  }
}
```

## Examples

<CodeGroup>
  ```bash All Models theme={"system"}
  curl https://inference.phala.com/v1/models \
    -H "Authorization: Bearer <API_KEY>"
  ```

  ```python Python theme={"system"}
  from openai import OpenAI

  client = OpenAI(
      api_key="<API_KEY>",
      base_url="https://inference.phala.com/v1",
  )

  models = client.models.list()
  for model in models.data:
      print(model.id)
  ```
</CodeGroup>

## Response

```json theme={"system"}
{
  "data": [
    {
      "id": "phala/qwen3.5-27b",
      "name": "Qwen3.5 27B",
      "created": 1677652288,
      "is_tee": true,
      "description": "Qwen model running through Phala GPU TEE infrastructure",
      "context_length": 262144,
      "max_output_length": 262144,
      "pricing": {
        "prompt": "0.00000030",
        "completion": "0.00000240"
      },
      "providers": ["phala"],
      "input_modalities": ["text"],
      "output_modalities": ["text"],
      "supported_parameters": ["max_tokens", "temperature", "tools", "tool_choice", "response_format"],
      "metadata": {}
    }
  ]
}
```

## Model Object Fields

| Field                  | Description                                                                       |
| ---------------------- | --------------------------------------------------------------------------------- |
| `id`                   | Model identifier for API calls                                                    |
| `name`                 | Human-readable model name                                                         |
| `is_tee`               | `true` if the model can be served confidentially by a verified TEE provider       |
| `description`          | Model or provider description                                                     |
| `context_length`       | Maximum context window                                                            |
| `max_output_length`    | Maximum output length                                                             |
| `pricing.prompt`       | Input token price per token; multiply by 1,000,000 for per-million-token pricing  |
| `pricing.completion`   | Output token price per token; multiply by 1,000,000 for per-million-token pricing |
| `providers`            | Serving routes available for the model.                                           |
| `input_modalities`     | Supported input types, such as `text` or `image`                                  |
| `output_modalities`    | Supported output types, such as `text` or `embeddings`                            |
| `supported_parameters` | Request parameters accepted by the model                                          |

## Find Verifiable TEE Models

Filter for models that can be served confidentially:

```bash theme={"system"}
curl "https://inference.phala.com/v1/models?tee=true" \
  -H "Authorization: Bearer <API_KEY>" | \
  jq -r '.data[].id'
```

`is_tee: true` means the model can be served confidentially. To require attestation for a specific request rather than reading the catalog flag, use [Attested Routing](/phala-cloud/confidential-ai/confidential-model/attested-routing). The receipt remains the per-response proof: read the `x-receipt-id` header, then verify it with [Attestation Report](/phala-cloud/confidential-ai/confidential-model/api-reference/attestation) and [Get Receipt](/phala-cloud/confidential-ai/confidential-model/api-reference/receipts).

## Find Zero-Data-Retention Models

`is_tee` and `zdr` describe different properties. `is_tee` says a model can run inside a verified TEE, which constrains who can read memory during execution. Zero data retention says the upstream serving route does not keep prompt or completion content after serving the request. Filter for it with the query parameter rather than inferring it from `is_tee`:

```bash theme={"system"}
curl -s "https://inference.phala.com/v1/models?zdr=true" \
  -H "Authorization: Bearer <API_KEY>" | \
  jq -r '.data[].id'
```

To route a request under the same constraint, send `provider: {"zdr": true}` in the request body. See [Zero Data Retention](/phala-cloud/confidential-ai/confidential-model/zero-data-retention).
