How it works

Four steps, one integration.

Two endpoints and one webhook URL. No fiscal hardware to buy, and nothing to install on the till.

The flow

From your till to KRA and back

1 / 4

Your system

POST /api/v1/invoices

One JSON invoice, keyed on your own reference. Double-click or retry storm, it signs once.

2 / 4

VeTims

OSCU / VSCU

Queued, retried and reconciled. A slow or unreachable KRA never blocks your till.

3 / 4

KRA eTIMS

resultCd 000

The control unit signs, and returns the signature, internal data and CU invoice number.

4 / 4

The receipt

invoice.signed

Print what came back. Your customer scans the QR and checks the invoice against KRA.

One round trip · your till never waits on KRA

Every field, in one place →

The surface

Two endpoints, one webhook URL

POST /api/v1/invoices

Records the sale and queues it. 202 the first time, 200 on any replay of the same reference.

GET /api/v1/invoices/{reference}

Status poll, for systems that would rather not receive webhooks.

invoice.signed · invoice.failed

Both carry the full invoice, so one webhook is enough to print the receipt.

Bearer token per tenant · 120 requests a minute · sandbox and production on the same shapes

Failure

What happens when something breaks

KRA rejects the invoice

A business rejection is permanent, so we do not retry it. The invoice is marked failed with KRA's own result code, and invoice.failed fires immediately.

KRA is slow or unreachable

Transport failures get five attempts, backing off 10s, 30s, 1m, 2m, 5m. Your till never waits on it.

Your endpoint is down

Webhooks get six attempts, backing off 30s, 2m, 10m, 30m, 1h. Every attempt is logged, and the poll endpoint always holds the same answer.

You send the same sale twice

The second POST returns 200 with the first invoice. One reference, one signature, one entry in the KRA sequence.

Included

What you get on day one

Idempotent invoice API

Send a sale twice, it signs once. Your reference is the key.

Server-side tax engine

Categories A to E computed from VAT-inclusive prices. Five VAT classes your code never sees.

Spec-exact credit notes

Refunds reference the original sale, carry negative amounts, and follow KRA's cancel-once rules.

Signed webhooks

HMAC-SHA256 over a timestamped body, retried for an hour, every delivery logged and replayable.

Queue, retry, reconcile

Nothing signs twice and nothing vanishes, whatever KRA is doing.

Device management

Serials, keys and invoice sequences handled per branch under your PIN. OSCU today; VSCU is registered and follows.

Operator console

Every invoice, device and delivery visible; failures retried in one click.

Printable fiscal block

Everything the printed receipt must carry, returned per invoice.

The field reference → What a pilot costs → Questions from integration teams →

Sign your first invoice in the sandbox this week.

Tell us what your system does. We reply with a token, a device and a working example against the KRA sandbox.

Start a pilot +254 764 444 408