Salami Gateway

API Documentation
Back to Dashboard

KRA Tax Returns API

File Turnover Tax (TOT) returns and NIL returns through the KRA developer.go.ke API. These endpoints support basic return filing for small businesses and nil-declaration scenarios.

Table of Contents

  1. Overview
  2. File TOT Return
  3. File NIL Return
  4. Obligation Codes
  5. Status Codes

Overview

Required Scope

Scope Description
kra:returns File TOT and NIL tax returns

Endpoint Summary

Method Endpoint KRA Path Description
POST /api/kra/returns/tot /filing/v1/tot/paymentregistration File Turnover Tax return
POST /api/kra/returns/nil /dtd/return/v1/nil File NIL return

File TOT Return

Submit a Turnover Tax (TOT) return. TOT applies to businesses with annual gross turnover between KES 1 million and KES 50 million.

Endpoint: POST /api/kra/returns/tot

Required Scope: kra:returns

Request Body:

You can submit fields in either flat or nested format. Salami wraps flat fields inside TAXPAYERDETAILS automatically.

Flat Format

{
  "TaxpayerPIN": "P051234567A",
  "Month": "03",
  "Year": "2026",
  "GrossTurnover": 450000.00
}

Nested Format

{
  "TAXPAYERDETAILS": {
    "TaxpayerPIN": "P051234567A",
    "Month": "03",
    "Year": "2026",
    "GrossTurnover": 450000.00
  }
}

Parameter Table

Field Type Required Description
TaxpayerPIN string Yes KRA PIN of the taxpayer
Month string Yes Return month (01-12, zero-padded)
Year string Yes Return year (YYYY)
GrossTurnover number Yes Total gross turnover for the period (KES)

Request:

curl -X POST \
  https://yourtenant.salami.dgl.co.ke/api/kra/returns/tot \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "TaxpayerPIN": "P051234567A",
    "Month": "03",
    "Year": "2026",
    "GrossTurnover": 450000.00
  }'

Success Response:

{
  "success": true,
  "data": {
    "AckNumber": "TOT/ACK/2026/001234",
    "TaxpayerPIN": "P051234567A",
    "Period": "March 2026",
    "GrossTurnover": 450000.00,
    "TaxRate": 3,
    "TaxPayable": 13500.00,
    "PRN": "KRA2026000567890",
    "DueDate": "2026-04-20",
    "Status": "Filed"
  },
  "message": "TOT return filed successfully"
}

Response Fields

Field Type Description
AckNumber string Filing acknowledgement number
TaxpayerPIN string The taxpayer's KRA PIN
Period string Human-readable return period
GrossTurnover number Declared gross turnover
TaxRate number Applied TOT rate (%)
TaxPayable number Calculated tax payable (KES)
PRN string/null Payment Reference Number (if tax is due)
DueDate string Payment due date
Status string Filed, Processing, or Error

TOT Rate

Annual Turnover Range TOT Rate
KES 1,000,000 - KES 50,000,000 3% of gross turnover

Note: TOT rate is 3% as of January 2024. Rates are subject to KRA changes.


File NIL Return

Submit a NIL return when there is no income or activity to report for a given period. NIL returns can be filed for any obligation.

Endpoint: POST /api/kra/returns/nil

Required Scope: kra:returns

Request Body:

Flat Format

{
  "TaxpayerPIN": "P051234567A",
  "ObligationCode": "1",
  "Month": "03",
  "Year": "2026"
}

Nested Format

{
  "TAXPAYERDETAILS": {
    "TaxpayerPIN": "P051234567A",
    "ObligationCode": "1",
    "Month": "03",
    "Year": "2026"
  }
}

Parameter Table

Field Type Required Description
TaxpayerPIN string Yes KRA PIN of the taxpayer
ObligationCode string Yes Tax obligation type (see table below)
Month string Yes Return month (01-12, zero-padded)
Year string Yes Return year (YYYY)

Request:

curl -X POST \
  https://yourtenant.salami.dgl.co.ke/api/kra/returns/nil \
  -H 'Authorization: Bearer YOUR_API_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{
    "TaxpayerPIN": "P051234567A",
    "ObligationCode": "1",
    "Month": "03",
    "Year": "2026"
  }'

Success Response:

{
  "success": true,
  "data": {
    "AckNumber": "NIL/ACK/2026/005678",
    "TaxpayerPIN": "P051234567A",
    "ObligationCode": "1",
    "ObligationName": "Income Tax - Resident Individual",
    "Period": "March 2026",
    "Status": "Filed",
    "FiledAt": "2026-03-29T12:30:00Z"
  },
  "message": "NIL return filed successfully"
}

Error Response (already filed):

{
  "success": false,
  "message": "KRA API error: Return for this period has already been filed",
  "error": "kra_error"
}

Response Fields

Field Type Description
AckNumber string Filing acknowledgement number
TaxpayerPIN string The taxpayer's KRA PIN
ObligationCode string The obligation code submitted
ObligationName string Human-readable obligation name
Period string Human-readable return period
Status string Filed or Error
FiledAt string ISO 8601 timestamp of filing

Obligation Codes

Use these codes with the NIL return endpoint:

Code Obligation Description
1 Income Tax - Resident Individual Individual income tax (residents)
2 Income Tax - Non-Resident Income tax for non-residents
3 Income Tax - PAYE Pay As You Earn (employer-withheld)
4 Value Added Tax (VAT) VAT on goods and services
5 Excise Duty Excise duty on specified goods
6 Withholding Tax Withholding tax returns
7 Turnover Tax (TOT) Turnover tax for small businesses
8 Rental Income Tax Tax on rental income

Obligation Applicability

Obligation Who Files
Income Tax (1, 2) Individuals with KRA PIN
PAYE (3) Employers with registered employees
VAT (4) VAT-registered businesses
Excise (5) Excise-licensed manufacturers/importers
WHT (6) Entities making withholding-eligible payments
TOT (7) Businesses in the TOT bracket
Rental (8) Landlords earning rental income

Validation Errors

TOT Return

{
  "success": false,
  "message": "Required fields missing: TAXPAYERDETAILS.TaxpayerPIN, TAXPAYERDETAILS.GrossTurnover",
  "error": "validation_error"
}

NIL Return

{
  "success": false,
  "message": "Required fields missing: TAXPAYERDETAILS.ObligationCode",
  "error": "validation_error"
}

Status Codes

Code Description
200 Return filed successfully
401 Invalid or missing Salami token
403 Token lacks kra:returns scope
422 Missing required fields or invalid obligation code
502 KRA server error or timeout

Best Practices

  1. File on time -- Monthly returns are due by the 20th of the following month
  2. File NIL when inactive -- Always file NIL returns even when there is no activity to report
  3. Verify obligation status -- Use Tax Obligations checker to confirm which obligations are active
  4. Store acknowledgement numbers -- Save the AckNumber for your records
  5. Avoid duplicate filings -- Check if a return for the period has already been filed
  6. Zero vs NIL -- Use TOT endpoint with GrossTurnover: 0 for zero-turnover months; use NIL for no-activity months

Related Documentation


Back to: KRA Overview | KRA Payments


Need help? Contact us at support@dgl.co.ke
© 2026 Deadan Group Limited. All rights reserved.
⚡ API Explorer
LIVE
// Response will appear here...