Models
Three model engines, the auto tiers, how to read the live catalogue, how to hear about new models automatically, and the models the owner has denied.
Engines
| Engine | Engine id | Models allowed | Typical speed | Best at |
|---|---|---|---|---|
| Gemini via Antigravity | agy |
Everything the engine lists: Gemini 3.1 Pro, Gemini 3.6/3.7/3.8 Flash, Claude Sonnet 4.6 and Claude Opus 4.6 (Thinking), GPT-OSS 120B | 40 to 95 s Pro, 5 to 20 s Flash | Pro-class reasoning, long documents, big batches |
| GPT via Codex | codex |
GPT-6.1 Sol (gpt-6.1-sol); GPT-6 Sol and Luna; GPT-5.6 Sol, Terra, Luna; GPT-5.5; GPT-5.3 Codex Spark; GPT-Reserve. Never GPT-6 Astra |
5 to 10 s | Fast structured text, JSON, classification, drafts |
| Claude | claude |
Opus 5.5, Opus 5, Sonnet 5.5, Haiku 4.5. The aliases opus, sonnet, haiku always point at the newest of each. Never Fable or Mythos |
5 to 15 s, long answers up to 90 s | Writing quality, grading, feedback, chats |
MaxiMind always pins the model on the CLI it drives, rotates the accounts of an engine and sidelines an account after a quota error. Quotas are shared across every surface and every user.
Choosing a model
- On
POST /api/ai/generate:enginesis the preference order andmodelsmaps each engine to an exact id from the catalogue. Omitenginesto use the key's own default chain (GET /api/ai/site-chain). - On
/v1/chat/completions:modelisengine/model, for exampleclaude/opus,codex/gpt-5.6-sol,agy/gemini-3.8-flash-high. An explicit pin rotates that engine's accounts but never switches engines. autouses the caller's configured engine chain.auto/proandauto/fastuse the catalogue's preference recipes within that chain. The reference site recipes are: pro = agy Gemini 3.1 Pro, then codex, then claude; fast = codex, then claude, then agy Gemini 3.8 Flash.- Unknown model ids on the OpenAI-compatible endpoint return 400.
Denied models
Anything the owner forbids is silently replaced by that engine's default. Currently denied:
| Engine | Denied | Resolves to |
|---|---|---|
codex |
anything "astra" (gpt-6-astra) |
gpt-5.6-sol |
claude |
anything "fable" or "mythos" | opus |
agy |
nothing | — |
Denied ids are omitted from /v1/models, /api/code/v1/models and the /models picker in MaxiMind Code.
List models live
The catalogue is the truth. The current catalogue below loads from MaxiMind when you open this page.
GET /api/ai/catalog
curl -s https://maximind.dev/api/ai/catalog -H "x-api-key: $MAXIMIND_API_KEY"
Returns engines, models (allowed and denied), defaults, tier recipes, attachment capability status and endpoints.
GET /v1/models
curl -s https://maximind.dev/v1/models -H "Authorization: Bearer $MAXIMIND_API_KEY"
Returns the allowed catalogue as OpenAI model objects with ids of the form engine/model. Astra, Fable and Mythos are omitted. created is the Unix time MaxiMind first saw the model (0 for models older than the change log), and x-maximind.points_to shows which exact model an alias such as claude/opus uses today. An automatically refreshed Markdown list is served at /docs/models.md.
Staying up to date
Providers release models often. MaxiMind checks every engine once a day at 03:17 Asia/Ho_Chi_Minh (20:17 UTC) and records every model that appears or disappears. The owner's rules are applied the moment a model is found, so a new model is usable (or blocked) the same day without anyone editing a list. Three ways to follow it:
- Use an alias.
claude/opus,claude/sonnetandclaude/haikumove to the newest model of their family by themselves.auto,auto/proandauto/fastpick for you. Pin an exact id only when you need reproducible output. - Poll the change feed. Public, no key needed, cached for five minutes. Poll it once a day and remember the last
idyou saw. - Register a webhook. MaxiMind calls your HTTPS endpoint as soon as a change is recorded.
GET /v1/models/changes
curl -s "https://maximind.dev/v1/models/changes?since=mc_1f0c2a9d8b7e6a5c"
since is an event id from this feed or an ISO-8601 time; omit it for the whole history. Events come oldest first.
{
"object": "list",
"data": [{
"id": "mc_…", "type": "models.updated",
"created_at": "2026-09-24T20:17:00Z", "created": 1790280000,
"added": ["claude/claude-opus-5-5"],
"available": ["claude/claude-opus-5-5"],
"blocked": [],
"removed": [],
"summary": "Claude Opus 5.5 appeared in the Claude client."
}],
"latest_event": "mc_…",
"last_checked_at": "2026-09-24T20:17:00Z",
"schedule": "checked daily at 03:17 Asia/Ho_Chi_Minh (20:17 UTC)"
}
available is what you can call now; blocked was discovered but is forbidden by the owner's rules; removed is no longer offered by the provider.
Webhooks
Webhooks belong to the API key (or signed-in account) that creates them; each key can register five.
curl -s https://maximind.dev/v1/webhooks -H "Authorization: Bearer $MAXIMIND_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://your-app.example/hooks/maximind", "events": ["models.updated"], "description": "Ledoly"}'
The response contains secret (whsec_…) once — store it. Other calls:
| Call | Does |
|---|---|
GET /v1/webhooks |
your webhooks, with the last delivery status and error |
POST /v1/webhooks/{id}/test |
sends a ping now and returns what your server answered |
POST /v1/webhooks/{id}/rotate-secret |
new secret; also re-enables a disabled webhook |
DELETE /v1/webhooks/{id} |
removes it |
Each delivery is a POST with a JSON body {"id", "type", "created_at", "event", "docs"} where event is exactly one feed event, and these headers:
| Header | Value |
|---|---|
X-MaxiMind-Event |
models.updated or ping |
X-MaxiMind-Delivery |
unique delivery id (use it to ignore duplicates) |
X-MaxiMind-Timestamp |
Unix seconds when it was signed |
X-MaxiMind-Signature |
sha256= + HMAC-SHA256 of "<timestamp>.<raw body>" with your secret |
Answer with any 2xx within 10 seconds. Anything else is retried with growing gaps (1 minute up to 6 hours) and later events wait so they arrive in order; after 50 failures in a row the webhook is disabled until you rotate its secret. Endpoints must be public https addresses; MaxiMind does not follow redirects.
Verify the signature (Python)
import hashlib, hmac, time
def is_from_maximind(raw_body: bytes, headers, secret: str) -> bool:
stamp = headers["X-MaxiMind-Timestamp"]
if abs(time.time() - int(stamp)) > 300: # refuse replays older than five minutes
return False
expected = hmac.new(secret.encode(), stamp.encode() + b"." + raw_body, hashlib.sha256).hexdigest()
return hmac.compare_digest("sha256=" + expected, headers["X-MaxiMind-Signature"])
Verify the signature (Node)
import crypto from "node:crypto";
export function isFromMaxiMind(rawBody, headers, secret) {
const stamp = headers["x-maximind-timestamp"];
if (Math.abs(Date.now() / 1000 - Number(stamp)) > 300) return false;
const expected = "sha256=" + crypto.createHmac("sha256", secret).update(`${stamp}.`).update(rawBody).digest("hex");
const given = headers["x-maximind-signature"] || "";
return given.length === expected.length && crypto.timingSafeEqual(Buffer.from(given), Buffer.from(expected));
}
Sign over the raw request bytes, not re-serialised JSON.
Current catalogue
This list is generated from MaxiMind's live model catalogue and loads whenever you open this page. It includes the current model ids, aliases and defaults for Claude, Codex and Antigravity. Reload to fetch the latest list, or read the catalogue Markdown directly. See What's new for recent model and provider CLI updates.
Images
Withheld on every surface. GET /api/ai/image/models returns {"ok":true,"models":[]}. See Images.