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.
| Scope | Description |
|---|---|
kra:returns |
File TOT and NIL tax returns |
| 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 |
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.
{
"TaxpayerPIN": "P051234567A",
"Month": "03",
"Year": "2026",
"GrossTurnover": 450000.00
}
{
"TAXPAYERDETAILS": {
"TaxpayerPIN": "P051234567A",
"Month": "03",
"Year": "2026",
"GrossTurnover": 450000.00
}
}
| 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"
}
| 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 |
| 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.
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:
{
"TaxpayerPIN": "P051234567A",
"ObligationCode": "1",
"Month": "03",
"Year": "2026"
}
{
"TAXPAYERDETAILS": {
"TaxpayerPIN": "P051234567A",
"ObligationCode": "1",
"Month": "03",
"Year": "2026"
}
}
| 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"
}
| 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 |
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 | 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 |
{
"success": false,
"message": "Required fields missing: TAXPAYERDETAILS.TaxpayerPIN, TAXPAYERDETAILS.GrossTurnover",
"error": "validation_error"
}
{
"success": false,
"message": "Required fields missing: TAXPAYERDETAILS.ObligationCode",
"error": "validation_error"
}
| 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 |
AckNumber for your recordsGrossTurnover: 0 for zero-turnover months; use NIL for no-activity monthsBack to: KRA Overview | KRA Payments