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
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.
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.
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.
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.
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.
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.
| Flag | Severity | What it means |
|---|---|---|
| TOTAL_MISMATCH | Critical | Line items do not sum to the printed total, beyond rounding tolerance. |
| DUPLICATE_SLIP | Critical | This slip hash has already been seen inside the same campaign_id. |
| DATE_OUT_OF_WINDOW | Critical | Purchase timestamp falls outside the campaign period you supplied. |
| SCREEN_CAPTURE | Warning | Image shows moiré or backlight consistent with a photo of a display. |
| VAT_INCONSISTENT | Warning | Printed VAT does not match 15% of the taxable portion. |
| LOW_FIELD_CONFIDENCE | Warning | One or more required fields were read below your confidence floor. |
| FADED_THERMAL | Notice | Print contrast is low — parsed, but worth a human glance on high-value prizes. |
| PARTIAL_CROP | Notice | An 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.
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.
Overage is not billed silently — calls past your monthly quota return 429 with a clear upgrade path. Cancel any time; see the refund policy.
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"
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.
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.
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.
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.
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.
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.
Yes — the free tier exists so you can find that out before paying, and paid subscriptions are covered by the refund policy.