In the playground, you drop one or more e-invoices into a field, and VAMPIRE JS checks each of them right in your browser. It checks against the versions of the specification and shows you the result, accepted or rejected, and on request for every version separately. Your invoice never leaves the browser.
The check in the browser is being set up on this server and will run here soon. The free WordPress plugin eInvoice Validator for VAMPIRE checks on your own server with the same rules, there with VAMPIRE PHP. On this page you can already read what the playground does and how we measured it.
What happens in the playground
The playground contains VAMPIRE JS and the rule packages for every version of ZUGFeRD and Factur-X. A rule package holds the validation rules of one format in one specific version. The playground checks a ZUGFeRD or Factur-X invoice first against the rules of the newest version and, if it is rejected there, against the rules of the next older one. It stops at the first version under whose rules the invoice is accepted and names that version in the result. If no version accepts the invoice, it shows the report of the newest version.
1 · Newest version checked first
→
2 · Accepted? yes: done · no: next older version
→
Result names the chosen version
How the playground chooses the version: from the newest downwards until the invoice is accepted under the rules of one version.
With a switch, you check every version instead. The result is then a table with one row per version, and you see at a glance under which versions the invoice is accepted and under which it is rejected. Each row can be expanded and shows the full report of its version.
Your invoice does not leave the browser, and you can verify this yourself. Open your browser's developer tools and switch to the network view. During the check, the page loads only rule packages from its own folder on this server. No request contains your invoice, and no request goes to another server.
55 ms
check time per ZUGFeRD invoice in the browser (median) when VAMPIRE JS checks from the newest version downwards
measured on October 9, 2026
350 of 350
checks of 50 ZUGFeRD invoices against seven versions each, in which VAMPIRE JS reached the same result as the official KoSIT validator
measured on October 9, 2026
144 of 144
invoices that the playground checked in the browser with the same result as VAMPIRE JS in Node
measured on October 11, 2026
29,942 bytes
download size of VAMPIRE JS for the browser, that is the file vampire.js compressed with gzip, without rule packages
measured on October 9, 2026
Same result in the browser as in Node144 of 144
Same individual results as the KoSIT validator350 of 350
The playground compared: with VAMPIRE JS in Node (measured on October 11, 2026) and with the official KoSIT validator (measured on October 9, 2026).
How we measured this is described in the section "How it was measured" at the end of this page. If you want to build the same check into your own page, buy VAMPIRE JS in the shop on invoicePress.de.
How it was measured
55 ms check time per ZUGFeRD invoice in the browser (median) when VAMPIRE JS checks from the newest version downwards (measured on October 9, 2026): We checked the 50 ZUGFeRD invoices in the playground under Chrome and measured the time per invoice. The check from the newest version downwards, which stops at the first version under whose rules the invoice is accepted, took a median of 55 ms per invoice. Checking against all seven versions took a median of 421 ms per invoice.
350 of 350 checks of 50 ZUGFeRD invoices against seven versions each, in which VAMPIRE JS reached the same result as the official KoSIT validator (measured on October 9, 2026): We checked 50 ZUGFeRD invoices against seven versions of the specification, from 2.1 to 2.5.2. That gives 350 individual results, and each of them came out the same as in the official KoSIT validator with the configuration of that version, in Node and in the browser alike. 17 of the 50 invoices are accepted under the rules of some versions and rejected under the rules of others; that is exactly why checking against several versions is worthwhile. The measurement was taken on October 9, 2026 against the KoSIT validator reference matrix of September 24, 2026.
144 of 144 invoices that the playground checked in the browser with the same result as VAMPIRE JS in Node (measured on October 11, 2026): We put the playground on a web server and checked all 144 invoices of our test corpus in the browser from the newest version downwards; this took 10.2 seconds in total. Chosen version, result and reason were the same for all 144 invoices as with VAMPIRE JS in Node using the same rule packages. The browser made 43 requests along the way, all plain downloads from the same server and none containing invoice data.
29,942 bytes download size of VAMPIRE JS for the browser, that is the file vampire.js compressed with gzip, without rule packages (measured on October 9, 2026): We measured the size of the file vampire.js, which holds the browser part of VAMPIRE JS. It is 88,071 bytes in size and is transferred as 29,942 bytes when compressed with gzip. The rule packages are not included; the browser loads them from the same folder on first use.
VAMPIRE PHP free, VAMPIRE JS in the shop.
VAMPIRE PHP and all rule packages are free and available on GitHub and Packagist. You can buy VAMPIRE JS in the shop on invoicePress.de.