Try it
Copy the code ↓- Data source
- Decision schema
- Model inference
- Structured result
2 Decision schema 4 typed questions
ad_anglechoicediscountsocial_proofpain_pointfeature_demourgencybrand_storyfunnel_stagechoiceawarenessconsiderationconversionhas_offernoulprobability 0–1hook_strengthscoreweakaveragestrongstandout
3 Model inference typesafe/jev-1.13
Waiting for a run.
4 Structured result
Raw JSON
Run the demo to see the JSON answers, the highlighted pick and the final action.
FLATKEY_API_KEY and run.curl -sS https://router.flatkey.ai/api/alpha/decisions \
-H "Authorization: Bearer $FLATKEY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "typesafe/jev-1.13",
"state": "Brand: Lumen Skincare (Meta Ad Library, active since Sep 2, 3 variants)\nHeadline: \"12,000+ five-star reviews can'\''t be wrong\"\nPrimary text: \"Rated 4.8/5 by over 12,000 customers. '\''My skin has never looked this clear'\'' (Jess, verified buyer). See why dermatologists keep recommending our barrier serum.\"\nCTA: Shop now\n\nTask: ad_angle, funnel_stage, has_offer, hook_strength.",
"questions": {
"ad_angle": {
"type": "choice",
"instructions": "Which creative angle is this ad mainly built on?",
"criteria": {
"discount": "Leads with a price cut, coupon, sale or bundle deal",
"social_proof": "Leads with reviews, ratings, customer counts, testimonials or press mentions",
"pain_point": "Leads with a problem or frustration the reader has and agitates it",
"feature_demo": "Shows how the product works or what a specific feature does",
"urgency": "Leads with a deadline, limited stock or a countdown",
"brand_story": "Leads with founder story, mission, values or lifestyle mood"
}
},
"funnel_stage": {
"type": "choice",
"instructions": "Which stage of the funnel is this ad most likely written for?",
"criteria": {
"awareness": "Cold audience who may not know the brand or the problem yet",
"consideration": "People comparing options who need reasons to trust or prefer the brand",
"conversion": "Warm or retargeted people who are close to buying and need a final push"
}
},
"has_offer": {
"type": "noul",
"instructions": "The ad states a concrete offer such as a discount, coupon code, free gift, free trial, bundle price or free shipping."
},
"hook_strength": {
"type": "score",
"instructions": "How strong is the opening hook of this ad for stopping a scroll and making the reader keep going?",
"criteria": [
"weak",
"average",
"strong",
"standout"
]
}
}
}'// Node.js 18+ (built-in fetch). Run: FLATKEY_API_KEY=... node jev.mjs
const body = {
"model": "typesafe/jev-1.13",
"state": "Brand: Lumen Skincare (Meta Ad Library, active since Sep 2, 3 variants)\nHeadline: \"12,000+ five-star reviews can't be wrong\"\nPrimary text: \"Rated 4.8/5 by over 12,000 customers. 'My skin has never looked this clear' (Jess, verified buyer). See why dermatologists keep recommending our barrier serum.\"\nCTA: Shop now\n\nTask: ad_angle, funnel_stage, has_offer, hook_strength.",
"questions": {
"ad_angle": {
"type": "choice",
"instructions": "Which creative angle is this ad mainly built on?",
"criteria": {
"discount": "Leads with a price cut, coupon, sale or bundle deal",
"social_proof": "Leads with reviews, ratings, customer counts, testimonials or press mentions",
"pain_point": "Leads with a problem or frustration the reader has and agitates it",
"feature_demo": "Shows how the product works or what a specific feature does",
"urgency": "Leads with a deadline, limited stock or a countdown",
"brand_story": "Leads with founder story, mission, values or lifestyle mood"
}
},
"funnel_stage": {
"type": "choice",
"instructions": "Which stage of the funnel is this ad most likely written for?",
"criteria": {
"awareness": "Cold audience who may not know the brand or the problem yet",
"consideration": "People comparing options who need reasons to trust or prefer the brand",
"conversion": "Warm or retargeted people who are close to buying and need a final push"
}
},
"has_offer": {
"type": "noul",
"instructions": "The ad states a concrete offer such as a discount, coupon code, free gift, free trial, bundle price or free shipping."
},
"hook_strength": {
"type": "score",
"instructions": "How strong is the opening hook of this ad for stopping a scroll and making the reader keep going?",
"criteria": [
"weak",
"average",
"strong",
"standout"
]
}
}
};
const res = await fetch("https://router.flatkey.ai/api/alpha/decisions", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.FLATKEY_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify(body),
});
if (!res.ok) throw new Error(`Jev request failed: ${res.status} ${await res.text()}`);
const { answers, usage } = await res.json();
console.log(JSON.stringify(answers, null, 2), usage);# Python 3.8+ (pip install requests). Run: FLATKEY_API_KEY=... python jev.py
import json, os, requests
body = json.loads(r"""{
"model": "typesafe/jev-1.13",
"state": "Brand: Lumen Skincare (Meta Ad Library, active since Sep 2, 3 variants)\nHeadline: \"12,000+ five-star reviews can't be wrong\"\nPrimary text: \"Rated 4.8/5 by over 12,000 customers. 'My skin has never looked this clear' (Jess, verified buyer). See why dermatologists keep recommending our barrier serum.\"\nCTA: Shop now\n\nTask: ad_angle, funnel_stage, has_offer, hook_strength.",
"questions": {
"ad_angle": {
"type": "choice",
"instructions": "Which creative angle is this ad mainly built on?",
"criteria": {
"discount": "Leads with a price cut, coupon, sale or bundle deal",
"social_proof": "Leads with reviews, ratings, customer counts, testimonials or press mentions",
"pain_point": "Leads with a problem or frustration the reader has and agitates it",
"feature_demo": "Shows how the product works or what a specific feature does",
"urgency": "Leads with a deadline, limited stock or a countdown",
"brand_story": "Leads with founder story, mission, values or lifestyle mood"
}
},
"funnel_stage": {
"type": "choice",
"instructions": "Which stage of the funnel is this ad most likely written for?",
"criteria": {
"awareness": "Cold audience who may not know the brand or the problem yet",
"consideration": "People comparing options who need reasons to trust or prefer the brand",
"conversion": "Warm or retargeted people who are close to buying and need a final push"
}
},
"has_offer": {
"type": "noul",
"instructions": "The ad states a concrete offer such as a discount, coupon code, free gift, free trial, bundle price or free shipping."
},
"hook_strength": {
"type": "score",
"instructions": "How strong is the opening hook of this ad for stopping a scroll and making the reader keep going?",
"criteria": [
"weak",
"average",
"strong",
"standout"
]
}
}
}""")
res = requests.post(
"https://router.flatkey.ai/api/alpha/decisions",
headers={"Authorization": f"Bearer {os.environ['FLATKEY_API_KEY']}"},
json=body,
timeout=60,
)
res.raise_for_status()
data = res.json()
print(json.dumps(data["answers"], indent=2), data.get("usage"))
No Flatkey key yet? Get one for Jev 1.13 →
About this use case

