Jev on OpenRouter: Model typesafe/jev-1.13
Last checked · Independent guide, not affiliated with TypeSafe AI
On OpenRouter, Jev is the model typesafe/jev-1.13 and is called through a separate alpha endpoint, POST https://openrouter.ai/api/alpha/decisions, not the chat completions API. It costs $0.042 per million input tokens with free output, has a 32,000-token context window and needs prepaid credits.
OpenRouter added Jev on September 18, 2026, three days after TypeSafe’s launch. Because Jev returns decisions rather than text, OpenRouter serves it through a dedicated Decisions endpoint that is still marked alpha.
At a glance
Section titled “At a glance”| Item | Value |
|---|---|
| Model | typesafe/jev-1.13 (provider: TypeSafe) |
| Endpoint | POST https://openrouter.ai/api/alpha/decisions |
| Auth | Authorization: Bearer <OpenRouter key> |
| Price | $0.042 per 1M input tokens, $0 per 1M output tokens |
| Context window | 32,000 tokens |
| Free tier | None for Jev; you need credits on the account |
| Question types | noul, choice, score (same names as TypeSafe) |
Why Jev is “missing” from the models list
Section titled “Why Jev is “missing” from the models list”If you query GET /api/v1/models, Jev does not appear. That list covers models that produce text; Jev’s output type is decisions. Find it on OpenRouter’s model page or its TypeSafe provider page instead, and do not send it to /api/v1/chat/completions.
Request format
Section titled “Request format”The body is almost the same as on TypeSafe’s own API: model, state and a questions map. This example follows OpenRouter’s API reference:
curl -s https://openrouter.ai/api/alpha/decisions \ -H "Authorization: Bearer $OPENROUTER_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "typesafe/jev-1.13", "state": { "message": "My invoice lists two seats, but only one of us can sign in, and the login page keeps timing out.", "plan": "team" }, "questions": { "queue": { "type": "choice", "instructions": "Which team should handle this message?", "criteria": { "billing": "Charges, invoices, refunds, seats on the bill", "technical": "Bugs, outages, login problems, integrations", "other": "Anything else" } }, "angry": { "type": "noul", "instructions": "Is the customer angry?" } } }'According to OpenRouter’s API reference, the response carries the same answers object you get from TypeSafe, plus a few OpenRouter fields:
| Field | What it holds |
|---|---|
answers |
One typed answer per question: noul; choice with probabilities and confidence; score with legend, probabilities and confidence |
id |
A generation ID starting with gen-dec- |
model |
The dated version that answered, for example typesafe/jev-1.13-20260917 |
provider |
TypeSafe |
usage |
input_tokens, output_tokens and cost in dollars |
The usage.cost field is handy: in OpenRouter’s documented example, 476 input tokens cost $0.000019992, exactly 476 × $0.042 per million.
OpenRouter’s official TypeScript, Python and Go SDKs expose the same call under an Alpha.Decisions section.
Differences from TypeSafe’s own API
Section titled “Differences from TypeSafe’s own API”- Context: 32,000 tokens on OpenRouter versus 64k per request on TypeSafe. In practice TypeSafe also caps the state plus the longest question at 32k, so large states hit a limit either way.
- Model naming:
typesafe/jev-1.13here;jev-1.13.0orjev-lateston TypeSafe. The OpenRouter name will not work on TypeSafe, and TypeSafe rejectsjev-1.13without the patch number. - Errors: OpenRouter wraps errors as
{"error": {"code": ..., "message": ...}}instead of TypeSafe’s{"detail": ...}. - SDKs: TypeSafe’s official SDKs point at TypeSafe’s API. To use OpenRouter from Python or JavaScript, use OpenRouter’s SDKs or plain HTTP.
Errors you are likely to see
Section titled “Errors you are likely to see”| HTTP | Message | What to do |
|---|---|---|
| 401 | “No cookie auth credentials found” (what we got with no header) or “Missing Authentication header” (documented) | Send Authorization: Bearer <key> |
| 402 | “Insufficient credits. Add more using https://openrouter.ai/credits” | Top up the account. See 402 Insufficient credits |
| 400 | “Invalid request parameters” | Check type, criteria and the model name |
| 413 | “Request payload too large” | Shrink the state |
| 429 | “Rate limit exceeded” | Back off and retry. See 429 |
We confirmed on September 19, 2026 that the endpoint exists (an unauthenticated POST returns 401 rather than 404). We have not yet run paid calls through OpenRouter, so the response details above come from OpenRouter’s reference rather than our own logs.
When OpenRouter is the right choice
Section titled “When OpenRouter is the right choice”OpenRouter is the quickest way to try Jev if your TypeSafe account is still on the waitlist: add credits and send the request above. If you already use OpenRouter for your LLM calls, it also keeps billing in one place. For long-term production use, compare it with the other channels, especially if you want the official SDKs or version pinning.