Blocking is expensive
A customer who cannot receive an OTP cannot log in or pay. So Wilma only blocks when both models agree.
Wilma reads an SMS and returns one of three answers: block, review, or pass. Built for Nigerian banks and fintechs, where wrongly blocking a customer's OTP costs more than missing a scam.
Free during pilot · No card needed · Messages are never stored
An animation of text messages passing through two model rings and coming out marked block, review or pass.
Example · press Check message to run it live
Models disagree. Send to a human review queue.
How it decides
Every message passes through two layers of judgement. The models were trained on different data and fail on different messages, so Wilma works the way a bank fraud team does.
A customer who cannot receive an OTP cannot log in or pay. So Wilma only blocks when both models agree.
When the models disagree, the message is queued for review instead of guessed. That is where most real fraud was caught.
Message text is processed in memory and thrown away. API keys are stored only as a hash, so not even we can read them.
Evidence
Evaluated September 2026. The Nigerian set is 40 real world messages, 20 scam and 20 legitimate. Small, so treat every figure as directional.
One scam, written short, medium and long. The first model only caught it when it was long. It had learned the shape of long email, not fraud.
| Test | What it measures | Result |
|---|---|---|
| Held out test set | Data drawn like the training data | 98.1% |
| Nigerian SMS set | Real scams and real bank alerts | 80.0% |
| Scams flagged | Recall across both models | 20 of 20 |
| Block precision | When both models agree | 0.778 |
An earlier version scored 99.24% on public data. On short Nigerian scams it caught zero out of eight. We retrained it and published both numbers.
The weakness left is false alarms on real transactional messages. A genuine OTP was once blocked with both models agreeing. Collecting real Nigerian bank SMS is the fix we are working on now.
Developers
Create a key in your dashboard, send the message text, act on the verdict.
curl -X POST https://huggingface.co/proxy/winifred12-wilma.hf.space/verdict \
-H "Content-Type: application/json" \
-H "Authorization: Bearer wlm_your_key" \
-d '{"text": "Your OTP is 483920. Do not share it."}'
# Response
{
"verdict": "pass",
"action": "No fraud signal. Deliver normally.",
"agreement": "neither",
"models": [ ... ],
"latency_ms": 1580.2
}
import requests
r = requests.post(
"https://huggingface.co/proxy/winifred12-wilma.hf.space/verdict",
headers={"Authorization": "Bearer wlm_your_key"},
json={"text": "Your BVN has been blocked. Click to reactivate."},
)
result = r.json()
if result["verdict"] == "block":
block_message()
elif result["verdict"] == "review":
send_to_review_queue()
const res = await fetch("https://huggingface.co/proxy/winifred12-wilma.hf.space/verdict", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": "Bearer wlm_your_key",
},
body: JSON.stringify({ text: message }),
});
const { verdict, action } = await res.json();
// verdict is "block", "review" or "pass"
Questions
80% on our 40 message Nigerian evaluation set, and 98.1% on a held out test set drawn from the same data as the training set. The second number is the less meaningful one, and we say so. The evaluation set is small, so treat every figure as directional until results on several hundred messages are published.
A missed scam reaches the customer, which is the failure every fraud system has. A false alarm blocks something legitimate, which for a bank is usually worse. That is why blocking needs both models to agree, and everything uncertain becomes a review rather than a block.
Nothing. Message text is processed in memory to produce a verdict and is never written to storage. We record the API key id, the endpoint, a message count and a timestamp, so usage can be counted. See the privacy policy.
Nothing during the pilot. Wilma is working with a small number of Nigerian fintechs at no cost while the Nigerian evaluation set grows. Any pricing will be agreed in writing before a charge is made.
One HTTP POST with a bearer token. A developer can have it screening messages in an afternoon. Batch classification takes up to 50 messages per request.
Wilma is built in Lagos by Winifred Ajah. The models, the evaluation method and the API are original work, and the evaluation notes, failures included, are public in the GitHub repository.
Send fifty of your own SMS, scam and legitimate, and see how Wilma scores them. We send the results back either way, including the ones it gets wrong.