What access looks like right now
Jev is a closed managed API that anyone can sign up for. It launched on 15 September 2026 behind a waitlist, and TypeSafe removed the waitlist on 20 September, posting on X that “Jev is now available to everyone. No waitlist.”
The weights are not released. There is no self-hosted build and no on-prem option. If your requirement is that the model runs inside your own network, Jev does not meet it today.
Sign up
Sign in at https://console.typesafe.ai with Google or an email code. There is no approval step.
The docs are fully public too, including all three primitive pages, the four pattern pages and eighteen cookbooks. Design the state and questions for your workload before you write code, because that design is most of the work: which content goes into the state, how the judgment splits into narrow questions, and where the confidence thresholds sit. The build guide covers those decisions.
Create an API key
Keys live in the console at https://console.typesafe.ai/settings/keys.
Both SDKs read the key from an environment variable:
export TYPESAFE_API_KEY="your-key-here"
If you construct the client with no arguments, it picks the key up from there. Keep it out of source control and out of client-side code; this is a server-side credential and a leaked key bills to your account.
Install an SDK
Python, which needs 3.10 or newer:
pip install typesafe-sdk
Node, which needs 20 or newer:
npm install @typesafe-ai/sdk
Both packages were at v0.6.0 as of 18 September 2026. Pin the version. A 0.x SDK for a model that launched three days ago will move.
Make a first call
The Python quickstart triages a support ticket with all three question types in one request.
from typesafe_sdk import Choice, Noul, Score, TypeSafeClient
client = TypeSafeClient()
ticket = "Hi, I've been trying to connect my Stripe account for 3 days and it keeps failing. I'm losing sales. Please help ASAP."
response = client.system_one(
state=ticket,
questions={
"department": Choice(
instructions="Which team should handle this",
criteria={
"billing": "Payment or subscription issues",
"technical": "Bugs or integration problems",
"sales": "Pricing or account questions",
},
),
"frustration": Score(
instructions="How frustrated the customer appears",
criteria=[
"Calm, just stating facts",
"Frustrated but civil",
"Very angry, strong language",
],
),
"is_urgent": Noul(
instructions="The message conveys urgency or time-sensitivity",
),
},
)
Three questions, one call, evaluated in parallel. response.answers["department"].choice gives the option name, .confidence the number your code thresholds on.
The TypeScript equivalent uses a helper function per question type:
import { choice, TypeSafeClient } from "@typesafe-ai/sdk";
const client = new TypeSafeClient();
const response = await client.systemOne({
state: { document: "I was charged twice. Please fix this ASAP." },
questions: {
category: choice("What is this ticket about?", {
billing: null,
technical: null,
other: null,
}),
},
});
console.log(response.answers.category.choice);
Note the other option. TypeSafe’s Choice docs recommend including one whenever your taxonomy might not cover every input, and the primitives guide explains why leaving it out distorts the distribution.
Or call the API directly
The endpoint is POST https://api.typesafe.ai/v1/systemone with an Authorization: Bearer header.
curl https://api.typesafe.ai/v1/systemone \
-H "Authorization: Bearer $TYPESAFE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"state": "Help! My payouts have been failing for 3 days.",
"model": "jev-latest",
"questions": {
"is_urgent": {
"type": "noul",
"instructions": "Does this convey urgency?",
"criteria": {
"true": "Explicitly time-sensitive",
"false": "No urgency expressed"
}
}
}
}'
The response carries the answers plus a usage block:
{
"model": "jev-latest",
"answers": {
"is_urgent": { "type": "noul", "noul": 0.92 }
},
"usage": { "input_tokens": 312, "output_tokens": 48 }
}
Output tokens appear in usage but bill at $0. Input is $0.042 per million, so the call above costs about a hundred-thousandth of a cent. Cost estimation has a worked example at real volumes.
Handle the errors you will actually hit
Both SDKs ship typed error classes rather than a single generic exception, and the two worth branching on early are authentication failures and rate limiting. A bad or missing key raises an authentication error; exceeding 40 requests per second or 100,000 tokens per second raises a rate limit error. Connection and timeout errors get their own classes too, and the Python SDK documents a retry policy you can configure rather than writing your own backoff loop.
Catch the rate limit case separately from everything else. A triage pipeline that retries a transient 429 and drops a malformed request is behaving correctly; one that treats both the same way will silently reprocess work or silently lose it.
Pin the version
jev-preview resolves to jev-1.14.0, released on 14 October 2026. jev-latest resolves to jev-1.13.0 until about 21 October 2026, when it moves to 1.14.0 (what changes in Jev 1.14). Passing "model": "jev-1.13.0" explicitly is the safer default for anything running in production, for two reasons: your thresholds stay tuned to one model, and TypeSafe’s per-version weakness page stays accurate for what you are actually calling.
Before you ship
Check the limits against your workload. 64k tokens total per request, 32k for state plus the longest question, 40 requests per second, 100,000 tokens per second as of 30 September 2026. Text by default, as a string, a JSON object, or an array of text values. PNG and JPEG images work on 1.13 and 1.14 only when you send the TypeSafe-Danger-Zone-Images: true header, and TypeSafe says that feature is not ready for production.
Then read the jaggedness page for version 1.13 and treat it as a design document. Counting, arithmetic and date comparison stay in your code. Anything user-supplied that reaches the state wants a prompt injection screen first, because the docs are explicit that “state is data, and jev-1.13 does not treat it as hostile by default.”
FAQ
Is there still a Jev waitlist?
No. TypeSafe removed it on 20 September 2026, five days after launch, posting that Jev is now available to everyone. Anyone can sign in to the console at console.typesafe.ai with Google or an email code and create an API key straight away.
Where do I get a Jev API key?
From the TypeSafe console at console.typesafe.ai/settings/keys. Both official SDKs read the key from the TYPESAFE_API_KEY environment variable, so a client constructed with no arguments picks it up automatically. The raw HTTP API takes the same key as an Authorization: Bearer header instead.
Can I run Jev locally?
No. TypeSafe has not released the weights and offers no self-hosted build. Community projects such as openjev and open-jev reproduce the interface on top of other open models, but they are not Jev and do not use TypeSafe’s training method.
Which SDK should I use?
Use whichever matches the service you are adding this to. The Python package is typesafe-sdk and needs Python 3.10 or newer; the JavaScript package is @typesafe-ai/sdk and needs Node.js 20 or newer. Both sat at v0.6.0 on 18 September 2026, so pin the version rather than tracking the range.
Do I need an SDK at all?
No. The API is one POST to https://api.typesafe.ai/v1/systemone with a JSON body containing state, model and questions. The SDKs mainly give you typed question builders and typed responses, which is worth having in a typed codebase and skippable in a quick script.