Beginner12 minfree

What You're Actually Calling

One endpoint, three primitives, zero strings out. Build a request payload piece by piece and watch the JSON assemble.

Every Jev request is the same shape. You send a state, a model, and a map of questions. You get back one answer per question, plus a usage record. There is no conversation, no system prompt, and no streaming, because there is nothing to stream: the model does not produce text.

POST https://api.typesafe.ai/v1/systemone
Authorization: Bearer $TYPESAFE_API_KEY
Content-Type: application/json

The question keys are yours. They are never sent to the model and play no part in inference, so name them for the code that will branch on them, not for the model’s benefit.

Build one

The builder below assembles a real payload as you type. Change the state, add a question, switch a primitive, and watch the JSON on the right. It also lints against the failure modes TypeSafe documents, so you will see warnings for things like hidden compound questions or asking the model to count.

Interactive

Question builder

looks good

match statement · returns choice + probabilities + confidence

sort key · returns an expectation, which can land between levels

if statement · returns one 0–1 value, no confidence field

POST /v1/systemone
{
  "state": "Hi, I placed an order (#98423) last Thursday and was charged twice. I also can't log in after the site update, and adding Apple Pay would be really helpful. This is getting frustrating.",
  "model": "jev-1.13.0",
  "questions": {
    "category": {
      "type": "choice",
      "instructions": "Determine the broad category of this support ticket",
      "criteria": {
        "bug_report": "The user is reporting something that is broken or producing errors",
        "billing": "Charges, invoices, refunds, subscriptions",
        "feature_request": "The user is requesting new functionality",
        "account": "Login, permissions, profile, security"
      }
    },
    "frustration": {
      "type": "score",
      "instructions": "How frustrated the user appears",
      "criteria": [
        "Calm, matter-of-fact",
        "Frustrated but civil",
        "Very angry"
      ]
    },
    "refund_requested": {
      "type": "noul",
      "instructions": "The user is explicitly asking for a refund or credit"
    }
  }
}

Every question here is evaluated in parallel against the same state, so adding one barely moves your response time. That is what makes speculative fan-out cheap.

The response

Answers come back keyed exactly as you sent them. Each carries its type and the fields for that primitive.

{
  "model": "jev-1.13.0",
  "answers": {
    "category": {
      "type": "choice",
      "choice": "technical",
      "confidence": 0.78,
      "probabilities": { "technical": 0.85, "sales": 0.0, "billing": 0.15 }
    },
    "is_urgent": { "type": "noul", "noul": 1.0 }
  },
  "usage": { "input_tokens": 392, "output_tokens": 65 }
}

Note the model field. You sent jev-latest but the response tells you which version actually answered. Once you have tuned thresholds against a specific version, pin it.