The eTIMS API for Kenyan software

Embed eTIMS
into your software.

TaxID connects your Kenyan invoicing, accounting or POS software to invoice submission, receipt lookup and reconciliation through one API.

REST API + Python SDK Branch-scoped access Original-reference lookup
Show API example
Invoice submission

Server-side API-key authentication. Use your assigned API URL and branch PIN. No client ID or client secret is required.

With your client configured and invoice mapped:

# invoice: your mapped SaleInvoice
receipt = client.submit_sale(
    invoice,
    idempotency_key="INV-2026-001",
)
print(receipt["cuInvoiceNumber"])
Complete request
import os
from kra_etims import KRAeTIMSClient, SaleInvoice, calculate_item, build_invoice_totals

client = KRAeTIMSClient(
    api_key=os.environ["TAXID_API_KEY"],
    base_url=os.environ["TAXID_API_URL"])

items = [calculate_item("Synthetic service invoice", "SRV-001", 5800, "B")]  # Band B = 16% VAT
receipt = client.submit_sale(
    SaleInvoice(tin="A000123456B", bhfId="00", invcNo="INV-2026-001",
                custNm="Acacia Enterprises Ltd", confirmDt="20260311120000",
                itemList=items, **build_invoice_totals(items)),
    idempotency_key="INV-2026-001",
)
print(receipt["cuInvoiceNumber"])       # SIMULATED-CU/152 NS

With your mapped invoice saved as invoice.json:

curl "$TAXID_API_URL/v2/etims/sale" \
  -H "Authorization: Bearer $TAXID_API_KEY" \
  -H "Idempotency-Key: INV-2026-001" \
  -H "Content-Type: application/json" \
  --data @invoice.json
Complete request
curl -X POST "$TAXID_API_URL/v2/etims/sale" \
  -H "Authorization: Bearer $TAXID_API_KEY" \
  -H "Idempotency-Key: INV-2026-001" \
  -H "Content-Type: application/json" \
  -d '{
    "supplierPin":     "A000123456B",
    "amount":          5800.00,
    "invoiceDate":     "2026-10-07",
    "clientReference": "INV-2026-001",
    "taxBand":         "B",
    "taxAmount":       800.00,
    "buyerPin":        "P051234567X",
    "buyerName":       "Acacia Enterprises Ltd",
    "itemDescription": "Synthetic service invoice"
  }'
Illustrative simulated response SIGNED · SAMPLE
{
  "purchaseId": 152,
  "status": "SIGNED",
  "cuInvoiceNumber":
    "SIMULATED-CU/152 NS"
}
Fiscal operations

From invoice to fiscal outcome.

TaxID brings submission, receipt tracking and exception handling into your existing product.

Invoice and receipt API

Submit invoices, retrieve receipt fields and look up each sale by its original reference.

Recovery and reconciliation

Queue eligible work. Keep uncertain signing outcomes available for investigation before replay.

Branch-scoped access

Connect merchant branches with scoped application permissions and expiring, revocable credentials.

Control-unit integration

Keep branch device configuration and control-unit credentials behind your application’s API integration.

Integration

Connect. Submit. Track.

Keep your invoice workflow. Connect the fiscal operations through REST or the Python SDK.

Step 01

Connect your application

Authenticate server-side requests with a branch API key. No client ID or client secret is required.

Authorization: Bearer <API key>
Step 02

Map and submit invoices

Send invoice data from your application. Keep the original reference and idempotency key with each request.

pip install taxid-etims
Step 03

Track the outcome

Retrieve receipt fields and status by the original reference. Investigate uncertain outcomes before submitting another sale.

Submit → look up → reconcile
Your application
REST + API key
HTTPS
TaxID API
Branch credentials
Branch routing
VSCU control unit
Device state & signing
Fiscal submission
KRA eTIMS
Fiscal reporting

Your application maps invoice data; TaxID routes requests to the configured merchant branch. Production requires merchant authorisation and completed branch/control-unit setup.

Illustrative recovery

After a timeout, look up the same sale.

INV-2026-001
  1. 1. Submission times out

    Keep the original reference. The response alone cannot tell you whether signing happened.

  2. 2. Look up that reference

    In this example, lookup finds the stored SIGNED receipt for the same sale.

  3. 3. Reuse the receipt

    Retrieve its fields without submitting another sale. If the outcome is still uncertain, investigate before resubmitting.

Illustrative outcome, not a live submission. SIGNED records control-unit signing, not central KRA acceptance.

Interactive sample

See the receipt format.

Change the amount to see a sample receipt. No fiscal invoice is issued or submitted to KRA.

KES
Tax band
Taxable (net)—
VAT—
Total (gross)—

Set an amount and a band, then press Preview sample receipt to generate a sample.

Illustrative calculation and sample receipt; no request is submitted to KRA. Confirm applicable tax classification separately.

Questions

Developer questions.

Developer access

Request developer access.

Current developer access is free and invitation-based. Try your integration in the simulator; no fiscal invoices are issued or submitted to KRA.

TaxID is not yet KRA-approved. Production requires KRA approval, real KRA testing, merchant authorisation and operational acceptance. Production pricing is being finalized.

Work directly with the TaxID engineers during early access.

No spam. No sales call unless you ask for one.
Next: a private invitation by email when access is available. Use it to create your branch API key and test an integration.

✓

Request received.

We’ll email a private invitation when access is available. Open it to create your branch API key and test your integration in the simulator. This request does not grant production access. In the meantime, browse the eTIMS reference docs.