{
"id": "sale_example_1:ACCEPTED:1",
"event": "sale.completed",
"occurredAt": "2026-10-02T10:15:31.000Z",
"data": {
"sale": {
"id": "sale_example_1",
"type": "sale",
"status": "completed",
"traderInvoiceNumber": "INV-2026-0001",
"saleDate": "2026-10-02",
"paymentTypeCode": "01",
"customer": {
"name": "Example Customer Ltd",
"pin": "P000000000X",
"phone": null,
"email": null
},
"lines": [
{
"id": "line_example_1",
"itemId": "itm_example_1",
"name": "500ml Cooking Oil",
"description": "500ml Cooking Oil",
"quantity": 2,
"unitPrice": 3500,
"total": 7000,
"taxableAmount": 6034.48,
"taxAmount": 965.52,
"taxRate": 16,
"taxTypeCode": "B"
}
],
"totals": {
"total": 7000,
"taxableAmount": 6034.48,
"taxAmount": 965.52
},
"receipt": {
"cuInvoiceNo": "KRACU0000000000/12 NS",
"receiptNumber": 12,
"receiptLabel": "NS",
"scuId": "KRACU0000000000",
"scuDate": "02/10/2026",
"scuTime": "10:15:30",
"totalReceiptCounter": "12",
"signature": "AAAA-BBBB-CCCC",
"internalData": "DDDD-EEEE-FFFF",
"verificationUrl": "https://etims-verify.example/receipt?id=EXAMPLE",
"originalCuInvoiceNo": null
},
"originalSaleId": null,
"error": null
}
}
}Sales
Result callback sent by us
When you send a callbackUrl with a sale or credit note, Sync2Books sends the result there as a POST once KRA accepts or rejects it. Reply with any 2xx within 10 seconds. The call is not signed: treat it as a notification and confirm with GET /v1/sales/{id} before you act on it. See Result callbacks.
WEBHOOK
saleResult
{
"id": "sale_example_1:ACCEPTED:1",
"event": "sale.completed",
"occurredAt": "2026-10-02T10:15:31.000Z",
"data": {
"sale": {
"id": "sale_example_1",
"type": "sale",
"status": "completed",
"traderInvoiceNumber": "INV-2026-0001",
"saleDate": "2026-10-02",
"paymentTypeCode": "01",
"customer": {
"name": "Example Customer Ltd",
"pin": "P000000000X",
"phone": null,
"email": null
},
"lines": [
{
"id": "line_example_1",
"itemId": "itm_example_1",
"name": "500ml Cooking Oil",
"description": "500ml Cooking Oil",
"quantity": 2,
"unitPrice": 3500,
"total": 7000,
"taxableAmount": 6034.48,
"taxAmount": 965.52,
"taxRate": 16,
"taxTypeCode": "B"
}
],
"totals": {
"total": 7000,
"taxableAmount": 6034.48,
"taxAmount": 965.52
},
"receipt": {
"cuInvoiceNo": "KRACU0000000000/12 NS",
"receiptNumber": 12,
"receiptLabel": "NS",
"scuId": "KRACU0000000000",
"scuDate": "02/10/2026",
"scuTime": "10:15:30",
"totalReceiptCounter": "12",
"signature": "AAAA-BBBB-CCCC",
"internalData": "DDDD-EEEE-FFFF",
"verificationUrl": "https://etims-verify.example/receipt?id=EXAMPLE",
"originalCuInvoiceNo": null
},
"originalSaleId": null,
"error": null
}
}
}Body
application/json
The body sent to your callbackUrl. It is not signed: confirm with GET /v1/sales/{id} before acting on it.
Response
200
Any 2xx response marks the delivery as received.