Your First Jev Call: A 5-Minute Quickstart
Last checked · Independent guide, not affiliated with TypeSafe AI
Set TYPESAFE_API_KEY, then POST to https://api.typesafe.ai/v1/systemone with a model (jev-1.13.0), a state (the text to judge) and one or more typed questions. The response contains one answer per question, such as a noul probability between 0 and 1, plus token usage. The whole round trip took about 300 to 550 ms in our tests.
This walkthrough uses TypeSafe’s own API. Every snippet below was run against jev-1.13.0 on September 19, 2026. If you are calling Jev through OpenRouter, Vercel or Cloudflare instead, the idea is the same but the endpoint and model name change; see Jev channels compared.
Before you start
Section titled “Before you start”You need a TypeSafe account that has been let in from the waitlist, and an API key from the console. If you do not have one yet, see How to get a Jev API key. Then put the key in your environment:
export TYPESAFE_API_KEY="paste-your-key-here"Step 1: Ask one yes/no question
Section titled “Step 1: Ask one yes/no question”A Jev request has three parts: the model, the state (the text you want judged) and questions. Start with a single Noul, Jev’s yes/no question type.
curl -s https://api.typesafe.ai/v1/systemone \ -H "Authorization: Bearer $TYPESAFE_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "jev-1.13.0", "state": "Hi, can you help me reset my password? The reset email never arrives.", "questions": { "needs_access_help": { "type": "noul", "instructions": "Is the user asking for help getting into their account?" } } }'# pip install typesafe-sdkfrom typesafe_sdk import Noul, TypeSafeClient
client = TypeSafeClient(model="jev-1.13.0")
response = client.system_one( state="Hi, can you help me reset my password? The reset email never arrives.", questions={ "needs_access_help": Noul( instructions="Is the user asking for help getting into their account?" ) },)print(response.answers["needs_access_help"].noul)// npm install @typesafe-ai/sdkimport { TypeSafeClient, noul } from '@typesafe-ai/sdk';
const client = new TypeSafeClient({ defaultModel: 'jev-1.13.0' });
const response = await client.systemOne({ state: 'Hi, can you help me reset my password? The reset email never arrives.', questions: { needsAccessHelp: noul('Is the user asking for help getting into their account?'), },});console.log(response.answers.needsAccessHelp.noul);Step 2: Read the response
Section titled “Step 2: Read the response”With curl you get the raw JSON. It has this shape:
{ "model": "jev-1.13.0", "answers": { "needs_access_help": { "type": "noul", "noul": 0.99 } }, "usage": { "input_tokens": 287, "output_tokens": 20 }}answersholds one entry per question, under the ID you chose.noulis the probability that the answer is yes. 0.99 is a confident yes.usage.input_tokensis what you pay for: at $0.042 per million tokens, this call cost about $0.000012. Output tokens are free.modelshows the exact version that answered.
Step 3: Ask several questions at once
Section titled “Step 3: Ask several questions at once”Jev answers every question in a request in parallel, so adding questions barely changes the response time. Mix the three types:
{ "model": "jev-1.13.0", "state": "My invoice lists two seats, but only one of us can sign in, and the login page keeps timing out.", "questions": { "is_bug": { "type": "noul", "instructions": "Does the customer describe something not working?" }, "queue": { "type": "choice", "instructions": "Which team should handle this message?", "criteria": { "billing": "Charges, invoices, seats on the bill", "technical": "Bugs, outages, login problems", "other": null } }, "urgency": { "type": "score", "instructions": "How urgent is this message?", "criteria": ["Can wait a week", "This week", "Today"] } }}In our run, Jev returned is_bug 0.98, queue = technical with confidence 0.94, and urgency 1.83 on the 0 to 2 scale, meaning close to “Today”. A Choice returns the winning option plus a probability for every option; a Score returns a position that can fall between levels. See Choice and Score.
Step 4: Use the answer in code
Section titled “Step 4: Use the answer in code”The point of Jev is that the answers go straight into logic, with no parsing:
answers = response.answersif answers["queue"].confidence < 0.6: send_to_human(ticket)elif answers["queue"].choice == "technical" and answers["urgency"].score > 1.5: page_on_call_engineer(ticket)else: assign(ticket, team=answers["queue"].choice)Thresholds like 0.6 and 1.5 are yours to choose. Start conservative and adjust after checking real examples; see Confidence.
If something goes wrong
Section titled “If something goes wrong”| You see | Fix |
|---|---|
| 401 “Cannot authenticate with the server” | Check the key. Details |
| 403 “Must supply an API key!” | The Authorization header is missing. Details |
| 400 “Unknown model: jev-1.13” | Use jev-1.13.0 or jev-latest. Details |
| 422 “Field required” | A field such as model or a Choice’s criteria is missing. Details |
Next steps
Section titled “Next steps”- SDK details: Python and JavaScript
- How to write better questions: Noul, Choice, Score, State
- What it costs at scale: Jev pricing