Inspiration

Every Indian family WhatsApp group gets them: "PM-Kisan will now pay ₹12,000, register here", "your electricity will be cut tonight, call this officer", "your SBI account will be blocked, update KYC". They arrive in Hindi, Tamil and code-mixed Hinglish or Tanglish, with links that look official (pmkisan-gov.in.apply-now.xyz). Fact-checkers do great work, but by the time an article is out, a new variant is circulating. People need an answer they can trust in seconds, with the official source to prove it, in the language they actually read.

What it does

Paste a forward or drop a screenshot on the web, or reply /check to any message in a Telegram family group. ClaimCheck returns SCAM, VERIFIED or UNVERIFIED in about 15 seconds:

  • A reply in the sender's own language (Hindi, Tamil, Hinglish, Tanglish or English), plus an English explanation
  • Cited evidence: official .gov.in pages, Indian fact-checkers and news, each marked as supporting or contradicting, with the exact quote
  • A manipulation fingerprint: which persuasion tactics the message uses (borrowed authority, free money, a fake deadline, a request for your OTP…), each backed by a quote from the message itself
  • Safety tips, and one tap to share the answer back to the WhatsApp group the scam came from

Two independent layers make this work. The evidence layer asks "are the claims true?" The manipulation layer asks "how is it trying to make me act?", and that question still has an answer for a scam invented this morning, which no search engine has seen yet.

It never calls a scam safe: VERIFIED needs an official source that supports the claim. It never accuses without evidence either: SCAM needs a contradicting source, a critical signal, or a playbook that asks for credentials, money or an app install.

How we built it

Every model call runs on Nebius Token Factory, with each model sized to its job:

Step Model
Read screenshots Qwen3.8-27B (no Nemotron model on Token Factory accepts images; it only transcribes)
Understand the message, find checkable claims Nemotron 3.5 Lightning
Manipulation fingerprint (9 tactics, quoted evidence) Nemotron 3 Super, in parallel with the step above
Plan the searches Nemotron 3 Nano
Search: gov.in / fact-checkers / news, in parallel, then read official pages in full Tavily Search + Extract
Judge every source against every claim Nemotron 3 Super
Final reasoned verdict, in the sender's language Nemotron 3 Ultra, with reasoning on
  • Reasoning only where it pays. We switch Nemotron's reasoning off (enable_thinking: false) for the fast steps. That cut those calls from 130–400 output tokens to about 10, made them 2–3× faster, and kept the credits for Ultra's final verdict.
  • Deterministic code around the models. A rule engine catches fake .gov.in links, look-alike domains, OTP requests and .apk files in English, Hinglish, Hindi and Tamil, instantly and without a model. Guardrails the model cannot override decide what may be called VERIFIED or SCAM.
  • The app: Python and FastAPI streaming each step live (Server-Sent Events) to a mobile-friendly web page, and a Telegram bot on a webhook in the same app, deployed on Render with GitHub Actions running tests and building the container on every pull request.
  • Measured, not guessed: a 50-message labelled test set, including 8 scams we invented ourselves, runs with one command, with results published in the repo.

Challenges we ran into

  • No Nemotron model on Token Factory accepts images. We confirmed it by sending a test image to every Nemotron model, then used Qwen3.8-27B purely to transcribe screenshots, keeping every judgement on Nemotron.
  • Code-mixed Indian languages. Nemotron 3 Nano read a Tamil "electricity connection will be cut" scam as a broadband outage. We compared models per step and moved message understanding to Nemotron 3.5 Lightning, which got it right and was faster.
  • Warnings that look like scams. Our first OTP rule flagged RBI's own advice, "never share your OTP", as a scam. It now fires only on actual requests, with negation handling in four languages.
  • Not accusing real businesses. A real lender's marketing SMS (an http link plus "approval in 2 minutes") came back as SCAM. We made "SCAM needs evidence" a hard rule: without a contradicting source, a critical signal, or a playbook that takes something from you, the answer is UNVERIFIED with the risks explained.
  • Telegram privacy mode silently strips the replied-to message from group commands. We found it by logging the update's structure (never its content) in production.
  • Never handing users a working scam link. Telegram makes URLs and phone numbers tappable, so our own warning could become a one-tap route to the scammer. Scam links are now shown as hxxp://pw5[.]in and phone numbers as code; official links stay clickable.

Accomplishments that we're proud of

On our 50-message test set (32 scams, including 8 invented "zero-day" scams with no search history, and 18 genuine messages, in English, Hinglish, Hindi, Tamil and Tanglish):

  • 0 of 32 scams called safe
  • 8 of 8 zero-day scams caught
  • 0 of 18 genuine messages called a scam
  • The manipulation fingerprint alone, with no search at all, flags every scam and none of the genuine messages

Every evaluation run also found a real bug before users could (the OTP false positive, a duplicate-source merge that hid official evidence, a Hindi reply to an English message), and each is fixed with a test.

What we learned

  • Size the model to the step. Choosing a Nemotron model per step (Lightning read Tamil correctly where Nano didn't; Ultra only for the final verdict) kept checks fast and affordable, and switching reasoning off where it isn't needed was the single biggest saving.
  • Wrap models in rules they can't argue with. "VERIFIED needs an official source" and "SCAM needs evidence" are a few lines of code that make the system trustworthy in both directions.
  • Absence of evidence isn't proof. For a new scam, the facts can't be checked yet, but the tactics can. That insight became the manipulation layer.
  • Measure everything. A small labelled set run after every change caught regressions we would never have noticed by hand.

What's next

  • WhatsApp itself, through the WhatsApp Business API, where these forwards actually spread
  • Voice notes: many forwards are audio, and NVIDIA's open speech models (such as Parakeet) could transcribe them
  • More languages for the rule engine: Bengali, Telugu, Marathi, Malayalam, Kannada
  • A "trending scams" view: anonymous counts of which scams are being checked this week, as an early warning for fact-checkers
  • A larger test set built from real PIB Fact Check, BOOM and Alt News cases

Built With

  • docker
  • fastapi
  • github-actions
  • nebius-token-factory
  • nvidia-nemotron
  • python
  • qwen
  • render
  • tavily
  • telegram-bot-api
Share this project:

Updates

Submission history