Who / when
Audience
- performance marketers and media buyers researching competitors before a new campaign
- creative strategists who keep a swipe file of winning hooks and angles
- agencies running competitive ad audits for many clients
- tool builders adding ad-library analysis to a marketing intelligence product
Triggers
- a competitor has hundreds of live ads in the Meta Ad Library and nobody has time to read them all
- you want to know which angle (discount, social proof, pain point, demo) each brand leans on this month
- an LLM summary of an ad library is a wall of prose you cannot count or chart
- the quarterly competitor review is stale by the time it ships
The workflow
- 01Ad copyBrand, headline, primary text, CTA and run dates per ad from the ad library exportInput
- 02Angle + stageWhich creative angle and funnel stage is this ad built for?Jev
- 03Offer + strengthDoes it carry a concrete offer, and how strong is the hook?Jev
- 04Angle mapCode counts angles per brand and saves standouts to the swipe fileYour code
Question shape
{
"ad_angle": {
"type": "choice",
"instructions": "Which creative angle is this ad mainly built on?",
"criteria": {
"discount": "Leads with a price cut, coupon, sale or bundle deal",
"social_proof": "Leads with reviews, ratings, customer counts, testimonials or press mentions",
"pain_point": "Leads with a problem or frustration the reader has and agitates it",
"feature_demo": "Shows how the product works or what a specific feature does",
"urgency": "Leads with a deadline, limited stock or a countdown",
"brand_story": "Leads with founder story, mission, values or lifestyle mood"
}
},
"funnel_stage": {
"type": "choice",
"instructions": "Which stage of the funnel is this ad most likely written for?",
"criteria": {
"awareness": "Cold audience who may not know the brand or the problem yet",
"consideration": "People comparing options who need reasons to trust or prefer the brand",
"conversion": "Warm or retargeted people who are close to buying and need a final push"
}
},
"has_offer": {
"type": "noul",
"instructions": "The ad states a concrete offer such as a discount, coupon code, free gift, free trial, bundle price or free shipping."
},
"hook_strength": {
"type": "score",
"instructions": "How strong is the opening hook of this ad for stopping a scroll and making the reader keep going?",
"criteria": [
"weak",
"average",
"strong",
"standout"
]
}
}Gate policy
≥ 0.90
Tag in code: write ad_angle, funnel_stage and has_offer to the ad row and count it in the per-brand angle map; standout hooks go straight to the swipe file.
0.60–0.90
Tag the ad but mark it low confidence; exclude it from angle-share charts until a strategist skims the batch.
< 0.60
Leave it untagged and add it to a human review sample; mixed signals often mean a new angle worth adding to the list.
Failure modes
Pre-launch checks before you trust auto-routing:
- Sending only the image URL; Jev reads text, so pass the headline, primary text, CTA and a one-line description of the visual or transcript;
- Asking Jev to write new ad copy; it only decides, a writing model or your creative team produces the variants;
- Treating hook_strength as performance data; ad libraries do not show spend or CTR, so long run time is the only proxy and it stays in code;
- Letting the angle list sprawl; keep five to eight angles so counts per brand stay comparable month to month;
- Scanning once; ads rotate weekly, so re-run on new ad IDs and diff the angle map;
FAQ
Why use Jev to scan an ad library instead of a chat model?
An ad library scan is hundreds or thousands of small, repeated judgments. Jev answers all four questions about an ad in one parallel pass and returns probabilities instead of prose, so code can count angles per brand, chart them and set thresholds. A chat model summary is slower, costs more per ad and gives you text you still have to parse.
Where do the ads come from?
From your own source: the Meta Ad Library, TikTok Creative Center, Google Ads Transparency Center, a scraper or a paid ad-intelligence tool. Jev has no ad index of its own. Export brand, headline, primary text, CTA and run dates per ad and send that as the state.
Can Jev look at the ad image or video?
No, Jev reads text only. For image and video ads, add the on-image text, a transcript or a one-line description of the visual to the state, or run a captioning model first and pass its output to Jev.
Which angles should I use?
Start with the six on this page (discount, social proof, pain point, feature demo, urgency, brand story) and adjust the criteria text to your market. Keep the list short and stable so month-over-month counts mean something, and review the low-confidence pile to spot new angles.
Can Jev tell me which ads perform best?
Not directly. Ad libraries do not expose spend, clicks or conversions. hook_strength is Jev's read of the copy, not a performance metric. Combine it in code with run time (ads that keep running are often the ones that work) and your own test results.
What does the Flatkey call look like?
POST https://router.flatkey.ai/api/alpha/decisions with Authorization: Bearer …, Content-Type: application/json, and a body of state, model (typesafe/jev-1.13), and questions (choice / score / noul). This is not an OpenAI-compatible /v1 chat endpoint.
Can I bring my own API key?
Yes. Try the free demo above without signing in. To run it live on your own text, sign in with Google and connect a Flatkey or OpenRouter key (a quick test call runs when you save it). Manage or delete it anytime under Dashboard → BYOK. Keys are stored encrypted on the server, used only for runs you trigger, and never sent back to the browser. Need a Flatkey key? Get one for Jev 1.13 on Flatkey.
Is this the official TypeSafe Jev product page?
No. jev-llm.com is an independent research and practice site. Verify pricing, models and terms at the original TypeSafe sources.
Sources
Marketers after scanning thousands of ads in seconds using Jev AI
— @cris_vels View the post on X →
Wire this gate with your own key
Bring your own key through Flatkey / OpenRouter. Keep exact checks in code.