Skip to main content
Ottili AI API

Ottili AI API — Models & availability

How model routing and model availability work on the public, OpenAI-compatible Ottili AI API, and how to list models available to your company and plan.

The Ottili AI API selects models through a routing layer rather than forcing you

to pin a single provider model. This keeps your integration stable while Ottili

swaps underlying providers for price, quality and region.

The full model-line, versioning and capability matrix are part of the public API contract documented in this reference. This page is the fastest path to listing and selecting models on the public surface.

Selecting a model

Every generation request accepts a model field:

{ "model": "ottili/auto" }
  • ottili/vale-1.2 — efficient, cheap, everyday coding (DeepSeek V4 Flash).
  • ottili/cairn-1.2 — premium, agentic, larger repo work (DeepSeek V4 Pro).
  • ottili/auto — the adaptive router picks Vale↔Cairn per request, plan and availability.
  • A specific public id — pins to that model when it is available to your company.

If a pinned model is unknown, legacy (helix), or reserved (spire), the API

returns model_not_found (HTTP 404) — fail-closed, never a silent paid

downgrade.

Listing available models

Model availability is entitlement- and region-scoped. Query the live model list

to see what your company can use:

curl "https://api.ai.ottili.one/v1/models" \
  -H "Authorization: Bearer otk_live_xxx"

Tenant context is resolved from the API key — you do not* send

X-Platform-Company or any company_id header (raw company-ID headers

are ignored on the public surface).

Each model describes its capabilities (OpenAI-compatible id/owned_by/

pricing plus Ottili extensions supports_streaming/supports_tools/

supports_json_mode/tier/lifecycle_status/capabilities):

{
  "object": "list",
  "data": [
    {
      "id": "ottili/vale-1.2",
      "object": "model",
      "owned_by": "ottili",
      "context_length": 1000000,
      "pricing": { "prompt": "0.000000200", "completion": "0.000000400" },
      "supports_streaming": true,
      "supports_tools": true,
      "supports_json_mode": true,
      "tier": "fast",
      "lifecycle_status": "active",
      "capabilities": { "streaming": true, "tools": true, "json_schema": true, "reasoning": false }
    }
  ]
}

owned_by is always ottili — no provider name or upstream slug is ever

serialized (provider isolation). Pricing is the current PRICING_VERSION

configuration, never a hard-coded "final" retail price.

Availability states

StateMeaning
activeGenerally available to eligible companies.
deprecatedStill served but scheduled for retirement; a deprecation warning is surfaced.
reservedAnnounced but not yet enabled (e.g. ottili/spire-1.2); not served and not dispatchable.

Availability depends on your plan, remaining credits and region. Treat

lifecycle_status as advisory and always handle the not-available error case

(model_not_found, HTTP 404).

Capability flags

Check capabilities before relying on a feature. Not every model supports

tool calls or structured outputs. The errors reference explains the code returned

when a requested capability is unsupported (capability_unsupported, HTTP 400).

Was this article helpful?