WebikAI exposes one OpenAI-compatible endpoint that reaches every catalog model — Anthropic's included. Point any compatible client at it and switch the model to a WebikAI alias.
wk_live_… key (shown once).{
"openai": {
"baseURL": "https://gateway.webik.ai/v1",
"apiKey": "wk_live_...",
"model": "auto/code"
}
}Step-by-step setup per tool:
opencode.json| auto | Smart router passthrough when your policy allows it |
| auto/smart | Explicit smart-router lane; the response body names the model it picked |
| auto/code | Coding route ranked under your policy |
| auto/frontier | Premium frontier route under your policy |
| auto/cheap | Aggressively minimize cost |
| auto/vision | Multimodal — image or document input |
| auto/chat | Balanced general-purpose chat |
| z-ai/glm-5.2 | Pin an exact model (OpenRouter-style slug) |
| anthropic/claude-opus-4.8 | Pin a premium frontier model |
| deepseek/deepseek-v4-flash | Pin a commodity high-throughput model |
Every response carries five x-webik-* headers: x-webik-request-id, x-webik-model (what actually served it), x-webik-provider, x-webik-credential (byok/managed), and x-webik-fallback. The dashboard shows the same per request, with the routing reason
and estimated vs. actual cost.
curl -si https://gateway.webik.ai/v1/chat/completions \
-H "Authorization: Bearer wk_live_..." -H "Content-Type: application/json" \
-d '{"model":"auto/code","messages":[{"role":"user","content":"hi"}]}' | grep x-webik
x-webik-request-id: 0193e5c2-…
x-webik-model: z-ai/glm-5.2
x-webik-provider: zai
x-webik-credential: managed
x-webik-fallback: falseDefault logging is metadata-only: model, provider, tokens, latency, cost,
success — not prompt/response bodies. BYOK provider keys are stored envelope-encrypted and
decrypted only in memory at request time; they never appear in logs. What leaves WebikAI is
exactly your request to the provider you (or your policy) chose — check each provider's own
retention terms, which we surface as the endpoint's data-policy flag; endpoints with unknown policy never satisfy a zero-retention requirement.
Wallet requests reserve the worst-case cost first (your max_tokens bounds it — we
set a default if you don't), call the provider, then settle to actual usage and refund the
difference. Missing usage on a stream settles the estimate, flagged estimated.
Per-key/client/project caps deny before forwarding — two concurrent requests cannot jointly
exceed a cap. Client retries with an Idempotency-Key header are served once and charged
once.
Two sources: deterministic probe suites run daily at temperature 0 and scored pass/fail, plus rolling error rates and latency from real traffic through the gateway. Scores are published with sample sizes and confidence intervals, and a provider whose scores regress against its own trailing history is ranked lower automatically. Current public suites: JSON, schema, math, tool-formation, deterministic coding, and legitimate-task completion. Sample sizes are shown next to every score. Full methodology, detection limits, and live scores are on the benchmarks page.
Everything the benchmarks and catalog pages render is also published as JSON — no auth, no key. Free for dashboards, bots, and research; attribute webik.ai.
GET /api/public/benchmarks — per-model provider scores: models[].providers[] with n, insufficient_data, webik_pick, live latency_p50_ms/error_rate/throughput_tps, last_event, and (at sufficient samples) Wilson-interval overall and per-lane scores; plus min_n.GET /api/public/benchmarks/events?limit= — the change log: events[] with model, provider, kind (regression/recovery), delta_pp, n, summary, occurred_at. limit 1–200, default 50.GET /api/public/benchmarks/leaders — current route leaders: leaders[] per lane with alias, model, provider, quality_low, n, price_out_per_mtok, since; plus value_leader and min_n.GET /api/public/catalog — the model catalog: models[] with class,
context length, capability flags, provider count, and beta quality score; plus aliases[] with default profiles.curl -s https://webik.ai/api/public/benchmarks/leaders | jq '.leaders[0]'Responses are cached (cache-control: public, s-maxage=600, max-age=60), so polling
faster than the cache window just returns the same data. Providers below min_n pooled samples publish insufficient_data: true instead of a score
— we don't publish numbers we can't stand behind.