Fill a JSON template from a photo, a scan or plain text, with a calibrated confidence on every field. Built for African documents and currencies, in English and African languages.
Receipts from a market stall, a prepaid electricity token, a tenancy letter, a screenshot of a bank alert: the documents African businesses run on rarely look like the Western invoices that extraction tools are trained on. Amounts in naira or cedis get misread, dates get flipped and local names get mangled.
Even when an extractor is mostly right, it rarely says which fields it is unsure of, so every document still needs a person to check it end to end.
Describe the answer you want as JSON: field names, and a type for each one (verbatim text, number, date, a choice of options, or a list of objects). The format is the same as NuExtract’s, so existing templates move across unchanged.
Pass text, a photo or scan, or both. MIST-Extract-1.0 gets 91.8% of held-out English documents completely right, against 67.9% for NuExtract3 at the same 4B size, and every field on English receipt photos.
MIST-Extract-1.0Every field comes back with a calibrated confidence: values rated 0.99 and above are right 99.9% of the time, with calibration error of 0.008. Pick a threshold and send only the doubtful fields to a person.
MIST-Extract-1.0For high volume, MIST-Extract-Flash-1.0 takes the same templates at 2B and processes 9.7 documents per second on one RTX A6000, with 90.5% of English documents fully right.
MIST-Extract-Flash-1.0The 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.
import sys
from huggingface_hub import snapshot_download
path = snapshot_download("olaverse/MIST-Extract-1.0")
sys.path.insert(0, path) # the repo ships mist_extract.py
from mist_extract import Extractor
x = Extractor.from_pretrained(path, device="cuda")
TEMPLATE = {
"merchant": "verbatim-string",
"date": "date",
"total": "number",
"currency": ["NGN", "GHS", "KES", "ZAR", "USD", "Other"],
"items": [{"name": "verbatim-string", "quantity": "integer", "price": "number"}],
}
def read_receipt(photo, threshold=0.9):
out = x.extract(TEMPLATE, image=photo)
doubtful = [k for k, c in out["confidence"].items()
if isinstance(c, float) and c < threshold]
return {"data": out["data"], "needs_review": doubtful}Documents of every kind in these languages. Template keys stay in English.
Names of people, places, organisations and dates are also extracted in 14 more African languages, including Twi, chiShona, Fon, Kinyarwanda, Wolof, Ewe, isiXhosa and Luganda.
Every figure on this page comes from the published model cards. Download the weights and check us.
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.
/ Decisions · FrontierRoute, flag and score tickets, chats and records with calibrated probabilities, in English and eight African languages, from one self-hosted model instead of a chain of LLM calls.
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.