Decisions your code can act on. With memory.

Send a state and typed questions. Get typed answers with probabilities and confidence in one call, no text to parse. Name a subject, and Jers also uses what its memory knows, and shows you what that changed.

A hosted API at api.getjers.com: nothing to install or run. Input is free; you pay per answer.

Request · one question about one message

{
 "state": "Hi, you charged me twice for September. Please send the second payment back.",
 "questions": {
  "refund": {
   "type": "noul",
   "instructions": "Is the customer asking for money back?"
  }
 },
 "model": "jers-english"
}

Answer · from the gateway, shortened

{
 "model": "jers-english",
 "engine": {
  "checkpoint": "english"
 },
 "answers": {
  "refund": {
   "type": "noul",
   "noul": 0.934,
   "confidence": 0.934,
   "action": {
    "act_probability": 1.0
   }
  }
 },
 "warnings": [],
 "usage": {
  "answers": 1,
  "answers_billed": 1,
  "cost": 1e-05,
  "currency": "USD"
 }
}
26 msper three-question request, round trip (median of 20, three runs: 25 to 28 ms), measured on the development Mac with the English checkpoint; the hosted service is measured separately
2.6 msgateway overhead for keys, metering, the ledger, the decision record and warnings, measured the same way
0.20 → 0.82"escalate to a person" for a priority account once two lines were in its memory (the escalation cookbook)
25documented examples, every answer produced by the gateway, never typed in

Three things Jers does that a chat model does not

?

Typed answers, not strings

Three question types: Choice picks an option, Score places the state on ordered levels, Noul says how likely a statement is true. Every answer carries probabilities, so your code branches, sorts and routes on numbers.

M

A memory per subject

A subject is whatever you decide about: a customer, a user, a player, a device, a case. Write what you know once. Every decision that names the subject shows which lines it used, and can show the answer without them. Forgetting is verified.

=

Honest numbers

Every number on this site was measured and says where. The documentation has a page of what the engine gets wrong, with the measurements, and the examples say when the memory changed nothing.

How it works

One request, one response. Code keeps the control flow; Jers answers the judgments inside it.

You send

  • a state: text, an object or a conversation
  • questions: choice, score, noul, up to 400 per request
  • optionally a subject whose memory should count
  • optionally robust, windows, derive and values

Jers

  • recalls the subject's memory lines that touch the state
  • adds the rules whose when holds and the facts derive computed
  • answers every question in one engine pass; a choice over 20 options takes two rounds, and a long state read in windows one pass per window
  • with compare on, answers again without the memory; with placebo on, once more with a neutral line

You get

  • typed answers with probabilities and confidence
  • the memory lines used, and what they changed
  • warnings about known traps, and a decision_id for POST /v1/feedback, which feeds the quality report and calibration
  • usage: answers, cost, balance
Question typeAsk it whenYou get back
Choicethe answer is one of a set of options (add other)choice, probabilities per option, confidence
Scorethe answer is a position on ordered levels, each written as a situationscore, probabilities per level, legend, confidence
Noulthe answer is yes or nonoul, the probability of yes, and confidence

Examples, with the real answers

Three of the twenty-five on the examples page. Switch tabs; every answer came from the gateway, shortened for the page.

A department with an other option, a refund check and an urgency score, about one message.

Request

{
 "state": "Hi, you charged me twice for September. Please send the second payment back.",
 "questions": {
  "route": {
   "type": "choice",
   "instructions": "Which team should handle this?",
   "criteria": {
    "billing": "Charges, invoices and refunds",
    "support": "Product problems",
    "sales": "New licences and upgrades",
    "other": "None of these"
   }
  },
  "refund": {
   "type": "noul",
   "instructions": "Is the customer asking for money back?"
  },
  "urgency": {
   "type": "score",
   "instructions": "How urgent is this?",
   "criteria": [
    "Can wait a week",
    "Should be handled today",
    "Blocking the customer now"
   ]
  }
 },
 "model": "jers-english"
}

Answer

{
 "model": "jers-english",
 "engine": {
  "checkpoint": "english"
 },
 "answers": {
  "route": {
   "type": "choice",
   "choice": "billing",
   "probabilities": {
    "billing": 0.954,
    "support": 0.027,
    "sales": 0.009,
    "other": 0.01
   },
   "confidence": 0.834,
   "action": {
    "act_probability": 1.0
   }
  },
  "refund": {
   "type": "noul",
   "noul": 0.934,
   "confidence": 0.934,
   "action": {
    "act_probability": 1.0
   }
  },
  "urgency": {
   "type": "score",
   "score": 1.557,
   "legend": {
    "0": "Can wait a week",
    "1": "Should be handled today",
    "2": "Blocking the customer now"
   },
   "probabilities": {
    "0": 0.016,
    "1": 0.411,
    "2": 0.573
   },
   "confidence": 0.318,
   "action": {
    "act_probability": 1.0
   }
  }
 },
 "warnings": [],
 "usage": {
  "answers": 3,
  "answers_billed": 3,
  "cost": 3e-05,
  "currency": "USD"
 }
}

