Skip to content

POS transaction integration

For integrations that read what happens at the till (accounting exports, loyalty, analytics).

Reading sales

GET /api/v1/businesses/{id}/sales?from=…&to=…&status=COMPLETED&channel=POS (orders:read). Without reports:read a token sees only sales its own application created; with it, all sales.

Each sale has subtotal, discountTotal, taxTotal, total, amountPaid, refundedTotal, costTotal, lines[] (per-line netAmount, taxAmount, grossAmount, taxClass, taxRate) and payments[].

Statuses: OPEN (unpaid online order), PARKED, QUOTE, PARTIALLY_PAID (balance on a customer account), COMPLETED, VOIDED. A completed sale is immutable — the database refuses edits. Refunds are separate Refund records and payments with direction: "OUT".

Events

  • sale.completed — a sale or paid order completed.
  • refund.created — { id, number, saleId, total, reason, restock }.

Payments

Payment.status is PENDING, AUTHORISED, CAPTURED, FAILED or CANCELLED. Only CAPTURED counts as money received. Card payments today come from standalone terminals: the cashier confirms approval and may record the last four digits. POS never receives or stores card numbers, CVVs or PINs, and the API rejects a card summary containing more than four digits.

Receipts

GET …/sales/{id}/receipt returns a structured document (?format=text for 42-column plain text). Wording follows the VAT Act: a VAT-registered business issues a "Tax Invoice"; over R5,000 a full tax invoice needs the buyer's details (the document lists anything missing).

Ringing up sales through the API

POST …/sales is available to signed-in staff (the register uses it). Integrations submit orders instead.