Read every mobile-money and bank message, and catch the fakes

    Pull the amount, sender, reference and date out of mobile-money and bank SMS, then decide in one pass whether it is genuine, which account it belongs to and whether anyone needs to look at it.

    Fintech & lendingMobile moneyMerchants & POSFraud & risk
    0.984
    AMOUNTS, FIELD ACCURACY
    0.979
    DATES, FIELD ACCURACY
    0.668
    AFRICAN TYPED DECISIONS, 8 LANGUAGES
    / The problem

    Why this breaks today

    Across Africa, a payment often exists only as a text message: an MTN MoMo confirmation, an M-Pesa receipt, a bank alert forwarded as a screenshot. Lenders, merchants and bookkeeping apps need those numbers in a database, and every provider words its messages differently.

    Fake alerts are written to look exactly like the real ones. Parsing the text is not enough; something has to judge whether the message should be trusted before the goods leave the counter.

    / How it works

    The pipeline, step by step

    01

    Extract the fields

    MIST-Extract-1.0 fills a template with recipient, amount, fee, reference and date, from the text or a screenshot. On held-out documents it reads dates at 0.979, amounts at 0.984 and currencies at 0.975 field accuracy.

    MIST-Extract-1.0
    02

    Decide what it means

    Pass the message and the extracted fields to PurpleMIST-Flash-1.0 with your questions, for example: is this a genuine provider message, which ledger does it belong to, how urgent is a review. It answers every question in one pass, in English and eight African languages.

    PurpleMIST-Flash-1.0
    03

    Act on confidence

    Both models return calibrated confidences, so a payment can be booked automatically only when the fields and the verdict are all confident, and held for a person otherwise.

    / The code

    Running in about ten lines

    The Olaverse SDK wraps the models with sane defaults. If you would rather not add a dependency, the second tab is the same pipeline in plain transformers.

    $pip install "transformers>=5.19" torch pillow huggingface_hub
    payments.py
    import os, sys
    from huggingface_hub import hf_hub_download, snapshot_download
    
    path = snapshot_download("olaverse/MIST-Extract-1.0")
    sys.path.insert(0, path)
    from mist_extract import Extractor
    
    repo = "olaverse/PurpleMIST-Flash-1.0"
    sys.path.insert(0, os.path.dirname(hf_hub_download(repo, "purplemist.py")))
    from purplemist import Decider
    
    x = Extractor.from_pretrained(path, device="cuda")
    d = Decider.from_pretrained(repo, device="cuda")
    
    TEMPLATE = {"sender": "verbatim-string", "amount": "number", "currency": "string",
                "reference": "verbatim-string", "date": "date"}
    QUESTIONS = {
        "genuine": {"type": "noul", "instructions": "This is a genuine payment notification from a bank or mobile-money provider."},
        "review":  {"type": "noul", "instructions": "A person should check this before goods or credit are released."},
    }
    
    def handle(sms):
        fields = x.extract(TEMPLATE, text=sms, instructions="Dates are day/month/year.")
        verdict = d.decide({"message": sms, "extracted": fields["data"]}, QUESTIONS)
        return fields["data"], verdict
    / This is you if
    • Customers send you payment confirmations as SMS or screenshots, and someone retypes them.
    • You lend, sell on credit or release goods on the strength of a payment alert.
    • Fake transfer messages have cost you money.
    • Your customers write in English, Pidgin, Hausa, Yorùbá, Swahili or other African languages.

    Every figure on this page comes from the published model cards. Download the weights and check us.

    Want this on your data?

    The weights are open, so you can build it yourself this afternoon. If you would rather we tuned it to your domain, evaluated it properly, and handed it over, tell us what you are working on.