Memory: a subject is anything you decide about

SubjectLines you would writeDecisions that use them
a customer accountcontract terms, who handles it, past incidentswhich team, how urgent, escalate or not
a user of your apppreferences, opt-outs, plansend this mail, show this offer
a player in a gamedeeds, reputation, quests donehow a character treats them
a device or machinenormal ranges, last service, known faultsalert, ticket, stop
a case or claimwhat is already known, who asked to be toldnext step, escalate

Five calls

POST /v1/memory/remember  {"subject": "acme", "text": "ACME holds an enterprise contract; refunds go to billing within one business day."}
POST /v1/memory/rules     {"subject": "acme", "when": "open_tickets >= 3", "text": "Escalate ACME to a person."}
POST /v1/systemone        {"state": ..., "questions": ..., "subject": "acme", "values": {"open_tickets": 4}, "memory": {"compare": true}}
POST /v1/memory/forget    {"subject": "acme", "concept": "enterprise contract"}   → verified_forgotten: true
POST /v1/memory/delete    {"subject": "acme"}

What to write

  • Facts as positive statements, using the names your states use.
  • Options that must never be chosen left out of the question: on ten roulette states where 17 had just come up, the engine bet on 17 in 9 or 10 of 10 whatever the memory said, and in 0 of 10 when 17 was not offered.
  • Conditions as rules with when, checked in code at every decision on the request's values and the state's fields, with an optional expiry: the engine does not compare numbers or dates. A stop-loss rule took the stop answer from 0.11 (at −10, not fired) to 0.80 (at −30, fired).
  • Short lines, one fact each: memory is read before the state, in the same room of about 475 tokens on the English model, and at most 64 lines of at most 2,000 characters are used; lines_seen and the warnings say when some were left out. With placebo on, Jers also answers with a neutral line, so you see what the words did: on the escalation case the answer with the real line was 0.62 higher than with a neutral line naming the same subject.

Measured, and written up on the rules in memory and memory pages.

Jers and Jev

Jev is TypeSafe AI's System One model. Jers speaks the same request and answer shape on purpose, so code written for one runs against the other with a new base URL and a model name. What differs:

JevJers
Memorynone; every request is statelessa memory per subject, with recall evidence, comparison and verified forgetting
Where it runstheir cloudJers's cloud: a hosted API, the memories on Jers's server, the engine on a GPU server Jers rents
Priceper input token, output freeinput free; per answer and per memory line written
The enginetheir own modelan open engine, named with its checkpoint in every answer
Speed and cost claimsmultiples against language modelsmeasured numbers only, and where they were measured

Pricing

Input is free

The state and the questions cost nothing, however long. You pay per answer and per memory line written. Each question answered is one answer, times the work you ask for: each option order with robust, each window with windows, twice with placebo. usage.answers_billed shows it.

Prepaid, with a ledger

Every priced request is one line in your ledger; GET /v1/usage shows credit, spending and the last requests, and the totals always agree. When credit is used up, decisions answer 402 until it is topped up. A failed request is never charged.

Current prices come with your key. Rate limits are per key, with a Retry-After header when you go over.

Get started

1. Ask for a key

Write to ceyoualigator@gmail.com with a sentence about what you want to decide. You get a key and the current prices.

2. One request

export JERS_API_KEY=jj_live_...
export JERS_BASE_URL=https://api.getjers.com

curl -s $JERS_BASE_URL/v1/systemone \
  -H "Authorization: Bearer $JERS_API_KEY" -H "Content-Type: application/json" \
  -d '{"state": "You charged me twice for September. Please send the second payment back.",
       "questions": {"refund": {"type": "noul", "instructions": "Is the customer asking for money back?"}}}'

3. Or from Python (SDK coming to PyPI)

from jers import JersClient, Choice, Noul, Score

with JersClient() as client:                 # reads JERS_API_KEY, JERS_BASE_URL
    r = client.system_one(
        state={"message": "We were charged twice for September again.", "account": "ACME Logistics"},
        questions={
            "route": Choice("Which team should handle this?", {"billing": "Charges and refunds", "support": "Product problems", "other": "None of these"}),
            "refund": Noul("Is the customer asking for money back?"),
            "urgency": Score("How urgent is this?", ["Can wait a week", "Should be handled today", "Blocking the customer now"]),
        },
        subject="acme", memory={"compare": True})

print(r.answers["route"].choice, r.answers["route"].confidence)
print(r.answers["refund"].noul, r.answers["urgency"].score)
print(r.memory.lines_used, r.memory.changes, r.usage.cost)

Coming: a TypeScript client (JavaScript and TypeScript) and an MCP server with a Claude Code plugin (Claude and MCP).

Then the five-minute guide, the examples and the cookbooks.