Skip to content

Your First Jev Call: A 5-Minute Quickstart

Last checked · Independent guide, not affiliated with TypeSafe AI

ANSWER

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.

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:

Terminal window
export TYPESAFE_API_KEY="paste-your-key-here"

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.

Terminal window
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?"
}
}
}'

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 }
}
  • answers holds one entry per question, under the ID you chose.
  • noul is the probability that the answer is yes. 0.99 is a confident yes.
  • usage.input_tokens is what you pay for: at $0.042 per million tokens, this call cost about $0.000012. Output tokens are free.
  • model shows the exact version that answered.

Jev answers every question in a request in parallel, so adding questions barely changes the response time. Mix the three types:

Request body
{
"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.

The point of Jev is that the answers go straight into logic, with no parsing:

answers = response.answers
if 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.

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

Sources

  1. Quick start (TypeSafe docs)
  2. API reference (TypeSafe docs)
  3. Python SDK (TypeSafe docs)
  4. JavaScript SDK (TypeSafe docs)