Live · Made in Lagos 🇳🇬 · see the evidence

Two models have to agree
before we block anything.

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.

POST /verdict
⌘ Enter to submit

Or try an example

    Example · press Check message to run it live

    Send to review

    Models disagree. Send to a human review queue.

    v1 · long formlegitimate
    v2 · short SMSscam
    Message text never stored Tuned on Nigerian SMS patterns One POST request to integrate

    How it decides

    Three answers, not two.

    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.

    blockBoth flag it. High precision. 2 false alarms in 40.
    reviewThey disagree. A human decides. No scam got past.
    passNeither flags it. Deliver normally.

    Blocking is expensive

    A customer who cannot receive an OTP cannot log in or pay. So Wilma only blocks when both models agree.

    Uncertain goes to a person

    When the models disagree, the message is queued for review instead of guessed. That is where most real fraud was caught.

    Private by design

    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

    Measured, including where it fails.

    Evaluated September 2026. The Nigerian set is 40 real world messages, 20 scam and 20 legitimate. Small, so treat every figure as directional.

    20/20
    Scams flagged
    Both models together, Nigerian set
    0→6/8
    Short scams caught
    After fixing the length bias
    80%
    Nigerian SMS accuracy
    Single model, v1
    17k
    Training messages
    Split by template, no leakage

    The length experiment

    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.

    Short
    0 of 8
    6 of 8
    Medium
    4 of 8
    7 of 8
    Long
    7 of 8
    7 of 8
    v1, beforev2, retrained on short messages
    TestWhat it measuresResult
    Held out test setData drawn like the training data98.1%
    Nigerian SMS setReal scams and real bank alerts80.0%
    Scams flaggedRecall across both models20 of 20
    Block precisionWhen both models agree0.778

    The number we do not lead with.

    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

    One POST.
    JSON in, verdict out.

    Create a key in your dashboard, send the message text, act on the verdict.

    • 300 requests a minute per key, rate limited fairly
    • Batch up to 50 messages in one call
    • Usage metered per key, content never logged
    • Interactive reference at /docs
    Get an API key → Read the docs
    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
    }

    Questions

    What people ask first.

    How accurate is it, really?

    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.

    What happens when it is wrong?

    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.

    What do you do with our customers' messages?

    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.

    What does it cost?

    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.

    How long does integration take?

    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.

    Who built this?

    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.

    Run it against your own messages.

    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.