BR-KSA-70 Rejects the invoice

Invoice issue time (KSA-25) missing or in the wrong format

The date and the time are two separate fields. A system that records only a date passes every date rule and fails this one, and the format the time must take is narrow: hours, minutes and seconds on a 24-hour clock.

The message text as the Authority sends it in English, unedited

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, or 19:20 with 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:30Z where only 19:20:30Z belongs.
  • 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. 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. 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. Append Z only if the value really is UTC, and if it is, make BT-2 the UTC date too.

  3. 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
Invoice date is in the future
BR-KSA-F-05
The official message text is in the Full reference.
BR-KSA-15
The official message text is in the Full reference.

Frequently asked questions

Riyadh time or UTC? +
Either shape is allowed, but pick one and let the date follow it. Riyadh local with no suffix is the simpler choice, because BT-2 is compared against the date at the Authority and your books are kept on the Saudi calendar. If you send UTC with a Z, the date beside it has to be the UTC date, or the pair describes an instant that does not exist.
Can I send 00:00:00 when my system only knows the date? +
It will pass this rule, and it puts a false statement on a tax document: every invoice of the day claiming to have been issued at midnight. Find the real moment instead — and if you genuinely cannot, know that you are choosing a value the document will assert as fact.
Is an offset such as +03:00 accepted instead of Z? +
The official message names two forms, local time and UTC with a Z, and mentions no offset. What we can read from the compiled schematron is the message and the severity, not the test itself, so we cannot tell you whether an offset passes — and there is no reason to risk it when a plain local time is accepted. For a definitive answer that is a question for zatca.gov.sa.
You fixed this one — now avoid the next

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

← All ZATCA error codes