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 (or the alias ~typesafe/jev-latest). Call it through the alpha Decisions endpoint, POST https://openrouter.ai/api/alpha/decisions, or through the TypeSafe-compatible POST https://openrouter.ai/api/v1/systemone, 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); alias ~typesafe/jev-latest follows the newest Jev |
| Endpoints | POST https://openrouter.ai/api/alpha/decisions (OpenRouter’s format, alpha); POST https://openrouter.ai/api/v1/systemone (TypeSafe’s format) |
| 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. By default that list covers models that produce text; Jev’s output type is decisions. Add a filter to see it: GET /api/v1/models?output_modalities=decisions returns both typesafe/jev-1.13 and ~typesafe/jev-latest. Do not send Jev requests 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.
Using TypeSafe’s official SDK with OpenRouter
Section titled “Using TypeSafe’s official SDK with OpenRouter”OpenRouter also accepts TypeSafe’s own request and response format at POST https://openrouter.ai/api/v1/systemone. TypeSafe’s Python SDK documentation shows how to use it: set the base URL to https://openrouter.ai/api (or the environment variable TYPESAFE_BASE_URL), pass your OpenRouter key, and use the model ~typesafe/jev-latest.
import os
from typesafe_sdk import Noul, TypeSafeClient
with TypeSafeClient( api_key=os.environ["OPENROUTER_API_KEY"], base_url="https://openrouter.ai/api", model="~typesafe/jev-latest",) as client: result = client.system_one( "I was charged twice.", {"billing": Noul(instructions="Is this about billing?")}, ) print(result.nouls["billing"].noul)The rest of your code stays the same as on TypeSafe’s API, which makes this the easiest way to start on OpenRouter and move to TypeSafe later. The SDK’s model-listing call does not work against OpenRouter. We confirmed on September 25, 2026 that the route exists (it returns 401 without a key); we have not yet sent a paid request through it.
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 work against OpenRouter’s
/api/v1/systemoneroute with a changed base URL, as shown above. OpenRouter’s own SDKs use the Decisions endpoint.
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 Decisions endpoint exists (an unauthenticated POST returns 401 rather than 404). The response details above come from OpenRouter’s reference rather than our own logs, because we have not run paid calls through OpenRouter.
When OpenRouter is the right choice
Section titled “When OpenRouter is the right choice”OpenRouter is the quickest way to use Jev while TypeSafe’s own signups are paused: 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.