---
title: "List callable models in the OpenAI `model` list shape"
method: GET
path: "/v1/models"
tags: ["OpenAI Compatible"]
---

# List callable models in the OpenAI \`model\` list shape

`GET /v1/models`

## Request

- Base URL: `https://api.popnow.ai`
- URL: `https://api.popnow.ai/v1/models`
- Auth: HTTP bearer

Returns every model that can be called right now, chat models first. `id` is the model
call name accepted by every `/v1` and `/api/v1` operation; `owned_by` is the model publisher.

Besides the four OpenAI fields, every item carries `modality`, `task` and its price in `credits` (the same
object as on `/api/v1/models`). Chat models (`task: chat`, the only ones the chat operations accept) also carry
`context_length`, `max_output_tokens` and `supported_parameters`. OpenAI SDKs ignore the extra fields.
Pass `modality=text` to list only chat models. Only video models work on `POST /v1/videos`.

## Query parameters

- `modality` 'text' | 'image' | 'video' | 'audio'

## Response `200`

OpenAI-style model list.

- OpenAIModelList
  - `object` 'list', required
  - `data` object[], required
    - `id` string, required: Model call name; may contain slashes.
    - `object` 'model', required
    - `created` integer, required: Unix seconds of the last catalog update.
    - `owned_by` string, required: Model publisher.
    - `modality` 'text' | 'image' | 'video' | 'audio': PopNow extension. Output modality.
    - `task` string: PopNow extension. The task this call name runs, for example `chat` or `text-to-video`. Only `chat` models work on the chat operations.
    - `context_length` integer: PopNow extension, chat models only. The most input tokens one request can send.
    - `max_output_tokens` integer: PopNow extension, chat models only. The largest `max_tokens` value the model accepts.
    - `supported_parameters` string[]: PopNow extension, chat models only. Request fields this model accepts (the top-level fields of its input schema). `stream`, `stream_options`, `user`, `metadata` and `store` are handled by the compatible layer for every model and are not listed. Any other field returns `400` with `code: unsupported_parameter`.
    - `credits` object: Price in credits (1 credit = $0.001). Media models carry the same price popnow.ai shows: `unit` is how the price scales (`per_image`, `per_second`, `per_request`…), `perUnit` is the starting price per unit, and `rules` lists the tiers: each rule applies when the request matches its `when` values (`*` matches the field that sets the tier). Use jobs/quote for the exact amount of one request. Chat models have `unit: per_1m_tokens` and price `input`, `output` (and, where the model has them, `cachedInput`, `cacheWrite` and a `longContext` tier that applies to the whole request once its input exceeds `thresholdTokens`) in credits per 1M tokens; a call is charged its actual usage in fractional credits.
      - `unit` string, required
      - `perUnit` number
      - `input` number: Chat models only. Credits per 1M input tokens.
      - `output` number: Chat models only. Credits per 1M output tokens (reasoning tokens count as output).
      - `cachedInput` number: Chat models only. Credits per 1M cached input tokens.
      - `cacheWrite` number: Chat models only. Credits per 1M tokens written to the prompt cache.
      - `longContext` object: Chat models only. Prices for requests whose input exceeds thresholdTokens (reaches it when inclusive is true).
        - `thresholdTokens` integer
        - `inclusive` boolean
        - `input` number
        - `cachedInput` number
        - `cacheWrite` number
        - `output` number
      - `rules` object[]
        - `when` object, required
        - `perUnit` number, required
        - `unit` string

## Other responses

- `401`: Error in the OpenAI `{error:{message,type,param,code}}` shape. The HTTP status is the same one `/api/v1` would return. A content-policy refusal is HTTP 400 with `code: content_rejected`, so it can be told apart from a parameter error (`invalid_request` / `unsupported_parameter`, with `param` set when the error is about one field).
- `403`: Error in the OpenAI `{error:{message,type,param,code}}` shape. The HTTP status is the same one `/api/v1` would return. A content-policy refusal is HTTP 400 with `code: content_rejected`, so it can be told apart from a parameter error (`invalid_request` / `unsupported_parameter`, with `param` set when the error is about one field).
- `429`: Error in the OpenAI `{error:{message,type,param,code}}` shape. The HTTP status is the same one `/api/v1` would return. A content-policy refusal is HTTP 400 with `code: content_rejected`, so it can be told apart from a parameter error (`invalid_request` / `unsupported_parameter`, with `param` set when the error is about one field).
- `500`: Error in the OpenAI `{error:{message,type,param,code}}` shape. The HTTP status is the same one `/api/v1` would return. A content-policy refusal is HTTP 400 with `code: content_rejected`, so it can be told apart from a parameter error (`invalid_request` / `unsupported_parameter`, with `param` set when the error is about one field).
- `503`: Error in the OpenAI `{error:{message,type,param,code}}` shape. The HTTP status is the same one `/api/v1` would return. A content-policy refusal is HTTP 400 with `code: content_rejected`, so it can be told apart from a parameter error (`invalid_request` / `unsupported_parameter`, with `param` set when the error is about one field).

---

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