Getting started in five minutes
Jepela is a hosted API at https://api.jepela.com; you need only a key. Everything below was run for real; your numbers will differ a little.
Minute 1: a key
Create an account at app.jepela.com and choose your region. Confirm your email address, then pay by card under Billing to start at once (the account is approved as soon as the payment goes through), or wait for Jepela to approve it; then you create your keys in the console and add credit by card or by invoice. Questions: info@jepela.com. A key looks like jj_live_4f9c... and is shown to you once. Once you have one, put it in your shell:
export JEPELA_API_KEY=jj_live_...
export JEPELA_BASE_URL=https://us.api.jepela.com # your key's region: jj_live_us_... is us (see Regions)
Check that it works:
curl -s $JEPELA_BASE_URL/v1/models -H "Authorization: Bearer $JEPELA_API_KEY"
You get the list of models and "available": true for each one that can answer now.
Minute 2: your first decision
Ask one yes/no question about a message:
curl -s $JEPELA_BASE_URL/v1/systemone -H "Authorization: Bearer $JEPELA_API_KEY" -H "Content-Type: application/json" -d '{
"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?"}}
}'
The answer carries the probability of yes and a confidence: "refund": {"type": "noul", "noul": 0.9..., "confidence": 0.9...}. Near 1 means yes, near 0 means no, near 0.5 means the engine cannot tell. The usage block says what it cost, warnings lists known traps in the request (none here), and decision_id is what you send back with POST /v1/feedback once you know the right answer.
Minute 3: three questions at once
Add a choice and a score. They are answered in the same engine pass, and the engine reads the state once per question, so you pay for the input tokens of three reads (usage.input_tokens gives the engine's own count):
curl -s $JEPELA_BASE_URL/v1/systemone -H "Authorization: Bearer $JEPELA_API_KEY" -H "Content-Type: application/json" -d '{
"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 and refunds", "support": "Product problems", "sales": "New licences", "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"]}
}
}'
Read the answer like this:
route.choiceis the option with the highest probability;route.probabilitiesshows the others;route.confidencesays how concentrated they are.refund.noulis the probability of yes.urgency.scoreis a position between the levels, 0 to 2 here;urgency.legendmaps the numbers back to your words.
Minute 4: give it a memory
Write what you know about a subject once. A subject is whatever you decide about: a customer, a user, a player, a device, a case.
curl -s $JEPELA_BASE_URL/v1/memory/remember -H "Authorization: Bearer $JEPELA_API_KEY" -H "Content-Type: application/json" -d '{
"subject": "acme",
"text": "ACME Logistics holds an enterprise contract; refunds for ACME go to the billing team within one business day.\nACME Logistics is handled by the enterprise desk."
}'
Now name the subject in a decision and ask for the comparison:
curl -s $JEPELA_BASE_URL/v1/systemone -H "Authorization: Bearer $JEPELA_API_KEY" -H "Content-Type: application/json" -d '{
"state": {"message": "We were charged twice for September again.", "account": "ACME Logistics"},
"subject": "acme", "memory": {"compare": true},
"questions": {"route": {"type": "choice", "instructions": "Which team should handle this?",
"criteria": {"billing": "Charges and refunds", "support": "Product problems", "enterprise_desk": "The enterprise account desk"}}}
}'
The answer now has a memory block: which lines were used (hits), how many the engine read (lines_seen), the answer without them, and changes per question. The compare pass is not billed. Forgetting is one call, and it tells you whether the line is really gone:
curl -s $JEPELA_BASE_URL/v1/memory/forget -H "Authorization: Bearer $JEPELA_API_KEY" -H "Content-Type: application/json" -d '{"subject": "acme", "concept": "enterprise desk"}'
Minute 5: the same from Python
pip install "git+https://github.com/jepelasweden/jepela#subdirectory=sdk/python"
from jepela import JepelaClient, Choice, Noul, Score
with JepelaClient() as client: # reads JEPELA_API_KEY; the key's region picks the address
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)
print(r.usage.cost, r.usage.currency, r.usage.balance)
Where to go next
- Examples: twenty-five real requests and answers across support, e-commerce, moderation, games, machines and case files.
- Primitives, State and Confidence: how to write questions that work.
- Memory and Rules in memory: what to write for a subject, and what to check in code instead (numbers, dates, forbidden options).
- Warnings, Quality and Batches: known traps flagged per request, accuracy measured on your own labels, many requests at once.
- JavaScript and TypeScript, and Claude and MCP: the other two clients.
- Cookbooks: complete scripts with measured results.
- Troubleshooting and FAQ when something does not do what you expected.