What URA EFRIS rejection codes mean and how to fix them — with Postman collections and working examples for Uganda's e-invoicing system.
# EFRIS integration guide (Uganda / URA)
Practical notes for integrating with **EFRIS**, the Electronic Fiscal Receipting
and Invoicing Solution operated by the Uganda Revenue Authority.
EFRIS answers a rejected submission with a numeric code and a terse sentence
that rarely says what to change. This repository documents what those codes
actually mean and how to fix them, alongside a Postman collection and worked
examples.
Everything here was learned against the live service, not transcribed from the
specification — the two disagree in several places, and the places they disagree
are exactly where integrations fail.
**Free to use. No account, no sign-up.**
---
## What is in here
| | |
| --- | --- |
| `errors/` | What each URA rejection means, and the fix |
| `postman/` | Postman collections for the EFRIS interfaces |
| `examples/` | Submitting an invoice, in curl, JavaScript and Python |
---
## The rejections that come up most
Start here if a document is being rejected right now.
| Code | What it means |
| --- | --- |
| 15 | The session key expired server-side — not a payload problem |
| 306 | Taxpayer is not registered, or the TIN does not match the device |
| 676 | The product is not registered, or its stock is insufficient |
| 1304 | `summary.itemCount` counted a discount line as a product |
| 1343 | Line-level tax does not reconcile with the breakdown |
| 1344 | `summary.taxAmount` must **include** excise |
| 1345 | `summary.grossAmount` must **exclude** excise — the mirror of 1344 |
| 1462 | Excise on a credit note was dropped or mismatched |
| 1526 | Currency or exchange-rate handling on a non-UGX document |
| 2253 | The seller's reference number has already been used |
| 2831 | A tax breakdown row is missing its rate name |
The full index covers the rest.
---
## Things that catch almost everyone
A short list of behaviours that are not obvious from the specification.
**The signature is SHA-1, not SHA-256.** RSA with PKCS#1 v1.5 padding, over th …