Models
Every model served through api.hanzo.ai/v1 — the live catalogue, with the id you pass as "model" and its current rate.
Models
After this page you know which model to ask for, and what to type to get it.
Every model below answers on one endpoint — https://api.hanzo.ai/v1 — with one
key. Choosing between them is choosing one string. There is no separate base URL
per provider, no second credential, and no client to swap.
Two families are ours
Everything else in the catalogue is served on your behalf. Two families are built here, and they are the ones to reach for first:
- Enso — Hanzo's frontier family, and the default for work that has to be
right. Three tiers, one price/quality contract each:
enso-flash,enso,enso-ultra. What each is for → - Zen — our open-weight models, from edge-sized to frontier. You can call them here, or download the weights and run them yourself; the ids below are the hosted ones. On Hugging Face →
Not sure? Ask for `enso-flash`.
It is the cheapest Enso tier, and most work never needs to leave it. Moving up later is a one-word diff, so start here and change your mind when a smaller model has actually disappointed you.
The catalogue
The first groups are the curated Hanzo families; everything after them is grouped by the provider that trains the model. Every row is filterable, and the model id copies with a click — that string is the whole integration.
Passing an id
Whatever you copied goes in model. Nothing else about the request changes:
curl https://api.hanzo.ai/v1/chat/completions \
-H "Authorization: Bearer $HANZO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "enso-flash",
"messages": [{ "role": "user", "content": "Name three uses for a paperclip." }]
}'Swapping enso-flash for zen5-coder — or for any id in the table above — is
the entire migration between models.
Listing them yourself
GET /v1/models is the catalogue this page renders, and it takes a bearer
token like every other endpoint:
curl -s https://api.hanzo.ai/v1/models \
-H "Authorization: Bearer $HANZO_API_KEY" \
| jq '.data[] | select(.owned_by == "hanzo" or .owned_by == "zenlm")'Every entry in .data[] carries the id you pass as model, the owned_by
that trained it and a premium flag. Nearly all carry a pricing object with
input and output; some also carry context_window, provider,
max_output_tokens, supports_tools and supports_vision. Those last ones are
per model rather than on every row, so read them rather than assume them. Rates
and how they are billed are on Pricing.
That response is what this page renders, so the two cannot disagree — and if you ever think they do, believe the endpoint.
Next
How is this guide?
Last updated on