# Decisions (Jev)

URL: https://bridge.wekoya.tech/docs/decisions
Updated: 2026-11-08

> Jev, by TypeSafe, does not write text. You give it something to look at (a message, a document, a record) and named questions about it, and it answers each…

Jev, by TypeSafe, does not write text. You give it something to look at (a message, a document, a record) and named questions about it, and it answers each one with a probability you can act on, usually in under a second. Use it to route support tickets, flag risky payments, grade answers or tag content, where a chat model would be slower, dearer and harder to parse. Send it to `POST /v1/decisions`, not to chat completions. A typical call costs about ₦0.03, from your Wekoya balance.

```
curl https://wekoya-api.wekoya.tech/v1/decisions \
  -H "Authorization: Bearer $WEKOYA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "jev-latest",
    "state": "Help! My payouts have been failing for 3 days and I am losing customers.",
    "questions": {
      "department": {
        "type": "choice",
        "instructions": "Which team should handle this?",
        "criteria": {
          "billing": "Payments, invoicing, refunds",
          "technical": "Bugs, outages, integrations",
          "sales": "Pricing, upgrades, new accounts"
        }
      },
      "urgent": { "type": "noul", "instructions": "Is this urgent?" },
      "frustration": {
        "type": "score",
        "instructions": "How frustrated is the customer?",
        "criteria": ["calm", "annoyed", "angry"]
      }
    }
  }'
```
Type | Ask with | You get back |
`choice` | `criteria`: each label and what it means (1 to 255 of them) | `choice`, its `confidence`, and a probability for every label |
`score` | `criteria`: 2 to 10 levels, lowest first | `score`, a weighted position from 0 (first level) up; `legend` maps each position to its level |
`noul` | Just `instructions`: a yes or no question | `noul`: the probability that the answer is yes, from 0 to 1 |

```
{
  "id": "dec_…",
  "object": "decision",
  "model": "jev-latest",
  "version": "jev-1.13.0",
  "answers": {
    "department": {
      "type": "choice",
      "choice": "billing",
      "confidence": 0.69,
      "probabilities": { "billing": 0.79, "technical": 0.21, "sales": 0.0 }
    },
    "urgent": { "type": "noul", "noul": 0.95 },
    "frustration": {
      "type": "score",
      "score": 1.94,
      "confidence": 0.91,
      "legend": { "0": "calm", "1": "annoyed", "2": "angry" },
      "probabilities": { "0": 0.0, "1": 0.06, "2": 0.94 }
    }
  },
  "usage": { "input_tokens": 403, "output_tokens": 70 },
  "wekoya": { "cost": 0.03, "currency": "NGN", "usage_status": "reported" }
}
```
`model` is `jev-latest` (also accepted as `jev`) or `jev-preview`; `version` says which release answered. Up to 50 questions per call and about 32,000 tokens in total. `state` can be text or JSON:

```
import os, requests

reply = requests.post(
    "https://wekoya-api.wekoya.tech/v1/decisions",
    headers={"Authorization": f"Bearer {os.environ['WEKOYA_API_KEY']}"},
    json={
        "model": "jev-latest",
        # A string, or structured data: Jev reads JSON as well as text.
        "state": {"amount_ngn": 450000, "country": "NG", "account_age_days": 2},
        "questions": {
            "review": {"type": "noul", "instructions": "Should a person review this payment before it goes through?"},
        },
    },
    timeout=30,
)
reply.raise_for_status()
if reply.json()["answers"]["review"]["noul"] > 0.8:
    send_to_review_queue()
```
Everything that applies to chat applies here: key scopes and model allow-lists, end users and their budgets (`X-Bridge-End-User`), and the same errors. A call that fails costs nothing. Jev runs on your Wekoya balance only, so it does not use your own provider keys. Decision models are left out of `GET /v1/models` so chat pickers never offer them; list them with `GET /v1/models?type=decision`.
