List Models
Return the set of models the calling token can use. GET /v1/models is a single endpoint with three response shapes: OpenAI-compatible by default, Anthropic-native when called with Anthropic headers, Gemini-shape when called with a Gemini key. The companion GET /v1/models/{model_id} retrieves one model by ID.
client.models.list() works unchanged, and Gemini SDKs that probe a single model also work.
Authentication
The /v1/models route runs the same token middleware as /v1/messages. Three header forms are accepted; missing or invalid tokens return HTTP 401 with a buzz_error body.
| Header | Notes |
|---|---|
Authorization: Bearer <KEY> | Recommended. Selects the OpenAI-compatible response shape. |
Authorization: Bearer sk-<KEY> | The sk- prefix is automatically stripped before validation. |
x-api-key: <KEY> + anthropic-version: 2023-06-01 | Both headers together select the Anthropic-native response shape. |
x-goog-api-key: <KEY> or ?key=<KEY> | Gemini-style auth. Only honored on /v1beta/models, /v1beta/openai/models, and /v1/models/{id} (with model id). Bare /v1/models requires Authorization or x-api-key. |
Response shape selection
BUZZ inspects the headers and dispatches to one of three branches:
| Trigger | Response shape |
|---|---|
x-api-key and anthropic-version set | Anthropic native (data / first_id / has_more / last_id) |
x-goog-api-key set, or ?key= in the query string (only on /v1beta/models, /v1beta/openai/models, or /v1/models/{id}) | Gemini-shape branch |
Default (e.g. Authorization: Bearer) | OpenAI-compatible (success / object / data) |
Example — OpenAI-compatible (default)
curl https://buzzai.cc/v1/models \
-H "Authorization: Bearer $BUZZ_API_KEY"from openai import OpenAI
client = OpenAI(
base_url="https://buzzai.cc/v1",
api_key="",
)
models = client.models.list()
for m in models.data:
print(m.id) import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://buzzai.cc/v1",
apiKey: process.env.BUZZ_API_KEY,
});
const models = await client.models.list();
for (const m of models.data) {
console.log(m.id);
}Response
{
"success": true,
"object": "list",
"data": [
{
"id": "claude-haiku-4-5-20251001",
"object": "model",
"created": 1626777600,
"owned_by": "anthropic",
"supported_endpoint_types": ["anthropic", "openai"]
},
{
"id": "claude-sonnet-4-6",
"object": "model",
"created": 1626777600,
"owned_by": "anthropic",
"supported_endpoint_types": ["anthropic", "openai"]
}
]
}
BUZZ adds two fields beyond the OpenAI standard: success (top-level) and supported_endpoint_types (per model). Tolerant parsers will ignore them; strict ones can drop them safely.
Example — Anthropic native
Send x-api-key together with anthropic-version to get the Anthropic shape — what anthropic.Anthropic().models.list() already sends out of the box.
curl https://buzzai.cc/v1/models \
-H "x-api-key: $BUZZ_API_KEY" \
-H "anthropic-version: 2023-06-01"from anthropic import Anthropic
client = Anthropic(
base_url="https://buzzai.cc",
api_key="",
)
page = client.models.list()
for m in page.data:
print(m.id, m.display_name) import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
baseURL: "https://buzzai.cc",
apiKey: process.env.BUZZ_API_KEY,
});
const page = await client.models.list();
for (const m of page.data) {
console.log(m.id, m.display_name);
}Response
{
"data": [
{
"id": "claude-opus-4-7",
"type": "model",
"display_name": "claude-opus-4-7",
"created_at": "2021-07-20T00:00:00Z"
},
{
"id": "claude-sonnet-4-6",
"type": "model",
"display_name": "claude-sonnet-4-6",
"created_at": "2021-07-20T00:00:00Z"
}
],
"first_id": "claude-opus-4-7",
"has_more": false,
"last_id": "claude-sonnet-4-6"
}
Anthropic-shape differences vs upstream
The four top-level keys (data, first_id, has_more, last_id) match Anthropic's official response. The per-model object is intentionally minimal:
| Field | BUZZ | Upstream Anthropic |
|---|---|---|
| id | yes | yes |
| type | yes (always "model") | yes |
| display_name | yes — set equal to id | yes — human-readable |
| created_at | yes — defaults to 1626777600 (2021-07-20) | yes — true release timestamp |
| capabilities | not returned | returned (batch / citations / thinking / effort) |
| max_input_tokens | not returned | returned |
| max_tokens | not returned | returned |
has_more is hard-coded to false. BUZZ does not honour after_id, before_id, or limit query parameters — you always get the full list available to your token in one response. If you need richer model metadata (max tokens, capability flags), call Anthropic directly or hard-code it client-side.
Example — Gemini shape
If your tooling presents a Gemini key (x-goog-api-key or ?key=), the response uses a Gemini-style envelope. For Gemini-flavored model listing, use GET /v1beta/models; for a single-model lookup, use GET /v1/models/{id}. Note: bare /v1/models does not accept ?key= or x-goog-api-key — it returns 401.
curl "https://buzzai.cc/v1beta/models?key=$BUZZ_API_KEY"
{
"models": [
{"name": "...", "displayName": "...", "...": "..."}
],
"nextPageToken": null
}
Common model IDs
The actual list returned to your token is dynamic — it depends on your group, token-level model limits, and which channels are enabled in the BUZZ admin console. There is no static global list. The IDs below are the Claude model identifiers BUZZ commonly serves; submit any of them to /v1/messages or /v1/chat/completions if your token has access.
| Model ID | Family |
|---|---|
| claude-opus-4-7 | Opus 4.7 (alias) |
| claude-opus-4-6 | Opus 4.6 (alias) |
| claude-opus-4-5-20251101 | Opus 4.5 (dated) |
| claude-sonnet-4-6 | Sonnet 4.6 (alias) |
| claude-sonnet-4-5-20250929 | Sonnet 4.5 (dated) |
| claude-haiku-4-5-20251001 | Haiku 4.5 (dated) |
Always pull the live list from GET /v1/models at startup rather than hard-coding — your account's group and your token's allow-list determine what is actually selectable.
Retrieve a single model
The companion route returns metadata for one model ID. Authentication and shape selection are identical to the list endpoint.
Path parameters
| Name | Type | Description |
|---|---|---|
| model_id | string | The model identifier, e.g. claude-haiku-4-5-20251001. |
Examples
curl https://buzzai.cc/v1/models/claude-haiku-4-5-20251001 \
-H "Authorization: Bearer $BUZZ_API_KEY"from anthropic import Anthropic
client = Anthropic(
base_url="https://buzzai.cc",
api_key="",
)
model = client.models.retrieve("claude-haiku-4-5-20251001")
print(model.id, model.display_name) import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic({
baseURL: "https://buzzai.cc",
apiKey: process.env.BUZZ_API_KEY,
});
const model = await client.models.retrieve("claude-haiku-4-5-20251001");
console.log(model.id, model.display_name);Alternative listing paths
Two dedicated paths bypass header sniffing if you want a fixed shape:
| Path | Always returns |
|---|---|
GET /v1beta/openai/models | OpenAI shape |
GET /v1beta/models | Gemini shape |
All these routes use the same TokenAuth middleware. Authorization: Bearer and x-api-key are accepted on every path. x-goog-api-key and ?key= are accepted only on /v1beta/models, /v1beta/openai/models, and /v1/models/{id}.
Errors
| HTTP | error.type | Typical cause |
|---|---|---|
| 401 | buzz_error | Missing or invalid token. Body: {"error":{"type":"buzz_error","message":"Invalid token (request id: ...)"}} |
| 403 | permission_error | Token lacks permission, IP not allow-listed |
| 429 | rate_limit_error | Rate limit hit; respect retry-after |
| 500 | api_error | Internal error; retry with backoff |
The DELETE /v1/models/{model_id} route from upstream Anthropic is intentionally not implemented and returns a not-implemented response — model lifecycle is managed in the BUZZ admin console rather than per-token.
See also
POST /v1/messages— submit a model ID to the Anthropic-shape endpointPOST /v1/chat/completions— OpenAI-compatible alternative- Authentication guide
- Error handling