Kassie /ˈkʌsi/ · the little till
Till-slip parsing · South Africa

Your OCR has never seen a Checkers slip.

Kassie reads South African till slips and hands back structured JSON — line items, 15% VAT, ZAR totals, store and date — then scores the slip for the fraud that actually shows up in promo campaigns. Built on local retailer layouts, not American invoices.

No card for the free tier · Test keys never bill · Images discarded by default

SHOPRITE CHECKERS
BRACKENFELL · VAT 4010105877

MILK FCREAM 2L34.99
STIMOROL SF 14G12.99
BREAD WHITE18.49
COFFEE 200G89.99

TOTALR 156.46
VAT @ 15%20.41
CASH200.00
CHANGE43.54

2026/08/22 17:41 · TILL 07 · OP 214
SLIP 0074-2214-8891
{ "status": "parsed", "retailer": "shoprite", "store": "Brackenfell", "bought_at": "2026-08-22 17:41", "currency": "ZAR", "total": "156.46", "vat_rate": 0.15, "vat_amount": "20.41", "line_items": [ 4 items ], "totals_reconcile": true, "slip_hash": "9f2c…a41d", "flags": [] }
The gap

The till speaks Afrikaans. So do we.

Mindee, Veryfi and Taggun are trained on North American and European receipts. Point them at a South African slip and they get close — close is what costs you an audit.

Local layouts, not generic receipts

Shoprite, Checkers, Pick n Pay, Spar, Woolworths and Makro each put the total, the VAT line and the store identifier somewhere a US-trained model does not look. Kassie is fitted to those layouts one retailer at a time.

15% VAT has more than one shape

Inclusive, exclusive, split-rate baskets, zero-rated staples, VAT summarised at the foot or itemised per line. Kassie returns the rate as a fraction and the amount as a decimal string — no floats, no rounding drift.

Rands reconcile, or you hear about it

Cents, rounding to the nearest 10c, R versus ZAR versus nothing at all. Every parse checks line items against the printed total and tells you whether they agree.

Competition entries are not invoices

One slip entered twenty times. A photograph of a screen showing a photograph. A slip dated before the campaign opened. These are the failure modes of a promo mechanic, and they are what Kassie was built to catch.

Design decision

Kassie describes. You decide.

The API never rejects a slip. It returns a status, per-field confidence and a list of flags with severities, and your campaign rules do the judging — because the right call on a blurry slip differs between a R50 airtime giveaway and a car.

FlagSeverityWhat it means
TOTAL_MISMATCHCriticalLine items do not sum to the printed total, beyond rounding tolerance.
DUPLICATE_SLIPCriticalThis slip hash has already been seen inside the same campaign_id.
DATE_OUT_OF_WINDOWCriticalPurchase timestamp falls outside the campaign period you supplied.
SCREEN_CAPTUREWarningImage shows moiré or backlight consistent with a photo of a display.
VAT_INCONSISTENTWarningPrinted VAT does not match 15% of the taxable portion.
LOW_FIELD_CONFIDENCEWarningOne or more required fields were read below your confidence floor.
FADED_THERMALNoticePrint contrast is low — parsed, but worth a human glance on high-value prizes.
PARTIAL_CROPNoticeAn edge of the slip is cut off; extracted fields are still complete.

Fifteen flag codes across three severities in the v0 contract. The full list ships with the OpenAPI spec.

Pricing

Priced per slip, billed per month.

Prices in US dollars. Payments and invoicing are handled by Lemon Squeezy as merchant of record, so VAT is charged and remitted correctly wherever you are.

Free
$0 /mo
  • 100 slips a month
  • Full JSON contract
  • Test keys, deterministic fixtures
  • Community support
Get a key
Indie
$19 /mo
  • 1,000 slips a month
  • $0.019 per slip
  • Fraud flags and slip hashing
  • Email support
Subscribe
Campaign
$99 /mo
  • 10,000 slips a month
  • $0.010 per slip
  • Duplicate detection per campaign
  • 30-day slip retrieval
  • Priority email support
Subscribe
Agency
Quote
  • Unmetered, per-campaign licence
  • Multiple campaigns and sub-accounts
  • Retailer coverage on request
  • Direct line during activations
Talk to us

Overage is not billed silently — calls past your monthly quota return 429 with a clear upgrade path. Cancel any time; see the refund policy.

Quickstart

Five minutes, one POST.

Send an image, get a slip. Test keys return fixed fixtures and never touch your quota, so you can wire the integration before you have a single real photo.

# Parse a slip
curl -X POST https://api.kassie.dev/v1/slips \
  -H "Authorization: Bearer $KASSIE_KEY" \
  -F "image=@slip.jpg" \
  -F "campaign_id=stimorol-winter-26"

# Fetch it again within 30 days — never re-billed
curl https://api.kassie.dev/v1/slips/slp_8f21c4 \
  -H "Authorization: Bearer $KASSIE_KEY"

# Check your quota
curl https://api.kassie.dev/v1/usage \
  -H "Authorization: Bearer $KASSIE_KEY"

What you can rely on

Money is a decimal string. Never a float, in any field, ever.

VAT rate is a fraction. 0.15, not 15.

Confidence is per field, not a single pass/fail on the document.

The slip hash is computed over normalised extracted fields, not image bytes — so it survives re-photography, and two genuine purchases that happen to share a total stay distinct.

Images are discarded by default. Storage is opt-in per request.

Questions

The things people ask first.

Do you store the slip images?

No, not unless you ask. By default Kassie extracts the fields, computes the hash and discards the image. If your campaign needs the picture for adjudication you set store_image on the request and it is kept for 30 days, then deleted. This keeps POPIA exposure down to what you actually need.

Which retailers are supported?

The major South African grocery and general chains first, with per-retailer accuracy published as each one is measured against a hand-labelled truth set. If a retailer you need is not covered, tell us — coverage is driven by what campaigns actually receive.

What happens with an unreadable slip?

You get a response, not an error. Status, whatever fields were legible, per-field confidence and the relevant flags. Kassie never decides on your behalf that a slip is invalid.

Can I try it without a card?

Yes. The free tier is 100 slips a month with the full contract and no card. Test keys return deterministic fixtures and never bill, on any tier.

Who handles payment and VAT?

Lemon Squeezy, as merchant of record. They take payment, charge and remit VAT or sales tax in your jurisdiction, and issue the invoice. Kassie never sees your card details.

Is there a refund if it does not work for us?

Yes — the free tier exists so you can find that out before paying, and paid subscriptions are covered by the refund policy.