A single REST API between your accounting system and the Uganda Revenue Authority's EFRIS service. Submit an invoice as ordinary JSON and receive the fiscal document number, verification code and QR code in the response.
Most businesses want the first. Software companies and larger IT teams usually want the second.
UGX 1,300,000 to set up
then UGX 1,000,000 per taxpayer per year
You send invoices to our API and we handle EFRIS — certificates, signing, the URA protocol and every specification change. Nothing to host, nothing to maintain.
USD 4,500 once
no recurring fee, ever
The complete source, deployed on your own infrastructure. Serve unlimited taxpayers and charge them what you like — you sell the service, we do not take a share.
Serving more than a handful of taxpayers, the licence costs less than the subscriptions it replaces within the first year or two — and nothing after that.
The parts of EFRIS that are tedious to implement and easy to get subtly wrong.
The session handshake, RSA signing, AES payload encryption and the compressed response formats — handled per taxpayer and cached between requests.
Tax-inclusive pricing, zero-rated, exempt and deemed lines, excise duty and discount lines, reconciled to the totals URA validates against.
Each taxpayer has their own certificate, device, API key, address allow-list and daily quota. One deployment serves all of them.
Both sides of every submission are stored, so a rejected document can be examined afterwards rather than reconstructed.
Four steps from an API key to a fiscalised invoice.
A product must exist in URA's catalogue before it can appear on an invoice.
URA rejects an invoice for goods it has no stock recorded against.
Send the sale as JSON. Field names may be snake_case or camelCase.
curl -X POST https://efrisgateway.com/api/efris/submit-invoice \
-H "X-API-Key: $EFRIS_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"format": "simple",
"invoice_number": "INV-2026-000412",
"invoice_date": "2026-08-21",
"customer_name": "Nakawa Traders Ltd",
"buyer_type": "1",
"payment_method": "102",
"items": [
{
"item_name": "Bottled water 500ml",
"item_code": "WTR-500",
"quantity": 12,
"unit_price": 1500,
"tax_rate": 18
}
]
}'
The response carries everything the printed invoice must show.
{
"success": true,
"invoiceNumber": "INV-2026-000412",
"fdn": "325043056477",
"verificationCode": "234893273725405146366",
"qrCode": "iVBORw0KGgoAAAANSUhEUg...",
"summary": {
"netAmount": 15254.24,
"taxAmount": 2745.76,
"amountPayable": 18000,
"amountInWords": "Eighteen thousand shillings only",
"paymentMode": "Cash"
}
}
The main integration surface. Every URA interface is reachable; the documentation lists them all.
| Purpose | Method | Path |
|---|---|---|
| Fiscalise an invoice | POST | /api/efris/submit-invoice |
| Raise a credit note | POST | /api/efris/submit-credit-note |
| Register a product | POST | /api/efris/register-product |
| Record stock received | POST | /api/efris/stock-increase |
| Record stock written down | POST | /api/efris/stock-decrease |
| Retrieve an invoice | GET | /api/efris/invoice/{fdn} |
| Look up a taxpayer | GET | /api/efris/taxpayer/{tin} |
| Check the connection | GET | /api/efris/diagnostics |
Complete source code. Serve unlimited taxpayers from one deployment, with no per-taxpayer or recurring fees.
What you may and may not do with the code, answered before you have to ask.
Yes. Paid once, no expiry, no renewal, no licence key, and nothing that phones home. It keeps working whether or not you ever pay us again.
All of it. Nothing obfuscated, nothing compiled away, no proprietary module held back and licensed separately. What runs the service is what you receive.
None. Unlimited taxpayers on one deployment, and no per-invoice or per-transaction charge. Each taxpayer gets their own certificate, device number, API key and quota.
Yes — run it as your own EFRIS service, embed it in a product you sell, or deploy it internally, and charge what you like. What you may not do is resell, sublicense or redistribute the source itself. You may sell the service, not the software.
Yes. The brand name, public URL and contact details are configuration rather than code, so it rebrands without touching source — and the source is yours to change anyway.
What you have keeps working. URA does move — T186 and T187 arrived in 2024, T127 and T130 changed in 2025 — so updates are available as an optional annual arrangement, quoted separately. Never required.
Getting the first deployment running and the first taxpayer submitting. Ongoing support and integration work are quoted separately, and are optional — nothing stops working without them.
Yes. A walkthrough of the admin portal and the code structure can be arranged first. The API documentation and Postman collection are public already.
The Electronic Fiscal Receipting and Invoicing Solution operated by the Uganda Revenue Authority. VAT-registered businesses in Uganda must submit invoices to it and print the fiscal document number, verification code and QR code URA returns.
No. Send invoices here as ordinary JSON and the gateway handles the protocol — the session handshake, RSA signing, AES encryption and the tax arithmetic URA validates. Or licence the source and run it yourself.
Any system that can make an HTTPS request. Field names are accepted in either snake_case or camelCase, so most ERPs, point-of-sale systems and custom applications integrate without a plugin.
A day for a straightforward integration, once the taxpayer's certificate is registered with URA and their products are recorded. Most of the elapsed time is URA's registration, not the integration itself.
Enterprise software, EFRIS integration and tax compliance � Kampala, Uganda.
Send a message and we will come back to you.
Kyambogo-k4-Nakawa