How to Use Jev with Claude Code and Codex for Fraud and Transaction Monitoring
Use Jev, TypeSafe's System One model, to triage and rank fraud alerts, account takeover signals, mule activity, scam claims, and disputes, then hand the right cases to a Claude Code or Codex agent in a Runtime sandbox.
Jev is a model from TypeSafe AI that reads text, like a fraud alert summary, a dispute claim, or an analyst's case note, and returns typed decisions instead of prose: a category, a score, or the probability that a statement is true. It answers in well under a second at a fraction of a cent, so you can run it on every alert your monitoring system produces.
Fraud teams don't lack alerts. They lack an order. A card testing burst, a takeover in progress, and a dozen alerts from a rule that fires on every payday all land in the same queue, and an analyst works them in the order they arrived. The one where money is leaving right now waits.
This is a guide to fixing that with two layers: Jev as a pre-trigger that sorts and ranks every fraud and transaction monitoring alert, and a Claude Code or Codex agent running in a Runtime sandbox that prepares the evidence for the alerts Jev puts first. Your fraud team makes every decision.
The short answer. Compute the numbers in code, then send each alert to Jev with a few questions your fraud team wrote: which pattern is this, how urgently does it need review, do the notes mention a detail that changes the priority. Code applies thresholds and decides which alerts an agent prepares first. The agent builds a source-linked timeline from your processor, device, and account data and drafts a case. Jev never blocks, freezes, refunds, or closes anything.
What it does. The takeover in progress reaches an analyst first, already traced, instead of sitting behind forty alerts from a noisy velocity rule.
What it is not. It isn't a fraud model, a rules engine, or a replacement for your vendor's real-time scoring. Every material improvement comes from a human questioning a premise. Plan for that.
What Jev returns
Jev answers three kinds of questions: a choice from a list you define, a score across levels you describe (numbered from 0), and a noul, the probability that a statement is true. For a fraud alert, the difference looks like this:
result = client.system_one(alert_facts, {
"pattern": Choice(
instructions="Which fraud pattern is this?",
criteria={"account_takeover": None, "card_testing": None,
"mule_activity": None, "unclear": None}),
"funds_leaving_now": Noul(instructions=
"Money is still moving out of the account"),
})What comes back is a pick with a probability for each option and a single number for the noul. Your code can act on both. A chat model asked the same thing would answer "this looks like it could be account takeover," which you then have to parse.
TypeSafe launched Jev in early access on September 15, 2026, and lists 70 to 500 milliseconds end to end and $0.042 per million input tokens, with output free. These are the vendor's numbers, so benchmark them on your own alerts. For the full introduction, see how to use Jev with Claude Code and Codex for triage.
The rule that matters most
Jev ranks. It never acts. In fraud this is tempting to forget, because the cost of a slow block is real money. Hold the line anyway, for four reasons.
No rationale. Jev returns probabilities, not reasons. A frozen account, a declined claim, or a closed alert needs a reason a reviewer, a customer, and sometimes a regulator can follow. A score of 0.88 isn't one.
The input is written by the other side. Fraudsters write the dispute claims, the support messages, and sometimes the merchant descriptors Jev reads. TypeSafe's model notes say Jev doesn't treat state as hostile by default, and that injected instructions or misleading framing can shift answers. A ranking can absorb that. A block decision can't.
Fair treatment. Freezing an account cuts someone off from their money. Simon Willison's early review of Jev raised bias concerns for sensitive ranking. Keep Jev's questions on the activity and the case, never on personal characteristics, and check for skew across customer segments before you rely on the ranking.
Real time is already solved. Your rules engine and fraud vendor make the approve or decline call at authorization, with models trained on transaction data. Jev reads text. Put it after the alert fires, not in front of the payment.
A ranking mistake delays a case by minutes. A wrong freeze reaches a customer. Keep Jev on the ranking side.
How the investigation runs
@Risk Risk case R-318 shows a burst of declined authorizations. Can you investigate whether other merchants saw the same pattern?
Three merchants show a similar burst of low-value declined authorizations. The pattern warrants a card-testing review, but the records alone do not confirm fraud. I attached the queries and affected accounts. No blocks or rules were changed.
SardineLow-value authorization burst
MarqetaHigh decline rate in a short windowSnowflakeSimilar sequence across 3 merchants
- PostgresRecent onboarding · no prior case
Unit21Evidence and proposed checks attached
Every query, tool call, and approval is saved with the run.
Jev reads every alert and orders the queue. The agent traces the alerts that cleared your threshold. The fraud analyst sees a finished case and makes the call.
The stack
| Job | Tools |
|---|---|
| Fast decisions | |
| Investigating agent | |
| Fraud alerts and signals | Or SEON, Sift, Feedzai, or your own rules engine |
| Payments and cards | |
| Account history and relationships | Or scoped Postgres views |
| Cases | Or your case manager |
| Approvals and handoff | |
| Agent infrastructure |
How it runs in Runtime
Runtime is an operating system for coding agents like Claude Code and Codex. The investigating agent is built from three pieces: a template (the agent's computer, with its secrets, network rules, and triggers), skills (the runbooks it follows, one per fraud pattern), and tools (what it can reach). Every run leaves a record of what it read, so when an analyst asks why a case was prepared the way it was, you can show them.
alert-intakeReads the alert, Jev's answers, and the rule that fired, then picks the runbook for that pattern.account-timelineBuilds a source-linked timeline of logins, contact changes, devices, and payments before the alert.
payment-traceLists each payment attempt in the alert and the state it reached in the processor.related-accountsChecks approved identifiers for linked accounts, one hop, and says how strong each link is.
case-draftSaves a draft case with facts, open questions, and missing records kept separate.
Sardine
MarqetaSnowflake
- Accounts DB
Unit21Slack
Where Jev fits in fraud
| Queue | What Jev decides | What the Runtime agent prepares |
|---|---|---|
| Account takeover | That the alert looks like a takeover, and whether money is still leaving | A session timeline: logins, contact changes, new devices, and new payees before the transfers |
| Card testing | The pattern, and whether the alert repeats an open case | The attempts, their states, and the merchants and cards involved |
| Mule activity | The pattern and review urgency, from facts your code computed | The money flow in and out, sources and destinations, and shared devices or payees |
| Scam claims | Whether the customer's account describes being coached or pressured to send money | The payment, the claim, and prior contact with the customer, side by side |
| Disputes and chargebacks | The claim type, so it reaches the right reviewer | Transaction, authentication, and delivery records for the stated reason |
| Rule review | The reason category in each analyst's closing note | A summary of which rules produce alerts that close without action |
| Case QA | Whether the agent's draft states what happened, when, and which record supports it | Nothing. Jev checks the agent's work before a human sees it. |
The last row is the second use for Jev. TypeSafe's guidance for coding agents includes checking whether a statement is true of a document or record before taking an action. A draft case that claims a link without citing the record goes back to the agent before it reaches an analyst.
Step 1: Write the questions (fraud team)
The fraud team writes these, not engineering. Jev answers exactly what you ask, literally, and TypeSafe's build guidance is to ask narrow questions that each evaluate one property and combine the answers in code.
| Question | Type | Why it matters |
|---|---|---|
| Pattern: account takeover, card testing, mule activity, scam victim, first-party, unclear | Choice | Picks the runbook the agent loads |
| Review urgency, four levels from "monitor" to "money is leaving now" | Score | Sets agent priority |
| "The customer says someone told them to move or send the money" | Noul | Scam victims need a different conversation than takeover victims |
| "The customer says they did not make these transactions" | Noul | Separates a fraud claim from a billing question |
| "This alert describes the same activity as an open case" | Noul | Attach to the case instead of investigating twice |
| "A law enforcement request, regulator, or lawyer is mentioned" | Noul | Always goes to a named human, never an agent |
Write the level descriptions carefully. "Funds have left the account in the last hour and more transfers are queued" beats "Critical."
Compute numbers and dates in code. TypeSafe's documentation is blunt: Jev "is not a calculator," it doesn't count reliably, and it reads dates as text rather than ordered quantities. Velocity, amounts, time windows, and "how long after the phone number changed" all belong in code. Pass the result as a sentence: "14 inbound transfers from 11 senders in 6 hours. 92% sent out within 20 minutes to 2 payees added today."
Don't ask it to detect. Your monitoring rules and fraud vendor already decide what's suspicious, on data Jev never sees. Jev reads their output and helps decide what an analyst looks at first.
Combine in code. The pattern, the urgency score, and the nouls are separate answers. Weight them in a short function your fraud team can read, and change the weights when the ranking looks wrong. TypeSafe documents this as composite scoring.
Step 2: Set thresholds, then prove them
Your fraud team writes the routing rules as plain policy anyone on the team can read.
| If Jev says | Then |
|---|---|
| Law enforcement, regulator, or lawyer above 0.3 | Named fraud lead. No agent. |
| Urgency at the top level (3, since levels start at 0), with high confidence | Agent prepares the case now, priority 1, and the on-call analyst is paged |
| Account takeover or mule activity above 0.6 | Agent prepares the case, priority 1 |
| Same activity as an open case above 0.8 | Attach to that case and notify its owner |
| Routine pattern, high confidence | Batch into the next scheduled agent run |
| Confidence below your floor | Human triage, and saved as a test case |
Keep the sensitive thresholds low. A false alarm costs an analyst two minutes. A takeover that waits an hour costs the customer their balance.
Then run it in shadow mode. Send several weeks of past alerts through Jev, compare its ranking with what your analysts actually escalated and confirmed, and pay most attention to confirmed fraud that Jev ranked low. That comparison tells you whether the ranking is good enough before anything depends on it.
Sample the bottom of the queue every week once it's live. The risk with any ranking system is that real cases sink quietly.
Step 3: Build the triage with Claude Code or Codex
Put your TypeSafe API key in an environment variable and ask your coding agent to build it. TypeSafe has Python and TypeScript SDKs and publishes an agent skill that gives Claude Code and Codex context on the Jev API, and community projects like jev-code register Jev as a tool inside both.
"Build a triage service for our fraud alert queue. For each new alert, pull the alert facts and compute velocity, amounts, counts, and time windows in code. Write them as plain sentences. Send those sentences and any case notes to Jev using the TypeSafe SDK with the questions in fraud-questions.md. Combine the answers with the weights in routing-policy.md. Log the input, every Jev answer, the model field in the response, and the rule that fired. Never block, freeze, refund, or close anything. Write tests from the labeled alerts in /fixtures and report every confirmed fraud case that would have been ranked in the bottom half."
Two habits make these prompts work harder:
- Say why, not just what. "Log the model field, because the jev-latest alias moves when TypeSafe ships a new version and we need to re-test" gets you an audit trail instead of a debug log.
- Name the failure you're preventing. "An alert that mentions law enforcement must never start an agent, even with a low urgency score" exists because that's the case that hurts.
Step 4: Create the Runtime template
The template is what the investigating agent boots into every time Jev hands it an alert: the skills, tools, and secrets it can use, and the hosts it can reach.
"Create a Runtime template for fraud case preparation. Connect Sardine, Marqeta, and Unit21 with read-only access. Add a read-only connection to the masked account and device views in Snowflake. Allow network access only to those hosts and Slack. Load every credential from secrets. The agent can save draft cases and post to #risk-ops but can't change an account, a card, a payment, or a rule."
Add credentials through the template's secrets in the dashboard, never by pasting them into chat. Give the agent its own identity in each vendor so your access logs show exactly what it read. Then test the limits: ask it to freeze an account or refund a payment and confirm the request fails at the permission layer.
Attach your runbooks as skills, one per pattern. When Jev says "account takeover," the agent loads the takeover runbook first instead of rediscovering it.
Decide what reaches Jev separately from what reaches the agent. Jev needs alert facts, case notes, and claim text. It rarely needs card numbers, account numbers, or identity documents, so leave them out and review TypeSafe like any other third-party processor.
Step 5: Let Jev start the agent, then check its work
When a rule says "prepare now," the triage service starts a Runtime session with the alert, Jev's answers, and the rule that fired.
"When the routing rule is 'prepare now,' start a session from the fraud template with the alert, the Jev scores, and the matched pattern. Load the skill for that pattern. Build the timeline from read-only sources and cite every record. Look for linked accounts one hop out, using only the approved identifiers, and say how strong each link is. Separate facts, possible explanations, and missing records. Save a draft case in Unit21 and post a summary to #risk-ops. Don't label the customer, and don't recommend blocking. List the questions the analyst needs to answer."
Before the case reaches a person, send the draft back to Jev with a short rubric: does it state what happened and when, does every link name the identifier behind it, and does every claim cite a record. Drafts that fail go back to the agent.
What stays human
| Step | Why |
|---|---|
| Writing the questions, weights, and thresholds | That's your risk appetite. Jev only applies it. |
| Blocking a card, freezing or closing an account | It cuts a customer off from their money and can be wrong |
| Refunding, reimbursing, or declining a fraud claim | You answer to the customer and, often, a regulator |
| Disputing or accepting a chargeback | It goes straight to your loss numbers |
| Changing detection rules | Owned by the rule owner, tested before release |
| Escalating to compliance or filing a report | Your compliance officer's call, with its own process |
Where it breaks
Numbers and dates. Velocity, structuring-style amounts, and "within 48 hours of a phone change" all fail if you ask Jev directly. Compute them first and send sentences.
Fraudsters write the input. Claims, chat messages, and notes can be written to steer a model. Treat Jev's answers as routing hints. No score should ever grant the agent more access, skip an approval, or shorten a review.
Literal reading. "Is this account takeover" and "did someone other than the account holder log in" get different answers. TypeSafe also notes double negatives and complex indirection are answered less reliably. When routing looks wrong, fix the question before blaming the model.
Language. TypeSafe says English is where Jev's accuracy is currently best. If your case notes are in Spanish or Portuguese, shadow-test on those cases specifically. The Spanish fraud monitoring guide covers the agent side for LATAM payment rails.
New model versions. Every response names the versioned model that answered. When it changes, run your shadow set again before trusting the new ranking.
Measuring it
- Time to first review for confirmed fraud. The number a pre-trigger exists to move.
- Confirmed fraud found in the bottom of the queue. From your weekly sample. The target is zero.
- Analyst minutes per alert. Split by pattern, since a mule trace and a card testing burst aren't comparable.
- Cases returned for missing evidence. Before and after the QA check.
- Alerts closed without action, by rule. From the rule review row. It tells you where the noise comes from.
Keep loss rates in your wider risk program's measurement. This setup changes the order and preparation of work. On its own it doesn't prove a change in losses.
Measure the current queue first, or you won't be able to show what changed.
A realistic timeline
| Stage | Time |
|---|---|
| Runtime template and a working agent | Minutes on Runtime; days if you build the infrastructure yourself |
| Questions, weights, and routing policy | A week with the fraud team |
| Shadow mode on past alerts | Several weeks, and keep the results |
| Live ranking for one pattern | After shadow mode agrees with your analysts |
| Additional patterns | One at a time, each with its own shadow run |
The point
Fraud teams don't lack judgment. They spend it in arrival order. When ranking an alert costs almost nothing, every alert can be ordered the moment it fires, and the analyst's first minutes go to the account where money is still moving.
Jev ranks, the agent prepares, and your fraud team decides. Keep those three jobs separate and the speed comes without the wrong freezes.
Back to the queue.
For the same pattern in onboarding, sanctions, and AML, see how to use Jev for KYC, KYB, and AML. For the investigation agent itself, see how to investigate fraud alerts with Codex and Claude Code and the compliance alert guide. If you're choosing a monitoring platform, see the best AI agents for AML alert triage.
Frequently asked questions
Can Jev be used for fraud monitoring?
Yes, as a triage layer on top of the alerts your rules engine or fraud vendor already produces. Jev can sort each alert into a pattern such as account takeover, card testing, or mule activity, score how urgently it needs review, and flag details in case notes that change the priority. It shouldn't block a transaction, freeze an account, or close an alert. Use it to decide which alerts a Claude Code or Codex agent prepares first, and keep every decision with your fraud team.
Should Jev sit in the real-time authorization path?
Not in this setup. Your rules engine and fraud vendor already make the real-time approve or decline call, with models tuned on transaction data. Jev reads text, not raw transaction streams, and TypeSafe's documentation says it isn't a calculator and reads dates as text. Use it after an alert fires, to rank the queue and pick the right investigation runbook.
How do I use Jev with Claude Code for transaction monitoring?
Ask Claude Code to build a triage service that computes the numeric facts of each alert in code, such as velocity, amounts, and time between inbound and outbound transfers, then sends those facts as sentences to Jev with a few typed questions. Route high-priority alerts to an agent running in a sandbox such as Runtime, with read-only credentials, that builds a source-linked timeline for an analyst.
How do I use Jev with Codex for fraud alerts?
The same way as with Claude Code. TypeSafe publishes Python and TypeScript SDKs and an agent skill that gives Codex and Claude Code context on the Jev API. The questions, thresholds, and routing rules are written by your fraud team and stay the same whichever coding agent builds the service, and both can run in a Runtime sandbox with the same read-only access rules.
Can Jev detect money mules or account takeover by itself?
No. Detection stays with your monitoring rules and fraud vendor. Jev reads what those systems produce, plus case notes and customer messages, and helps decide which alert an analyst should see first. Labeling an account as a mule or confirming a takeover is a human decision based on the evidence the agent prepared.
Where should the fraud investigation agent run?
In its own sandbox, with read-only credentials scoped to the transaction, device, and account data it is approved to see, network rules limiting it to those systems, and a record of every source it read for every case. That boundary keeps an investigation agent from turning into an action agent by accident. Runtime provides that environment for Claude Code and Codex agents, with sessions started directly from a routing rule.
Does Jev work on Spanish and Portuguese case notes?
TypeSafe says English is Jev's primary training language and where accuracy is currently best, and that other languages are handled but not equally well. If your queues are in Spanish or Portuguese, run your shadow test on cases in those languages before you trust the ranking.
Prepare fraud cases with an agent you can audit
Runtime gives every agent a sandbox, scoped read-only credentials, network rules, and a record of every source it touched, so Jev can hand it alerts without a human in the middle. Request access, and if it's a fit, the founders will set up a free pilot with you.