Gratis tool voor ontwikkelaars

Verifactu hash- en QR-calculator

Bereken de SHA-256-hash (huella) van een factuur-, annulerings- of gebeurtenisrecord precies zoals de AEAT (de Spaanse belastingdienst) die definieert, koppel hem aan het volgende record en genereer de URL en de QR-code van de factuur met alle validaties. Laad de officiële voorbeelden en controleer of uw code hetzelfde resultaat geeft.

  • Reproduceert de 3 officiële voorbeelden
  • Berekend in uw browser
  • Zonder registratie

Testtool op basis van de technische documenten die de AEAT heeft gepubliceerd (hash v0.1.2 en QR v0.5.0). Stuurt niets naar de Spaanse belastingdienst en vervangt hun validaties niet.

Hash van het facturatierecord

Kies het type record, vul de velden in zoals ze in uw XML staan en bereken. Laat de vorige hash leeg als het het eerste record van het systeem is.

Type record
Officiële voorbeelden van de AEAT:

Precies zoals op de factuur, tot 60 tekens.

Formaat DD-MM-JJJJ, met koppeltekens.

Met een punt als decimaalteken. Voor de AEAT zijn 123.1 en 123.10 gelijk, maar de hash wordt berekend over wat u invult.

64 hexadecimale tekens in hoofdletters. Leeg (veld «Huella=») als het het eerste record is.

ISO 8601 met seconden en tijdzone.

Alles wordt in uw browser berekend met de Web Crypto API. We slaan de gegevens die u invult niet op en versturen ze nergens heen.

URL en QR-code van de factuur

Genereer de verificatie-URL met de juiste codering, valideer hem met de regels van de AEAT en download de QR-code klaar om te printen.

Variant van het systeem
Omgeving

Tot 60 afdrukbare ASCII-tekens. «&», «/» en spaties worden automatisch gecodeerd.

Punt als decimaalteken, tot 12 cijfers voor de komma en 2 decimalen.

Een bestaande QR-URL valideren

Plak de URL die uw programma afdrukt (of die een QR-lezer uitleest) en wij vertellen u of de AEAT hem accepteert.

Hoe de Verifactu-hash werkt

Wat het technische document van de AEAT zegt, uitgelegd voor wie het moet programmeren.

Welke velden erin gaan en in welke volgorde

De hash van een factuurrecord (registro de alta) wordt berekend over acht velden uit de XML, in deze volgorde: IDEmisorFactura, NumSerieFactura, FechaExpedicionFactura, TipoFactura, CuotaTotal, ImporteTotal, Huella (die van het vorige record) en FechaHoraHusoGenRegistro.

Het annuleringsrecord gebruikt er vijf: IDEmisorFacturaAnulada, NumSerieFacturaAnulada, FechaExpedicionFacturaAnulada, Huella en FechaHoraHusoGenRegistro. Het gebeurtenisrecord, dat alleen bestaat in de variant NO VERI*FACTU, gebruikt er negen, te beginnen met de gegevens van het informatiesysteem.

Hoe de string wordt opgebouwd

Elk veld wordt geschreven als naam=waarde en de velden worden verbonden met &. Spaties aan het begin en eind van de waarden worden verwijderd. Heeft een veld geen waarde, dan schrijft u alleen de naam en het isgelijkteken: in het eerste record van het systeem staat de vorige hash als Huella=. De string wordt gecodeerd in UTF-8 en gehasht met SHA-256; het resultaat is hexadecimaal, in hoofdletters, 64 tekens.

IDEmisorFactura=89890001K&NumSerieFactura=12345678/G33&FechaExpedicionFactura=01-01-2024&TipoFactura=F1&CuotaTotal=12.35&ImporteTotal=123.45&Huella=&FechaHoraHusoGenRegistro=2024-01-01T19:20:30+01:00
→ 3C464DAF61ACB827C65FDA19F352A4E3BDC2C640E9E9FC4CC058073F38F12F60

Waarom de records gekoppeld zijn

Elk record bevat de hash van het vorige, dus wie een oude factuur wijzigt, breekt alle hashes daarna. Daarom loopt de keten per systeem en installatie, en daarom moeten twee processen die tegelijk factureren de berekening serialiseren: als twee records dezelfde vorige hash pakken, splitst de keten zich.

In de variant VERI*FACTU herberekent de AEAT de hash van elk record dat binnenkomt. Komt die niet overeen met de uwe, dan krijgt het record de status «Aceptado con errores» (geaccepteerd met fouten).

En de QR-code

De QR-code op de factuur bevat een URL van de verificatiedienst van de AEAT met vier parameters: nif, numserie, fecha (DD-MM-JJJJ, met koppeltekens) en importe (met een punt als decimaalteken). De waarden worden URL-gecodeerd in UTF-8: een factuurnummer als 12345678&G33 moet mee als 12345678%26G33.

Het pad verschilt per variant: ValidarQR voor VERI*FACTU en ValidarQRNoVerifactu voor NO VERI*FACTU, op www2.agenciatributaria.gob.es (productie) of prewww2.aeat.es (test). De optionele parameter formato=json is bedoeld voor integraties, maar mag nooit in de geprinte QR-code staan.

We hebben het op 7 oktober 2026 gecontroleerd tegen de verificatiedienst in de testomgeving van de AEAT: de URL die deze tool genereert met 12345678&G33 wordt geaccepteerd en de belastingdienst leest het factuurnummer correct, en een bedrag met een komma geeft dezelfde fout 2005 die u hier te zien krijgt.

De fouten die we het vaakst zien bij de implementatie

