The invoice must contain Invoice Issue Time (KSA-25). This value should be in the format: hh:mm:ss for time expressed in local time (eg 19:20:30) or hh:mm:ssZ for time expressed in UTC (eg 19:20:30Z)."The invoice must contain Invoice Issue Time (KSA-25). This value should be in the format: hh:mm:ss for time expressed in local time (eg 19:20:30) or hh:mm:ssZ for time expressed in UTC (eg 19:20:30Z).
What does this mean?
The document states when it was issued in two fields, not one: the issue date (BT-2) and the issue time (KSA-25). BR-KSA-04 checks that the date is not in the future; this rule checks that the time is there at all, and that it is written in one of two shapes.
The shapes the message names are hh:mm:ss for a local time and hh:mm:ssZ when the value is UTC. Two digits for each part, a 24-hour clock, seconds always present. A 12-hour clock with AM or PM, minutes with the seconds dropped, or a whole date and time in the field are all outside what the rule describes.
The date and the time have to describe the same instant. A sale at 01:30 in Riyadh is 22:30 the previous day in UTC: put a Riyadh date next to a UTC time and the document claims a moment that never happened. Take both from one reading of one clock.
It is also what goes into the QR code. The timestamp a customer scanning the invoice sees is built from this date and this time, so a wrong time is not only an XML field — it is printed on the document.
Why does it happen?
Ordered from the most common to the least — your cause is most likely the first or the second.
- A source system that stores invoices with a date column and no time, so the time has to be produced at export and gets left out instead.
-
A time formatted for a human:
7:20 PM, or19:20with the seconds dropped as noise. -
A UTC timestamp emitted without its
Z, so it reads as local time and the document is three hours out — and across midnight, a day out from its own date. -
A whole ISO timestamp dropped into the field:
2026-09-10T19:20:30Zwhere only19:20:30Zbelongs. -
An offset in place of the suffix,
19:20:30+03:00. The message names local time and UTC and mentions no offset form, so it is not a shape to reach for.
How to fix it
3 steps, then send the invoice again.
-
1
Build both fields from one instant
Take a single timestamp in
Asia/Riyadh, put its date part in BT-2 and its time part in KSA-25. Two separate clock reads can straddle a second, and two different zones can straddle a day. -
2
Format it explicitly, not by locale
Spell the pattern out — zero-padded, 24-hour,
HH:mm:ss— instead of calling a locale-aware short-time helper, which is what produces AM and PM and drops the seconds. AppendZonly if the value really is UTC, and if it is, make BT-2 the UTC date too. -
3
If your source has no time
Use the moment the document is actually issued, not
00:00:00. Midnight passes the format check and states something untrue on a tax document, and for a simplified invoice the reporting window runs from the real moment of issue — see standard versus simplified tax invoices. The row almost always has a created timestamp somewhere, even when the invoice date column does not carry one.
Once corrected, send the invoice again. A rejected invoice was never recorded with the Authority, so it needs no credit note — send the corrected invoice itself.
Does ZATCA Tools prevent it?
Yes. ZATCA Tools stamps the issue date and the issue time from one Riyadh-time reading at the moment of issue and formats the time as HH:mm:ss — the same pair the QR timestamp is built from, taken from a single call on purpose so that the two cannot disagree. Neither field is ever typed by a user.
Related codes
BR-KSA-04
Rejects the invoice
BR-KSA-F-05
BR-KSA-15
Frequently asked questions
Riyadh time or UTC? +
Can I send 00:00:00 when my system only knows the date? +
Is an offset such as +03:00 accepted instead of Z? +
ZATCA Tools builds the signature, the PIH, the counter and the encoding for you, and validates your data before it is sent. Completely free for now, and no credit card.
Start for free