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.
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. The right choice if you need your invoices fiscalised and want someone else responsible for keeping it working.
Licence the complete source and deploy it on your own infrastructure. Suited to software vendors embedding EFRIS in their own product, and to companies whose IT department would otherwise build this from scratch.
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.
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.