Error codes / 2253
EFRIS error 2253 — that seller's reference number has already been issued
The reference number on this document has already been used for this taxpayer. Because the reference comes from your own accounting system, two tills — or two integrators on one TIN — can generate the same number for genuinely different documents.
Deciding how to handle this is a business decision, not a technical one. Read the trade-off below before automating a retry.
What it actually means
URA returns: Invoice(s)/receipt(s) (…) with the same Seller's Reference Number have already been issued! Total invoices Issued(1)! EFRIS enforces uniqueness of the seller reference per taxpayer, across every device and integration on that TIN.
The fix
Either resubmit under a uniquified reference, or treat the rejection as proof the document already reached URA. Which is correct depends on why the collision happened.
import uuid
from efris import EfrisError
try:
client.upload_invoice(document)
except EfrisError as exc:
if exc.code == "2253":
base = document["sellerDetails"]["referenceNo"]
suffix = uuid.uuid4().hex[:6].upper()
ref = f"{base}-{suffix}"
if len(ref) > 50: # URA's limit
ref = f"{base[:50 - len(suffix) - 1]}-{suffix}"
document["sellerDetails"]["referenceNo"] = ref
client.upload_invoice(document)
else:
raise
Why this happens
The trade-off. Uniquifying and resubmitting favours "every sale reaches URA" over "never submit twice". That is right when two tills genuinely produced the same number for different sales — rejecting the second would leave a real sale unfiscalised. It is wrong when your own caller is retrying after a lost response, because the sale is already recorded and you would fiscalise it twice under two references. If your client retries, disable the automatic recovery and reconcile with T106 or T117 first.
Related
- Error 15 — Data decryption error — the session key expired; redo T104
- Error 306 — A credit note has already been issued against that invoice
- All EFRIS error codes
The EFRIS API Kit handles this case already — it is one of the rejections the library was calibrated against. This page stays free either way.