En die deze calculator u helpt op te sporen voordat de AEAT dat doet.

  1. Hash in kleine letters

    De meeste bibliotheken geven de hexadecimale waarde in kleine letters terug. De AEAT wil hoofdletters.

  2. Uitreikingsdatum in ISO-formaat

    In de hash en in de QR-code staat de uitreikingsdatum als DD-MM-JJJJ, niet als JJJJ-MM-DD. De datum en tijd van het record gaan daarentegen wel in ISO 8601 met tijdzone.

  3. Datum en tijd zonder tijdzone

    2024-01-01T19:20:30 is niet geldig: de tijdzone moet erbij, +01:00 of +02:00 afhankelijk van de tijd van het jaar, en +00:00 of +01:00 op de Canarische Eilanden.

  4. Komma als decimaalteken in bedragen

    Niet in de hash en niet in de QR-code: altijd een punt. In de QR-code geeft een komma fout 2005.

  5. «Huella=» vergeten in het eerste record

    Het veld hoort erbij, ook als het leeg is. Weglaten verandert de hash van het eerste record en daarmee die van de hele keten.

  6. Niet-gecodeerde «&» in het factuurnummer

    Splitst de QR-URL in twee parameters, waarna de verificatiedienst de factuur niet vindt. Codeer de waarden altijd.

  7. Twee processen met dezelfde vorige hash

    Als twee kassa’s of twee workers tegelijk factureren zonder lock, splitst de keten zich. Serialiseer de berekening per systeem en installatie.

  8. Herberekenen op «genormaliseerde» data

    De hash wordt berekend over de waarde die in de XML staat. Staat er 123.10 in uw XML en berekent u de hash met 123.1, dan komen ze niet overeen.

Wat deze calculator niet doet

Hij berekent de hash en de QR-URL zodat u uw implementatie kunt testen. Hij maakt niet de volledige XML van het record aan, ondertekent die niet (XAdES) en stuurt hem niet naar de AEAT, en dat is precies wat van een programma een Verifactu-systeem maakt: verzendwachtrij, flow control, nieuwe pogingen, correctiefacturen en conformiteitsverklaring (declaración responsable).

Dat is wat we bij Kiwop doen: we passen uw eigen software, uw ERP of uw webshop aan Verifactu aan, of ontwikkelen uw facturatie op maat, en leveren de conformiteitsverklaring.

Bekijk de Verifactu-dienst

Veelgestelde vragen

Veelgestelde vragen

Over de hash, de QR-code en de calculator.

Welk algoritme gebruikt de Verifactu-hash?

SHA-256, het enige dat de AEAT vandaag accepteert (lijst L12 in de bijlage van de Orden HAC/1177/2024, de technische specificaties). Het resultaat is hexadecimaal, in hoofdletters, 64 tekens.

Hoe wordt de hash van het eerste record berekend?

Net als die van de andere, maar met een leeg veld voor de vorige hash: de string bevat Huella= zonder iets erachter. Het record zet bovendien PrimerRegistro op «S» en heeft geen blok voor het vorige record. Geval 1 van de officiële voorbeelden is precies dat.

Geven de bedragen 123.1 en 123.10 dezelfde hash?

Nee: de hash is een SHA-256 van de string, dus één ander teken geeft een andere hash. De AEAT zegt dat ze beide formaten (een of twee decimalen) als geldig accepteert; waar het om gaat, is dat de hash wordt berekend met dezelfde waarde die in uw XML staat.

Stuurt de calculator mijn gegevens ergens heen?

Nee. De hash wordt in uw browser berekend met de Web Crypto API en ook de QR-code wordt lokaal getekend. Er zit geen server achter de tool en we bewaren niet wat u invult.

Hoe groot moet de Verifactu-QR-code zijn?

Tussen 30×30 en 40×40 mm, volgens de norm ISO/IEC 18004 en met foutcorrectieniveau M. Hij moet minstens 2 mm witruimte eromheen hebben (6 wordt aanbevolen) en bovenaan de factuur staan, op de eerste pagina, met «QR tributario:» erboven. De SVG die de calculator downloadt, is 35 mm.

Wat betekent «Aceptado con errores»?

Het is de status (geaccepteerd met fouten) die de AEAT geeft aan een VERI*FACTU-record dat is ontvangen maar waarin iets mis is, bijvoorbeeld een hash die niet overeenkomt met hun berekening. Het record bestaat, maar u moet het corrigeren met een subsanación (correctie). Daarom is het verstandig de hash te testen vóór productie.

Mag ik de test-URL op echte facturen gebruiken?

Nee. prewww2.aeat.es is de externe testomgeving en werkt alleen met records die naar die omgeving zijn gestuurd. Echte facturen krijgen de productie-URL, www2.agenciatributaria.gob.es.

Bronnen

Bronnen

De officiële technische documenten van de AEAT waarop de tool is gebaseerd, gelezen op 7 oktober 2026.

  1. Detalle de las especificaciones técnicas para generación de la huella o hash (v0.1.2): specificaties van de hash Velden, volgorde, formaat en de drie voorbeelden die de calculator reproduceert.
  2. Detalle de las especificaciones técnicas del código QR (v0.5.0): specificaties van de QR-code URL, parameters, codering, formaat en foutcodes 1001 tot 3002.
  3. Orden HAC/1177/2024, technische specificaties Artikelen 13 (hash), 20 en 21 (grafische weergave en QR-code).
  4. Technische informatie over Verifactu op de site van de AEAT Schema’s, WSDL, validaties en testomgeving.
  5. QR Code generator library, van Project Nayuki MIT-licentie. Genereert de QR-code in uw browser.

Volgende stap

Klopt uw hash al? Het lastige deel komt daarna

Verzending, nieuwe pogingen, correctiefacturen, gelijktijdigheid en conformiteitsverklaring. Wij zorgen dat het in uw systeem werkt.

  • Vrijblijvend
  • Antwoord binnen 24u
  • Voorstel op maat