API hub

Fields in, a decision out.

Five presets build the questions for you. The sixth is the native call. All of them require your TypeSafe key and all of them hit api.typesafe.ai.

curl -sS https://jevai.ai/api/v1/decisions/tool-guard \
  -H "Authorization: Bearer $TYPESAFE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"tool_name":"refund_charge","arguments":"{\"amount_usd\":240}","purpose":"Duplicate charge"}'
WhenRESTMCP
Before a consequential tool callPOST /api/v1/decisions/tool-guardjev_guard_tool_call
Choose among models you can invokePOST /api/v1/decisions/model-routejev_route_model
Fast, deep, split, or blockPOST /api/v1/decisions/routejev_route_task
Evidence versus one claimPOST /api/v1/decisions/researchjev_check_research
Is the objective actually done?POST /api/v1/decisions/completionjev_review_completion
Your own questionsPOST /api/v1/decisionsjev_decide

Bodies

tool-guard

tool_name, arguments (string or object), purpose, optional stakes. Answer action is allow, confirm, review, or deny.

model-route

task, models as [{ "id", "notes" }] (2–40), optional stakes and constraints.

route

task, optional context and stakes.

research

claim and evidence. Nothing is fetched for you.

completion

objective and work (the report you are about to trust).

decisions

state, questions, optional model. Same shape as the official systemone body. Only Jev model ids are accepted.

Every response includes meta.questions so the compiled prompt is visible. Upstream errors from TypeSafe are passed through with their status code.

tool-guard, in full

{
  "tool_name": "refund_charge",
  "arguments": { "charge_id": "ch_104", "amount_usd": 240 },
  "purpose": "Customer says the charge was duplicated.",
  "stakes": "Sends money. Over $100 needs a person."
}

You get answers.action (allow, confirm, review, deny), answers.consequential (noul), and answers.risk (score from easy-to-undo up to irreversible). arguments may be a string if you already serialized them. The compiled questions are echoed under meta.questions so you can see the rubric.

model-route

{
  "task": "Classify this refund email into a queue.",
  "models": [
    { "id": "small-fast", "notes": "Cheap, no long reasoning" },
    { "id": "reasoner", "notes": "Slow, stronger on ambiguous policy" }
  ],
  "constraints": "Only models this process can actually call."
}

Two to forty candidates. The choice is one of the ids you sent. needs_deeper_model is a separate noul, so a low-confidence pick can still tell you the task wants the slow model.

route, research, completion

route wants task and optional context and stakes. The choice is proceed_fast, deep_review, split_task, or block. There is also an ambiguity noul and a risk score.

research wants claim and evidence. Verdicts are supported, mixed, unsupported, or insufficient. on_topic tells you whether the passage is even about the claim. If you needed a web search, do that before this call.

completion wants objective and work. Status is complete, partial, not_done, or blocked. claims_match is low when the write-up boasts past what the work describes. Report done only on complete.

Native decisions

POST /api/v1/decisions and POST /api/v1/systemone are the same door. Send state and questions in the official shape. One to twenty-four questions. Choice options are capped at 40 on this proxy so a playground mistake cannot fan out to the model’s full 255 by accident. Score levels stay at 2–10. The playground builds this body for you and shows it before you spend the call.

Status codes