Models

Models

Two endpoints, both open without a key. A client discovers models before it has
credentials, which is the normal flow.

List models

GET /api/v1/models
curl https://hisoka.ai/api/v1/models
{
  "object": "list",
  "data": [
    {
      "id": "glm-5.3-flash",
      "object": "model",
      "owned_by": "Hisoka",
      "label": "GLM 5.3 Flash",
      "is_free": true,
      "pricing": {
        "input_per_mtok": 0.0,
        "output_per_mtok": 0.0,
        "currency": "USD"
      },
      "capabilities": {
        "modalities": ["text", "image", "video"],
        "tools": true,
        "reasoning": true,
        "prompt_cache": true
      },
      "context_window": 1048576,
      "max_input_tokens": 1048576,
      "max_output": 1040384
    }
  ]
}

Reading a row

id is the only string you send. It has no vendor prefix and no capital letters.
api_model is the upstream id and is informational: sending it usually works, but id is
the supported spelling.

pricing is USD per million tokens. On a free model both rates are exactly 0.0
rather than the list price, so a client computing its own cost shows nothing instead of a
charge that never happens.

is_free means the call settles at zero. It does not mean the account needs no
balance: see Billing.

capabilities.modalities is what you may send. Sending an image to a model that lists
only text is refused with 400 modality_not_supported before the request reaches a
provider, so you get a clear error instead of a provider failure.

capabilities.tools decides whether a tool schema may be sent at all. An agent
choosing a model should check this first.

context_window and max_input_tokens are the same number, deliberately. Input
and output share one window, so a completion cap is a ceiling and not a reservation.
A client that sizes its context budget from max_input_tokens gets the usable figure.

max_output is the completion ceiling for that model.

Retrieve one model

GET /api/v1/models/{model}
curl https://hisoka.ai/api/v1/models/glm-5.3-flash

Same row as the list entry. OpenAI SDKs call this from models.retrieve(id); without the
route the SDK raises NotFoundError on an endpoint that only exists in its own client.

An unknown id answers 404 model_not_found inside the standard error envelope.

An out-of-stock model is absent, not broken

When every connection behind a model is dead, the row disappears from the catalogue rather
than staying listed and failing at request time. A buyer who paid for a model that cannot
answer is a refund, so absence is the safer state.

Capability details

Per-model modalities, context and reasoning support are listed on
Model capabilities.