Porezna uprava: Croatia VAT register

Daily snapshotmeta.source: porezna
By Remco from Avatcado

The Croatian Tax Administration publishes the list of VAT payers as a single downloadable file of identification numbers and dates. It is the sparsest source in the fallback path, and that shows in the answer: it can confirm that a Croatian number is VAT registered, and it can tell you nothing else about the company.

Porezna uprava is run by the Croatian Tax Administration, and its data is published at porezna-uprava.gov.hr. It is one of the 10 national registers Avatcado consults on the Pro and Business plans when VIES cannot answer for Croatia, and it never replaces a VIES answer that does arrive. The national registry fallback guide covers the full precedence order.

What Porezna uprava publishes

  • The personal identification number (OIB) of every VAT payer on the list, one row each
  • The date the VAT obligation started and, where it has ended, the date it ended
  • A flag for VAT accounted on collected payments, a domestic scheme detail Avatcado does not use
  • No names and no addresses, which is the reason a Croatian fallback answer has company null

How Avatcado uses it

A scheduled job downloads the VAT payer file, parses it and stores it as a snapshot, around 188,000 numbers on a recent load. A Croatian fallback checks the number against that snapshot and, on a hit, answers with source porezna, valid true and company null. A number that is not in the snapshot, or a snapshot that has failed a freshness gate, falls through to the cache exactly as if Croatia had no register at all.

Porezna uprava publishes a bulk file rather than a per-number service, so Avatcado mirrors it instead of calling it on your request. Snapshot refreshed 01:00 and 13:00 UTC, and each run replaces the stored snapshot. A snapshot is only trusted while it is demonstrably fresh: it has to be less than 3 days old, and the source file itself has to have changed within the last 14 days. A snapshot that fails either gate is not served at all, because a stale file is worse than no fallback.

The rule that matters most is that a register can only ever confirm a registration. A miss, whether Porezna uprava says not registered or simply has no record, is never turned into valid: false: the request falls through to the stored result instead. An answer that does come from here carries source: "porezna" and source_status: "fallback", and no consultation_number field at all, because only VIES issues those.

What a Porezna uprava answer contains

FieldPorezna uprava
Company nameNo
Company addressNo
Consultation numberNo, VIES only

A Porezna uprava answer carries company: null.

Data quirks worth knowing

  • The VAT payer list carries no names or addresses, so a porezna answer has company null
  • The file opens with two lines of prose before the real header row, so the header is found by its content rather than by counting lines
  • Every identification number in the file arrives with an invisible character in front of it, which has to be stripped before the number can be matched
  • The end date column means a row can describe a registration that has already finished, which is why presence alone is not treated as a confirmation

Try it

Validating a Croatia VAT number takes the same call whichever source answers it. This one uses HR81793146560, a real registered number:

curl "https://api.avatcado.com/v1/validate?vat_number=HR81793146560" \
  -H "Authorization: Bearer avat_live_your_api_key"
import Avatcado from "@avatcado/node";

const avatcado = new Avatcado("avat_live_your_api_key");
const { data, error } = await avatcado.vat.validate({
  vatNumber: "HR81793146560",
});

if (data?.meta.source === "porezna") {
  // VIES was unavailable; Porezna uprava confirmed the registration.
  console.log(data.meta.source_status); // "fallback"
}

On an ordinary day that answer comes from VIES, with source_status: "live". Only when VIES cannot answer for Croatia does Porezna uprava step in, and then meta.source_status reads "fallback" and meta.source reads "porezna". The register fallback is included in the Pro and Business plans; the free tier covers 500 validations per month from VIES and the cache. Get an API key or read the API documentation.

Frequently asked questions

Why does a Croatian fallback answer contain no company details?

Because the published list has none to give. The Croatian VAT payer file carries identification numbers and the dates the VAT obligation began and ended, and nothing about the business behind the number. Avatcado will not fill that gap from another source and present the result as though it came from the tax administration, so the response carries valid true with company null. Croatia is flagged for exactly this on the coverage page. If your billing flow requires a registered name, treat a Croatian fallback as a signal to proceed and re-check later rather than as a complete record, and take the name from the VIES answer once the member state recovers.

How many VAT numbers does the Croatian VAT payer list contain?

A recent load of the file held around 188,000 identification numbers, which is the working size of the Croatian VAT payer population rather than a fixed figure. It moves every time the authority republishes the file, and the mirror stores each run as a new snapshot, so the number you would count today will differ slightly. The size matters mainly as a sanity check on the mirror itself: a run that suddenly parsed a fraction of that would mean the file format had changed underneath us, which is the kind of silent failure the freshness gates and the parser checks exist to surface rather than serve.

Keep reading

Sources