<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home |</title><link>/</link><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><description>Home</description><generator>HugoBlox Kit (https://hugoblox.com)</generator><language>en</language><lastBuildDate>Wed, 12 Aug 2026 00:00:00 +0000</lastBuildDate><image><url>/media/icon_hu_8b792fc0bcdf6699.png</url><title>Home</title><link>/</link></image><item><title>About</title><link>/about/</link><pubDate>Wed, 12 Aug 2026 00:00:00 +0000</pubDate><guid>/about/</guid><description>&lt;p&gt;Zugferdchen 🐴 is a free, anonymous debugging tool for electronic invoices, built around the
&lt;a href="https://www.mustangproject.org/" target="_blank" rel="noopener"&gt;Mustang (Mustangproject)&lt;/a&gt; ZUGFeRD / Factur-X / XRechnung
validator.&lt;/p&gt;
&lt;p&gt;No account, no login, no API key. Uploaded invoices live only for the duration of the
request that carries them &amp;ndash; invoice bytes, extracted XML and finding text are never
written to disk and never logged. The only durable state is an anonymized
&lt;a href="/app/stats"&gt;usage counter&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="rate-limits"&gt;Rate limits&lt;/h2&gt;
&lt;p&gt;Six actions per minute per IP. An &lt;em&gt;action&lt;/em&gt; is a validation or an XML extraction; loading a
page, reloading it, or reading the stats costs nothing.&lt;/p&gt;
&lt;h2 id="api"&gt;API&lt;/h2&gt;
&lt;p&gt;Two stateless, unauthenticated endpoints:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X POST -F &lt;span class="s2"&gt;&amp;#34;file=@invoice.pdf&amp;#34;&lt;/span&gt; https://www.zugferdchen.de/api/v1/validate
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -X POST -F &lt;span class="s2"&gt;&amp;#34;file=@invoice.pdf&amp;#34;&lt;/span&gt; https://www.zugferdchen.de/api/v1/xml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;validate&lt;/code&gt; returns the verdict, standard/profile/version and findings. &lt;code&gt;xml&lt;/code&gt; returns the
embedded CII as both a nested JSON tree and base64 XML.&lt;/p&gt;
&lt;h2 id="try-it-here"&gt;Try it here&lt;/h2&gt;
&lt;p&gt;The same widget the home page uses, embedded in a plain Markdown page via a shortcode:&lt;/p&gt;
&lt;link rel="stylesheet" href="/static/css/embed.css" /&gt;
&lt;script type="module" src="/static/vendor/datastar.js"&gt;&lt;/script&gt;
&lt;div class="flyferd" data-signals="{status: 'idle', filename: ''}"&gt;
&lt;h2 class="font-display text-3xl sm:text-4xl font-bold tracking-tight leading-[1.05]"&gt;Validate an invoice&lt;/h2&gt;
&lt;form
method="dialog"
enctype="multipart/form-data"
class="mt-8 mx-auto max-w-2xl"
data-on:submit__prevent="$filename &amp;&amp; ($status = 'validating', @post('\/app\/validate', {contentType: 'form'}))"
&gt;
&lt;label
class="dropzone relative flex flex-col items-center justify-center gap-3 px-6 py-12 text-center cursor-pointer"
&gt;
&lt;svg
class="size-8 text-[var(--color-indigo)]"
viewBox="0 0 24 24"
fill="none"
stroke="currentColor"
stroke-width="1.6"
stroke-linecap="round"
stroke-linejoin="round"
aria-hidden="true"
&gt;
&lt;path d="M12 15V3m0 0L8 7m4-4 4 4" /&gt;
&lt;path d="M4 15v4a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2v-4" /&gt;
&lt;/svg&gt;
&lt;span class="font-medium"&gt;
&lt;span data-show="!$filename"&gt;Drag an invoice here, or click to choose&lt;/span&gt;
&lt;span class="code text-[var(--color-ink)]" data-show="$filename" data-text="$filename"&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;span class="eyebrow"&gt;PDF or XML · up to 20 MB&lt;/span&gt;
&lt;input
type="file"
name="file"
accept=".pdf,.xml,application/pdf,application/xml,text/xml"
class="absolute inset-0 h-full w-full cursor-pointer opacity-0"
data-on:change="$filename = evt.target.files.length ? evt.target.files[0].name : ''"
/&gt;
&lt;/label&gt;
&lt;div class="mt-5 flex items-center justify-center gap-3"&gt;
&lt;button
type="submit"
class="btn btn-lg"
data-attr:disabled="!$filename || $status === 'validating'"
&gt;
&lt;span data-show="$status !== 'validating'"&gt;Validate invoice&lt;/span&gt;
&lt;span data-show="$status === 'validating'"&gt;Validating…&lt;/span&gt;
&lt;/button&gt;
&lt;button
type="reset"
class="btn btn-outline btn-lg"
data-show="$filename"
data-on:click="$filename = ''; $status = 'idle'"
&gt;
Clear
&lt;/button&gt;
&lt;/div&gt;
&lt;/form&gt;
&lt;div
data-show="$status === 'validating'"
class="mt-10 flex items-center justify-center gap-3 text-[var(--muted-foreground)]"
&gt;
&lt;span
class="inline-block size-4 rounded-full border-2 border-[var(--border)] border-t-[var(--color-indigo)] animate-spin"
&gt;&lt;/span&gt;
&lt;span class="code text-sm"&gt;Running Mustang validation…&lt;/span&gt;
&lt;/div&gt;
&lt;div id="result" aria-live="polite"&gt;&lt;/div&gt;
&lt;/div&gt;</description></item></channel></rss>