EFRIS Gateway

EFRIS integration for your ERP

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.

Two ways to use it

Most businesses want the first. Software companies and larger IT teams usually want the second.

We run it for you

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.

  • Set up in a day, billed annually per taxpayer
  • We keep pace with URA changes
  • Support when a document is rejected
Talk to us about integration

You run it yourself

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.

  • One payment, no recurring fees
  • Unlimited taxpayers on one deployment
  • Yours to modify and rebrand
See licence details

What it handles

The parts of EFRIS that are tedious to implement and easy to get subtly wrong.

Protocol and cryptography

The session handshake, RSA signing, AES payload encryption and the compressed response formats — handled per taxpayer and cached between requests.

Tax arithmetic

Tax-inclusive pricing, zero-rated, exempt and deemed lines, excise duty and discount lines, reconciled to the totals URA validates against.

Multiple taxpayers

Each taxpayer has their own certificate, device, API key, address allow-list and daily quota. One deployment serves all of them.

A record of every exchange

Both sides of every submission are stored, so a rejected document can be examined afterwards rather than reconstructed.

Getting started

Four steps from an API key to a fiscalised invoice.

  1. Register your products

    A product must exist in URA's catalogue before it can appear on an invoice.

  2. Record your opening stock

    URA rejects an invoice for goods it has no stock recorded against.

  3. Submit an invoice

    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
          }
        ]
      }'
  4. Print the fiscal document

    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"
      }
    }

Endpoints

The main integration surface. Every URA interface is reachable; the documentation lists them all.

PurposeMethodPath
Fiscalise an invoicePOST/api/efris/submit-invoice
Raise a credit notePOST/api/efris/submit-credit-note
Register a productPOST/api/efris/register-product
Record stock receivedPOST/api/efris/stock-increase
Record stock written downPOST/api/efris/stock-decrease
Retrieve an invoiceGET/api/efris/invoice/{fdn}
Look up a taxpayerGET/api/efris/taxpayer/{tin}
Check the connectionGET/api/efris/diagnostics

Own the code

Complete source code. Serve unlimited taxpayers from one deployment, with no per-taxpayer or recurring fees.

One-time multi-tenant licence USD 4500 Paid once. Not a subscription.

What is included

  • Unlimited taxpayers on a single deployment
  • Full TypeScript source, yours to modify and rebrand
  • Every URA EFRIS interface implemented and tested
  • Multi-tenant admin portal: clients, certificates, API keys
  • Docker deployment and setup documentation
  • Postman collection covering every endpoint
  • No licence keys, no per-transaction fees

Common questions

What is EFRIS?

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.

Do I have to integrate with EFRIS myself?

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.

Which systems does it work with?

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.

How long does setup take?

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.