Verifactu
Das Anti-Betrugsgesetz (Gesetz 11/2021) verpflichtet Unternehmen dazu, sicherzustellen, dass ihre Rechnungsstellungs- und Buchhaltungssysteme strenge technische Standards erfüllen, um Datenmanipulation zu verhindern. Das Königliche Dekret 1007/2023 definiert darüber hinaus die technischen Anforderungen an digitale Abrechnungssysteme und betont die Notwendigkeit standardisierter Rechnungsformate, auf die Steuerbehörden einfach zugreifen können.
Diese Vorschriften verpflichten Unternehmen, Systeme einzuführen, die in der Lage sind, Rechnungen und Steuerberichte sicher zu erstellen, zu speichern und zu übermitteln. Die REST API von B2Brouter ist eine technische Lösung, mit der Ihr Unternehmen problemlos 100 % konform sein kann, indem die Komplexität an B2Brouter ausgelagert wird und Sie sich auf die Geschäftslogik Ihres Systems konzentrieren können.
Was ist Verifactu?
Section titled “Was ist Verifactu?”Verifactu ist ein Compliance-System, das darauf ausgelegt ist, die Erfüllung der im Anti-Betrugsgesetz festgelegten Rechnungsstellungsanforderungen zu vereinfachen. Es stellt sicher, dass alle von Unternehmen ausgestellten Rechnungen sicher an die Steuerbehörde übermittelt werden, um von der Steuerbehörde und dem Kunden auf Integrität und Authentizität überprüft zu werden. Die spanische Steuerbehörde ist die AEAT („Agencia Estatal de Administración Tributaria”).
Verifactu beinhaltet die sofortige Echtzeitübermittlung von Rechnungsdaten an die AEAT, sobald die Rechnung ausgestellt wird. Dadurch wird sichergestellt, dass nach der Ausstellung keine Änderungen vorgenommen werden können, was die Sicherheit der Rechnung garantiert. Außerdem enthält die Rechnung einen QR-Code, mit dem der Empfänger die Steuerkonformität über die Plattform der AEAT überprüfen kann.
In der Praxis erfordert Verifactu:
- Das Erstellen einer XML-Datei für den Steuerbericht.
- Das Berechnen eines digitalen Fingerabdrucks für jeden Steuerbericht. Dazu gehört eine Hash-Kette, die eine manipulationssichere Nachverfolgung ermöglicht.
- Das Zusammenstellen eines „Libro de Registro” (Ledger), das einen oder mehrere Steuerberichte enthalten kann.
- Die authentifizierte Übermittlung des „Libro de Registro” an die AEAT mittels eines qualifizierten elektronischen Zertifikats.
- Die Einhaltung der von der AEAT festgelegten ratenbegrenzten Anfragen (max. 1 Aufruf pro Minute, außer bei mehr als 1.000 Rechnungen).
- Das Generieren eines QR-Codes zur Rechnungsverifikation, der in die ausgestellte Rechnung eingebunden werden muss.
- Die Verarbeitung der Antworten der AEAT für jeden Steuerbericht.
Mit B2Brouter können Sie einen Großteil der Komplexität dieses Prozesses abstrahieren und durch nur wenige REST-Aufrufe an die API die Anti-Betrugsgesetzgebung einhalten. Sie benötigen kein eigenes qualifiziertes elektronisches Zertifikat, da B2Brouter ein Social Collaborator im Steuerbereich ist. Sie benötigen lediglich einen gültigen B2Brouter API-Schlüssel.
Testumgebungen: Verwenden Sie die Sandbox für erste API-Tests und Payload-Validierung — die Sandbox simuliert Verifactu-Einreichungen, sodass Sie den Rechnungslebenszyklus durchlaufen können, ohne die AEAT zu kontaktieren. Für vollständige End-to-End-Tests mit dem Test-Endpunkt der AEAT verwenden Sie die Staging-Umgebung (
api-staging.b2brouter.net).
Einrichtung und Arbeiten mit der B2Brouter API
Section titled “Einrichtung und Arbeiten mit der B2Brouter API”Der erste Schritt ist die Konfiguration von Verifactu für jedes Unternehmen, für das Sie Steuerberichte einreichen möchten. Eine vollständige Beschreibung des Prozesses finden Sie im Leitfaden zu den Steuerberichtseinstellungen. Der Aufruf zur Konfiguration eines Kontos lautet wie folgt:
Beispielanfrage
curl --request GET \ --url https://api-staging.b2brouter.net/accounts/{ACCOUNT_ID}/tax_report_settings \ --header 'X-B2B-API-Key: {YOUR_API_KEY}' \ --header 'X-B2B-API-Version: {YOUR_API_VERSION}' \ --header 'Content-Type: application/json' \ --data '{ "tax_report_setting": { "code": "Verifactu", "start_date": "2025-04-06", "auto_generate": true, "auto_send": true, "reason_vat_exempt": "E1", "special_regime_key": "01", "reason_no_subject": "N1", "credit_note_code": "R1" } }'Rechnungs-API
Section titled “Rechnungs-API”Wenn Sie B2Brouter sowohl für die Rechnungsausstellung als auch für die Meldung an die Steuerbehörde verwenden, können Sie nach der korrekten Konfiguration Ihres Kontos wie gewohnt Rechnungen ausstellen.
Die ausgestellten Rechnungen enthalten den obligatorischen QR-Code, und der Verifactu-Steuerbericht wird automatisch an die AEAT gesendet. Dies ist ein Beispiel für einen Aufruf zum Erstellen und Ausstellen einer Rechnung:
Beispielanfrage:
curl --request POST \ --url https://api-staging.b2brouter.net/accounts/{ACCOUNT_ID}/invoices \ --header 'X-B2B-API-Key: {YOUR_API_KEY}' \ --header 'X-B2B-API-Version: {YOUR_API_VERSION}' \ --header 'content-type: application/json' \ --data '{ "send_after_import": true, "invoice": { "date": "2025-04-15", "due_date": "2025-05-15", "number": 48, "payment_method": 1, "contact": { "name": "contact.name", "address": "contact.address", "city": "contact.city", "province": "contact.province", "postalcode": "28938", "country": "es", "email": "john.doe@example.com", "language": "es", "currency": "EUR", "terms": "15", "payment_method": 1, "tin_scheme": 9920, "tin_value": "ESA28388510" }, "invoice_lines_attributes": [ { "quantity": 10.0, "description": "line.description", "price": 11.0, "unit": 9, "taxes_attributes": [ { "name": "IVA", "percent": 21.0, "category": "S" } ] } ] } }'In der Antwort des POST-REST-Aufrufs zum Erstellen einer Rechnung finden Sie, wenn send_after_import auf true gesetzt ist, einen Abschnitt tax_report_ids mit der ID des der Rechnung zugeordneten Steuerberichts.
Sie können auf den vollständigen Steuerbericht — einschließlich QR-Code, Bezeichner, Status und aller anderen Felder — zugreifen, indem Sie den Endpunkt zum Abrufen eines Steuerberichts mit der in der Antwort des Erstellungsaufrufs angegebenen Steuerbericht-ID aufrufen.
Der Status des Steuerberichts ist in der Antwort des POST-Aufrufs immer processing. Sie müssen den Lebenszyklus des Steuerberichts überwachen. Sie haben zwei Möglichkeiten:
-
Die empfohlene Methode ist die Verwendung des Steuerbericht-Webhooks. Finale Status: registered, error und registered_with_errors.
-
Abfrage des Steuerberichtstatus über den Endpunkt zum Abrufen eines Steuerberichts, bis das Feld state den Wert registered, error oder registered_with_errors hat.
Steuerbericht-API
Section titled “Steuerbericht-API”Wenn Sie B2Brouter nicht für die Rechnungsausstellung verwenden, mehr Kontrolle über den Prozess der Generierung und Verarbeitung von Steuerberichten benötigen oder ein hohes Volumen an Steuerberichten erwarten, können Sie die neue Steuerbericht-API verwenden.
Diese API ist für maximale Benutzerkontrolle und hohe Verfügbarkeit ausgelegt. Sie können Steuerberichte entweder als JSON-Payload oder als gültiges Verifactu-XML einreichen.
Die Struktur des JSON-Formats für B2Brouter-Steuerberichte basiert auf PEPPOL Continuous Transaction Control (CTC). Die B2Brouter Steuerbericht-API ist eine universelle API, die nicht nur für Verifactu konzipiert ist, sondern für die Steuerberichterstattung weltweit.
Es ist wichtig zu beachten, dass Steuerberichte Steueraufgliederungen („desglose” auf Spanisch) haben, die die Summe der Originalrechnungspositionen mit derselben Steuer darstellen. Ihr System ist dafür verantwortlich, die Rechnungspositionen nach Steuertyp und -kategorie zu aggregieren und die notwendigen Steueraufgliederungen bereitzustellen. Das TaxReport-Modell führt keine Berechnungen durch.
Einen Steuerbericht erstellen
Section titled “Einen Steuerbericht erstellen”Um einen Steuerbericht zu erstellen, müssen Sie den Endpunkt Steuerbericht erstellen aufrufen. Ein minimaler und gültiger Steuerbericht:
Beispielanfrage:
curl --request POST \ --url https://api-staging.b2brouter.net/accounts/{ACCOUNT_ID}/tax_reports \ --header 'X-B2B-API-Key: {YOUR_API_KEY}' \ --header 'X-B2B-API-Version: {YOUR_API_VERSION}' \ --header 'Content-Type: application/json' \ --data '{ "tax_report": { "type": "Verifactu", "invoice_date": "2025-04-03", "invoice_number": "11", "description": "Lorem ipsum...", "customer_party_tax_id": "B12345678", "customer_party_country": "es", "customer_party_name": "Ejemplo S.L.", "tax_inclusive_amount": 121.0, "tax_amount": 21.0, "invoice_type_code": "F1", "currency": "EUR", "tax_breakdowns": [ { "name": "IVA", "category": "S", "non_exemption_code": "S1", "percent": 21.0, "taxable_base": 100.0, "tax_amount": 21.0, "special_regime_key": "01" } ] } }'Die Antwort auf diesen POST-Aufruf enthält bereits das Feld qr mit dem QR-Code (in Base64 kodiert), den Sie in die Rechnung für Ihren Kunden einbinden müssen. Der Inhalt dieses QR-Codes ist eine URL, mit der Ihr Kunde überprüfen kann, ob die AEAT den aus seiner Rechnung abgeleiteten Steuerbericht erhalten und verarbeitet hat.
Einen Steuerbericht aus einer Verifactu XML-Datei importieren
Section titled “Einen Steuerbericht aus einer Verifactu XML-Datei importieren”Wenn Ihr System in der Lage ist, Verifactu-XML-Dateien zu generieren (ein RegistroAlta oder eine RegistroAnulacion aus dem Namespace SuministroInformacion), können Sie diese direkt über die API über den Import-Endpunkt importieren.
Wenn die Erstellung des Steuerberichts erfolgreich ist, enthält die Antwort bereits den QR-Code und den Bezeichner für den Steuerbericht. Beachten Sie, dass B2Brouter den Verkettungsprozess unabhängig von etwaigen Verkettungsinformationen in der importierten XML-Datei durchführt.
Status eines Steuerberichts prüfen
Section titled “Status eines Steuerberichts prüfen”Das Feld state des Steuerberichts ist nach erfolgreicher Erstellung immer processing. Verfolgen Sie den Lebenszyklus über:
-
Den Steuerbericht-Webhook. Finale Status: registered, error, annulled und registered_with_errors.
-
Abfrage des Endpunkts zum Abrufen eines Steuerberichts, bis das Feld state einen der folgenden Werte hat: registered, error, annulled und registered_with_errors.
XML-Darstellung des Steuerberichts abrufen
Section titled “XML-Darstellung des Steuerberichts abrufen”Verwenden Sie den Endpunkt zum Herunterladen eines Steuerberichts. B2Brouter enthält in der GET-Antwort auch ein Feld namens xml_base64. Beachten Sie, dass die XML-Datei nur nach der Verkettung des Steuerberichts generiert werden kann.
Fehlerprüfung
Section titled “Fehlerprüfung”B2Brouter hat einen umfangreichen Satz an Validierungen von Verifactu-Steuerberichten implementiert, basierend auf den von der AEAT veröffentlichten Spezifikationen. Bei einem Validierungsfehler wird der Steuerbericht nicht erstellt. Sie erhalten eine Antwort 422: Unprocessable Entity mit allen Fehlern im JSON-Format.
Einen Steuerbericht stornieren
Section titled “Einen Steuerbericht stornieren”Um einen Steuerbericht zu stornieren („anulación” auf Spanisch), verwenden Sie das Verb DELETE und rufen Sie den Annullierungsendpunkt auf.
Einen Steuerbericht korrigieren
Section titled “Einen Steuerbericht korrigieren”Um einen Steuerbericht zu korrigieren („subsanación” auf Spanisch), verwenden Sie die Verben PATCH oder PUT und rufen Sie den Korrekturendpunkt auf.
Ledger-API
Section titled “Ledger-API”Verifactu-Steuerberichte werden nicht einzeln an die AEAT übermittelt, sondern in einem „Libro de Registro” (in B2Brouter als Ledger bezeichnet) gebündelt, das bis zu 1.000 Steuerberichte enthält. Jeder Steuerbericht hat ein Feld ledger_id, das die interne ID des Ledgers identifiziert. Mit dieser ID können Sie:
- Die XML-Darstellung des Ledgers über den Endpunkt zum Herunterladen eines Ledgers abrufen.
- Die XML-Antwort der AEAT auf den von B2Brouter gesendeten Ledger über den Endpunkt zum Herunterladen der Antwort abrufen.
Entsprechung zwischen internen B2Brouter-Steuerberichtsfeldern und Verifactu XML-Knoten
Section titled “Entsprechung zwischen internen B2Brouter-Steuerberichtsfeldern und Verifactu XML-Knoten”| B2Brouter-Feld (basierend auf PEPPOL CTC) | Verifactu XML-Knoten |
|---|---|
| invoice_date | IDFactura > FechaExpedicionFactura |
| invoice_number | IDFactura > NumSerieFactura |
| invoice_series_code | IDFactura > NumSerieFactura |
| supplier_party_name | NombreRazonEmisor |
| external_reference | RefExterna |
| correction | Subsanacion |
| annullation | Anulación |
| previously_refused | RechazoPrevio |
| invoice_type_code | TipoFactura |
| amend_type | TipoFactura |
| amended_number | FacturasRectificadas > IDFacturaRectificada > NumSerieFactura |
| amended_series_code | FacturasRectificadas > IDFacturaRectificada > NumSerieFactura |
| amended_date | FacturasRectificadas > IDFacturaRectificada > FechaExpedicionFactura |
| amended_tax_exclusive | ImporteRectificacion > BaseRectificada |
| amended_tax_amount | ImporteRectificacion > CuotaRectificada |
| tax_point_date | FechaOperacion |
| description | DescripcionOperacion |
| simplified_art7273 | FacturaSimplificadaArt7273 |
| ticket | FacturaSinIdentifDestinatarioArt61d |
| macrodata | Macrodato |
| issued_by_third_party_or_receiver | EmitidaPorTerceroODestinatario |
| third_party_name | Tercero > NombreRazon |
| third_party_tax_id | Tercero > NIF |
| customer_party_name | Destinatarios > IDDestinatario > NombreRazon |
| customer_party_tax_id | Destinatarios > IDDestinatario > NIF or IDOtro > IDType |
| customer_party_country | Destinatarios > IDDestinatario > IDOtro > CodigoPais |
| customer_party_tax_scheme | Destinatarios > IDDestinatario > IDOtro > IDType |
| tax_breakdowns[].name | Desglose > DetalleDesglose > Impuesto |
| tax_breakdowns[].special_regime_key | Desglose > DetalleDesglose > ClaveRegimen |
| tax_breakdowns[].non_exemption_code | Desglose > DetalleDesglose > CalificacionOperacion |
| tax_breakdowns[].exemption_code | Desglose > DetalleDesglose > OperacionExenta |
| tax_breakdowns[].percent | Desglose > DetalleDesglose > TipoImpositivo |
| tax_breakdowns[].taxable_base | Desglose > DetalleDesglose > BaseImponibleOimporteNoSujeto |
| tax_breakdowns[].taxable_base_at_cost | Desglose > DetalleDesglose > BaseImponibleACoste |
| tax_breakdowns[].tax_amount | Desglose > DetalleDesglose > CuotaRepercutida |
| tax_amount | CuotaTotal |
| tax_inclusive_amount | ImporteTotal |
| previous_id | Encadenamiento > RegistroAnterior > NumSerieFactura |
XSD-Dateien
Section titled “XSD-Dateien”| XSD-Datei | Beschreibung |
|---|---|
| SuministroLR.xsd | Operaciones de alta y anulación de los sistemas Verifactu y no Verifactu |
| RespuestaSuministro.xsd | Respuesta de las operaciones de los sistemas Verifactu y no Verifactu |
| ConsultaLR.xsd | Operación de consulta de registros de facturación Verifactu |
| RespuestaConsultaLR.xsd | Respuesta de la operación de consulta de registros de facturación Verifactu |
| SuministroInformacion.xsd | Definición de tipos comunes |
Codebeschreibungen für bestimmte Felder
Section titled “Codebeschreibungen für bestimmte Felder”Rechnungstyp-Codes
Section titled “Rechnungstyp-Codes”Parameter: invoice_type_code
| Code | Beschreibung |
|---|---|
| F1 | Factura (art. 6, 7.2 y 7.3 del RD 1619/2012) |
| F2 | Factura Simplificada y Facturas sin identificación del destinatario (art. 6.1.d) RD 1619/2012 |
| F3 | Factura emitida en sustitución de facturas simplificadas facturadas y declaradas |
| R1 | Factura Rectificativa (Error fundado en derecho y Art. 80 Uno Dos y Seis LIVA) |
| R2 | Factura Rectificativa (Art. 80.3) |
| R3 | Factura Rectificativa (Art. 80.4) |
| R4 | Factura Rectificativa (Resto) |
| R5 | Factura Rectificativa en facturas simplificadas |
Sonderregelung-Schlüsselcodes
Section titled “Sonderregelung-Schlüsselcodes”Parameter: special_regime_key
| Code | Beschreibung |
|---|---|
| 01 | Operación de régimen general. |
| 02 | Exportación. |
| 03 | Operaciones a las que se aplique el régimen especial de bienes usados, objetos de arte, antigüedades y objetos de colección. |
| 04 | Régimen especial del oro de inversión. |
| 05 | Régimen especial de las agencias de viajes. |
| 06 | Régimen especial grupo de entidades en IVA (Nivel Avanzado) |
| 07 | Régimen especial del criterio de caja. |
| 08 | Operaciones sujetas al IPSI / IGIC. |
| 17 | Operación acogida a alguno de los regímenes previstos en el Capítulo XI del Título IX (OSS e IOSS) |
| 18 | Recargo de equivalencia. |
| 19 | Operaciones de actividades incluidas en el Régimen Especial de Agricultura, Ganadería y Pesca (REAGYP) |
| 20 | Régimen simplificado |
Nicht-Befreiungscodes
Section titled “Nicht-Befreiungscodes”Parameter: non_exemption_code
| Code | Beschreibung |
|---|---|
| S1 | Operación Sujeta y No exenta - Sin inversión del sujeto pasivo. |
| S2 | Operación Sujeta y No exenta - Con Inversión del sujeto pasivo. |
Nicht-Steuerbarkeits-Codes
Section titled “Nicht-Steuerbarkeits-Codes”Parameter: no_subject_code
| Code | Beschreibung |
|---|---|
| N1 | Operación No Sujeta artículo 7, 14, otros. |
| N2 | Operación No Sujeta por Reglas de localización. |
Befreiungscodes
Section titled “Befreiungscodes”Parameter: exemption_code
| Code | Beschreibung |
|---|---|
| E1 | Exenta por el artículo 20 |
| E2 | Exenta por el artículo 21 |
| E3 | Exenta por el artículo 22 |
| E4 | Exenta por los artículos 23 y 24 |
| E5 | Exenta por el artículo 25 |
| E6 | Exenta por otros |
Kunden-ID-Typ
Section titled “Kunden-ID-Typ”Parameter: customer_party_tax_scheme
| Code | Beschreibung |
|---|---|
| 02 | EU VAT ID (NIF-IVA) |
| 03 | Passport |
| 04 | Official ID issued by country of residence |
| 05 | Certificate of residence |
| 06 | Other supporting document |
| 07 | Not registered |