Recipe catalog / buying-intent
Grade buying intent
How strong is the purchase intent expressed in message, on a five-level rubric?
You need to rank or route inbound leads and replies by how close the sender is to buying, not just whether they are interested.
Explore this recipe interactively ยท Source and implementation guide
Use buying-intent in TypeScript
Install with npm install jev-recipes. Requires Node.js 22.9 or newer and ES modules. Set TYPESAFE_API_KEY in your server environment for live calls, which send input to TypeSafe and use API quota. See the installation guide.
import { buyingIntent } from 'jev-recipes/buying-intent';
const result = await buyingIntent({
"message": "We've narrowed it down to you and one other vendor. Can you confirm whether the Team plan includes SSO, and what the annual price would be for 40 seats?",
"context": "Reply from a prospect who attended a product demo last week.",
"minConfidence": 0.8
});
console.log(result);
Input contract
| Field | Type | Needed |
|---|---|---|
| message | string | Required |
| context | string | Optional |
| minConfidence | number | Optional |
Full input and result schemas
{
"input": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"message": {
"type": "string"
},
"context": {
"type": "string"
},
"minConfidence": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"required": [
"message"
]
},
"result": {
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"model": {
"type": "string"
},
"usage": {
"type": "object",
"properties": {
"input_tokens": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"output_tokens": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"input_tokens",
"output_tokens"
],
"additionalProperties": false
},
"status": {
"type": "string",
"enum": [
"ready",
"review"
]
},
"score": {
"type": "number",
"minimum": 0
},
"level": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"confidence": {
"type": "number",
"minimum": 0,
"maximum": 1
},
"probabilities": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {
"type": "number",
"minimum": 0,
"maximum": 1
}
},
"intent": {
"type": "string",
"enum": [
"none",
"curious",
"evaluating",
"ready",
"committed"
]
}
},
"required": [
"model",
"usage",
"status",
"score",
"level",
"confidence",
"probabilities",
"intent"
],
"additionalProperties": false
}
}Saved example result
This hand-authored response demonstrates the contract. It is not a model accuracy measurement. Run it without an API key: npx jev-recipes demo buying-intent.
{
"model": "demo-fixture",
"usage": {
"input_tokens": 0,
"output_tokens": 0
},
"status": "ready",
"score": 2.06,
"level": 2,
"confidence": 0.84,
"probabilities": {
"0": 0.01,
"1": 0.04,
"2": 0.84,
"3": 0.1,
"4": 0.01
},
"intent": "evaluating"
}
Evaluation evidence
jev-1.13.0 / 2026-09-27 / 25 held-out cases
Scoring revision 1.
24 ready decisions, with 96% accuracy among those decisions.
95% case-level interval: 80% to 99%. Related synthetic cases are correlated.
Measured on these synthetic cases
This measurement uses an earlier or unverified recipe or evaluator version. Rerun with the current recipe and evaluator before treating these numbers as current.
Use the evaluation guide to measure this decision on your own labeled cases.
Limitations
- Grades expressed intent only. It does not estimate budget, authority, or whether the deal will close.
- The score is an expected value over rubric levels. Application code chooses routing cutoffs.
Related recipes
- turn-intent: Use turn-intent to classify the communicative purpose of a message outside a sales context.
- commitment-strength: Use commitment-strength to grade how firmly a message commits to a stated action.